# HG changeset patch # User Matt Johnston # Date 1569161206 -28800 # Node ID 4424a8b30f9c10a9e320faa774b0685c90b77c1e # Parent a5721c02d3eee000338b82e05904a87e319c8024 config crate wants everything to be lower case diff -r a5721c02d3ee -r 4424a8b30f9c rust/src/config.rs --- a/rust/src/config.rs Sun Sep 22 20:35:40 2019 +0800 +++ b/rust/src/config.rs Sun Sep 22 22:06:46 2019 +0800 @@ -3,30 +3,29 @@ use super::types::*; #[derive(Deserialize,Serialize,Debug,Clone)] -#[allow(non_snake_case)] pub struct Config { - pub SENSOR_SLEEP: u64, - pub UPLOAD_SLEEP: u64, + pub sensor_sleep: u64, + pub upload_sleep: u64, - pub FRIDGE_DELAY: u64, - pub FRIDGE_WORT_INVALID_TIME: u64, + pub fridge_delay: u64, + pub fridge_wort_invalid_time: u64, - pub MAX_READINGS: u32, + pub max_readings: u32, - pub PARAMS_FILE: String, + pub params_file: String, - pub SENSOR_BASE_DIR: String, - pub FRIDGE_GPIO_PIN: u32, + pub sensor_base_dir: String, + pub fridge_gpio_pin: u32, - pub AMBIENT_NAME: String, - pub FRIDGE_NAME: String, - pub WORT_NAME: String, - pub INTERNAL_TEMPERATURE: String, + pub ambient_name: String, + pub fridge_name: String, + pub wort_name: String, + pub internal_temperature: String, - pub HMAC_KEY: String, - pub SERVER_URL: String, - pub UPDATE_URL: String, - pub SETTINGS_URL: String, + pub hmac_key: String, + pub server_url: String, + pub update_url: String, + pub settings_url: String, } impl Config { @@ -34,11 +33,17 @@ include_str!("defconfig.toml") } - pub fn load() -> Result { + pub fn load(conf_file: &str) -> Result { let mut c = config::Config::default(); - c.merge(config::File::from_str(Self::default_toml(), config::FileFormat::Toml)); - c.merge(config::File::with_name("local.conf")).unwrap(); + c.merge(config::File::from_str(Self::default_toml(), config::FileFormat::Toml)).expect("Bad default config"); + c.merge(config::File::with_name(conf_file)).or_else(|e| { + Err(match e { + config::ConfigError::NotFound(_) => TemplogError::new(&format!("Missing config {}", conf_file)), + _ => TemplogError::new(&format!("Problem parsing {}: {}", conf_file, e)), + }) + })?; c.merge(config::Environment::with_prefix("TEMPLOG")).unwrap(); + println!("c is {:?}", c); Ok(c.try_into().unwrap()) } } diff -r a5721c02d3ee -r 4424a8b30f9c rust/src/fridge.rs --- a/rust/src/fridge.rs Sun Sep 22 20:35:40 2019 +0800 +++ b/rust/src/fridge.rs Sun Sep 22 22:06:46 2019 +0800 @@ -61,8 +61,8 @@ ctx: &Context, r: Readings, _sender: Sender) { - self.temp_wort = r.get_temp(&self.config.WORT_NAME); - self.temp_fridge = r.get_temp(&self.config.FRIDGE_NAME); + self.temp_wort = r.get_temp(&self.config.wort_name); + self.temp_fridge = r.get_temp(&self.config.fridge_name); if self.temp_wort.is_some() { self.wort_valid_time = Instant::now(); @@ -121,13 +121,13 @@ temp_wort: None, temp_fridge: None, last_off_time: Instant::now(), - wort_valid_time: Instant::now() - Duration::new(config.FRIDGE_WORT_INVALID_TIME, 100), + wort_valid_time: Instant::now() - Duration::new(config.fridge_wort_invalid_time, 100), integrator: StepIntegrator::new(Duration::new(1, 0)), control: Self::make_control(&config), }; if nowait { - f.last_off_time -= Duration::new(config.FRIDGE_DELAY, 1); + f.last_off_time -= Duration::new(config.fridge_delay, 1); } f @@ -135,7 +135,7 @@ #[cfg(target_os = "linux")] fn make_control(config: &Config) -> FridgeControl { - let mut pin = Pin(config.FRIDGE_GPIO_PIN); + let mut pin = Pin(config.fridge_gpio_pin); // XXX better error handling? pin.export().expect("Exporting fridge gpio failed"); pin.set_direction(Direction::Low).expect("Fridge gpio direction failed"); @@ -185,7 +185,7 @@ // Safety to avoid bad things happening to the fridge motor (?) // When it turns off don't start up again for at least FRIDGE_DELAY - if !self.on && off_time < Duration::new(self.config.FRIDGE_DELAY, 0) { + if !self.on && off_time < Duration::new(self.config.fridge_delay, 0) { info!("fridge skipping, too early"); return; } @@ -202,7 +202,7 @@ if self.temp_wort.is_none() { let invalid_time = Instant::now() - self.wort_valid_time; warn!("Invalid wort sensor for {:?} secs", invalid_time); - if invalid_time < Duration::new(self.config.FRIDGE_WORT_INVALID_TIME, 0) { + if invalid_time < Duration::new(self.config.fridge_wort_invalid_time, 0) { warn!("Has only been invalid for {:?}, waiting", invalid_time); return; } diff -r a5721c02d3ee -r 4424a8b30f9c rust/src/main.rs --- a/rust/src/main.rs Sun Sep 22 20:35:40 2019 +0800 +++ b/rust/src/main.rs Sun Sep 22 22:06:46 2019 +0800 @@ -12,13 +12,16 @@ mod types; mod params; -use crate::config::Config; use riker::actors::*; use structopt::StructOpt; -fn run(cf: Config, nowait: bool, testmode: bool) { +use types::TemplogError; + +fn run(conf_file: &str, nowait: bool, testmode: bool) -> Result<(), TemplogError> { + + let cf = config::Config::load(conf_file)?; let sys = ActorSystem::new().unwrap(); let props = Props::new_args(params::ParamWaiter::new, cf.clone()); @@ -34,6 +37,7 @@ let props = Props::new_args(fridge::Fridge::new_actor, (cf.clone(), nowait)); sys.actor_of(props, "fridge").unwrap(); + Ok(()) } #[derive(Debug, StructOpt)] @@ -58,9 +62,13 @@ #[structopt(long)] nowait: bool, - /// Print default config (customise in local.conf) + /// Print default config (customise in local.toml) #[structopt(long)] defconf: bool, + + /// Config file + #[structopt(short = "c", long, default_value = "local.toml")] + config: String, } fn handle_args() -> Opt { @@ -68,7 +76,7 @@ if args.defconf { println!("Default configuration:\n{}\n\n{}", - "(custom options go in local.conf)", + "(custom options go in local.toml)", config::Config::default_toml()); std::process::exit(0); } @@ -103,7 +111,8 @@ info!("wort-templog"); debug!("debug mode"); - let config = config::Config::load().unwrap(); - - run(config, args.nowait, args.test); + let r = run(&args.config, args.nowait, args.test); + if let Err(e) = r { + println!("Error running: {}", e); + } } diff -r a5721c02d3ee -r 4424a8b30f9c rust/src/params.rs --- a/rust/src/params.rs Sun Sep 22 20:35:40 2019 +0800 +++ b/rust/src/params.rs Sun Sep 22 22:06:46 2019 +0800 @@ -60,7 +60,7 @@ } pub fn load(config: &Config) -> Params { - Self::try_load(&config.PARAMS_FILE) + Self::try_load(&config.params_file) .unwrap_or_else(|_| Params::defaults()) } @@ -148,14 +148,14 @@ } fn write_params(&self, params: &Params) { - let p = atomicwrites::AtomicFile::new(&self.config.PARAMS_FILE, atomicwrites::AllowOverwrite); + let p = atomicwrites::AtomicFile::new(&self.config.params_file, atomicwrites::AllowOverwrite); p.write(|f| { serde_json::to_writer(f, params) }); } fn do_poll(&mut self, ctx: &Context<::Msg>) -> Result<(), TemplogError> { - let url = self.config.SETTINGS_URL.clone(); + let url = self.config.settings_url.clone(); let etag = self.last_etag.borrow().clone(); let h = ctx.run(async move { Self::wait_updates(&url, &etag).await diff -r a5721c02d3ee -r 4424a8b30f9c rust/src/sensor.rs --- a/rust/src/sensor.rs Sun Sep 22 20:35:40 2019 +0800 +++ b/rust/src/sensor.rs Sun Sep 22 22:06:46 2019 +0800 @@ -37,7 +37,7 @@ fn pre_start(&mut self, ctx: &Context) { self.chan = Some(channel("readings", &ctx.system).unwrap()); - let dur = Duration::new(self.config.SENSOR_SLEEP,0); + let dur = Duration::new(self.config.sensor_sleep,0); ctx.schedule(Duration::from_millis(0), dur, ctx.myself(), None, SendReading); } } @@ -71,7 +71,7 @@ // multiline static ref THERM_RE: regex::Regex = regex::Regex::new("(?m).* YES\n.*t=(.*)\n").unwrap(); } - let mut path = PathBuf::from(&self.config.SENSOR_BASE_DIR); + let mut path = PathBuf::from(&self.config.sensor_base_dir); path.push(n); path.push("w1_slave"); let mut s = String::new(); @@ -88,7 +88,7 @@ fn sensor_names(&self) -> Result, TemplogError> { // TODO: needs to handle multiple busses. - let mut path = PathBuf::from(&self.config.SENSOR_BASE_DIR); + let mut path = PathBuf::from(&self.config.sensor_base_dir); path.push("w1_master_slaves"); let f = BufReader::new(File::open(path)?); @@ -109,7 +109,7 @@ fn pre_start(&mut self, ctx: &Context) { self.chan = Some(channel("readings", &ctx.system).unwrap()); - let dur = Duration::new(self.config.SENSOR_SLEEP,0); + let dur = Duration::new(self.config.sensor_sleep,0); ctx.schedule(Duration::from_millis(0), dur, ctx.myself(), None, SendReading); } }