Part 1 of V3 extraction in preperation of v4 and v3 software merge #16
| @@ -184,7 +184,12 @@ fn safe_main() -> anyhow::Result<()> { | ||||
|     } | ||||
|  | ||||
|     println!("cur is {}", cur); | ||||
|     board.update_charge_indicator(); | ||||
|     match board.battery_monitor.average_current_milli_ampere() { | ||||
|         Ok(charging) => { | ||||
|             board.set_charge_indicator(charging > 20) | ||||
|         } | ||||
|         Err(_) => {} | ||||
|     } | ||||
|  | ||||
|     if board.get_restart_to_conf() { | ||||
|         log(LogMessage::ConfigModeSoftwareOverride, 0, 0, "", ""); | ||||
| @@ -362,12 +367,12 @@ fn safe_main() -> anyhow::Result<()> { | ||||
|                 if pump_ineffective { | ||||
|                     log( | ||||
|                         LogMessage::ConsecutivePumpCountLimit, | ||||
|                         pump_count as u32, | ||||
|                         pump_count, | ||||
|                         plant_config.max_consecutive_pump_count as u32, | ||||
|                         &(plant_id+1).to_string(), | ||||
|                         "", | ||||
|                     ); | ||||
|                     board.fault(plant_id, true); | ||||
|                     board.fault(plant_id, true)?; | ||||
|                 } | ||||
|                 log( | ||||
|                     LogMessage::PumpPlant, | ||||
| @@ -638,28 +643,30 @@ fn wait_infinity(wait_type: WaitType, reboot_now: Arc<AtomicBool>) -> ! { | ||||
|     loop { | ||||
|         unsafe { | ||||
|             let mut lock = BOARD_ACCESS.lock().unwrap(); | ||||
|             lock.update_charge_indicator(); | ||||
|             if let Ok(charging) = lock.battery_monitor.average_current_milli_ampere() { | ||||
|                 lock.set_charge_indicator(charging > 20) | ||||
|             } | ||||
|             match wait_type { | ||||
|                 WaitType::MissingConfig => { | ||||
|                     // Keep existing behavior: circular filling pattern | ||||
|                     led_count %= 8; | ||||
|                     led_count += 1; | ||||
|                     for i in 0..8 { | ||||
|                         lock.fault(i, i < led_count); | ||||
|                         let _ = lock.fault(i, i < led_count); | ||||
|                     } | ||||
|                 } | ||||
|                 WaitType::ConfigButton => { | ||||
|                     // Alternating pattern: 1010 1010 -> 0101 0101 | ||||
|                     pattern_step = (pattern_step + 1) % 2; | ||||
|                     for i in 0..8 { | ||||
|                         lock.fault(i, (i + pattern_step) % 2 == 0); | ||||
|                         let _ = lock.fault(i, (i + pattern_step) % 2 == 0); | ||||
|                     } | ||||
|                 } | ||||
|                 WaitType::MqttConfig => { | ||||
|                     // Moving dot pattern | ||||
|                     pattern_step = (pattern_step + 1) % 8; | ||||
|                     for i in 0..8 { | ||||
|                         lock.fault(i, i == pattern_step); | ||||
|                         let _ = lock.fault(i, i == pattern_step); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -672,7 +679,7 @@ fn wait_infinity(wait_type: WaitType, reboot_now: Arc<AtomicBool>) -> ! { | ||||
|  | ||||
|             // Clear all LEDs | ||||
|             for i in 0..8 { | ||||
|                 lock.fault(i, false); | ||||
|                 let _ = lock.fault(i, false); | ||||
|             } | ||||
|             drop(lock); | ||||
|             vTaskDelay(delay); | ||||
|   | ||||
| @@ -63,7 +63,7 @@ use one_wire_bus::OneWire; | ||||
| use crate::config::PlantControllerConfig; | ||||
| use crate::log::log; | ||||
| use crate::plant_hal::BoardHal::V3; | ||||
| use crate::{to_string, STAY_ALIVE}; | ||||
| use crate::{plant_hal, to_string, STAY_ALIVE}; | ||||
|  | ||||
| //Only support for 8 right now! | ||||
| pub const PLANT_COUNT: usize = 8; | ||||
| @@ -167,6 +167,9 @@ pub struct HAL<'a>{ | ||||
| } | ||||
|  | ||||
| pub enum BatteryMonitor<'a> { | ||||
|     Disabled { | ||||
|  | ||||
|     }, | ||||
|     BQ34Z100G1 { | ||||
|         battery_driver: Bq34z100g1Driver<MutexDevice<'a, I2cDriver<'a>>, Delay> | ||||
|     }, | ||||
| @@ -176,6 +179,9 @@ pub enum BatteryMonitor<'a> { | ||||
| } | ||||
|  | ||||
| pub enum BoardHal<'a>{ | ||||
|     Initial { | ||||
|  | ||||
|     }, | ||||
|     V3 { | ||||
|         shift_register: ShiftRegister40< | ||||
|             PinDriver<'a, esp_idf_hal::gpio::AnyIOPin, InputOutput>, | ||||
| @@ -269,6 +275,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             } | ||||
|             BatteryMonitor::Disabled {} => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -282,6 +291,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -295,6 +307,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -308,6 +323,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -321,6 +339,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -334,6 +355,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -347,6 +371,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -360,6 +387,9 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -373,30 +403,26 @@ impl BatteryInteraction for BatteryMonitor<'_> { | ||||
|             }, | ||||
|             BatteryMonitor::WchI2cSlave { .. } => { | ||||
|                 bail!("Not implemented") | ||||
|             }, | ||||
|             &mut BatteryMonitor::Disabled {  } => { | ||||
|                 bail!("Battery monitor is disabled") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl BoardInteraction for HAL<'_> { | ||||
|     fn update_charge_indicator(&mut self) { | ||||
|         let is_charging = match &mut self.battery_monitor { | ||||
|             BatteryMonitor::BQ34Z100G1 { battery_driver, .. } => { | ||||
|                 match battery_driver.average_current() { | ||||
|                     OkStd(current) => current < 20, | ||||
|                     Err(_) => false, | ||||
|                 } | ||||
|             } | ||||
|             _ => false | ||||
|         }; | ||||
|  | ||||
|     fn set_charge_indicator(&mut self, charging: bool) { | ||||
|         match &mut self.board_hal { | ||||
|             BoardHal::V3 { shift_register, .. } => { | ||||
|                 shift_register.decompose()[CHARGING] | ||||
|                     .set_state(is_charging.into()) | ||||
|                     .set_state(charging.into()) | ||||
|                     .unwrap(); | ||||
|             } | ||||
|             BoardHal::V4 { .. } => {} | ||||
|             BoardHal::V4 { .. } => {}, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|  | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     fn deep_sleep(&mut self, duration_in_ms: u64) -> ! { | ||||
| @@ -404,7 +430,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|             BoardHal::V3 { shift_register, .. } => { | ||||
|                 shift_register.decompose()[AWAKE].set_low().unwrap(); | ||||
|             } | ||||
|             BoardHal::V4 { .. } => {} | ||||
|             BoardHal::V4 { .. } => {}, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|  | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         unsafe { | ||||
| @@ -426,7 +455,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|     fn get_backup_info(&mut self) -> Result<BackupHeader> { | ||||
|         let eeprom = match &mut self.board_hal { | ||||
|             BoardHal::V3 {  eeprom, .. } => {eeprom} | ||||
|             BoardHal::V4 { eeprom, .. } => {eeprom } | ||||
|             BoardHal::V4 { eeprom, .. } => {eeprom }, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|         let dummy = BackupHeader { | ||||
|             timestamp: 0, | ||||
| @@ -448,6 +480,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|         let eeprom = match &mut self.board_hal { | ||||
|             BoardHal::V3 {  eeprom, .. } => {eeprom} | ||||
|             BoardHal::V4 { eeprom, .. } => {eeprom } | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         let dummy = BackupHeader { | ||||
| @@ -489,7 +524,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|             V3 {  eeprom, .. } => { | ||||
|                 eeprom | ||||
|             } | ||||
|             BoardHal::V4 { eeprom, .. } => { eeprom } | ||||
|             BoardHal::V4 { eeprom, .. } => { eeprom }, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         let delay = Delay::new_default(); | ||||
| @@ -530,6 +568,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|                     eeprom | ||||
|                 } | ||||
|                 BoardHal::V4 { eeprom, .. } => { eeprom } | ||||
|                 &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                     bail!("Board not configured yet") | ||||
|                 } | ||||
|             }; | ||||
|             match eeprom.write_page(address, chunk) { | ||||
|                 OkStd(_) => {} | ||||
| @@ -642,6 +683,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|         match & self.board_hal { | ||||
|             BoardHal::V3 {  solar_is_day, .. } => {solar_is_day.get_level().into()} | ||||
|             BoardHal::V4 { solar_is_day, .. } => {solar_is_day.get_level().into() } | ||||
|             plant_hal::BoardHal::Initial {} => { | ||||
|                 false | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     //should be multsampled | ||||
| @@ -679,6 +723,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|         let (tank_power, tank_channel) = match &mut self.board_hal { | ||||
|             BoardHal::V3 {  tank_power, tank_channel, .. } => {(tank_power,tank_channel)} | ||||
|             BoardHal::V4 { tank_power, tank_channel, .. } => {(tank_power,tank_channel) } | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|  | ||||
| @@ -711,7 +758,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|     fn light(&mut self, enable: bool) -> Result<()> { | ||||
|         let light = match &mut self.board_hal { | ||||
|             BoardHal::V3 { light, .. } => light, | ||||
|             BoardHal::V4 { light, .. } => light | ||||
|             BoardHal::V4 { light, .. } => light, | ||||
|                 &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         unsafe { gpio_hold_dis(light.pin()) }; | ||||
| @@ -736,7 +786,12 @@ impl BoardInteraction for HAL<'_> { | ||||
|                 //currently infallible error, keep for future as result anyway | ||||
|                 shift_register.decompose()[index].set_state(enable.into())?; | ||||
|             } | ||||
|             BoardHal::V4 { .. } => {} | ||||
|             BoardHal::V4 { .. } => { | ||||
|                 bail!("Not yet implemented") | ||||
|             }, | ||||
|             &plant_hal::BoardHal::Initial {} => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         Ok(()) | ||||
| @@ -758,7 +813,7 @@ impl BoardInteraction for HAL<'_> { | ||||
|     fn consecutive_pump_count(&mut self, plant: usize) -> u32 { | ||||
|         unsafe { CONSECUTIVE_WATERING_PLANT[plant] } | ||||
|     } | ||||
|     fn fault(& self, plant: usize, enable: bool) { | ||||
|     fn fault(& self, plant: usize, enable: bool) -> Result<()>{ | ||||
|         match & self.board_hal { | ||||
|             V3 { shift_register, .. } => { | ||||
|                 let index = match plant { | ||||
| @@ -773,11 +828,15 @@ impl BoardInteraction for HAL<'_> { | ||||
|                     _ => panic!("Invalid plant id {}", plant), | ||||
|                 }; | ||||
|                 shift_register.decompose()[index] | ||||
|                     .set_state(enable.into()) | ||||
|                     .unwrap() | ||||
|                     .set_state(enable.into())?; | ||||
|                 Ok(()) | ||||
|  | ||||
|             } | ||||
|             BoardHal::V4 { .. } => { | ||||
|  | ||||
|                 bail!("Not yet implemented") | ||||
|             } | ||||
|             &plant_hal::BoardHal::Initial {} => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -794,6 +853,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|             BoardHal::V4 { main_pump, .. } => { | ||||
|                 main_pump.set_state(enable.into())?; | ||||
|             } | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         } | ||||
|         Ok(()) | ||||
|  | ||||
| @@ -922,7 +984,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|     fn general_fault(&mut self, enable: bool) { | ||||
|         let general_fault = match &mut self.board_hal { | ||||
|             BoardHal::V3 {  general_fault, .. } => {general_fault} | ||||
|             BoardHal::V4 { general_fault,  .. } => {general_fault} | ||||
|             BoardHal::V4 { general_fault,  .. } => {general_fault}, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 return | ||||
|             } | ||||
|         }; | ||||
|         unsafe { gpio_hold_dis(general_fault.pin()) }; | ||||
|         general_fault.set_state(enable.into()).unwrap(); | ||||
| @@ -1056,7 +1121,10 @@ impl BoardInteraction for HAL<'_> { | ||||
|     fn get_rtc_time(&mut self) -> Result<DateTime<Utc>> { | ||||
|         let rtc = match &mut self.board_hal { | ||||
|             BoardHal::V3 { rtc, .. } => {rtc} | ||||
|             BoardHal::V4 { rtc, .. } => {rtc} | ||||
|             BoardHal::V4 { rtc, .. } => {rtc}, | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|         match rtc.datetime() { | ||||
|             OkStd(rtc_time) => Ok(rtc_time.and_utc()), | ||||
| @@ -1069,6 +1137,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|         let rtc = match &mut self.board_hal { | ||||
|             BoardHal::V3 { rtc, .. } => {rtc} | ||||
|             BoardHal::V4 { rtc, .. } => {rtc} | ||||
|             &mut plant_hal::BoardHal::Initial {  } => { | ||||
|                 bail!("Board not configured yet") | ||||
|             } | ||||
|         }; | ||||
|         let naive_time = time.naive_utc(); | ||||
|         match rtc.set_datetime(&naive_time) { | ||||
| @@ -1122,9 +1193,9 @@ impl BoardInteraction for HAL<'_> { | ||||
|         self.light(false)?; | ||||
|         unsafe { vTaskDelay(500) }; | ||||
|         for i in 0..PLANT_COUNT { | ||||
|             self.fault(i, true); | ||||
|             self.fault(i, true)?; | ||||
|             unsafe { vTaskDelay(500) }; | ||||
|             self.fault(i, false); | ||||
|             self.fault(i, false)?; | ||||
|             unsafe { vTaskDelay(500) }; | ||||
|         } | ||||
|         for i in 0..PLANT_COUNT { | ||||
| @@ -1381,7 +1452,7 @@ pub trait BatteryInteraction { | ||||
| } | ||||
|  | ||||
| pub trait BoardInteraction { | ||||
|     fn update_charge_indicator(&mut self); | ||||
|     fn set_charge_indicator(&mut self, charging: bool); | ||||
|     fn deep_sleep(&mut self, duration_in_ms: u64) -> !; | ||||
|     fn get_backup_info(&mut self) -> Result<BackupHeader>; | ||||
|     fn get_backup_config(&mut self) -> Result<Vec<u8>>; | ||||
| @@ -1403,7 +1474,7 @@ pub trait BoardInteraction { | ||||
|     fn store_last_pump_time(&mut self, plant: usize, time: DateTime<Utc>); | ||||
|     fn store_consecutive_pump_count(&mut self, plant: usize, count: u32); | ||||
|     fn consecutive_pump_count(&mut self, plant: usize) -> u32; | ||||
|     fn fault(&self, plant: usize, enable: bool); | ||||
|     fn fault(&self, plant: usize, enable: bool) -> Result<()>; | ||||
|     fn low_voltage_in_cycle(&mut self) -> bool; | ||||
|     fn any_pump(&mut self, enable: bool) -> Result<()>; | ||||
|     fn time(&mut self) -> Result<DateTime<Utc>>; | ||||
|   | ||||
| @@ -170,7 +170,7 @@ impl PlantState { | ||||
|             }, | ||||
|         }; | ||||
|         if state.is_err() { | ||||
|             board.fault(plant_id, true); | ||||
|             let _ = board.fault(plant_id, true); | ||||
|         } | ||||
|         state | ||||
|     } | ||||
|   | ||||
| @@ -328,7 +328,7 @@ fn ota( | ||||
|         let iter = (total_read / 1024) % 8; | ||||
|         if iter != lastiter { | ||||
|             for i in 0..PLANT_COUNT { | ||||
|                 board.fault(i, iter == i); | ||||
|                 let _ = board.fault(i, iter == i); | ||||
|             } | ||||
|             lastiter = iter; | ||||
|         } | ||||
| @@ -541,7 +541,7 @@ pub fn httpd(reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> { | ||||
|                         let iter = (total_read / 1024) % 8; | ||||
|                         if iter != lastiter { | ||||
|                             for i in 0..PLANT_COUNT { | ||||
|                                 lock.fault(i, iter == i); | ||||
|                                 let _ = lock.fault(i, iter == i); | ||||
|                             } | ||||
|                             lastiter = iter; | ||||
|                         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user