Implement interactivity
This commit is contained in:
parent
ff8483dbaa
commit
0a1f5f2dfb
57
src/main.rs
57
src/main.rs
@ -2,16 +2,17 @@
|
|||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
use core::cell::RefCell;
|
use core::cell::RefCell;
|
||||||
use defmt::info;
|
use defmt::{error, info};
|
||||||
use display_interface_spi::SPIInterface;
|
use display_interface_spi::SPIInterface;
|
||||||
use embassy_embedded_hal::shared_bus::blocking::spi::SpiDevice;
|
use embassy_embedded_hal::shared_bus::blocking::spi::SpiDevice;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_nrf::{
|
use embassy_nrf::{
|
||||||
bind_interrupts,
|
bind_interrupts,
|
||||||
gpio::{AnyPin, Level, Output, OutputDrive, Pin},
|
gpio::{AnyPin, Input, Level, Output, OutputDrive, Pin},
|
||||||
peripherals, spim,
|
peripherals, spim,
|
||||||
};
|
};
|
||||||
use embassy_sync::blocking_mutex::Mutex;
|
use embassy_sync::blocking_mutex::{raw::ThreadModeRawMutex, Mutex};
|
||||||
|
use embassy_sync::channel::{Channel, Sender};
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Duration, Timer};
|
||||||
use ili9341::Ili9341;
|
use ili9341::Ili9341;
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
@ -51,6 +52,8 @@ async fn blink(pin: AnyPin, blink_delay: Duration) -> ! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GUI_CHANNEL: Channel<ThreadModeRawMutex, gui::GuiAction, 8> = Channel::new();
|
||||||
|
|
||||||
#[embassy_executor::task]
|
#[embassy_executor::task]
|
||||||
async fn gui_task(
|
async fn gui_task(
|
||||||
peripheral: embassy_nrf::peripherals::SERIAL3,
|
peripheral: embassy_nrf::peripherals::SERIAL3,
|
||||||
@ -108,10 +111,40 @@ async fn gui_task(
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let mut gui = Gui::new(display);
|
let mut gui = Gui::new(display);
|
||||||
|
gui.draw().expect("Failed to draw GUI");
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
info!("Waiting for GUI event");
|
||||||
|
// Wait to receive a GUI event
|
||||||
|
let gui_action = GUI_CHANNEL.receive().await;
|
||||||
|
// Re-render the GUI
|
||||||
|
info!("Received event, calculating new screen");
|
||||||
|
gui = gui.action(gui_action);
|
||||||
|
|
||||||
|
// Clear the screen
|
||||||
|
info!("Clearing screen");
|
||||||
|
gui.fill_black().expect("Failed to clear screen");
|
||||||
|
// Draw the GUI
|
||||||
|
info!("Drawing screen");
|
||||||
gui.draw().expect("Failed to draw GUI");
|
gui.draw().expect("Failed to draw GUI");
|
||||||
info!("Finished drawing GUI");
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[embassy_executor::task(pool_size = 2)]
|
||||||
|
async fn input_controller(
|
||||||
|
control: Sender<'static, ThreadModeRawMutex, gui::GuiAction, 8>,
|
||||||
|
pin: AnyPin,
|
||||||
|
action: gui::GuiAction,
|
||||||
|
) -> ! {
|
||||||
|
let mut button = Input::new(pin, embassy_nrf::gpio::Pull::Up);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// Wait for the button to be pressed
|
||||||
|
button.wait_for_falling_edge().await;
|
||||||
|
// Send the event
|
||||||
|
if let Err(_e) = control.try_send(action) {
|
||||||
|
error!("Failed to send input action with error");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,6 +183,22 @@ async fn main(spawner: Spawner) {
|
|||||||
))
|
))
|
||||||
.expect("Failed to spawn GUI task");
|
.expect("Failed to spawn GUI task");
|
||||||
|
|
||||||
|
// Create the GUI controllers
|
||||||
|
spawner
|
||||||
|
.spawn(input_controller(
|
||||||
|
GUI_CHANNEL.sender(),
|
||||||
|
p.P0_06.degrade(),
|
||||||
|
gui::GuiAction::Down,
|
||||||
|
))
|
||||||
|
.expect("Failed tp spawn DOWN input controller");
|
||||||
|
spawner
|
||||||
|
.spawn(input_controller(
|
||||||
|
GUI_CHANNEL.sender(),
|
||||||
|
p.P0_07.degrade(),
|
||||||
|
gui::GuiAction::Select,
|
||||||
|
))
|
||||||
|
.expect("Failed tp spawn Select input controller");
|
||||||
|
|
||||||
// Now loop, re-running the demo every second
|
// Now loop, re-running the demo every second
|
||||||
loop {
|
loop {
|
||||||
info!("Hello, world!");
|
info!("Hello, world!");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user