fix palntstate not correctly calculated

This commit is contained in:
Empire 2024-03-09 15:21:52 +01:00
parent 869a581242
commit b4ad668620
2 changed files with 28 additions and 36 deletions

View File

@ -61,11 +61,12 @@ struct LightState {
is_day: bool, is_day: bool,
} }
#[derive(Copy, Clone, Debug, PartialEq, Default)] #[derive(Clone, Copy, Debug, PartialEq, Default)]
struct PlantState { struct PlantState {
a: Option<u8>, a: Option<u8>,
b: Option<u8>, b: Option<u8>,
p: Option<u8>, p: Option<u8>,
consecutive_pump_count: u32,
after_p: Option<u8>, after_p: Option<u8>,
do_water: bool, do_water: bool,
frozen: bool, frozen: bool,
@ -368,7 +369,6 @@ fn safe_main() -> anyhow::Result<()> {
..Default::default() ..Default::default()
}; PLANT_COUNT]; }; PLANT_COUNT];
let plant_to_pump = determine_next_plant( let plant_to_pump = determine_next_plant(
online_mode,
&mut plantstate, &mut plantstate,
europe_time, europe_time,
&tank_state, &tank_state,
@ -386,9 +386,14 @@ fn safe_main() -> anyhow::Result<()> {
let mut did_pump = false; let mut did_pump = false;
match plant_to_pump { match plant_to_pump {
Some(plant) => { Some(plant) => {
let mut state = plantstate[plant]; let state = &mut plantstate[plant];
let consecutive_pump_count = board.consecutive_pump_count(plant) + 1; state.consecutive_pump_count = board.consecutive_pump_count(plant) + 1;
board.store_consecutive_pump_count(plant, consecutive_pump_count); board.store_consecutive_pump_count(plant, state.consecutive_pump_count);
if state.consecutive_pump_count > config.max_consecutive_pump_count.into() {
state.not_effective = true;
board.fault(plant, true);
}
let plant_config = config.plants[plant]; let plant_config = config.plants[plant];
if plant_config.sensor_p { if plant_config.sensor_p {
@ -884,7 +889,6 @@ fn determine_state_target_moisture_for_plant(
} }
fn determine_next_plant( fn determine_next_plant(
online_mode: OnlineMode,
plantstate: &mut [PlantState; PLANT_COUNT], plantstate: &mut [PlantState; PLANT_COUNT],
cur: DateTime<Tz>, cur: DateTime<Tz>,
tank_state: &TankState, tank_state: &TankState,
@ -954,12 +958,8 @@ fn determine_next_plant(
{ {
board.fault(plant, true); board.fault(plant, true);
} }
if state.do_water { if !state.dry {
if board.consecutive_pump_count(plant) > config.max_consecutive_pump_count.into() { state.consecutive_pump_count = 0;
state.not_effective = true;
board.fault(plant, true);
}
} else {
board.store_consecutive_pump_count(plant, 0); board.store_consecutive_pump_count(plant, 0);
} }
println!("Plant {} state is {:?}", plant, state); println!("Plant {} state is {:?}", plant, state);
@ -1032,7 +1032,11 @@ fn update_plant_state(
); );
} }
} }
let _ = board.mqtt_publish(
&config,
format!("/plant{}/active", plant + 1).as_str(),
state.active.to_string().as_bytes(),
);
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
&config, &config,
format!("/plant{}/Sensor A", plant + 1).as_str(), format!("/plant{}/Sensor A", plant + 1).as_str(),
@ -1116,6 +1120,13 @@ fn update_plant_state(
format!("/plant{}/Out of Work Hour", plant + 1).as_str(), format!("/plant{}/Out of Work Hour", plant + 1).as_str(),
state.out_of_work_hour.to_string().as_bytes(), state.out_of_work_hour.to_string().as_bytes(),
); );
let _ = board.mqtt_publish(
&config,
format!("/plant{}/consecutive pump count", plant + 1).as_str(),
state.consecutive_pump_count.to_string().as_bytes(),
);
} }
} }

View File

@ -240,12 +240,11 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
let mut percent = r2 / 190_f32 * 100_f32; let mut percent = r2 / 190_f32 * 100_f32;
percent = percent.clamp(0.0, 100.0); percent = percent.clamp(0.0, 100.0);
let quantizised = quantize_to_next_5_percent(percent as f64) as u16;
println!( println!(
"Tank sensor raw {} percent {} quantized {}", "Tank sensor raw {} percent {}",
median, percent, quantizised median, percent
); );
return Ok(quantizised); return Ok(percent as u16);
} }
fn set_low_voltage_in_cycle(&mut self) { fn set_low_voltage_in_cycle(&mut self) {
@ -723,7 +722,7 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
true, true,
message, message,
); );
Delay::new(10).delay_ms(10); Delay::new(10).delay_ms(50);
match publish { match publish {
OkStd(message_id) => { OkStd(message_id) => {
println!("Published mqtt topic {} with message {:#?} msgid is {:?}",full_topic, String::from_utf8_lossy(message), message_id); println!("Published mqtt topic {} with message {:#?} msgid is {:?}",full_topic, String::from_utf8_lossy(message), message_id);
@ -1029,21 +1028,3 @@ impl CreatePlantHal<'_> for PlantHal {
Ok(rv) Ok(rv)
} }
} }
fn quantize_to_next_5_percent(value: f64) -> i32 {
// Multiply by 100 to work with integer values
let multiplied_value = (value * 100.0).round() as i32;
// Calculate the remainder when divided by 5
let remainder = multiplied_value % 5;
// If the remainder is greater than or equal to half of 5, round up to the next 5%
let rounded_value = if remainder >= 2 {
multiplied_value + (5 - remainder)
} else {
multiplied_value - remainder
};
// Divide by 100 to get back to a float
rounded_value / 100
}