73 lines
2.3 KiB
Rust
73 lines
2.3 KiB
Rust
#![no_std]
|
|
#![no_main]
|
|
|
|
extern crate panic_semihosting;
|
|
extern crate cortex_m_rt as rt;
|
|
extern crate cortex_m_semihosting as sh;
|
|
extern crate heapless;
|
|
extern crate microbit;
|
|
|
|
use core::fmt::Write;
|
|
use rt::entry;
|
|
use sh::hio;
|
|
use heapless::{consts, Vec, String};
|
|
|
|
use microbit::hal::prelude::*;
|
|
use microbit::hal::delay::Delay;
|
|
use microbit::hal::serial;
|
|
use microbit::hal::serial::BAUD115200;
|
|
|
|
#[entry]
|
|
fn main() -> ! {
|
|
let mut stdout = hio::hstdout().unwrap();
|
|
writeln!(stdout, "Start").unwrap();
|
|
if let Some(p) = microbit::Peripherals::take() {
|
|
// Split GPIO
|
|
let mut gpio = p.GPIO.split();
|
|
// Create delay provider
|
|
let mut delay = Delay::new(p.TIMER0);
|
|
// Configure RX and TX pins accordingly
|
|
let tx = gpio.pin24.into_push_pull_output().downgrade();
|
|
let rx = gpio.pin25.into_floating_input().downgrade();
|
|
// Configure serial communication
|
|
let (mut tx, mut rx) = serial::Serial::uart0(p.UART0, tx, rx, BAUD115200).split();
|
|
writeln!(tx, "Start");
|
|
loop {
|
|
// A buffer with 32 bytes of capacity
|
|
let mut buffer: Vec<u8, consts::U32> = Vec::new();
|
|
loop {
|
|
// Read
|
|
let byte = block!(rx.read()).unwrap();
|
|
// Echo
|
|
block!(tx.write(byte));
|
|
// Carriage return
|
|
if byte == b'\r' {
|
|
break;
|
|
}
|
|
// Push to buffer
|
|
if buffer.push(byte).is_err() {
|
|
// Buffer full
|
|
writeln!(tx, "\r\nWarning: buffer full, dumping buffer");
|
|
break;
|
|
}
|
|
}
|
|
// Buffer to string
|
|
let buf_str = String::from_utf8(buffer).unwrap();
|
|
writeln!(tx, "");
|
|
match buf_str.parse() {
|
|
// Transmit countdown
|
|
Ok(buf_int) => {
|
|
for i in (1..buf_int).rev() {
|
|
delay.delay_ms(1000_u32);
|
|
writeln!(tx, "{}", i);
|
|
}
|
|
// Add post countdown effects here
|
|
},
|
|
// Transmit parse error
|
|
Err(e) => writeln!(tx, "{:?}", e).unwrap(),
|
|
}
|
|
}
|
|
}
|
|
panic!("End");
|
|
}
|