Add configuration options
Needing the yaml pull request to be merged in confy before switching to the official crate.
This commit is contained in:
parent
443a4e0c11
commit
3686da12ae
174
Cargo.lock
generated
174
Cargo.lock
generated
@ -1,5 +1,77 @@
|
|||||||
# This file is automatically @generated by Cargo.
|
# This file is automatically @generated by Cargo.
|
||||||
# It is not intended for manual editing.
|
# 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]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
@ -12,6 +84,30 @@ version = "0.2.67"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018"
|
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]]
|
[[package]]
|
||||||
name = "rppal"
|
name = "rppal"
|
||||||
version = "0.11.3"
|
version = "0.11.3"
|
||||||
@ -22,9 +118,87 @@ dependencies = [
|
|||||||
"libc",
|
"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]]
|
[[package]]
|
||||||
name = "tempi"
|
name = "tempi"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"confy",
|
||||||
"rppal",
|
"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",
|
||||||
]
|
]
|
||||||
|
@ -7,5 +7,7 @@ edition = "2018"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[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"
|
rppal = "0.11.3"
|
||||||
|
#serde_derive = "1.0.104"
|
||||||
|
serde = { version = "1.0.104", features = ["derive"] }
|
||||||
|
36
src/config.rs
Normal file
36
src/config.rs
Normal 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,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,23 +1,41 @@
|
|||||||
use crate::fan::Fan;
|
use crate::fan::Fan;
|
||||||
|
|
||||||
use rppal::gpio::{Gpio, OutputPin};
|
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 struct Hysteresis {
|
||||||
pub max_temperature: f64,
|
max_temperature: f64,
|
||||||
pub hysteresis: f64,
|
hysteresis: f64,
|
||||||
pin: OutputPin,
|
pin: OutputPin,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Hysteresis {
|
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 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();
|
pin.set_low();
|
||||||
|
|
||||||
Hysteresis {
|
Hysteresis {
|
||||||
max_temperature,
|
max_temperature: config.max_temperature,
|
||||||
hysteresis,
|
hysteresis: config.hysteresis,
|
||||||
pin,
|
pin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,56 @@
|
|||||||
use crate::fan::Fan;
|
use crate::fan::Fan;
|
||||||
|
|
||||||
use rppal::pwm::{Channel, Polarity, Pwm as Pwm_rpi};
|
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 struct Pwm {
|
||||||
pub max_temperature: f64,
|
max_temperature: f64,
|
||||||
pub min_temperature: f64,
|
min_temperature: f64,
|
||||||
pwm: Pwm_rpi,
|
pwm: Pwm_rpi,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Pwm {
|
impl Pwm {
|
||||||
pub fn new(max_temperature: f64, min_temperature: f64, bcm_pin: Channel) -> Pwm {
|
pub fn new(config: PwmConfig) -> Self {
|
||||||
let pwm =
|
let pwm = Pwm_rpi::with_frequency(
|
||||||
Pwm_rpi::with_frequency(bcm_pin, 0.1_f64, 0_f64, Polarity::Normal, false).unwrap();
|
config.channel,
|
||||||
|
config.frequency,
|
||||||
|
0_f64,
|
||||||
|
Polarity::Normal,
|
||||||
|
false,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
Pwm {
|
Pwm {
|
||||||
max_temperature,
|
max_temperature: config.max_temperature,
|
||||||
min_temperature,
|
min_temperature: config.min_temperature,
|
||||||
pwm,
|
pwm,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
34
src/main.rs
34
src/main.rs
@ -1,22 +1,26 @@
|
|||||||
|
mod config;
|
||||||
mod fan;
|
mod fan;
|
||||||
mod temperatures;
|
mod temperatures;
|
||||||
|
|
||||||
|
use config::{Config, FanMode::*, VerbosityMode::*};
|
||||||
use fan::hysteresis::Hysteresis;
|
use fan::hysteresis::Hysteresis;
|
||||||
use fan::pwm::Pwm;
|
use fan::pwm::Pwm;
|
||||||
use fan::Fan;
|
use fan::Fan;
|
||||||
|
use temperatures::Temperatures;
|
||||||
|
|
||||||
use rppal::pwm::Channel;
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::time::Duration;
|
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
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 {
|
// Can be used to check configuration and/or save default one.
|
||||||
Box::new(Hysteresis::new(52.0, 5.0, 18))
|
//confy::store("tempi", dbg!(&config)).unwrap();
|
||||||
} else {
|
|
||||||
Box::new(Pwm::new(52.0, 42.0, Channel::Pwm0))
|
let mut fan: Box<dyn Fan> = match config.mode {
|
||||||
|
Hysteresis(h) => Box::new(Hysteresis::new(h)),
|
||||||
|
Pwm(p) => Box::new(Pwm::new(p)),
|
||||||
};
|
};
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
@ -26,17 +30,21 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
Some(t) => {
|
Some(t) => {
|
||||||
fan.update_temperature(t);
|
fan.update_temperature(t);
|
||||||
|
|
||||||
println!(
|
match config.verbosity_mode {
|
||||||
"CPU: {:.1}°C, fan is at {:.1}%",
|
Human => println!(
|
||||||
t,
|
"CPU: {:.1}°C, fan is at {:.1}%",
|
||||||
fan.percentage() * 100_f64
|
t,
|
||||||
);
|
fan.percentage() * 100_f64
|
||||||
|
),
|
||||||
|
Machine => println!("{} | {}", t, fan.percentage()),
|
||||||
|
Quiet => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
eprintln!("Recuring problem while getting the temperature");
|
eprintln!("Recuring problem while getting the temperature");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thread::sleep(Duration::from_secs(5));
|
thread::sleep(config.check_interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user