netLed.lua 8.0 KB

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