mirror of
https://github.com/embassy-rs/embassy.git
synced 2025-02-16 17:02:30 +00:00
Finish the read part.
* Don't need separate task for this. * **Must** read one byte at a time, then merge them into one Vec. * To better demonstrate, cycle through the three colours Red, Blue, Purple.
This commit is contained in:
parent
c24805b83d
commit
61d0c068ff
@ -1,17 +1,17 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
use defmt::{debug, info, unwrap};
|
use defmt::info;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_rp::bind_interrupts;
|
use embassy_rp::bind_interrupts;
|
||||||
use embassy_rp::peripherals::UART0;
|
use embassy_rp::peripherals::UART0;
|
||||||
use embassy_rp::uart::{Async, Config, DataBits, InterruptHandler as UARTInterruptHandler, StopBits, Uart, UartRx};
|
use embassy_rp::uart::{Config, DataBits, InterruptHandler as UARTInterruptHandler, Parity, StopBits, Uart};
|
||||||
use embassy_time::Timer;
|
use embassy_time::Timer;
|
||||||
use heapless::Vec;
|
use heapless::Vec;
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
|
|
||||||
bind_interrupts!(pub struct Irqs {
|
bind_interrupts!(pub struct Irqs {
|
||||||
UART0_IRQ => UARTInterruptHandler<UART0>; // Fingerprint scanner (TX)
|
UART0_IRQ => UARTInterruptHandler<UART0>;
|
||||||
});
|
});
|
||||||
|
|
||||||
const ADDRESS: u32 = 0xFFFFFFFF;
|
const ADDRESS: u32 = 0xFFFFFFFF;
|
||||||
@ -34,24 +34,8 @@ fn compute_checksum(buf: Vec<u8, 32>) -> u16 {
|
|||||||
return checksum;
|
return checksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: Doesn't work for some reason, it just hangs!
|
|
||||||
#[embassy_executor::task]
|
|
||||||
async fn reader(mut rx: UartRx<'static, UART0, Async>) {
|
|
||||||
loop {
|
|
||||||
let mut buf = [0; 32];
|
|
||||||
debug!("Attempting read..");
|
|
||||||
|
|
||||||
//rx.read(&mut buf).await.unwrap();
|
|
||||||
match rx.read(&mut buf).await {
|
|
||||||
Ok(v) => info!("Read successful: {:?}", v),
|
|
||||||
Err(e) => info!("Read error: {:?}", e),
|
|
||||||
}
|
|
||||||
info!("RX='{:?}'", buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[embassy_executor::main]
|
#[embassy_executor::main]
|
||||||
async fn main(spawner: Spawner) {
|
async fn main(_spawner: Spawner) {
|
||||||
info!("Start");
|
info!("Start");
|
||||||
|
|
||||||
let p = embassy_rp::init(Default::default());
|
let p = embassy_rp::init(Default::default());
|
||||||
@ -61,16 +45,16 @@ async fn main(spawner: Spawner) {
|
|||||||
config.baudrate = 57600;
|
config.baudrate = 57600;
|
||||||
config.stop_bits = StopBits::STOP1;
|
config.stop_bits = StopBits::STOP1;
|
||||||
config.data_bits = DataBits::DataBits8;
|
config.data_bits = DataBits::DataBits8;
|
||||||
|
config.parity = Parity::ParityNone;
|
||||||
|
|
||||||
let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1);
|
let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1);
|
||||||
let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config);
|
let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config);
|
||||||
let (mut tx, rx) = uart.split();
|
let (mut tx, mut rx) = uart.split();
|
||||||
|
|
||||||
unwrap!(spawner.spawn(reader(rx)));
|
|
||||||
Timer::after_secs(1).await;
|
|
||||||
|
|
||||||
let mut vec_buf: Vec<u8, 32> = heapless::Vec::new();
|
let mut vec_buf: Vec<u8, 32> = heapless::Vec::new();
|
||||||
{
|
|
||||||
|
// Cycle through the three colours Red, Blue and Purple.
|
||||||
|
for colour in 1..=3 {
|
||||||
// Clear buffers
|
// Clear buffers
|
||||||
vec_buf.clear();
|
vec_buf.clear();
|
||||||
|
|
||||||
@ -93,7 +77,7 @@ async fn main(spawner: Spawner) {
|
|||||||
// DATA
|
// DATA
|
||||||
let _ = vec_buf.push(0x01); // ctrl=Breathing light
|
let _ = vec_buf.push(0x01); // ctrl=Breathing light
|
||||||
let _ = vec_buf.push(0x50); // speed=80
|
let _ = vec_buf.push(0x50); // speed=80
|
||||||
let _ = vec_buf.push(0x02); // colour=Blue
|
let _ = vec_buf.push(colour as u8); // colour=Red, Blue, Purple
|
||||||
let _ = vec_buf.push(0x00); // times=Infinite
|
let _ = vec_buf.push(0x00); // times=Infinite
|
||||||
|
|
||||||
// SUM
|
// SUM
|
||||||
@ -103,11 +87,46 @@ async fn main(spawner: Spawner) {
|
|||||||
// =====
|
// =====
|
||||||
|
|
||||||
// Send command buffer.
|
// Send command buffer.
|
||||||
let data: [u8; 16] = vec_buf.clone().into_array().unwrap();
|
let data_write: [u8; 16] = vec_buf.clone().into_array().unwrap();
|
||||||
debug!("data='{:?}'", data);
|
info!("write ({})='{:?}'", colour, data_write);
|
||||||
match tx.write(&data).await {
|
match tx.write(&data_write).await {
|
||||||
Ok(..) => info!("Write successful"),
|
Ok(..) => info!("Write successful."),
|
||||||
Err(e) => info!("Write error: {:?}", e),
|
Err(e) => info!("Write error: {:?}", e),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =====
|
||||||
|
|
||||||
|
// Read command buffer.
|
||||||
|
let mut read_buf: [u8; 1] = [0; 1]; // Can only read one byte at a time!
|
||||||
|
let mut data_read: Vec<u8, 32> = heapless::Vec::new(); // Return buffer.
|
||||||
|
let mut cnt: u8 = 0; // Keep track of how many packages we've received.
|
||||||
|
|
||||||
|
info!("Attempting read.");
|
||||||
|
loop {
|
||||||
|
match rx.read(&mut read_buf).await {
|
||||||
|
Ok(..) => (),
|
||||||
|
Err(e) => info!(" Read error: {:?}", e),
|
||||||
|
}
|
||||||
|
|
||||||
|
match cnt {
|
||||||
|
_ => data_read.push(read_buf[0]).unwrap(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if cnt > 10 {
|
||||||
|
info!("read ({})='{:?}'", colour, data_read[..]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt = cnt + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====
|
||||||
|
|
||||||
|
if colour != 3 {
|
||||||
|
Timer::after_secs(2).await;
|
||||||
|
info!("Changing colour.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
info!("All done..");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user