|
|
@@ -0,0 +1,292 @@
|
|
|
+--[[
|
|
|
+@module netLed
|
|
|
+@summary netLed 网络状态指示灯
|
|
|
+@version 1.0
|
|
|
+@date 2023.02.21
|
|
|
+@author DingHeng
|
|
|
+@usage
|
|
|
+--注意:因使用了sys.wait()所有api需要在协程中使用
|
|
|
+-- 用法实例
|
|
|
+local netLed = require ("netLed")
|
|
|
+
|
|
|
+local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
|
|
|
+sys.taskInit(function()
|
|
|
+--呼吸灯
|
|
|
+sys.wait(5080)--延时5秒等待网络注册
|
|
|
+log.info("mobile.status()", mobile.status())
|
|
|
+ while true do
|
|
|
+ if mobile.status() == 1 then--已注册
|
|
|
+ sys.wait(688)
|
|
|
+ netLed.setupBreateLed(LEDA)
|
|
|
+ end
|
|
|
+ end
|
|
|
+end)
|
|
|
+]]
|
|
|
+
|
|
|
+netLed = {}
|
|
|
+-- 引用sys库
|
|
|
+local sys = require("sys")
|
|
|
+
|
|
|
+
|
|
|
+local simError --SIM卡状态:true为异常,false或者nil为正常
|
|
|
+local flyMode --是否处于飞行模式:true为是,false或者nil为否
|
|
|
+local gprsAttached --是否附着上GPRS网络,true为是,false或者nil为否
|
|
|
+local socketConnected --是否有socket连接上后台,true为是,false或者nil为否
|
|
|
+
|
|
|
+--[[
|
|
|
+网络指示灯表示的工作状态
|
|
|
+NULL:功能关闭状态
|
|
|
+FLYMODE:飞行模式
|
|
|
+SIMERR:未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
|
|
|
+IDLE:未注册GPRS网络
|
|
|
+GPRS:已附着GPRS数据网络
|
|
|
+SCK:socket已连接上后台
|
|
|
+]]
|
|
|
+local ledState = "NULL"
|
|
|
+local ON, OFF = 1, 2
|
|
|
+--各种工作状态下配置的点亮、熄灭时长(单位毫秒)
|
|
|
+local ledBlinkTime =
|
|
|
+{
|
|
|
+ NULL = { 0, 0xFFFF }, --常灭
|
|
|
+ FLYMODE = { 0, 0xFFFF }, --常灭
|
|
|
+ SIMERR = { 300, 5700 }, --亮300毫秒,灭5700毫秒
|
|
|
+ IDLE = { 300, 3700 }, --亮300毫秒,灭3700毫秒
|
|
|
+ GPRS = { 300, 700 }, --亮300毫秒,灭700毫秒
|
|
|
+ SCK = { 100, 100 }, --亮100毫秒,灭100毫秒
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+local ledSwitch = false --网络指示灯开关,true为打开,false或者nil为关闭
|
|
|
+local LEDPIN = 27 --网络指示灯默认PIN脚(GPIO27)
|
|
|
+local lteSwitch = false --LTE指示灯开关,true为打开,false或者nil为关闭
|
|
|
+local LTEPIN = 26 --LTE指示灯默认PIN脚(GPIO26)
|
|
|
+
|
|
|
+
|
|
|
+--[[
|
|
|
+更新网络指示灯表示的工作状态
|
|
|
+@api netLed.setState
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+netLed.setState()
|
|
|
+]]
|
|
|
+function netLed.setState()
|
|
|
+ log.info("netLed.setState", ledSwitch, ledState, flyMode, simError, gprsAttached, socketConnected)
|
|
|
+ if ledSwitch then
|
|
|
+ local newState = "IDLE"
|
|
|
+ if flyMode then
|
|
|
+ newState = "FLYMODE"
|
|
|
+ elseif simError then
|
|
|
+ newState = "SIMERR"
|
|
|
+ elseif socketConnected then
|
|
|
+ newState = "SCK"
|
|
|
+ elseif gprsAttached then
|
|
|
+ newState = "GPRS"
|
|
|
+ end
|
|
|
+ --指示灯状态发生变化
|
|
|
+ if newState ~= ledState then
|
|
|
+ ledState = newState
|
|
|
+ sys.publish("NET_LED_UPDATE")
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+网络指示灯模块的运行任务
|
|
|
+@api netLed.taskLed(ledPinSetFunc)
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
|
|
|
+netLed.taskLed(LEDA)
|
|
|
+]]
|
|
|
+function netLed.taskLed(ledPinSetFunc)
|
|
|
+ while true do
|
|
|
+ --log.info("netLed.taskLed",ledPinSetFunc,ledSwitch,ledState)
|
|
|
+ if ledSwitch then
|
|
|
+ local onTime, offTime = ledBlinkTime[ledState][ON], ledBlinkTime[ledState][OFF]
|
|
|
+ if onTime > 0 then
|
|
|
+ ledPinSetFunc(1)
|
|
|
+ if not sys.waitUntil("NET_LED_UPDATE", onTime) then
|
|
|
+ if offTime > 0 then
|
|
|
+ ledPinSetFunc(0)
|
|
|
+ sys.waitUntil("NET_LED_UPDATE", offTime)
|
|
|
+ end
|
|
|
+ end
|
|
|
+ else
|
|
|
+ if offTime > 0 then
|
|
|
+ ledPinSetFunc(0)
|
|
|
+ sys.waitUntil("NET_LED_UPDATE", offTime)
|
|
|
+ end
|
|
|
+ end
|
|
|
+ else
|
|
|
+ ledPinSetFunc(0)
|
|
|
+ break
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+LTE指示灯模块的运行任务
|
|
|
+@api netLed.taskLte(ledPinSetFunc)
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
|
|
|
+netLed.taskLte(LEDA)
|
|
|
+]]
|
|
|
+function netLed.taskLte(ledPinSetFunc)
|
|
|
+ while true do
|
|
|
+ local _, arg = sys.waitUntil("LTE_LED_UPDATE")
|
|
|
+ if lteSwitch then
|
|
|
+ ledPinSetFunc(arg and 1 or 0)
|
|
|
+ end
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+配置网络指示灯和LTE指示灯并且立即执行配置后的动作
|
|
|
+@api netLed.setup(flag,ledpin,ltepin)
|
|
|
+@bool flag 是否打开网络指示灯和LTE指示灯功能,true为打开,false为关闭
|
|
|
+@number ledPin 控制网络指示灯闪烁的GPIO引脚,例如pio.P0_1表示GPIO1
|
|
|
+@number ltePin 控制LTE指示灯闪烁的GPIO引脚,例如pio.P0_4表示GPIO4
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+netLed.setup(true,27,0)
|
|
|
+]]
|
|
|
+function netLed.setup(flag, ledPin, ltePin)
|
|
|
+ --log.info("netLed.setup",flag,pin,ledSwitch)
|
|
|
+ local oldSwitch = ledSwitch
|
|
|
+ if flag ~= ledSwitch then
|
|
|
+ ledSwitch = flag
|
|
|
+ sys.publish("NET_LED_UPDATE")
|
|
|
+ end
|
|
|
+ if flag and not oldSwitch then
|
|
|
+ if ledPin ~= 0xffff then
|
|
|
+ sys.taskInit(netLed.taskLed, gpio.setup(ledPin or LEDPIN, 0))
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if flag ~= lteSwitch then
|
|
|
+ lteSwitch = flag
|
|
|
+ end
|
|
|
+ if flag and ltePin and not oldSwitch then
|
|
|
+ sys.taskInit(netLed.taskLte, gpio.setup(ltePin, 0))
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+配置某种工作状态下指示灯点亮和熄灭的时长(如果用户不配置,使用netLed.lua中ledBlinkTime配置的默认值)
|
|
|
+@api netLed.setBlinkTime(state,on,off)
|
|
|
+@string state 某种工作状态,仅支持"FLYMODE"、"SIMERR"、"IDLE"、"GSM"、"GPRS"、"SCK"
|
|
|
+@number on 指示灯点亮时长,单位毫秒,0xFFFF表示常亮,0表示常灭
|
|
|
+@number off 指示灯熄灭时长,单位毫秒,0xFFFF表示常灭,0表示常亮
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+netLed.setBlinkTime(("FLYMODE",1000,500) --表示飞行模式工作状态下,指示灯闪烁规律为: 亮1秒,灭8.5秒
|
|
|
+]]
|
|
|
+function netLed.setBlinkTime(state, on, off)
|
|
|
+ if not ledBlinkTime[state] then
|
|
|
+ log.error("netLed.setBlinkTime")
|
|
|
+ return
|
|
|
+ end
|
|
|
+ local updated
|
|
|
+ if on and ledBlinkTime[state][ON] ~= on then
|
|
|
+ ledBlinkTime[state][ON] = on
|
|
|
+ updated = true
|
|
|
+ end
|
|
|
+ if off and ledBlinkTime[state][OFF] ~= off then
|
|
|
+ ledBlinkTime[state][OFF] = off
|
|
|
+ updated = true
|
|
|
+ end
|
|
|
+ --log.info("netLed.setBlinkTime",state,on,off,updated)
|
|
|
+ if updated then sys.publish("NET_LED_UPDATE") end
|
|
|
+end
|
|
|
+
|
|
|
+--[[
|
|
|
+呼吸灯
|
|
|
+@api netLed.setupBreateLed(ledPin)
|
|
|
+@function ledPin 呼吸灯的ledPin(1)用pins.setup注册返回的方法
|
|
|
+@return nil 无返回值
|
|
|
+@usage
|
|
|
+local netLed = require ("netLed")
|
|
|
+local LEDA = gpio.setup(27,1,gpio.PULLUP) --LED引脚判断赋值结束
|
|
|
+sys.taskInit(function()
|
|
|
+--呼吸灯
|
|
|
+sys.wait(5080)--延时5秒等待网络注册
|
|
|
+log.info("mobile.status()", mobile.status())
|
|
|
+ while true do
|
|
|
+ if mobile.status() == 1 then--已注册
|
|
|
+ sys.wait(688)
|
|
|
+ netLed.setupBreateLed(LEDA)
|
|
|
+ end
|
|
|
+ end
|
|
|
+end)
|
|
|
+]]
|
|
|
+function netLed.setupBreateLed(ledPin)
|
|
|
+ -- 呼吸灯的状态、PWM周期
|
|
|
+ local bLighting, bDarking, LED_PWM = false, true, 18
|
|
|
+ if bLighting then
|
|
|
+ for i = 1, LED_PWM - 1 do
|
|
|
+ ledPin(0)
|
|
|
+ sys.wait(i)
|
|
|
+ ledPin(1)
|
|
|
+ sys.wait(LED_PWM - i)
|
|
|
+ end
|
|
|
+ bLighting = false
|
|
|
+ bDarking = true
|
|
|
+ ledPin(0)
|
|
|
+ sys.wait(700)
|
|
|
+ end
|
|
|
+ if bDarking then
|
|
|
+ for i = 1, LED_PWM - 1 do
|
|
|
+ ledPin(0)
|
|
|
+ sys.wait(LED_PWM - i)
|
|
|
+ ledPin(1)
|
|
|
+ sys.wait(i)
|
|
|
+ end
|
|
|
+ bLighting = true
|
|
|
+ bDarking = false
|
|
|
+ ledPin(1)
|
|
|
+ sys.wait(700)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+sys.subscribe("FLYMODE", function(mode)
|
|
|
+ if flyMode ~= mode then
|
|
|
+ flyMode = mode
|
|
|
+ netLed.setState()
|
|
|
+ end
|
|
|
+end)
|
|
|
+sys.subscribe("SIM_IND",
|
|
|
+ function(para)
|
|
|
+ --注释行的逻辑,在"SIMERR"状态时,simError为true,变成"RDY"状态时, simError仍为 true,导致状态不更新
|
|
|
+ --修改为下方的逻辑,"SIMERR"状态时,simError为true,变成"RDY"状态时, simErro为false, 状态正常更新
|
|
|
+ --if simError ~= (para ~= "RDY") and simError ~= (para ~= "GET_NUMBER") then
|
|
|
+ if simError ~= (para ~= "RDY") and (para ~= "GET_NUMBER") then
|
|
|
+ simError = (para ~= "RDY")
|
|
|
+ netLed.setState()
|
|
|
+ end
|
|
|
+ log.info("sim status", para)
|
|
|
+ end)
|
|
|
+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)
|
|
|
+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)
|
|
|
+sys.subscribe("SOCKET_ACTIVE",
|
|
|
+ function(active)
|
|
|
+ if socketConnected ~= active then
|
|
|
+ socketConnected = active
|
|
|
+ netLed.setState()
|
|
|
+ end
|
|
|
+ end)
|
|
|
+
|
|
|
+return netLed
|