vex_rt/adi/
digital_out.rs1use crate::{
2 bindings,
3 error::{get_errno, Error},
4};
5
6pub struct AdiDigitalOutput {
8 port: u8,
9 expander_port: u8,
10}
11
12impl AdiDigitalOutput {
13 pub unsafe fn new(port: u8, expander_port: u8) -> Result<Self, AdiDigitalOutputError> {
21 match bindings::ext_adi_port_set_config(
22 expander_port,
23 port,
24 bindings::adi_port_config_e_E_ADI_DIGITAL_OUT,
25 ) {
26 bindings::PROS_ERR_ => Err(AdiDigitalOutputError::from_errno()),
27 _ => Ok(Self {
28 port,
29 expander_port,
30 }),
31 }
32 }
33
34 pub fn write(&mut self, value: bool) -> Result<(), AdiDigitalOutputError> {
36 match unsafe { bindings::ext_adi_digital_write(self.expander_port, self.port, value) } {
37 bindings::PROS_ERR_ => Err(AdiDigitalOutputError::from_errno()),
38 _ => Ok(()),
39 }
40 }
41}
42
43#[derive(Debug)]
45pub enum AdiDigitalOutputError {
46 PortsOutOfRange,
48 PortsNotDigitalOutput,
50 Unknown(i32),
52}
53
54impl AdiDigitalOutputError {
55 fn from_errno() -> Self {
56 match get_errno() {
57 libc::ENXIO => Self::PortsOutOfRange,
58 libc::EADDRINUSE => Self::PortsNotDigitalOutput,
59 x => Self::Unknown(x),
60 }
61 }
62}
63
64impl From<AdiDigitalOutputError> for Error {
65 fn from(err: AdiDigitalOutputError) -> Self {
66 match err {
67 AdiDigitalOutputError::PortsOutOfRange => Error::Custom("port is out of range".into()),
68 AdiDigitalOutputError::PortsNotDigitalOutput => {
69 Error::Custom("port is not an adi digital output".into())
70 }
71 AdiDigitalOutputError::Unknown(n) => Error::System(n),
72 }
73 }
74}