# 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 才会生成密钥对
