remove anyhow
This commit is contained in:
192
rust/src/main.rs
192
rust/src/main.rs
@@ -12,8 +12,11 @@ esp_bootloader_esp_idf::esp_app_desc!();
|
||||
use esp_backtrace as _;
|
||||
|
||||
use crate::config::PlantConfig;
|
||||
use crate::hal::esp_time;
|
||||
use crate::log::LOG_ACCESS;
|
||||
use crate::tank::WATER_FROZEN_THRESH;
|
||||
use crate::webserver::httpd;
|
||||
use crate::FatError::FatResult;
|
||||
use crate::{
|
||||
config::BoardVersion::INITIAL,
|
||||
hal::{PlantHal, HAL, PLANT_COUNT},
|
||||
@@ -32,15 +35,14 @@ use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
|
||||
use embassy_sync::mutex::{Mutex, MutexGuard};
|
||||
use embassy_sync::once_lock::OnceLock;
|
||||
use embassy_time::Timer;
|
||||
use esp_bootloader_esp_idf::ota::OtaImageState;
|
||||
use esp_hal::rom::ets_delay_us;
|
||||
use esp_hal::system::software_reset;
|
||||
use esp_println::{logger, println};
|
||||
use hal::battery::BatteryState;
|
||||
use log::{ LogMessage};
|
||||
use log::LogMessage;
|
||||
use plant_state::PlantState;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use crate::hal::esp_time;
|
||||
use crate::log::LOG_ACCESS;
|
||||
|
||||
#[no_mangle]
|
||||
extern "C" fn custom_halt() -> ! {
|
||||
@@ -56,6 +58,7 @@ extern "C" fn custom_halt() -> ! {
|
||||
}
|
||||
|
||||
//use tank::*;
|
||||
mod FatError;
|
||||
mod config;
|
||||
mod hal;
|
||||
mod log;
|
||||
@@ -146,7 +149,7 @@ enum NetworkMode {
|
||||
OFFLINE,
|
||||
}
|
||||
|
||||
async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
async fn safe_main(spawner: Spawner) -> FatResult<()> {
|
||||
info!("Startup Rust");
|
||||
|
||||
let mut to_config = false;
|
||||
@@ -183,28 +186,34 @@ async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
let _ota_state_string = "unknown";
|
||||
|
||||
board.board_hal.general_fault(false).await;
|
||||
let time = esp_time().await;
|
||||
let cur = board
|
||||
.board_hal
|
||||
.get_rtc_module()
|
||||
.get_rtc_time()
|
||||
.await
|
||||
.or_else(|err| {
|
||||
let cur = match board.board_hal.get_rtc_module().get_rtc_time().await {
|
||||
Ok(value) => value,
|
||||
Err(err) => {
|
||||
info!("rtc module error: {:?}", err);
|
||||
board.board_hal.general_fault(true);
|
||||
anyhow::Ok(time)
|
||||
})?;
|
||||
board.board_hal.general_fault(true).await;
|
||||
esp_time().await
|
||||
}
|
||||
};
|
||||
|
||||
//check if we know the time current > 2020 (plausibility checks, this code is newer than 2020)
|
||||
if cur.year() < 2020 {
|
||||
to_config = true;
|
||||
LOG_ACCESS.lock().await.log(LogMessage::YearInplausibleForceConfig, 0, 0, "", "").await;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(LogMessage::YearInplausibleForceConfig, 0, 0, "", "")
|
||||
.await;
|
||||
}
|
||||
|
||||
info!("cur is {}", cur);
|
||||
update_charge_indicator(&mut board).await;
|
||||
println!("faul led3");
|
||||
if board.board_hal.get_esp().get_restart_to_conf() {
|
||||
LOG_ACCESS.lock().await.log(LogMessage::ConfigModeSoftwareOverride, 0, 0, "", "").await;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(LogMessage::ConfigModeSoftwareOverride, 0, 0, "", "")
|
||||
.await;
|
||||
for _i in 0..2 {
|
||||
board.board_hal.general_fault(true).await;
|
||||
Timer::after_millis(100).await;
|
||||
@@ -216,7 +225,11 @@ async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
board.board_hal.get_esp().set_restart_to_conf(false);
|
||||
} else if board.board_hal.get_esp().mode_override_pressed() {
|
||||
board.board_hal.general_fault(true).await;
|
||||
LOG_ACCESS.lock().await.log(LogMessage::ConfigModeButtonOverride, 0, 0, "", "").await;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(LogMessage::ConfigModeButtonOverride, 0, 0, "", "")
|
||||
.await;
|
||||
for _i in 0..5 {
|
||||
board.board_hal.general_fault(true).await;
|
||||
Timer::after_millis(100).await;
|
||||
@@ -297,22 +310,25 @@ async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
let _ = publish_mppt_state(&mut board).await;
|
||||
}
|
||||
|
||||
LOG_ACCESS.lock().await.log(
|
||||
LogMessage::StartupInfo,
|
||||
matches!(network_mode, NetworkMode::WIFI { .. }) as u32,
|
||||
matches!(
|
||||
network_mode,
|
||||
NetworkMode::WIFI {
|
||||
sntp: SntpMode::SYNC { .. },
|
||||
..
|
||||
}
|
||||
) as u32,
|
||||
matches!(network_mode, NetworkMode::WIFI { mqtt: true, .. })
|
||||
.to_string()
|
||||
.as_str(),
|
||||
"",
|
||||
).await
|
||||
;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(
|
||||
LogMessage::StartupInfo,
|
||||
matches!(network_mode, NetworkMode::WIFI { .. }) as u32,
|
||||
matches!(
|
||||
network_mode,
|
||||
NetworkMode::WIFI {
|
||||
sntp: SntpMode::SYNC { .. },
|
||||
..
|
||||
}
|
||||
) as u32,
|
||||
matches!(network_mode, NetworkMode::WIFI { mqtt: true, .. })
|
||||
.to_string()
|
||||
.as_str(),
|
||||
"",
|
||||
)
|
||||
.await;
|
||||
|
||||
if to_config {
|
||||
//check if client or ap mode and init Wi-Fi
|
||||
@@ -323,7 +339,11 @@ async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
let board = BOARD_ACCESS.get().await.lock().await;
|
||||
wait_infinity(board, WaitType::ConfigButton, reboot_now.clone()).await;
|
||||
} else {
|
||||
LOG_ACCESS.lock().await.log(LogMessage::NormalRun, 0, 0, "", "").await;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(LogMessage::NormalRun, 0, 0, "", "")
|
||||
.await;
|
||||
}
|
||||
|
||||
let _dry_run = false;
|
||||
@@ -364,13 +384,10 @@ async fn safe_main(spawner: Spawner) -> anyhow::Result<()> {
|
||||
// }
|
||||
|
||||
let mut _water_frozen = false;
|
||||
//TODO
|
||||
let water_temp = anyhow::Ok(12_f32);
|
||||
// board
|
||||
// .board_hal
|
||||
// .get_tank_sensor()
|
||||
// .context("no sensor")
|
||||
// .and_then(async |f| f.water_temperature_c().await);
|
||||
let water_temp = board
|
||||
.board_hal
|
||||
.get_tank_sensor()
|
||||
.and_then(async |sensor| sensor.water_temperature_c().await);
|
||||
|
||||
if let Ok(res) = water_temp {
|
||||
if res < WATER_FROZEN_THRESH {
|
||||
@@ -615,7 +632,7 @@ pub async fn do_secure_pump(
|
||||
plant_id: usize,
|
||||
plant_config: &PlantConfig,
|
||||
dry_run: bool,
|
||||
) -> anyhow::Result<PumpResult> {
|
||||
) -> FatResult<PumpResult> {
|
||||
let mut current_collector = vec![0_u16; plant_config.pump_time_s.into()];
|
||||
let mut flow_collector = vec![0_i16; plant_config.pump_time_s.into()];
|
||||
let mut error = false;
|
||||
@@ -662,14 +679,17 @@ pub async fn do_secure_pump(
|
||||
let high_current = current_ma > plant_config.max_pump_current_ma;
|
||||
if high_current {
|
||||
if first_error {
|
||||
LOG_ACCESS.lock().await.log(
|
||||
LogMessage::PumpOverCurrent,
|
||||
plant_id as u32 + 1,
|
||||
current_ma as u32,
|
||||
plant_config.max_pump_current_ma.to_string().as_str(),
|
||||
step.to_string().as_str(),
|
||||
).await
|
||||
;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(
|
||||
LogMessage::PumpOverCurrent,
|
||||
plant_id as u32 + 1,
|
||||
current_ma as u32,
|
||||
plant_config.max_pump_current_ma.to_string().as_str(),
|
||||
step.to_string().as_str(),
|
||||
)
|
||||
.await;
|
||||
board.board_hal.general_fault(true).await;
|
||||
board.board_hal.fault(plant_id, true).await?;
|
||||
if !plant_config.ignore_current_error {
|
||||
@@ -682,14 +702,17 @@ pub async fn do_secure_pump(
|
||||
let low_current = current_ma < plant_config.min_pump_current_ma;
|
||||
if low_current {
|
||||
if first_error {
|
||||
LOG_ACCESS.lock().await.log(
|
||||
LogMessage::PumpOpenLoopCurrent,
|
||||
plant_id as u32 + 1,
|
||||
current_ma as u32,
|
||||
plant_config.min_pump_current_ma.to_string().as_str(),
|
||||
step.to_string().as_str(),
|
||||
).await
|
||||
;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(
|
||||
LogMessage::PumpOpenLoopCurrent,
|
||||
plant_id as u32 + 1,
|
||||
current_ma as u32,
|
||||
plant_config.min_pump_current_ma.to_string().as_str(),
|
||||
step.to_string().as_str(),
|
||||
)
|
||||
.await;
|
||||
board.board_hal.general_fault(true).await;
|
||||
board.board_hal.fault(plant_id, true).await?;
|
||||
if !plant_config.ignore_current_error {
|
||||
@@ -703,14 +726,17 @@ pub async fn do_secure_pump(
|
||||
Err(err) => {
|
||||
if !plant_config.ignore_current_error {
|
||||
info!("Error getting pump current: {}", err);
|
||||
LOG_ACCESS.lock().await.log(
|
||||
LogMessage::PumpMissingSensorCurrent,
|
||||
plant_id as u32,
|
||||
0,
|
||||
"",
|
||||
"",
|
||||
).await
|
||||
;
|
||||
LOG_ACCESS
|
||||
.lock()
|
||||
.await
|
||||
.log(
|
||||
LogMessage::PumpMissingSensorCurrent,
|
||||
plant_id as u32,
|
||||
0,
|
||||
"",
|
||||
"",
|
||||
)
|
||||
.await;
|
||||
error = true;
|
||||
break;
|
||||
} else {
|
||||
@@ -957,7 +983,7 @@ async fn pump_info(
|
||||
|
||||
async fn publish_mppt_state(
|
||||
board: &mut MutexGuard<'_, CriticalSectionRawMutex, HAL<'static>>,
|
||||
) -> anyhow::Result<()> {
|
||||
) -> FatResult<()> {
|
||||
let current = board.board_hal.get_mptt_current().await?;
|
||||
let voltage = board.board_hal.get_mptt_voltage().await?;
|
||||
let solar_state = Solar {
|
||||
@@ -983,13 +1009,18 @@ async fn publish_battery_state(
|
||||
.get_battery_monitor()
|
||||
.get_battery_state()
|
||||
.await;
|
||||
if let Ok(serialized_battery_state_bytes) =
|
||||
serde_json::to_string(&state).map(|s| s.into_bytes())
|
||||
let value = match state {
|
||||
Ok(state) => {
|
||||
let json = serde_json::to_string(&state).unwrap().to_owned();
|
||||
json.as_bytes().to_owned()
|
||||
}
|
||||
Err(_) => "error".as_bytes().to_owned(),
|
||||
};
|
||||
{
|
||||
board
|
||||
let _ = board
|
||||
.board_hal
|
||||
.get_esp()
|
||||
.mqtt_publish("/battery", &serialized_battery_state_bytes)
|
||||
.mqtt_publish("/battery", &*value)
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@@ -1062,13 +1093,14 @@ async fn wait_infinity(
|
||||
.lock()
|
||||
.await
|
||||
.board_hal
|
||||
.deep_sleep(0).await;
|
||||
.deep_sleep(0)
|
||||
.await;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[esp_hal_embassy::main]
|
||||
async fn main(spawner: Spawner) {
|
||||
async fn main(spawner: Spawner) -> ! {
|
||||
// intialize embassy
|
||||
logger::init_logger_from_env();
|
||||
//force init here!
|
||||
@@ -1082,21 +1114,13 @@ async fn main(spawner: Spawner) {
|
||||
println!("Hal init done, starting logic");
|
||||
|
||||
match safe_main(spawner).await {
|
||||
// this should not get triggered, safe_main should not return but go into deep sleep with sensible
|
||||
// timeout, this is just a fallback
|
||||
// this should not get triggered, safe_main should not return but go into deep sleep or reboot
|
||||
Ok(_) => {
|
||||
warn!("Main app finished, but should never do, restarting");
|
||||
let board = &mut BOARD_ACCESS.get().await.lock().await.board_hal;
|
||||
|
||||
board.get_esp().set_restart_to_conf(false);
|
||||
board.deep_sleep(1);
|
||||
panic!("Main app finished, but should never do, restarting");
|
||||
}
|
||||
// if safe_main exists with an error, rollback to a known good ota version
|
||||
Err(err) => {
|
||||
error!("Failed main {}", err);
|
||||
//TODO
|
||||
//let _rollback_successful = rollback_and_reboot();
|
||||
//panic!("Failed to rollback :(");
|
||||
panic!("Failed main {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user