aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/rp/src/bin/uart_r503.rs79
1 files changed, 49 insertions, 30 deletions
diff --git a/examples/rp/src/bin/uart_r503.rs b/examples/rp/src/bin/uart_r503.rs
index f8a9d8a9f..c0676750c 100644
--- a/examples/rp/src/bin/uart_r503.rs
+++ b/examples/rp/src/bin/uart_r503.rs
@@ -1,17 +1,17 @@
1#![no_std] 1#![no_std]
2#![no_main] 2#![no_main]
3 3
4use defmt::{debug, info, unwrap}; 4use defmt::info;
5use embassy_executor::Spawner; 5use embassy_executor::Spawner;
6use embassy_rp::bind_interrupts; 6use embassy_rp::bind_interrupts;
7use embassy_rp::peripherals::UART0; 7use embassy_rp::peripherals::UART0;
8use embassy_rp::uart::{Async, Config, DataBits, InterruptHandler as UARTInterruptHandler, StopBits, Uart, UartRx}; 8use embassy_rp::uart::{Config, DataBits, InterruptHandler as UARTInterruptHandler, Parity, StopBits, Uart};
9use embassy_time::Timer; 9use embassy_time::Timer;
10use heapless::Vec; 10use heapless::Vec;
11use {defmt_rtt as _, panic_probe as _}; 11use {defmt_rtt as _, panic_probe as _};
12 12
13bind_interrupts!(pub struct Irqs { 13bind_interrupts!(pub struct Irqs {
14 UART0_IRQ => UARTInterruptHandler<UART0>; // Fingerprint scanner (TX) 14 UART0_IRQ => UARTInterruptHandler<UART0>;
15}); 15});
16 16
17const ADDRESS: u32 = 0xFFFFFFFF; 17const ADDRESS: u32 = 0xFFFFFFFF;
@@ -34,24 +34,8 @@ fn compute_checksum(buf: Vec<u8, 32>) -> u16 {
34 return checksum; 34 return checksum;
35} 35}
36 36
37// NOTE: Doesn't work for some reason, it just hangs!
38#[embassy_executor::task]
39async fn reader(mut rx: UartRx<'static, UART0, Async>) {
40 loop {
41 let mut buf = [0; 32];
42 debug!("Attempting read..");
43
44 //rx.read(&mut buf).await.unwrap();
45 match rx.read(&mut buf).await {
46 Ok(v) => info!("Read successful: {:?}", v),
47 Err(e) => info!("Read error: {:?}", e),
48 }
49 info!("RX='{:?}'", buf);
50 }
51}
52
53#[embassy_executor::main] 37#[embassy_executor::main]
54async fn main(spawner: Spawner) { 38async fn main(_spawner: Spawner) {
55 info!("Start"); 39 info!("Start");
56 40
57 let p = embassy_rp::init(Default::default()); 41 let p = embassy_rp::init(Default::default());
@@ -61,16 +45,16 @@ async fn main(spawner: Spawner) {
61 config.baudrate = 57600; 45 config.baudrate = 57600;
62 config.stop_bits = StopBits::STOP1; 46 config.stop_bits = StopBits::STOP1;
63 config.data_bits = DataBits::DataBits8; 47 config.data_bits = DataBits::DataBits8;
48 config.parity = Parity::ParityNone;
64 49
65 let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1); 50 let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1);
66 let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config); 51 let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config);
67 let (mut tx, rx) = uart.split(); 52 let (mut tx, mut rx) = uart.split();
68
69 unwrap!(spawner.spawn(reader(rx)));
70 Timer::after_secs(1).await;
71 53
72 let mut vec_buf: Vec<u8, 32> = heapless::Vec::new(); 54 let mut vec_buf: Vec<u8, 32> = heapless::Vec::new();
73 { 55
56 // Cycle through the three colours Red, Blue and Purple.
57 for colour in 1..=3 {
74 // Clear buffers 58 // Clear buffers
75 vec_buf.clear(); 59 vec_buf.clear();
76 60
@@ -93,7 +77,7 @@ async fn main(spawner: Spawner) {
93 // DATA 77 // DATA
94 let _ = vec_buf.push(0x01); // ctrl=Breathing light 78 let _ = vec_buf.push(0x01); // ctrl=Breathing light
95 let _ = vec_buf.push(0x50); // speed=80 79 let _ = vec_buf.push(0x50); // speed=80
96 let _ = vec_buf.push(0x02); // colour=Blue 80 let _ = vec_buf.push(colour as u8); // colour=Red, Blue, Purple
97 let _ = vec_buf.push(0x00); // times=Infinite 81 let _ = vec_buf.push(0x00); // times=Infinite
98 82
99 // SUM 83 // SUM
@@ -103,11 +87,46 @@ async fn main(spawner: Spawner) {
103 // ===== 87 // =====
104 88
105 // Send command buffer. 89 // Send command buffer.
106 let data: [u8; 16] = vec_buf.clone().into_array().unwrap(); 90 let data_write: [u8; 16] = vec_buf.clone().into_array().unwrap();
107 debug!("data='{:?}'", data); 91 info!("write ({})='{:?}'", colour, data_write);
108 match tx.write(&data).await { 92 match tx.write(&data_write).await {
109 Ok(..) => info!("Write successful"), 93 Ok(..) => info!("Write successful."),
110 Err(e) => info!("Write error: {:?}", e), 94 Err(e) => info!("Write error: {:?}", e),
111 } 95 }
96
97 // =====
98
99 // Read command buffer.
100 let mut read_buf: [u8; 1] = [0; 1]; // Can only read one byte at a time!
101 let mut data_read: Vec<u8, 32> = heapless::Vec::new(); // Return buffer.
102 let mut cnt: u8 = 0; // Keep track of how many packages we've received.
103
104 info!("Attempting read.");
105 loop {
106 match rx.read(&mut read_buf).await {
107 Ok(..) => (),
108 Err(e) => info!(" Read error: {:?}", e),
109 }
110
111 match cnt {
112 _ => data_read.push(read_buf[0]).unwrap(),
113 }
114
115 if cnt > 10 {
116 info!("read ({})='{:?}'", colour, data_read[..]);
117 break;
118 }
119
120 cnt = cnt + 1;
121 }
122
123 // =====
124
125 if colour != 3 {
126 Timer::after_secs(2).await;
127 info!("Changing colour.");
128 }
112 } 129 }
130
131 info!("All done..");
113} 132}