Initial commit, MVP ready/hardcoded
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
/target
 | 
			
		||||
							
								
								
									
										30
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
# This file is automatically @generated by Cargo.
 | 
			
		||||
# It is not intended for manual editing.
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "lazy_static"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "libc"
 | 
			
		||||
version = "0.2.67"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rppal"
 | 
			
		||||
version = "0.11.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "137dbba1fb867daa27cda4c3cd6a11bca5bb5a1551f034cf9319b994846ddbe1"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "tempi"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "rppal",
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										11
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "tempi"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
authors = ["Zykino"]
 | 
			
		||||
edition = "2018"
 | 
			
		||||
 | 
			
		||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
rppal = "0.11.3"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								src/fan/hysteresis.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/fan/hysteresis.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
use crate::fan::Fan;
 | 
			
		||||
use crate::temperatures::Temperatures;
 | 
			
		||||
 | 
			
		||||
use rppal::gpio::{Gpio, OutputPin};
 | 
			
		||||
 | 
			
		||||
pub struct Hysteresis {
 | 
			
		||||
    pub max_temperature: f64,
 | 
			
		||||
    pub hysteresis: f64,
 | 
			
		||||
    pin: OutputPin,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Hysteresis {
 | 
			
		||||
    pub fn new(max_temperature: f64, hysteresis: f64, bcm_pin: u8) -> Hysteresis {
 | 
			
		||||
        let gpio = Gpio::new().unwrap();
 | 
			
		||||
        let mut pin = gpio.get(bcm_pin).unwrap().into_output();
 | 
			
		||||
 | 
			
		||||
        pin.set_low();
 | 
			
		||||
 | 
			
		||||
        Hysteresis {
 | 
			
		||||
            max_temperature,
 | 
			
		||||
            hysteresis,
 | 
			
		||||
            pin,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Fan for Hysteresis {
 | 
			
		||||
    fn update_temperature(&mut self, temperatures: &Temperatures) {
 | 
			
		||||
        if temperatures.cpu > self.max_temperature {
 | 
			
		||||
            self.pin.set_high();
 | 
			
		||||
        } else {
 | 
			
		||||
            if temperatures.cpu < self.max_temperature - self.hysteresis {
 | 
			
		||||
                self.pin.set_low();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn percentage(&self) -> f64 {
 | 
			
		||||
        if self.pin.is_set_high() {
 | 
			
		||||
            1_f64
 | 
			
		||||
        } else {
 | 
			
		||||
            0_f64
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								src/fan/mod.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/fan/mod.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
pub mod hysteresis;
 | 
			
		||||
pub mod pwm;
 | 
			
		||||
 | 
			
		||||
use crate::temperatures::Temperatures;
 | 
			
		||||
 | 
			
		||||
pub trait Fan {
 | 
			
		||||
    fn update_temperature(&mut self, _: &Temperatures);
 | 
			
		||||
    fn percentage(&self) -> f64;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								src/fan/pwm.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/fan/pwm.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
use crate::fan::Fan;
 | 
			
		||||
use crate::temperatures::Temperatures;
 | 
			
		||||
 | 
			
		||||
use rppal::pwm::{Channel, Polarity, Pwm as Pwm_rpi};
 | 
			
		||||
 | 
			
		||||
pub struct Pwm {
 | 
			
		||||
    pub max_temperature: f64,
 | 
			
		||||
    pub 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();
 | 
			
		||||
 | 
			
		||||
        Pwm {
 | 
			
		||||
            max_temperature,
 | 
			
		||||
            min_temperature,
 | 
			
		||||
            pwm,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Fan for Pwm {
 | 
			
		||||
    fn update_temperature(&mut self, temperatures: &Temperatures) {
 | 
			
		||||
        let percentage = (temperatures.cpu - self.min_temperature)
 | 
			
		||||
            / (self.max_temperature - self.min_temperature);
 | 
			
		||||
        let percentage = if percentage > 1_f64 {
 | 
			
		||||
            1_f64
 | 
			
		||||
        } else {
 | 
			
		||||
            percentage
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        if temperatures.cpu > self.min_temperature {
 | 
			
		||||
            self.pwm.enable().unwrap();
 | 
			
		||||
            self.pwm.set_duty_cycle(percentage).unwrap();
 | 
			
		||||
        } else {
 | 
			
		||||
            self.pwm.disable().unwrap();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn percentage(&self) -> f64 {
 | 
			
		||||
        self.pwm.duty_cycle().unwrap()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										32
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/main.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
mod fan;
 | 
			
		||||
mod temperatures;
 | 
			
		||||
 | 
			
		||||
use fan::hysteresis::Hysteresis;
 | 
			
		||||
use fan::pwm::Pwm;
 | 
			
		||||
use fan::Fan;
 | 
			
		||||
 | 
			
		||||
use rppal::pwm::Channel;
 | 
			
		||||
use std::thread;
 | 
			
		||||
use std::time::Duration;
 | 
			
		||||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let mut temps = temperatures::Temperatures::default();
 | 
			
		||||
 | 
			
		||||
    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))
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    loop {
 | 
			
		||||
        temps.update();
 | 
			
		||||
        fan.update_temperature(&temps);
 | 
			
		||||
        println!(
 | 
			
		||||
            "CPU: {:.1}°C, fan is at {:.1}%",
 | 
			
		||||
            temps.cpu,
 | 
			
		||||
            fan.percentage() * 100_f64
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        thread::sleep(Duration::from_secs(5));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										28
									
								
								src/temperatures.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/temperatures.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
use std::fs::File;
 | 
			
		||||
use std::io::prelude::*;
 | 
			
		||||
 | 
			
		||||
pub struct Temperatures {
 | 
			
		||||
    pub cpu: f64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Temperatures {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Temperatures {
 | 
			
		||||
            cpu: get_cpu_temp(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Temperatures {
 | 
			
		||||
    pub fn update(&mut self) {
 | 
			
		||||
        self.cpu = get_cpu_temp();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn get_cpu_temp() -> f64 {
 | 
			
		||||
    let mut f = File::open("/sys/class/thermal/thermal_zone0/temp").unwrap();
 | 
			
		||||
    let mut buffer = String::new();
 | 
			
		||||
    f.read_to_string(&mut buffer).unwrap();
 | 
			
		||||
 | 
			
		||||
    buffer.trim().parse::<f64>().unwrap() / 1_000_f64
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user