显示模块netlcd

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

硬件接口

目前SPI和I2C接口的线序和OLED模块不匹配,所以暂时有飞线,后续版本会调整。

如上所示,在网关硬件中预留有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几个图形接口的组合,构造出自己的显示内容。