Mission 3
——完善一个界面
Tools:
WinSCP
Xshell
OpenWRT
Reference:
http://m.blog.chinaunix.net/uid-26824563-id-4591418.html
Procedure:
从之前的Mission 1中,我们在主界面中创建了一个菜单栏,下面我们对界面进行下一步得完善。
从上面的程序可以看出,在“inner-Sao”选项卡下共有两个分选项,名称分别为“BoardType”和“Control”。根据cbi指示的目录,在“/usr/lib/lua/luci/model/cbi/admin_Sao”目录下有sao.lua和control.lua两个文件,两个界面类似,我们选取"Control"界面讲述。
当点击上图中的"Control"选项时,即可进入如下界面:
报错为:
/usr/lib/lua/luci/dispatcher.lua:433:
Failed to execute cbi dispatcher target for entry '/admin/sao/control'.
The called action terminated with an exception:
/usr/lib/lua/luci/cbi.lua:311: Unable to read UCI data: sao
stack traceback:
[C]: in function 'assert'
/usr/lib/lua/luci/dispatcher.lua:433: in function 'dispatch'
/usr/lib/lua/luci/dispatcher.lua:168: in function
dispatcher.lua:167>
解决方案:把文件中所有得Sao的大写换为小写字母。这样就可以避免此问题。大致原因应该有二:
1. 请认真读完这个界面的教程,包括后面的Config的配置,配置完成应该是正确的。
2.确保整个过程中,所有的名称都是对应的,我的名称就是因为有大写的S和小写的s不对应,后来我全部改成小写了。
此界面对应的程序在“/usr/lib/lua/luci/model/cbi/admin_sao/control.lua”下,具体内容为:
1. require("luci.sys")
2. require("luci.sys.zoneinfo")
3. require("luci.tools.webadmin")
4. require("luci.fs")--这里说明一下,由于版本更新的原因,会出现luci.fs这个包找不到的error,把luci换成nixio就ok了
5. require("luci.config")
6.
7. local m, s, o
8.
9. m = Map("loogson", translate("Control"), translate("This is design by Davied Huang, in order to control loogson board, such as led、beep、and adc."))
10. m:chain("luci")
11.
12. s = m:section(TypedSection, "controlboard", translate("Control Board"))
13. s.anonymous = true
14. s.addremove = false
15.
16.
17. s:tab("led", translate("Control LED"))
18. s:tab("beep", translate("Control Beep"))
19. --s:tab("adc", translate("Control Adc"))
20.
21. --
22. -- LED
23. --
24. o = s:taboption("led", ListValue, "lednum", translate("LED NUM:"))
25. o.default = 0
26. o.datatype = "uinteger"
27. o:value(0, translate("LED0"))
28. o:value(1, translate("LED1"))
29. o:value(2, translate("LED2"))
30.
31. o = s:taboption("led", ListValue, "ledstatus", translate("LED STATUS:"))
32. o.default = 1 --off status
33. o.datatype = "uinteger"
34. o:value(0, translate("LED ON"))
35. o:value(1, translate("LED OFF"))
36.
37.
38. --
39. -- BEEP
40. --
41. o = s:taboption("beep", ListValue, "beepstatus", translate("BEEP STATUS:"))
42. o.default = 1 --off status
43. o.datatype = "uinteger"
44. o:value(0, translate("ON"))
45. o:value(1, translate("OFF"))
46.
47. o = s:taboption("beep", Value, "beepfreq", translate("BEEP FREQ:"))
48. o.datatype = "uinteger"
49.
50.
51. local apply = luci.http.formvalue("cbi.apply")
52. if apply then
53. io.popen("/etc/init.d/loogson restart")
54. end
55.
56.
57. return m
说明:
1) 此处我们使用UCI(Unified Configuration Interface,统一配置接口)开发方式,第7 行定义了三个局部变量:m,s,o。
2) 第9行引用了一个“Map”调用,该调用的定义为:
1. m = Map("配置文件文件名", "配置页面标题", "配置页面说明")
第一个参数为配置文件存储的文件名,不包含路径,比如按上述创建的话,应该写为“sao”,配置文件的存储地址为:/etc/config。第二与第三个参数是用在来页面上显示的,如图所示。
内容如下:
1. config boardinfo
2. option ipaddr1 '192.168.123.212'
3. option netmask1 '255.0.0.0'
4. option boardname '1'
5.
6. config controlboard
7. option beepfreq '100'
8. option beepstatus '0'
9. option lednum '2'
10. option ledstatus '0'
7) 应用配置以后希望配置立即生效,51行到54行的代码就是判断是否点击了“应用”按钮,如果点击了“应用”按钮就执行默认的脚本程序。
随后即可验证程序,在界面更改control的值,可以看到config文件的值也在相应变化。
到此,对界面的建立就基本结束了。对选项卡进行编辑和设置等可以参考官方给出的reference:
http://luci.subsignal.org/trac/wiki/Documentation/CBI