diff --git a/.workbuddy/expert-history.json b/.workbuddy/expert-history.json index e25ff7a..5bbd6c1 100644 --- a/.workbuddy/expert-history.json +++ b/.workbuddy/expert-history.json @@ -11,7 +11,18 @@ "usedAt": 1774782976490, "industryId": "all" } + ], + "9ab75f98b70b43029fd6c3bae3934dea": [ + { + "expertId": "EmbeddedFirmwareEngineer", + "name": "Owen", + "profession": "嵌入式固件工程师", + "avatarUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/avatars/02-Engineering/EmbeddedFirmwareEngineer/EmbeddedFirmwareEngineer.png", + "promptUrl": "https://acc-1258344699.cos.accelerate.myqcloud.com/workbuddy/experts/experts/02-Engineering/EmbeddedFirmwareEngineer/EmbeddedFirmwareEngineer_zh.md", + "usedAt": 1774843083830, + "industryId": "all" + } ] }, - "lastUpdated": 1774792487098 + "lastUpdated": 1774866488669 } \ No newline at end of file diff --git a/.workbuddy/memory/2026-03-30.md b/.workbuddy/memory/2026-03-30.md new file mode 100644 index 0000000..d2a3853 --- /dev/null +++ b/.workbuddy/memory/2026-03-30.md @@ -0,0 +1,42 @@ +# 2026-03-30 日志 + +## 编译环境搭建(esp32c3_moonshine_travelers) + +- Python 3.14.0 已预装(C:\Python314) +- 安装 PlatformIO 6.1.19:`pip install platformio` +- PlatformIO Scripts 路径:`C:\Users\wuwen\AppData\Roaming\Python\Python314\Scripts` +- 已写入用户 PATH 永久生效(无需每次手动加) +- 平台工具链 `espressif32@6.11.0`、`framework-arduinoespressif32`、`toolchain-riscv32-esp` 已存在(之前工程留下) +- 固件目录:`code/firmware-2.7.15.567b8ea`,编译命令:`pio run -e esp32c3_moonshine_travelers` + +## 遇到问题:Windows MAX_PATH 限制 + +- SparkFun ICM-20948 库解压时路径超过 260 字符 → `PackageException` +- 根因:`examples/Arduino/Example10_DMP_FastMultipleSensors/` 路径过长 +- 修复方案:需要管理员权限执行以下命令启用 Windows 长路径支持: + ```powershell + Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 + ``` +- 后续:用户反映编译成功(Windows 长路径问题已自行解决) + +## 调试:节点不发公钥/节点名字对端看不到 + +- **根本原因**:设备 Flash 中残留 `owner.is_licensed = true`(HamConfig 曾通过 App 下发并持久化) +- **公钥不发**:`NodeInfoModule::allocReply()` 中 `is_licensed==true` 时主动清零公钥字段(Ham 法规要求) +- **名字对端不可见**:`handleReceivedProtobuf()` 检查 `p.is_licensed != owner.is_licensed` 时直接丢包 +- **解决**:擦除 Flash NVS 分区(`pio run -t erase`)后重烧,或通过 App 关闭 Licensed 开关 + +## 修复:切换 role 后 NodeInfo/公钥仍不广播(CLIENT_HIDDEN 遗留问题) + +### Bug 1:owner.role 不随 config.device.role 同步 +- **位置**:`AdminModule.cpp` `handleSetConfig()` device_tag 分支 +- **原因**:改 role 时只更新 `config.device.role`,`owner.role`(广播字段)从不更新 +- **修复**:在 `installRoleDefaults()` 调用后加 `owner.role = config.device.role;` + +### Bug 2:从 CLIENT_HIDDEN 切回 CLIENT 后广播间隔不恢复 +- **位置**:`NodeDB.cpp` `installRoleDefaults()` +- **原因**:CLIENT_HIDDEN 把 `node_info_broadcast_secs` 设为 `INT32_MAX`,切回 CLIENT 时没有对应的重置分支 +- **修复**:新增 `CLIENT` / `CLIENT_MUTE` 分支,恢复 `default_node_info_broadcast_secs` 等默认值 + +### 额外确认 +- **公钥不生成的前置条件**:`config.lora.region == UNSET` 时 NodeDB::init() 跳过 PKI keygen;需先通过 App 设置 region 才会生成密钥对 diff --git a/.workbuddy/memory/MEMORY.md b/.workbuddy/memory/MEMORY.md index cf38f38..5e34216 100644 --- a/.workbuddy/memory/MEMORY.md +++ b/.workbuddy/memory/MEMORY.md @@ -2,7 +2,8 @@ ## 项目概述 - **项目**:LoRa Meshtastic 固件开发 -- **主代码目录**:`code/firmware-2.7.15.567b8ea`(基于 Meshtastic 官方固件 v2.7.15) +- **主代码目录**:`code/meshtastic_firmware`(基于 Meshtastic 官方最新 develop 分支) +- **旧代码目录**:`code/firmware-2.7.15.567b8ea`(基于 Meshtastic 官方固件 v2.7.15,已废弃) - **构建系统**:PlatformIO + ESP-IDF (Arduino framework for ESP32) ## 硬件平台 & 自定义板卡 @@ -86,6 +87,9 @@ ## 代码架构要点 - **踩坑记录**:TCA9535 矩阵扫描 cols 计算中 `~` 运算符对 uint8_t 会整数提升为 int,导致高 4 位被污染。修复:`((~(p0In & 0xF0)) >> 4) & 0x0F`。见 scanMatrix()。 +- **踩坑记录**:`owner.role` 只在 `NodeDB::NodeDB()` 构造时同步一次(`owner.role = config.device.role`),`AdminModule::handleSetConfig()` 改 role 时不更新 `owner.role`,导致广播出去的 NodeInfo 里 role 仍是旧值。已修复:在 `AdminModule.cpp` device_tag 分支末尾加 `owner.role = config.device.role;`(2026-03-30) +- **踩坑记录**:`NodeDB::installRoleDefaults(CLIENT_HIDDEN)` 把 `node_info_broadcast_secs = INT32_MAX`,但 `installRoleDefaults(CLIENT)` 没有对应的恢复分支,切回 CLIENT 后 NodeInfo 永远不广播。已修复:新增 CLIENT/CLIENT_MUTE 分支恢复 `default_node_info_broadcast_secs`(2026-03-30) +- **踩坑记录**:`is_licensed = true` 时 `NodeInfoModule::allocReply()` 主动清零公钥,且接收端 `handleReceivedProtobuf()` 因 `is_licensed` mismatch 直接丢包。Flash 残留旧 HamConfig 时会触发此问题,需擦 Flash 或 App 关闭 Licensed 开关。 - 路由层:FloodingRouter → ReliableRouter → NextHopRouter - 无线接口:RadioLib 抽象层(SX126x/SX128x/LR11x0/RF95) - 模块系统:`src/modules/` 下各功能模块(TextMessage, Position, Telemetry, etc.) @@ -102,8 +106,30 @@ - MAX_THREADS=40 - 默认 env:tbeam(需要切换到 esp32c3_moonshine 系列时要指定 env) - **Flash 占用**(esp32c3_moonshine_travelers):text≈1.92MB, data≈0.63MB, 总≈2.57MB / 4MB +- **移植记录**(2026-03-30): + - 将 esp32c3_moonshine_travelers 变体从 firmware-2.7.15 移植到官方最新 develop 分支 + - 修复 `tca9535IsCharging` 未声明错误:在 Power.cpp 添加 extern 声明 - **分区表**(partition-table.csv):app=0x2C0000(2.75MB), OTA=0x030000(192KB), spiffs=0x100000(1MB) - **中文 12×12 字库**:`src/graphics/fonts/ChineseFont12x12.h`,21075 字形,535KB flash + +## 🔧 硬件更换计划 + +### 问题描述 +- **症状**:不发送公钥、不发送节点名字信息(最新固件仍存在) +- **潜在原因**:LLCC68 规格书不支持 SF11 125kHz 模式,导致 LoRa 通信异常 + +### 解决方案 +1. **方案A**:更换为带温补晶振(TCXO)的 LoRa 模块 + - 确保晶振精度满足 SF11 125kHz 模式要求 + +2. **方案B**:更换为 E22-30S 系列模块 + - E22-900M30S 或 E22-400M30S + - 该系列支持更宽的工作模式 + +### 待确认事项 +- [ ] 确认 RA-01SC-P 是否为 LLCC68 芯片 +- [ ] 测试更换 TCXO 版模块后的表现 +- [ ] 测试 E22-30S 系列的兼容性 - 生成工具:`tools/gen_chinese_font.mjs`(需 npm install @napi-rs/canvas) - 覆盖:U+4E00-U+9FFF(CJK 统一汉字全集,含 GB2312 6763 字) - 像素判定:透明背景 + 黑色前景,alpha > 128 阈值(去掉抗锯齿毛边,字形锐利) diff --git a/PCB/Moonshine_MV.eprj2 b/PCB/Moonshine_MV.eprj2 index 7510c20..6d4b9a1 100644 Binary files a/PCB/Moonshine_MV.eprj2 and b/PCB/Moonshine_MV.eprj2 differ diff --git a/PCB/Moonshine_travelers.eprj2 b/PCB/Moonshine_travelers.eprj2 index ca957ea..2138b92 100644 Binary files a/PCB/Moonshine_travelers.eprj2 and b/PCB/Moonshine_travelers.eprj2 differ diff --git a/PCB/Moonshine_新.eprj2 b/PCB/Moonshine_新.eprj2 index e4fe100..f08443d 100644 Binary files a/PCB/Moonshine_新.eprj2 and b/PCB/Moonshine_新.eprj2 differ diff --git a/code/meshtastic_firmware b/code/meshtastic_firmware index f361203..db694f2 160000 --- a/code/meshtastic_firmware +++ b/code/meshtastic_firmware @@ -1 +1 @@ -Subproject commit f361203f42c479d14b7d2e99a1003cd0f0c481cb +Subproject commit db694f2f24a63d7bf0b082856d75c5d9a6a55eda