use proper error handling

This commit is contained in:
ju6ge 2025-03-15 01:13:48 +01:00
parent 48b0777d94
commit b993f2b037
Signed by: judge
GPG Key ID: 6512C30DD8E017B5
2 changed files with 39 additions and 16 deletions

View File

@ -611,7 +611,7 @@ fn determine_state_target_moisture_for_plant(
plant: usize,
state: &mut PlantState,
config: &PlantControllerConfig,
tank_state: &TankInfo,
tank_state: &TankState,
cur: DateTime<Tz>,
) {
let plant_config = &config.plants[plant];
@ -657,10 +657,17 @@ fn determine_state_target_moisture_for_plant(
if a_low || b_low {
state.dry = true;
if tank_state.sensor_error && !config.tank.tank_allow_pumping_if_sensor_error {
//ignore is ok
} else if !tank_state.enough_water {
state.no_water = true;
match tank_state.enough_water(&config.tank) {
Err(_tank_err) => {
if !config.tank.tank_allow_pumping_if_sensor_error {
// ignore is ok
// wtf does this meen, shouldn't something happen if the configuration specifies
// that no water should flow if there was an error?
}
},
Ok(enough_water) => {
state.no_water = !enough_water
},
}
}
let duration = TimeDelta::try_minutes(plant_config.pump_cooldown_min as i64).unwrap();
@ -701,7 +708,7 @@ fn determine_state_timer_only_for_plant(
plant: usize,
state: &mut PlantState,
config: &PlantControllerConfig,
tank_state: &TankInfo,
tank_state: &TankState,
cur: DateTime<Tz>,
) {
let plant_config = &config.plants[plant];
@ -716,10 +723,15 @@ fn determine_state_timer_only_for_plant(
state.next_pump = Some(europe_time);
state.cooldown = true;
} else {
if tank_state.sensor_error && !config.tank.tank_allow_pumping_if_sensor_error {
state.do_water = true;
} else if !tank_state.enough_water {
state.no_water = true;
match tank_state.enough_water(&config.tank) {
Err(_tank_err) => {
if !config.tank.tank_allow_pumping_if_sensor_error {
state.do_water = true;
}
},
Ok(enough_water) => {
state.no_water = !enough_water;
},
}
}
}
@ -739,7 +751,7 @@ fn determine_state_timer_and_deadzone_for_plant(
plant: usize,
state: &mut PlantState,
config: &PlantControllerConfig,
tank_state: &TankInfo,
tank_state: &TankState,
cur: DateTime<Tz>,
) {
let plant_config = &config.plants[plant];
@ -762,10 +774,15 @@ fn determine_state_timer_and_deadzone_for_plant(
state.out_of_work_hour = true;
}
if !state.cooldown && !state.out_of_work_hour {
if tank_state.sensor_error && !config.tank.tank_allow_pumping_if_sensor_error {
state.do_water = true;
} else if !tank_state.enough_water {
state.no_water = true;
match tank_state.enough_water(&config.tank) {
Err(_tank_err) => {
if !config.tank.tank_allow_pumping_if_sensor_error {
state.do_water = true;
}
},
Ok(enough_water) => {
state.no_water = !enough_water;
},
}
}
}
@ -783,7 +800,7 @@ fn determine_state_timer_and_deadzone_for_plant(
fn determine_plant_state(
plantstate: &mut [PlantState; PLANT_COUNT],
cur: DateTime<Tz>,
tank_state: &TankInfo,
tank_state: &TankState,
config: &PlantControllerConfig,
board: &mut std::sync::MutexGuard<'_, PlantCtrlBoard<'_>>,
) {

View File

@ -123,6 +123,12 @@ impl TankState {
}
}
pub fn got_error(&self, config: &TankConfig) -> Option<TankError> {
match self {
TankState::TankSensorPresent(raw_value_mv) => raw_voltage_to_tank_fill_percent(*raw_value_mv, config).err(),
TankState::TankSensorDisabled => Some(TankError::SensorDisabled),
}
}
}