diff --git a/src/codec/command.rs b/src/codec/command.rs index ecac544..b818b44 100644 --- a/src/codec/command.rs +++ b/src/codec/command.rs @@ -14,26 +14,30 @@ pub trait Param { impl Param for u8 { fn write_bytes(&self, dst: &mut tokio_util::bytes::BytesMut) { - write!(dst, "{self}").unwrap() + write!(dst, "{self}").unwrap(); } } -// TODO: don't require named params macro_rules! command { ($cmd:literal, $name:ident) => { pub struct $name; impl Command for $name { - fn as_bytes(&self) -> &'static [u8] { - $cmd + fn as_bytes(&self) -> &'static [u8] { $cmd } + } + }; + ($cmd:literal, $name: ident ( $param_ty:ty )) => { + pub struct $name(pub $param_ty); + impl Command for $name { + fn as_bytes(&self) -> &'static [u8] { $cmd } + fn params(&self) -> impl IntoIterator { + [&self.0 as &dyn Param] } } }; ($cmd:literal, $name: ident { $($param:ident: $param_ty:ty),+ }) => { pub struct $name { $(pub $param: $param_ty),+ } impl Command for $name { - fn as_bytes(&self) -> &'static [u8] { - $cmd - } + fn as_bytes(&self) -> &'static [u8] { $cmd } fn params(&self) -> impl IntoIterator { [$(&self.$param as &dyn Param),+] } @@ -95,10 +99,14 @@ param! { } command!(b"BSV", GetBatteryInfo); -command!( - b"BSV", - SetBatteryInfo { - charge_time: BatteryChargeTime - } -); +command!(b"BSV", SetBatteryInfo(BatteryChargeTime)); param!(pub range BatteryChargeTime(1..=16)); + +command!(b"CLR", ClearAllMemory); + +command!(b"BPL", GetBandPlan); +command!(b"BPL", SetBandPlan(BandPlan)); +param!(pub enum BandPlan { + Usa => b"0", + Canada => b"1" +}); diff --git a/src/lib.rs b/src/lib.rs index e86cb54..335db9e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,8 +10,9 @@ use crate::codec::Codec; use crate::codec::command::Command; pub use crate::codec::command::{ - Backlight, BatteryChargeTime, EnterProgramMode, ExitProgramMode, GetBacklight, GetBatteryInfo, - GetFirmwareVersion, GetModelInfo, SetBacklight, SetBatteryInfo, + Backlight, BandPlan, BatteryChargeTime, ClearAllMemory, EnterProgramMode, ExitProgramMode, + GetBacklight, GetBandPlan, GetBatteryInfo, GetFirmwareVersion, GetModelInfo, SetBacklight, + SetBandPlan, SetBatteryInfo, }; const VENDOR_ID: u16 = 0x1965; diff --git a/src/main.rs b/src/main.rs index d1603d0..fd004b2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use uniden::{ - Backlight, BatteryChargeTime, EnterProgramMode, ExitProgramMode, GetBacklight, GetBatteryInfo, - GetFirmwareVersion, GetModelInfo, Scanner, SetBacklight, SetBatteryInfo, + Backlight, BandPlan, BatteryChargeTime, EnterProgramMode, ExitProgramMode, GetBacklight, + GetBandPlan, GetBatteryInfo, GetFirmwareVersion, GetModelInfo, Scanner, SetBacklight, + SetBandPlan, SetBatteryInfo, }; #[tokio::main] @@ -10,15 +11,9 @@ async fn main() -> Result<(), Box> { dbg!(scanner.command(GetFirmwareVersion).await?); dbg!(scanner.command(GetModelInfo).await?); dbg!(scanner.command(EnterProgramMode).await?); - dbg!(scanner.command(GetBatteryInfo).await?); - dbg!( - scanner - .command(SetBatteryInfo { - charge_time: BatteryChargeTime::new(16) - }) - .await? - ); - dbg!(scanner.command(GetBatteryInfo).await?); + dbg!(scanner.command(GetBandPlan).await?); + dbg!(scanner.command(SetBandPlan(BandPlan::Usa)).await?); + dbg!(scanner.command(GetBandPlan).await?); dbg!(scanner.command(ExitProgramMode).await?); Ok(()) }