diff --git a/src/args.rs b/src/args.rs index 689c80f..6a2ec6e 100644 --- a/src/args.rs +++ b/src/args.rs @@ -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)] diff --git a/src/main.rs b/src/main.rs index 440ee4f..2da4b81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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(()) } diff --git a/src/monitor.rs b/src/monitor.rs index 518e2aa..69e86bb 100644 --- a/src/monitor.rs +++ b/src/monitor.rs @@ -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 { @@ -32,6 +33,7 @@ impl Monitor { port.set_dtr(false)?; port.set_rts(false)?; + println!(); println!("Monitor controls:"); for (key, desc) in &self.hooks {