Эх сурвалжийг харах

add:新增8101-fskv-demo

马亚丹 3 сар өмнө
parent
commit
cfa0c0c014

+ 149 - 0
module/Air8101/demo/fskv/fskv_test.lua

@@ -0,0 +1,149 @@
+--[[
+@module  fskv_test
+@summary fskv_test测试功能模块
+@version 1.0
+@date    2025.11.14
+@author  马亚丹
+@usage
+本demo演示的功能为:使用Air8101核心板演示fskv核心库API的用法,演示设置kv数据、设置 table 内的键值对数据,用kv迭代器遍历kv数据,删除kv数据等操作。
+
+运行核心逻辑:
+1.初始化fskv
+2.获取 kv 数据库状态
+3.设置不同类型的kv数据
+4.设置 table 内的键值对数据
+5.根据 key 获取对应的数据
+6.使用kv迭代器遍历kv数据
+7.删除kv数据,清空KV数据
+
+]]
+--1.定义功能函数:置kv 数据
+local function setKV()
+    --如下所示设置用户数据是字符串
+    local r1 = fskv.set("my_str", "goodgoodstudy")
+    log.info("fskv设置用户数据是字符串", r1)
+    --如下所示设置用户数据是布尔值
+    local r2 = fskv.set("my_bool", true)
+    log.info("fskv设置用户数据是布尔值", r2)
+    --如下所示设置用户数据是数值
+    local r3 = fskv.set("my_number", 1.23)
+    log.info("fskv设置用户数据是数值", r3)
+    --如下所示设置用户数据是整数
+    local r4 = fskv.set("my_int", 5)
+    log.info("fskv设置用户数据是整数", r4)
+    --如下所示设置用户数据是table
+    local r5 = fskv.set("my_table", { name = "wendal", age = 18 })
+    log.info("fskv用户数据是table类型", r5)
+
+   return true
+end
+
+
+--2.定义功能函数:设置 table 内的键值对数据
+local function setttable()
+    --如下所示设置用户数据是字符串
+    local r1=fskv.sett("mytable", "wendal", "goodgoodstudy")
+    log.info("mytable设置用户数据是字符串", r1)
+    --如下所示设置用户数据是布尔值
+    local r2=fskv.sett("mytable", "upgrade", true)
+    log.info("mytable设置用户数据是布尔值", r2)
+    --如下所示设置用户数据是数值
+    local r3=fskv.sett("mytable", "timer", 1)
+    log.info("mytable设置用户数据是数值", r3)
+    --如下所示设置用户数据是table
+    local r4=fskv.sett("mytable", "bigd", { name = "wendal", age = 123 })
+    log.info("mytable设置用户数据是table", r4)
+    return true
+end
+
+--3.定义功能函数:获取kv数据
+local function getKV()
+    local my_str = fskv.get("my_str")
+    log.info("获取my_str的类型和值", type(my_str), my_str)
+    local my_bool = fskv.get("my_bool")
+    log.info("获取upgrade的类型和值", type(my_bool), my_bool)
+    local my_number = fskv.get("my_number")
+    log.info("获取my_number的类型和值", type(my_number), my_number)
+    local my_int = fskv.get("my_int")
+    log.info("获取my_int的类型和值", type(my_int), my_int)
+    local my_table = fskv.get("my_table")
+    log.info("获取my_table的类型和值", my_table,json.encode(my_table))
+
+    local mytable = fskv.get("mytable")
+    log.info("获取mytable的类型和值", mytable, json.encode(mytable))
+    return true
+end
+
+--4.定义功能函数:kv数据库迭代器遍历KV数据
+local function iterKV()
+    local iter = fskv.iter()
+    log.info("kv数据库迭代器", iter)
+    if iter then
+        while 1 do
+            local k = fskv.next(iter)
+            log.info("kv迭代器获取下一个key", k)
+            if not k then
+                log.info("kv数据库遍历完成")
+                break
+            end
+            log.info("fskv", k, "value", fskv.get(k))
+        end
+    end
+    return true
+end
+--====功能演示主函数====
+local function fskv_test()
+    -- 初始化kv数据库
+    local r = fskv.init()
+    log.info("fskv", "init complete", r)
+
+    --获取 kv 数据库状态
+    local used, total, kv_count = fskv.status()
+    log.info("获取kv数据库状态", "fskv", "kv", used, total, kv_count)
+
+
+    --=======设置kv 数据=======
+    if not setKV() then
+        log.info("设置kv数据失败")
+    end
+
+    --=======设置 table 内的键值对数据=======
+    if not setttable() then
+        log.info("设置 table 内的键值对数据失败")
+    end
+
+    --======根据 key 获取对应的数据====
+    if not getKV() then
+        log.info("获取kv数据失败")
+    end
+    --======使用kv数据库迭代器遍历KV数据====
+    if not iterKV() then
+        log.info("遍历kv数据失败")
+    end
+
+    
+
+    -- 删除测试
+    local d = fskv.del("my_bool")
+    log.info("fskv", "my_bool删除结果", d)
+    local t = fskv.get("my_bool")
+    log.info("fskv", "删除后查询my_bool", type(t), t)
+
+
+    -- 如果设置table的value为nil, 代表删除对应的skey
+    -- 如下写法是删除name
+    log.info("设置新的table,key是mytable2", fskv.set("mytable2", { age = 18, name = "wendal" }))
+    log.info("mytable2的值", fskv.get("mytable2"),json.encode(fskv.get("mytable2")))
+    log.info("mytable2删除name测试", fskv.sett("mytable2", "name", nil))
+    log.info("mytable2删除结果", fskv.get("mytable2"), json.encode(fskv.get("mytable2")))
+
+
+    --清空整个kv数据库
+    log.info("清空整个kv数据库", fskv.clear())
+
+
+    local used, total, kv_count = fskv.status()
+    log.info("获取kv数据库状态", "fskv", "kv", used, total, kv_count)
+end
+
+sys.taskInit(fskv_test)

+ 72 - 97
module/Air8101/demo/fskv/main.lua

@@ -1,101 +1,76 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "fskvdemo"
-VERSION = "1.0.0"
-
-sys.taskInit(function()
-    sys.wait(1000) -- 免得日志刷没了, 生产环境不需要
-
-    -- 检查一下当前固件是否支持fskv
-    if not fskv then
-        while true do
-            log.info("fskv", "this demo need fskv")
-            sys.wait(1000)
-        end
-    end
-
-    -- 初始化kv数据库
-    fskv.init()
-    log.info("fskv", "init complete")
-    -- 先放入一堆值
-    local bootime = fskv.get("boottime") -- 获取键值 boottime
-    if bootime == nil or type(bootime) ~= "number" then
-        bootime = 0  -- 如果键值 boottime 为 nil 或不是数字,则将其设为 0
-    else
-        bootime = bootime + 1 -- 如果键值 boottime 是有效的数字,则将其值增加 1
-    end
-    fskv.set("boottime", bootime)                 -- 向键值为 boottime 的空间中存入数值,每次重启该值加 1
-    fskv.set("my_bool", true)                     -- 向键值为 my_bool 的空间中存入布尔值 true
-    fskv.set("my_int", 123)                       -- 向键值为 my_int 的空间中存入整型数 123
-    fskv.set("my_number", 1.23)                   -- 向键值为 my_number 的空间中存入浮点数 1.23
-    fskv.set("my_str", "luatos")                  -- 向键值为 my_str 的空间中存入字符串 "luatos"
-    fskv.set("my_table", {name="wendal",age=18})  -- 向键值为 my_table 的空间中存入数组,数组中包含 name 和 age 两个键值对,值分别为 "wendal" 和 18
-    fskv.set("my_str_int", "123")                 -- 向键值为 my_str_int 的空间中存入字符串 "123"
-    fskv.set("1", "123")                          -- 单字节key
-    --fskv.set("my_nil", nil) -- 会提示失败,不支持空值
-
-    --        fskv     键值名            键值存储的类型                  键值存储的值
-    log.info("fskv", "boottime",     type(fskv.get("boottime")),     fskv.get("boottime"))
-    log.info("fskv", "my_bool",      type(fskv.get("my_bool")),      fskv.get("my_bool"))
-    log.info("fskv", "my_int",       type(fskv.get("my_int")),       fskv.get("my_int"))
-    log.info("fskv", "my_number",    type(fskv.get("my_number")),    fskv.get("my_number"))
-    log.info("fskv", "my_str",       type(fskv.get("my_str")),       fskv.get("my_str"))
-    log.info("fskv", "my_table",     type(fskv.get("my_table")),     json.encode(fskv.get("my_table")))
-    log.info("fskv", "my_str_int",   type(fskv.get("my_str_int")),   fskv.get("my_str_int"))
-    log.info("fskv", "1 byte key",   type(fskv.get("1")),            json.encode(fskv.get("1")))
-
-    -- 删除测试
-    fskv.del("my_bool")
-    local t = fskv.get("my_bool")
-    log.info("fskv", "my_bool",      type(t),    t)
-
-    -- 查询kv数据库状态
-    -- local used, total,kv_count = fskv.stat()
-    -- log.info("fdb", "kv", used,total,kv_count)
-
-    -- fskv.clr()
-    -- local used, total,kv_count = fskv.stat()
-    -- log.info("fdb", "kv", used,total,kv_count)
-
-
-    -- 压力测试
-    -- local start = mcu.ticks()
-    -- local count = 1000
-    -- for i=1,count do
-    --     -- sys.wait(10)
-    --     -- count = count - 1
-    --     -- fskv.set("BENT1", "--" .. os.date() .. "--")
-    --     -- fskv.set("BENT2", "--" .. os.date() .. "--")
-    --     -- fskv.set("BENT3", "--" .. os.date() .. "--")
-    --     -- fskv.set("BENT4", "--" .. os.date() .. "--")
-    --     fskv.get("my_bool")
-    -- end
-    -- log.info("fskv", mcu.ticks() - start)
-
-    if fskv.sett then -- 查看是否提供了 fskv 模块是否提供了 sett 方法,如果提供继续执行
-        -- 设置数据, 字符串,数值,table,布尔值,均可
-        -- 但不可以是nil, function, userdata, task
-        log.info("fskv", fskv.sett("mytable", "wendal", "goodgoodstudy"))
-        log.info("fskv", fskv.sett("mytable", "upgrade", true))
-        log.info("fskv", fskv.sett("mytable", "timer", 1))
-        log.info("fskv", fskv.sett("mytable", "bigd", {name="wendal",age=123}))
-
-        -- 下列语句将打印出4个元素的table
-        log.info("fskv", fskv.get("mytable"), json.encode(fskv.get("mytable")))
-        -- 注意: 如果key不存在, 或者原本的值不是table类型,将会完全覆盖
-        -- 例如下列写法,最终获取到的是table,而非第一行的字符串
-        log.info("fskv", fskv.set("mykv", "123")) -- 键值此时存入值为 string 类型数据 "123"
-        log.info("fskv", "mykv",       type(fskv.get("mykv")),       fskv.get("mykv"))
-        log.info("fskv", fskv.sett("mykv", "age", "123")) -- 因为 mykv 不是一个 table,所以 mykv 会被覆盖上一行代码,再将其值保存为 {"age":"123"}
-        log.info("fskv", fskv.get("mykv"), json.encode(fskv.get("mykv")))
-
-        -- 删除测试
-        log.info("fskv", fskv.set("mytable", {age=20, name="wendal"}))          -- 这个会把原来的 mytable 中值进行覆盖
-        log.info("fskv", fskv.sett("mytable", "name", nil))                     -- 删除 name 参数
-        log.info("fskv", fskv.get("mytable"), json.encode(fskv.get("mytable"))) -- 最终只会打印出 {"age"=20}
-    end
-end)
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑 
+@version 001.000.000
+@date    2025.9.05
+@author  马亚丹
+@usage
+本demo演示的功能为:使用Air8101核心板演示fskv核心库API 的用法,
+详细逻辑请看fskv_test.lua文件
+
+
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "Air8101_fskv"
+VERSION = "001.000.000"
+
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    --配置喂狗超时时间为9秒钟
+    wdt.init(9000)
+    --启动一个循环定时器,每隔3秒钟喂一次狗
+    sys.timerLoopStart(wdt.feed, 3000)
+end
+
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+
+
+-- 加载fskv_test功能模块
+require "fskv_test"
+
+
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()
--- sys.run()之后后面不要加任何语句!!!!!
+-- sys.run()之后不要加任何语句!!!!!因为添加的任何语句都不会被执行

+ 106 - 0
module/Air8101/demo/fskv/readme.md

@@ -0,0 +1,106 @@
+## 功能模块介绍:
+
+1. main.lua:主程序入口
+
+2. fskv_test.lua:演示fskv核心库API的用法,详细逻辑请看fskv_test.lua 文件
+
+## 演示功能概述:
+
+### fskv_test.lua:
+
+1.初始化fskv
+
+2.获取 kv 数据库状态
+
+3.设置不同类型的kv数据
+
+4.设置 table 内的键值对数据
+
+5.根据 key 获取对应的数据
+
+6.使用kv迭代器遍历kv数据
+
+7.删除kv数据,清空KV数据
+
+## 演示硬件环境:
+
+![](https://docs.openluat.com/accessory/AirSPINORFLASH_1000/image/8101.jpg)
+
+
+
+1、Air8101核心板一块
+
+2、TYPE-C USB数据线一根
+
+3、Air8101核心板和数据线的硬件接线方式为
+
+* Air8101核心板通过TYPE-C USB口供电;(核心板背面的功耗测试开关拨到OFF一端)
+
+* 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者VIN管脚进行5V供电;
+
+* TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境:
+
+1. Luatools 下载调试工具
+
+2. 固件版本:LuatOS-SoC_V1006_Air8101_1.soc,固件地址,如有最新固件请用最新 [https://docs.openluat.com/air8101/luatos/firmware/](https://docs.openluat.com/air8101/luatos/firmware/)
+
+3. pc 系统 win11(win10 及以上)
+
+## 演示核心步骤:
+
+1. 搭建好硬件环境
+
+2. Luatools 烧录内核固件和 脚本文件
+
+3. 烧录成功后,代码会自动运行,查看打印日志,如果正常运行,会打印相关信息,设置kv数据、设置 table 内的键值对数据,用kv迭代器遍历kv数据,删除kv数据等。
+
+4. 如下 log 显示:
+
+```bash
+[2025-11-21 17:01:23.675] luat:U(247):I/user.main Air8101_fskv 001.000.000
+[2025-11-21 17:01:23.691] luat:I(251):lfs:sfd_lfs mount ret -84, exec auto-format
+[2025-11-21 17:01:23.753] luat:D(320):lfs:init ok
+[2025-11-21 17:01:23.759] luat:U(320):I/user.fskv init complete true
+[2025-11-21 17:01:23.759] luat:U(321):I/user.获取kv数据库状态 fskv kv 8192 65536 0
+[2025-11-21 17:01:23.759] luat:U(325):I/user.fskv设置用户数据是字符串 true
+[2025-11-21 17:01:23.759] luat:U(330):I/user.fskv设置用户数据是布尔值 true
+[2025-11-21 17:01:23.759] luat:U(334):I/user.fskv设置用户数据是数值 true
+[2025-11-21 17:01:23.759] luat:U(338):I/user.fskv设置用户数据是整数 true
+[2025-11-21 17:01:23.772] luat:U(343):I/user.fskv用户数据是table类型 true
+[2025-11-21 17:01:23.772] luat:U(349):I/user.mytable设置用户数据是字符串 true
+[2025-11-21 17:01:23.777] luat:U(353):I/user.mytable设置用户数据是布尔值 true
+[2025-11-21 17:01:23.780] luat:U(357):I/user.mytable设置用户数据是数值 true
+[2025-11-21 17:01:23.800] luat:U(362):I/user.mytable设置用户数据是table true
+[2025-11-21 17:01:23.800] luat:U(364):I/user.获取my_str的类型和值 string goodgoodstudy
+[2025-11-21 17:01:23.800] luat:U(366):I/user.获取upgrade的类型和值 boolean true
+[2025-11-21 17:01:23.800] luat:U(368):I/user.获取my_number的类型和值 number   1.23000
+[2025-11-21 17:01:23.800] luat:U(370):I/user.获取my_int的类型和值 number 5
+[2025-11-21 17:01:23.800] luat:U(372):I/user.获取my_table的类型和值 table: 60C7E3D0 {"name":"wendal","age":18}
+[2025-11-21 17:01:23.800] luat:U(373):I/user.获取mytable的类型和值 table: 60C7E258 {"bigd":{"name":"wendal","age":123},"wendal":"goodgoodstudy","timer":1,"upgrade":true}
+[2025-11-21 17:01:23.800] luat:U(374):I/user.kv数据库迭代器 userdata: 60C7E070
+[2025-11-21 17:01:23.820] luat:U(377):I/user.kv迭代器获取下一个key my_bool
+[2025-11-21 17:01:23.820] luat:U(379):I/user.fskv my_bool value true
+[2025-11-21 17:01:23.820] luat:U(382):I/user.kv迭代器获取下一个key my_int
+[2025-11-21 17:01:23.820] luat:U(383):I/user.fskv my_int value 5
+[2025-11-21 17:01:23.820] luat:U(386):I/user.kv迭代器获取下一个key my_number
+[2025-11-21 17:01:23.820] luat:U(388):I/user.fskv my_number value   1.23000
+[2025-11-21 17:01:23.820] luat:U(390):I/user.kv迭代器获取下一个key my_str
+[2025-11-21 17:01:23.820] luat:U(393):I/user.fskv my_str value goodgoodstudy
+[2025-11-21 17:01:23.851] luat:U(395):I/user.kv迭代器获取下一个key my_table
+[2025-11-21 17:01:23.851] luat:U(397):I/user.fskv my_table value table: 60C7DF38
+[2025-11-21 17:01:23.851] luat:U(399):I/user.kv迭代器获取下一个key mytable
+[2025-11-21 17:01:23.851] luat:U(400):I/user.fskv mytable value table: 60C7DE20
+[2025-11-21 17:01:23.851] luat:U(402):I/user.kv迭代器获取下一个key nil
+[2025-11-21 17:01:23.851] luat:U(402):I/user.kv数据库遍历完成
+[2025-11-21 17:01:23.907] luat:U(450):I/user.fskv my_bool删除结果 true
+[2025-11-21 17:01:23.907] luat:U(450):I/user.fskv 删除后查询my_bool nil nil
+[2025-11-21 17:01:23.907] luat:U(455):I/user.设置新的table,key是mytable2 true
+[2025-11-21 17:01:23.907] luat:U(456):I/user.mytable2的值 table: 60C7DBE0 {"age":18,"name":"wendal"}
+[2025-11-21 17:01:23.931] luat:U(460):I/user.mytable2删除name测试 true
+[2025-11-21 17:01:23.931] luat:U(461):I/user.mytable2删除结果 table: 60C7D9F8 {"age":18}
+[2025-11-21 17:01:23.984] luat:U(526):I/user.清空整个kv数据库 true
+[2025-11-21 17:01:23.984] luat:U(527):I/user.获取kv数据库状态 fskv kv 8192 65536 0
+
+```