1#![no_std]
2extern crate embedded_hal as hal;
3use core::cell::RefCell;
4pub struct Spy<T,F>
45where F:Fn(DataWord)
46{
47 s: RefCell<T>,
49 f: RefCell<F>,
51}
52pub fn new<T,F>(s: T, f: F)-> Spy<T,F>
55where F:Fn(DataWord)
56{
57 Spy{s:RefCell::new(s), f:RefCell::new(f)}
58}
59
60
61pub enum DataWord {
65 None,
66 Byte(u8),
68 First,
71 Last,
73 Response,
75 Failed,
77 Toggle,
79}
80
81use hal::spi::FullDuplex;
82extern crate nb;
83impl<T,F> FullDuplex<u8> for Spy<T,F>
86where T:FullDuplex<u8>,
87 F: Fn(DataWord),
88{
89 type Error = T::Error;
90 fn read (&mut self) -> Result<u8, nb::Error<Self::Error>>{
91 let mut s = self.s.borrow_mut();
92 let ans = s.read();
93 match &ans {
94 Ok(w) => {(self.f.borrow_mut())(DataWord::Byte(w.clone()));},
95 _other => {},
96 }
97 ans
98 }
99 fn send(&mut self, w: u8) -> Result<(), nb::Error<Self::Error>>{
100 (self.f.borrow_mut())(DataWord::Byte(w));
101 let mut s = self.s.borrow_mut();
102 s.send(w)
103 }
104}
105
106impl<T,F> hal::blocking::spi::Transfer<u8> for Spy<T,F>
107where T: hal::blocking::spi::Transfer<u8>,
108 F:Fn(DataWord)
109{
110 type Error = T::Error;
111 fn transfer<'w>(&mut self, words: &'w mut [u8]) -> Result<&'w [u8], Self::Error>{
113 (self.f.borrow_mut())(DataWord::First);
114 for w in words.iter(){
115 (self.f.borrow_mut())(DataWord::Byte(*w));
116 }
117 (self.f.borrow_mut())(DataWord::Response);
118 let ans = (self.s.borrow_mut()).transfer(words)?;
119 for w in ans.iter(){
120 (self.f.borrow_mut())(DataWord::Byte(*w));
121 }
122 (self.f.borrow_mut())(DataWord::Last);
123
124 Ok(ans)
125 }
126}
127
128impl<T,F> hal::blocking::spi::Write<u8> for Spy<T,F>
130where T: hal::blocking::spi::Write<u8>,
131 F: Fn(DataWord)
132 {
133 type Error = T::Error;
134 fn write(&mut self, words: &[u8]) -> Result<(), Self::Error>{
136 for w in words.iter(){
137 (self.f.borrow_mut())(DataWord::Byte(*w));
138 }
139 (self.s.borrow_mut()).write(words)
140 }
141}
142#[cfg(feature = "embedded_hal_digital_io_legacy_v1")]
143impl<T,F> hal::digital::v1::InputPin for Spy<T,F>
146where T: hal::digital::v1::InputPin,
147 F: Fn(DataWord)
148 {
149 fn is_high(&self) -> bool{
150 let state = (self.s.borrow_mut()).is_high();
151
152 (self.f.borrow_mut())(DataWord::Byte(state as u8));
153 state
154 }
155 fn is_low(&self) -> bool{
156 let state = (self.s.borrow_mut()).is_low();
157 (self.f.borrow_mut())(DataWord::Byte((!state) as u8));
158 state
159 }
160}
161#[cfg(feature = "embedded_hal_digital_io_legacy_v1")]
162impl<T,F> hal::digital::v1::OutputPin for Spy<T,F>
164where T: hal::digital::v1::OutputPin,
165 F: Fn(DataWord)
166 {
167 fn set_high(&mut self){
168 (self.f.borrow_mut())(DataWord::Byte(1));
169 (self.s.borrow_mut()).set_high()
170 }
171 fn set_low(&mut self){
172 (self.f.borrow_mut())(DataWord::Byte(0));
173 (self.s.borrow_mut()).set_low()
174 }
175}
176#[cfg(feature = "embedded_hal_digital_io_legacy_v1")]
177impl<T,F> hal::digital::v1::ToggleableOutputPin for Spy<T,F>
178where T: hal::digital::v1::ToggleableOutputPin,
179 F: Fn(DataWord)
180 {
181 fn toggle(&mut self){
182 (self.f.borrow_mut())(DataWord::Toggle);
183 (self.s.borrow_mut()).toggle()
184 }
185}
186
187#[cfg(feature = "embedded_hal_digital_io_legacy_v1")]
188impl<T,F> hal::digital::v1::StatefulOutputPin for Spy<T,F>
189where T: hal::digital::v1::StatefulOutputPin,
190 F: Fn(DataWord)
191{
192 fn is_set_high(&self) -> bool{
193 let state = (self.s.borrow_mut()).is_set_high();
194
195 (self.f.borrow_mut())(DataWord::Byte(state as u8));
196 state
197 }
198 fn is_set_low(&self) -> bool{
199 let state = (self.s.borrow_mut()).is_set_low();
200 (self.f.borrow_mut())(DataWord::Byte((!state) as u8));
201 state
202 }
203}
204
205#[cfg(not(feature = "embedded_hal_digital_io_legacy_v1"))]
206impl<T,F> hal::digital::v2::InputPin for Spy<T,F>
209where T: hal::digital::v2::InputPin,
210 F: Fn(DataWord)
211 {
212 type Error = T::Error;
213 fn is_high(&self) -> Result<bool,Self::Error>{
214 let state = (self.s.borrow_mut()).is_high()?;
215 (self.f.borrow_mut())(DataWord::Byte(state as u8));
216 Ok(state)
217 }
218 fn is_low(&self) -> Result<bool,Self::Error>{
219 let state = (self.s.borrow_mut()).is_low()?;
220 (self.f.borrow_mut())(DataWord::Byte((!state) as u8));
221 Ok(state)
222 }
223}
224#[cfg(not(feature = "embedded_hal_digital_io_legacy_v1"))]
225impl<T,F> hal::digital::v2::OutputPin for Spy<T,F>
227where T: hal::digital::v2::OutputPin,
228 F: Fn(DataWord)
229 {
230 type Error = T::Error;
231 fn set_high(&mut self)->Result<(),T::Error>{
232 (self.f.borrow_mut())(DataWord::Byte(1));
233 (self.s.borrow_mut()).set_high()
234 }
235 fn set_low(&mut self)->Result<(),T::Error>{
236 (self.f.borrow_mut())(DataWord::Byte(0));
237 (self.s.borrow_mut()).set_low()
238 }
239}
240#[cfg(not(feature = "embedded_hal_digital_io_legacy_v1"))]
241impl<T,F> hal::digital::v2::ToggleableOutputPin for Spy<T,F>
242where T: hal::digital::v2::ToggleableOutputPin,
243 F: Fn(DataWord)
244 {
245 type Error = T::Error;
246 fn toggle(&mut self)->Result<(),T::Error>{
247 (self.f.borrow_mut())(DataWord::Toggle);
248 (self.s.borrow_mut()).toggle()
249 }
250}
251
252#[cfg(not(feature = "embedded_hal_digital_io_legacy_v1"))]
253impl<T,F> hal::digital::v2::StatefulOutputPin for Spy<T,F>
254where T: hal::digital::v2::StatefulOutputPin,
255 F: Fn(DataWord)
256{
257 fn is_set_high(&self) -> Result<bool,T::Error>{
259 let state = (self.s.borrow_mut()).is_set_high()?;
260
261 (self.f.borrow_mut())(DataWord::Byte(state as u8));
262 Ok(state)
263 }
264 fn is_set_low(&self) -> Result<bool,T::Error>{
265 let state = (self.s.borrow_mut()).is_set_low()?;
266 (self.f.borrow_mut())(DataWord::Byte((!state) as u8));
267 Ok(state)
268 }
269}