Nareshkumar Rao 7 months ago
parent
commit
efbe1a54fd
  1. 21
      growpi.toml
  2. 5
      src/cli_mode.rs
  3. 29
      src/config.rs
  4. 6
      src/io.rs

21
growpi.toml

@ -0,0 +1,21 @@
[board_settings]
logic_level = 3.3
[relay_settings]
light_pin = 0
fan_pin = 1
water_pump_pin = 2
relay_gpio_pins = [17, 27, 22, -1]
[soil_moisture_settings]
pin = 1
voltage_100 = 1.417
voltage_nominal = 2.823
moisture_nominal = 0.41
[thermistor_settings]
pin = 0
voltage_divider_resistance = 9700.0
nominal_resistance = 10000.0
nominal_temperature = 298.15
thermal_constant = 3950.0

5
src/cli_mode.rs

@ -160,7 +160,10 @@ fn init_state(config: &Configuration) -> GenericResult<ProgramState> {
pub fn run_cli() { pub fn run_cli() {
let mut rl = init_readline().unwrap(); let mut rl = init_readline().unwrap();
let config = Configuration::default();
let config =
Configuration::from_file(std::path::Path::new("./growpi.toml")).unwrap_or_default();
let mut program_state = init_state(&config).unwrap(); let mut program_state = init_state(&config).unwrap();
'cli_loop: loop { 'cli_loop: loop {

29
src/config.rs

@ -7,7 +7,7 @@ pub struct RelaySettings {
pub light_pin: u8, pub light_pin: u8,
pub fan_pin: u8, pub fan_pin: u8,
pub water_pump_pin: u8, pub water_pump_pin: u8,
pub relay_gpio_pins: Vec<Option<u8>>,
pub relay_gpio_pins: Vec<i16>,
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
@ -41,22 +41,18 @@ pub struct Configuration {
} }
impl Configuration { impl Configuration {
fn from_file(path: &std::path::Path) -> GenericResult<Configuration> {
pub fn from_file(path: &std::path::Path) -> GenericResult<Configuration> {
let text = std::fs::read_to_string(path)?; let text = std::fs::read_to_string(path)?;
let config: Configuration = toml::from_str(text.as_str())?;
let config = toml::from_str(text.as_str())?;
Ok(config) Ok(config)
} }
fn save_to_file(path: &std::path::Path, config: &Configuration) -> GenericResult<()> {
let text = toml::to_string_pretty(config)?;
pub fn save_to_file(&self, path: &std::path::Path) -> GenericResult<()> {
let text = toml::to_string_pretty(self)?;
std::fs::write(path, text)?; std::fs::write(path, text)?;
Ok(()) Ok(())
} }
} }
const THERMISTOR_NOMINAL_RESISTANCE: f32 = 10_000.;
const THERMISTOR_NOMINAL_TEMPERATURE: f32 = 298.15;
const THERMISTOR_CONSTANT: f32 = 3950.;
impl Default for Configuration { impl Default for Configuration {
fn default() -> Self { fn default() -> Self {
Self { Self {
@ -65,7 +61,7 @@ impl Default for Configuration {
light_pin: 0, light_pin: 0,
fan_pin: 1, fan_pin: 1,
water_pump_pin: 2, water_pump_pin: 2,
relay_gpio_pins: [Some(17), Some(27), Some(22), None].to_vec(),
relay_gpio_pins: [17, 27, 22, -1].to_vec(),
}, },
soil_moisture_settings: SoilMoistureSettings { soil_moisture_settings: SoilMoistureSettings {
pin: 1, pin: 1,
@ -83,3 +79,16 @@ impl Default for Configuration {
} }
} }
} }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_write_default() {
let config = Configuration::default();
config
.save_to_file(std::path::Path::new("./growpi.toml"))
.unwrap();
}
}

6
src/io.rs

@ -39,7 +39,11 @@ impl Relay {
.clone() .clone()
.into_iter() .into_iter()
.map(|pin| { .map(|pin| {
pin.and_then(|pin| {
match pin {
-1 => None,
_ => Some(pin as u8),
}
.and_then(|pin| {
let result = (|| -> GenericResult<OutputPin> { let result = (|| -> GenericResult<OutputPin> {
Ok(Gpio::new()?.get(pin)?.into_output()) Ok(Gpio::new()?.get(pin)?.into_output())
})(); })();

Loading…
Cancel
Save