add: 添加air780epvh的定位演示代码,初始化版本
[LuatOS.git] / demo / fota_uart / main.lua
blob3ee4a15a12628cb47e9e5d2fde6c6211c2637267
1 -- LuaTools需要PROJECT和VERSION这两个信息
2 PROJECT = "fotademo"
3 VERSION = "1.0.0"
5 --[[
6 演示用uart进行固件升级
8 本demo 适用于 Air780E/Air780EG/Air600E
9 1. 需要 V1107及以上的固件
10 2. 需要 LuaTools 2.1.89 及以上的升级文件生成
12 目录内文件的说明
13 1. main.lua 本文件, 是下载到模块的唯一文件
14 2. fota_uart.bin 演示用的脚本升级文件,不需要下载到模块
15 3. main.py 上位机发送升级包的程序, 不需要下载到模块
17 fota_uart.bin 使用 LuaTools 的 "量产文件" 按钮进行生成, .bin后缀的就是脚本OTA文件
19 用法:
20 1. 先把脚本和固件烧录到模块里, 并确认开机
21 2. 进入命令行程序, 执行 python main.py 升级
22 3. 观察luatools的输出和main.py的输出
23 4. 模块接收正确的升级数据后,会提示1秒后重启
24 5. 本demo自带的脚本升级包,升级后是GPIO闪灯的demo
26 注意: 本demo默认是走虚拟串口进行交互, 如需改成物理串口, 修改uart_id和main.py
29 _G.sys = require "sys"
31 -- 定义所需要的UART编号
32 -- uart_id = 1 -- 物理UART1, 通常也是MAIN_UART
33 uart_id = uart.VUART_0 -- 虚拟USB串口
35 -- 循环打印当前版本, 从而直观表示是否升级成功
36 -- sys.taskInit(function()
37 -- while 1 do
38 -- sys.wait(3000)
39 -- log.info("fota", "version", VERSION)
40 -- end
41 -- end)
43 -- 开始初始化uart
44 uart_zbuff = zbuff.create(1024)
45 uart.setup(uart_id, 115200)
47 -- 几个状态变量, 调试用
48 local uart_fota_state = 0
49 local uart_rx_counter = 0
50 local uart_fota_writed = 0
51 uart.on(uart_id, "receive", function(id, len)
52 -- 防御缓冲区超标的情况
53 if uart_zbuff:used() > 8192 then
54 log.warn("fota", "uart_zbuff待处理的数据太多了,强制清空")
55 uart_zbuff:del()
56 end
57 while 1 do
58 local len = uart.rx(id, uart_zbuff)
59 if len <= 0 then
60 break
61 end
62 -- if #s > 0 then -- #s 是取字符串的长度
63 uart_rx_counter = uart_rx_counter + len
64 log.info("uart", "收到数据", len, "累计", uart_rx_counter)
65 if uart_fota_state == 0 then
66 sys.publish("UART_FOTA")
67 end
68 end
69 end)
71 sys.taskInit(function()
72 local fota_state = 0 -- 0还没开始, 1进行中
73 while 1 do
74 -- 等待升级数据到来
75 sys.waitUntil("UART_FOTA", 1000)
76 local used = uart_zbuff:used()
77 if used > 0 then
78 if fota_state == 0 then
79 -- 等待FOTA的状态
80 if used > 5 then
81 local data = uart_zbuff:query()
82 uart_zbuff:del()
83 -- 如果接受到 #FOTA\n 代表数据要来了
84 if data:startsWith("#FOTA") and data:endsWith("\n") then
85 fota_state = 1
86 log.info("fota", "检测到fota起始标记,进入FOTA状态", data)
87 fota.init()
88 -- 固件数据发送端应该在收到#FOTA RDY\n之后才开始发送数据
89 uart.write(uart_id, "#FOTA RDY\n")
90 end
91 end
92 else
93 uart_fota_writed = uart_fota_writed + used
94 log.info("准备写入fota包", used, "累计写入", uart_fota_writed)
95 local result, isDone, cache = fota.run(uart_zbuff)
96 log.debug("fota.run", result, isDone, cache)
97 uart_zbuff:del() -- 清空缓冲区
98 if not result then
99 fota_state = 0
100 fota.isDone()
101 uart.write(uart_id, "#FOTA ERR\n")
102 log.info("fota", "出错了", result, isDone, cache)
103 elseif isDone then
104 while true do
105 sys.wait(100)
106 local succ, fotaDone = fota.isDone()
107 if not succ then
108 fota_state = 0
109 uart.write(uart_id, "#FOTA ERR\n")
110 log.info("fota", "出错了")
111 break
113 if fotaDone then
114 uart_fota_state = 1
115 log.info("fota", "已完成,1s后重启")
116 -- 反馈给上位机
117 uart.write(uart_id, "#FOTA OK\n")
118 sys.wait(1000)
119 rtos.reboot()
121 sys.wait(100)
123 else
124 log.info("fota", "单包写入完成", used, "等待下一个包")
125 uart.write(uart_id, "#FOTA NEXT\n")
130 end)
132 -- 用户代码已结束---------------------------------------------
133 -- 结尾总是这一句
134 sys.run()
135 -- sys.run()之后后面不要加任何语句!!!!!