[SC64][SW] Added support for "Only 64DD IPL" mode in deployer. Added ability to pipe commands in debug mode.

This commit is contained in:
Mateusz Faderewski 2023-08-05 17:40:39 +02:00
parent b3a9d5ff63
commit 5a8862eebc
3 changed files with 43 additions and 18 deletions

View File

@ -137,6 +137,11 @@ impl TryFrom<&[u8]> for Heartbeat {
}
}
pub enum UserInput {
Packet(sc64::DebugPacket),
EOF,
}
macro_rules! success {
($($a: tt)*) => {
println!("{}", format!($($a)*).bright_blue());
@ -164,11 +169,11 @@ impl Handler {
self.encoding = encoding;
}
pub fn process_user_input(&self) -> Option<sc64::DebugPacket> {
let line = match self.line_rx.try_recv() {
pub fn process_user_input(&self) -> Option<UserInput> {
let raw_line = match self.line_rx.try_recv() {
Ok(line) => {
if line.len() == 0 {
return None;
return Some(UserInput::EOF);
} else {
line
}
@ -176,6 +181,11 @@ impl Handler {
Err(_) => return None,
};
let line = raw_line.trim_end();
if line.len() == 0 {
return None;
}
let token_count = line.matches("@").count();
if (token_count % 2) != 0 {
@ -235,7 +245,7 @@ impl Handler {
);
}
Some(packet)
Some(UserInput::Packet(packet))
}
pub fn handle_debug_packet(&mut self, debug_packet: sc64::DebugPacket) {
@ -419,7 +429,7 @@ fn stdin_thread(line_tx: Sender<String>) {
loop {
let mut line = String::new();
if stdin().read_line(&mut line).is_ok() {
if line_tx.send(line.trim_end().to_string()).is_err() {
if line_tx.send(line.to_string()).is_err() {
return;
}
}

View File

@ -120,7 +120,6 @@ struct _64DDArgs {
ddipl: PathBuf,
/// Path to the 64DD disk file (.ndd format, can be specified multiple times)
#[arg(required = true)]
disk: Vec<PathBuf>,
/// Path to the ROM file
@ -405,10 +404,11 @@ fn handle_64dd_command(connection: Connection, args: &_64DDArgs) -> Result<(), s
let mut debug_handler = debug::new();
println!(
"{}\n{}\n{}",
"{}\n{}\n{}\n{}",
"========== [WARNING] ==========".bold().bright_yellow(),
"Do not use this mode when real 64DD accessory is connected to the N64".bright_yellow(),
"Doing so might permanently damage either N64, 64DD or SC64".bright_yellow()
"Doing so might permanently damage either N64, 64DD or SC64".bright_yellow(),
"\"Only 64DD IPL\" mode should be safe on development units without IPL builtin".bright_green()
);
sc64.reset_state()?;
@ -474,6 +474,13 @@ fn handle_64dd_command(connection: Connection, args: &_64DDArgs) -> Result<(), s
sc64.calculate_cic_parameters()?;
if args.disk.len() == 0 {
let dd_mode = sc64::DdMode::DdIpl;
println!("64DD mode set to [{dd_mode}]");
sc64.configure_64dd(dd_mode, None)?;
return Ok(())
}
let disk_paths: Vec<String> = args
.disk
.iter()
@ -493,7 +500,7 @@ fn handle_64dd_command(connection: Connection, args: &_64DDArgs) -> Result<(), s
let dd_mode = sc64::DdMode::Full;
println!("64DD mode set to [{dd_mode} / {drive_type}]");
sc64.configure_64dd(dd_mode, drive_type)?;
sc64.configure_64dd(dd_mode, Some(drive_type))?;
println!(
"{}: {}",
@ -587,8 +594,11 @@ fn handle_64dd_command(connection: Connection, args: &_64DDArgs) -> Result<(), s
}
_ => {}
}
} else if let Some(debug_packet) = debug_handler.process_user_input() {
sc64.send_debug_packet(debug_packet)?;
} else if let Some(user_input) = debug_handler.process_user_input() {
match user_input {
debug::UserInput::Packet(debug_packet) => sc64.send_debug_packet(debug_packet)?,
debug::UserInput::EOF => break,
}
}
}
@ -640,8 +650,11 @@ fn handle_debug_command(connection: Connection, args: &DebugArgs) -> Result<(),
}
_ => {}
}
} else if let Some(debug_packet) = debug_handler.process_user_input() {
sc64.send_debug_packet(debug_packet)?;
} else if let Some(user_input) = debug_handler.process_user_input() {
match user_input {
debug::UserInput::Packet(debug_packet) => sc64.send_debug_packet(debug_packet)?,
debug::UserInput::EOF => break
}
}
}

View File

@ -559,13 +559,15 @@ impl SC64 {
pub fn configure_64dd(
&mut self,
dd_mode: DdMode,
drive_type: DdDriveType,
drive_type: Option<DdDriveType>,
) -> Result<(), Error> {
self.command_config_set(Config::DdMode(dd_mode))?;
self.command_config_set(Config::DdSdEnable(Switch::Off))?;
self.command_config_set(Config::DdDriveType(drive_type))?;
self.command_config_set(Config::DdDiskState(DdDiskState::Ejected))?;
self.command_config_set(Config::ButtonMode(ButtonMode::UsbPacket))?;
if let Some(drive_type) = drive_type {
self.command_config_set(Config::DdSdEnable(Switch::Off))?;
self.command_config_set(Config::DdDriveType(drive_type))?;
self.command_config_set(Config::DdDiskState(DdDiskState::Ejected))?;
self.command_config_set(Config::ButtonMode(ButtonMode::UsbPacket))?;
}
Ok(())
}