TI IPNC Web网页之进阶修改
GoDB内嵌HTML
原始的页面里面已经有一个内嵌HTML的例子了,那就是维护支持页面。下图是稍微修改后的页面...请自行脑补。

这里使用的是上一节所说的gdo containter的方法。
打开maintenance.frm文件,该文件包括了一个gdo控件,名字叫做gdoMaintenance,查看该frm文件的Source
<GDO UID="1"
Name="gdoMaintenance"
X="334"
Y="70"
W="800"
H="442"
ProgId="Shell.Explorer.2"
Left="0"
Top="0"
Width="800"
Height="442"
Visible="-1"
StatusBar="-1"
StatusText="-1"
ToolBar="1"
MenuBar="-1"
FullScreen="0"
Offline="0"
Silent="0"
RegisterAsBrowser="0"
RegisterAsDropTarget="-1"
TheaterMode="0"
AddressBar="-1"
Resizable="-1"
Scrollable="0"
/>
这里最主要的是ProgId="Shell.Explorer.2"一项,这里代表该gdo加载一个Shell Explorer,也就是内嵌IE。所以我们添加的话可以复制以上代码到其它的frm文件上,然后修改部分参数,比如说名字,位置,宽高等,然后就可以直接拿来用了。
图形添加的话:

然后我们再来看看maintenance.bas文件。
Sub Form_Load
dims temp_ver$
call displayControls(LabelName$,XPos,YPos,Wdh,height)
#gdomaintenance.h = #gdomaintenance.h*~factorY -20
#gdomaintenance.w = #imgmainbg.w - 30
#lblnote.h = 47 * ~factorY
assignSelectedImage("imgmenu[3]")
setfocus("imgmenu[3]")
showSubMenu(0,0)
#cmdback.hidden = 1
temp_ver$ = dwnldFile$(".ver_info");
split(version_info$,temp_ver$,"\n")
'*** Code modified by karthi on 6-Dec-10 as per the CR dated on 3-Dec-10
if bkupfirmware = 1 then
#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?bkup=1") 'CR-02
else
#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?kver="+version_info$(1)+"&fsver="+version_info$(2))
endif
setfocus("lblnote")
End Sub
#gdomaintenance.navigate$(~camAddPath$+"\MaintK_en.htm?kver="+version_info$(1)+"&fsver="+version_info$(2))
MainK.htm文件在相应目录下可发现。
仔细观察maintenance.bas文件,我们可以发现,其中的按钮处理还是由gBasic来搞定,其实我们可以完全脱离gBasic来处理表单。
我们在这一节提到如何添加关键字,你会发现非常麻烦,如果我们使用内嵌HTML来实现那些表单将大大减少工作量。
这样能减少网页这一端的工作量,而boa和system_server那一端还是按照原来那样去做。
我们可以使用cgic库做一个表单和处理表单的程序,交叉编译,然后同样使用navigate方式来指向这个cgi程序所在的url。比如说192.168.1.160/xx.cgi。
CGIC功能简介
CGIC是一个支持CGI开发的开放源码的标准C库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了CGIC库,用户也可以购买商业授权而无需公开声明。
CGIC能够提供以下功能:
- 分析数据,并自动校正一些有缺陷的浏览器发来的数据;
- 接收以GET和POST两种方式发送的数据;
- 能接受上传文件;
- 能够设置和接收cookies;
- 用一致的方式处理From元素里的回车;
- 提供字符串,整数,浮点数,单选或多选功能来接收数据;
- 提供数字字段的边界检查;
- 能够将CGI环境变量转化成C中的非空字符串;
- 提供CGI程序的调试手段,能够回放CGI程序执行时的CGI状态;
CGIC是一个功能比较强大的支持CGI开发的标准C库,并支持Linux, Unix 和Windows等多操作系统。
这是官网:cgic,里面有相关api的说明。
获取最新源代码的方式;
git clone https://github.com/boutell/cgic
拖下来之后进入cgic文件夹有如下文件:
capture.c cgic.h cgictest.c Makefile support.txt
cgic.c cgic.html license.txt readme.txt
上面的代码拖下来之后自带了测试的例子:cgictest.cgi和capture。
编译:
make
移植CGIC
- 修改makefile
SUBDIRS=addclass showclass gLogon update_firmware
CFLAGS=-g -Wall
CC=${BUILD_TOOL_PREFIX}gcc
AR=${BUILD_TOOL_PREFIX}ar
RANLIB=${BUILD_TOOL_PREFIX}ranlib
DEBUGSUBDIRS = $(addsuffix .debug, $(SUBDIRS))
CLEANSUBDIRS = $(addsuffix .clean, $(SUBDIRS))
INSTALLSUBDIRS = $(addsuffix .install, $(SUBDIRS))
.PHONY: $(SUBDIRS) $(DEBUGSUBDIRS) $(INSTALLSUBDIRS) \
$(CLEANSUBDIRS)
all: libcgic.a cgictest.cgi capture $(SUBDIRS)
$(SUBDIRS):libcgic.a
@echo
@echo Making all in subdirectory $@...
@$(MAKE) -C $@
$(DEBUGSUBDIRS):
@echo
@echo Executing make debug in subdirectory $(basename $@)...
@cd $(basename $@) ; $(MAKE) debug
主要是添加了BUILD_TOOL_PREFIX这个编译器后缀...还有相应的子文件夹,各个子文件夹将会使用cgic.h和链接libcgic.a库文件..
使用CGIC的思路
从cgic.c的代码可以看出,它定义了main函数,而在cgictest.c中定义了一个cgiMain函数。也就是说,对于使用CGIC编写的 CGI程序,都是从cgic.c中的代码进入,在库函数完成了一系列必要的操作(比如解析参数、获取系统环境变量)之后,它才会调用你的代码(从你定义的 cgiMain进入)
另外一点就是,cgi程序输出HTML页面的方式都是使用printf把页面一行一行地打印出来,比如cgictest.c中的这一段代码。
fprintf(cgiOut, "<textarea NAME=\"address\" ROWS=4 COLS=40>\n");
其实我们还是可以直接使用printf,但是我们还是推荐使用这种做法,因为在调试的时候会用到fprintf来重定向输出,CGI 调试起来比较麻烦,CGIC提供了一个函数可以将环境变量输入到文件,方便调试:
#define SAVED_ENVIRONMENT "/tmp/cgicsave.env"
cgiWriteEnvironment(SAVED_ENVIRONMENT);
调试的另外一种做法就是fprintf写到stderr中,这样在/var/log/boa/error_log会记录这些打印...
CGIC之GET和POST
获取Get请求字符串.
Get请求就是我们在浏览器地址栏输入URL时发送请求的方式,或者我们在HTML中定义一个表单(form)时,把action属性设为“Get”时的工作方式;
在进入我们自己编写的cgi代码之前,CGIC库已经事先把这个字符串取到了,我们可以在程序中直接获得,要做的仅仅是在你编写的cgiMain方法前面加入以下声明:
extern char *cgiQueryString;
我们在浏览器执行执行url时多加入?xxxx这样就能查看GET的字符了...
当form执行post操作时,我们的程序通过下面的函数来得到form中各个变量的值,这个函数的第一个参数:是form的名字,第二个和第三个存储变量值的buf相关.
cgiFormString("name", name, 241);
cgiFormStringNoNewlines //用来去掉换行符(如果用户是在一个TextArea里输入字符的话);
cgiFormStringSpaceNeeded //用于测试输入值的长度,可以以此为依据,然后按需精确分配缓冲区。
cgic之表单处理
- 按钮处理
下面代码检测html表单中按钮按下动作,该函数的唯一参数name对应html该按钮的name值
//函数原型
//cgiFormResultType cgiFormSubmitClicked( char *name)
if ( cgiFormSubmitClicked("rfs") == cgiFormSuccess ) /*跟新内核*/
{
//...
}
//从指定域中获取整数值,比如说下拉菜单...
cgiFormResultType cgiFormInteger( char *name, int *result, int defaultV) ;
system_server进程之外进程获取SysInfo结构体的方法
网页上所有设置都保存到一个SysInfo的结构体上,而这个结构体有保存到syscfg.cfg文件上,现在我们需要设计另外几个进程,我们应该怎样和其它进程通信呢?
//头文件必须至少包括这三个
#include <sys_env_type.h>
#include <file_msg_drv.h>
#include <File_Msg_Def.h>
//....
//这是初始化必须先执行,另外关键的是FILE_SC_MSG另外定义,一个进程定义一个。
if (InitFileMsgDrv(FILE_MSG_KEY, FILE_SC_MSG) < 0) {
exit(1);
}
//通过共享存储获取这个结构体...
SysInfo *pSysInfo = GetSysInfo();
if ( pSysInfo == NULL )
{
exit(1);
}
//写配置到syscfg文件..在file_msg_drv.h中定义..
ret = fSet_channel_id(3);
if ( ret != 0 )
{
exit(1);
}
编译链接时必须将三个头文件所在路径告诉编译器;必须将Aprro interface的静态库链接进去;具体做法是:
IPNC_INTERFACE_DIR:=/home/tracyone/work/dm8127/Source/ipnc_rdk/ipnc_app/interface/
APP_LIB_DIR:=${IPNC_INTERFACE_DIR}/lib/
APP_INC_DIR:=${IPNC_INTERFACE_DIR}/inc/
INCULDES:=-I${APP_INC_DIR}
LIBS := $(APP_LIB_DIR)/msg_util.a $(APP_LIB_DIR)/Appro_interface.a \
$(APP_LIB_DIR)/file_msg_drv.a $(APP_LIB_DIR)/sysctrl.a \
$(APP_LIB_DIR)/sys_msg_drv.a
总结
这样我们就可以脱离恶心的gBasic语言,使用html和c语言来处理表单了,这样有更多的灵活性。
GoDB图片相关的修改

总共两种,
其中Internal Jpegs必须是jpeg编码的图片文件。而GoDB Images则可以为其它格式的图片,然后GoDB自动将其转化为bitmap格式,后缀自动变成.bin,这也就是为啥你在leftMenu.frm中看到的图片的SRC属性都是.bin而实际上在GoDB Images则是.png格式的。
!settings_Off.bin
如果是Internal Jpegs我们则直接!display.jpg
查看Image控件的SRC属性
This attribute lets you specify the filename of the image.
To specify local images use a ! at the beginning of the file Name.
GoDB Converts images to to GoDB Bitmap format doing the build process.
When an image is dragged dropped onto a form in the IDE the SRC
Extension automatically gets changed to .bin.
You need to enable compression (in IDE) for large images to conserve space.
External images should be in the images folder in the current working
directory.
Platforms that support PNG/JPG Image (WIN 32) rendering in the native OS can render external PNG and JPG images. Png usually requires gImgDLL.DLL or a linux so.
背景颜色修改
请修改global.css文件。
里面的关于颜色的表达非常奇怪。可以在gStudi中的帮助搜索css。
COLORNAME=#24bit COLOR in Hex (Similar to the HTML Color).
TXTFLD_SEL_COL=#8080FF
字体相关
修改字体请看gStudio的帮助中lesson9。
控件修改成中文字体之后,你会发现有些控件变化了,比如checkbox和radio的形状变小了,其实这些控件在原有工程也是通过图片来显示的,当你修改这些控件的字体之后,他们找不到对应的图片所以只显示末默认的图标(非常难看)

具体请查看gStudio中的Styles帮助。
在Custom Icons in GoDB一小节中:
Color Icons can also be added into the BDB and should be named CIC[FONT][ASCII CharCode].bin
所以你会发现在Images文件夹下有不少CIC开头的文件,只不过原始的字体是西文字体,改成中文之后就识别不出来了,所以你要修改这些png文件的名字..
TI IPNC Web网页之进阶修改的更多相关文章
- TI IPNC Web网页之流程分析
流程 Appro IPNC使用的web服务器是boa. 请仔细理解下面这段话. boa这个web服务器是GUI界面和IPNC应用程序之间的通信的桥梁.它的责任是从web GUI中接收HTTP请求,并且 ...
- Ti IPNC Web网页之ActiveX控件
Ti IPNC Web网页之ActiveX控件 本篇介绍关于TI IPNC网页中播放器相关的东西. gStudio工程中添加播放器并控制播放器 打开IPNC网页时首先会自动下载ActiveX控件并安装 ...
- TI IPNC Web网页之网页修改教程
web网页程序修改 打开gStudio之后,点击菜单栏中Help->Contents.先把这个诡异的编程语言看一遍吧.这里搬一些东西出来. GoDB简介 从第一副图片中,我们可以看出,从源文件到 ...
- TI IPNC Web网页之GoDB开发环境
介绍 下面介绍DM8127/DM385 IPNC RDK中网页制作相关的东东. 具体来说,各位获得这个RDK包时有以下文件: IPNC_RDK_DM812x_DM385_Version3.5.0.ta ...
- web网页中使用vlc插件播放相机rtsp流视频
可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...
- web网页练习
一. HTML部分 1. XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同: XHTML 元素必须被正确地嵌套. XHTML 元 ...
- C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>中介绍了目前市场主流 ...
- WEB网页插件 如何实现 选择上传图片路径 【高级问题】
发表于 2010-10-22 12:11 | |只看楼主 按键精灵程序里面的WEB网页插件 如何实现 选择上传图片路径 我想在上传图片的选框设置图片路径为 C:\fakepath\001. ...
- JS实现Web网页打印功能(IE)
问题描述: JS实现Web网页打印功能 问题解决: 这里主要使用WebBrowser控件的ExeWB在IE中打印功能的实现 WebBrowser介绍: WebBrows ...
随机推荐
- $一步一步学Matlab(4)——使用Matlab进行初等数学运算
Matlab可以看成是一个功能强大的计算器,那么既然是计算器,进行基本的数学运算绝对是必不可少的.本文主要讲解如何用Matlab做初等数学运算,所谓"初等数学运算",可以理解成是小 ...
- Spring MVC 复习笔记03
1. @RequestMapping 1). url映射 定义controller方法对应的url,进行处理器映射使用. 2). 窄化请求映射 3). 限制http请求方法 出于安全性考虑,对htt ...
- 原生js 操作dom
1.一些常用的方法 obj.getElementById() 返回带有指定 ID 的元素. obj.getElementsByTagName() 返回包含带有指定标签名称的所有元素的节点列表(集合/节 ...
- 计算mysql 数据库 表大小 服务器传输 小写表明转成大写
//数据库表存储大小 select table_schema,table_name,table_rows,concat(round(data_length/1024/1024/1024,2),'GB' ...
- window连接linux共享
前提说明:windows主机信息:192.168.1.100 帐号:abc 密码:123 共享文件夹:sharelinux主机信息:192.168.1.200 帐号:def 密码:456 共享文件夹: ...
- 关于Log4Net的使用和配置
1. 添加log4net.dll引用 2.在添加引用的那层的 AssemblyInfo.cs 注册 : [assembly: log4net.Config.XmlConfigura ...
- BootStrap实现图片轮播
<div class="container"> <div data-ride="carousel" id="carou ...
- Spring容器基础ClassPathXmlApplicationContext(一起看源码)
ApplicationContext相比较于BeanFactory,扩展了很多功能.也就是说前者包含了后者的所有功能.使用前者加载XML的方式:ApplicationContext app=new C ...
- Mybatis动态SQL——if,where,trim,choose,set.foreach的用法
知识点:主要介绍mybatis中,动态sql中的if,where,trim,set,foreach的用法 自学谷粒学院mybatis学习视频,参考mybatis官方文档 java包:log4j.jar ...
- Python学习札记(四) Basic-1
参考:Python基础 Basic 1.以#开头的是注释. 2.解释器把每一行都当做是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块. 3.请使用4个空格作为缩进,慎用Tab(请把Tab设置为4 ...