use crate::firmware::firmware_state::{FirmwareState, LaunchHubStep}; use crate::firmware::prometeu_context::PrometeuContext; use prometeu_hal::color::Color; use prometeu_hal::log::{LogLevel, LogSource}; #[derive(Debug, Clone)] pub struct SplashScreenStep { pub frame: u32, } impl SplashScreenStep { pub fn on_enter(&mut self, ctx: &mut PrometeuContext) { ctx.os.log(LogLevel::Info, LogSource::Pos, 0, "Showing SplashScreen".to_string()); // Play sound on enter // ctx.hw.audio_mut().play(0, 0, 0, 255, 127, 1.0, 0, LoopMode::Off); } pub fn on_update(&mut self, ctx: &mut PrometeuContext) -> Option { const ANIMATION_DURATION: u32 = 60; // 1 second at 60fps const TOTAL_DURATION: u32 = 240; // 4 seconds total (updated from 2s based on total_duration logic) // Update peripherals for input ctx.hw.pad_mut().begin_frame(ctx.signals); // Clear screen ctx.hw.gfx_mut().clear(Color::BLACK); // Draw expanding square let (sw, sh) = ctx.hw.gfx().size(); let max_size = (sw.min(sh) as i32 / 2).max(1); let current_size = if self.frame < ANIMATION_DURATION { (max_size * (self.frame as i32 + 1)) / ANIMATION_DURATION as i32 } else { max_size }; let x = (sw as i32 - current_size) / 2; let y = (sh as i32 - current_size) / 2; ctx.hw.gfx_mut().fill_rect(x, y, current_size, current_size, Color::WHITE); ctx.hw.gfx_mut().present(); // Transition logic // If any button is pressed at any time after the animation ends if self.frame >= ANIMATION_DURATION && ctx.hw.pad().any() { return Some(FirmwareState::LaunchHub(LaunchHubStep)); } if self.frame >= TOTAL_DURATION { return Some(FirmwareState::LaunchHub(LaunchHubStep)); } self.frame += 1; None } pub fn on_exit(&mut self, _ctx: &mut PrometeuContext) {} }