netLed.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. --- 模块功能:网络指示灯模块
  2. -- @module netLed
  3. -- @author openLuat
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.14
  7. module(..., package.seeall)
  8. require "pins"
  9. require "sim"
  10. --SIM卡状态:true为异常,false或者nil为正常
  11. local simError
  12. --是否处于飞行模式:true为是,false或者nil为否
  13. local flyMode
  14. --是否注册上GSM网络,true为是,false或者nil为否
  15. local gsmRegistered
  16. --是否附着上GPRS网络,true为是,false或者nil为否
  17. local gprsAttached
  18. --是否有socket连接上后台,true为是,false或者nil为否
  19. local socketConnected
  20. --网络指示灯表示的工作状态
  21. --NULL:功能关闭状态
  22. --FLYMODE:飞行模式
  23. --SIMERR:未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
  24. --IDLE:未注册GSM网络
  25. --GSM:已注册GSM网络
  26. --GPRS:已附着GPRS数据网络
  27. --SCK:socket已连接上后台
  28. local ledState = "NULL"
  29. local ON,OFF = 1,2
  30. --各种工作状态下配置的点亮、熄灭时长(单位毫秒)
  31. local ledBlinkTime =
  32. {
  33. NULL = {0,0xFFFF}, --常灭
  34. FLYMODE = {0,0xFFFF}, --常灭
  35. SIMERR = {300,5700}, --亮300毫秒,灭5700毫秒
  36. IDLE = {300,3700}, --亮300毫秒,灭3700毫秒
  37. GSM = {300,1700}, --亮300毫秒,灭1700毫秒
  38. GPRS = {300,700}, --亮300毫秒,灭700毫秒
  39. SCK = {100,100}, --亮100毫秒,灭100毫秒
  40. }
  41. --网络指示灯开关,true为打开,false或者nil为关闭
  42. local ledSwitch = false
  43. --网络指示灯默认PIN脚(GPIO64)
  44. local LEDPIN = pio.P2_0
  45. --LTE指示灯开关,true为打开,false或者nil为关闭
  46. local lteSwitch = false
  47. --LTE指示灯默认PIN脚(GPIO65)
  48. local LTEPIN = pio.P2_1
  49. --[[
  50. -- 模块功能:更新网络指示灯表示的工作状态
  51. -- 参数:无
  52. -- 返回值:无
  53. --]]
  54. local function updateState()
  55. --log.info("netLed.updateState",ledSwitch,ledState,flyMode,simError,gsmRegistered,gprsAttached,socketConnected)
  56. if ledSwitch then
  57. local newState = "IDLE"
  58. if flyMode then
  59. newState = "FLYMODE"
  60. elseif simError then
  61. newState = "SIMERR"
  62. elseif socketConnected then
  63. newState = "SCK"
  64. elseif gprsAttached then
  65. newState = "GPRS"
  66. elseif gsmRegistered then
  67. newState = "GSM"
  68. end
  69. --指示灯状态发生变化
  70. if newState~=ledState then
  71. ledState = newState
  72. sys.publish("NET_LED_UPDATE")
  73. end
  74. end
  75. end
  76. --[[
  77. -- 模块功能:网络指示灯模块的运行任务
  78. -- 参数:
  79. ledPinSetFunc:指示灯GPIO的设置函数
  80. -- 返回值:无
  81. --]]
  82. local function taskLed(ledPinSetFunc)
  83. while true do
  84. --log.info("netLed.taskLed",ledPinSetFunc,ledSwitch,ledState)
  85. if ledSwitch then
  86. local onTime,offTime = ledBlinkTime[ledState][ON],ledBlinkTime[ledState][OFF]
  87. if onTime>0 then
  88. ledPinSetFunc(1)
  89. if not sys.waitUntil("NET_LED_UPDATE", onTime) then
  90. if offTime>0 then
  91. ledPinSetFunc(0)
  92. sys.waitUntil("NET_LED_UPDATE", offTime)
  93. end
  94. end
  95. else if offTime>0 then
  96. ledPinSetFunc(0)
  97. sys.waitUntil("NET_LED_UPDATE", offTime)
  98. end
  99. end
  100. else
  101. ledPinSetFunc(0)
  102. break
  103. end
  104. end
  105. end
  106. --[[
  107. -- 模块功能:LTE指示灯模块的运行任务
  108. -- 参数:
  109. ledPinSetFunc:指示灯GPIO的设置函数
  110. -- 返回值:无
  111. --]]
  112. local function taskLte(ledPinSetFunc)
  113. while true do
  114. local _,arg = sys.waitUntil("LTE_LED_UPDATE")
  115. if lteSwitch then
  116. ledPinSetFunc(arg and 1 or 0)
  117. end
  118. end
  119. end
  120. --- 配置网络指示灯和LTE指示灯并且立即执行配置后的动作
  121. -- @bool flag 是否打开网络指示灯和LTE指示灯功能,true为打开,false为关闭
  122. -- @number ledPin 控制网络指示灯闪烁的GPIO引脚,例如pio.P0_1表示GPIO1
  123. -- @number ltePin 控制LTE指示灯闪烁的GPIO引脚,例如pio.P0_4表示GPIO4
  124. -- @return nil
  125. -- @usage setup(true,pio.P0_1,pio.P0_4)表示打开网络指示灯和LTE指示灯功能,GPIO1控制网络指示灯,GPIO4控制LTE指示灯
  126. -- @usage setup(false)表示关闭网络指示灯和LTE指示灯功能
  127. function setup(flag,ledPin,ltePin)
  128. --log.info("netLed.setup",flag,pin,ledSwitch)
  129. local oldSwitch = ledSwitch
  130. if flag~=ledSwitch then
  131. ledSwitch = flag
  132. sys.publish("NET_LED_UPDATE")
  133. end
  134. if flag and not oldSwitch then
  135. sys.taskInit(taskLed, pins.setup(ledPin or LEDPIN, 0))
  136. end
  137. if flag~=lteSwitch then
  138. lteSwitch = flag
  139. end
  140. if flag and ltePin and not oldSwitch then
  141. sys.taskInit(taskLte, pins.setup(ltePin, 0))
  142. end
  143. end
  144. --- 配置某种工作状态下指示灯点亮和熄灭的时长(如果用户不配置,使用netLed.lua中ledBlinkTime配置的默认值)
  145. -- @string state 某种工作状态,仅支持"FLYMODE"、"SIMERR"、"IDLE"、"GSM"、"GPRS"、"SCK"
  146. -- @number on 指示灯点亮时长,单位毫秒,0xFFFF表示常亮,0表示常灭
  147. -- @number off 指示灯熄灭时长,单位毫秒,0xFFFF表示常灭,0表示常亮
  148. -- @return nil
  149. -- @usage updateBlinkTime("FLYMODE",1000,500)表示飞行模式工作状态下,指示灯闪烁规律为:亮1秒,灭0.5秒
  150. -- @usage updateBlinkTime("SCK",0xFFFF,0)表示有socket连接上后台的工作状态下,指示灯闪烁规律为:常亮
  151. -- @usage updateBlinkTime("SIMERR",0,0xFFFF)表示SIM卡异常状态下,指示灯闪烁规律为:常灭
  152. function updateBlinkTime(state,on,off)
  153. if not ledBlinkTime[state] then log.error("netLed.updateBlinkTime") return end
  154. local updated
  155. if on and ledBlinkTime[state][ON]~=on then
  156. ledBlinkTime[state][ON] = on
  157. updated = true
  158. end
  159. if off and ledBlinkTime[state][OFF]~=off then
  160. ledBlinkTime[state][OFF] = off
  161. updated = true
  162. end
  163. --log.info("netLed.updateBlinkTime",state,on,off,updated)
  164. if updated then sys.publish("NET_LED_UPDATE") end
  165. end
  166. sys.subscribe("FLYMODE", function(mode) if flyMode~=mode then flyMode=mode updateState() end end)
  167. sys.subscribe("SIM_IND", function(para) if simError~=(para~="RDY") then simError=(para~="RDY") updateState() end end)
  168. sys.subscribe("NET_STATE_UNREGISTER", function() if gsmRegistered then gsmRegistered=false updateState() end end)
  169. sys.subscribe("NET_STATE_REGISTERED", function() if not gsmRegistered then gsmRegistered=true updateState() end end)
  170. sys.subscribe("GPRS_ATTACH", function(attach) if gprsAttached~=attach then gprsAttached=attach updateState() end end)
  171. sys.subscribe("SOCKET_ACTIVE", function(active) if socketConnected~=active then socketConnected=active updateState() end end)
  172. sys.subscribe("NET_UPD_NET_MODE", function() if lteSwitch then sys.publish("LTE_LED_UPDATE",net.getNetMode()==net.NetMode_LTE) end end)