Files
ESP32S3_vt/armor/armor-firmware/src/esp.rs
T
Horldsence a30eb3200a armor: ESP32-C3 装甲板固件(一主三从)+ 烧录脚本,之前一直没提交
这一块代码本来就写好了、根 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。
2026-10-14 19:43:14 +08:00

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()
}
}