Add initial messagepack support
This commit is contained in:
parent
72c9fa0a58
commit
736a0bc093
3 changed files with 155 additions and 21 deletions
83
Cargo.lock
generated
83
Cargo.lock
generated
|
@ -80,6 +80,12 @@ dependencies = [
|
|||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
|
@ -92,6 +98,12 @@ version = "2.0.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "487f1e0fcbe47deb8b0574e646def1c903389d95241dd1bbcc6ce4a715dfc0c1"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
|
@ -155,6 +167,8 @@ name = "heliox-cli"
|
|||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"rmp-serde",
|
||||
"serde",
|
||||
"serialport",
|
||||
]
|
||||
|
||||
|
@ -219,6 +233,21 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "paste"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.27"
|
||||
|
@ -227,18 +256,18 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
|
|||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.69"
|
||||
version = "1.0.78"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
|
||||
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.33"
|
||||
version = "1.0.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
@ -272,12 +301,54 @@ version = "0.8.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3cbb081b9784b07cceb8824c8583f86db4814d172ab043f3c23f7dc600bf83d"
|
||||
|
||||
[[package]]
|
||||
name = "rmp"
|
||||
version = "0.8.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"num-traits",
|
||||
"paste",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rmp-serde"
|
||||
version = "1.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
"rmp",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.196"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.196"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serialport"
|
||||
version = "4.2.2"
|
||||
|
@ -304,9 +375,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.38"
|
||||
version = "2.0.48"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
|
||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
|
@ -7,4 +7,6 @@ edition = "2021"
|
|||
|
||||
[dependencies]
|
||||
clap = { version = "4.4.7", features = ["derive"] }
|
||||
rmp-serde = "1.1.2"
|
||||
serde = {version ="1.0.188", features = ["derive"]}
|
||||
serialport = "4.2.2"
|
||||
|
|
91
src/main.rs
91
src/main.rs
|
@ -1,14 +1,60 @@
|
|||
use clap::Parser;
|
||||
use std::time::Duration;
|
||||
use std::{process::exit, time::Duration};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use rmp_serde::{Deserializer, Serializer};
|
||||
|
||||
const NUM_LIGHTS: usize = 4;
|
||||
type LightIndex = u8;
|
||||
type LightStatus = u8;
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(author, version, about, long_about = None)]
|
||||
struct Args {
|
||||
mode: String,
|
||||
#[arg(short, long)]
|
||||
index: Option<LightIndex>,
|
||||
#[arg(short, long)]
|
||||
port: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize, Serialize)]
|
||||
enum MessageType{
|
||||
Info,
|
||||
Warning,
|
||||
Error,
|
||||
Success,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize, Serialize)]
|
||||
struct StatusMessagePayload{
|
||||
kind: MessageType,
|
||||
content: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize, Serialize)]
|
||||
struct CommandPayload{
|
||||
content: String,
|
||||
}
|
||||
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize, Serialize)]
|
||||
enum LightControlCommand{
|
||||
Toggle(LightIndex),
|
||||
On,
|
||||
Off,
|
||||
Increase(LightIndex),
|
||||
Decrease(LightIndex),
|
||||
Set((LightIndex,LightStatus)),
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Deserialize, Serialize)]
|
||||
enum Packet{
|
||||
StatusMessage(StatusMessagePayload),
|
||||
Command(CommandPayload),
|
||||
LightControl(LightControlCommand),
|
||||
LightStatus([LightStatus;NUM_LIGHTS]),
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args = Args::parse();
|
||||
let default_address = "/dev/heliox".to_string();
|
||||
|
@ -18,29 +64,44 @@ fn main() {
|
|||
.open()
|
||||
.expect("Failed to open port");
|
||||
|
||||
let on_cmd = "HX\x02\x02\x00".as_bytes();
|
||||
let off_cmd = "HX\x02\x02\x01".as_bytes();
|
||||
let son1_cmd = "HX\x03\x02\x02\x01".as_bytes();
|
||||
let son2_cmd = "HX\x03\x02\x02\x00".as_bytes();
|
||||
let packet:Option<Packet>;
|
||||
let mut serialized_packet = Vec::new();
|
||||
|
||||
match args.mode.as_str() {
|
||||
"on" => {
|
||||
println!("Turning on...");
|
||||
port.write(on_cmd).expect("Write failed!");
|
||||
packet = Option::Some(Packet::LightControl(LightControlCommand::On));
|
||||
}
|
||||
"off" => {
|
||||
println!("Turning off...");
|
||||
port.write(off_cmd).expect("Write failed!");
|
||||
packet = Option::Some(Packet::LightControl(LightControlCommand::Off));
|
||||
}
|
||||
"son" => {
|
||||
println!("Turning semi-on...");
|
||||
port.write(on_cmd).expect("Write failed!");
|
||||
port.write(son1_cmd).expect("Write failed!");
|
||||
port.write(son2_cmd).expect("Write failed!");
|
||||
"toggle" => {
|
||||
packet = match args.index{
|
||||
Some(index)=>Option::Some(Packet::LightControl(LightControlCommand::Toggle(index))),
|
||||
None=>{
|
||||
eprintln!("You must supply an index to toggle a specific light!");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
eprintln!("Invalid mode value");
|
||||
std::process::exit(1);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
match packet{
|
||||
Option::Some(packet)=>{
|
||||
packet.serialize(&mut Serializer::new(&mut serialized_packet)).unwrap();
|
||||
port.write_all(&serialized_packet).expect("Serial port write failed!");
|
||||
|
||||
println!("{:?}",serialized_packet);
|
||||
let mut in_buf = serialized_packet.as_slice();
|
||||
let d2: Packet = Deserialize::deserialize(&mut Deserializer::new(&mut in_buf)).unwrap();
|
||||
println!("{:?}",d2);
|
||||
},
|
||||
Option::None=>{
|
||||
eprintln!("No valid packet was specified, so nothing was serialized!");
|
||||
exit(1);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue