From ce10d084f809ff669cab9ea0dab0e7a6456d7a3a Mon Sep 17 00:00:00 2001 From: Empire Date: Sat, 31 Jan 2026 00:06:42 +0100 Subject: [PATCH] update: refactor and enhance CAN sensor initialization, reorganize GPIO assignments, improve error detection and logging, and streamline TWAI handling --- .../MainBoard/rust/src/hal/initial_hal.rs | 4 +++ Software/MainBoard/rust/src/hal/mod.rs | 1 + Software/MainBoard/rust/src/hal/v4_hal.rs | 26 ++++++++++--------- Software/MainBoard/rust/src/webserver/mod.rs | 5 ++-- .../MainBoard/rust/src/webserver/post_json.rs | 24 +++++++++++++++++ .../MainBoard/rust/src_webpack/src/api.ts | 4 +++ .../MainBoard/rust/src_webpack/src/main.html | 1 + .../MainBoard/rust/src_webpack/src/main.ts | 21 ++++++++++++++- 8 files changed, 70 insertions(+), 16 deletions(-) diff --git a/Software/MainBoard/rust/src/hal/initial_hal.rs b/Software/MainBoard/rust/src/hal/initial_hal.rs index d62144d..bcfc3a4 100644 --- a/Software/MainBoard/rust/src/hal/initial_hal.rs +++ b/Software/MainBoard/rust/src/hal/initial_hal.rs @@ -140,4 +140,8 @@ impl<'a> BoardInteraction<'a> for Initial<'a> { async fn get_mptt_current(&mut self) -> Result { bail!("Please configure board revision") } + + async fn can_power(&mut self, state: bool) -> FatResult<()> { + bail!("Please configure board revision") + } } diff --git a/Software/MainBoard/rust/src/hal/mod.rs b/Software/MainBoard/rust/src/hal/mod.rs index a9abba8..d79cdda 100644 --- a/Software/MainBoard/rust/src/hal/mod.rs +++ b/Software/MainBoard/rust/src/hal/mod.rs @@ -162,6 +162,7 @@ pub trait BoardInteraction<'a> { fn set_config(&mut self, config: PlantControllerConfig); async fn get_mptt_voltage(&mut self) -> FatResult; async fn get_mptt_current(&mut self) -> FatResult; + async fn can_power(&mut self, state: bool) -> FatResult<()>; // Return JSON string with autodetected sensors per plant. Default: not supported. async fn detect_sensors(&mut self) -> FatResult { diff --git a/Software/MainBoard/rust/src/hal/v4_hal.rs b/Software/MainBoard/rust/src/hal/v4_hal.rs index 7a593ce..37bfdbd 100644 --- a/Software/MainBoard/rust/src/hal/v4_hal.rs +++ b/Software/MainBoard/rust/src/hal/v4_hal.rs @@ -387,22 +387,13 @@ impl<'a> BoardInteraction<'a> for V4<'a> { let mut twai = create_twai(); - loop { - let rec = twai.receive(); - match rec { - Ok(_) => {} - Err(err) => { - info!("Error receiving CAN message: {err:?}"); - break; - } - } - } + Timer::after_millis(10).await; let mut moistures = Moistures::default(); let _ = wait_for_can_measurements(&mut twai, &mut moistures) - .with_timeout(Duration::from_millis(2000)) + .with_timeout(Duration::from_millis(5000)) .await; teardown_twai(twai); self.can_power.set_low(); @@ -413,7 +404,7 @@ impl<'a> BoardInteraction<'a> for V4<'a> { self.can_power.set_high(); let mut twai = create_twai(); // Give CAN some time to stabilize - Timer::after_millis(10).await; + Timer::after_millis(3000).await; info!("Sending info messages now"); // Send a few test messages per potential sensor node @@ -522,6 +513,17 @@ impl<'a> BoardInteraction<'a> for V4<'a> { async fn get_mptt_current(&mut self) -> FatResult { self.charger.get_mppt_current() } + + async fn can_power(&mut self, state: bool) -> FatResult<()> { + if state && self.can_power.is_set_low(){ + self.can_power.set_high(); + create_twai(); + } else { + teardown_twai(create_twai()); + self.can_power.set_low(); + } + Ok(()) + } } diff --git a/Software/MainBoard/rust/src/webserver/mod.rs b/Software/MainBoard/rust/src/webserver/mod.rs index de78ac6..a563688 100644 --- a/Software/MainBoard/rust/src/webserver/mod.rs +++ b/Software/MainBoard/rust/src/webserver/mod.rs @@ -18,9 +18,7 @@ use crate::webserver::get_json::{ use crate::webserver::get_log::get_log; use crate::webserver::get_static::{serve_bundle, serve_favicon, serve_index}; use crate::webserver::ota::ota_operations; -use crate::webserver::post_json::{ - board_test, detect_sensors, night_lamp_test, pump_test, set_config, wifi_scan, write_time, -}; +use crate::webserver::post_json::{board_test, can_power, detect_sensors, night_lamp_test, pump_test, set_config, wifi_scan, write_time}; use crate::{bail, BOARD_ACCESS}; use alloc::borrow::ToOwned; use alloc::string::{String, ToString}; @@ -103,6 +101,7 @@ impl Handler for HTTPRequestRouter { "/time" => Some(write_time(conn).await), "/backup_config" => Some(backup_config(conn).await), "/pumptest" => Some(pump_test(conn).await), + "/can_power" => Some(can_power(conn).await), "/lamptest" => Some(night_lamp_test(conn).await), "/boardtest" => Some(board_test().await), "/detect_sensors" => Some(detect_sensors().await), diff --git a/Software/MainBoard/rust/src/webserver/post_json.rs b/Software/MainBoard/rust/src/webserver/post_json.rs index 87c747f..74c3aaf 100644 --- a/Software/MainBoard/rust/src/webserver/post_json.rs +++ b/Software/MainBoard/rust/src/webserver/post_json.rs @@ -29,6 +29,11 @@ pub struct TestPump { pump: usize, } +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +pub struct CanPower { + state: bool, +} + pub(crate) async fn wifi_scan( _request: &mut Connection<'_, T, N>, ) -> FatResult> { @@ -117,3 +122,22 @@ where board.board_hal.set_config(config); Ok(Some("Ok".to_string())) } + +pub(crate) async fn can_power( + request: &mut Connection<'_, T, N>, +) -> FatResult> +where + T: Read + Write, +{ + let actual_data = read_up_to_bytes_from_request(request, None).await?; + let pump_test: CanPower = serde_json::from_slice(&actual_data)?; + let mut board = BOARD_ACCESS.get().await.lock().await; + + let config = &board.board_hal.can_power(pump_test.state).await?; + let enable = pump_test.state; + info!( + "set can power to {enable}" + ); + Ok(None) +} + diff --git a/Software/MainBoard/rust/src_webpack/src/api.ts b/Software/MainBoard/rust/src_webpack/src/api.ts index 660b912..5d985ce 100644 --- a/Software/MainBoard/rust/src_webpack/src/api.ts +++ b/Software/MainBoard/rust/src_webpack/src/api.ts @@ -141,6 +141,10 @@ export interface TestPump { pump: number } +export interface CanPower { + state: boolean +} + export interface SetTime { time: string } diff --git a/Software/MainBoard/rust/src_webpack/src/main.html b/Software/MainBoard/rust/src_webpack/src/main.html index e821bfd..5821fd9 100644 --- a/Software/MainBoard/rust/src_webpack/src/main.html +++ b/Software/MainBoard/rust/src_webpack/src/main.html @@ -164,6 +164,7 @@

Plants:

+ Power CAN
diff --git a/Software/MainBoard/rust/src_webpack/src/main.ts b/Software/MainBoard/rust/src_webpack/src/main.ts index e4b5149..7fcbb43 100644 --- a/Software/MainBoard/rust/src_webpack/src/main.ts +++ b/Software/MainBoard/rust/src_webpack/src/main.ts @@ -29,7 +29,7 @@ import { SetTime, SSIDList, TankInfo, TestPump, VersionInfo, - FileList, SolarState, PumpTestResult, DetectionResult + FileList, SolarState, PumpTestResult, DetectionResult, CanPower } from "./api"; import {SolarView} from "./solarview"; import {toast} from "./toast"; @@ -527,6 +527,18 @@ export class Controller { setTimeout(this.waitForReboot, 1000) } + private setCanPower(checked: boolean) { + var body: CanPower = { + state : checked + } + var pretty = JSON.stringify(body, undefined, 1); + + fetch(PUBLIC_URL + "/can_power", { + method: "POST", + body: pretty + }) + } + initialConfig: PlantControllerConfig | null = null readonly rebootBtn: HTMLButtonElement readonly exitBtn: HTMLButtonElement @@ -544,6 +556,7 @@ export class Controller { readonly fileview: FileView; readonly logView: LogView readonly detectBtn: HTMLButtonElement + readonly can_power: HTMLInputElement; constructor() { this.timeView = new TimeView(this) @@ -569,7 +582,13 @@ export class Controller { this.exitBtn.onclick = () => { controller.exit(); } + this.can_power = document.getElementById("can_power") as HTMLInputElement + this.can_power.onchange = () => { + controller.setCanPower(this.can_power.checked); + } } + + } const controller = new Controller();