/ firmware / src / programs / coreutils / sensors.rs
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  }