1use crate::{Characters, Error, ErrorHandler, ErrorQueue, SCPI_STD_VERSION};
3
4#[cfg(feature = "registers")]
5use crate::registers::{EventStatus, StatusByte, StatusRegisters};
6
7pub trait ErrorCommands {
20 fn error_queue(&mut self) -> &mut impl ErrorQueue;
21
22 fn system_error_count(&mut self) -> Result<usize, Error> {
23 Ok(self.error_queue().error_count())
24 }
25
26 fn system_error_next(&mut self) -> Result<(i16, &'static str), Error> {
27 if let Some(error) = self.error_queue().pop_error() {
28 Ok((error.number(), error.into()))
29 } else {
30 Ok((0, ""))
31 }
32 }
33}
34
35impl<I> ErrorHandler for I
36where
37 I: ErrorCommands,
38{
39 fn handle_error(&mut self, error: Error) {
40 self.error_queue().push_error(error);
41 }
42}
43
44pub trait StandardCommands {
50 fn system_version(&mut self) -> Result<Characters<'_>, Error> {
51 Ok(Characters(SCPI_STD_VERSION))
52 }
53}
54
55#[cfg(feature = "registers")]
68pub trait StatusCommands: ErrorCommands {
69 fn status_registers(&mut self) -> &mut StatusRegisters;
70
71 fn operation_complete(&mut self) -> Result<bool, Error> {
72 self.set_operation_complete()?;
73
74 Ok(self
75 .status_registers()
76 .event_status
77 .contains(EventStatus::OPERATION_COMPLETE))
78 }
79
80 fn set_operation_complete(&mut self) -> Result<(), Error> {
81 self.status_registers()
82 .event_status
83 .set(EventStatus::OPERATION_COMPLETE, true);
84 Ok(())
85 }
86
87 fn clear_event_status(&mut self) -> Result<(), Error> {
91 self.error_queue().clear();
92 self.status_registers().event_status = EventStatus::empty();
93 Ok(())
94 }
95
96 fn event_status_enable(&mut self) -> Result<u8, Error> {
100 Ok(self.status_registers().event_status_enable.bits())
101 }
102
103 fn set_event_status_enable(&mut self, value: u8) -> Result<(), Error> {
107 self.status_registers().event_status_enable = EventStatus::from_bits_retain(value);
108 Ok(())
109 }
110
111 fn event_status_register(&mut self) -> Result<u8, Error> {
115 let value = self.status_registers().event_status;
116 let mask = self.status_registers().event_status_enable;
117 let result = value.intersection(mask).bits();
118
119 self.status_registers().event_status = EventStatus::empty();
121
122 Ok(result)
123 }
124
125 fn status_byte(&mut self) -> Result<u8, Error> {
129 let mut status: StatusByte = StatusByte::empty();
130
131 if self.error_queue().error_count() > 0 {
132 status.insert(StatusByte::ERROR_EVENT_QUEUE);
133 }
134
135 let event_status = self.status_registers().event_status;
137 let event_enable = self.status_registers().event_status_enable;
138 if event_status.intersection(event_enable).bits() != 0 {
139 status.insert(StatusByte::STANDARD_EVENT);
140 }
141
142 Ok(status.bits())
143 }
144
145 fn status_byte_enable(&mut self) -> Result<u8, Error> {
149 Ok(self.status_registers().status_byte_enable.bits())
150 }
151
152 fn set_status_byte_enable(&mut self, value: u8) -> Result<(), Error> {
156 self.status_registers().status_byte_enable = StatusByte::from_bits_retain(value);
157 Ok(())
158 }
159}