Explorar el Código

add:新增780EPM-netLed-demo

马亚丹 hace 5 meses
padre
commit
6089f261c2

+ 131 - 0
module/Air780EPM/demo/netLed/Led_test.lua

@@ -0,0 +1,131 @@
+--[[
+@module  Led_test
+@summary Led_test测试功能模块
+@version 1.0
+@date    2025.10.15
+@author  马亚丹
+@usage
+本demo演示的功能为:使用Air780EPM,1.3开发板,GPIO27,即LTE(板子上的NET)指示灯模拟网络灯的亮灭显示。
+
+工作状态说明,优先级顺序(1-5表示从高到低),高优先级状态会直接覆盖低优先级状态
+1. "FLYMODE"     飞行模式
+2. "SIMERR"      未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
+3. "SCK"         socket已连接上后台
+4. "GPRS"        已附着GPRS数据网络
+5. "IDLE"        未注册GPRS网络
+"NULL":功能关闭状态
+
+各种工作状态下配置的点亮、熄灭时长(单位毫秒),默认值:
+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毫秒
+
+
+
+核心逻辑:
+
+1.自定义LED灯不同状态的闪烁时间
+2.初始化LED,打开LED网络灯功能;
+3.LED灯状态模拟,通过sys.publish("工作状态", 状态):手动模拟状态触发,控制 LED灯的亮灭状态
+4.关闭常规LED灯功能(避免冲突),演示呼吸灯效果
+
+
+]]
+-- 网络状态指示灯演示示例
+-- 注意:需在支持gpio和sys库的环境中运行(如嵌入式Lua开发板)
+
+-- 引入必要模块
+local netLed = require("netLed")
+
+
+-- 初始化网络指示灯引脚(GPIO27,根据硬件调整)
+-- 初始低电平(灭)
+local ledPin = gpio.setup(27, 0, gpio.PULLUP)
+
+--netLed.setup(true, 27)
+
+-- 自定义LED灯不同状态的闪烁时间(增强区分度)
+-- SIM错误:300ms亮/1700ms灭(2秒周期)
+netLed.setBlinkTime("SIMERR", 300, 1700) 
+-- 未注册:500ms亮/2500ms灭(3秒周期)
+netLed.setBlinkTime("IDLE", 500, 2500) 
+-- GPRS附着:200ms亮/200ms灭(400ms周期,中速闪)  
+netLed.setBlinkTime("GPRS", 200, 200)
+-- Socket连接:100ms亮/50ms灭(150ms周期,快速闪)    
+netLed.setBlinkTime("SCK", 100, 50)      
+
+-- 主任务:初始化指示灯并模拟网络状态变化
+local function ledtest() 
+  while true do
+    -- 开启网络灯功能,网络灯用GPIO27,关闭LTE灯(LTE引脚设为空不处理)
+    netLed.setup(true, 27)
+    
+
+    -- 状态1:初始状态(未注册网络,IDLE)
+    log.info("LED状态", "未注册网络(IDLE):500ms亮/2500ms灭")
+    -- 关闭飞行模式
+    sys.publish("FLYMODE", false) 
+    -- SIM正常
+    sys.publish("SIM_IND", "RDY") 
+    -- 未附着GPRS(触发IDLE状态)
+    sys.publish("IP_LOSE") 
+    -- 无Socket连接
+    sys.publish("SOCKET_ACTIVE", false) 
+    -- 维持12秒(4个3秒周期)
+    sys.wait(12000)          
+    
+
+    -- 状态2:SIM卡错误(SIMERR)
+    log.info("LED状态", "SIM卡错误(SIMERR):300ms亮/1700ms灭")
+    -- SIM异常(触发SIMERR状态)
+    sys.publish("SIM_IND", "ERROR")
+    -- 维持8秒(4个2秒周期)
+    sys.wait(8000)                  
+
+    -- 状态3:已附着GPRS(GPRS)
+    log.info("LED状态", "已附着GPRS:200ms亮/200ms灭(中速闪)")
+    -- 恢复SIM正常,覆盖"ERROR"
+    sys.publish("SIM_IND", "RDY")                -- 
+    -- 发布IP_READY事件,明确触发GPRS状态(参数格式正确)
+    sys.publish("IP_READY", "192.168.1.1", true)
+    -- 确保无Socket连接(避免干扰)
+    sys.publish("SOCKET_ACTIVE", false)
+    -- 维持8秒(20个400ms周期)
+    sys.wait(8000)                               
+
+
+    -- 状态4:Socket已连接(SCK)
+    log.info("LED状态", "Socket连接(SCK):100ms亮/50ms灭(快速闪)")
+    -- 有Socket连接(触发SCK状态)
+    sys.publish("SOCKET_ACTIVE", true)
+    -- 维持6秒(40个150ms周期)
+    sys.wait(6000)                     
+
+
+
+    -- 状态5:飞行模式(FLYMODE,默认常灭)
+    log.info("LED状态", "飞行模式(FLYMODE):常灭")
+    -- 开启飞行模式(触发FLYMODE状态)
+    sys.publish("FLYMODE", true) 
+    -- 维持5秒
+    sys.wait(5000)               
+
+    -- 状态6:呼吸灯模式(独占引脚)
+    log.info("LED状态", "呼吸灯模式:平滑渐变亮灭")
+    -- 关闭常规LED功能(释放引脚,避免冲突)
+    netLed.setup(false, 27) 
+    local n = 0
+    --呼吸灯循环10次
+    while n < 10 do
+      -- 传入Led灯引脚
+      netLed.setupBreateLed(ledPin)
+      -- 呼吸灯循环间隔
+      sys.wait(20)
+      n = n + 1
+    end
+  end
+end
+sys.taskInit(ledtest)

+ 88 - 0
module/Air780EPM/demo/netLed/Lte_test.lua

@@ -0,0 +1,88 @@
+--[[
+@module  Lte_test
+@summary Lte_test测试功能模块
+@version 1.0
+@date    2025.10.15
+@author  马亚丹
+@usage
+本demo演示的功能为:使用Air780EPM,1.3开发板,GPIO27,即LTE(板子上的NET)指示灯演示亮灭显示。
+
+
+核心逻辑:
+
+1.初始化LTE,打开LTE指示灯功能;
+2.LTE灯状态模拟,通过sys.publish("LTE_LED_UPDATE", 状态):手动模拟状态触发,控制 LTE 灯的亮灭状态
+3.关闭常规LTE灯功能(避免冲突),演示呼吸灯效果
+
+
+]]
+-- 网络状态指示灯演示示例
+-- 注意:需在支持gpio和sys库的环境中运行(如嵌入式Lua开发板)
+-- 引入必要模块
+local netLed = require("netLed")
+
+
+-- 初始化Lte引脚(根据实际硬件调整)
+-- 初始低电平(灭)
+local ltePin = gpio.setup(27, 0, gpio.PULLUP)
+
+
+
+
+-- 模拟LTE灯不同状态的任务
+local function ltetest()
+    while true do
+        -- 打开指示灯功能,开启功能,LTE灯用GPIO27
+        netLed.setup(true, 0xffff, 27)
+        
+        -- 状态1:LTE灯常灭(初始状态)
+        log.info("LTE灯状态", "常灭")
+        -- 灭
+        sys.publish("LTE_LED_UPDATE", false)
+        -- 演示效果,维持5秒
+        sys.wait(5000)
+
+        -- 状态2:LTE灯常亮
+        log.info("LTE灯状态", "常亮")
+        -- 亮
+        sys.publish("LTE_LED_UPDATE", true)
+        -- 演示效果,维持5秒
+        sys.wait(5000)
+
+        -- 状态3:LTE灯慢速闪烁(500ms亮/500ms灭)
+        log.info("LTE灯状态", "慢速闪烁(500ms亮/500ms灭)")
+        -- 演示效果,闪烁5次
+        for i = 1, 5 do
+            sys.publish("LTE_LED_UPDATE", true)
+            sys.wait(500)
+            sys.publish("LTE_LED_UPDATE", false)
+            sys.wait(500)
+        end
+
+        -- 状态4:LTE灯快速闪烁(100ms亮/100ms灭)
+        log.info("LTE灯状态", "快速闪烁(100ms亮/100ms灭)")
+        -- 演示效果,闪烁10次
+        for i = 1, 10 do
+            sys.publish("LTE_LED_UPDATE", true)
+            sys.wait(100)
+            sys.publish("LTE_LED_UPDATE", false)
+            sys.wait(100)
+        end
+
+        -- 状态5:LTE灯呼吸灯效果(通过渐变模拟)
+        log.info("LTE灯状态", "呼吸灯效果")
+        -- 先关闭常规LTE灯功能(避免冲突)
+        netLed.setup(false, 0xffff, 27)
+        -- 自定义呼吸灯逻辑(复用netLed的呼吸灯函数)
+        local n = 0
+        while n < 10 do
+            -- 传入LTE灯引脚
+            netLed.setupBreateLed(ltePin)
+            -- 呼吸灯循环间隔
+            sys.wait(20)
+            n = n + 1
+        end
+    end
+end
+
+sys.taskInit(ltetest)

+ 5 - 2
module/Air780EPM/demo/netLed/main.lua

@@ -63,10 +63,13 @@ end
 --     log.info("mem.sys", rtos.meminfo("sys"))
 -- end, 3000)
 
---加载"netLed_test"功能模块
-require"netLed_test"
+--加载"Lte_test"功能模块
+--require"Lte_test"
 
 
+--加载"Led_test"功能模块
+require"Led_test"
+
 
 
 -- 用户代码已结束---------------------------------------------

+ 292 - 0
module/Air780EPM/demo/netLed/netLed.lua

@@ -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

+ 0 - 113
module/Air780EPM/demo/netLed/netLed_test.lua

@@ -1,113 +0,0 @@
---[[
-@module  netLed_test
-@summary netLed_test测试功能模块
-@version 1.0
-@date    2025.10.15
-@author  马亚丹
-@usage
-本demo演示的功能为:使用Air780EPM,1.3开发板,GPIO27,即LTE(板子上的NET)指示灯演示网络灯的亮灭显示。
-工作状态说明:
-"NULL":      功能关闭状态
-"FLYMODE"     飞行模式
-"SIMERR"      未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
-"IDLE"        未注册GPRS网络
-"GPRS"        已附着GPRS数据网络
-"SCK"         socket已连接上后台
-
-各种工作状态下配置的点亮、熄灭时长(单位毫秒),默认值:
-FLYMODE = {0,0xFFFF},  --常灭
-SIMERR = {300,5700},  --亮300毫秒,灭5700毫秒
-IDLE = {300,3700},  --亮300毫秒,灭3700毫秒
-GPRS = {300,700},  --亮300毫秒,灭700毫秒
-SCK = {100,100},  --亮100毫秒,灭100毫秒
-
-
-
-核心逻辑:
-1.演示lte指示灯,初始化lte,点亮指示灯
-2.演示led指示灯,初始化led,点亮指示灯
-3.初始化led,演示飞行模式,卡状态错误模式下led指示灯亮灭情况,以及呼吸灯演示
-
-]]
-local netLed = require("netLed")
-
----------步骤1:演示lte指示灯----------
-local function netLte_test()
-    --等待5s,网络稳定后点亮
-    sys.wait(5000)
-    log.info("初始化lte灯")
-    --GPIO27是Air780EPM ,1.3版本开发板的NET灯控制脚,此处演示用不到ledpin,写个不存在的GPIO
-    netLed.setup(true, 0, 27)
-    local lteCtrl = gpio.setup(27, 1, gpio.PULLUP)
-    log.info("lte网络状态灯点亮")
-    netLed.setState()
-    netLed.taskLte(lteCtrl)
-end
-sys.taskInit(netLte_test)
-
----------步骤2:演示led指示灯----------
-local function netLed_test1()
-    --挂起20秒再运行,等前面的运行完
-    sys.wait(20000)
-    log.info("初始化led灯")
-    -- 初始化Led灯 ,打开网络灯功能,GPIO27是Air780EPM ,1.3版本开发板的NET灯控制脚,这里把NET灯做普通led灯模拟使用,设定后按初始的IDLE工作状态的默认配置运行
-    netLed.setup(true, 27)
-    local LedCtrl = gpio.setup(27, 1, gpio.PULLUP)
-    log.info("led网络状态灯点亮")
-    netLed.setState()
-    netLed.taskLed(LedCtrl)
-end
-sys.taskInit(netLed_test1)
-
-
----------步骤3:演示飞行模式,卡状态错误模式下led指示灯亮灭情况以及呼吸灯演示----------
---自定义“飞行模式”的LED闪烁时长:亮1000ms,灭500ms
-netLed.setBlinkTime("FLYMODE")
-
---自定义“SIM卡错误”的LED闪烁时长:亮200ms,灭300ms
---如果开机时没有插卡,会触发这个模式,
---如果开机时卡状态正常会正常运行步骤2的程序
-netLed.setBlinkTime("SIMERR", 100, 200)
-
-
---创建网络灯控制任务
-local function netLed_test()
-    --先挂起一段时间,等前面的演示完
-    sys.wait(40000)
-    log.info("初始化led灯")
-    netLed.setup(true, 27)
-    log.info("获取当前工作状态")
-    --到这里网络已经稳定,工作状态变为GPRS
-    netLed.setState()
-
-    log.info("触发飞行")
-    -- 发布飞行模式事件,工作状态切换为FLYMODE状态
-    sys.publish("FLYMODE", true)
-    --更新LED灯的工作状态
-    netLed.setState()
-
-    sys.wait(20000)
-    log.info("关闭飞行模式")
-    -- 关闭飞行模式
-    sys.publish("FLYMODE", false)
-    --更新LED灯的工作状态
-    netLed.setState()
-
-    --等待1秒确保关闭飞行模式后切换为“呼吸灯”模式
-    sys.wait(1000)
-    log.info("呼吸灯演示")
-    local breatheLed = gpio.setup(27, 1, gpio.PULLUP)    
-    local n = 0
-    while n < 10 do
-        -- 呼吸灯效果(渐亮→保持→渐暗→保持循环),演示循环10次,可按需设定
-        netLed.setupBreateLed(breatheLed)
-        n = n + 1
-        if n == 10 then
-            log.info("呼吸灯演示结束")
-        end
-    end
-    --呼吸灯演示结束,按当前工作状态,即GPRS工作状态的默认配置闪亮
-    --更新LED灯的工作状态
-    netLed.setState()
-end
-sys.taskInit(netLed_test)

+ 175 - 0
module/Air780EPM/demo/netLed/readme.md

@@ -0,0 +1,175 @@
+## 功能模块介绍:
+
+1、main.lua:主程序入口;
+
+2、Lte_test.lua:功能演示核心脚本,lte 指示灯的亮灭演示,在main.lua中加载运行。
+
+3、Led_test.lua:功能演示核心脚本,led 网络灯的亮灭演示,在main.lua中加载运行。
+
+## 演示功能概述:
+
+#### Lte_test.lua:
+
+核心逻辑:
+
+1.初始化LTE,打开LTE指示灯功能;
+
+2.LTE灯状态模拟,通过sys.publish("LTE_LED_UPDATE", 状态):手动模拟状态触发,控制 LTE 灯的亮灭状态
+
+3.关闭常规LTE灯功能(避免冲突),演示呼吸灯效果
+
+#### Led_test.lua:
+
+核心逻辑:
+
+1.自定义LED灯不同状态的闪烁时间
+
+2.初始化LED,打开LED网络灯功能;
+
+3.LED灯状态模拟,通过sys.publish("工作状态", 状态):手动模拟状态触发,控制 LED灯的亮灭状态
+
+4.关闭常规LED灯功能(避免冲突),演示呼吸灯效果
+
+
+
+
+
+工作状态说明,优先级顺序(1-5表示从高到低),高优先级状态会直接覆盖低优先级状态
+
+1. "FLYMODE"     飞行模式
+
+2. "SIMERR"      未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
+
+3. "SCK"         socket已连接上后台
+
+4. "GPRS"        已附着GPRS数据网络
+
+5. "IDLE"        未注册GPRS网络
+   "NULL":功能关闭状态
+   
+   
+
+各种工作状态下配置的点亮、熄灭时长(单位毫秒),默认值:
+
+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毫秒
+
+
+
+## 演示硬件环境
+
+
+
+![](https://docs.openluat.com/air780epm/luatos/app/socket/ftp/image/Df0ZbzlUHonW3IxFO9dcCjcFnLy.jpeg)
+
+1、Air780EPM 1.3 版本开发板一块 + 可上网的 sim 卡一张 +4g 天线一根 + 网线一根:
+
+* sim 卡插入开发板的 sim 卡槽
+
+* 天线装到开发板上
+
+* 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB 数据线一根 + USB 转串口数据线一根,Air780EPM 开发板和数据线的硬件接线方式为:
+
+* Air780EPM 开发板通过 TYPE-C USB 口供电;(外部供电/USB 供电 拨动开关 拨到 USB 供电一端)
+
+* TYPE-C USB 数据线直接插到开发板的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
+
+3、Air780EPM 开发板购买链接:https://item.taobao.com/item.htm?id=871567339387&scene=taobao_shop&skuId=5914252858584&spm=a1z10.1-c-s.w4024-24640132990.1.614a1170fDHCdo
+
+### 
+
+## 演示软件环境
+
+1、 Luatools下载调试工具
+
+2、 固件版本:LuatOS-SoC_V2016_Air780EPM_1.soc,固件地址,如有最新固件请用最新 [固件版本 - luatos@air780epm - 合宙模组资料中心](https://docs.openluat.com/air780epm/luatos/firmware/version/)](https://docs.openluat.com/air780epm/luatos/firmware/version/)
+
+3、 脚本文件:
+   main.lua   
+
+   Lte_test.lua
+
+   Led_test.lua
+
+4、 pc 系统 win11(win10 及以上)
+
+
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Lte_test.lua和Led_test.lua文件中修改自己用到的网络灯的GPIO编号,脚本中使用GPIO 27,是Air780EPM ,1.3版本开发板的NET灯控制脚,其他管脚按自己的硬件设计修改。
+
+3、main.lua中加载Lte_test.lua和Led_test.lua文件之一。
+
+4、Luatools烧录内核固件和修改后的demo脚本代码
+
+5、烧录成功后,代码会自动运行,查看打印日志,如果正常运行,相关灯会按设定的时长亮灭显示,打印如下log:
+
+Lte_test.lua
+
+```
+[2025-10-22 14:44:57.803][000000000.216] I/user.main netLed_demo 001.000.000
+[2025-10-22 14:44:57.809][000000000.233] I/user.LTE灯状态 常灭
+[2025-10-22 14:44:58.021][000000000.713] I/user.netLed.setState true NULL nil false nil nil
+[2025-10-22 14:44:58.040][000000000.714] I/user.sim status RDY
+[2025-10-22 14:44:58.053][000000000.895] I/user.sim status GET_NUMBER
+[2025-10-22 14:44:59.291][000000002.198] D/mobile cid1, state0
+[2025-10-22 14:44:59.293][000000002.199] D/mobile bearer act 0, result 0
+[2025-10-22 14:44:59.297][000000002.200] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-22 14:44:59.299][000000002.200] I/user.netLed.setState true IDLE nil false 1 nil
+[2025-10-22 14:44:59.302][000000002.201] I/user.mobile IP_READY 10.215.50.235 true
+[2025-10-22 14:44:59.306][000000002.230] D/mobile TIME_SYNC 0
+[2025-10-22 14:45:00.287][000000003.233] I/user.LTE灯状态 常亮
+[2025-10-22 14:45:03.280][000000006.233] I/user.LTE灯状态 慢速闪烁(500ms亮/500ms灭)
+[2025-10-22 14:45:08.279][000000011.234] I/user.LTE灯状态 快速闪烁(100ms亮/100ms灭)
+[2025-10-22 14:45:10.286][000000013.234] I/user.LTE灯状态 呼吸灯效果
+
+```
+
+Led_test.lua
+
+```
+[2025-10-22 17:06:32.664][000000000.217] I/user.main netLed_demo 001.000.000
+[2025-10-22 17:06:32.670][000000000.234] I/user.LED状态 未注册网络(IDLE):500ms亮/2500ms灭
+[2025-10-22 17:06:32.686][000000000.239] I/user.netLed.setState true NULL false nil nil nil
+[2025-10-22 17:06:32.703][000000000.239] I/user.netLed.setState true IDLE false false nil nil
+[2025-10-22 17:06:32.716][000000000.240] I/user.sim status RDY
+[2025-10-22 17:06:32.726][000000000.240] I/user.mobile IP_LOSE false
+[2025-10-22 17:06:32.741][000000000.240] I/user.netLed.setState true IDLE false false nil false
+[2025-10-22 17:06:33.038][000000000.715] I/user.sim status RDY
+[2025-10-22 17:06:33.047][000000000.850] I/user.sim status GET_NUMBER
+[2025-10-22 17:06:33.651][000000001.739] D/mobile cid1, state0
+[2025-10-22 17:06:33.658][000000001.740] D/mobile bearer act 0, result 0
+[2025-10-22 17:06:33.676][000000001.741] D/mobile NETIF_LINK_ON -> IP_READY
+[2025-10-22 17:06:33.685][000000001.742] I/user.netLed.setState true IDLE false false 1 false
+[2025-10-22 17:06:33.698][000000001.742] I/user.mobile IP_READY 10.83.147.139 true
+[2025-10-22 17:06:33.707][000000001.798] D/mobile TIME_SYNC 0
+[2025-10-22 17:06:44.011][000000012.235] I/user.LED状态 SIM卡错误(SIMERR):300ms亮/1700ms灭
+[2025-10-22 17:06:44.014][000000012.236] I/user.netLed.setState true GPRS false true 1 false
+[2025-10-22 17:06:44.017][000000012.236] I/user.sim status ERROR
+[2025-10-22 17:06:52.013][000000020.235] I/user.LED状态 已附着GPRS:200ms亮/200ms灭(中速闪)
+[2025-10-22 17:06:52.018][000000020.236] I/user.netLed.setState true SIMERR false false 1 false
+[2025-10-22 17:06:52.022][000000020.236] I/user.sim status RDY
+[2025-10-22 17:06:52.030][000000020.236] I/user.netLed.setState true GPRS false false true false
+[2025-10-22 17:06:52.033][000000020.237] I/user.mobile IP_READY 192.168.1.1 false
+[2025-10-22 17:07:00.017][000000028.234] I/user.LED状态 Socket连接(SCK):100ms亮/50ms灭(快速闪)
+[2025-10-22 17:07:00.027][000000028.235] I/user.netLed.setState true GPRS false false true true
+[2025-10-22 17:07:06.006][000000034.234] I/user.LED状态 飞行模式(FLYMODE):常灭
+[2025-10-22 17:07:06.011][000000034.235] I/user.netLed.setState true SCK true false true true
+[2025-10-22 17:07:11.006][000000039.234] I/user.LED状态 呼吸灯模式:平滑渐变亮灭
+
+
+```