aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/rp/src/bin/uart_r503.rs113
1 files changed, 113 insertions, 0 deletions
diff --git a/examples/rp/src/bin/uart_r503.rs b/examples/rp/src/bin/uart_r503.rs
new file mode 100644
index 000000000..f8a9d8a9f
--- /dev/null
+++ b/examples/rp/src/bin/uart_r503.rs
@@ -0,0 +1,113 @@
1#![no_std]
2#![no_main]
3
4use defmt::{debug, info, unwrap};
5use embassy_executor::Spawner;
6use embassy_rp::bind_interrupts;
7use embassy_rp::peripherals::UART0;
8use embassy_rp::uart::{Async, Config, DataBits, InterruptHandler as UARTInterruptHandler, StopBits, Uart, UartRx};
9use embassy_time::Timer;
10use heapless::Vec;
11use {defmt_rtt as _, panic_probe as _};
12
13bind_interrupts!(pub struct Irqs {
14 UART0_IRQ => UARTInterruptHandler<UART0>; // Fingerprint scanner (TX)
15});
16
17const ADDRESS: u32 = 0xFFFFFFFF;
18const START: u16 = 0xEF01;
19
20// ================================================================================
21
22fn write_cmd_bytes(buf: &mut Vec<u8, 32>, bytes: &[u8]) {
23 let _ = buf.extend_from_slice(bytes);
24}
25
26fn compute_checksum(buf: Vec<u8, 32>) -> u16 {
27 let mut checksum = 0u16;
28
29 let check_end = buf.len();
30 let checked_bytes = &buf[6..check_end];
31 for byte in checked_bytes {
32 checksum += (*byte) as u16;
33 }
34 return checksum;
35}
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]
54async fn main(spawner: Spawner) {
55 info!("Start");
56
57 let p = embassy_rp::init(Default::default());
58
59 // Initialize the fingerprint scanner.
60 let mut config = Config::default();
61 config.baudrate = 57600;
62 config.stop_bits = StopBits::STOP1;
63 config.data_bits = DataBits::DataBits8;
64
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);
66 let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config);
67 let (mut tx, rx) = uart.split();
68
69 unwrap!(spawner.spawn(reader(rx)));
70 Timer::after_secs(1).await;
71
72 let mut vec_buf: Vec<u8, 32> = heapless::Vec::new();
73 {
74 // Clear buffers
75 vec_buf.clear();
76
77 // START
78 let _ = write_cmd_bytes(&mut vec_buf, &START.to_be_bytes()[..]);
79
80 // ADDRESS
81 let _ = write_cmd_bytes(&mut vec_buf, &ADDRESS.to_be_bytes()[..]);
82
83 // PID
84 let _ = vec_buf.push(0x01);
85
86 // LENGTH
87 let len = <usize as TryInto<u16>>::try_into(vec_buf.len()).unwrap() as u16;
88 let _ = write_cmd_bytes(&mut vec_buf, &len.to_be_bytes()[..]);
89
90 // COMMAND
91 let _ = vec_buf.push(0x35); // AuraLedConfig
92
93 // DATA
94 let _ = vec_buf.push(0x01); // ctrl=Breathing light
95 let _ = vec_buf.push(0x50); // speed=80
96 let _ = vec_buf.push(0x02); // colour=Blue
97 let _ = vec_buf.push(0x00); // times=Infinite
98
99 // SUM
100 let chk = compute_checksum(vec_buf.clone());
101 let _ = write_cmd_bytes(&mut vec_buf, &chk.to_be_bytes()[..]);
102
103 // =====
104
105 // Send command buffer.
106 let data: [u8; 16] = vec_buf.clone().into_array().unwrap();
107 debug!("data='{:?}'", data);
108 match tx.write(&data).await {
109 Ok(..) => info!("Write successful"),
110 Err(e) => info!("Write error: {:?}", e),
111 }
112 }
113}