refactor: BatteryInfo structure (consistent layout)

- use tagged enum serialization for BatteryError
- flatten BatteryInfo telemetry with consistent field names and typed error
This commit is contained in:
2026-05-10 14:04:54 +02:00
parent 58aa55fd12
commit 2df120f73b
2 changed files with 51 additions and 28 deletions

View File

@@ -43,7 +43,7 @@ use embassy_time::{Duration, Instant, Timer};
use esp_hal::rom::ets_delay_us;
use esp_hal::system::software_reset;
use esp_println::{logger, println};
use hal::battery::BatteryState;
use hal::battery::{BatteryError, BatteryInfo, BatteryState};
use log::LogMessage;
use option_lock::OptionLock;
use plant_state::PlantState;
@@ -790,20 +790,40 @@ async fn publish_mppt_state(
async fn publish_battery_state(
board: &mut MutexGuard<'_, CriticalSectionRawMutex, HAL<'static>>,
) -> () {
let state = board
let telemetry = match board
.board_hal
.get_battery_monitor()
.get_battery_state()
.await;
let value = match state {
Ok(state) => {
let json = serde_json::to_string(&state).unwrap().to_owned();
json.to_owned()
}
Err(_) => "error".to_owned(),
};
.await
{
let _ = mqtt::publish("/battery", &*value).await;
Ok(BatteryState::Info(info)) => info,
Ok(BatteryState::Unknown) => BatteryInfo {
voltage_mv: None,
avg_current_ma: None,
soc_pct: None,
soh_pct: None,
temperature_c: None,
cycle_count: None,
remaining_mah: None,
design_mah: None,
error: Some(BatteryError::NoBatteryMonitor),
},
Err(e) => BatteryInfo {
voltage_mv: None,
avg_current_ma: None,
soc_pct: None,
soh_pct: None,
temperature_c: None,
cycle_count: None,
remaining_mah: None,
design_mah: None,
error: Some(BatteryError::CommunicationError {
message: alloc::format!("{:?}", e),
}),
},
};
if let Ok(json) = serde_json::to_string(&telemetry) {
let _ = mqtt::publish("/battery", &json).await;
}
}