diff options
Diffstat (limited to 'examples/nrf')
| -rw-r--r-- | examples/nrf/src/bin/usb_uart.rs | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/examples/nrf/src/bin/usb_uart.rs b/examples/nrf/src/bin/usb_uart.rs index fc7ee03b8..56b451140 100644 --- a/examples/nrf/src/bin/usb_uart.rs +++ b/examples/nrf/src/bin/usb_uart.rs | |||
| @@ -40,53 +40,55 @@ async fn main(_spawner: Spawner, p: Peripherals) { | |||
| 40 | irq.set_priority(interrupt::Priority::P3); | 40 | irq.set_priority(interrupt::Priority::P3); |
| 41 | 41 | ||
| 42 | let mut state = State::new(); | 42 | let mut state = State::new(); |
| 43 | |||
| 44 | let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; | 43 | let usb = unsafe { Usb::new(&mut state, device, serial, irq) }; |
| 45 | pin_mut!(usb); | 44 | pin_mut!(usb); |
| 46 | 45 | ||
| 47 | let (mut read_interface, mut write_interface) = usb.as_ref().take_serial_0(); | 46 | let (mut reader, mut writer) = usb.as_ref().take_serial_0(); |
| 48 | 47 | ||
| 49 | unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); | 48 | unwrap!(writer.write_all(b"\r\nSend something\r\n").await); |
| 50 | 49 | ||
| 51 | info!("usb initialized!"); | 50 | info!("usb initialized!"); |
| 52 | 51 | ||
| 53 | let mut buf = [0u8; 64]; | 52 | let mut buf = [0u8; 64]; |
| 54 | loop { | 53 | loop { |
| 55 | let mut n = 0; | 54 | let mut n = 0; |
| 56 | let left = { | 55 | let timed_out = { |
| 57 | let recv_fut = async { | 56 | let newline_fut = async { |
| 58 | loop { | 57 | loop { |
| 59 | let byte = unwrap!(read_interface.read_byte().await); | 58 | let char = unwrap!(reader.read_byte().await); |
| 60 | unwrap!(write_interface.write_byte(byte).await); | 59 | // echo input back to screen |
| 61 | buf[n] = byte; | 60 | unwrap!(writer.write_byte(char).await); |
| 61 | buf[n] = char; | ||
| 62 | 62 | ||
| 63 | n += 1; | 63 | n += 1; |
| 64 | if byte == b'\n' || byte == b'\r' || n == buf.len() { | 64 | if char == b'\n' || char == b'\r' || n == buf.len() { |
| 65 | break; | 65 | break; |
| 66 | } | 66 | } |
| 67 | } | 67 | } |
| 68 | }; | 68 | }; |
| 69 | pin_mut!(recv_fut); | 69 | pin_mut!(newline_fut); |
| 70 | 70 | ||
| 71 | let timeout = Timer::after(Duration::from_ticks(32768 * 10)); | 71 | let timeout_fut = Timer::after(Duration::from_ticks(32768 * 10)); |
| 72 | 72 | ||
| 73 | match select(recv_fut, timeout).await { | 73 | // select chooses whichever returns first |
| 74 | Either::Left(_) => true, | 74 | match select(newline_fut, timeout_fut).await { |
| 75 | Either::Right(_) => false, | 75 | Either::Left(_) => false, |
| 76 | Either::Right(_) => true, | ||
| 76 | } | 77 | } |
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | if left { | 80 | if timed_out { |
| 80 | for c in buf[..n].iter_mut() { | 81 | unwrap!(writer.write_all(b"\r\nTimed out\r\n").await); |
| 81 | if 0x61 <= *c && *c <= 0x7a { | 82 | } else { |
| 82 | *c &= !0x20; | 83 | for char in buf[..n].iter_mut() { |
| 84 | // upper case | ||
| 85 | if 0x61 <= *char && *char <= 0x7a { | ||
| 86 | *char &= !0x20; | ||
| 83 | } | 87 | } |
| 84 | } | 88 | } |
| 85 | unwrap!(write_interface.write_byte(b'\n').await); | 89 | unwrap!(writer.write_byte(b'\n').await); |
| 86 | unwrap!(write_interface.write_all(&buf[..n]).await); | 90 | unwrap!(writer.write_all(&buf[..n]).await); |
| 87 | unwrap!(write_interface.write_byte(b'\n').await); | 91 | unwrap!(writer.write_byte(b'\n').await); |
| 88 | } else { | ||
| 89 | unwrap!(write_interface.write_all(b"\r\nSend something\r\n").await); | ||
| 90 | } | 92 | } |
| 91 | } | 93 | } |
| 92 | } | 94 | } |
