网关软件TinyGW本身是由python开发,它的源码完全开源,便于用户直接修改和扩充,但是在使用过程中,它也有显示需求,比如设置参数,显示状态等等,为了便于使用,我们采取了类似串口屏的方式,但是使用网络接口UDP, 外接128X64的点阵OLED, 只需发送用JSON描述的图形操作命令,就可以直接使用。
硬件接口

如上所示,在网关硬件中预留有SPI和I2C接口各一路,所以可以插入支持SPI和I2C接口的OLED模块。
软件架构

软件架构如上所示,对外提供UDP接口,接受使用JSON描述的图形操作接口,图形库使用是u8g2.
使用示例
软件包括两个文件,netlcd.ini是配置文件
root@LEDE:~# ls
netlcd
netlcd.ini
root@LEDE:~#
配置文件netlcd.ini的格式, 其中bus是OLED的总线接口,可以是spi或i2c, port是监听的UDP端口号.
root@LEDE:~# cat netlcd.ini
[sys]
bus= spi
port = 9904
[pin]
res = 65
dc = 66
[spi]
dev = 0x10
[i2c]
dev = 0x00
addr = 0x3c
root@LEDE:~#
列出netlcd支持的图形接口, 这些接口完全来自是u8g2的接口,可以参考u8g2.h的定义
root@LEDE:~# ./netlcd -l
0: ClearDisplay()
1: draw_l90_r0(uint_t x, uint_t y, uint_t len, uint8_t dir)
2: SetMaxClipWindow()
3: SetClipWindow(uint_t clip_x0, uint_t clip_y0, uint_t clip_x1, uint_t clip_y1 )
4: SendBuffer()
5: ClearBuffer()
6: SetBufferCurrTileRow(uint8_t row)
7: FirstPage()
8: NextPage()
…..
49: DrawStr(uint_t x, uint_t y, const char *str)
…..
root@LEDE:~#
当我们要使用netLlcd, 只需要往它的端口号发送数据,数据的格式是文本的JSON格式, 这个格式人机都可以阅读,非常方便. 下面我们socat工具(或者其他socket工具)来测试netlcd的接口,我们把发送的JSON命令存成文件,它是文本格式,可以直接编辑
文件 | 内容 |
---|---|
ClearDisplay.jsn | { “func”: “ClearDisplay” } |
SendBuffer.jsn | { “func”: “SendBuffer” } |
DrawStr.jsn | { “func”: “DrawStr”, “x”: 32, “y”: 32, “str”: “Hello,world.” } |
测试时,只需把发文件内容发送到netlcd的端口,就可以在OLED上观察显示效果, 比如想在屏幕上显示“Hello,world”字符串,只需依次运行下面命令,
#cat ClearDisplay.jsn | socat stdin udp-sendto:192.168.3.116:9904
#cat DrawStr.jsn | socat stdin udp-sendto:192.168.3.116:9904
#cat SendBuffer.jsn | socat stdin udp-sendto:192.168.3.116:9904
上面命令,只是简单吧文件内容发送到地址192.168.3.116 端口9904, 这就是netlcd监听的端口。类似的,我们可以利用这70几个图形接口的组合,构造出自己的显示内容。