2023-06-13 06:00:11 -05:00
|
|
|
//! A tree of hardware devices
|
2023-05-06 06:50:24 -05:00
|
|
|
|
2023-06-13 06:00:11 -05:00
|
|
|
use {
|
|
|
|
crate::alloc::string::ToString,
|
|
|
|
alloc::{string::String, vec::Vec},
|
|
|
|
core::fmt,
|
|
|
|
hashbrown::HashMap,
|
|
|
|
};
|
|
|
|
/// A device object.
|
|
|
|
/// TODO define device
|
2023-05-06 06:50:24 -05:00
|
|
|
pub type Device = xml::XMLElement;
|
|
|
|
|
2023-06-13 06:00:11 -05:00
|
|
|
/// A tree of devices
|
2023-05-15 02:19:34 -05:00
|
|
|
// TODO: alphabatize this list
|
2023-05-06 06:50:24 -05:00
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct DeviceTree {
|
2023-06-13 06:00:11 -05:00
|
|
|
/// The device tree
|
2023-05-06 06:50:24 -05:00
|
|
|
pub devices: HashMap<String, Vec<Device>>,
|
|
|
|
}
|
|
|
|
impl DeviceTree {
|
2023-06-13 06:00:11 -05:00
|
|
|
/// Build the device tree. Does not populate the device tree
|
2023-05-06 06:50:24 -05:00
|
|
|
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-23 05:16:14 -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(())
|
|
|
|
}
|
|
|
|
}
|