use crate::{Characters, Error, ErrorHandler, ErrorQueue, SCPI_STD_VERSION};
#[cfg(feature = "registers")]
use crate::registers::{EventStatus, StatusByte, StatusRegisters};
pub trait ErrorCommands {
fn error_queue(&mut self) -> &mut impl ErrorQueue;
fn system_error_count(&mut self) -> Result<usize, Error> {
Ok(self.error_queue().error_count())
}
fn system_error_next(&mut self) -> Result<(i16, &'static str), Error> {
if let Some(error) = self.error_queue().pop_error() {
Ok((error.number(), error.into()))
} else {
Ok((0, ""))
}
}
}
impl<I> ErrorHandler for I
where
I: ErrorCommands,
{
fn handle_error(&mut self, error: Error) {
self.error_queue().push_error(error);
}
}
pub trait StandardCommands {
fn system_version(&mut self) -> Result<Characters<'_>, Error> {
Ok(Characters(SCPI_STD_VERSION))
}
}
#[cfg(feature = "registers")]
pub trait StatusCommands: ErrorCommands {
fn status_registers(&mut self) -> &mut StatusRegisters;
fn operation_complete(&mut self) -> Result<bool, Error> {
self.set_operation_complete()?;
Ok(self
.status_registers()
.event_status
.contains(EventStatus::OPERATION_COMPLETE))
}
fn set_operation_complete(&mut self) -> Result<(), Error> {
self.status_registers()
.event_status
.set(EventStatus::OPERATION_COMPLETE, true);
Ok(())
}
fn clear_event_status(&mut self) -> Result<(), Error> {
self.error_queue().clear();
self.status_registers().event_status = EventStatus::empty();
Ok(())
}
fn event_status_enable(&mut self) -> Result<u8, Error> {
Ok(self.status_registers().event_status_enable.bits())
}
fn set_event_status_enable(&mut self, value: u8) -> Result<(), Error> {
self.status_registers().event_status_enable = EventStatus::from_bits_retain(value);
Ok(())
}
fn event_status_register(&mut self) -> Result<u8, Error> {
let value = self.status_registers().event_status;
let mask = self.status_registers().event_status_enable;
let result = value.intersection(mask).bits();
self.status_registers().event_status = EventStatus::empty();
Ok(result)
}
fn status_byte(&mut self) -> Result<u8, Error> {
let mut status: StatusByte = StatusByte::empty();
if self.error_queue().error_count() > 0 {
status.insert(StatusByte::ERROR_EVENT_QUEUE);
}
let event_status = self.status_registers().event_status;
let event_enable = self.status_registers().event_status_enable;
if event_status.intersection(event_enable).bits() != 0 {
status.insert(StatusByte::STANDARD_EVENT);
}
Ok(status.bits())
}
fn status_byte_enable(&mut self) -> Result<u8, Error> {
Ok(self.status_registers().status_byte_enable.bits())
}
fn set_status_byte_enable(&mut self, value: u8) -> Result<(), Error> {
self.status_registers().status_byte_enable = StatusByte::from_bits_retain(value);
Ok(())
}
}