From 6fd8d8f5cff3e7178d023c784689d97142d2de17 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sun, 5 Jan 2025 11:24:59 -0500 Subject: [PATCH] Improve flow of command-line debugging --- src/app.rs | 18 ++++++++++++------ src/emulator.rs | 12 ++++++++++++ src/gdbserver.rs | 1 + src/main.rs | 3 +++ src/window/gdb.rs | 14 ++++++++++++-- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/app.rs b/src/app.rs index 569a798..a821c07 100644 --- a/src/app.rs +++ b/src/app.rs @@ -86,6 +86,12 @@ impl Application { impl ApplicationHandler for Application { fn resumed(&mut self, event_loop: &ActiveEventLoop) { + if let Some(port) = self.init_debug_port { + let mut server = + GdbServerWindow::new(SimId::Player1, self.client.clone(), self.proxy.clone()); + server.launch(port); + self.open(event_loop, Box::new(server)); + } let app = GameWindow::new( self.client.clone(), self.proxy.clone(), @@ -93,11 +99,6 @@ impl ApplicationHandler for Application { SimId::Player1, ); self.open(event_loop, Box::new(app)); - if let Some(port) = self.init_debug_port { - let mut server = GdbServerWindow::new(SimId::Player1, self.client.clone()); - server.start(port); - self.open(event_loop, Box::new(server)); - } } fn window_event( @@ -193,7 +194,8 @@ impl ApplicationHandler for Application { self.open(event_loop, Box::new(about)); } UserEvent::OpenDebugger(sim_id) => { - let debugger = GdbServerWindow::new(sim_id, self.client.clone()); + let debugger = + GdbServerWindow::new(sim_id, self.client.clone(), self.proxy.clone()); self.open(event_loop, Box::new(debugger)); } UserEvent::OpenInput => { @@ -209,6 +211,9 @@ impl ApplicationHandler for Application { ); self.open(event_loop, Box::new(p2)); } + UserEvent::Quit => { + event_loop.exit(); + } } } @@ -390,6 +395,7 @@ pub enum UserEvent { OpenDebugger(SimId), OpenInput, OpenPlayer2, + Quit, } pub enum Action { diff --git a/src/emulator.rs b/src/emulator.rs index 9bc37b3..b4d5ab8 100644 --- a/src/emulator.rs +++ b/src/emulator.rs @@ -92,6 +92,7 @@ pub struct EmulatorBuilder { state: Arc>, audio_on: Arc<[AtomicBool; 2]>, linked: Arc, + start_paused: bool, } impl EmulatorBuilder { @@ -107,6 +108,7 @@ impl EmulatorBuilder { state: Arc::new(Atomic::new(EmulatorState::Paused)), audio_on: Arc::new([AtomicBool::new(true), AtomicBool::new(true)]), linked: Arc::new(AtomicBool::new(false)), + start_paused: false, }; let client = EmulatorClient { queue, @@ -125,6 +127,13 @@ impl EmulatorBuilder { } } + pub fn start_paused(self, paused: bool) -> Self { + Self { + start_paused: paused, + ..self + } + } + pub fn build(self) -> Result { let mut emulator = Emulator::new( self.commands, @@ -136,6 +145,9 @@ impl EmulatorBuilder { if let Some(path) = self.rom { emulator.load_cart(SimId::Player1, &path)?; } + if self.start_paused { + emulator.pause_sims()?; + } Ok(emulator) } } diff --git a/src/gdbserver.rs b/src/gdbserver.rs index 0223fcc..fd95938 100644 --- a/src/gdbserver.rs +++ b/src/gdbserver.rs @@ -41,6 +41,7 @@ impl GdbServer { } pub fn start(&mut self, port: u16) { + *self.status.lock().unwrap() = GdbServerStatus::Connecting; let sim_id = self.sim_id; let client = self.client.clone(); let status = self.status.clone(); diff --git a/src/main.rs b/src/main.rs index 0d97e7d..1943ef5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -87,6 +87,9 @@ fn main() -> Result<()> { if let Some(path) = args.rom { builder = builder.with_rom(&path); } + if args.debug_port.is_some() { + builder = builder.start_paused(true); + } ThreadBuilder::default() .name("Emulator".to_owned()) diff --git a/src/window/gdb.rs b/src/window/gdb.rs index 9d6fa0f..e384eb2 100644 --- a/src/window/gdb.rs +++ b/src/window/gdb.rs @@ -1,6 +1,8 @@ use egui::{Button, CentralPanel, TextEdit, ViewportBuilder, ViewportId}; +use winit::event_loop::EventLoopProxy; use crate::{ + app::UserEvent, emulator::{EmulatorClient, SimId}, gdbserver::{GdbServer, GdbServerStatus}, }; @@ -10,21 +12,26 @@ use super::AppWindow; pub struct GdbServerWindow { sim_id: SimId, port_str: String, + launched: bool, server: GdbServer, + proxy: EventLoopProxy, } impl GdbServerWindow { - pub fn new(sim_id: SimId, client: EmulatorClient) -> Self { + pub fn new(sim_id: SimId, client: EmulatorClient, proxy: EventLoopProxy) -> Self { Self { sim_id, port_str: (8080 + sim_id.to_index()).to_string(), + launched: false, server: GdbServer::new(sim_id, client), + proxy, } } - pub fn start(&mut self, port: u16) { + pub fn launch(&mut self, port: u16) { self.server.stop(); self.port_str = port.to_string(); + self.launched = true; self.server.start(port); } } @@ -57,6 +64,9 @@ impl AppWindow for GdbServerWindow { }); if !status.running() { + if self.launched { + self.proxy.send_event(UserEvent::Quit).unwrap(); + } let start_button = Button::new("Start"); if ui.add_enabled(port_num.is_some(), start_button).clicked() { let port = port_num.unwrap();