aboutsummaryrefslogtreecommitdiff
path: root/src/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'src/desktop')
-rw-r--r--src/desktop/audio.rs12
-rw-r--r--src/desktop/input.rs43
-rw-r--r--src/desktop/load_save.rs17
-rw-r--r--src/desktop/serial.rs92
-rw-r--r--src/desktop/window.rs117
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() {