一直在努力 发表于 2021-8-1 16:53:01

LUA的事件响应机制,和有可能改进的一个地方,请围观

首先说明的是下面的讨论,是我在4寸M屏上验证的(才买的,所以要多玩玩),当然有一部分也在4寸物联屏上试过但不算充分。

LUA对于屏体状态的响应是通过一系列回调函数来实现的,一旦当某些控件被触碰了,或者屏状态改变了,就会调用on_???函数来实现某些特定操作。
最著名的有:
function on_systick() 这是1秒1次的定时回调,有好多异步操作,程序得不到通知,你可以试试用这个函数周期性地刷状态,比如内部modbus轮询变量,而你又不知道可读取到了:lol
function on_control_notify(screen,control,value) 多数控件的响应都是这个函数负责滴。一旦有控件按压或修改了,,你在这个回调里可以写一些自己处理过程
function on_screen_change(screen) 当页面改变后,这个回调函数将被执行

在串口屏的工程设置里有这么一些设置选项,默认如下图所示:

按红框的里的内容设定,当你翻页、或者按下或松开一个按钮的时候,屏会把内部的控制指令发到物理屏唯一的那个485总线上,便于让外部的mcu系统处理。
像这样的内容:

假设说你想独占总线,不让屏发自己的指令,
或者打算把屏直接做主控单元,直接写lua程序控制设备的业务逻辑(现在MCU这么贵,省点成本不香么),
就必须关闭这个两个选项,不让这些报文发到通信总线上。

那么问题就来了。。。。。
不哔哔,先说个结果:一部分可以一部分不行。
我这里是指要实现上述LUA功能调用的话,而不是指屏本身不能用了。无论关闭什么参数选项,屏自己的操作都是没有问题的。

做这个试验之前,我先构造了一段代码如下:
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
        local snd ={}
        snd=0xbb
        snd=0xbb
        snd=0xbb
        uart_send_data(snd)       
end

--当画面切换时,执行此回调函数,screen为目标画面。
function on_screen_change(screen)
        local snd ={}
        snd=0xaa
        snd=0xaa
        snd=0xaa
        uart_send_data(snd)
end


意思是说,如果屏的页面改变就往485总线上发aa aa aa,如果操作了一个控件,比如按了一个按钮,就发bb bb bb
运行一下,我抓结果给你看:

可以看到出现过2次aaaaaa,这是我这个工程上电后,有2次页面变化
但我还按了n次的按钮呢?那个bbbbbb就没有出现过!说明当“按钮事件通知”关闭后,on_control_notify根本就不回调了~

还别不信,我抓图展示一下打开选项的通信过程啊~

看到2行bbbbbb了吧,那分别是按钮按下和弹起时发的。然而后面跟随了一条内部报文,这显然不符合我们预期的结果。

说结论:
lua的on_control_notify和 on_screen_change回调函数,插在了固件程序不同级别的处理过程中。
我猜测:on_screen_change是在内部控制逻辑里被调用的,所以,关闭选项不影响lua运行
而on_control_notify是在发送报文之前的那个函数里调用的,所以一旦关闭选项,这个回调函数里的代码就执行不到了。

若我分析的正确,请贵司开发人员无论如何帮改一下,不然按键发自定义报文真不好实现,谢谢各位!




Cp`sir 发表于 2021-8-2 09:12:08

不想出现大彩协议的指令报文,开启自由串口协议即可,自行脚本收发解析代码http://doc.gz-dc.com/FAQ/Soft/01_button.html

一直在努力 发表于 2021-8-2 10:49:46

仔细研读楼上给出的链接,然后另启用一个工程:

工程属性为默认值

只做2个按钮,A按钮发送事件通知,B按钮不发送事件通知,设置在二楼链接里,我这里不贴图了。
代码如下:

默认值是6969,收到a按钮发aaaa,收到b按钮发bbbb

结果如下:

b按钮按下,没有进入到lua程序中,所以看不到bbbb的报文

一直在努力 发表于 2021-8-2 11:09:18

为了节约大家时间,我把例子打包了,有兴趣的可以跑一下:lol

xjb1783 发表于 2021-8-2 16:47:26

你的意思是不是想要关闭事件通知而不影响LUA的运行

一直在努力 发表于 2021-8-2 18:35:24

xjb1783 发表于 2021-8-2 16:47
你的意思是不是想要关闭事件通知而不影响LUA的运行

是的,按按钮,LUA构造报文发送。
否则485总线上,每个lua发的报文后面都会有串口屏自己内部的报文。

xjb1783 发表于 2021-8-3 08:38:40


不想出现大彩协议的指令报文,开启自由串口协议即可

xjb1783 发表于 2021-8-3 08:59:05

不想用自由串口协议
也可以这样来做
自己研究把
自己看
哈哈

一直在努力 发表于 2021-8-3 17:19:07

xjb1783 发表于 2021-8-3 08:59
不想用自由串口协议
也可以这样来做
自己研究把


谢谢~ ,为啥包含一个return 1就可以了呢?能帮解释一下吗?
我这样写也行:
                if control ==1 then
                local snd ={}
                snd=0xaa
                snd=0xaa
                snd=0xaa
                uart_send_data(snd)       
                return 1
也能能让屏不发送内部指令,神奇~

还有你说的开启自由串口协议,是使用uart_free_protocol = 1么?
建议更新下doc.gz-dc;串行通信挺重要的。
页: [1]
查看完整版本: LUA的事件响应机制,和有可能改进的一个地方,请围观