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(),
|
|
|
|
};
|
2023-07-09 06:48:41 -05:00
|
|
|
device_tree!(dt, [
|
|
|
|
"Mice",
|
|
|
|
"Keyboards",
|
|
|
|
"Controllers",
|
|
|
|
"Generic HIDs",
|
|
|
|
"Disk Drives",
|
|
|
|
"CD Drives",
|
|
|
|
"Batteries",
|
|
|
|
"Monitors",
|
|
|
|
"GPUs",
|
|
|
|
"CPUs",
|
|
|
|
"USB",
|
|
|
|
"Serial Ports",
|
|
|
|
"Cameras",
|
|
|
|
"Biometric Devices",
|
|
|
|
]);
|
2023-05-06 06:50:24 -05:00
|
|
|
dt
|
|
|
|
}
|
|
|
|
}
|
2023-07-09 06:48:41 -05:00
|
|
|
use crate::{utils::TAB, device_tree};
|
2023-07-09 06:00:16 -05:00
|
|
|
use crate::tab;
|
2023-05-06 06:50:24 -05:00
|
|
|
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 {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "\r{}{}/\r", tab!(1), device_type)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
for device in devices {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}/\r", tab!(2), device.name)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
for attr in &device.attributes {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}\r", tab!(3), attr)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
}
|
|
|
|
for child in &device.children {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}\r", tab!(3), child.name)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
for attr in &child.attributes {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}\r", tab!(4), attr)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
}
|
|
|
|
for child in &child.children {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}\r", tab!(4), child.name)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
for attr in &child.attributes {
|
2023-07-09 06:00:16 -05:00
|
|
|
writeln!(f, "{}{}\r", tab!(5), attr)?;
|
2023-05-06 06:50:24 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|