netLed.lua 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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
  105. if offTime > 0 then
  106. ledPinSetFunc(0)
  107. sys.waitUntil("NET_LED_UPDATE", offTime)
  108. end
  109. end
  110. else
  111. ledPinSetFunc(0)
  112. break
  113. end
  114. end
  115. end
  116. --[[
  117. LTE指示灯模块的运行任务
  118. @api netLed.taskLte(ledPinSetFunc)
  119. @return nil 无返回值
  120. @usage
  121. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  122. netLed.taskLte(LEDA)
  123. ]]
  124. function netLed.taskLte(ledPinSetFunc)
  125. while true do
  126. local _, arg = sys.waitUntil("LTE_LED_UPDATE")
  127. if lteSwitch then
  128. ledPinSetFunc(arg and 1 or 0)
  129. end
  130. end
  131. end
  132. --[[
  133. 配置网络指示灯和LTE指示灯并且立即执行配置后的动作
  134. @api netLed.setup(flag,ledpin,ltepin)
  135. @bool flag 是否打开网络指示灯和LTE指示灯功能,true为打开,false为关闭
  136. @number ledPin 控制网络指示灯闪烁的GPIO引脚,例如pio.P0_1表示GPIO1
  137. @number ltePin 控制LTE指示灯闪烁的GPIO引脚,例如pio.P0_4表示GPIO4
  138. @return nil 无返回值
  139. @usage
  140. netLed.setup(true,27,0)
  141. ]]
  142. function netLed.setup(flag, ledPin, ltePin)
  143. --log.info("netLed.setup",flag,pin,ledSwitch)
  144. local oldSwitch = ledSwitch
  145. if flag ~= ledSwitch then
  146. ledSwitch = flag
  147. sys.publish("NET_LED_UPDATE")
  148. end
  149. if flag and not oldSwitch then
  150. if ledPin ~= 0xffff then
  151. sys.taskInit(netLed.taskLed, gpio.setup(ledPin or LEDPIN, 0))
  152. end
  153. end
  154. if flag ~= lteSwitch then
  155. lteSwitch = flag
  156. end
  157. if flag and ltePin and not oldSwitch then
  158. sys.taskInit(netLed.taskLte, gpio.setup(ltePin, 0))
  159. end
  160. end
  161. --[[
  162. 配置某种工作状态下指示灯点亮和熄灭的时长(如果用户不配置,使用netLed.lua中ledBlinkTime配置的默认值)
  163. @api netLed.setBlinkTime(state,on,off)
  164. @string state 某种工作状态,仅支持"FLYMODE"、"SIMERR"、"IDLE"、"GSM"、"GPRS"、"SCK"
  165. @number on 指示灯点亮时长,单位毫秒,0xFFFF表示常亮,0表示常灭
  166. @number off 指示灯熄灭时长,单位毫秒,0xFFFF表示常灭,0表示常亮
  167. @return nil 无返回值
  168. @usage
  169. netLed.setBlinkTime(("FLYMODE",1000,500) --表示飞行模式工作状态下,指示灯闪烁规律为: 亮1秒,灭8.5秒
  170. ]]
  171. function netLed.setBlinkTime(state, on, off)
  172. if not ledBlinkTime[state] then
  173. log.error("netLed.setBlinkTime")
  174. return
  175. end
  176. local updated
  177. if on and ledBlinkTime[state][ON] ~= on then
  178. ledBlinkTime[state][ON] = on
  179. updated = true
  180. end
  181. if off and ledBlinkTime[state][OFF] ~= off then
  182. ledBlinkTime[state][OFF] = off
  183. updated = true
  184. end
  185. --log.info("netLed.setBlinkTime",state,on,off,updated)
  186. if updated then sys.publish("NET_LED_UPDATE") end
  187. end
  188. --[[
  189. 呼吸灯
  190. @api netLed.setupBreateLed(ledPin)
  191. @function ledPin 呼吸灯的ledPin(1)用pins.setup注册返回的方法
  192. @return nil 无返回值
  193. @usage
  194. local netLed = require ("netLed")
  195. local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
  196. sys.taskInit(function()
  197. --呼吸灯
  198. sys.wait(5080)--延时5秒等待网络注册
  199. log.info("mobile.status()", mobile.status())
  200. while true do
  201. if mobile.status() == 1 then--已注册
  202. sys.wait(688)
  203. netLed.setupBreateLed(LEDA)
  204. end
  205. end
  206. end)
  207. ]]
  208. function netLed.setupBreateLed(ledPin)
  209. -- 呼吸灯的状态、PWM周期
  210. local bLighting, bDarking, LED_PWM = false, true, 18
  211. if bLighting then
  212. for i = 1, LED_PWM - 1 do
  213. ledPin(0)
  214. sys.wait(i)
  215. ledPin(1)
  216. sys.wait(LED_PWM - i)
  217. end
  218. bLighting = false
  219. bDarking = true
  220. ledPin(0)
  221. sys.wait(700)
  222. end
  223. if bDarking then
  224. for i = 1, LED_PWM - 1 do
  225. ledPin(0)
  226. sys.wait(LED_PWM - i)
  227. ledPin(1)
  228. sys.wait(i)
  229. end
  230. bLighting = true
  231. bDarking = false
  232. ledPin(1)
  233. sys.wait(700)
  234. end
  235. end
  236. sys.subscribe("FLYMODE", function(mode)
  237. if flyMode ~= mode then
  238. flyMode = mode
  239. netLed.setState()
  240. end
  241. end)
  242. sys.subscribe("SIM_IND",
  243. function(para)
  244. --注释行的逻辑,在"SIMERR"状态时,simError为true,变成"RDY"状态时, simError仍为 true,导致状态不更新
  245. --修改为下方的逻辑,"SIMERR"状态时,simError为true,变成"RDY"状态时, simErro为false, 状态正常更新
  246. --if simError ~= (para ~= "RDY") and simError ~= (para ~= "GET_NUMBER") then
  247. if simError ~= (para ~= "RDY") and (para ~= "GET_NUMBER") then
  248. simError = (para ~= "RDY")
  249. netLed.setState()
  250. end
  251. log.info("sim status", para)
  252. end)
  253. sys.subscribe("IP_LOSE",
  254. function()
  255. if gprsAttached then
  256. gprsAttached = false
  257. netLed.setState()
  258. end
  259. log.info("mobile", "IP_LOSE", (adapter or -1) == socket.LWIP_GP)
  260. end)
  261. sys.subscribe("IP_READY",
  262. function(ip, adapter)
  263. if gprsAttached ~= adapter then
  264. gprsAttached = adapter
  265. netLed.setState()
  266. end
  267. log.info("mobile", "IP_READY", ip, (adapter or -1) == socket.LWIP_GP)
  268. end)
  269. sys.subscribe("SOCKET_ACTIVE",
  270. function(active)
  271. if socketConnected ~= active then
  272. socketConnected = active
  273. netLed.setState()
  274. end
  275. end)
  276. return netLed