we should be feature compatible with main version now!

This commit is contained in:
2025-09-30 22:37:45 +02:00
parent cfe23c8a09
commit cf58486cf5
5 changed files with 65 additions and 93 deletions

View File

@@ -7,6 +7,7 @@ use embassy_embedded_hal::shared_bus::I2cDeviceError;
use embassy_executor::SpawnError; use embassy_executor::SpawnError;
use embassy_sync::mutex::TryLockError; use embassy_sync::mutex::TryLockError;
use esp_hal::i2c::master::ConfigError; use esp_hal::i2c::master::ConfigError;
use esp_hal::pcnt::unit::{InvalidHighLimit, InvalidLowLimit};
use esp_wifi::wifi::WifiError; use esp_wifi::wifi::WifiError;
use ina219::errors::{BusVoltageReadError, ShuntVoltageReadError}; use ina219::errors::{BusVoltageReadError, ShuntVoltageReadError};
use littlefs2_core::PathError; use littlefs2_core::PathError;
@@ -263,3 +264,18 @@ impl From<Infallible> for FatError {
panic!("Infallible error: {:?}", value) panic!("Infallible error: {:?}", value)
} }
} }
impl From<InvalidLowLimit> for FatError {
fn from(value: InvalidLowLimit) -> Self {
FatError::String {
error: format!("{:?}", value),
}
}
}
impl From<InvalidHighLimit> for FatError {
fn from(value: InvalidHighLimit) -> Self {
FatError::String {
error: format!("{:?}", value),
}
}
}

View File

@@ -19,6 +19,10 @@ use embassy_sync::mutex::Mutex;
use embassy_time::Timer; use embassy_time::Timer;
use embedded_hal::digital::OutputPin as _; use embedded_hal::digital::OutputPin as _;
use esp_hal::gpio::{Flex, Input, InputConfig, Level, Output, OutputConfig, Pull}; use esp_hal::gpio::{Flex, Input, InputConfig, Level, Output, OutputConfig, Pull};
use esp_hal::pcnt::channel::CtrlMode::Keep;
use esp_hal::pcnt::channel::EdgeMode;
use esp_hal::pcnt::channel::EdgeMode::{Hold, Increment};
use esp_hal::pcnt::unit::Unit;
use measurements::{Current, Voltage}; use measurements::{Current, Voltage};
const PUMP8_BIT: usize = 0; const PUMP8_BIT: usize = 0;
@@ -81,6 +85,7 @@ pub struct V3<'a> {
light: Output<'a>, light: Output<'a>,
main_pump: Output<'a>, main_pump: Output<'a>,
general_fault: Output<'a>, general_fault: Output<'a>,
pub signal_counter: Unit<'static, 0>,
} }
pub(crate) fn create_v3( pub(crate) fn create_v3(
@@ -139,6 +144,18 @@ pub(crate) fn create_v3(
Output::new(peripherals.gpio21, Level::Low, OutputConfig::default()); Output::new(peripherals.gpio21, Level::Low, OutputConfig::default());
shift_register_enable_invert.set_low(); shift_register_enable_invert.set_low();
let signal_counter = peripherals.pcnt0;
signal_counter.set_low_limit(Some(0))?;
signal_counter.set_high_limit(Some(i16::MAX))?;
let ch0 = &signal_counter.channel0;
let edge_pin = Input::new(peripherals.gpio22, InputConfig::default());
ch0.set_edge_signal(edge_pin.peripheral_input());
ch0.set_input_mode(Hold, Increment);
ch0.set_ctrl_mode(Keep, Keep);
signal_counter.listen();
Ok(Box::new(V3 { Ok(Box::new(V3 {
config, config,
battery_monitor, battery_monitor,
@@ -151,6 +168,7 @@ pub(crate) fn create_v3(
light, light,
main_pump, main_pump,
general_fault, general_fault,
signal_counter,
})) }))
} }
@@ -262,8 +280,8 @@ impl<'a> BoardInteraction<'a> for V3<'a> {
async fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> Result<f32, FatError> { async fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> Result<f32, FatError> {
let mut results = [0_f32; REPEAT_MOIST_MEASURE]; let mut results = [0_f32; REPEAT_MOIST_MEASURE];
for repeat in 0..REPEAT_MOIST_MEASURE { for repeat in 0..REPEAT_MOIST_MEASURE {
//self.signal_counter.counter_pause()?; self.signal_counter.pause();
//self.signal_counter.counter_clear()?; self.signal_counter.clear();
//Disable all //Disable all
{ {
let shift_register = self.shift_register.lock().await; let shift_register = self.shift_register.lock().await;
@@ -331,16 +349,16 @@ impl<'a> BoardInteraction<'a> for V3<'a> {
//give some time to stabilize //give some time to stabilize
Timer::after_millis(10).await; Timer::after_millis(10).await;
//self.signal_counter.counter_resume()?; self.signal_counter.resume();
Timer::after_millis(measurement).await; Timer::after_millis(measurement).await;
//self.signal_counter.counter_pause()?; self.signal_counter.pause();
{ {
let shift_register = self.shift_register.lock().await; let shift_register = self.shift_register.lock().await;
shift_register.decompose()[MS_4].set_high()?; shift_register.decompose()[MS_4].set_high()?;
shift_register.decompose()[SENSOR_ON].set_low()?; shift_register.decompose()[SENSOR_ON].set_low()?;
} }
Timer::after_millis(10).await; Timer::after_millis(10).await;
let unscaled = 1337; //self.signal_counter.get_counter_value()? as i32; let unscaled = self.signal_counter.value();
let hz = unscaled as f32 * factor; let hz = unscaled as f32 * factor;
LOG_ACCESS LOG_ACCESS
.lock() .lock()

View File

@@ -18,6 +18,8 @@ use crate::hal::v4_sensor::{SensorImpl, SensorInteraction};
use crate::log::{LogMessage, LOG_ACCESS}; use crate::log::{LogMessage, LOG_ACCESS};
use esp_hal::gpio::{Flex, Input, InputConfig, Level, Output, OutputConfig, Pull}; use esp_hal::gpio::{Flex, Input, InputConfig, Level, Output, OutputConfig, Pull};
use esp_hal::i2c::master::I2c; use esp_hal::i2c::master::I2c;
use esp_hal::pcnt::channel::CtrlMode::Keep;
use esp_hal::pcnt::channel::EdgeMode::{Hold, Increment};
use esp_hal::pcnt::Pcnt; use esp_hal::pcnt::Pcnt;
use esp_hal::twai::{EspTwaiFrame, StandardId, TwaiMode}; use esp_hal::twai::{EspTwaiFrame, StandardId, TwaiMode};
use esp_println::println; use esp_println::println;
@@ -174,28 +176,18 @@ pub(crate) async fn create_v4(
let sensor = match sensor_expander.pin_into_output(GPIOBank::Bank0, 0) { let sensor = match sensor_expander.pin_into_output(GPIOBank::Bank0, 0) {
Ok(_) => { Ok(_) => {
log::info!("SensorExpander answered"); log::info!("SensorExpander answered");
//pulse counter version
// let mut signal_counter = PcntDriver::new( let signal_counter = peripherals.pcnt0;
// peripherals.pcnt0,
// Some(peripherals.gpio22), signal_counter.set_low_limit(Some(0))?;
// Option::<AnyInputPin>::None, signal_counter.set_high_limit(Some(i16::MAX))?;
// Option::<AnyInputPin>::None,
// Option::<AnyInputPin>::None, let ch0 = &signal_counter.channel0;
// )?; let edge_pin = Input::new(peripherals.gpio22, InputConfig::default());
// ch0.set_edge_signal(edge_pin.peripheral_input());
// signal_counter.channel_config( ch0.set_input_mode(Hold, Increment);
// PcntChannel::Channel0, ch0.set_ctrl_mode(Keep, Keep);
// PinIndex::Pin0, signal_counter.listen();
// PinIndex::Pin1,
// &PcntChannelConfig {
// lctrl_mode: PcntControlMode::Keep,
// hctrl_mode: PcntControlMode::Keep,
// pos_mode: PcntCountMode::Increment,
// neg_mode: PcntCountMode::Hold,
// counter_h_lim: i16::MAX,
// counter_l_lim: 0,
// },
// )?;
for pin in 0..8 { for pin in 0..8 {
let _ = sensor_expander.pin_into_output(GPIOBank::Bank0, pin); let _ = sensor_expander.pin_into_output(GPIOBank::Bank0, pin);
@@ -205,7 +197,7 @@ pub(crate) async fn create_v4(
} }
SensorImpl::PulseCounter { SensorImpl::PulseCounter {
// signal_counter, signal_counter,
sensor_expander, sensor_expander,
} }
} }
@@ -300,7 +292,6 @@ pub(crate) async fn create_v4(
tank_sensor, tank_sensor,
light, light,
general_fault, general_fault,
//pump_ina,
pump_expander, pump_expander,
config, config,
battery_monitor, battery_monitor,

View File

@@ -1,7 +1,7 @@
use crate::fat_error::{FatError, FatResult};
use crate::hal::Box; use crate::hal::Box;
use crate::hal::Sensor; use crate::hal::Sensor;
use crate::log::{LogMessage, LOG_ACCESS}; use crate::log::{LogMessage, LOG_ACCESS};
use crate::fat_error::{FatError, FatResult};
use alloc::format; use alloc::format;
use alloc::string::ToString; use alloc::string::ToString;
use async_trait::async_trait; use async_trait::async_trait;
@@ -9,6 +9,7 @@ use embassy_embedded_hal::shared_bus::blocking::i2c::I2cDevice;
use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex; use embassy_sync::blocking_mutex::raw::CriticalSectionRawMutex;
use embassy_time::Timer; use embassy_time::Timer;
use esp_hal::i2c::master::I2c; use esp_hal::i2c::master::I2c;
use esp_hal::pcnt::unit::Unit;
use esp_hal::twai::Twai; use esp_hal::twai::Twai;
use esp_hal::Blocking; use esp_hal::Blocking;
use pca9535::{GPIOBank, Pca9535Immediate, StandardExpanderInterface}; use pca9535::{GPIOBank, Pca9535Immediate, StandardExpanderInterface};
@@ -29,7 +30,7 @@ const SENSOR_ON: u8 = 5_u8;
pub enum SensorImpl { pub enum SensorImpl {
PulseCounter { PulseCounter {
//signal_counter: PcntDriver<'a>, signal_counter: Unit<'static, 0>,
sensor_expander: sensor_expander:
Pca9535Immediate<I2cDevice<'static, CriticalSectionRawMutex, I2c<'static, Blocking>>>, Pca9535Immediate<I2cDevice<'static, CriticalSectionRawMutex, I2c<'static, Blocking>>>,
}, },
@@ -43,14 +44,14 @@ impl SensorInteraction for SensorImpl {
async fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> FatResult<f32> { async fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> FatResult<f32> {
match self { match self {
SensorImpl::PulseCounter { SensorImpl::PulseCounter {
//signal_counter, signal_counter,
sensor_expander, sensor_expander,
.. ..
} => { } => {
let mut results = [0_f32; REPEAT_MOIST_MEASURE]; let mut results = [0_f32; REPEAT_MOIST_MEASURE];
for repeat in 0..REPEAT_MOIST_MEASURE { for repeat in 0..REPEAT_MOIST_MEASURE {
//signal_counter.counter_pause()?; signal_counter.pause();
//signal_counter.counter_clear()?; signal_counter.clear();
//Disable all //Disable all
sensor_expander.pin_set_high(GPIOBank::Bank0, MS4)?; sensor_expander.pin_set_high(GPIOBank::Bank0, MS4)?;
@@ -90,9 +91,9 @@ impl SensorInteraction for SensorImpl {
//give some time to stabilize //give some time to stabilize
Timer::after_millis(10).await; Timer::after_millis(10).await;
//signal_counter.counter_resume()?; signal_counter.resume();
Timer::after_millis(measurement).await; Timer::after_millis(measurement).await;
//signal_counter.counter_pause()?; signal_counter.pause();
sensor_expander.pin_set_high(GPIOBank::Bank0, MS4)?; sensor_expander.pin_set_high(GPIOBank::Bank0, MS4)?;
sensor_expander.pin_set_low(GPIOBank::Bank0, SENSOR_ON)?; sensor_expander.pin_set_low(GPIOBank::Bank0, SENSOR_ON)?;
sensor_expander.pin_set_low(GPIOBank::Bank0, MS0)?; sensor_expander.pin_set_low(GPIOBank::Bank0, MS0)?;
@@ -121,9 +122,9 @@ impl SensorInteraction for SensorImpl {
let median = results[mid]; let median = results[mid];
Ok(median) Ok(median)
} }
SensorImpl::CanBus { twai } => { SensorImpl::CanBus { twai } => Err(FatError::String {
Err(FatError::String {error: "Not yet implemented".to_string()}) error: "Not yet implemented".to_string(),
} }),
} }
} }
} }

View File

@@ -763,60 +763,6 @@ async fn update_charge_indicator(
board: &mut MutexGuard<'static, CriticalSectionRawMutex, HAL<'static>>, board: &mut MutexGuard<'static, CriticalSectionRawMutex, HAL<'static>>,
) { ) {
//we have mppt controller, ask it for charging current //we have mppt controller, ask it for charging current
let tank_state = determine_tank_state(board).await;
if tank_state.is_enabled() {
if let Some(err) = tank_state.got_error(&board.board_hal.get_config().tank) {
match err {
TankError::SensorDisabled => { /* unreachable */ }
TankError::SensorMissing(raw_value_mv) => {
LOG_ACCESS
.lock()
.await
.log(
LogMessage::TankSensorMissing,
raw_value_mv as u32,
0,
"",
"",
)
.await
}
TankError::SensorValueError { value, min, max } => {
LOG_ACCESS
.lock()
.await
.log(
LogMessage::TankSensorValueRangeError,
min as u32,
max as u32,
&format!("{}", value),
"",
)
.await
}
TankError::BoardError(err) => {
LOG_ACCESS
.lock()
.await
.log(LogMessage::TankSensorBoardError, 0, 0, "", &err.to_string())
.await
}
}
// disabled cannot trigger this because of wrapping if is_enabled
board.board_hal.general_fault(true).await;
} else if tank_state
.warn_level(&board.board_hal.get_config().tank)
.is_ok_and(|warn| warn)
{
LOG_ACCESS
.lock()
.await
.log(LogMessage::TankWaterLevelLow, 0, 0, "", "")
.await;
board.board_hal.general_fault(true).await;
}
}
if let Ok(current) = board.board_hal.get_mptt_current().await { if let Ok(current) = board.board_hal.get_mptt_current().await {
let _ = board let _ = board
.board_hal .board_hal