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