sensors.rs
1 use alloc::string::String as AllocString; 2 use core::fmt::Write; 3 4 use crate::{hardware, services::system}; 5 6 pub fn run() -> AllocString { 7 let mut out = AllocString::new(); 8 let snapshot = system::snapshot(); 9 let i2c_status = hardware::i2c::snapshot(); 10 11 let _ = write!(out, "\r\n"); 12 13 for sensor in snapshot.sensors.inventory.iter() { 14 let mut line = AllocString::new(); 15 let transport = sensor.transport_summary(); 16 let _ = write!(line, "\x1b[1m{}\x1b[0m", sensor.model); 17 18 if let Some(reading) = sensor.carbon_dioxide_reading() { 19 if reading.ok { 20 let _ = write!( 21 line, 22 " co2=\x1b[1;32m{:.1}\x1b[0m ppm temp=\x1b[1;33m{:.1}\x1b[0m\u{00b0}C rh=\x1b[1;36m{:.1}\x1b[0m%%", 23 reading.co2_ppm, reading.temperature, reading.humidity 24 ); 25 } else { 26 let _ = write!(line, " \x1b[2mwaiting for data\x1b[0m"); 27 } 28 } else if let Some(reading) = sensor.temperature_humidity_reading() { 29 if reading.ok { 30 let _ = write!( 31 line, 32 " temp=\x1b[1;33m{:.1}\x1b[0m C rh=\x1b[1;36m{:.1}\x1b[0m%%", 33 reading.temperature_celsius, reading.relative_humidity_percent 34 ); 35 } else { 36 let _ = write!(line, " \x1b[2mwaiting for data\x1b[0m"); 37 } 38 } else { 39 let _ = write!(line, " \x1b[2mno live data\x1b[0m"); 40 } 41 42 if let Some(address) = transport.address { 43 let _ = write!(line, " \x1b[2m({} @ 0x{:02X}", transport.bus_name, address); 44 if let Some(mux_channel) = transport.mux_channel { 45 let _ = write!(line, " mux:{}", mux_channel); 46 } 47 let _ = write!(line, ")\x1b[0m"); 48 } else { 49 let _ = write!( 50 line, 51 " \x1b[2m({} slave {} reg {})\x1b[0m", 52 transport.bus_name, 53 transport.slave_id.unwrap_or_default(), 54 transport.register_address.unwrap_or_default() 55 ); 56 } 57 58 let _ = write!(out, " \x1b[33m{:<20}\x1b[0m {}\r\n", sensor.name, line); 59 } 60 61 let _ = write!(out, "\r\n"); 62 63 for bus in i2c_status.buses.iter() { 64 let _ = write!( 65 out, 66 " \x1b[33m{:<20}\x1b[0m SDA:\x1b[1mGPIO{}\x1b[0m SCL:\x1b[1mGPIO{}\x1b[0m\r\n", 67 bus.name, bus.sda_gpio, bus.scl_gpio 68 ); 69 } 70 71 if i2c_status.discovered_devices.is_empty() { 72 let _ = write!( 73 out, 74 " \x1b[33m{:<20}\x1b[0m \x1b[2mnone detected\x1b[0m\r\n", 75 "i2c.discovery" 76 ); 77 } else { 78 for discovered_device in i2c_status.discovered_devices.iter() { 79 let _ = write!( 80 out, 81 " \x1b[33m{:<20}\x1b[0m {} @ \x1b[1m0x{:02X}\x1b[0m\r\n", 82 "i2c.discovery", 83 discovered_device.bus_name(), 84 discovered_device.address 85 ); 86 } 87 } 88 89 let _ = write!(out, "\r\n"); 90 out 91 }