mirror of
https://github.com/LegitCamper/picocalc-os-rs.git
synced 2025-12-27 07:45:28 +00:00
fix display override
This commit is contained in:
@@ -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,26 +172,17 @@ 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
|
|
||||||
{
|
|
||||||
ENABLE_UI.store(false, Ordering::Release);
|
|
||||||
UI_CHANGE.signal(());
|
|
||||||
clear_screen().await;
|
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(());
|
||||||
{
|
|
||||||
ENABLE_UI.store(true, Ordering::Release);
|
|
||||||
UI_CHANGE.signal(());
|
|
||||||
clear_screen().await;
|
clear_screen().await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
struct Display {
|
struct Display {
|
||||||
spi: Peri<'static, SPI1>,
|
spi: Peri<'static, SPI1>,
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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()));
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user