diff --git a/firmware/Cargo.lock b/firmware/Cargo.lock index f835f10..701cf53 100644 --- a/firmware/Cargo.lock +++ b/firmware/Cargo.lock @@ -271,6 +271,7 @@ dependencies = [ "defmt 0.3.100", "defmt-rtt", "embedded-hal", + "nb 1.1.0", "panic-halt", "stm32f0xx-hal", ] diff --git a/firmware/Cargo.toml b/firmware/Cargo.toml index c0e8bc1..1bf7026 100644 --- a/firmware/Cargo.toml +++ b/firmware/Cargo.toml @@ -7,9 +7,10 @@ version = "0.1.0" cortex-m = { version = "0.7", features = ["inline-asm", "critical-section-single-core"] } cortex-m-rt = "0.7" critical-section = "1" -stm32f0xx-hal = { version = "0.18", features = ["stm32f042", "rt"] } embedded-hal = "0.2" +nb = "1" panic-halt = "0.2" +stm32f0xx-hal = { version = "0.18", features = ["stm32f042", "rt"] } # For debugging and logging defmt = "0.3" diff --git a/firmware/src/main.rs b/firmware/src/main.rs index c668249..39fcfbb 100644 --- a/firmware/src/main.rs +++ b/firmware/src/main.rs @@ -3,8 +3,13 @@ use panic_halt as _; use cortex_m_rt::entry; -use stm32f0xx_hal::{ - delay::Delay, prelude::*, stm32 +use stm32f0xx_hal::serial::Error; +use stm32f0xx_hal as hal; +use hal::prelude::*; +use hal::stm32; +use hal::{ + delay::Delay, + serial::Serial, }; struct Bus { @@ -33,7 +38,7 @@ fn main() -> ! { .sysclk(48.mhz()) .pclk(24.mhz()) .freeze(&mut dp.FLASH); - + // Set up delay provider let mut delay = Delay::new(cp.SYST, &rcc); @@ -55,28 +60,46 @@ fn main() -> ! { pb7: gpiob.pb7.into_push_pull_output(cs), } }); - + + let mut serial = cortex_m::interrupt::free(|cs| { + let tx = gpioa.pa9.into_alternate_af1(cs); + let rx = gpioa.pa10.into_alternate_af1(cs); + //dp.USART1.cr1.write(|w| w.uesm().enabled()); + Serial::usart1(dp.USART1, (tx, rx), 31_250.bps(), &mut rcc) + }); + // Loop loop { - for ic in 0..=2 { - for i in 0..256 { - bus.output(ic, 1 << i, &mut delay); - delay.delay_ms(100u16); + use stm32f0xx_hal::serial::Error; + //type Error = nb::Error; + //use embedded_hal::serial::nb::Error; + match serial.read() { + Ok(_) => { + bus.led_button_1(&mut delay); + } + Err(nb::Error::WouldBlock) => { + bus.led_button_3(&mut delay); + } + Err(nb::Error::Other(Error::Framing)) => { + bus.led_button_2(&mut delay); + } + Err(nb::Error::Other(Error::Noise)) => { + bus.led_button_9(&mut delay); + } + Err(nb::Error::Other(_)) => { + bus.led_button_10(&mut delay); } } + delay.delay_ms(1000u16); } } impl Bus { fn output(&mut self, ic: u8, data: u8, delay: &mut Delay) { match ic { - 0 => self.select(1, delay), - 1 => self.select(0, delay), - 2 => self.select(5, delay), - - 3 => self.select(1, delay), - 10 => self.select(0, delay), - 11 => self.select(5, delay), + 0 | 3 => self.select(1, delay), + 1 | 10 => self.select(0, delay), + 2 | 11 => self.select(5, delay), _ => self.select(2, delay), } @@ -89,14 +112,14 @@ impl Bus { } fn write(&mut self, data: u8) { - self.pb0.set_state((data & 0b00000001 != 0).into()).ok(); - self.pb1.set_state((data & 0b00000010 != 0).into()).ok(); - self.pb2.set_state((data & 0b00000100 != 0).into()).ok(); - self.pb3.set_state((data & 0b00001000 != 0).into()).ok(); - self.pb4.set_state((data & 0b00010000 != 0).into()).ok(); - self.pb5.set_state((data & 0b00100000 != 0).into()).ok(); - self.pb6.set_state((data & 0b01000000 != 0).into()).ok(); - self.pb7.set_state((data & 0b10000000 != 0).into()).ok(); + self.pb0.set_state((data & 0b_0000_0001 != 0).into()).ok(); + self.pb1.set_state((data & 0b_0000_0010 != 0).into()).ok(); + self.pb2.set_state((data & 0b_0000_0100 != 0).into()).ok(); + self.pb3.set_state((data & 0b_0000_1000 != 0).into()).ok(); + self.pb4.set_state((data & 0b_0001_0000 != 0).into()).ok(); + self.pb5.set_state((data & 0b_0010_0000 != 0).into()).ok(); + self.pb6.set_state((data & 0b_0100_0000 != 0).into()).ok(); + self.pb7.set_state((data & 0b_1000_0000 != 0).into()).ok(); } fn select_en(&mut self, enable: bool) { @@ -196,4 +219,34 @@ impl Bus { delay.delay_ms(10u16); self.select_en.set_high().ok(); } + + fn led_button_1(&mut self, delay: &mut Delay) { + self.output(03, 0b1111_1011, delay); + self.output(10, 0b0001_0000, delay); + self.output(11, 0b0000_0000, delay); + } + + fn led_button_2(&mut self, delay: &mut Delay) { + self.output(03, 0b1111_1101, delay); + self.output(10, 0b0001_0000, delay); + self.output(11, 0b0000_0000, delay); + } + + fn led_button_3(&mut self, delay: &mut Delay) { + self.output(03, 0b1111_1110, delay); + self.output(10, 0b0001_0000, delay); + self.output(11, 0b0000_0000, delay); + } + + fn led_button_9(&mut self, delay: &mut Delay) { + self.output(03, 0b1110_1111, delay); + self.output(10, 0b0001_0000, delay); + self.output(11, 0b0000_0000, delay); + } + + fn led_button_10(&mut self, delay: &mut Delay) { + self.output(03, 0b1111_0111, delay); + self.output(10, 0b0001_0000, delay); + self.output(11, 0b0000_0000, delay); + } } \ No newline at end of file