use deku::prelude::*;
use super::InterfaceType;
use crate::{network::Addressee, physical::Channel};
#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
#[deku(ctx = "interface_id: InterfaceType, length: u32", id = "interface_id")]
pub enum InterfaceFinalStatus {
#[deku(id = "InterfaceType::Dash7")]
Dash7(InterfaceFinalStatusCode),
#[deku(id_pat = "_")]
Other(#[deku(count = "length")] Vec<u8>),
}
#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
#[deku(type = "u8")]
pub enum InterfaceFinalStatusCode {
No = 0,
Busy = 0xFF,
BadParam = 0xFE,
DutyCycle = 0xFD,
CcaTo = 0xFC,
NlsKey = 0xFB,
TxUdf = 0xFA,
RxOvf = 0xF9,
RxCrc = 0xF8,
Abort = 0xF7,
NoAck = 0xF6,
RxTo = 0xF5,
NotSupportedBand = 0xF4,
NotSupportedChannel = 0xF3,
NotSupportedModulation = 0xF2,
VoidChannelList = 0xF1,
NotSupportedLen = 0xF0,
ParamOvf = 0xEF,
VidWoNls = 0xEE,
TxSched = 0xED,
RxSched = 0xEC,
BufferOvf = 0xEB,
NotSupportedMode = 0xEA,
}
#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
#[deku(ctx = "interface_id: InterfaceType, length: u32", id = "interface_id")]
pub enum InterfaceTxStatus {
#[deku(id = "InterfaceType::Dash7")]
Dash7(Dash7InterfaceTxStatus),
#[deku(id_pat = "_")]
Other(#[deku(count = "length")] Vec<u8>),
}
#[derive(DekuRead, DekuWrite, Debug, Clone, PartialEq)]
pub struct Dash7InterfaceTxStatus {
pub channel: Channel,
pub target_rx_level: i8,
pub error: InterfaceFinalStatusCode,
#[deku(pad_bits_before = "24")]
pub lts: u32,
pub addressee: Addressee,
}
#[cfg(test)]
mod test {
use hex_literal::hex;
use crate::{
link::AccessClass,
network::{Address, Addressee, NlsState},
physical::{Channel, ChannelBand, ChannelClass, ChannelCoding, ChannelHeader},
test_tools::test_item,
transport::GroupCondition,
};
use super::*;
#[test]
fn test_interface_tx_status() {
test_item(
Dash7InterfaceTxStatus {
channel: Channel {
header: ChannelHeader::new(
ChannelBand::Rfu0,
ChannelClass::LoRate,
ChannelCoding::Rfu,
),
index: 0x0123,
},
target_rx_level: 2,
error: InterfaceFinalStatusCode::Busy,
lts: 0x0708_0000,
addressee: Addressee::new(
false,
GroupCondition::Any,
Address::Vid(0x0011),
NlsState::AesCcm64([0; 5]),
AccessClass::new(0x0F, 0x0F),
),
},
&hex!("01 0123 02 FF 00 00 00 0000 0807 36 FF 0011 0000000000"),
)
}
}