diff options
Diffstat (limited to 'src/desktop')
-rw-r--r-- | src/desktop/audio.rs | 12 | ||||
-rw-r--r-- | src/desktop/input.rs | 43 | ||||
-rw-r--r-- | src/desktop/load_save.rs | 17 | ||||
-rw-r--r-- | src/desktop/serial.rs | 92 | ||||
-rw-r--r-- | src/desktop/window.rs | 117 |
5 files changed, 156 insertions, 125 deletions
diff --git a/src/desktop/audio.rs b/src/desktop/audio.rs index 486b41c..a6905f8 100644 --- a/src/desktop/audio.rs +++ b/src/desktop/audio.rs @@ -1,9 +1,9 @@ use rodio::{OutputStream, Sink, Source}; -use crate::audio::{SAMPLE_RATE, MutableWave}; -use crate::io::{Wave, Audio}; -use std::time::Duration; +use crate::audio::{MutableWave, SAMPLE_RATE}; +use crate::io::{Audio, Wave}; use std::mem; +use std::time::Duration; const BUFFER_SIZE: usize = 1024; @@ -17,8 +17,7 @@ pub struct RodioAudio { struct RodioWave<W: Wave + Send + 'static>(W, usize); -impl<W: Wave + Send + 'static> Iterator for RodioWave<W> -{ +impl<W: Wave + Send + 'static> Iterator for RodioWave<W> { type Item = f32; fn next(&mut self) -> Option<Self::Item> { @@ -40,8 +39,7 @@ impl<I: Iterator<Item = f32>> Iterator for RodioBuffer<I> { } } -impl<I: Iterator<Item = f32>> Source for RodioBuffer<I> -{ +impl<I: Iterator<Item = f32>> Source for RodioBuffer<I> { fn current_frame_len(&self) -> Option<usize> { None } diff --git a/src/desktop/input.rs b/src/desktop/input.rs index 4653d3c..bc8b29d 100644 --- a/src/desktop/input.rs +++ b/src/desktop/input.rs @@ -3,9 +3,9 @@ use std::io::{ErrorKind, Read, Write}; use crate::desktop::window::Keys; use crate::io::Input; +use crate::logs::{elog, log, LogLevel}; use gilrs::{Button, GamepadId, Gilrs}; use winit::keyboard::KeyCode; -use crate::logs::{elog, log, LogLevel}; pub struct Gamepad { gilrs: Gilrs, @@ -18,7 +18,10 @@ impl Gamepad { let gilrs = Gilrs::new().unwrap(); let gamepad_id = if let Some((gamepad_id, _gamepad)) = gilrs.gamepads().next() { - log(LogLevel::Infos, format!("Gamepad connected: {:?}", gamepad_id)); + log( + LogLevel::Infos, + format!("Gamepad connected: {:?}", gamepad_id), + ); Some(gamepad_id) } else { log(LogLevel::Infos, format!("No gamepad found")); @@ -45,12 +48,18 @@ impl Input for Gamepad { fn update_events(&mut self, _cycles: u128) -> Option<u128> { if let Some(gamepad_id) = self.gamepad_id { if self.gilrs.connected_gamepad(gamepad_id).is_none() { - log(LogLevel::Infos, format!("Gamepad disconnected: {:?}", gamepad_id)); + log( + LogLevel::Infos, + format!("Gamepad disconnected: {:?}", gamepad_id), + ); self.gamepad_id = None; } } else { if let Some((gamepad_id, _gamepad)) = self.gilrs.gamepads().next() { - log(LogLevel::Infos, format!("Gamepad connected: {:?}", gamepad_id)); + log( + LogLevel::Infos, + format!("Gamepad connected: {:?}", gamepad_id), + ); self.gamepad_id = Some(gamepad_id); } } @@ -227,21 +236,33 @@ impl Input for GamepadRecorder { let new_direction_reg = self.input.get_direction_gamepad_reg(); if self.action_reg != new_action_reg || self.direction_reg != new_direction_reg { - log(LogLevel::Debug, format!( - "input update on cycle {} ! 0x{:02x} 0x{:02x}", - cycles, new_action_reg, new_direction_reg - )); + log( + LogLevel::Debug, + format!( + "input update on cycle {} ! 0x{:02x} 0x{:02x}", + cycles, new_action_reg, new_direction_reg + ), + ); if let Err(err) = self.record_file.write_all(&cycles.to_le_bytes()) { - elog(LogLevel::Error, format!("Failed to write to record file: {}", err)); + elog( + LogLevel::Error, + format!("Failed to write to record file: {}", err), + ); }; if let Err(err) = self .record_file .write_all(&[new_action_reg, new_direction_reg]) { - elog(LogLevel::Error, format!("Failed to write to record file: {}", err)); + elog( + LogLevel::Error, + format!("Failed to write to record file: {}", err), + ); } if let Err(err) = self.record_file.flush() { - elog(LogLevel::Error, format!("Failed to flush record file writes: {}", err)); + elog( + LogLevel::Error, + format!("Failed to flush record file writes: {}", err), + ); } } diff --git a/src/desktop/load_save.rs b/src/desktop/load_save.rs index ec99d94..e80e029 100644 --- a/src/desktop/load_save.rs +++ b/src/desktop/load_save.rs @@ -1,8 +1,8 @@ use crate::io::{Audio, LoadSave, Serial}; +use crate::logs::{elog, log, LogLevel}; use crate::state::GBState; use std::fs::File; use std::io::{Read, Write}; -use crate::logs::{elog, log, LogLevel}; #[derive(Debug)] pub struct FSLoadSave { @@ -62,7 +62,10 @@ impl LoadSave for FSLoadSave { f.read(external_ram)?; - log(LogLevel::Infos, format!("Save file loaded from \"{}\"!", self.save_file)); + log( + LogLevel::Infos, + format!("Save file loaded from \"{}\"!", self.save_file), + ); Ok(()) } @@ -72,7 +75,10 @@ impl LoadSave for FSLoadSave { f.write_all(&external_ram)?; - log(LogLevel::Infos, format!("Save written to \"{}\"!", self.save_file)); + log( + LogLevel::Infos, + format!("Save written to \"{}\"!", self.save_file), + ); Ok(()) } @@ -147,7 +153,10 @@ impl LoadSave for FSLoadSave { state_file.write_all(&state.cpu.sp.to_le_bytes())?; state_file.write_all(&[state.mem.boot_rom_on.into(), state.mem.ime.into()])?; } else { - elog(LogLevel::Error, format!("Tried to save state without state_file specified")); + elog( + LogLevel::Error, + format!("Tried to save state without state_file specified"), + ); } Ok(()) } diff --git a/src/desktop/serial.rs b/src/desktop/serial.rs index d8fc2e3..36cfba8 100644 --- a/src/desktop/serial.rs +++ b/src/desktop/serial.rs @@ -1,11 +1,11 @@ use std::fs::File; use std::io::{Read, Write}; -use std::sync::mpsc::{self, Receiver, Sender}; use std::net::{TcpListener, TcpStream}; +use std::sync::mpsc::{self, Receiver, Sender}; use std::thread; -use crate::io::Serial; use crate::consts::CPU_CLOCK_SPEED; +use crate::io::Serial; pub struct UnconnectedSerial {} @@ -16,10 +16,8 @@ impl Serial for UnconnectedSerial { fn read_control(&self) -> u8 { 0 } - fn write_data(&mut self, _data: u8) { - } - fn write_control(&mut self, _control: u8) { - } + fn write_data(&mut self, _data: u8) {} + fn write_control(&mut self, _control: u8) {} fn update_serial(&mut self, _cycles: u128) -> bool { false } @@ -82,8 +80,8 @@ impl Serial for FIFOSerial { } fn read_control(&self) -> u8 { - (if self.external_clock { 0 } else { 0x01 }) | - (if self.transfer_requested { 0x80 } else { 0 }) + (if self.external_clock { 0 } else { 0x01 }) + | (if self.transfer_requested { 0x80 } else { 0 }) } fn write_data(&mut self, data: u8) { @@ -112,18 +110,17 @@ impl Serial for FIFOSerial { self.transfer_requested = false; } true - } else if !self.external_clock && !self.current_transfer - && self.transfer_requested { - if cycles > self.next_byte_transfer_cycle { - self.output.send(self.current_data).unwrap(); - self.current_transfer = true; - if self.no_response { - self.current_data = 0; - self.transfer_requested = false; - self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024); - self.current_transfer = false; - } + } else if !self.external_clock && !self.current_transfer && self.transfer_requested { + if cycles > self.next_byte_transfer_cycle { + self.output.send(self.current_data).unwrap(); + self.current_transfer = true; + if self.no_response { + self.current_data = 0; + self.transfer_requested = false; + self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024); + self.current_transfer = false; } + } false } else { false @@ -147,22 +144,20 @@ pub struct TcpSerial { impl TcpSerial { pub fn handle_stream(mut stream: TcpStream, tx: Sender<u8>, rx: Receiver<u8>) { - let mut stream_clone = stream.try_clone().unwrap(); - thread::spawn(move || { - loop { - let mut byte = [0]; + let mut stream_clone = stream.try_clone().unwrap(); + thread::spawn(move || loop { + let mut byte = [0]; - stream_clone.read(&mut byte).unwrap(); + stream_clone.read(&mut byte).unwrap(); - tx.send(byte[0]).unwrap(); - } - }); + tx.send(byte[0]).unwrap(); + }); - thread::spawn(move || { - for b in rx.iter() { - stream.write(&[b]).unwrap(); - } - }); + thread::spawn(move || { + for b in rx.iter() { + stream.write(&[b]).unwrap(); + } + }); } pub fn new_listener(port: u16, no_response: bool) -> Self { @@ -174,7 +169,7 @@ impl TcpSerial { println!("Connection on {:?}", addr); Self::handle_stream(socket, tx, rx); } - _ => () + _ => (), }; }); @@ -197,9 +192,9 @@ impl TcpSerial { let (tx, input) = mpsc::channel::<u8>(); let (output, rx) = mpsc::channel::<u8>(); thread::spawn(move || { - if let Ok(socket) = TcpStream::connect(&addr) { - println!("Connected to {:?}", addr); - Self::handle_stream(socket, tx, rx); + if let Ok(socket) = TcpStream::connect(&addr) { + println!("Connected to {:?}", addr); + Self::handle_stream(socket, tx, rx); } }); @@ -225,8 +220,8 @@ impl Serial for TcpSerial { } fn read_control(&self) -> u8 { - (if self.external_clock { 0 } else { 0x01 }) | - (if self.transfer_requested { 0x80 } else { 0 }) + (if self.external_clock { 0 } else { 0x01 }) + | (if self.transfer_requested { 0x80 } else { 0 }) } fn write_data(&mut self, data: u8) { @@ -259,18 +254,17 @@ impl Serial for TcpSerial { } self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 16384); true - } else if !self.external_clock && !self.current_transfer - && self.transfer_requested { - if cycles > self.next_byte_transfer_cycle { - self.output.send(self.current_data).unwrap(); - self.current_transfer = true; - if self.no_response { - self.current_data = 0; - self.transfer_requested = false; - self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024); - self.current_transfer = false; - } + } else if !self.external_clock && !self.current_transfer && self.transfer_requested { + if cycles > self.next_byte_transfer_cycle { + self.output.send(self.current_data).unwrap(); + self.current_transfer = true; + if self.no_response { + self.current_data = 0; + self.transfer_requested = false; + self.next_byte_transfer_cycle = cycles + ((CPU_CLOCK_SPEED as u128) / 1024); + self.current_transfer = false; } + } false } else { false diff --git a/src/desktop/window.rs b/src/desktop/window.rs index 93c5aba..0d5bd8c 100644 --- a/src/desktop/window.rs +++ b/src/desktop/window.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use std::sync::{Arc, Mutex}; use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::{Arc, Mutex}; use std::thread; use crate::io::{Window, WindowSignal}; @@ -12,7 +12,7 @@ use winit::event::{Event, WindowEvent}; use winit::event_loop::EventLoopBuilder; use winit::keyboard::{KeyCode, PhysicalKey}; use winit::platform::wayland::EventLoopBuilderExtWayland; -use winit::window::{WindowBuilder}; +use winit::window::WindowBuilder; use winit_input_helper::WinitInputHelper; const WIDTH: u32 = 160; @@ -37,7 +37,10 @@ impl DesktopWindow { let key_eventloop = keys.clone(); thread::spawn(move || { let keys = key_eventloop; - let event_loop = EventLoopBuilder::new().with_any_thread(true).build().unwrap(); + let event_loop = EventLoopBuilder::new() + .with_any_thread(true) + .build() + .unwrap(); let mut input = WinitInputHelper::new(); let window = Arc::new({ let size = LogicalSize::new((WIDTH * 4) as f64, (HEIGHT * 4) as f64); @@ -57,68 +60,71 @@ impl DesktopWindow { }; let mut fb = Box::new([0; 160 * 144]); event_loop - .run(|event, elwt| { - if let Event::WindowEvent { - event: WindowEvent::RedrawRequested, - .. - } = event - { - loop { - if let Ok(new_fb) = fb_recv.try_recv() { - fb = new_fb; - } else { - break; - } - } - draw(pixels.frame_mut(), &fb); - if let Err(err) = pixels.render() { - elog(LogLevel::Error, format!("Error during render: {}", err)); - return; - } - } - - if let Event::WindowEvent { - window_id: _, - event: - WindowEvent::KeyboardInput { - device_id: _, - event: ref keyboard_event, - is_synthetic: _, - }, - } = event - { - if let Ok(mut keys) = keys.lock() { - if let PhysicalKey::Code(keycode) = keyboard_event.physical_key { - if keyboard_event.state.is_pressed() { - (*keys).insert(keycode); + .run(|event, elwt| { + if let Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } = event + { + loop { + if let Ok(new_fb) = fb_recv.try_recv() { + fb = new_fb; } else { - (*keys).remove(&keycode); + break; } } + draw(pixels.frame_mut(), &fb); + if let Err(err) = pixels.render() { + elog(LogLevel::Error, format!("Error during render: {}", err)); + return; + } } - } - if input.update(&event) { - if input.close_requested() { - elwt.exit(); - if let Err(err) = signal_send.send(WindowSignal::Exit) { - elog(LogLevel::Error, format!("window signal send failed with error {}", err)); + if let Event::WindowEvent { + window_id: _, + event: + WindowEvent::KeyboardInput { + device_id: _, + event: ref keyboard_event, + is_synthetic: _, + }, + } = event + { + if let Ok(mut keys) = keys.lock() { + if let PhysicalKey::Code(keycode) = keyboard_event.physical_key { + if keyboard_event.state.is_pressed() { + (*keys).insert(keycode); + } else { + (*keys).remove(&keycode); + } + } } - return; } - if let Some(size) = input.window_resized() { - if let Err(err) = pixels.resize_surface(size.width, size.height) { - elog(LogLevel::Error, format!("Error during resize: {}", err)); + if input.update(&event) { + if input.close_requested() { + elwt.exit(); + if let Err(err) = signal_send.send(WindowSignal::Exit) { + elog( + LogLevel::Error, + format!("window signal send failed with error {}", err), + ); + } return; } - } - window.request_redraw(); - } - }).unwrap(); - }); + if let Some(size) = input.window_resized() { + if let Err(err) = pixels.resize_surface(size.width, size.height) { + elog(LogLevel::Error, format!("Error during resize: {}", err)); + return; + } + } + window.request_redraw(); + } + }) + .unwrap(); + }); Ok(Self { fb_send, @@ -131,7 +137,10 @@ impl DesktopWindow { impl Window for DesktopWindow { fn update(&mut self, fb: Box<[u32; 160 * 144]>) -> Option<WindowSignal> { if let Err(err) = self.fb_send.send(fb) { - elog(LogLevel::Error, format!("Framebuffer channel send failed with error: {}", err)); + elog( + LogLevel::Error, + format!("Framebuffer channel send failed with error: {}", err), + ); } if let Ok(signal) = self.signal_recv.try_recv() { |