clippy: fix clippy warnings

This commit is contained in:
2026-05-25 20:11:58 +02:00
parent 7078af5713
commit 7679fa09dc
11 changed files with 48 additions and 58 deletions

View File

@@ -1,23 +1,17 @@
use crate::bail; use crate::bail;
use crate::config::{NetworkConfig, PlantControllerConfig}; use crate::config::{PlantControllerConfig};
use crate::hal::savegame_manager::SavegameManager; use crate::hal::savegame_manager::SavegameManager;
use crate::hal::PLANT_COUNT; use crate::hal::PLANT_COUNT;
use crate::log::{log, LogMessage}; use crate::log::{log, LogMessage};
use chrono::{DateTime, Utc}; use chrono::{DateTime, Utc};
use crate::fat_error::{ContextExt, FatError, FatResult}; use crate::fat_error::{FatError, FatResult};
use crate::hal::shared_flash::MutexFlashStorage; use crate::hal::shared_flash::MutexFlashStorage;
use alloc::string::ToString; use alloc::string::ToString;
use alloc::sync::Arc; use alloc::sync::Arc;
use alloc::{format, string::String, vec, vec::Vec}; use alloc::{string::String, vec, vec::Vec};
use core::net::{IpAddr, Ipv4Addr, SocketAddr};
use core::sync::atomic::Ordering;
use embassy_executor::Spawner;
use embassy_net::{DhcpConfig, IpAddress, Ipv4Cidr, Runner, Stack, StackResources, StaticConfigV4};
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::mutex::Mutex; use embassy_sync::mutex::Mutex;
use embassy_sync::once_lock::OnceLock;
use embassy_time::{Duration, Timer, WithTimeout};
use embedded_storage::nor_flash::{check_erase, NorFlash, ReadNorFlash, RmwNorFlashStorage}; use embedded_storage::nor_flash::{check_erase, NorFlash, ReadNorFlash, RmwNorFlashStorage};
use esp_bootloader_esp_idf::ota::OtaImageState::Valid; use esp_bootloader_esp_idf::ota::OtaImageState::Valid;
use esp_bootloader_esp_idf::ota::{Ota, OtaImageState}; use esp_bootloader_esp_idf::ota::{Ota, OtaImageState};
@@ -31,15 +25,11 @@ use esp_hal::rtc_cntl::{
use esp_hal::system::software_reset; use esp_hal::system::software_reset;
use esp_hal::uart::Uart; use esp_hal::uart::Uart;
use esp_hal::Blocking; use esp_hal::Blocking;
use esp_println::println; use esp_radio::wifi::ap::{AccessPointInfo};
use esp_radio::wifi::ap::{AccessPointConfig, AccessPointInfo};
use esp_radio::wifi::scan::{ScanConfig, ScanTypeConfig}; use esp_radio::wifi::scan::{ScanConfig, ScanTypeConfig};
use esp_radio::wifi::sta::StationConfig; use esp_radio::wifi::{Interface, WifiController};
use esp_radio::wifi::{AuthenticationMethod, Config, Interface, WifiController}; use log::{error, info};
use log::{error, info, warn};
use portable_atomic::AtomicBool;
use crate::network::{net_task, run_dhcp};
#[esp_hal::ram(unstable(rtc_fast), unstable(persistent))] #[esp_hal::ram(unstable(rtc_fast), unstable(persistent))]
static mut LAST_WATERING_TIMESTAMP: [i64; PLANT_COUNT] = [0; PLANT_COUNT]; static mut LAST_WATERING_TIMESTAMP: [i64; PLANT_COUNT] = [0; PLANT_COUNT];

View File

@@ -141,7 +141,7 @@ pub struct HAL<'a> {
#[async_trait(?Send)] #[async_trait(?Send)]
pub trait BoardInteraction<'a> { pub trait BoardInteraction<'a> {
fn get_tank_sensor(&mut self) -> Result<&mut TankSensor<'a>, FatError>; fn get_tank_sensor(&mut self) -> &mut TankSensor<'a>;
fn get_esp(&mut self) -> &mut Esp<'a>; fn get_esp(&mut self) -> &mut Esp<'a>;
fn get_config(&mut self) -> &PlantControllerConfig; fn get_config(&mut self) -> &PlantControllerConfig;
fn get_battery_monitor(&mut self) -> &mut Box<dyn BatteryInteraction + Send>; fn get_battery_monitor(&mut self) -> &mut Box<dyn BatteryInteraction + Send>;

View File

@@ -300,8 +300,8 @@ pub(crate) async fn create_v4(
#[async_trait(?Send)] #[async_trait(?Send)]
impl<'a> BoardInteraction<'a> for V4<'a> { impl<'a> BoardInteraction<'a> for V4<'a> {
fn get_tank_sensor(&mut self) -> Result<&mut TankSensor<'a>, FatError> { fn get_tank_sensor(&mut self) -> &mut TankSensor<'a> {
Ok(&mut self.tank_sensor) &mut self.tank_sensor
} }
fn get_esp(&mut self) -> &mut Esp<'a> { fn get_esp(&mut self) -> &mut Esp<'a> {

View File

@@ -7,10 +7,10 @@ use esp_hal::delay::Delay;
use esp_hal::gpio::{DriveMode, Flex, Input, InputConfig, Output, OutputConfig, Pull}; use esp_hal::gpio::{DriveMode, Flex, Input, InputConfig, Output, OutputConfig, Pull};
use esp_hal::pcnt::channel::CtrlMode::Keep; use esp_hal::pcnt::channel::CtrlMode::Keep;
use esp_hal::pcnt::channel::EdgeMode::{Hold, Increment}; use esp_hal::pcnt::channel::EdgeMode::{Hold, Increment};
use esp_hal::pcnt::unit::Unit; use esp_hal::pcnt::unit::{Unit};
use esp_hal::peripherals::GPIO5; use esp_hal::peripherals::GPIO5;
use esp_hal::Async; use esp_hal::Async;
use log::info; use log::{error, info};
use onewire::{ds18b20, Device, DeviceSearch, OneWire, DS18B20}; use onewire::{ds18b20, Device, DeviceSearch, OneWire, DS18B20};
use portable_atomic::{AtomicUsize, Ordering}; use portable_atomic::{AtomicUsize, Ordering};
@@ -61,7 +61,12 @@ impl<'a> TankSensor<'a> {
info!("tank: pcnt high limit ok"); info!("tank: pcnt high limit ok");
// Reject pulses shorter than ~12.8 µs (1023 APB cycles @ 80 MHz) to suppress EMI noise // Reject pulses shorter than ~12.8 µs (1023 APB cycles @ 80 MHz) to suppress EMI noise
// on the sensor cable. Real flow pulses are in the millisecond range. // on the sensor cable. Real flow pulses are in the millisecond range.
pcnt1.set_filter(Some(1023)).unwrap(); match pcnt1.set_filter(Some(1023)) {
Ok(_) => {}
Err(err) => {
error!("tank: failed to set pcnt filter: {:?}", err);
}
}
let ch0 = &pcnt1.channel0; let ch0 = &pcnt1.channel0;
ch0.set_edge_signal(flow_sensor.peripheral_input()); ch0.set_edge_signal(flow_sensor.peripheral_input());

View File

@@ -15,23 +15,23 @@ esp_bootloader_esp_idf::esp_app_desc!();
use esp_backtrace as _; use esp_backtrace as _;
use crate::hal::PROGRESS_ACTIVE; use crate::hal::PROGRESS_ACTIVE;
use crate::config::{NetworkConfig, PlantConfig, PlantControllerConfig}; use crate::config::{PlantConfig, PlantControllerConfig};
use crate::fat_error::{ContextExt, FatResult}; use crate::fat_error::{ContextExt, FatResult};
use crate::log::log; use crate::log::log;
use crate::tank::{determine_tank_state, TankError, TankState, WATER_FROZEN_THRESH}; use crate::tank::{determine_tank_state, TankError, WATER_FROZEN_THRESH};
use crate::webserver::http_server; use crate::webserver::http_server;
use crate::{ use crate::{
config::BoardVersion::Initial, config::BoardVersion::Initial,
hal::{PlantHal, HAL, PLANT_COUNT}, hal::{PlantHal, HAL, PLANT_COUNT},
}; };
use ::log::{error, info, warn}; use ::log::{error, info};
use alloc::borrow::ToOwned; use alloc::borrow::ToOwned;
use alloc::string::{String, ToString}; use alloc::string::{String, ToString};
use alloc::sync::Arc; use alloc::sync::Arc;
use alloc::vec::Vec; use alloc::vec::Vec;
use alloc::{format, vec}; use alloc::{format, vec};
use chrono::{DateTime, Datelike, Timelike, Utc}; use chrono::{DateTime, Datelike, Timelike};
use chrono_tz::Tz::{self, UTC}; use chrono_tz::Tz::{self, UTC};
use core::sync::atomic::{AtomicBool, Ordering}; use core::sync::atomic::{AtomicBool, Ordering};
use embassy_executor::Spawner; use embassy_executor::Spawner;
@@ -42,8 +42,8 @@ use embassy_sync::once_lock::OnceLock;
use embassy_time::{Duration, Instant, Timer}; use embassy_time::{Duration, Instant, Timer};
use esp_hal::rom::ets_delay_us; use esp_hal::rom::ets_delay_us;
use esp_hal::system::software_reset; use esp_hal::system::software_reset;
use esp_println::{logger, println}; use esp_println::{println};
use hal::battery::{BatteryError, BatteryInfo, BatteryState}; use hal::battery::{BatteryState};
use log::LogMessage; use log::LogMessage;
use option_lock::OptionLock; use option_lock::OptionLock;
use plant_state::PlantState; use plant_state::PlantState;
@@ -275,7 +275,7 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
); );
if let network::NetworkMode::WIFI { ref ip_address, .. } = network_mode { if let network::NetworkMode::WIFI { ref ip_address, .. } = network_mode {
mqtt::publish_firmware_info(&mut board, version, ip_address, &timezone_time.to_rfc3339()).await; mqtt::publish_firmware_info(version, ip_address, &timezone_time.to_rfc3339()).await;
mqtt::publish_battery_state(&mut board).await.unwrap_or_else(|e| { mqtt::publish_battery_state(&mut board).await.unwrap_or_else(|e| {
error!("Error publishing battery state {e}"); error!("Error publishing battery state {e}");
}); });
@@ -354,10 +354,7 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
} }
let mut water_frozen = false; let mut water_frozen = false;
let water_temp: FatResult<f32> = match board.board_hal.get_tank_sensor() { let water_temp: FatResult<f32> = board.board_hal.get_tank_sensor().water_temperature_c().await;
Ok(sensor) => sensor.water_temperature_c().await,
Err(e) => Err(e),
};
if let Ok(res) = water_temp { if let Ok(res) = water_temp {
if res < WATER_FROZEN_THRESH { if res < WATER_FROZEN_THRESH {
@@ -437,7 +434,6 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
//state.active = true; //state.active = true;
mqtt::pump_info( mqtt::pump_info(
&mut board,
plant_id, plant_id,
true, true,
pump_ineffective, pump_ineffective,
@@ -455,7 +451,6 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
Ok(state) => { Ok(state) => {
overcurrent_results[plant_id] = state.overcurrent_ma; overcurrent_results[plant_id] = state.overcurrent_ma;
mqtt::pump_info( mqtt::pump_info(
&mut board,
plant_id, plant_id,
false, false,
pump_ineffective, pump_ineffective,
@@ -470,7 +465,6 @@ async fn safe_main(spawner: Spawner) -> FatResult<()> {
} }
Err(err) => { Err(err) => {
mqtt::pump_info( mqtt::pump_info(
&mut board,
plant_id, plant_id,
false, false,
pump_ineffective, pump_ineffective,
@@ -743,13 +737,13 @@ pub async fn do_secure_pump(
} }
} }
board.board_hal.get_tank_sensor()?.reset_flow_meter(); board.board_hal.get_tank_sensor().reset_flow_meter();
board.board_hal.get_tank_sensor()?.start_flow_meter(); board.board_hal.get_tank_sensor().start_flow_meter();
board.board_hal.pump(plant_id, true).await?; board.board_hal.pump(plant_id, true).await?;
for step in 0..steps_in_50ms { for step in 0..steps_in_50ms {
let step_start = Instant::now(); let step_start = Instant::now();
let flow_value = board.board_hal.get_tank_sensor()?.get_full_flow_count(); let flow_value = board.board_hal.get_tank_sensor().get_full_flow_count();
flow_collector[step] = flow_value; flow_collector[step] = flow_value;
let flow_value_ml = flow_value as f32 * board.board_hal.get_config().tank.ml_per_pulse; let flow_value_ml = flow_value as f32 * board.board_hal.get_config().tank.ml_per_pulse;
@@ -860,8 +854,8 @@ pub async fn do_secure_pump(
//noticable dummy value //noticable dummy value
pump_time_ms = 1337; pump_time_ms = 1337;
} }
board.board_hal.get_tank_sensor()?.stop_flow_meter(); board.board_hal.get_tank_sensor().stop_flow_meter();
let final_flow_value = board.board_hal.get_tank_sensor()?.get_full_flow_count(); let final_flow_value = board.board_hal.get_tank_sensor().get_full_flow_count();
let flow_value_ml = final_flow_value as f32 * board.board_hal.get_config().tank.ml_per_pulse; let flow_value_ml = final_flow_value as f32 * board.board_hal.get_config().tank.ml_per_pulse;
info!("Final flow value is {final_flow_value} with {flow_value_ml} ml"); info!("Final flow value is {final_flow_value} with {flow_value_ml} ml");
current_collector.sort(); current_collector.sort();

View File

@@ -17,7 +17,7 @@ use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_sync::mutex::MutexGuard; use embassy_sync::mutex::MutexGuard;
use embassy_sync::once_lock::OnceLock; use embassy_sync::once_lock::OnceLock;
use embassy_time::{Duration, Timer, WithTimeout}; use embassy_time::{Duration, Timer, WithTimeout};
use log::{info, warn}; use log::{error, info, warn};
use mcutie::{ use mcutie::{
Error, McutieBuilder, McutieReceiver, McutieTask, MqttMessage, PublishDisplay, Publishable, Error, McutieBuilder, McutieReceiver, McutieTask, MqttMessage, PublishDisplay, Publishable,
QoS, Topic, QoS, Topic,
@@ -266,7 +266,7 @@ pub async fn publish_tank_state(
let state = serde_json::to_string( let state = serde_json::to_string(
&tank_state.as_mqtt_info(&board.board_hal.get_config().tank, &water_temp), &tank_state.as_mqtt_info(&board.board_hal.get_config().tank, &water_temp),
)?; )?;
let _ = publish("/water", &*state).await; let _ = publish("/water", &state).await;
Ok(()) Ok(())
} }
@@ -288,13 +288,16 @@ pub async fn publish_plant_states(
} }
pub async fn publish_firmware_info( pub async fn publish_firmware_info(
board: &mut MutexGuard<'_, CriticalSectionRawMutex, HAL<'static>>,
version: VersionInfo, version: VersionInfo,
ip_address: &str, ip_address: &str,
timezone_time: &str, timezone_time: &str,
) { ) {
publish("/firmware/address", ip_address).await; publish("/firmware/address", ip_address).await;
publish("/firmware/state", &serde_json::to_string(&version).unwrap()).await; let version = &serde_json::to_string(&version);
match version {
Ok(version_str) => publish("/firmware/state", version_str).await,
Err(e) => error!("Failed to serialize version info: {}", e),
}
publish("/firmware/last_online", timezone_time).await; publish("/firmware/last_online", timezone_time).await;
publish("/state", "online").await; publish("/state", "online").await;
} }
@@ -312,8 +315,8 @@ pub struct PumpInfo {
pub flow_ml: f32, pub flow_ml: f32,
} }
#[allow(clippy::too_many_arguments)]
pub async fn pump_info( pub async fn pump_info(
board: &mut MutexGuard<'_, CriticalSectionRawMutex, HAL<'static>>,
plant_id: usize, plant_id: usize,
pump_active: bool, pump_active: bool,
pump_ineffective: bool, pump_ineffective: bool,

View File

@@ -1,7 +1,7 @@
use crate::bail; use crate::bail;
use crate::config::NetworkConfig; use crate::config::NetworkConfig;
use crate::fat_error::{ContextExt, FatError, FatResult}; use crate::fat_error::{ContextExt, FatError, FatResult};
use crate::hal::{PlantHal, HAL}; use crate::hal::{HAL};
use crate::mqtt; use crate::mqtt;
use crate::util::mk_static; use crate::util::mk_static;
use alloc::string::{String, ToString}; use alloc::string::{String, ToString};
@@ -142,12 +142,14 @@ pub async fn sntp(max_wait_ms: u32, stack: Stack<'_>) -> FatResult<DateTime<Utc>
} }
#[derive(Serialize, Debug, PartialEq)] #[derive(Serialize, Debug, PartialEq)]
#[allow(clippy::upper_case_acronyms)]
pub enum SntpMode { pub enum SntpMode {
OFFLINE, OFFLINE,
SYNC { current: DateTime<Utc> }, SYNC { current: DateTime<Utc> },
} }
#[derive(Serialize, Debug, PartialEq)] #[derive(Serialize, Debug, PartialEq)]
#[allow(clippy::upper_case_acronyms)]
pub enum NetworkMode { pub enum NetworkMode {
WIFI { WIFI {
sntp: SntpMode, sntp: SntpMode,

View File

@@ -1,6 +1,5 @@
use crate::hal::Moistures; use crate::hal::Moistures;
use crate::{config::PlantConfig, hal::HAL, in_time_range}; use crate::{config::PlantConfig, hal::HAL, in_time_range};
use alloc::string::String;
use chrono::{DateTime, TimeDelta, Utc}; use chrono::{DateTime, TimeDelta, Utc};
use chrono_tz::Tz; use chrono_tz::Tz;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -14,8 +13,7 @@ pub enum MoistureSensorError {
MissingMessage, MissingMessage,
NotExpectedMessage { hz: f32 }, NotExpectedMessage { hz: f32 },
ShortCircuit { hz: f32, max: f32 }, ShortCircuit { hz: f32, max: f32 },
OpenLoop { hz: f32, min: f32 }, OpenLoop { hz: f32, min: f32 }
BoardError { message: String },
} }
#[derive(Debug, PartialEq, Serialize)] #[derive(Debug, PartialEq, Serialize)]

View File

@@ -161,10 +161,11 @@ pub async fn determine_tank_state(
if board.board_hal.get_config().tank.tank_sensor_enabled { if board.board_hal.get_config().tank.tank_sensor_enabled {
match board match board
.board_hal .board_hal
.get_tank_sensor() .get_tank_sensor().tank_sensor_voltage().await
.and_then(|f| core::prelude::v1::Ok(f.tank_sensor_voltage()))
{ {
Ok(raw_sensor_value_mv) => TankState::Present(raw_sensor_value_mv.await.unwrap()), Ok(raw_sensor_value_mv) => {
TankState::Present(raw_sensor_value_mv)
},
Err(err) => TankState::Error(TankError::BoardError { message: err.to_string() }), Err(err) => TankState::Error(TankError::BoardError { message: err.to_string() }),
} }
} else { } else {

View File

@@ -2,7 +2,7 @@ macro_rules! mk_static {
($t:ty,$val:expr) => {{ ($t:ty,$val:expr) => {{
static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new();
#[deny(unused_attributes)] #[deny(unused_attributes)]
let x = STATIC_CELL.uninit().write(($val)); let x = STATIC_CELL.uninit().write($val);
x x
}}; }};
} }

View File

@@ -80,10 +80,7 @@ where
{ {
let mut board = BOARD_ACCESS.get().await.lock().await; let mut board = BOARD_ACCESS.get().await.lock().await;
let tank_state = determine_tank_state(&mut board).await; let tank_state = determine_tank_state(&mut board).await;
//should be multisampled let water_temp: FatResult<f32> = board.board_hal.get_tank_sensor().water_temperature_c().await;
let sensor = board.board_hal.get_tank_sensor()?;
let water_temp: FatResult<f32> = sensor.water_temperature_c().await;
Ok(Some(serde_json::to_string(&tank_state.as_mqtt_info( Ok(Some(serde_json::to_string(&tank_state.as_mqtt_info(
&board.board_hal.get_config().tank, &board.board_hal.get_config().tank,
&water_temp, &water_temp,