use crate::error::Error;
use crate::frame::{CommandCode, MTFrame, MTHeader};
use crate::types::*;
use bytes::{Buf, BufMut};
use std::io::Cursor;
use std::io::Read;
#[derive(Debug, Clone)]
pub struct CallbackSubCmd {
pub subsystem_id: SubsystemId,
pub enables: u32,
}
impl CallbackSubCmd {
pub fn try_decode(buffer: &[u8]) -> Result<Self, Error> {
let mut cursor = Cursor::new(buffer);
let subsystem_id = SubsystemId::try_decode(&mut cursor)?;
let enables = cursor.get_u32_le();
Ok(CallbackSubCmd {
subsystem_id,
enables,
})
}
pub fn encode(&self) -> Vec<u8> {
let mut buffer = Vec::new();
self.encode_into(&mut buffer);
buffer
}
pub fn encode_into(&self, buffer: &mut Vec<u8>) {
self.subsystem_id.encode_into(buffer);
buffer.put_u32_le(self.enables);
}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x05,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SREQ,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::CallbackSubCmd as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}
#[derive(Debug, Clone)]
pub struct GetExtAddr {
pub address_type: ExtendedAddressType,
}
impl GetExtAddr {
pub fn try_decode(buffer: &[u8]) -> Result<Self, Error> {
let mut cursor = Cursor::new(buffer);
let address_type = ExtendedAddressType::try_decode(&mut cursor)?;
Ok(GetExtAddr { address_type })
}
pub fn encode(&self) -> Vec<u8> {
let mut buffer = Vec::new();
self.encode_into(&mut buffer);
buffer
}
pub fn encode_into(&self, buffer: &mut Vec<u8>) {
self.address_type.encode_into(buffer);
}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x01,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SREQ,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::GetExtAddr as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}
#[derive(Debug, Clone)]
pub struct Loopback {
pub repeats: u8,
pub interval: u32,
pub data: Vec<u8>,
}
impl Loopback {
pub fn try_decode(buffer: &[u8]) -> Result<Self, Error> {
let mut cursor = Cursor::new(buffer);
let repeats = cursor.get_u8();
let interval = cursor.get_u32_le();
let mut data = Vec::new();
cursor
.read_to_end(&mut data)
.map_err(|_| Error::NotEnoughBytes)?;
Ok(Loopback {
repeats,
interval,
data,
})
}
pub fn encode(&self) -> Vec<u8> {
let mut buffer = Vec::new();
self.encode_into(&mut buffer);
buffer
}
pub fn encode_into(&self, buffer: &mut Vec<u8>) {
buffer.put_u8(self.repeats);
buffer.put_u32_le(self.interval);
buffer.extend(self.data.iter());
}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x05 + self.data.len() as u8,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SREQ,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::Loopback as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}
#[derive(Debug, Clone)]
pub struct Random {}
impl Random {
pub fn try_decode(_: &[u8]) -> Result<Self, Error> {
Ok(Random {})
}
pub fn encode(&self) -> Vec<u8> {
let mut buffer = Vec::new();
self.encode_into(&mut buffer);
buffer
}
pub fn encode_into(&self, _: &mut Vec<u8>) {}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x00,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SREQ,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::Random as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}