fix display override

This commit is contained in:
2025-11-06 09:27:33 -07:00
parent fe5b2a253e
commit 3f6ed9b5a7
3 changed files with 36 additions and 36 deletions

View File

@@ -39,9 +39,7 @@ use crate::{
ui::{clear_screen, ui_handler}, ui::{clear_screen, ui_handler},
usb::usb_handler, usb::usb_handler,
}; };
use core::sync::atomic::{AtomicBool, Ordering};
use embassy_executor::{Executor, Spawner}; use embassy_executor::{Executor, Spawner};
use embassy_futures::select::select;
use embassy_rp::{ use embassy_rp::{
Peri, Peri,
gpio::{Input, Level, Output, Pull}, gpio::{Input, Level, Output, Pull},
@@ -107,9 +105,6 @@ async fn watchdog_task(mut watchdog: Watchdog) {
} }
} }
static ENABLE_UI: AtomicBool = AtomicBool::new(true);
static UI_CHANGE: Signal<CriticalSectionRawMutex, ()> = Signal::new();
#[embassy_executor::main] #[embassy_executor::main]
async fn main(_spawner: Spawner) { async fn main(_spawner: Spawner) {
let p = embassy_rp::init(Default::default()); let p = embassy_rp::init(Default::default());
@@ -177,24 +172,15 @@ async fn userland_task() {
let name = recv.receive().await; let name = recv.receive().await;
let (entry, _bump) = unsafe { load_binary(&name).await.expect("unable to load binary") }; let (entry, _bump) = unsafe { load_binary(&name).await.expect("unable to load binary") };
// disable kernel ui clear_screen().await;
{
ENABLE_UI.store(false, Ordering::Release);
UI_CHANGE.signal(());
clear_screen().await;
}
unsafe { MS_SINCE_LAUNCH = Some(Instant::now()) }; unsafe { MS_SINCE_LAUNCH = Some(Instant::now()) };
#[cfg(feature = "defmt")] #[cfg(feature = "defmt")]
defmt::info!("Executing Binary"); defmt::info!("Executing Binary");
entry(); entry();
// enable kernel ui STOP_KEY_HANDLER.signal(());
{ clear_screen().await;
ENABLE_UI.store(true, Ordering::Release);
UI_CHANGE.signal(());
clear_screen().await;
}
} }
} }
@@ -336,18 +322,25 @@ async fn kernel_task(
let usb_driver = embassy_rp_usb::Driver::new(usb, Irqs); let usb_driver = embassy_rp_usb::Driver::new(usb, Irqs);
spawner.spawn(usb_handler(usb_driver)).unwrap(); spawner.spawn(usb_handler(usb_driver)).unwrap();
let mut ui_enabled = true;
loop { loop {
let ui_enabled = ENABLE_UI.load(Ordering::Relaxed);
if ui_enabled { if ui_enabled {
select(ui_handler(), UI_CHANGE.wait()).await; ui_handler().await;
} else { } else {
select(key_handler(), UI_CHANGE.wait()).await; key_handler().await;
} }
ui_enabled ^= true // flip bool
} }
} }
static STOP_KEY_HANDLER: Signal<CriticalSectionRawMutex, ()> = Signal::new();
async fn key_handler() { async fn key_handler() {
loop { loop {
if STOP_KEY_HANDLER.try_take().is_some() {
break;
}
if let Some(event) = read_keyboard_fifo().await { if let Some(event) = read_keyboard_fifo().await {
if let KeyState::Pressed = event.state { if let KeyState::Pressed = event.state {
unsafe { unsafe {

View File

@@ -23,7 +23,7 @@ pub static SCSI_HALT: AtomicBool = AtomicBool::new(false);
// number of blocks to read from sd at once // number of blocks to read from sd at once
// higher is better, but is larger. Size is BLOCKS * 512 bytes // higher is better, but is larger. Size is BLOCKS * 512 bytes
const BLOCKS: usize = 5; const BLOCKS: usize = 10;
static mut BLOCK_BUF: LazyLock<[Block; BLOCKS]> = static mut BLOCK_BUF: LazyLock<[Block; BLOCKS]> =
LazyLock::new(|| core::array::from_fn(|_| Block::new())); LazyLock::new(|| core::array::from_fn(|_| Block::new()));

View File

@@ -1,7 +1,6 @@
use crate::{ use crate::{
BINARY_CH, BINARY_CH,
display::FRAMEBUFFER, display::FRAMEBUFFER,
elf::load_binary,
framebuffer::FB_PAUSED, framebuffer::FB_PAUSED,
peripherals::keyboard, peripherals::keyboard,
storage::{FileName, SDCARD}, storage::{FileName, SDCARD},
@@ -10,7 +9,6 @@ use crate::{
use abi_sys::keyboard::{KeyCode, KeyState}; use abi_sys::keyboard::{KeyCode, KeyState};
use alloc::{str::FromStr, string::String, vec::Vec}; use alloc::{str::FromStr, string::String, vec::Vec};
use core::sync::atomic::Ordering; use core::sync::atomic::Ordering;
use embassy_futures::yield_now;
use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex}; use embassy_sync::{blocking_mutex::raw::CriticalSectionRawMutex, mutex::Mutex};
use embassy_time::Timer; use embassy_time::Timer;
use embedded_graphics::{ use embedded_graphics::{
@@ -43,7 +41,10 @@ pub async fn ui_handler() {
update_selections().await; update_selections().await;
loop { loop {
input_handler(&mut ui, &mut menu, &mut scsi).await; if input_handler(&mut ui, &mut menu, &mut scsi).await {
overlay.clear().await;
return;
}
match ui.page { match ui.page {
UiPage::Menu => menu.draw().await, UiPage::Menu => menu.draw().await,
UiPage::Scsi => scsi.draw().await, UiPage::Scsi => scsi.draw().await,
@@ -53,7 +54,7 @@ pub async fn ui_handler() {
} }
} }
async fn input_handler(ui: &mut UiState, menu: &mut MenuPage, scsi: &mut ScsiPage) { async fn input_handler(ui: &mut UiState, menu: &mut MenuPage, scsi: &mut ScsiPage) -> bool {
if let Some(event) = keyboard::read_keyboard_fifo().await { if let Some(event) = keyboard::read_keyboard_fifo().await {
if event.state == KeyState::Pressed { if event.state == KeyState::Pressed {
match (&mut ui.page, event.key) { match (&mut ui.page, event.key) {
@@ -68,11 +69,12 @@ async fn input_handler(ui: &mut UiState, menu: &mut MenuPage, scsi: &mut ScsiPag
ui.page = UiPage::Menu; ui.page = UiPage::Menu;
update_selections().await; update_selections().await;
} }
(UiPage::Menu, _) => menu.handle_input(event.key).await, (UiPage::Menu, _) => return menu.handle_input(event.key).await,
(UiPage::Scsi, _) => scsi.handle_input(event.key).await, (UiPage::Scsi, _) => return scsi.handle_input(event.key).await,
} }
} }
} }
false
} }
struct Overlay { struct Overlay {
@@ -103,6 +105,12 @@ impl Overlay {
self.last_bounds = Some(text.bounds()); self.last_bounds = Some(text.bounds());
text.draw(fb).unwrap(); text.draw(fb).unwrap();
} }
async fn clear(&mut self) {
if let Some(rect) = self.last_bounds {
clear_rect(rect).await
}
}
} }
enum UiPage { enum UiPage {
@@ -116,7 +124,7 @@ struct UiState {
trait Page { trait Page {
async fn draw(&mut self); async fn draw(&mut self);
async fn handle_input(&mut self, key: KeyCode); async fn handle_input(&mut self, key: KeyCode) -> bool;
async fn clear(&mut self); async fn clear(&mut self);
} }
@@ -131,7 +139,7 @@ impl Page for ScsiPage {
let bounds = fb.bounding_box(); let bounds = fb.bounding_box();
Text::with_alignment( Text::with_alignment(
"Mass storage over usb enabled", "Usb Mass storage enabled",
bounds.center(), bounds.center(),
text_style, text_style,
Alignment::Center, Alignment::Center,
@@ -140,8 +148,8 @@ impl Page for ScsiPage {
.unwrap(); .unwrap();
} }
async fn handle_input(&mut self, _key: KeyCode) { async fn handle_input(&mut self, _key: KeyCode) -> bool {
() false
} }
async fn clear(&mut self) { async fn clear(&mut self) {
@@ -240,17 +248,15 @@ impl Page for MenuPage {
FB_PAUSED.store(false, Ordering::Release); // ensure all elements show up at once FB_PAUSED.store(false, Ordering::Release); // ensure all elements show up at once
} }
async fn handle_input(&mut self, key: KeyCode) { async fn handle_input(&mut self, key: KeyCode) -> bool {
match key { match key {
KeyCode::Enter | KeyCode::Right => { KeyCode::Enter | KeyCode::Right => {
let selections = SELECTIONS.lock().await; let selections = SELECTIONS.lock().await;
let selection = selections[self.selection].clone(); let selection = selections[self.selection].clone();
BINARY_CH.send(selection.short_name).await;
self.clear().await; self.clear().await;
loop { BINARY_CH.send(selection.short_name).await;
yield_now().await; return true;
}
} }
KeyCode::Up => { KeyCode::Up => {
if self.selection > 0 { if self.selection > 0 {
@@ -272,6 +278,7 @@ impl Page for MenuPage {
_ => (), _ => (),
} }
self.changed = true; self.changed = true;
false
} }
async fn clear(&mut self) { async fn clear(&mut self) {