|  | @@ -12,6 +12,40 @@ trait Sensor {
 | 
	
		
			
				|  |  |      fn status(&mut self) -> String;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +struct BatterySensor {
 | 
	
		
			
				|  |  | +    charge_now: File,
 | 
	
		
			
				|  |  | +    charge_full: File
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +impl BatterySensor {
 | 
	
		
			
				|  |  | +    fn new(supply: &str) -> BatterySensor {
 | 
	
		
			
				|  |  | +        let path = format!("/sys/class/power_supply/{}", supply);
 | 
	
		
			
				|  |  | +        BatterySensor {
 | 
	
		
			
				|  |  | +            charge_now: File::open(format!("{}/{}", path, "charge_now")).unwrap(),
 | 
	
		
			
				|  |  | +            charge_full: File::open(format!("{}/{}", path, "charge_full")).unwrap()
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +impl Sensor for BatterySensor {
 | 
	
		
			
				|  |  | +    fn status(&mut self) -> String {
 | 
	
		
			
				|  |  | +        let mut s = String::new();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.charge_now.read_to_string(&mut s).ok().expect("Could not read current charge");
 | 
	
		
			
				|  |  | +        let charge_now : u32 = s.trim().parse().ok().expect("Could not parse charge");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        s.clear();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.charge_full.read_to_string(&mut s).ok().expect("Could not read current charge");
 | 
	
		
			
				|  |  | +        let charge_full : u32 = s.trim().parse().ok().expect("Could not parse charge");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.charge_now.seek(SeekFrom::Start(0)).ok();
 | 
	
		
			
				|  |  | +        self.charge_full.seek(SeekFrom::Start(0)).ok();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        format!("{}%", charge_now / (charge_full / 100))
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  struct TempSensor {
 | 
	
		
			
				|  |  |      file: File
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -73,12 +107,17 @@ pub fn sensors(tx: &Channel, config: &Config) {
 | 
	
		
			
				|  |  |      let zone = config.lookup("sensors.thermal_zone").unwrap();
 | 
	
		
			
				|  |  |      let zone = zone.as_str().unwrap();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      let mut sensors: Vec<Box<Sensor>> = vec![
 | 
	
		
			
				|  |  |          Box::new(TempSensor::new(zone)),
 | 
	
		
			
				|  |  |          Box::new(TimeSensor::new("%Y-%m-%d %H:%M", false)),
 | 
	
		
			
				|  |  |          Box::new(TimeSensor::new("UTC %H:%M", true))
 | 
	
		
			
				|  |  |      ];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    let bat = config.lookup("sensors.battery");
 | 
	
		
			
				|  |  | +    let bat = bat.map(|bat| bat.as_str().unwrap());
 | 
	
		
			
				|  |  | +    bat.map(|bat| sensors.insert(0, Box::new(BatterySensor::new(bat))));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      loop {
 | 
	
		
			
				|  |  |          let status = sensors.iter_mut()
 | 
	
		
			
				|  |  |              .map(|sensor| sensor.status())
 |