251 lines
8.0 KiB
Lua
251 lines
8.0 KiB
Lua
|
|
--[[
|
|||
|
|
@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
|
|||
|
|
sys.taskInit(netLed.taskLed, gpio.setup(ledPin or LEDPIN, 0))
|
|||
|
|
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) if simError~=(para~="RDY") and simError~=(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
|