Просмотр исходного кода

Merge branch 'master' of https://gitee.com/openLuat/LuatOS

alienwalker 3 лет назад
Родитель
Сommit
9ba0eef95a
3 измененных файлов с 252 добавлено и 2 удалено
  1. 32 0
      demo/netled/main.lua
  2. 2 2
      luat/modules/luat_lib_mcu.c
  3. 218 0
      script/libs/netLed.lua

+ 32 - 0
demo/netled/main.lua

@@ -0,0 +1,32 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "gpiodemo"
+VERSION = "1.0.1"
+
+log.info("main", PROJECT, VERSION)
+
+-- sys库是标配
+_G.sys = require("sys")
+local netLed = require("netLed")
+
+
+--LED引脚判断赋值结束
+
+local LEDA= gpio.setup(27, 0, gpio.PULLUP)
+
+
+sys.taskInit(function()
+    --流水灯程序
+    sys.wait(5000) --延时5秒等待网络注册
+    log.info("mobile.status()", mobile.status())
+    while true do
+        if mobile.status() == 1 then
+            sys.wait(600)
+            netLed.breateLed(LEDA)
+        end
+    end
+end)
+
+-- 用户代码已结束 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 2 - 2
luat/modules/luat_lib_mcu.c

@@ -134,7 +134,7 @@ static int l_mcu_x32(lua_State* L) {
 
 // #ifdef __LUATOS_TICK_64BIT__
 /*
-获取启动后的高精度tick,目前只有101/103/105能用
+获取启动后的高精度tick
 @api mcu.tick64()
 @return string 当前tick值,8个字节的uint64
 @return int 1us有几个tick,0表示未知
@@ -152,7 +152,7 @@ static int l_mcu_hw_tick64(lua_State* L) {
 }
 
 /*
-计算2个64bit tick的差值,目前只有105能用
+计算2个64bit tick的差值
 @api mcu.dtick64(tick1, tick2, check_value)
 @string 64bit的string
 @string 64bit的string

+ 218 - 0
script/libs/netLed.lua

@@ -0,0 +1,218 @@
+--[[模块功能:网络指示灯模块
+@module netLed
+@author openLuat
+@license MIT
+@copyright HH
+@release 2023年2月2日]]
+netLed = {}
+
+
+--SIM卡状态:true为异常,false或者nil为正常
+local simError
+--是否处于飞行模式:true为是,false或者nil为否
+local flyMode
+--是否注册上GSM网络,true为是,false或者nil为否
+local gsmRegistered
+--是否附着上GPRS网络,true为是,false或者nil为否
+local gprsAttached
+--是否有socket连接上后台,true为是,false或者nil为否
+local socketConnected
+
+--[[网络指示灯表示的工作状态
+NULL:功能关闭状态
+FLYMODE:飞行模式
+SIMERR:未检测到SIM卡或者SIM卡锁pin码等SIM卡异常
+IDLE:未注册GSM网络
+GSM:已注册GSM网络
+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毫秒
+    GSM = {300,1700},  --亮300毫秒,灭1700毫秒
+    GPRS = {300,700},  --亮300毫秒,灭700毫秒
+    SCK = {100,100},  --亮100毫秒,灭100毫秒
+}
+
+--网络指示灯开关,true为打开,false或者nil为关闭
+local ledSwitch = false
+--网络指示灯默认PIN脚(GPIO27)
+local LEDPIN = 27
+--LTE指示灯开关,true为打开,false或者nil为关闭
+local lteSwitch = false
+--LTE指示灯默认PIN脚(GPIO26)
+local LTEPIN = 26
+
+
+--[[
+模块功能:更新网络指示灯表示的工作状态
+参数:无
+返回值:无
+]]
+local function updateState()
+    log.info("netLed.updateState",ledSwitch,ledState,flyMode,simError,gsmRegistered,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"
+        elseif gsmRegistered then
+            newState = "GSM"	
+        end
+        --指示灯状态发生变化
+        if newState~=ledState then
+            ledState = newState
+            sys.publish("NET_LED_UPDATE")
+        end
+    end
+end
+
+--[[
+模块功能:网络指示灯模块的运行任务
+参数:
+       ledPinSetFunc:指示灯GPIO的设置函数
+返回值:无
+]]
+local function 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指示灯模块的运行任务
+参数:
+       ledPinSetFunc:指示灯GPIO的设置函数
+ 返回值:无
+]]
+local function 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指示灯并且立即执行配置后的动作
+@bool flag 是否打开网络指示灯和LTE指示灯功能,true为打开,false为关闭
+@number ledPin 控制网络指示灯闪烁的GPIO引脚,例如pio.P0_1表示GPIO1
+@number ltePin 控制LTE指示灯闪烁的GPIO引脚,例如pio.P0_4表示GPIO4
+@return nil
+@usage setup(true,26,27)表示打开网络指示灯和LTE指示灯功能,GPIO27控制网络指示灯,GPIO26控制LTE指示灯
+@usage setup(false)表示关闭网络指示灯和LTE指示灯功能]]
+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(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(taskLte, gpio.setup(ltePin, 0))  
+    end	
+end
+
+--[[配置某种工作状态下指示灯点亮和熄灭的时长(如果用户不配置,使用netLed.lua中ledBlinkTime配置的默认值)
+@string state 某种工作状态,仅支持"FLYMODE"、"SIMERR"、"IDLE"、"GSM"、"GPRS"、"SCK"
+@number on 指示灯点亮时长,单位毫秒,0xFFFF表示常亮,0表示常灭
+@number off 指示灯熄灭时长,单位毫秒,0xFFFF表示常灭,0表示常亮
+@return nil
+@usage updateBlinkTime("FLYMODE",1000,500)表示飞行模式工作状态下,指示灯闪烁规律为:亮1秒,灭0.5秒
+@usage updateBlinkTime("SCK",0xFFFF,0)表示有socket连接上后台的工作状态下,指示灯闪烁规律为:常亮
+@usage updateBlinkTime("SIMERR",0,0xFFFF)表示SIM卡异常状态下,指示灯闪烁规律为:常灭]]
+function netLed.updateBlinkTime(state,on,off)
+    if not ledBlinkTime[state] then log.error("netLed.updateBlinkTime") 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.updateBlinkTime",state,on,off,updated)
+    if updated then sys.publish("NET_LED_UPDATE") end
+end
+
+--[[ 呼吸灯
+@function ledPin 呼吸灯的ledPin(1)用pins.setup注册返回的方法
+@return nil
+@usage led.breateLed(ledPin)
+@usage 调用函数需要使用任务支持]]
+function netLed.breateLed(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 updateState() end end)
+sys.subscribe("SIM_IND", function(para) if simError~=(para~="RDY") then simError=(para~="RDY") updateState() end end)
+sys.subscribe("IP_CLOSE", function() if gsmRegistered then gsmRegistered=false updateState() end end)
+sys.subscribe("IP_READY", function() if not gsmRegistered then gsmRegistered=true updateState() end end)
+sys.subscribe("IP_READY", function(attach) if gprsAttached~=attach then gprsAttached=attach updateState() end end)
+sys.subscribe("SOCKET_ACTIVE", function(active) if socketConnected~=active then socketConnected=active updateState() end end)
+--sys.subscribe("NET_UPD_NET_MODE", function() if lteSwitch then sys.publish("LTE_LED_UPDATE",net.getNetMode()==net.NetMode_LTE) end end)
+
+
+return netLed