2023-05-06 06:50:24 -05:00
|
|
|
use alloc::{string::String, vec::Vec};
|
|
|
|
|
|
|
|
use {crate::alloc::string::ToString, core::fmt, hashbrown::HashMap, xml::XMLElement};
|
|
|
|
pub type Device = xml::XMLElement;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct DeviceTree {
|
|
|
|
pub devices: HashMap<String, Vec<Device>>,
|
|
|
|
}
|
|
|
|
impl DeviceTree {
|
|
|
|
pub fn new() -> Self {
|
|
|
|
let mut dt = Self {
|
|
|
|
devices: HashMap::new(),
|
|
|
|
};
|
|
|
|
|
|
|
|
// Human input devices
|
|
|
|
{
|
|
|
|
dt.devices.insert("Mice".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("Keyboards".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("Controllers".to_string(), Vec::new());
|
|
|
|
// Human Input Devices that do not fit into other catagories go in this spot
|
|
|
|
dt.devices.insert("Generic HIDs".to_string(), Vec::new());
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
dt.devices.insert("Disk Drives".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("CD Drives".to_string(), Vec::new());
|
|
|
|
}
|
|
|
|
|
|
|
|
dt.devices.insert("Batteries".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("Monitors".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("GPUs".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("CPUs".to_string(), Vec::new());
|
|
|
|
|
|
|
|
dt.devices.insert("USB".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("Serial Ports".to_string(), Vec::new());
|
|
|
|
dt.devices.insert("Cameras".to_string(), Vec::new());
|
|
|
|
dt.devices
|
|
|
|
.insert("Biometric Devices".to_string(), Vec::new());
|
|
|
|
|
|
|
|
dt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
use crate::utils::TAB;
|
|
|
|
|
|
|
|
impl fmt::Display for DeviceTree {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
2023-05-08 03:53:15 -05:00
|
|
|
writeln!(f);
|
2023-05-06 06:50:24 -05:00
|
|
|
for (device_type, devices) in &self.devices {
|
|
|
|
writeln!(f, "\r{TAB}{}/\r", device_type)?;
|
|
|
|
for device in devices {
|
|
|
|
writeln!(f, "{TAB}{TAB}{}/\r", device.name)?;
|
|
|
|
for attr in &device.attributes {
|
|
|
|
writeln!(f, "{TAB}{TAB}{TAB}{}\r", attr)?;
|
|
|
|
}
|
|
|
|
for child in &device.children {
|
|
|
|
writeln!(f, "{TAB}{TAB}{TAB}{}\r", child.name)?;
|
|
|
|
for attr in &child.attributes {
|
|
|
|
writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", attr)?;
|
|
|
|
}
|
|
|
|
for child in &child.children {
|
|
|
|
writeln!(f, "{TAB}{TAB}{TAB}{TAB}{}\r", child.name)?;
|
|
|
|
for attr in &child.attributes {
|
|
|
|
writeln!(f, "{TAB}{TAB}{TAB}{TAB}{TAB}{}\r", attr)?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|