这一块代码本来就写好了、根 README 里也按"已实现"描述,但一直没有进仓库, 只存在于工作区里。同一个提交里带上 `.env.example` 的两个新变量(ARMOR_TEAM、 ARMOR_THRESHOLD)——它们的说明文字就是为这套固件写的。 内容: - armor-protocol:规则层(血量、每板独立 50ms 受击冷却、受击后只有那一路灯带全黑、 按键 FSM、上报编码)。纯计算,主机上 22 个测试,已跑通。 - armor-firmware:四路压电片 ADC 连续采样、四路 WS2812(C3 只有一个 RMT 通道可用, 靠 rmt_tx_switch_gpio 轮流驱动)、NVS、BOOT 键、WiFi + UDP 广播。 - scripts:build_armor.sh / flash_armor.sh / armor_probe.py(不开界面单看广播)。 armor/ 是独立 workspace(目标 RISC-V 的 ESP32-C3),与外层 Xtensa 的图传固件互不相干, 各自 .cargo/config.toml 就是这条边界。构建产物由根 .gitignore 的 `/armor/target/` 覆盖, 本次没有把任何 target/ 或 build/ 下的东西加进来。 顺带把 `.DS_Store` 加进 .gitignore。
28 lines
923 B
Rust
28 lines
923 B
Rust
//! 把 IDF 的 `esp_err_t` 返回值变成可读的 `anyhow::Error`。
|
|
//!
|
|
//! 固件里到处都要判 `ESP_OK` 并把错误码翻译成人能看懂的名字;不翻译的话现场只会
|
|
//! 看到 `0x105`,而 IDF 的错误码表并不在脑子里。
|
|
|
|
use anyhow::{anyhow, Result};
|
|
use esp_idf_svc::sys as ffi;
|
|
|
|
/// `ESP_OK` 之外的返回值转成 `Err`,`what` 是出错的那一步的名字。
|
|
pub fn check(what: &str, rc: ffi::esp_err_t) -> Result<()> {
|
|
if rc == ffi::ESP_OK {
|
|
return Ok(());
|
|
}
|
|
|
|
Err(anyhow!("{what} failed: {} (0x{rc:x})", name(rc)))
|
|
}
|
|
|
|
/// 错误码的名字,例如 `ESP_ERR_INVALID_ARG`。
|
|
#[must_use]
|
|
pub fn name(rc: ffi::esp_err_t) -> String {
|
|
// SAFETY: esp_err_to_name 对任意 esp_err_t 都返回一个静态 C 字符串。
|
|
unsafe {
|
|
core::ffi::CStr::from_ptr(ffi::esp_err_to_name(rc))
|
|
.to_string_lossy()
|
|
.into_owned()
|
|
}
|
|
}
|