aboutsummaryrefslogtreecommitdiff
path: root/embassy-nrf
diff options
context:
space:
mode:
authorchemicstry <[email protected]>2022-05-26 23:15:06 +0300
committerchemicstry <[email protected]>2022-05-26 23:15:06 +0300
commitc3b899c470bd84ef4f0b8bdeca992ca1069a546c (patch)
tree67af3a975c32c39e952e7e2bff97b775c21bafbb /embassy-nrf
parent667abe6d1d78cc989fb57884643f4d2f5834ea52 (diff)
Implement BufRead for nrf BufferedUarte
Diffstat (limited to 'embassy-nrf')
-rw-r--r--embassy-nrf/src/buffered_uarte.rs42
1 files changed, 42 insertions, 0 deletions
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs
index c42fa1138..e1d32a311 100644
--- a/embassy-nrf/src/buffered_uarte.rs
+++ b/embassy-nrf/src/buffered_uarte.rs
@@ -236,6 +236,48 @@ impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Read for Buffe
236 } 236 }
237} 237}
238 238
239impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::BufRead
240 for BufferedUarte<'d, U, T>
241{
242 type FillBufFuture<'a> = impl Future<Output = Result<&'a [u8], Self::Error>>
243 where
244 Self: 'a;
245
246 fn fill_buf<'a>(&'a mut self) -> Self::FillBufFuture<'a> {
247 poll_fn(move |cx| {
248 self.inner.with(|state| {
249 compiler_fence(Ordering::SeqCst);
250 trace!("fill_buf");
251
252 // We have data ready in buffer? Return it.
253 let buf = state.rx.pop_buf();
254 if !buf.is_empty() {
255 trace!(" got {:?} {:?}", buf.as_ptr() as u32, buf.len());
256 let buf: &[u8] = buf;
257 // Safety: buffer lives as long as uart
258 let buf: &[u8] = unsafe { core::mem::transmute(buf) };
259 return Poll::Ready(Ok(buf));
260 }
261
262 trace!(" empty");
263 state.rx_waker.register(cx.waker());
264 Poll::<Result<&[u8], Self::Error>>::Pending
265 })
266 })
267 }
268
269 fn consume(&mut self, amt: usize) {
270 let signal = self.inner.with(|state| {
271 let full = state.rx.is_full();
272 state.rx.pop(amt);
273 full
274 });
275 if signal {
276 self.inner.pend();
277 }
278 }
279}
280
239impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write 281impl<'d, U: UarteInstance, T: TimerInstance> embedded_io::asynch::Write
240 for BufferedUarte<'d, U, T> 282 for BufferedUarte<'d, U, T>
241{ 283{