add initial flashing of batery and 3.1 adjustments
This commit is contained in:
@@ -48,10 +48,11 @@ use esp_idf_sys::{esp, gpio_hold_dis, gpio_hold_en, vTaskDelay, EspError};
|
||||
use one_wire_bus::OneWire;
|
||||
|
||||
use crate::config::{self, Config, WifiConfig};
|
||||
use crate::STAY_ALIVE;
|
||||
use crate::{plant_hal, STAY_ALIVE};
|
||||
|
||||
//Only support for 8 right now!
|
||||
pub const PLANT_COUNT: usize = 8;
|
||||
const REPEAT_MOIST_MEASURE: usize = 3;
|
||||
|
||||
const SPIFFS_PARTITION_NAME: &str = "storage";
|
||||
const WIFI_CONFIG_FILE: &str = "/spiffs/wifi.cfg";
|
||||
@@ -190,6 +191,7 @@ pub trait PlantCtrlBoardInteraction {
|
||||
fn mqtt_publish(&mut self, config: &Config, subtopic: &str, message: &[u8]) -> Result<()>;
|
||||
|
||||
fn sensor_multiplexer(&mut self, n: u8) -> Result<()>;
|
||||
fn flash_bq34_z100(&mut self, line: &str, dryrun:bool) -> Result<()>;
|
||||
}
|
||||
|
||||
pub trait CreatePlantHal<'a> {
|
||||
@@ -401,14 +403,6 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
|
||||
fn measure_moisture_hz(&mut self, plant: usize, sensor: Sensor) -> Result<i32> {
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.signal_counter.counter_clear()?;
|
||||
//Disable all
|
||||
self.shift_register.decompose()[MS_4]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
|
||||
|
||||
let sensor_channel = match sensor {
|
||||
Sensor::A => match plant {
|
||||
0 => SENSOR_A_1,
|
||||
@@ -434,34 +428,51 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
},
|
||||
};
|
||||
|
||||
self.sensor_multiplexer(sensor_channel)?;
|
||||
|
||||
self.shift_register.decompose()[MS_4]
|
||||
.set_low()
|
||||
.unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
|
||||
let delay = Delay::new_default();
|
||||
let measurement = 100;
|
||||
let factor = 1000 as f32 / measurement as f32;
|
||||
|
||||
//give some time to stabilize
|
||||
delay.delay_ms(10);
|
||||
self.signal_counter.counter_resume()?;
|
||||
delay.delay_ms(measurement);
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.shift_register.decompose()[MS_4]
|
||||
let mut results = [0;REPEAT_MOIST_MEASURE];
|
||||
for repeat in 0..REPEAT_MOIST_MEASURE {
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.signal_counter.counter_clear()?;
|
||||
//Disable all
|
||||
self.shift_register.decompose()[MS_4]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
|
||||
self.sensor_multiplexer(sensor_channel)?;
|
||||
|
||||
self.shift_register.decompose()[MS_4]
|
||||
.set_low()
|
||||
.unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_low()
|
||||
.unwrap();
|
||||
let unscaled = self.signal_counter.get_counter_value()? as i32;
|
||||
let hz = (unscaled as f32 * factor) as i32;
|
||||
println!("Measuring {:?} @ {} with {}", sensor, plant, hz);
|
||||
Ok(hz)
|
||||
|
||||
let delay = Delay::new_default();
|
||||
let measurement = 10;
|
||||
let factor = 1000 as f32 / measurement as f32;
|
||||
|
||||
//give some time to stabilize
|
||||
delay.delay_ms(10);
|
||||
self.signal_counter.counter_resume()?;
|
||||
delay.delay_ms(measurement);
|
||||
self.signal_counter.counter_pause()?;
|
||||
self.shift_register.decompose()[MS_4]
|
||||
.set_high()
|
||||
.unwrap();
|
||||
self.shift_register.decompose()[SENSOR_ON]
|
||||
.set_low()
|
||||
.unwrap();
|
||||
delay.delay_ms(10);
|
||||
let unscaled = self.signal_counter.get_counter_value()? as i32;
|
||||
let hz = (unscaled as f32 * factor) as i32;
|
||||
results[repeat] = hz;
|
||||
//println!("Measuring {:?} @ {} with {}", sensor, plant, hz);
|
||||
}
|
||||
results.sort();
|
||||
|
||||
let mid = results.len() / 2;
|
||||
|
||||
Ok(results[mid])
|
||||
}
|
||||
|
||||
fn general_fault(&mut self, enable: bool) {
|
||||
@@ -634,27 +645,9 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
|
||||
fn wifi_scan(&mut self) -> Result<Vec<AccessPointInfo>> {
|
||||
//remove this parts
|
||||
for i in 1..11 {
|
||||
println!("Scanning channel {}", i);
|
||||
self.wifi_driver.start_scan(
|
||||
&ScanConfig {
|
||||
scan_type: ScanType::Passive(Duration::from_secs(1)),
|
||||
show_hidden: false,
|
||||
channel: Some(i),
|
||||
..Default::default()
|
||||
},
|
||||
true,
|
||||
)?;
|
||||
let sr = self.wifi_driver.get_scan_result()?;
|
||||
for r in sr.iter() {
|
||||
println!("Found wifi {}", r.ssid);
|
||||
}
|
||||
}
|
||||
|
||||
self.wifi_driver.start_scan(
|
||||
&ScanConfig {
|
||||
scan_type: ScanType::Passive(Duration::from_secs(1)),
|
||||
scan_type: ScanType::Passive(Duration::from_secs(5)),
|
||||
show_hidden: false,
|
||||
..Default::default()
|
||||
},
|
||||
@@ -685,24 +678,25 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
unsafe { vTaskDelay(500) };
|
||||
self.light(false)?;
|
||||
unsafe { vTaskDelay(500) };
|
||||
for i in 0..8 {
|
||||
for i in 0..PLANT_COUNT {
|
||||
self.fault(i, true);
|
||||
unsafe { vTaskDelay(500) };
|
||||
self.fault(i, false);
|
||||
unsafe { vTaskDelay(500) };
|
||||
}
|
||||
for i in 0..8 {
|
||||
for i in 0..PLANT_COUNT {
|
||||
self.pump(i, true)?;
|
||||
unsafe { vTaskDelay(100) };
|
||||
self.pump(i, false)?;
|
||||
unsafe { vTaskDelay(100) };
|
||||
}
|
||||
for i in 0..8 {
|
||||
self.measure_moisture_hz(i, Sensor::A)?;
|
||||
}
|
||||
for i in 0..8 {
|
||||
self.measure_moisture_hz(i, Sensor::B)?;
|
||||
for plant in 0..PLANT_COUNT {
|
||||
let a = self.measure_moisture_hz(plant, plant_hal::Sensor::A);
|
||||
let b = self.measure_moisture_hz(plant, plant_hal::Sensor::B);
|
||||
print!("P:{} a:{:?} b:{:?}", plant, a ,b)
|
||||
}
|
||||
println!();
|
||||
Delay::new_default().delay_ms(10);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1012,6 +1006,16 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn flash_bq34_z100(&mut self, line: &str, dryrun: bool) -> Result<()> {
|
||||
match &mut self.battery_driver {
|
||||
Some(driver) => match driver.write_flash_stream_i2c(line, dryrun) {
|
||||
OkStd(r) => Ok(r),
|
||||
Err(err) => bail!("Error reading SoC {:?}", err),
|
||||
},
|
||||
None => bail!("Error reading SoC bq34z100 not found"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn print_battery(
|
||||
@@ -1096,7 +1100,7 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
|
||||
let mut battery_driver: Bq34z100g1Driver<I2cDriver, Delay> = Bq34z100g1Driver {
|
||||
i2c: driver,
|
||||
delay: Delay::new_default(),
|
||||
delay: Delay::new(0),
|
||||
flash_block_data: [0; 32],
|
||||
};
|
||||
|
||||
@@ -1115,6 +1119,8 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
one_wire_pin.set_pull(Pull::Floating).unwrap();
|
||||
|
||||
//disable all
|
||||
let ms0 = &mut shift_register.decompose()[MS_0];
|
||||
ms0.set_low()?;
|
||||
let ms1 = &mut shift_register.decompose()[MS_1];
|
||||
ms1.set_low()?;
|
||||
let ms2 = &mut shift_register.decompose()[MS_2];
|
||||
@@ -1123,7 +1129,7 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
ms3.set_low()?;
|
||||
|
||||
let ms4 = &mut shift_register.decompose()[MS_4];
|
||||
ms4.set_low()?;
|
||||
ms4.set_high()?;
|
||||
|
||||
//init,reset rtc memory depending on cause
|
||||
let reasons = ResetReason::get();
|
||||
@@ -1249,8 +1255,8 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
println!("Managed to comunnicate with battery");
|
||||
}
|
||||
|
||||
let mut shift_register_enable_invert = PinDriver::output(peripherals.pins.gpio21.downgrade())?;
|
||||
shift_register_enable_invert.set_low().unwrap();
|
||||
|
||||
let shift_register_enable_invert = PinDriver::output(peripherals.pins.gpio21.downgrade())?;
|
||||
|
||||
let rv = Mutex::new(PlantCtrlBoard {
|
||||
shift_register,
|
||||
@@ -1269,6 +1275,15 @@ impl CreatePlantHal<'_> for PlantHal {
|
||||
//battery_driver: None,
|
||||
battery_driver: Some(battery_driver),
|
||||
});
|
||||
|
||||
let _ = rv.lock().is_ok_and(|mut board|{
|
||||
unsafe { gpio_hold_dis(board.shift_register_enable_invert.pin())};
|
||||
board.shift_register_enable_invert.set_low().unwrap();
|
||||
unsafe { gpio_hold_en(board.shift_register_enable_invert.pin())};
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
Ok(rv)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user