From 6cc9e98e35b1f38a8bca7d3eb5e478d3ac72929d Mon Sep 17 00:00:00 2001 From: transistor Date: Wed, 10 Nov 2021 20:10:46 -0800 Subject: [PATCH] Rearranged minifb frontend to reduce the binary-specific code --- frontends/moa-minifb/src/bin/moa-genesis.rs | 40 ++-------------- frontends/moa-minifb/src/bin/moa-trs80.rs | 40 ++-------------- frontends/moa-minifb/src/lib.rs | 53 ++++++++++++++++++--- 3 files changed, 53 insertions(+), 80 deletions(-) diff --git a/frontends/moa-minifb/src/bin/moa-genesis.rs b/frontends/moa-minifb/src/bin/moa-genesis.rs index 86b82e4..ef381e8 100644 --- a/frontends/moa-minifb/src/bin/moa-genesis.rs +++ b/frontends/moa-minifb/src/bin/moa-genesis.rs @@ -1,43 +1,9 @@ -use std::thread; -use std::time::Duration; -use std::sync::{Arc, Mutex}; - use moa::machines::genesis::build_genesis; -use moa_minifb::MiniFrontendBuilder; +use moa_minifb::{run_inline, run_threaded}; fn main() { - /* - let mut frontend = Arc::new(Mutex::new(MiniFrontendBuilder::new())); - - { - let frontend = frontend.clone(); - thread::spawn(move || { - let mut system = build_genesis(&mut *(frontend.lock().unwrap())).unwrap(); - frontend.lock().unwrap().finalize(); - system.run_loop(); - }); - } - - wait_until_initialized(frontend.clone()); - - frontend - .lock().unwrap() - .build() - .start(None); - */ - - let mut frontend = MiniFrontendBuilder::new(); - let mut system = build_genesis(&mut frontend).unwrap(); - - frontend - .build() - .start(Some(system)); -} - -fn wait_until_initialized(frontend: Arc>) { - while frontend.lock().unwrap().finalized == false { - thread::sleep(Duration::from_millis(10)); - } + //run_inline(build_genesis); + run_threaded(build_genesis); } diff --git a/frontends/moa-minifb/src/bin/moa-trs80.rs b/frontends/moa-minifb/src/bin/moa-trs80.rs index f371871..b805fc2 100644 --- a/frontends/moa-minifb/src/bin/moa-trs80.rs +++ b/frontends/moa-minifb/src/bin/moa-trs80.rs @@ -1,43 +1,9 @@ -use std::thread; -use std::time::Duration; -use std::sync::{Arc, Mutex}; - use moa::machines::trs80::build_trs80; -use moa_minifb::MiniFrontendBuilder; +use moa_minifb::{run_inline, run_threaded}; fn main() { - /* - let mut frontend = Arc::new(Mutex::new(MiniFrontendBuilder::new())); - - { - let frontend = frontend.clone(); - thread::spawn(move || { - let mut system = build_trs80(&mut *(frontend.lock().unwrap())).unwrap(); - frontend.lock().unwrap().finalize(); - system.run_loop(); - }); - } - - wait_until_initialized(frontend.clone()); - - frontend - .lock().unwrap() - .build() - .start(None); - */ - - let mut frontend = MiniFrontendBuilder::new(); - let mut system = build_trs80(&mut frontend).unwrap(); - - frontend - .build() - .start(Some(system)); -} - -fn wait_until_initialized(frontend: Arc>) { - while frontend.lock().unwrap().finalized == false { - thread::sleep(Duration::from_millis(10)); - } + //run_inline(build_trs80); + run_threaded(build_trs80); } diff --git a/frontends/moa-minifb/src/lib.rs b/frontends/moa-minifb/src/lib.rs index a59c963..cf75014 100644 --- a/frontends/moa-minifb/src/lib.rs +++ b/frontends/moa-minifb/src/lib.rs @@ -1,6 +1,7 @@ mod keys; +use std::thread; use std::time::Duration; use std::sync::{Arc, Mutex}; @@ -13,8 +14,11 @@ use moa::host::traits::{Host, JoystickDevice, JoystickUpdater, KeyboardUpdater, use crate::keys::map_key; -const WIDTH: usize = 320; -const HEIGHT: usize = 224; +//const WIDTH: usize = 320; +//const HEIGHT: usize = 224; + +const WIDTH: usize = 384; +const HEIGHT: usize = 128; pub struct MiniFrontendBuilder { pub window: Option>, @@ -118,7 +122,7 @@ impl MiniFrontend { if let Some(keys) = window.get_keys_pressed(minifb::KeyRepeat::Yes) { let mut modifiers: u16 = 0; for key in keys { - if let Some(mut updater) = self.keyboard.as_mut() { + if let Some(updater) = self.keyboard.as_mut() { updater.update_keyboard(map_key(key), true); } match key { @@ -127,19 +131,19 @@ impl MiniFrontend { _ => { }, } } - if let Some(mut updater) = self.joystick.as_mut() { + if let Some(updater) = self.joystick.as_mut() { updater.update_joystick(modifiers); } } if let Some(keys) = window.get_keys_released() { for key in keys { - if let Some(mut updater) = self.keyboard.as_mut() { + if let Some(updater) = self.keyboard.as_mut() { updater.update_keyboard(map_key(key), false); } } } - if let Some(mut updater) = self.window.as_mut() { + if let Some(updater) = self.window.as_mut() { updater.update_frame(WIDTH as u32, HEIGHT as u32, &mut self.buffer); window.update_with_buffer(&self.buffer, WIDTH, HEIGHT).unwrap(); } @@ -147,3 +151,40 @@ impl MiniFrontend { } } + +pub fn run_inline(init: I) where I: FnOnce(&mut MiniFrontendBuilder) -> Result { + let mut frontend = MiniFrontendBuilder::new(); + let system = init(&mut frontend).unwrap(); + + frontend + .build() + .start(Some(system)); +} + +pub fn run_threaded(init: I) where I: FnOnce(&mut MiniFrontendBuilder) -> Result + Send + 'static { + let frontend = Arc::new(Mutex::new(MiniFrontendBuilder::new())); + + { + let frontend = frontend.clone(); + thread::spawn(move || { + let mut system = init(&mut *(frontend.lock().unwrap())).unwrap(); + frontend.lock().unwrap().finalize(); + system.run_loop(); + }); + } + + wait_until_initialized(frontend.clone()); + + frontend + .lock().unwrap() + .build() + .start(None); +} + +fn wait_until_initialized(frontend: Arc>) { + while frontend.lock().unwrap().finalized == false { + thread::sleep(Duration::from_millis(10)); + } +} + +