bnr_xfs/
status.rs

1//! BNR device status types.
2
3use std::fmt;
4
5use crate::xfs::{method_response::XfsMethodResponse, params::XfsParam};
6use crate::{impl_xfs_struct, Error, Result};
7
8mod content;
9mod device;
10mod dispenser;
11mod hardware;
12mod inter_stacker;
13mod position;
14mod position_capabilities;
15mod position_status;
16mod safe_door;
17mod shutter;
18mod transport;
19
20pub use content::*;
21pub use device::*;
22pub use dispenser::*;
23pub use hardware::*;
24pub use inter_stacker::*;
25pub use position::*;
26pub use position_capabilities::*;
27pub use position_status::*;
28pub use safe_door::*;
29pub use shutter::*;
30pub use transport::*;
31
32/// Represents the CDR status returned by the
33/// [`get_status`](crate::device_handle::DeviceHandle::get_status) call.
34#[repr(C)]
35#[derive(Clone, Copy, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
36pub struct CdrStatus {
37    pub device_status: DeviceStatus,
38    pub dispenser_status: DispenserStatus,
39    pub intermediate_stacker_status: IntermediateStackerStatus,
40    pub safe_door_status: SafeDoorStatus,
41    pub shutter_status: ShutterStatus,
42    pub transport_status: TransportStatus,
43    pub position_status_list: CdrPositionStatusList,
44}
45
46impl CdrStatus {
47    /// Creates a new [CdrStatus].
48    pub const fn new() -> Self {
49        Self {
50            device_status: DeviceStatus::new(),
51            dispenser_status: DispenserStatus::new(),
52            intermediate_stacker_status: IntermediateStackerStatus::new(),
53            safe_door_status: SafeDoorStatus::new(),
54            shutter_status: ShutterStatus::new(),
55            transport_status: TransportStatus::new(),
56            position_status_list: CdrPositionStatusList::new(),
57        }
58    }
59}
60
61impl From<CdrStatus> for HardwareStatus {
62    fn from(val: CdrStatus) -> Self {
63        [
64            HardwareStatus::from(val.device_status),
65            HardwareStatus::from(val.dispenser_status),
66            HardwareStatus::from(val.intermediate_stacker_status),
67            HardwareStatus::from(val.safe_door_status),
68            HardwareStatus::from(val.shutter_status),
69            HardwareStatus::from(val.transport_status),
70            HardwareStatus::from(val.position_status_list),
71        ]
72        .into()
73    }
74}
75
76impl_xfs_struct!(
77    CdrStatus,
78    "status",
79    [
80        device_status: DeviceStatus,
81        dispenser_status: DispenserStatus,
82        intermediate_stacker_status: IntermediateStackerStatus,
83        safe_door_status: SafeDoorStatus,
84        shutter_status: ShutterStatus,
85        transport_status: TransportStatus,
86        position_status_list: CdrPositionStatusList
87    ]
88);
89
90impl From<&CdrStatus> for XfsParam {
91    fn from(val: &CdrStatus) -> Self {
92        Self::create(val.into())
93    }
94}
95
96impl From<CdrStatus> for XfsParam {
97    fn from(val: CdrStatus) -> Self {
98        (&val).into()
99    }
100}
101
102impl TryFrom<&XfsParam> for CdrStatus {
103    type Error = Error;
104
105    fn try_from(val: &XfsParam) -> Result<Self> {
106        val.value().try_into()
107    }
108}
109
110impl TryFrom<XfsParam> for CdrStatus {
111    type Error = Error;
112
113    fn try_from(val: XfsParam) -> Result<Self> {
114        (&val).try_into()
115    }
116}
117
118impl TryFrom<&XfsMethodResponse> for CdrStatus {
119    type Error = Error;
120
121    fn try_from(val: &XfsMethodResponse) -> Result<Self> {
122        val.as_params()?
123            .params()
124            .iter()
125            .map(|p| p.inner())
126            .find(|p| p.value().xfs_struct().is_some())
127            .ok_or(Error::Xfs(format!(
128                "Expected CdrStatus XfsMethodResponse, have: {val}"
129            )))?
130            .try_into()
131    }
132}
133
134impl TryFrom<XfsMethodResponse> for CdrStatus {
135    type Error = Error;
136
137    fn try_from(val: XfsMethodResponse) -> Result<Self> {
138        (&val).try_into()
139    }
140}
141
142impl fmt::Display for CdrStatus {
143    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
144        write!(f, r#"{{"device_status": "{}","#, self.device_status)?;
145        write!(f, r#" "dispenser_status": "{}","#, self.dispenser_status)?;
146        write!(
147            f,
148            r#" "intermediate_stacker_status": "{}","#,
149            self.intermediate_stacker_status
150        )?;
151        write!(f, r#" "safe_door_status": "{}","#, self.safe_door_status)?;
152        write!(f, r#" "shutter_status": "{}","#, self.shutter_status)?;
153        write!(f, r#" "transport_status": "{}","#, self.transport_status)?;
154        write!(
155            f,
156            r#" "position_status_list": {}}}"#,
157            self.position_status_list
158        )
159    }
160}