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