write can now open a monitor right after flashing

This commit is contained in:
2025-09-19 16:13:51 +02:00
parent b6b79e7fcf
commit 1b9f1ea4c1
3 changed files with 30 additions and 7 deletions

View File

@@ -73,7 +73,11 @@ pub struct ArgWrite {
#[argp(switch)]
#[argp(description = "Write individual sections to Flash rather than performing a single write. Only applies to Intel HEX.")]
pub write_individual: bool
pub write_individual: bool,
#[argp(switch)]
#[argp(description = "Open a serial monitor right after flashing.")]
pub monitor: bool
}
#[derive(FromArgs)]

View File

@@ -14,6 +14,7 @@ use monitor::Monitor;
mod target;
use target::{PhysicalTarget, Target};
use termion::event::Key;
mod utils;
@@ -132,9 +133,9 @@ pub fn write_chip_chunk(data: &[u8], target: &mut impl Target, mut start: usize,
Ok(())
}
fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
fn write_chip_data(args: &ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
if args.bin {
let mut file = std::fs::read(args.path)?;
let mut file = std::fs::read(&args.path)?;
let size = args.end - args.start + 1;
@@ -145,7 +146,7 @@ fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error>
return write_chip_chunk(&file, target, args.start, !args.skip_verify)
}
let hexreader = IntelHexReader::init(std::fs::File::open(args.path)?);
let hexreader = IntelHexReader::init(std::fs::File::open(&args.path)?);
if args.write_individual {
let mut last_addr = 0;
@@ -198,6 +199,24 @@ fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error>
write_chip_chunk(&buf[first_addr..=last_addr], target, first_addr, !args.skip_verify)
}
fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
loop {
write_chip_data(&args, target)?;
if !args.monitor { break }
let cause = Monitor::new()
.add_hook(Key::Ctrl('f'), "Re-flash target")
.run(target.port())?;
if cause != Key::Ctrl('f') { break }
target.resync_target()?;
}
Ok(())
}
fn erase_chip(_args: ArgErase, target: &mut PhysicalTarget) -> Result<(), Error> {
target.erase()?;
@@ -206,8 +225,6 @@ fn erase_chip(_args: ArgErase, target: &mut PhysicalTarget) -> Result<(), Error>
fn monitor_chip(_args: ArgMonitor, target: &mut PhysicalTarget) -> Result<(), Error> {
let _ = Monitor::new().run(target.port())?;
target.resync_target().unwrap();
target.read_info(0x00, 0x00).unwrap();
Ok(())
}

View File

@@ -21,8 +21,9 @@ impl Monitor {
Self { hooks }
}
pub fn add_hook(&mut self, key: Key, desc: &'static str) {
pub fn add_hook(&mut self, key: Key, desc: &'static str) -> &mut Self {
self.hooks.push((key, desc));
self
}
pub fn run(&mut self, port: &mut SerialPort) -> Result<Key, Error> {
@@ -32,6 +33,7 @@ impl Monitor {
port.set_dtr(false)?;
port.set_rts(false)?;
println!();
println!("Monitor controls:");
for (key, desc) in &self.hooks {