From ead16ef671d6315d6393bc48d4633bb3f7355775 Mon Sep 17 00:00:00 2001 From: "evan.liu" <583229071@qq.com> Date: Fri, 4 Sep 2026 21:33:25 +0800 Subject: [PATCH] V1.00.23 + OTA tool fine-grained progress display - firmware version bump V1.00.22 -> V1.00.23 (0x00010017), no code change; user-verified BLE OTA (APP1->APP2) and UART OTA both PASS - ble_ota_update.py: frame-level live progress bar on tty (bar/pct/bytes/ rate/per-frame ack RTT, ~10fps throttled), 5%-step lines when redirected; resend/resync notices no longer mix into the bar line; END summary now reports resent/resynced counters; BEGIN/END stage banners - docs: dev log 46, AGENTS.md sync --- AGENTS.md | 2 +- Boot/MDK-ARM/build.log | 2 +- docs/开发日志.md | 12 ++++ mcm-ddc-ble/MDK-ARM/bin/mcm-ddc-ble-app2.bin | Bin 55708 -> 55708 bytes mcm-ddc-ble/MDK-ARM/bin/mcm-ddc-ble.bin | Bin 55408 -> 55408 bytes mcm-ddc-ble/inc/app_version.h | 4 +- tools/ble_ota_update.py | 55 ++++++++++++++++--- tools/out/caiic_ble_dual.bin | Bin 203164 -> 203164 bytes tools/out/caiic_ble_dual.hex | 22 ++++---- tools/out/caiic_ble_dual_ota.bin | Bin 55408 -> 55408 bytes tools/out/caiic_ble_dual_ota.json | 4 +- tools/out/caiic_ble_dual_ota_app2.bin | Bin 55708 -> 55708 bytes tools/out/caiic_ble_dual_ota_app2.json | 4 +- tools/out/caiic_ble_dual_ota_dual.bin | Bin 111168 -> 111168 bytes tools/out/mothercup_ble_ota.bin | Bin 111168 -> 111168 bytes tools/out/mothercup_ble_prod.bin | Bin 88176 -> 88176 bytes tools/out/mothercup_ble_prod.hex | 14 ++--- tools/out/mothercup_ble_prod_ota.bin | Bin 55408 -> 55408 bytes tools/out/mothercup_ble_prod_ota.json | 4 +- tools/out/mothercup_ble_prod_ota_app2.bin | Bin 55708 -> 55708 bytes tools/out/mothercup_ble_prod_ota_app2.json | 4 +- 21 files changed, 88 insertions(+), 39 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 55b2fd2..ca8e8a4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,7 +5,7 @@ 本仓库是 **mothercup(母乳杯)** 产品的完整代码仓库,包含三大部分: 1. **设备固件** — 基于国民技术(Nations)**N32WB031 BLE SoC**(Cortex-M0,64MHz HSI,**板载硅片实测 256KB Flash**(0x01000000~0x0103FFFF,开发日志 §37),RAM 48KB+16KB): - - **`mcm-ddc-ble/`** — 唯一活跃的应用固件工程(APP,链接在 APP1 bank `0x01008000`/112KB)。以 SDK rdtss 例程为蓝本,集成 FreeRTOS、UART CLI、BLE 自定义 GATT 服务(CLI 透传 / 设备信息查询 / BLE OTA 双 bank 直写升级)、bootsetting 与 APP_DATA 参数区结构化读写命令。当前版本 **V1.00.22**(`mcm-ddc-ble/inc/app_version.h`)。历史上曾有 `mcm-ddc-04/` 主工程,**已删除**,其功能已全部并入本工程。 + - **`mcm-ddc-ble/`** — 唯一活跃的应用固件工程(APP,链接在 APP1 bank `0x01008000`/112KB)。以 SDK rdtss 例程为蓝本,集成 FreeRTOS、UART CLI、BLE 自定义 GATT 服务(CLI 透传 / 设备信息查询 / BLE OTA 双 bank 直写升级)、bootsetting 与 APP_DATA 参数区结构化读写命令。当前版本 **V1.00.23**(`mcm-ddc-ble/inc/app_version.h`)。历史上曾有 `mcm-ddc-04/` 主工程,**已删除**,其功能已全部并入本工程。 - **`Boot/`** — 自写精简 bootloader(链接在 `0x01000000`/16KB):校验 bootsetting 记录自身完整性(magic + 结构体 CRC32)后按 active bank 的 `start_address` 直接跳转;**不校验镜像 CRC(CRC 校验在 OTA 升级过程中完成)**;记录无效或地址越界回退 APP1。 2. **手机 App `SmartAssiter/`** — uni-app **Vue3 + TypeScript** 工程(HBuilderX 项目管理,无 package.json),通过 BLE 连接设备:查看运行参数(温度/电压/转速等)、CLI 终端、OTA 升级页(当前停用,见下)。另有登录/注册/用户信息等云端业务页面。 3. **PC 工具 `tools/`** — 整片烧录包制作/烧录脚本 + bleak 蓝牙测试客户端。 diff --git a/Boot/MDK-ARM/build.log b/Boot/MDK-ARM/build.log index 4c324cd..1d68b51 100644 --- a/Boot/MDK-ARM/build.log +++ b/Boot/MDK-ARM/build.log @@ -9,4 +9,4 @@ Program Size: Code=1320 RO-data=680 RW-data=0 ZI-data=2104 FromELF: creating hex file... After Build - User command #1: fromelf --bin --output=.\bin\caiic_boot.bin .\Objects\caiic_boot.axf ".\Objects\caiic_boot.axf" - 0 Error(s), 0 Warning(s). -Build Time Elapsed: 00:00:00 +Build Time Elapsed: 00:00:01 diff --git a/docs/开发日志.md b/docs/开发日志.md index 9acd789..b57524c 100644 --- a/docs/开发日志.md +++ b/docs/开发日志.md @@ -1159,3 +1159,15 @@ APP2 链接的镜像发向 APP1 区。设备端 END 校验(向量表 Reset PC 实测:修复后 UART OTA(APP2→APP1,V1.00.22)全程 PASS 并自动复核通过; 顺带修复了误刷进 APP1 区的内容。固件无改动(仅版本号 V1.00.21→V1.00.22)。 + +## 46. V1.00.23 + OTA 工具进度细化(2026-09-04,工具侧) + +- 固件版本号 V1.00.22→V1.00.23(0x00010017,无代码改动),供用户做 + BLE/UART OTA 全流程验证:两通道均 PASS(用户自测 BLE:APP1→APP2; + 本机复测 BLE:APP2→APP1,自动复核版本/bank 正确)。 +- `ble_ota_update.py` 进度显示细化:tty 下帧级进度条原地刷新(24 格 + bar + 百分比 + 字节数 + 速率 + 最近一帧 ACK 往返 rtt,~10fps 节流); + 非 tty(重定向/管道)自动退化为每 5% 一行,避免日志被 `\r` 刷乱。 + 重传/再同步提示前补换行不与进度条混行;END 总结新增 + `N resent, N resynced` 统计(链路质量一目了然:BLE 实测 0 次, + 接触不良的串口线 4~6 次)。BEGIN/END 阶段切换增加明示打印。 diff --git a/mcm-ddc-ble/MDK-ARM/bin/mcm-ddc-ble-app2.bin b/mcm-ddc-ble/MDK-ARM/bin/mcm-ddc-ble-app2.bin index a170ea2ee90304713a18d2d98b7d6cad06fbfe53..eebc4b3663c81cad99e62aac6f36d62452f02a43 100644 GIT binary patch delta 48 zcmbQUnR(7;<_#=bJmL(D3}J?P1_pXY#+wDS;#nDuHy7wX@nRI;99ngb8OT$qtB3{w DM+goZ delta 48 zcmbQUnR(7;<_#=bJYo!t3}J?P1_pXYMwS DnAQ;4 delta 48 zcmeycf%(G*<_$MAc*GbO8Nv+p3=H&)j5a^fh-YOq+U%nD#EVgEvu5QvW+3lJO+_>S Dm~If% diff --git a/mcm-ddc-ble/inc/app_version.h b/mcm-ddc-ble/inc/app_version.h index 2c4705e..8488cba 100644 --- a/mcm-ddc-ble/inc/app_version.h +++ b/mcm-ddc-ble/inc/app_version.h @@ -9,12 +9,12 @@ #define __APP_VERSION_H__ #ifndef APP_FW_VERSION -#define APP_FW_VERSION "V1.00.22" +#define APP_FW_VERSION "V1.00.23" #endif /* Numeric form used by the BLE info query / OTA records: 0x00MMmmpp */ #ifndef APP_FW_VERSION_NUM -#define APP_FW_VERSION_NUM 0x00010016u +#define APP_FW_VERSION_NUM 0x00010017u #endif #endif /* __APP_VERSION_H__ */ diff --git a/tools/ble_ota_update.py b/tools/ble_ota_update.py index 7bf6b86..b74da42 100644 --- a/tools/ble_ota_update.py +++ b/tools/ble_ota_update.py @@ -304,6 +304,9 @@ def decode_tlv(data): async def ota_session(xfer, chunk, blob, version, target): """Lockstep OTA: BEGIN -> DATA* -> END, every frame acked by OTA_RSP.""" + tty = sys.stdout.isatty() + state = {"resent": 0, "resynced": 0} + async def call(ftype, payload, ack_off=None): stage = {TYPE_OTA_BEGIN: "BEGIN", TYPE_OTA_DATA: "DATA", TYPE_OTA_END: "END", TYPE_OTA_ABORT: "ABORT"}.get(ftype, "?") @@ -315,7 +318,8 @@ async def ota_session(xfer, chunk, blob, version, target): rsp = await xfer(encode_frame(ftype, payload)) except asyncio.TimeoutError: if attempt < XFER_TRIES: - print(" %s: ack timeout, resending (attempt %d/%d)" + state["resent"] += 1 + print("\n %s: ack timeout, resending (attempt %d/%d)" % (stage, attempt + 1, XFER_TRIES)) continue raise asyncio.TimeoutError("%s: no OTA_RSP after %d tries" @@ -327,36 +331,68 @@ async def ota_session(xfer, chunk, blob, version, target): if echo != ftype: raise RuntimeError("%s: RSP echo 0x%02X != 0x%02X" % (stage, echo, ftype)) if ftype == TYPE_OTA_BEGIN and status == ST_BAD_STATE: + state["resynced"] += 1 print(" BEGIN: session already open on device, resynced") return ST_OK, offset if ftype == TYPE_OTA_DATA and status == ST_BAD_STATE \ and ack_off is not None and offset == ack_off: - print(" DATA: chunk already stored (ack was lost), resynced") + state["resynced"] += 1 + print("\n DATA: chunk already stored (ack was lost), resynced") return ST_OK, offset return status, offset + def progress(sent, total, t0, rtt_ms): + """Fine-grained progress: live-updating bar on a tty (throttled to + ~10 fps), one line per 5%% step when output is redirected.""" + now = asyncio.get_event_loop().time() + dt = now - t0 + pct = 100.0 * sent / total + rate = sent / 1024.0 / max(dt, 0.001) + if tty: + if sent != total and now - progress.last_draw < 0.1: + return + progress.last_draw = now + filled = int(pct / 100 * 24) + bar = "#" * filled + "-" * (24 - filled) + print(" [%s] %5.1f%% %d/%d B %.1f kB/s rtt %.0f ms " + % (bar, pct, sent, total, rate, rtt_ms), + end="\r" if sent != total else "\n", flush=True) + else: + step = int(pct // 5) + if sent == total or step != progress.last_step: + progress.last_step = step + print(" %d / %d bytes (%.0f%%, %.1f kB/s, rtt %.0f ms)" + % (sent, total, pct, rate, rtt_ms)) + + progress.last_draw = 0.0 + progress.last_step = -1 + + print("OTA_BEGIN: open session (%d bytes, crc32=0x%08X) ..." + % (len(blob), crc32(blob))) + t_begin = asyncio.get_event_loop().time() status, _ = await call(TYPE_OTA_BEGIN, struct.pack("ytFXee3AW%{HBB(9y}nC zFhe~913e?-?E+a$eT)@;A9kLgSl0Q-40!vFvP delta 153 zcmbQUnP<*so(%#HGKCMLHN_Yh85kUx80Xw%V3^pnrU}H4opj>T=8NoCSNqowCW-=qtW()e5OB4n;ka3aAy?TtoidCP^|gKpY1>XF!JPL kXp3is=y>AAC^lL1XZH33yO@%JIwt@4vu68+eN1Pf0J&T@T>t<8 diff --git a/tools/out/caiic_ble_dual.hex b/tools/out/caiic_ble_dual.hex index 03b504d..63f6827 100644 --- a/tools/out/caiic_ble_dual.hex +++ b/tools/out/caiic_ble_dual.hex @@ -125,8 +125,8 @@ :1007B000096A012211430322920611627047000068 :1007C000D00700010040002038080000D4040001D8 :1040000011C011CA010000000080000170D800003A -:1040100071E15B2916000100004002019CD90000FB -:0C4020009182AC82160001005D92C8D2B3 +:10401000ED3975A817000100004002019CD900008D +:0C4020000D5A82031700010074E93836C5 :106000007ADA12CA01000000F4010000000000006A :106010000000000000000000000000000000000080 :106020000000000000000000000000000000000070 @@ -784,8 +784,8 @@ :10A8A000854203D134A003F037FB03E029463AA0E8 :10A8B00003F0CCFA09F002FA7D21C900FDF762FC31 :10A8C000014639A003F0C2FA08F0F2FD01463AA0B1 -:10A8D00003F0BCFAF8BD00001600010056312E301E -:10A8E000302E3232000000006669726D7761726549 +:10A8D00003F0BCFAF8BD00001700010056312E301D +:10A8E000302E3233000000006669726D7761726548 :10A8F0003A202573202830782530386C58290D0AE5 :10A90000000000006375722062616E6B3A20415056 :10A910005025750D0A000000FF7F00006368697014 @@ -871,7 +871,7 @@ :10AE1000756520666C75736865640D0A0000000036 :10AE200010B506A108A003F011F80DA003F074F806 :10AE30001948016819A003F009F810BD56312E30E9 -:10AE4000302E3232000000006669726D77617265E3 +:10AE4000302E3233000000006669726D77617265E2 :10AE50002076657273696F6E3A2025730D0A0000C3 :10AE60006D636D2D6464632D626C653A20424C45C0 :10AE700028726474737329202B20467265655254BE @@ -2069,7 +2069,7 @@ :10F8F000F0BD13E0FDF73AFB1049884201D1022028 :10F9000000E00120694608740120009004AB224603 :10F910000799069800F014F809B0F0BD079809B0EF -:10F92000F0BD0000FFFF00001600010000080240CB +:10F92000F0BD0000FFFF00001700010000080240CA :10F9300094470020FF7F00000000204100400201AA :10F9400030B4029C42540546491C88B22C54401CD9 :10F95000002180B2002C07D95A5C2A54401C491C53 @@ -2130,7 +2130,7 @@ :10FCC0003D3D3D3D3D3D3D3D3D0A0000206D636DA8 :10FCD0002D6464632D626C653A20424C45202B20D4 :10FCE0004672656552544F53202B20434C490A00FD -:10FCF00056312E30302E323200000000204669721C +:10FCF00056312E30302E323300000000204669721B :10FD00006D776172652076657273696F6E202573F9 :10FD10000A000000004000202053797374656D4391 :10FD20006F7265436C6F636B203D20256C752048B6 @@ -4268,7 +4268,7 @@ :1069D00034A003F037FB03E029463AA003F0CCFAD9 :1069E00009F002FA7D21C900FDF7CCFB014639A070 :1069F00003F0C2FA08F0F2FD01463AA003F0BCFA37 -:106A0000F8BD00001600010056312E30302E323213 +:106A0000F8BD00001700010056312E30302E323311 :106A1000000000006669726D776172653A20257327 :106A2000202830782530386C58290D0A00000000E5 :106A30006375722062616E6B3A2041505025750D6E @@ -4354,7 +4354,7 @@ :106F300020384E312C207278207175657565206679 :106F40006C75736865640D0A0000000010B506A139 :106F500008A003F011F80DA003F074F819480168B7 -:106F600019A003F009F810BD56312E30302E323200 +:106F600019A003F009F810BD56312E30302E3233FF :106F7000000000006669726D776172652076657247 :106F800073696F6E3A2025730D0A00006D636D2DD5 :106F90006464632D626C653A20424C4528726474C7 @@ -5553,7 +5553,7 @@ :10BA2000FDF73AFB1049884201D1022000E00120D5 :10BA3000694608740120009004AB224607990698D5 :10BA400000F014F809B0F0BD079809B0F0BD00008F -:10BA5000FFFF00001600010000080240944700208C +:10BA5000FFFF00001700010000080240944700208B :10BA6000FF7F0000000020410040020130B4029C32 :10BA700042540546491C88B22C54401C002180B217 :10BA8000002C07D95A5C2A54401C491CC9B280B208 @@ -5614,7 +5614,7 @@ :10BDF0003D3D3D3D3D0A0000206D636D2D64646353 :10BE00002D626C653A20424C45202B2046726565B8 :10BE100052544F53202B20434C490A0056312E30A8 -:10BE2000302E323200000000204669726D77617258 +:10BE2000302E323300000000204669726D77617257 :10BE3000652076657273696F6E2025730A000000B5 :10BE4000004000202053797374656D436F72654321 :10BE50006C6F636B203D20256C7520487A0A0000CA diff --git a/tools/out/caiic_ble_dual_ota.bin b/tools/out/caiic_ble_dual_ota.bin index da23815c0a69190c41c638ed0ff8337488feddea..b5077fa755ffdc5e00fabd306236b1f518ed0036 100644 GIT binary patch delta 48 zcmeycf%(G*<_$MAc*GeP8Nv+p3=H&)j5j~gh-YOq-t40H#EVgUvu5QvW+3lJO+_>S DnAQ;4 delta 48 zcmeycf%(G*<_$MAc*GbO8Nv+p3=H&)j5a^fh-YOq+U%nD#EVgEvu5QvW+3lJO+_>S Dm~If% diff --git a/tools/out/caiic_ble_dual_ota.json b/tools/out/caiic_ble_dual_ota.json index 4376d82..867148d 100644 --- a/tools/out/caiic_ble_dual_ota.json +++ b/tools/out/caiic_ble_dual_ota.json @@ -2,6 +2,6 @@ "file": "caiic_ble_dual_ota.bin", "target_bank": 1, "size": 55408, - "crc32": "0x295BE171", - "version": 65558 + "crc32": "0xA87539ED", + "version": 65559 } \ No newline at end of file diff --git a/tools/out/caiic_ble_dual_ota_app2.bin b/tools/out/caiic_ble_dual_ota_app2.bin index a170ea2ee90304713a18d2d98b7d6cad06fbfe53..eebc4b3663c81cad99e62aac6f36d62452f02a43 100644 GIT binary patch delta 48 zcmbQUnR(7;<_#=bJmL(D3}J?P1_pXY#+wDS;#nDuHy7wX@nRI;99ngb8OT$qtB3{w DM+goZ delta 48 zcmbQUnR(7;<_#=bJYo!t3}J?P1_pXYMwZ_3RcCkPi|oxWT~i*0OZP5+FV2CIbU+ zR1>qQ&c}j{CO0&AKpMgf^$ZO3jEpx+XvVWL8gH)9d*a0?zB#t?95axoQ(M!DuB?x7 tyAuoJMUZrb-XEsz0^E!*+!@6u$5v)`^8w?DE52H1g0O>h585kxu zt!ZM9P~Nc7Z_3RcCkPi|oxWT~i*0OZP5+FV2CIbU+ zR1>qQ&c}j{CO0&AKpMgf^$ZO3jEpx+XvVWL8gH)9d*a0?zB#t?95axoQ(M!DuB?x7 tyAuoJMUZrb-XEsz0^E!*+!@6u$5v)`^8w?DE52H1g0O>h585kxu zt!ZM9P~Nc7e=4E@qgou& delta 91 zcmeycf%U@%)(rv9SoS@Y*PW+3m!pNePzZPFYF diff --git a/tools/out/mothercup_ble_prod.hex b/tools/out/mothercup_ble_prod.hex index 939d714..5a5ff4e 100644 --- a/tools/out/mothercup_ble_prod.hex +++ b/tools/out/mothercup_ble_prod.hex @@ -125,8 +125,8 @@ :1007B000096A012211430322920611627047000068 :1007C000D00700010040002038080000D4040001D8 :1040000011C011CA010000000080000170D800003A -:1040100071E15B29160001000000000000000000B3 -:0C40200000000000000000007AA93E0C27 +:10401000ED3975A817000100000000000000000045 +:0C4020000000000000000000CEA45101D0 :10800000D8B90020698100017181000139B10001F6 :108010000000000000000000000000000000000060 :10802000000000000000000000000000FDB400019E @@ -780,8 +780,8 @@ :10A8A000854203D134A003F037FB03E029463AA0E8 :10A8B00003F0CCFA09F002FA7D21C900FDF762FC31 :10A8C000014639A003F0C2FA08F0F2FD01463AA0B1 -:10A8D00003F0BCFAF8BD00001600010056312E301E -:10A8E000302E3232000000006669726D7761726549 +:10A8D00003F0BCFAF8BD00001700010056312E301D +:10A8E000302E3233000000006669726D7761726548 :10A8F0003A202573202830782530386C58290D0AE5 :10A90000000000006375722062616E6B3A20415056 :10A910005025750D0A000000FF7F00006368697014 @@ -867,7 +867,7 @@ :10AE1000756520666C75736865640D0A0000000036 :10AE200010B506A108A003F011F80DA003F074F806 :10AE30001948016819A003F009F810BD56312E30E9 -:10AE4000302E3232000000006669726D77617265E3 +:10AE4000302E3233000000006669726D77617265E2 :10AE50002076657273696F6E3A2025730D0A0000C3 :10AE60006D636D2D6464632D626C653A20424C45C0 :10AE700028726474737329202B20467265655254BE @@ -2065,7 +2065,7 @@ :10F8F000F0BD13E0FDF73AFB1049884201D1022028 :10F9000000E00120694608740120009004AB224603 :10F910000799069800F014F809B0F0BD079809B0EF -:10F92000F0BD0000FFFF00001600010000080240CB +:10F92000F0BD0000FFFF00001700010000080240CA :10F9300094470020FF7F00000000204100400201AA :10F9400030B4029C42540546491C88B22C54401CD9 :10F95000002180B2002C07D95A5C2A54401C491C53 @@ -2126,7 +2126,7 @@ :10FCC0003D3D3D3D3D3D3D3D3D0A0000206D636DA8 :10FCD0002D6464632D626C653A20424C45202B20D4 :10FCE0004672656552544F53202B20434C490A00FD -:10FCF00056312E30302E323200000000204669721C +:10FCF00056312E30302E323300000000204669721B :10FD00006D776172652076657273696F6E202573F9 :10FD10000A000000004000202053797374656D4391 :10FD20006F7265436C6F636B203D20256C752048B6 diff --git a/tools/out/mothercup_ble_prod_ota.bin b/tools/out/mothercup_ble_prod_ota.bin index da23815c0a69190c41c638ed0ff8337488feddea..b5077fa755ffdc5e00fabd306236b1f518ed0036 100644 GIT binary patch delta 48 zcmeycf%(G*<_$MAc*GeP8Nv+p3=H&)j5j~gh-YOq-t40H#EVgUvu5QvW+3lJO+_>S DnAQ;4 delta 48 zcmeycf%(G*<_$MAc*GbO8Nv+p3=H&)j5a^fh-YOq+U%nD#EVgEvu5QvW+3lJO+_>S Dm~If% diff --git a/tools/out/mothercup_ble_prod_ota.json b/tools/out/mothercup_ble_prod_ota.json index 1ac23e1..38213f4 100644 --- a/tools/out/mothercup_ble_prod_ota.json +++ b/tools/out/mothercup_ble_prod_ota.json @@ -2,6 +2,6 @@ "file": "mothercup_ble_prod_ota.bin", "target_bank": 1, "size": 55408, - "crc32": "0x295BE171", - "version": 65558 + "crc32": "0xA87539ED", + "version": 65559 } \ No newline at end of file diff --git a/tools/out/mothercup_ble_prod_ota_app2.bin b/tools/out/mothercup_ble_prod_ota_app2.bin index a170ea2ee90304713a18d2d98b7d6cad06fbfe53..eebc4b3663c81cad99e62aac6f36d62452f02a43 100644 GIT binary patch delta 48 zcmbQUnR(7;<_#=bJmL(D3}J?P1_pXY#+wDS;#nDuHy7wX@nRI;99ngb8OT$qtB3{w DM+goZ delta 48 zcmbQUnR(7;<_#=bJYo!t3}J?P1_pXYMw