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 status: Status,
pub enables: u32,
}
impl CallbackSubCmd {
pub fn try_decode(buffer: &[u8]) -> Result<Self, Error> {
let mut cursor = Cursor::new(buffer);
let status = Status::try_decode(&mut cursor)?;
let enables = cursor.get_u32_le();
Ok(CallbackSubCmd { status, 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.status.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::SRSP,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::CallbackSubCmd as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}
#[derive(Debug, Clone)]
pub struct GetExtAddr {
pub address_type: ExtendedAddressType,
pub ext_address: ExtendedAddress,
}
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)?;
let ext_address = ExtendedAddress::try_decode(&mut cursor)?;
Ok(GetExtAddr {
address_type,
ext_address,
})
}
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);
self.ext_address.encode_into(buffer);
}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x09,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SRSP,
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::SRSP,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::Loopback as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}
#[derive(Debug, Clone)]
pub struct Random {
pub number: u16,
}
impl Random {
pub fn try_decode(buffer: &[u8]) -> Result<Self, Error> {
let mut cursor = Cursor::new(buffer);
let number = cursor.get_u16_le();
Ok(Random { number })
}
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_u16_le(self.number);
}
pub fn into_mt_frame(self) -> MTFrame {
MTFrame {
header: MTHeader {
length: 0x02,
command: CommandCode {
is_extended: false,
cmd_type: CommandType::SRSP,
subsystem: MTSubsystem::UTIL,
id: UTILCommandId::Random as u8,
},
},
extended_header: None,
payload: self.encode(),
}
}
}