Prechádzať zdrojové kódy

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

alienwalker 3 rokov pred
rodič
commit
a5b9a49eb9

+ 31 - 1
components/mobile/luat_lib_mobile.c

@@ -554,7 +554,16 @@ static int l_mobile_event_handle(lua_State* L, void* ptr) {
         switch (status)
         {
         case LUAT_MOBILE_CELL_INFO_UPDATE:
-            //LLOGD("CELL_INFO_UPDATE %d", status);
+/*
+@sys_pub mobile
+基站数据已更新
+CELL_INFO_UPDATE
+@usage
+-- 订阅式, 模块本身会周期性查询基站信息,但通常不包含临近小区
+sys.subscribe("CELL_INFO_UPDATE", function()
+    log.info("cell", json.encode(mobile.getCellInfo()))
+end)
+*/
             lua_pushstring(L, "CELL_INFO_UPDATE");
             lua_call(L, 1, 0);
 		    break;
@@ -569,6 +578,17 @@ static int l_mobile_event_handle(lua_State* L, void* ptr) {
 		{
 		case LUAT_MOBILE_NETIF_LINK_ON:
             LLOGD("NETIF_LINK_ON -> IP_READY");
+/*
+@sys_pub mobile
+已联网
+IP_READY
+@usage
+-- 联网后会发一次这个消息
+-- 与wlan库不同, 本消息不带ip地址
+sys.subscribe("IP_READY", function()
+    log.info("mobile", "IP_READY")
+end)
+*/
             lua_pushstring(L, "IP_READY");
             lua_call(L, 1, 0);
 			break;
@@ -580,6 +600,16 @@ static int l_mobile_event_handle(lua_State* L, void* ptr) {
 		}
 		break;
 	case LUAT_MOBILE_EVENT_TIME_SYNC:
+/*
+@sys_pub mobile
+时间已经同步
+NTP_UPDATE
+@usage
+-- 对于电信/移动的卡, 联网后,基站会下发时间,但联通卡不会,务必留意
+sys.subscribe("NTP_UPDATE", function()
+    log.info("mobile", "time", os.date())
+end)
+*/
         LLOGD("TIME_SYNC %d", status);
         lua_pushstring(L, "NTP_UPDATE");
         lua_call(L, 1, 0);

+ 1 - 1
components/network/httpsrv/src/luat_lib_httpsrv.c

@@ -3,7 +3,7 @@
 @summary http服务端
 @version 1.0
 @date    2022.010.15
-@demo network
+@demo wlan
 */
 
 #include "luat_base.h"

+ 1 - 1
components/network/libemqtt/luat_lib_mqtt.c

@@ -3,7 +3,7 @@
 @summary mqtt客户端
 @version 1.0
 @date    2022.08.25
-@demo network
+@demo socket
 */
 
 #include "luat_base.h"

+ 1 - 1
components/network/libhttp/luat_lib_http.c

@@ -3,7 +3,7 @@
 @summary http2客户端
 @version 1.0
 @date    2022.09.05
-@demo network
+@demo    socket
 */
 
 #include "luat_base.h"

+ 29 - 19
demo/json/main.lua

@@ -5,28 +5,38 @@ VERSION = "1.0.0"
 -- 引入必要的库文件(lua编写), 内部库不需要require
 sys = require("sys")
 
-log.info("main", "json demo")
-print(json.null)
+log.info("main", PROJECT, VERSION)
 
-local t = {
-    a = 1,
-    b = "abc",
-    c = {
-        1,2,3,4
-    },
-    d = {
-        x = false,
-        j = 111111
-    },
-    aaaa = 6666,
-}
+-- json库支持将 table 转为 字符串, 或者反过来, 字符串 转 table
+-- 若转换失败, 会返回nil值, 强烈建议在使用时添加额外的判断
+sys.taskInit(function()
+    while 1 do
+        sys.wait(1000)
+        -- table 转为 字符串
+        local t = {abc=123, def="123", ttt=true}
+        local jdata = json.encode(t)
+        log.info("json", jdata)
 
-local s = json.encode(t)
+        -- 字符串转table
+        local str = "{\"abc\":1234545}" -- 字符串可以来源于任何地方,网络,文本,用户输入,都可以
+        local t = json.decode(str)
+        if t then -- 若解码失败, 会返回nil
+            log.info("json", "decode", t.abc)
+        end
 
-local st = json.decode(s)
-
-print(s)
-print(st.a,st.b,st.d.x)
+        -- lua中的table是 数组和hashmap的混合体
+        -- 这对json来说会有一些困扰, 尤其是空的table
+        local t = {abc={}}
+        -- 假设从业务上需要输出 {"abc":[]}
+        -- 实际会输出 {"abc": {}} , 空table是优先输出 hashmap 形式, 而非数组形式
+        log.info("json", "encode", json.encode(t))
+        -- 混合场景, json场景应避免使用
+        t.abc.def = "123"
+        t.abc[1] = 345
+        -- 输出的内容是 {"abc":{"1":345,"def":"123"}}
+        log.info("json", "encode2", json.encode(t))
+    end
+end)
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 14 - 9
demo/libgnss_rtc/main.lua

@@ -6,18 +6,23 @@ VERSION = "1.0.0"
 -- sys库是标配
 _G.sys = require("sys")
 
---[[ demo适用于air530z ]]
+--[[ 
+demo适用于air530z, 演示挂载在uart 2的情况, 如果挂载在其他端口, 修改gps_uart_id
+]]
 
-uart.on(2, "recv", function(id, len)
-    local data = uart.read(2, 1024)
-    --log.info("uart2", data)
-    libgnss.parse(data)
+local gps_uart_id = 2
+
+uart.on(gps_uart_id, "recv", function(id, len)
+    local data = uart.read(gps_uart_id, 1024)
+     if data then
+        libgnss.parse(data)
+    end
 end)
 
-uart.setup(2, 9600)
-libgnss.air530z_setup(2)
-libgnss.air530z_setbandrate(115200)
-uart.setup(2, 115200)
+-- Air530Z默认波特率是9600, 主动切换一次
+uart.setup(gps_uart_id, 9600)
+uart.write(gps_uart_id, "$PCAS01,5*19\r\n")
+uart.setup(gps_uart_id, 115200)
 
 sys.timerLoopStart(function()
     log.info("GPS", libgnss.getIntLocation())

+ 0 - 69
demo/main.lua

@@ -1,69 +0,0 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "ws2812demo"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- 引入必要的库文件(lua编写), 内部库不需要require
-sys = require("sys")
-
-if wdt then
-    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
-    wdt.init(9000)--初始化watchdog设置为9s
-    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-end
-
-local show_520 = {
-    {0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x0000ff,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x00ff00,0x0000ff,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x0000ff,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x00ff00,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-    {0x0000ff,0x0000ff,0x0000ff,0x00ff00,0x00ff00,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff,0x0000ff},
-}
-local show_520_w = 24
-local show_520_h = 8
-
-local ws2812_w = 8
-local ws2812_h = 8
-local buff = zbuff.create({ws2812_w,ws2812_h,24},0x000000)
-
-local function ws2812_roll_show(show_data,data_w)
-    local m = 0
-    while 1 do
-        for j=0,ws2812_w-1 do
-            if j%2==0 then
-                for i=ws2812_w-1,0,-1 do
-                    if m+ws2812_w-i>data_w then
-                        buff:pixel(i,j,show_data[j+1][m+ws2812_w-i-data_w])
-                    else
-                        buff:pixel(i,j,show_data[j+1][m+ws2812_w-i])
-                    end
-                end
-            else
-                for i=0,ws2812_w-1 do
-                    if m+i+1>data_w then
-                        buff:pixel(i,j,show_data[j+1][m+i+1-data_w])
-                    else
-                        buff:pixel(i,j,show_data[j+1][m+i+1])
-                    end
-                end
-            end
-        end
-        m = m+1
-        if m==data_w then m=0 end
-        sensor.ws2812b_pwm(5,buff)--此处使用pwm方法驱动,当然也可以用gpio,spi方式,API详情查看wiki https://wiki.luatos.com/api/sensor.html
-        -- sensor.ws2812b_spi(0,buff)
-        sys.wait(300)
-    end
-end
-sys.taskInit(function()
-    sys.wait(500)
-    ws2812_roll_show(show_520,show_520_w)
-end)
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 9
demo/nvm/config.lua

@@ -1,9 +0,0 @@
---存储默认数据
---必须return一个table
-return {
-
-a=1,
-b=2
-
-
-}

+ 0 - 34
demo/nvm/main.lua

@@ -1,34 +0,0 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "nvm_test"
-VERSION = "1.0.0"
-
---[[
-这个demo不推荐使用, 建议使用fdb库
-]]
-
--- 引入必要的库文件(lua编写), 内部库不需要require
-sys = require("sys")
-
-require "config"--默认数据文件
---引用nvm库
-local nvm = require "nvm"
-
---先加载初始化数据
-nvm.init("config.lua")
-
---检查一下现在的数据
-log.info("nvm","get a",nvm.get("a"))
-log.info("nvm","get b",nvm.get("b"))
-
---改一下看看,下次开机就会是这个值
-nvm.set('a',nvm.get("a") + 1)
-nvm.set('b',nvm.get("b") + 1)
-
---看看改之后的数据
-log.info("nvm","get a",nvm.get("a"))
-log.info("nvm","get b",nvm.get("b"))
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 0 - 295
demo/nvm/nvm.lua

@@ -1,295 +0,0 @@
---- 模块功能:参数管理
--- @module nvm
--- @author openLuat
--- @license MIT
--- @copyright openLuat
--- @release 2017.11.9
-
-local nvm = {}
---实时参数配置存储在paraname文件中
---默认参数配置存储在configname文件中
---para:实时参数表
---config:默认参数表
-paraname, paranamebak = "/nvm_para.lua", "/nvm_para_bak.lua"
-local para, libdftconfig, configname = {}
-
---[[
-函数名:serialize
-功能  :根据不同的数据类型,按照不同的格式,写格式化后的数据到文件中
-参数  :
-pout:文件句柄
-o:数据
-返回值:无
-]]
-local function serialize(pout, o)
-    if type(o) == "number" then
-        --number类型,直接写原始数据
-        pout:write(o)
-    elseif type(o) == "string" then
-        --string类型,原始数据左右各加上双引号写入
-        pout:write(string.format("%q", o))
-    elseif type(o) == "boolean" then
-        --boolean类型,转化为string写入
-        pout:write(tostring(o))
-    elseif type(o) == "table" then
-        --table类型,加换行,大括号,中括号,双引号写入
-        pout:write("{\n")
-        for k, v in pairs(o) do
-            pout:write(" [")
-            serialize(pout, k)
-            pout:write("] = ")
-            serialize(pout, v)
-            pout:write(",\n")
-        end
-        pout:write("}\n")
-    else
-        error("cannot serialize a " .. type(o))
-    end
-end
-
---[[
-函数名:upd
-功能  :更新实时参数表
-参数  :
-overide:是否用默认参数强制更新实时参数
-返回值:无
-]]
-function nvm.upd(overide)
-    for k, v in pairs(libdftconfig) do
-        if k ~= "_M" and k ~= "_NAME" and k ~= "_PACKAGE" then
-            if overide or para[k] == nil then
-                para[k] = v
-            end
-        end
-    end
-end
-
-local function safePcall(file)
-    return pcall(require, file)
-end
-
---[[
-函数名:load
-功能  :初始化参数
-参数  :无
-返回值:无
-]]
-local function load()
-    local f, fBak, fExist, fBakExist
-    f = io.open(paraname, "rb")
-    fBak = io.open(paranamebak, "rb")
-
-    if f then
-        fExist = f:read("*a") ~= ""
-        f:close()
-    end
-    if fBak then
-        fBakExist = fBak:read("*a") ~= ""
-        fBak:close()
-    end
-
-    print("load fExist fBakExist", fExist, fBakExist)
-
-    local fResult, fBakResult
-    if fExist then
-        fResult, para = safePcall(paraname:match("/(.+)%.lua"))
-    end
-
-    print("load fResult", fResult)
-
-    if fResult then
-        os.remove(paranamebak)
-        nvm.upd()
-        return
-    end
-
-    if fBakExist then
-        fBakResult, para = safePcall(paranamebak:match("/(.+)%.lua"))
-    end
-
-    print("load fBakResult", fBakResult)
-
-    if fBakResult then
-        os.remove(paraname)
-        nvm.upd()
-        return
-    else
-        para = {}
-        nvm.restore()
-    end
-end
-
---[[
-函数名:save
-功能  :保存参数文件
-参数  :
-s:是否真正保存,true保存,false或者nil不保存
-返回值:无
-]]
-local function save(s)
-    if not s then return end
-    local f = {}
-    f.write = function(self, s)table.insert(self, s) end
-
-    f:write("return {\n")
-
-    for k, v in pairs(para) do
-        if k ~= "_M" and k ~= "_NAME" and k ~= "_PACKAGE" then
-            f:write(string.format("[%q] = ", k))
-            serialize(f, v)
-            f:write(",\n")
-        end
-    end
-
-    f:write("}\n")
-
-    local fparabak = io.open(paranamebak, 'wb')
-    fparabak:write(table.concat(f))
-    fparabak:close()
-
-    os.remove(paraname)
-    os.rename(paranamebak, paraname)
-end
-
---- 初始化参数存储管理模块
--- @string defaultCfgFile 默认参数文件名
--- @return nil
--- @usage
--- 初始化参数存储管理模块,默认参数文件名为config.lua,本地烧录时清除已有的参数:
--- nvm.init("config.lua")
-function nvm.init(defaultCfgFile)
-    local f
-    local fname = defaultCfgFile:match("(.+)%.lua")
-    f, libdftconfig = safePcall(fname)
-    local LUAT_MODULE_SEARCH_PATH = {"/%s.luac", "/%s.lua", "/lua/%s.luac", "/lua/%s.lua","/luadb/%s.luac", "/luadb/%s.lua"}
-    for _,j in pairs(LUAT_MODULE_SEARCH_PATH) do
-        local tf = io.open(string.format(j,fname), "rb")
-        if tf then
-            tf:close()
-            configname = string.format(j,fname)
-            break
-        end
-    end
-
-    --初始化配置文件,从文件中把参数读取到内存中
-    load()
-end
-
---- 设置某个参数的值
--- @string k 参数名
--- @param v,可以是任意类型,参数的新值
--- @param r,设置原因,如果传入了非nil的有效参数,并且v值和旧值相比发生了改变,
---                     会产生一个PARA_CHANGED_IND内部消息,携带 k,v,r 3个参数
--- @param s,是否立即写入到文件系统中,false不写入,其余的都写入
--- @return bool或者nil,成功返回true,失败返回nil
--- @usage
--- 参数name赋值为Luat,立即写入文件系统:
--- nvm.set("name","Luat")
---
--- 参数age赋值为12,立即写入文件系统:
--- 如果旧值不是12,会产生一个PARA_CHANGED_IND消息,携带 "age",12,"SVR" 3个参数:
--- nvm.set("age",12,"SVR")
---
--- 参数class赋值为Class2,不写入文件系统:
--- nvm.set("class","Class2",nil,false)
---
--- 参数score赋值为{chinese=100,math=99,english=98},立即写入文件系统:
--- nvm.set("score",{chinese=100,math=99,english=98})
---
--- 连续写入4个参数,前3个不保存到文件系统中,写第4个时,一次性全部保存到文件系统中:
--- nvm.set("para1",1,nil,false)
--- nvm.set("para2",2,nil,false)
--- nvm.set("para3",3,nil,false)
--- nvm.set("para4",4)
-function nvm.set(k, v, r, s)
-    local bchg = true
-    if type(v) ~= "table" then
-        bchg = (para[k] ~= v)
-    end
-    log.info("nvm.set", bchg, k, v, r, s)
-    if bchg then
-        para[k] = v
-        save(s or s == nil)
-        if r then sys.publish("PARA_CHANGED_IND", k, v, r) end
-    end
-    return true
-end
-
---- 设置某个table类型参数的某一个索引的值
--- @string k table类型的参数名
--- @param kk table类型参数的某一个索引名
--- @param v,table类型参数的某一个索引的新值
--- @param r,设置原因,如果传入了非nil的有效参数,并且v值和旧值相比发生了改变,会产生一个TPARA_CHANGED_IND消息,携带 k,kk,v,r 4个参数
--- @param s,是否立即写入到文件系统中,false不写入,其余的都写入
--- @return bool或者nil,成功返回true,失败返回nil
--- @usage nvm.sett("score","chinese",100),参数score["chinese"]赋值为100,立即写入文件系统
--- @usage nvm.sett("score","chinese",100,"SVR"),参数score["chinese"]赋值为100,立即写入文件系统,
--- 如果旧值不是100,会产生一个TPARA_CHANGED_IND消息,携带 "score","chinese",100,"SVR" 4个参数
--- @usage nvm.sett("score","chinese",100,nil,false),参数class赋值为Class2,不写入文件系统
-function nvm.sett(k, kk, v, r, s)
-    local bchg = true
-    if type(v) ~= "table" then
-        bchg = (para[k][kk] ~= v)
-    end
-    if bchg then
-        para[k][kk] = v
-        save(s or s == nil)
-        if r then sys.publish("TPARA_CHANGED_IND", k, kk, v, r) end
-    end
-    return true
-end
-
---- 所有参数立即写入文件系统
--- @return nil
--- @usage nvm.flush()
-function nvm.flush()
-    save(true)
-end
-
---- 读取某个参数的值
--- @string k 参数名
--- @return 参数值
--- @usage
--- 读取参数名为name的参数值:
--- nameValue = nvm.get("name")
-function nvm.get(k)
-    return para[k]
-end
-
---- 读取某个table类型参数的键名对应的值
--- @string k table类型的参数名
--- @param kk table类型参数的键名
--- @usage
--- 有一个table参数为score,数据如下:
--- score = {chinese=100, math=100, english=95}
--- 读取score中chinese对应的值:
--- nvm.gett("score","chinese")
-function nvm.gett(k, kk)
-    return para[k][kk]
-end
-
---- 参数恢复出厂设置
--- @return nil
--- @usage nvm.restore()
-function nvm.restore()
-    os.remove(paraname)
-    os.remove(paranamebak)
-    local fpara, fconfig = io.open(paraname, "wb"), io.open(configname, "rb")
-    fpara:write(fconfig:read("*a"))
-    fpara:close()
-    fconfig:close()
-    nvm.upd(true)
-end
-
---- 请求删除参数文件.
--- 此接口一般用在远程升级时,需要用新的config.lua覆盖原来的参数文件的场景,在此场景下,远程升级包下载成功后,在确定要重启前调用此接口
--- 下次开机执行nvm.init("config.lua")时,会用新的config.lua文件自动覆盖参数文件;以后再开机就不会自动覆盖了
--- 也就是说"nvm.remove()->重启->nvm.init("config.lua")"是一个仅执行一次的完整操作
--- @return nil
--- @usage nvm.remove()
-function nvm.remove()
-    os.remove(paraname)
-    os.remove(paranamebak)
-end
-
-return nvm

+ 0 - 40
demo/pwm/Air101/main.lua

@@ -1,40 +0,0 @@
-
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "mypwm"
-VERSION = "1.0.0"
-
-log.info("main", PROJECT, VERSION)
-
--- sys库是标配
-_G.sys = require("sys")
-
---添加硬狗防止程序卡死
-wdt.init(9000)--初始化watchdog设置为9s
-sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
-
--- PWM4 --> PA7-7
--- PWM3 --> PB3-19
--- PWM2 --> PB2-18
--- PWM1 --> PB1-17
--- PWM0 --> PB0-16
-
-sys.taskInit(function()
-    while 1 do
-        -- 仿呼吸灯效果
-        log.info("pwm", ">>>>>")
-        for i = 10,1,-1 do 
-            pwm.open(1, 1000, i*9) -- 频率1000hz, 占空比0-100
-            sys.wait(200 + i*10)
-        end
-        for i = 10,1,-1 do 
-            pwm.open(1, 1000, 100 - i*9)
-            sys.wait(200 + i*10)
-        end
-        sys.wait(5000)
-    end
-end)
-
--- 用户代码已结束---------------------------------------------
--- 结尾总是这一句
-sys.run()
--- sys.run()之后后面不要加任何语句!!!!!

+ 51 - 0
demo/pwm/main.lua

@@ -0,0 +1,51 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "pwmdemo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- sys库是标配
+_G.sys = require("sys")
+
+--添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+local PWM_ID = 0
+if rtos.bsp() == "EC618" then
+    PWM_ID = 1 -- GPIO 24, MAIN_RI
+elseif rtos.bsp() == "AIR101" or rtos.bsp() == "AIR103" then
+    PWM_ID = 4 -- GPIO 4
+elseif rtos.bsp():startsWith("ESP32") then
+    -- 注意, ESP32系列的PWM, PWM通道均与GPIO号相同
+    -- 例如需要用GPIO1输出PWM, 对应的PWM通道就是1
+    -- 需要用GPIO16输出PWM, 对应的PWM通道就是16
+    PWM_ID = 1 -- GPIO 1
+elseif rtos.bsp() == "AIR105" then
+    PWM_ID = 1 -- GPIO 17
+end
+
+sys.taskInit(function()
+    log.info("pwm", "ch", PWM_ID)
+    while 1 do
+        -- 仿呼吸灯效果
+        log.info("pwm", ">>>>>")
+        for i = 10,1,-1 do 
+            pwm.open(PWM_ID, 1000, i*9) -- 频率1000hz, 占空比0-100
+            sys.wait(200 + i*10)
+        end
+        for i = 10,1,-1 do 
+            pwm.open(PWM_ID, 1000, 100 - i*9)
+            sys.wait(200 + i*10)
+        end
+        sys.wait(5000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 41 - 0
demo/wlan/Air780E/main.lua

@@ -0,0 +1,41 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "wifidemo"
+VERSION = "1.0.0"
+
+--[[
+注意: 
+Air780E/Air600E/Air780EG等基于EC618的模块
+
+只支持wifi scan!!
+只支持wifi scan!!
+只支持wifi scan!!
+
+不支持wifi通信, 不支持wifi通信, 不支持wifi通信
+]]
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+require("sysplus")
+
+-- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
+sys.subscribe("WLAN_SCAN_DONE", function ()
+    local results = wlan.scanResult()
+    log.info("scan", "results", #results)
+    for k,v in pairs(results) do
+        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
+    end
+end)
+
+sys.taskInit(function()
+    sys.wait(1000)
+    wlan.init()
+    while 1 do
+        wlan.scan()
+        sys.wait(15000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 2 - 2
luat/modules/luat_lib_rtos.c

@@ -238,8 +238,8 @@ static int l_rtos_standy(lua_State *L) {
 @api    rtos.meminfo(type)
 @type   "sys"系统内存, "lua"虚拟机内存, 默认为lua虚拟机内存
 @return int 总内存大小,单位字节
-@return int 当前使用的内存大小,单位字节
-@return int 最大使用的内存大小,单位字节
+@return int 当前使用的内存大小,单位字节
+@return int 历史最高已使用的内存大小,单位字节
 @usage
 -- 打印内存占用
 log.info("mem.lua", rtos.meminfo())

+ 11 - 6
luat/modules/luat_lib_sensor.c

@@ -475,7 +475,7 @@ static int l_sensor_ws2812b(lua_State *L)
 #ifdef LUAT_USE_PWM
 
 #include "luat_pwm.h"
-luat_pwm_conf_t ws2812b_pwm_conf = {
+static luat_pwm_conf_t ws2812b_pwm_conf = {
   .pnum = 1,
   .period = 800*1000,
   .precision = 100
@@ -492,7 +492,8 @@ sensor.ws2812b_pwm(7,buff)
 */
 static int l_sensor_ws2812b_pwm(lua_State *L)
 {
-  int j;
+  int ret = 0;
+  int j = 0;
   size_t len,i;
   const char *send_buff = NULL;
 
@@ -512,10 +513,14 @@ static int l_sensor_ws2812b_pwm(lua_State *L)
     for(j=7;j>=0;j--){
       if(send_buff[i]>>j&0x01){
         ws2812b_pwm_conf.pulse = 200/3;
-        luat_pwm_setup(&ws2812b_pwm_conf);
+        ret = luat_pwm_setup(&ws2812b_pwm_conf);
       }else{
         ws2812b_pwm_conf.pulse = 100/3;
-        luat_pwm_setup(&ws2812b_pwm_conf);
+        ret = luat_pwm_setup(&ws2812b_pwm_conf);
+      }
+      if (ret) {
+        LLOGW("luat_pwm_setup ret %d, end of PWM output", ret);
+        return 0;
       }
     }
   }
@@ -526,7 +531,7 @@ static int l_sensor_ws2812b_pwm(lua_State *L)
 
 #ifdef LUAT_USE_SPI
 #include "luat_spi.h"
-luat_spi_t ws2812b_spi_conf = {
+static luat_spi_t ws2812b_spi_conf = {
   .cs = 255,
   .CPHA = 0,
   .CPOL = 0,
@@ -544,7 +549,7 @@ luat_spi_t ws2812b_spi_conf = {
 @usage
 local buff = zbuff.create({8,8,24})
 buff:setFrameBuffer(8,8,24,0x0000ff)
-sensor.ws2812b_spi(7,buff)
+sensor.ws2812b_spi(2,buff)
 */
 static int l_sensor_ws2812b_spi(lua_State *L)
 {