mirror of
https://github.com/LegitCamper/picocalc-os-rs.git
synced 2025-12-27 07:45:28 +00:00
fix loader
This commit is contained in:
@@ -18,6 +18,8 @@ mod ui;
|
|||||||
mod usb;
|
mod usb;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
display::{clear_fb, display_handler, init_display},
|
display::{clear_fb, display_handler, init_display},
|
||||||
peripherals::{
|
peripherals::{
|
||||||
@@ -78,14 +80,7 @@ static ALLOCATOR: Talck<spin::Mutex<()>, ClaimOnOom> =
|
|||||||
Talc::new(unsafe { ClaimOnOom::new(Span::from_array(core::ptr::addr_of!(ARENA).cast_mut())) })
|
Talc::new(unsafe { ClaimOnOom::new(Span::from_array(core::ptr::addr_of!(ARENA).cast_mut())) })
|
||||||
.lock();
|
.lock();
|
||||||
|
|
||||||
static TASK_STATE: Mutex<CriticalSectionRawMutex, TaskState> = Mutex::new(TaskState::Selection);
|
static ENABLE_UI: AtomicBool = AtomicBool::new(true);
|
||||||
static TASK_STATE_CHANGED: Signal<CriticalSectionRawMutex, ()> = Signal::new();
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq)]
|
|
||||||
enum TaskState {
|
|
||||||
Selection,
|
|
||||||
Kernel,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[embassy_executor::main]
|
#[embassy_executor::main]
|
||||||
async fn main(spawner: Spawner) {
|
async fn main(spawner: Spawner) {
|
||||||
@@ -141,9 +136,7 @@ async fn userland_task() {
|
|||||||
|
|
||||||
// disable kernel ui
|
// disable kernel ui
|
||||||
{
|
{
|
||||||
let mut state = TASK_STATE.lock().await;
|
ENABLE_UI.store(false, Ordering::Release);
|
||||||
*state = TaskState::Kernel;
|
|
||||||
TASK_STATE_CHANGED.signal(());
|
|
||||||
// clear_fb();
|
// clear_fb();
|
||||||
MSC_SHUTDOWN.signal(());
|
MSC_SHUTDOWN.signal(());
|
||||||
}
|
}
|
||||||
@@ -153,9 +146,7 @@ async fn userland_task() {
|
|||||||
|
|
||||||
// enable kernel ui
|
// enable kernel ui
|
||||||
{
|
{
|
||||||
let mut state = TASK_STATE.lock().await;
|
ENABLE_UI.store(true, Ordering::Release);
|
||||||
*state = TaskState::Selection;
|
|
||||||
TASK_STATE_CHANGED.signal(());
|
|
||||||
// clear_fb();
|
// clear_fb();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -244,7 +235,7 @@ async fn kernel_task(
|
|||||||
spawner.spawn(key_handler()).unwrap();
|
spawner.spawn(key_handler()).unwrap();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if let TaskState::Selection = *TASK_STATE.lock().await {
|
if ENABLE_UI.load(Ordering::Relaxed) {
|
||||||
let ui_fut = ui_handler();
|
let ui_fut = ui_handler();
|
||||||
let binary_search_fut = prog_search_handler();
|
let binary_search_fut = prog_search_handler();
|
||||||
|
|
||||||
|
|||||||
@@ -74,19 +74,19 @@ impl<'d, 's, D: Driver<'d>> MassStorageClass<'d, D> {
|
|||||||
async fn handle_cbw(&mut self) {
|
async fn handle_cbw(&mut self) {
|
||||||
let mut cbw_buf = [0u8; 31];
|
let mut cbw_buf = [0u8; 31];
|
||||||
if let Ok(n) = self.bulk_out.read(&mut cbw_buf).await {
|
if let Ok(n) = self.bulk_out.read(&mut cbw_buf).await {
|
||||||
// Take sdcard to increase speed
|
|
||||||
if self.temp_sd.is_none() {
|
|
||||||
let mut guard = SDCARD.get().lock().await;
|
|
||||||
if let Some(sd) = guard.take() {
|
|
||||||
self.temp_sd = Some(sd);
|
|
||||||
} else {
|
|
||||||
defmt::warn!("Tried to take SDCARD but it was already taken");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if n == 31 {
|
if n == 31 {
|
||||||
if let Some(cbw) = CommandBlockWrapper::parse(&cbw_buf[..n]) {
|
if let Some(cbw) = CommandBlockWrapper::parse(&cbw_buf[..n]) {
|
||||||
|
// Take sdcard to increase speed
|
||||||
|
if self.temp_sd.is_none() {
|
||||||
|
let mut guard = SDCARD.get().lock().await;
|
||||||
|
if let Some(sd) = guard.take() {
|
||||||
|
self.temp_sd = Some(sd);
|
||||||
|
} else {
|
||||||
|
defmt::warn!("Tried to take SDCARD but it was already taken");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let command = parse_cb(&cbw.CBWCB);
|
let command = parse_cb(&cbw.CBWCB);
|
||||||
if self.handle_command(command).await.is_ok() {
|
if self.handle_command(command).await.is_ok() {
|
||||||
self.send_csw_success(cbw.dCBWTag).await
|
self.send_csw_success(cbw.dCBWTag).await
|
||||||
|
|||||||
Reference in New Issue
Block a user