sys.publish(topic, ...)
sys.subscribe(topic, callback)
sys.unsubscribe(topic, callback)
sys.unsubscribeAll(topic)
sys.restart(r, log)
sys.wait(ms)
sys.waitUntil(topic, ms)
sys.timerStart(fnc, ms, ...)
sys.timerLoopStart(fnc, ms, ...)
sys.eventloop()
sys.taskInit(fun, ...)
发布消息到总线
入参 | 说明 |
---|---|
topic | 字符串,发布的消息的主题 |
param | 任意类型,发送的参数;如果是字符串会把两个主题连接起来 |
无返回;
示例:
-- 使用实例
-- 基本发布订阅使用
local sendTopic = "NET_SEND_1"
local recvTopic = "NET_RECV_1"
local function handle(msg)
log.info("msg", msg)
end
sys.subscribe(recvTopic, handle)
sys.publish(recvTopic, "12344")
-- 运行后打印1234
-- 消息转发的使用
local function handle1(msg, id, from)
log.info("msg1", msg)
end
sys.subscribe("NET_SEND_1", handle1)
sys.subscribe("NET_SEND_8", "NET_SEND_1")
-- 发送消息到通道8,流转到通道1
sys.publish("NET_SEND_8", "12344", 2, "UART_RECV_2")
订阅消息,如果publish时候携带了多个参数,会依次传到callback里面
入参 | 说明 |
---|---|
topic | 字符串,订阅的消息的主题 |
callback | function,收到消息后执行的回调函数 |
无返回;
示例参考publish;
取消订阅消息,取消主题的对应callback订阅
入参 | 说明 |
---|---|
topic | 字符串,取消订阅的消息的主题 |
callback | function,取消收到消息后执行的回调函数 |
无返回;
示例参考publish;
取消对应主题的全部订阅
入参 | 说明 |
---|---|
topic | 字符串,取消订阅的消息的主题 |
无返回;
示例参考publish;
重启系统
入参 | 说明 |
---|---|
r | 字符串,传到系统日志的参数,重启的原因,可能会被记录到错误日志用来参考 |
log | bool,是否记录到日志 |
无返回;
-- 立即重启
sys.restart("user reboot")
--延迟1s后重启
sys.timerStart(sys.restart, 1000, "delay restart!", false)
必须在协程内调用,让协程延迟ms
入参 | 说明 |
---|---|
ms | 数字,延迟的ms数 |
无返回;
示例参考publish;
必须在协程内调用,让协程延迟ms或者在收到对应订阅消息时退出
入参 | 说明 |
---|---|
topic | 字符串,订阅的消息,收到后停止延迟 |
ms | 数字,延迟的时间 |
无返回;
sys.taskInit(function(...)
-- body
while true do
sys.wait(1000) -- 延迟1s
sys.waitUntil("utest1", 20000) -- 和wait不同,从消息队列取消息,收到了立即结束。否则等到超时,单位ms
sys.publish("utest2", "i1", rtos.tick())
end
end)
新建一个单次定时器
入参 | 说明 |
---|---|
fnc | 定时时间到后的回调函数 |
ms | 数字,延迟的时间 |
param | 可变参数,附近参数,会传入到回调函数 |
返回 | 说明 |
---|---|
res | bool,创建结果 |
id | 对象,创建的定时器对象 |
新建一个循环定时器
入参 | 说明 |
---|---|
fnc | 定时时间到后的回调函数 |
ms | 数字,延迟的时间 |
param | 可变参数,附近参数,会传入到回调函数 |
返回 | 说明 |
---|---|
res | bool,创建结果 |
id | 对象,创建的定时器对象 |
定制定时器
入参 | 说明 |
---|---|
id | 对象,创建的定时器对象 |
重载定时器计数器,计数器归0。重新计数
入参 | 说明 |
---|---|
id | 对象,创建的定时器对象 |
-- 测量tick的时间
local tickstart = rtos.tick() -- 单位是tick。zl500是10s一个tick,zl400是10ms一个tick
local stat, id1 = sys.timerStart(function(a, b, c)
endt = rtos.tick()
log.warn("5s period tick is", (endt - tickstart), a, b, c)
end, 5000, "aa", "vv", 55)
-- 重设定时周期
sys.timerReload(id1)
--停止
sys.timerStop(id1)
-- 周期定时调用, 入参:callbackfun, time, contx_a, contx_b, contx_c
-- 定时单位是ms,误差小于10ms
-- sys.timerLoopStart(fun(a,b,c), time, a,b,c)
local stat, id2 = sys.timerLoopStart(function(a, b, c)
log.info("mem sys", rtos.meminfo("sys"))
log.info("mem lua", rtos.meminfo())
log.info("contex", a, b, c)
end, 15000, "aa", "bb", 12354)
启动系统消息队列的处理,需要在脚本最后运行;注意只有eventloop在运行后,消息队列才会流转
-- 启动消息总线
while true do sys.eventloop() end
创建一个协程/task,附加的参数会传入到入口函数
入参 | 说明 |
---|---|
fun | 协程执行的应用函数 |
param | 可变参数,附近参数,会传入到回调函数 |
-- 创建协程,入参:fun, contx_a, contx_b, contx_c
-- sys.taskInit(fun, a, b, c)
local taskcnt = 0
local taskHandle = function(a, b, c)
log.debug("taskHandle contex", a, b, c) -- 打印可变参数
-- log.debug(arg[1]) -- 打印可变参数
-- body
while true do -- 协程内部可以做成while(1) 记得加wait延迟,不要100%占用cpu
sys.wait(1000) -- 延迟1000ms, 必须在协程内部使用
taskcnt = taskcnt + 1
if taskcnt == 15 then
log.warn("taskInit test2", taskcnt, a, b, c)
end
end
end
log.warn("taskInit test1", taskcnt)
sys.taskInit(taskHandle, 1, 2, "3333")