drogue_grove_uart_spi/
lib.rs1#![no_std]
2
3use embedded_hal::blocking::spi::{Transfer, Write};
30use embedded_hal::digital::v2::OutputPin;
31use embedded_hal::serial;
32
33pub struct UARTSPI<UART> {
35 uart: UART,
36}
37
38impl<UART> UARTSPI<UART> {
39 pub fn new(uart: UART) -> Self {
41 UARTSPI { uart }
42 }
43
44 pub fn free(self) -> UART {
46 self.uart
47 }
48}
49
50impl<UART, E> Transfer<u8> for UARTSPI<UART>
51where
52 UART: serial::Read<u8, Error = E> + serial::Write<u8, Error = E>,
53{
54 type Error = nb::Error<E>;
55
56 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error> {
57 let mut len = words.len();
58 if len == 0 {
59 return Ok(words);
60 }
61
62 len -= 1;
65
66 assert!(len <= 255);
68
69 let reg = words[0];
70
71 nb::block!(self.uart.write(b'R'))?;
73 nb::block!(self.uart.write(reg))?;
74 nb::block!(self.uart.write(len as u8))?;
75 nb::block!(self.uart.flush())?;
77
78 #[cfg(feature = "dump")]
79 log::info!("Sent R-request (reg: 0x{:02x}, len: {})", reg, len);
80
81 for i in 0..len {
84 words[i + 1] = nb::block!(self.uart.read())?;
85 #[cfg(feature = "dump")]
86 log::info!("Received: {:02x}", words[i + 1]);
87 }
88
89 Ok(words)
90 }
91}
92
93impl<UART> Write<u8> for UARTSPI<UART>
94where
95 UART: serial::Write<u8>,
96{
97 type Error = nb::Error<UART::Error>;
98
99 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error> {
100 let mut len = words.len();
101 if len == 0 {
102 return Ok(());
103 }
104
105 len -= 1;
108
109 assert!(len <= 255);
111
112 let reg = words[0];
113 nb::block!(self.uart.write(b'W'))?;
114 nb::block!(self.uart.write(reg))?;
115 nb::block!(self.uart.write(len as u8))?;
116 for b in &words[1..] {
117 nb::block!(self.uart.write(*b))?;
118 }
119 nb::block!(self.uart.flush())?;
120
121 #[cfg(feature = "dump")]
122 log::info!("Sent W-request (reg: 0x{:02x}, len: {})", reg, len);
123
124 Ok(())
125 }
126}
127
128pub struct NoOpPin;
133
134impl OutputPin for NoOpPin {
135 type Error = ();
136
137 fn set_low(&mut self) -> Result<(), Self::Error> {
138 Ok(())
139 }
140
141 fn set_high(&mut self) -> Result<(), Self::Error> {
142 Ok(())
143 }
144}