netLed.lua 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. --[[
  2. @module netLed
  3. @summary netLed 网络状态指示灯
  4. @version 1.0
  5. @date 2023.02.21
  6. @author DingHeng
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local netLed = require ("netLed")
  11. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  12. sys.taskInit(function()
  13. --呼吸灯
  14. sys.wait(5080)--延时5秒等待网络注册
  15. log.info("mobile.status()", mobile.status())
  16. while true do
  17. if mobile.status() == 1--已注册
  18. thensys.wait(688)
  19. netLed.setupBreateLed(LEDA)
  20. end
  21. end
  22. end)
  23. ]]
  24. netLed = {}
  25. local simError --SIM卡状态:true为异常,false或者nil为正常
  26. local flyMode --是否处于飞行模式:true为是,false或者nil为否
  27. local gprsAttached --是否附着上GPRS网络,true为是,false或者nil为否
  28. local socketConnected --是否有socket连接上后台,true为是,false或者nil为否
  29. --[[
  30. 网络指示灯表示的工作状态
  31. NULL:功能关闭状态
  32. FLYMODE:飞行模式
  33. SIMERR:未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
  34. IDLE:未注册GPRS网络
  35. GPRS:已附着GPRS数据网络
  36. SCK:socket已连接上后台
  37. ]]
  38. local ledState = "NULL"
  39. local ON,OFF = 1,2
  40. --各种工作状态下配置的点亮、熄灭时长(单位毫秒)
  41. local ledBlinkTime =
  42. {
  43. NULL = {0,0xFFFF}, --常灭
  44. FLYMODE = {0,0xFFFF}, --常灭
  45. SIMERR = {300,5700}, --亮300毫秒,灭5700毫秒
  46. IDLE = {300,3700}, --亮300毫秒,灭3700毫秒
  47. GPRS = {300,700}, --亮300毫秒,灭700毫秒
  48. SCK = {100,100}, --亮100毫秒,灭100毫秒
  49. }
  50. local ledSwitch = false --网络指示灯开关,true为打开,false或者nil为关闭
  51. local LEDPIN = 27 --网络指示灯默认PIN脚(GPIO27)
  52. local lteSwitch = false --LTE指示灯开关,true为打开,false或者nil为关闭
  53. local LTEPIN = 26 --LTE指示灯默认PIN脚(GPIO26)
  54. --[[
  55. 更新网络指示灯表示的工作状态
  56. @api netLed.setState
  57. @return nil 无返回值
  58. @usage
  59. netLed.setState()
  60. ]]
  61. function netLed.setState()
  62. log.info("netLed.setState",ledSwitch,ledState,flyMode,simError,gprsAttached,socketConnected)
  63. if ledSwitch then
  64. local newState = "IDLE"
  65. if flyMode then
  66. newState = "FLYMODE"
  67. elseif simError then
  68. newState = "SIMERR"
  69. elseif socketConnected then
  70. newState = "SCK"
  71. elseif gprsAttached then
  72. newState = "GPRS"
  73. end
  74. --指示灯状态发生变化
  75. if newState~=ledState then
  76. ledState = newState
  77. sys.publish("NET_LED_UPDATE")
  78. end
  79. end
  80. end
  81. --[[
  82. 网络指示灯模块的运行任务
  83. @api netLed.taskLed(ledPinSetFunc)
  84. @return nil 无返回值
  85. @usage
  86. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  87. netLed.taskLed(LEDA)
  88. ]]
  89. function netLed.taskLed(ledPinSetFunc)
  90. while true do
  91. --log.info("netLed.taskLed",ledPinSetFunc,ledSwitch,ledState)
  92. if ledSwitch then
  93. local onTime,offTime = ledBlinkTime[ledState][ON],ledBlinkTime[ledState][OFF]
  94. if onTime>0 then
  95. ledPinSetFunc(1)
  96. if not sys.waitUntil("NET_LED_UPDATE", onTime) then
  97. if offTime>0 then
  98. ledPinSetFunc(0)
  99. sys.waitUntil("NET_LED_UPDATE", offTime)
  100. end
  101. end
  102. else if offTime>0 then
  103. ledPinSetFunc(0)
  104. sys.waitUntil("NET_LED_UPDATE", offTime)
  105. end
  106. end
  107. else
  108. ledPinSetFunc(0)
  109. break
  110. end
  111. end
  112. end
  113. --[[
  114. LTE指示灯模块的运行任务
  115. @api netLed.taskLte(ledPinSetFunc)
  116. @return nil 无返回值
  117. @usage
  118. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  119. netLed.taskLte(LEDA)
  120. ]]
  121. function netLed.taskLte(ledPinSetFunc)
  122. while true do
  123. local _,arg = sys.waitUntil("LTE_LED_UPDATE")
  124. if lteSwitch then
  125. ledPinSetFunc(arg and 1 or 0)
  126. end
  127. end
  128. end
  129. --[[
  130. 配置网络指示灯和LTE指示灯并且立即执行配置后的动作
  131. @api netLed.setup(flag,ledpin,ltepin)
  132. @bool flag 是否打开网络指示灯和LTE指示灯功能,true为打开,false为关闭
  133. @number ledPin 控制网络指示灯闪烁的GPIO引脚,例如pio.P0_1表示GPIO1
  134. @number ltePin 控制LTE指示灯闪烁的GPIO引脚,例如pio.P0_4表示GPIO4
  135. @return nil 无返回值
  136. @usage
  137. netLed.setup(true,27,0)
  138. ]]
  139. function netLed.setup(flag,ledPin,ltePin)
  140. --log.info("netLed.setup",flag,pin,ledSwitch)
  141. local oldSwitch = ledSwitch
  142. if flag~=ledSwitch then
  143. ledSwitch = flag
  144. sys.publish("NET_LED_UPDATE")
  145. end
  146. if flag and not oldSwitch then
  147. sys.taskInit(taskLed, gpio.setup(ledPin or LEDPIN, 0))
  148. end
  149. if flag~=lteSwitch then
  150. lteSwitch = flag
  151. end
  152. if flag and ltePin and not oldSwitch then
  153. sys.taskInit(taskLte, gpio.setup(ltePin, 0))
  154. end
  155. end
  156. --[[
  157. 配置某种工作状态下指示灯点亮和熄灭的时长(如果用户不配置,使用netLed.lua中ledBlinkTime配置的默认值)
  158. @api netLed.setBlinkTime(state,on,off)
  159. @string state 某种工作状态,仅支持"FLYMODE"、"SIMERR"、"IDLE"、"GSM"、"GPRS"、"SCK"
  160. @number on 指示灯点亮时长,单位毫秒,0xFFFF表示常亮,0表示常灭
  161. @number off 指示灯熄灭时长,单位毫秒,0xFFFF表示常灭,0表示常亮
  162. @return nil 无返回值
  163. @usage
  164. netLed.setBlinkTime(("FLYMODE",1000,500) --表示飞行模式工作状态下,指示灯闪烁规律为: 亮1秒,灭8.5秒
  165. ]]
  166. function netLed.setBlinkTime(state,on,off)
  167. if not ledBlinkTime[state] then log.error("netLed.setBlinkTime") return end
  168. local updated
  169. if on and ledBlinkTime[state][ON]~=on then
  170. ledBlinkTime[state][ON] = on
  171. updated = true
  172. end
  173. if off and ledBlinkTime[state][OFF]~=off then
  174. ledBlinkTime[state][OFF] = off
  175. updated = true
  176. end
  177. --log.info("netLed.setBlinkTime",state,on,off,updated)
  178. if updated then sys.publish("NET_LED_UPDATE") end
  179. end
  180. --[[
  181. 呼吸灯
  182. @api netLed.setupBreateLed(ledPin)
  183. @function ledPin 呼吸灯的ledPin(1)用pins.setup注册返回的方法
  184. @return nil 无返回值
  185. @usage
  186. local netLed = require ("netLed")
  187. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  188. sys.taskInit(function()
  189. --呼吸灯
  190. sys.wait(5080)--延时5秒等待网络注册
  191. log.info("mobile.status()", mobile.status())
  192. while true do
  193. if mobile.status() == 1--已注册
  194. thensys.wait(688)
  195. netLed.setupBreateLed(LEDA)
  196. end
  197. end
  198. end)
  199. ]]
  200. function netLed.setupBreateLed(ledPin)
  201. -- 呼吸灯的状态、PWM周期
  202. local bLighting, bDarking, LED_PWM = false, true, 18
  203. if bLighting then
  204. for i = 1, LED_PWM - 1 do
  205. ledPin(0)
  206. sys.wait(i)
  207. ledPin(1)
  208. sys.wait(LED_PWM - i)
  209. end
  210. bLighting = false
  211. bDarking = true
  212. ledPin(0)
  213. sys.wait(700)
  214. end
  215. if bDarking then
  216. for i = 1, LED_PWM - 1 do
  217. ledPin(0)
  218. sys.wait(LED_PWM - i)
  219. ledPin(1)
  220. sys.wait(i)
  221. end
  222. bLighting = true
  223. bDarking = false
  224. ledPin(1)
  225. sys.wait(700)
  226. end
  227. end
  228. sys.subscribe("FLYMODE", function(mode) if flyMode~=mode then flyMode=mode netLed.setState() end end)
  229. sys.subscribe("SIM_IND", function(para) if simError~=(para~="RDY") and simError~=(para~="GET_NUMBER") then simError=(para~="RDY") netLed.setState() end log.info("sim status", para) end)
  230. sys.subscribe("IP_LOSE", function() if gprsAttached then gprsAttached=false netLed.setState() end log.info("mobile", "IP_LOSE", (adapter or -1) == socket.LWIP_GP) end)
  231. sys.subscribe("IP_READY", function(ip, adapter) if gprsAttached~=adapter then gprsAttached=adapter netLed.setState() end log.info("mobile", "IP_READY", ip, (adapter or -1) == socket.LWIP_GP) end)
  232. sys.subscribe("SOCKET_ACTIVE", function(active) if socketConnected~=active then socketConnected=active netLed.setState() end end)
  233. return netLed