Skip to main content

ap33772s_rs/commands/data_objects/
all_source_power_data_object.rs

1use super::standard_power_range_data_object::StandardPowerRangeDataObject;
2use crate::commands::data_objects::source_power_range_data_object::SourcePowerRangeDataObject;
3use crate::commands::{
4    data_objects::extended_power_range_data_object::ExtendedPowerRangeDataObject,
5    power_delivery::power_delivery_request_message::PowerDataObject,
6};
7
8/// The amount of Standard Power Data Objects
9pub(crate) const MAX_STANDARD_POWER_DATA_OBJECTS: usize = 7;
10/// The amount of Extended Power Data Objects
11pub(crate) const MAX_EXTENDED_POWER_DATA_OBJECTS: usize = 6;
12
13/// Represents all source power data objects for the AP33772S.
14/// Each USB C Power Supply device will have some of these objects.
15/// In the event that it does not the underlying power data objects `is_detected` methods will be false.
16#[derive(Debug, PartialEq, Clone)]
17pub struct AllSourceDataPowerDataObject {
18    pub power_data_objects: [SourcePowerRangeDataObject;
19        MAX_STANDARD_POWER_DATA_OBJECTS + MAX_EXTENDED_POWER_DATA_OBJECTS],
20}
21
22impl core::fmt::Display for AllSourceDataPowerDataObject {
23    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24        writeln!(f, "AllSourceDataPowerDataObject {{")?;
25        writeln!(f, "  power_data_objects: [")?;
26        for (i, power_obj) in self.power_data_objects.iter().enumerate() {
27            writeln!(f, "    [{i}]: {power_obj}")?;
28        }
29        writeln!(f, "  ]")?;
30        write!(f, "}}")
31    }
32}
33
34#[cfg(feature = "defmt")]
35impl defmt::Format for AllSourceDataPowerDataObject {
36    fn format(&self, f: defmt::Formatter) {
37        defmt::write!(f, "AllSourceDataPowerDataObject {{\n");
38        defmt::write!(f, "  power_data_objects: [\n");
39        for (i, power_obj) in self.power_data_objects.iter().enumerate() {
40            defmt::write!(f, "    [{:?}] : {=?}\n", i, power_obj);
41        }
42        defmt::write!(f, "  ]\n");
43        defmt::write!(f, "}}");
44    }
45}
46
47impl Default for AllSourceDataPowerDataObject {
48    /// Returns an empty AllSourceDataPowerDataObject.
49    fn default() -> Self {
50        AllSourceDataPowerDataObject {
51            power_data_objects: [
52                // Source Standard Power Data Objects 1-7
53                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
54                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
55                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
56                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
57                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
58                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
59                SourcePowerRangeDataObject::Standard(StandardPowerRangeDataObject::default()),
60                // Source Extended Power Data Objects 8-13
61                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
62                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
63                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
64                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
65                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
66                SourcePowerRangeDataObject::Extended(ExtendedPowerRangeDataObject::default()),
67            ],
68        }
69    }
70}
71
72impl AllSourceDataPowerDataObject {
73    /// Returns a reference to the power data object at the given index.
74    pub fn get_power_data_object(&self, index: PowerDataObject) -> &SourcePowerRangeDataObject {
75        // These assertions should never fire, but we include them for safety. The PowerDataObjects are always in the range 1-13
76        assert!(
77            usize::from(index) < self.power_data_objects.len(),
78            "Index out of bounds for power data objects"
79        );
80        assert_ne!(
81            usize::from(index),
82            0,
83            "Power Data Object Should never be zero!"
84        );
85        let index = usize::from(index) - 1;
86        &self.power_data_objects[index]
87    }
88}