added minimal animation for splash screen

This commit is contained in:
Nilton Constantino 2026-01-16 16:07:12 +00:00
parent 43f481d864
commit 4e278b29bd
No known key found for this signature in database
5 changed files with 63 additions and 5 deletions

View File

@ -21,9 +21,12 @@ impl Firmware {
} }
pub fn step_frame(&mut self, signals: &InputSignals, hw: &mut dyn HardwareBridge) { pub fn step_frame(&mut self, signals: &InputSignals, hw: &mut dyn HardwareBridge) {
let os = &mut self.os;
let next_state = match &mut self.state { let next_state = match &mut self.state {
FirmwareState::Reset => firmware_step_reset::step_reset(&mut self.os), FirmwareState::Reset => firmware_step_reset::step_reset(&mut self.os),
FirmwareState::SplashScreen => firmware_step_splash_screen::step_splash_screen(), FirmwareState::SplashScreen(frame) => {
firmware_step_splash_screen::step_splash_screen(frame, os, signals, hw)
},
FirmwareState::LaunchHub => firmware_step_launch_hub::launch_hub(&mut self.os, &mut self.hub), FirmwareState::LaunchHub => firmware_step_launch_hub::launch_hub(&mut self.os, &mut self.hub),
FirmwareState::HubHome => firmware_step_hub_home::step_hub_home(&mut self.hub, &mut self.os, hw), FirmwareState::HubHome => firmware_step_hub_home::step_hub_home(&mut self.hub, &mut self.os, hw),
FirmwareState::LoadApp(cartridge) => firmware_step_init_app::step_init_app(&mut self.os, signals, hw, cartridge), FirmwareState::LoadApp(cartridge) => firmware_step_init_app::step_init_app(&mut self.os, signals, hw, cartridge),

View File

@ -3,7 +3,7 @@ use crate::model::Cartridge;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum FirmwareState { pub enum FirmwareState {
Reset, Reset,
SplashScreen, SplashScreen(u32),
LaunchHub, LaunchHub,
HubHome, HubHome,
LoadApp(Cartridge), LoadApp(Cartridge),

View File

@ -4,5 +4,5 @@ use crate::prometeu_os::PrometeuOS;
pub fn step_reset(os: &mut PrometeuOS) -> Option<FirmwareState> { pub fn step_reset(os: &mut PrometeuOS) -> Option<FirmwareState> {
os.reset(); os.reset();
Some(FirmwareState::SplashScreen) Some(FirmwareState::SplashScreen(0))
} }

View File

@ -1,7 +1,51 @@
use crate::firmware::firmware_state::FirmwareState; use crate::firmware::firmware_state::FirmwareState;
use crate::hardware::{HardwareBridge, InputSignals, LoopMode};
use crate::model::Color;
use crate::prometeu_os::PrometeuOS;
pub fn step_splash_screen() -> Option<FirmwareState> { pub fn step_splash_screen(frame: &mut u32, os: &mut PrometeuOS, signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option<FirmwareState> {
const ANIMATION_DURATION: u32 = 60; // 1 segundo a 60fps
const TOTAL_DURATION: u32 = 240; // 4 segundos totais
// Atualiza periféricos para input
hw.pad_mut().begin_frame(signals);
Some(FirmwareState::LaunchHub) // Tocar som no primeiro frame
if *frame == 0 {
if let Some(sample) = os.sample_square.clone() {
hw.audio_mut().play(sample, 0, 255, 127, 1.0, 0, LoopMode::Off);
}
}
// Limpar tela
hw.gfx_mut().clear(Color::BLACK);
// Desenhar quadrado aumentando
let (sw, sh) = hw.gfx().size();
let max_size = (sw.min(sh) as i32 / 2).max(1);
let current_size = if *frame < ANIMATION_DURATION {
(max_size * (*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;
hw.gfx_mut().fill_rect(x, y, current_size, current_size, Color::WHITE);
hw.gfx_mut().present();
// Lógica de transição
// Caso o botão start seja pressionado a qualquer momento depois da animação terminar
if *frame >= ANIMATION_DURATION && hw.pad().any() {
return Some(FirmwareState::LaunchHub);
}
if *frame >= TOTAL_DURATION {
return Some(FirmwareState::LaunchHub);
}
*frame += 1;
None
} }

View File

@ -36,6 +36,17 @@ impl Pad {
self.start.begin_frame(signals.start_signal); self.start.begin_frame(signals.start_signal);
self.select.begin_frame(signals.select_signal); self.select.begin_frame(signals.select_signal);
} }
pub fn any(&self) -> bool {
self.a.down
|| self.b.down
|| self.x.down
|| self.y.down
|| self.l.down
|| self.r.down
|| self.start.down
|| self.select.down
}
} }