lora2_sender.lua 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. --[[
  2. @module lora2_sender
  3. @summary lora数据发送应用功能模块
  4. @version 1.0
  5. @date 2025.11.03
  6. @author 王世豪
  7. @usage
  8. 本文件为lora数据发送应用功能模块,核心业务逻辑为:
  9. 1、订阅"SEND_DATA_REQ"消息,将其他应用模块需要发送的数据存储到队列send_queue中;
  10. 2、lora2_sender task接收"DEVICE_READY"、"SEND_REQ"、"TX_DONE"消息,处理队列中的数据;
  11. "DEVICE_READY"消息表示lora设备已初始化完成,"SEND_REQ"消息表示有新数据需要发送,"TX_DONE"消息表示数据发送完成;
  12. 4、数据发送完成后通过回调函数通知发送方。
  13. 本文件的对外接口有:
  14. 1. sys.subscribe("SEND_DATA_REQ", send_data_req_proc_func); 订阅"SEND_DATA_REQ"消息;
  15. 其他应用模块如果需要发送数据,直接sys.publish这个消息即可,将需要发送的数据、回调函数和回调参数一起publish出去;
  16. ]]
  17. local lora2_sender = {}
  18. --[[
  19. 数据发送队列,数据结构为:
  20. {
  21. [1] = {data="data1", cb={func=callback_function1, para=callback_para1}},
  22. [2] = {data="data2", cb={func=callback_function2, para=callback_para2}},
  23. }
  24. data: 要发送的数据,string类型,必须存在;
  25. cb.func: 数据发送结果的用户回调函数,可以不存在;
  26. cb.para: 数据发送结果的用户回调函数参数,可以不存在;
  27. ]]
  28. local send_queue = {}
  29. lora2_sender.TASK_NAME = "lora2_sender"
  30. -- "SEND_DATA_REQ"消息的处理函数
  31. local function send_data_req_proc_func(tag, data, cb)
  32. -- 将数据插入到发送队列send_queue中
  33. table.insert(send_queue, {data=data, cb=cb})
  34. -- 发送消息通知 lora sender task,有新数据等待发送
  35. sys.sendMsg(lora2_sender.TASK_NAME, "LORA_EVENT", "SEND_REQ")
  36. log.info("队列", #send_queue)
  37. end
  38. -- 按照顺序发送send_queue中的数据
  39. -- 发送请求提交后,返回当前正在发送的数据项,等待发送完成事件
  40. -- 如果设备未初始化,则通知回调函数发送失败,并继续处理下一条
  41. local function send_item_func(lora_device)
  42. local item
  43. -- 如果发送队列中有数据等待发送
  44. while #send_queue>0 do
  45. -- 取出来第一条数据赋值给item
  46. -- 同时从队列send_queue中删除这一条数据
  47. item = table.remove(send_queue, 1)
  48. -- 检查设备是否初始化
  49. if not lora_device then
  50. log.error("lora2_sender", "设备未初始化")
  51. -- 通知回调函数发送失败
  52. if item.cb and item.cb.func then
  53. item.cb.func(false, item.cb.para)
  54. end
  55. return nil
  56. end
  57. -- 发送数据
  58. lora_device:send(item.data)
  59. -- 返回当前发送项,等待发送完成"TX_DONE"事件
  60. return item
  61. end
  62. return nil
  63. end
  64. -- 处理发送结果的回调函数
  65. local function send_item_cbfunc(item, result)
  66. if item then
  67. -- 如果当前发送的数据有用户回调函数,则执行用户回调函数
  68. if item.cb and item.cb.func then
  69. item.cb.func(result, item.cb.para)
  70. end
  71. end
  72. end
  73. -- lora client sender的任务处理函数
  74. local function lora2_sender_task_func()
  75. local lora_device
  76. local send_item = nil
  77. local msg
  78. while true do
  79. -- 等待"LORA_EVENT"消息
  80. msg = sys.waitMsg(lora2_sender.TASK_NAME, "LORA_EVENT")
  81. log.info("lora2_sender", "收到消息", msg[2])
  82. -- 设备就绪事件
  83. if msg[2] == "DEVICE_READY" then
  84. lora_device = msg[3]
  85. -- 如果当前没有正在发送的数据,则开始发送队列中的数据
  86. if lora_device and not send_item then
  87. send_item = send_item_func(lora_device)
  88. end
  89. -- 发送数据请求
  90. elseif msg[2] == "SEND_REQ" then
  91. -- 如果当前没有正在发送的数据,则开始发送队列中的数据
  92. if lora_device and not send_item then
  93. send_item = send_item_func(lora_device)
  94. end
  95. -- 发送完成事件
  96. elseif msg[2] == "TX_DONE" then
  97. -- 通知回调函数发送成功
  98. send_item_cbfunc(send_item, true)
  99. -- 清空当前发送项
  100. send_item = nil
  101. -- 继续处理队列中的下一条数据
  102. send_item = send_item_func(lora_device)
  103. end
  104. end
  105. end
  106. -- 订阅"SEND_DATA_REQ"消息;
  107. -- 其他应用模块如果需要发送数据,直接sys.publish这个消息即可,将需要发送的数据以及回调函数和回调参数一起publish出去;
  108. -- 本demo项目中uart_app.lua中publish了这个消息;
  109. sys.subscribe("SEND_DATA_REQ", send_data_req_proc_func)
  110. --创建并且启动一个task
  111. --运行这个task的处理函数lora2_sender_task_func
  112. sysplus.taskInitEx(lora2_sender_task_func, lora2_sender.TASK_NAME)
  113. return lora2_sender