From 6deaff5af9dcb8d49f04c9e297116845eb08bbb8 Mon Sep 17 00:00:00 2001 From: finga Date: Thu, 11 Feb 2021 00:27:44 +0100 Subject: [PATCH] Parse command line arguments. All available parameters can be passed as arguments with clap. Port, baud rate, char size, parity, stop bits and flow control can now be specified. --- Cargo.lock | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 + src/main.rs | 54 ++++++++++-- 3 files changed, 290 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7b25d7..7ccffd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,61 @@ version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1" +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "clap" +version = "3.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "indexmap", + "lazy_static", + "os_str_bytes", + "strsim", + "termcolor", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap_derive" +version = "3.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "embedded-hal" version = "0.2.4" @@ -16,6 +71,40 @@ dependencies = [ "void", ] +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "heck" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" +dependencies = [ + "libc", +] + +[[package]] +name = "indexmap" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "ioctl-rs" version = "0.1.6" @@ -25,6 +114,12 @@ dependencies = [ "libc", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + [[package]] name = "libc" version = "0.2.86" @@ -46,6 +141,54 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "546c37ac5d9e56f55e73b677106873d9d9f5190605e41a856503623648488cae" +[[package]] +name = "os_str_bytes" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +dependencies = [ + "proc-macro2", +] + [[package]] name = "serial" version = "0.4.0" @@ -114,10 +257,37 @@ name = "spidrs" version = "0.1.0" dependencies = [ "anyhow", + "clap", "serial-embedded-hal", "spidriver", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + [[package]] name = "termios" version = "0.2.2" @@ -127,8 +297,78 @@ dependencies = [ "libc", ] +[[package]] +name = "textwrap" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "unicode-segmentation" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + [[package]] name = "void" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index db5be7d..2073992 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,10 @@ name = "spidrs" version = "0.1.0" authors = ["finga "] edition = "2018" +description = "A small cli program for spidriver." [dependencies] anyhow = "1.0" serial-embedded-hal = "0.1" spidriver = "0.1" +clap = "3.0.0-beta.2" diff --git a/src/main.rs b/src/main.rs index 1585007..e31ee68 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,23 +1,65 @@ use anyhow::Result; +use clap::{crate_authors, crate_description, crate_name, crate_version, Clap}; use serial_embedded_hal::{PortSettings, Serial}; use spidriver::SPIDriver; use std::io; +#[derive(Clap)] +#[clap(name = crate_name!(), version = crate_version!(), + author = crate_authors!(","), about = crate_description!())] +struct Opts { + #[clap(short, long, default_value = "/dev/ttyUSB0")] + port: String, + #[clap(short, long, default_value = "460800")] + baud_rate: usize, + #[clap(short, long, default_value = "8", possible_values = &["5", "6", "7", "8"])] + char_size: u8, + #[clap(short = 'P', long, default_value = "none", possible_values = &["none", "odd", "even"])] + parity: String, + #[clap(short, long, default_value = "1", possible_values = &["1", "2"])] + stop_bits: u8, + #[clap(short, long, default_value = "none", possible_values = &["none", "software", "hardware"])] + flow_control: String, +} + fn main() -> Result<()> { + let opts: Opts = Opts::parse(); + let port = Serial::new( - "/dev/ttyUSB0", + &opts.port, &PortSettings { - baud_rate: serial_embedded_hal::BaudRate::BaudOther(460800), - char_size: serial_embedded_hal::CharSize::Bits8, - parity: serial_embedded_hal::Parity::ParityNone, - stop_bits: serial_embedded_hal::StopBits::Stop1, - flow_control: serial_embedded_hal::FlowControl::FlowNone, + baud_rate: serial_embedded_hal::BaudRate::BaudOther(opts.baud_rate), + char_size: match opts.char_size { + 5 => serial_embedded_hal::CharSize::Bits5, + 6 => serial_embedded_hal::CharSize::Bits6, + 7 => serial_embedded_hal::CharSize::Bits7, + 8 => serial_embedded_hal::CharSize::Bits8, + _ => unreachable!(), + }, + parity: match opts.parity.as_str() { + "none" => serial_embedded_hal::Parity::ParityNone, + "odd" => serial_embedded_hal::Parity::ParityOdd, + "even" => serial_embedded_hal::Parity::ParityEven, + _ => unreachable!(), + }, + stop_bits: match opts.stop_bits { + 1 => serial_embedded_hal::StopBits::Stop1, + 2 => serial_embedded_hal::StopBits::Stop2, + _ => unreachable!(), + }, + flow_control: match opts.flow_control.as_str() { + "none" => serial_embedded_hal::FlowControl::FlowNone, + "software" => serial_embedded_hal::FlowControl::FlowSoftware, + "hardware" => serial_embedded_hal::FlowControl::FlowHardware, + _ => unreachable!(), + }, }, )?; let (tx, rx) = port.split(); let mut spidriver = SPIDriver::new(tx, rx); + loop { let mut input = String::new(); io::stdin().read_line(&mut input)?;