Add configuration options

Needing the yaml pull request to be merged in confy before switching to the official crate.
This commit is contained in:
Zykino 2020-03-27 18:45:39 +01:00
parent 443a4e0c11
commit 3686da12ae
6 changed files with 300 additions and 27 deletions

174
Cargo.lock generated
View File

@ -1,5 +1,77 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "backtrace"
version = "0.3.46"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e"
dependencies = [
"backtrace-sys",
"cfg-if",
"libc",
"rustc-demangle",
]
[[package]]
name = "backtrace-sys"
version = "0.1.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "cc"
version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "confy"
version = "0.3.2-alpha.0"
source = "git+https://github.com/GoWebProd/confy#7e9dac7c54ad3f123a196b1565cf08efb68241e1"
dependencies = [
"failure",
"serde",
"serde_yaml",
]
[[package]]
name = "dtoa"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3"
[[package]]
name = "failure"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b"
dependencies = [
"backtrace",
"failure_derive",
]
[[package]]
name = "failure_derive"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231"
dependencies = [
"proc-macro2",
"quote",
"syn",
"synstructure",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -12,6 +84,30 @@ version = "0.2.67"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018"
[[package]]
name = "linked-hash-map"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
[[package]]
name = "proc-macro2"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rppal"
version = "0.11.3"
@ -22,9 +118,87 @@ dependencies = [
"libc",
]
[[package]]
name = "rustc-demangle"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
[[package]]
name = "serde"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_yaml"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35"
dependencies = [
"dtoa",
"linked-hash-map",
"serde",
"yaml-rust",
]
[[package]]
name = "syn"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "synstructure"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
dependencies = [
"proc-macro2",
"quote",
"syn",
"unicode-xid",
]
[[package]]
name = "tempi"
version = "0.1.0"
dependencies = [
"confy",
"rppal",
"serde",
]
[[package]]
name = "unicode-xid"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
[[package]]
name = "yaml-rust"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d"
dependencies = [
"linked-hash-map",
]

View File

@ -7,5 +7,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
confy = { git = "https://github.com/GoWebProd/confy" } #"0.4.0" # Will need something more than this version to have yaml support
rppal = "0.11.3"
#serde_derive = "1.0.104"
serde = { version = "1.0.104", features = ["derive"] }

36
src/config.rs Normal file
View File

@ -0,0 +1,36 @@
use crate::fan::hysteresis::HysteresisConfig;
use crate::fan::pwm::PwmConfig;
use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Serialize, Deserialize)]
pub struct Config {
pub check_interval: Duration,
pub mode: FanMode,
pub verbosity_mode: VerbosityMode,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum FanMode {
Hysteresis(HysteresisConfig),
Pwm(PwmConfig),
}
#[derive(Debug, Serialize, Deserialize)]
pub enum VerbosityMode {
Human,
Machine,
Quiet,
}
impl Default for Config {
fn default() -> Self {
Config {
check_interval: Duration::from_secs(10),
mode: FanMode::Hysteresis(HysteresisConfig::default()),
//mode: FanMode::Pwm(PwmConfig::default()),
verbosity_mode: VerbosityMode::Human,
}
}
}

View File

@ -1,23 +1,41 @@
use crate::fan::Fan;
use rppal::gpio::{Gpio, OutputPin};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct HysteresisConfig {
max_temperature: f64,
hysteresis: f64,
bcm_pin: u8,
}
impl Default for HysteresisConfig {
fn default() -> Self {
HysteresisConfig {
max_temperature: 70_f64,
hysteresis: 10_f64,
bcm_pin: 18,
}
}
}
pub struct Hysteresis {
pub max_temperature: f64,
pub hysteresis: f64,
max_temperature: f64,
hysteresis: f64,
pin: OutputPin,
}
impl Hysteresis {
pub fn new(max_temperature: f64, hysteresis: f64, bcm_pin: u8) -> Hysteresis {
pub fn new(config: HysteresisConfig) -> Self {
let gpio = Gpio::new().unwrap();
let mut pin = gpio.get(bcm_pin).unwrap().into_output();
let mut pin = gpio.get(config.bcm_pin).unwrap().into_output();
pin.set_low();
Hysteresis {
max_temperature,
hysteresis,
max_temperature: config.max_temperature,
hysteresis: config.hysteresis,
pin,
}
}

View File

@ -1,21 +1,56 @@
use crate::fan::Fan;
use rppal::pwm::{Channel, Polarity, Pwm as Pwm_rpi};
use serde::{Deserialize, Serialize};
// See: https://serde/rs/remote-derive.html
#[derive(Serialize, Deserialize)]
#[serde(remote = "Channel")]
pub enum ChannelDef {
Pwm0,
Pwm1,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct PwmConfig {
max_temperature: f64,
min_temperature: f64,
frequency: f64,
#[serde(with = "ChannelDef")]
channel: Channel,
}
impl Default for PwmConfig {
fn default() -> Self {
PwmConfig {
max_temperature: 70_f64,
min_temperature: 60_f64,
frequency: 0.1_f64,
channel: Channel::Pwm0,
}
}
}
pub struct Pwm {
pub max_temperature: f64,
pub min_temperature: f64,
max_temperature: f64,
min_temperature: f64,
pwm: Pwm_rpi,
}
impl Pwm {
pub fn new(max_temperature: f64, min_temperature: f64, bcm_pin: Channel) -> Pwm {
let pwm =
Pwm_rpi::with_frequency(bcm_pin, 0.1_f64, 0_f64, Polarity::Normal, false).unwrap();
pub fn new(config: PwmConfig) -> Self {
let pwm = Pwm_rpi::with_frequency(
config.channel,
config.frequency,
0_f64,
Polarity::Normal,
false,
)
.unwrap();
Pwm {
max_temperature,
min_temperature,
max_temperature: config.max_temperature,
min_temperature: config.min_temperature,
pwm,
}
}

View File

@ -1,22 +1,26 @@
mod config;
mod fan;
mod temperatures;
use config::{Config, FanMode::*, VerbosityMode::*};
use fan::hysteresis::Hysteresis;
use fan::pwm::Pwm;
use fan::Fan;
use temperatures::Temperatures;
use rppal::pwm::Channel;
use std::error::Error;
use std::thread;
use std::time::Duration;
fn main() -> Result<(), Box<dyn Error>> {
let mut temps = temperatures::Temperatures::new()?;
let mut temps = Temperatures::new()?;
let config: Config = confy::load("tempi").unwrap();
let mut fan: Box<dyn Fan> = if true {
Box::new(Hysteresis::new(52.0, 5.0, 18))
} else {
Box::new(Pwm::new(52.0, 42.0, Channel::Pwm0))
// Can be used to check configuration and/or save default one.
//confy::store("tempi", dbg!(&config)).unwrap();
let mut fan: Box<dyn Fan> = match config.mode {
Hysteresis(h) => Box::new(Hysteresis::new(h)),
Pwm(p) => Box::new(Pwm::new(p)),
};
loop {
@ -26,17 +30,21 @@ fn main() -> Result<(), Box<dyn Error>> {
Some(t) => {
fan.update_temperature(t);
println!(
match config.verbosity_mode {
Human => println!(
"CPU: {:.1}°C, fan is at {:.1}%",
t,
fan.percentage() * 100_f64
);
),
Machine => println!("{} | {}", t, fan.percentage()),
Quiet => (),
}
}
None => {
eprintln!("Recuring problem while getting the temperature");
}
}
thread::sleep(Duration::from_secs(5));
thread::sleep(config.check_interval);
}
}