diff --git a/crates/prometeu-core/src/firmware/firmware.rs b/crates/prometeu-core/src/firmware/firmware.rs index 12b7fb3c..b6b8e597 100644 --- a/crates/prometeu-core/src/firmware/firmware.rs +++ b/crates/prometeu-core/src/firmware/firmware.rs @@ -1,6 +1,7 @@ use crate::firmware::firmware_state::FirmwareState; +use crate::firmware::{firmware_step_crash_screen, firmware_step_hub_home, firmware_step_init_app, firmware_step_launch_hub, firmware_step_reset, firmware_step_run_app, firmware_step_splash_screen}; use crate::hardware::{HardwareBridge, InputSignals}; -use crate::model::{Cartridge, Color}; +use crate::model::Cartridge; use crate::prometeu_hub::PrometeuHub; use crate::prometeu_os::PrometeuOS; @@ -21,67 +22,19 @@ impl Firmware { pub fn step_frame(&mut self, signals: &InputSignals, hw: &mut dyn HardwareBridge) { let next_state = match &mut self.state { - FirmwareState::Reset => Self::step_reset(&mut self.os), - FirmwareState::SplashScreen => Self::step_splash_screen(), - FirmwareState::LaunchHub => Self::step_launch_hub(&mut self.hub), - FirmwareState::HubHome => Self::step_hub_home(&mut self.hub, &mut self.os, hw), - FirmwareState::LoadApp(cartridge) => Self::step_init_app(&mut self.os, signals, hw, cartridge), - FirmwareState::AppRunning => Self::step_run_app(&mut self.os, signals, hw), - FirmwareState::AppCrashes(_error) => Self::step_crash_screen(signals, hw), + FirmwareState::Reset => firmware_step_reset::step_reset(&mut self.os), + FirmwareState::SplashScreen => firmware_step_splash_screen::step_splash_screen(), + 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::LoadApp(cartridge) => firmware_step_init_app::step_init_app(&mut self.os, signals, hw, cartridge), + FirmwareState::AppRunning => firmware_step_run_app::step_run_app(&mut self.os, signals, hw), + FirmwareState::AppCrashes(_error) => firmware_step_crash_screen::step_crash_screen(signals, hw), }; if let Some(new_state) = next_state { self.state = new_state; } } - - fn step_reset(os: &mut PrometeuOS) -> Option { - os.reset(); - Some(FirmwareState::SplashScreen) - } - - fn step_splash_screen() -> Option { - Some(FirmwareState::LaunchHub) - } - - fn step_launch_hub(hub: &mut PrometeuHub) -> Option { - hub.init(); - Some(FirmwareState::HubHome) - } - - fn step_hub_home(hub: &mut PrometeuHub, os: &mut PrometeuOS, hw: &mut dyn HardwareBridge) -> Option { - hw.gfx_mut().clear(Color::INDIGO); - hub.gui_update(os); - hw.gfx_mut().present(); - None - } - - fn step_init_app(os: &mut PrometeuOS, _signals: &InputSignals, _hw: &mut dyn HardwareBridge, cartridge: &Cartridge) -> Option { - os.initialize_vm(cartridge); - // a gente precisa carregar e inicializar o cartridge antes de mudar o estado para AppRunning - Some(FirmwareState::AppRunning) - } - - fn step_run_app(os: &mut PrometeuOS, signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option { - os.step_frame(signals, hw).map(FirmwareState::AppCrashes) - } - - fn step_crash_screen(signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option { - // Atualiza periféricos para input na tela de crash - hw.pad_mut().begin_frame(signals); - - // Tela de erro: fundo vermelho, texto branco - hw.gfx_mut().clear(Color::RED); - // Por enquanto apenas logamos ou mostramos algo simples - // No futuro, usar draw_text - hw.gfx_mut().present(); - - // Se apertar START, volta pro Hub - if hw.pad().start.down { - return Some(FirmwareState::LaunchHub); - } - None - } pub fn load_cartridge(&mut self, cartridge: Cartridge) { self.state = FirmwareState::LoadApp(cartridge); // change state diff --git a/crates/prometeu-core/src/firmware/firmware_step_crash_screen.rs b/crates/prometeu-core/src/firmware/firmware_step_crash_screen.rs new file mode 100644 index 00000000..103fc987 --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_crash_screen.rs @@ -0,0 +1,21 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::hardware::{HardwareBridge, InputSignals}; +use crate::model::Color; + +pub fn step_crash_screen(signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option { + // Atualiza periféricos para input na tela de crash + hw.pad_mut().begin_frame(signals); + + // Tela de erro: fundo vermelho, texto branco + hw.gfx_mut().clear(Color::RED); + // Por enquanto apenas logamos ou mostramos algo simples + // No futuro, usar draw_text + hw.gfx_mut().present(); + + // Se apertar START, volta pro Hub + if hw.pad().start.down { + return Some(FirmwareState::LaunchHub); + } + + None +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_hub_home.rs b/crates/prometeu-core/src/firmware/firmware_step_hub_home.rs new file mode 100644 index 00000000..ab43763f --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_hub_home.rs @@ -0,0 +1,12 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::hardware::HardwareBridge; +use crate::model::Color; +use crate::prometeu_hub::PrometeuHub; +use crate::prometeu_os::PrometeuOS; + +pub fn step_hub_home(hub: &mut PrometeuHub, os: &mut PrometeuOS, hw: &mut dyn HardwareBridge) -> Option { +hw.gfx_mut().clear(Color::INDIGO); +hub.gui_update(os); +hw.gfx_mut().present(); + None +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_init_app.rs b/crates/prometeu-core/src/firmware/firmware_step_init_app.rs new file mode 100644 index 00000000..7291b61d --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_init_app.rs @@ -0,0 +1,9 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::hardware::{HardwareBridge, InputSignals}; +use crate::model::Cartridge; +use crate::prometeu_os::PrometeuOS; + +pub fn step_init_app(os: &mut PrometeuOS, _signals: &InputSignals, _hw: &mut dyn HardwareBridge, cartridge: &Cartridge) -> Option { + os.initialize_vm(cartridge); + Some(FirmwareState::AppRunning) +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_launch_hub.rs b/crates/prometeu-core/src/firmware/firmware_step_launch_hub.rs new file mode 100644 index 00000000..d408f7b6 --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_launch_hub.rs @@ -0,0 +1,8 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::prometeu_hub::PrometeuHub; +use crate::prometeu_os::PrometeuOS; + +pub fn launch_hub(os: &mut PrometeuOS, hub: &mut PrometeuHub) -> Option { + hub.init(); + Some(FirmwareState::HubHome) +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_reset.rs b/crates/prometeu-core/src/firmware/firmware_step_reset.rs new file mode 100644 index 00000000..abcb5070 --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_reset.rs @@ -0,0 +1,7 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::prometeu_os::PrometeuOS; + +pub fn step_reset(os: &mut PrometeuOS) -> Option { + os.reset(); + Some(FirmwareState::SplashScreen) +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_run_app.rs b/crates/prometeu-core/src/firmware/firmware_step_run_app.rs new file mode 100644 index 00000000..edc988f1 --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_run_app.rs @@ -0,0 +1,7 @@ +use crate::firmware::firmware_state::FirmwareState; +use crate::hardware::{HardwareBridge, InputSignals}; +use crate::prometeu_os::PrometeuOS; + +pub fn step_run_app(os: &mut PrometeuOS, signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option { + os.step_frame(signals, hw).map(FirmwareState::AppCrashes) +} diff --git a/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs b/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs new file mode 100644 index 00000000..27d54a3a --- /dev/null +++ b/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs @@ -0,0 +1,5 @@ +use crate::firmware::firmware_state::FirmwareState; + +pub fn step_splash_screen() -> Option { + Some(FirmwareState::LaunchHub) +} \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/mod.rs b/crates/prometeu-core/src/firmware/mod.rs index 026f7bec..a0c74c6e 100644 --- a/crates/prometeu-core/src/firmware/mod.rs +++ b/crates/prometeu-core/src/firmware/mod.rs @@ -1,4 +1,12 @@ mod firmware; pub mod firmware_state; +mod firmware_step_reset; +mod firmware_step_splash_screen; +mod firmware_step_launch_hub; +mod firmware_step_hub_home; +mod firmware_step_init_app; +mod firmware_step_run_app; +mod firmware_step_crash_screen; + pub use firmware::Firmware;