#![allow(dead_code)]
use super::types::Address;
use super::types::DstAddrMode;
use super::types::SrcAddrMode;
use super::types::TxOptions;
use crate::aps::types;
pub trait ApsdeSap {
fn data_request(&self, request: ApsdeSapRequest) -> ApsdeSapConfirm;
}
#[derive(Debug, Clone, Default, PartialEq)]
struct Apsde {
pub(crate) supports_binding_table: bool,
}
impl ApsdeSap for Apsde {
fn data_request(&self, request: ApsdeSapRequest) -> ApsdeSapConfirm {
let status = if request.dst_addr_mode == DstAddrMode::None && self.supports_binding_table {
if false {
ApsdeSapConfirmStatus::NoBoundDevice
} else {
ApsdeSapConfirmStatus::Success
}
} else {
ApsdeSapConfirmStatus::NoAck
};
ApsdeSapConfirm {
dst_addr_mode: request.dst_addr_mode,
dst_address: request.dst_address,
dst_endpoint: request.dst_endpoint,
src_endpoint: request.src_endpoint,
status,
tx_time: 0,
}
}
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ApsdeSapRequest {
dst_addr_mode: DstAddrMode,
dst_address: Address,
dst_endpoint: u8,
profile_id: u16,
cluster_id: u16,
src_endpoint: types::SrcEndpoint,
asdulength: u8,
asdu: u8,
tx_options: TxOptions,
use_alias: bool,
alias_src_addr: u16,
alias_seq_number: u8,
radius_counter: u8,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub enum ApsdeSapConfirmStatus {
#[default]
Success,
NoShortAddress,
NoBoundDevice,
SecurityFail,
NoAck,
AsduTooLong,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ApsdeSapConfirm {
pub dst_addr_mode: DstAddrMode,
pub dst_address: Address,
pub dst_endpoint: u8,
pub src_endpoint: types::SrcEndpoint,
pub status: ApsdeSapConfirmStatus,
pub tx_time: u8,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub enum ApsdeSapIndicationStatus {
#[default]
Success,
DefragUnsupported,
DefragDeferred,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub enum SecurityStatus {
#[default]
Unsecured,
SecuredNwkKey,
SecuredLinkKey,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ApsdeSapIndication {
dst_addr_mode: DstAddrMode,
dst_address: u8,
dst_endpoint: u8,
src_addr_mode: SrcAddrMode,
src_address: u64,
src_endpoint: types::SrcEndpoint,
profile_id: u16,
cluster_id: u16,
asdulength: u8,
status: ApsdeSapIndicationStatus,
security_status: SecurityStatus,
link_quality: u8,
rx_time: u8,
}