Added command for generating the kopyto

This commit is contained in:
2025-09-20 23:04:18 +02:00
parent 37f15bf187
commit ab9078ab3f
3 changed files with 55 additions and 19 deletions

View File

@@ -24,7 +24,8 @@ pub enum ArgCommand {
Write(ArgWrite),
Erase(ArgErase),
Monitor(ArgMonitor),
Run(ArgRun)
Run(ArgRun),
Example(ArgExample)
}
#[derive(FromArgs)]
@@ -90,6 +91,11 @@ pub struct ArgWrite {
#[argp(subcommand, name = "erase")]
pub struct ArgErase {}
#[derive(FromArgs)]
#[argp(description = "Opens the serial monitor.")]
#[argp(subcommand, name = "monitor")]
pub struct ArgMonitor {}
#[derive(FromArgs)]
#[argp(description = "Handy shorthand for `write --cmd \"sdcc <srcpath>\" --monitor <hexpath>`.")]
#[argp(subcommand, name = "run")]
@@ -100,9 +106,13 @@ pub struct ArgRun {
}
#[derive(FromArgs)]
#[argp(description = "Opens the serial monitor.")]
#[argp(subcommand, name = "monitor")]
pub struct ArgMonitor {}
#[argp(description = "Generates a \"stub\" C file for the TUL výukový přípravek™.")]
#[argp(subcommand, name = "example")]
pub struct ArgExample {
#[argp(positional)]
#[argp(description = "Path to the source C file to be generated.")]
pub path: Option<OsString>
}
pub fn parse() -> Args {
let args: Args = argp::parse_args_or_exit(argp::DEFAULT);

View File

@@ -272,9 +272,32 @@ fn run_chip(args: ArgRun, target: &mut PhysicalTarget) -> Result<(), Error> {
}, target)
}
fn gen_example(args: ArgExample) -> Result<(), Error> {
let path = PathBuf::from(args.path.unwrap_or(OsString::from("example.c")));
if path.try_exists()? {
Err(Error::other("File already exists"))?
}
std::fs::write(&path, include_bytes!("../example.c"))?;
let path = path.to_string_lossy();
println!("Example source code generated to `{}`.", path);
println!("Execute `tulflash run \"{}\"` to run it.", path);
Ok(())
}
fn main() {
let args = args::parse();
if let ArgCommand::Example(args) = args.command {
if let Err(err) = gen_example(args) {
println!("Error generating example source code: {}", err);
}
return
}
let start = SystemTime::now();
let port = args.port.or_else(|| {
@@ -300,7 +323,8 @@ fn main() {
ArgCommand::Write(args) => write_chip(args, &mut target),
ArgCommand::Erase(args) => erase_chip(args, &mut target),
ArgCommand::Monitor(args) => monitor_chip(args, &mut target),
ArgCommand::Run(args) => run_chip(args, &mut target)
ArgCommand::Run(args) => run_chip(args, &mut target),
ArgCommand::Example(_) => unreachable!()
};
if let Err(err) = res {