2023-07-16 22:09:30 +02:00
|
|
|
use core::mem;
|
|
|
|
|
2023-07-12 16:06:56 +02:00
|
|
|
use super::indications::{
|
|
|
|
AssociateIndication, BeaconNotifyIndication, CommStatusIndication, DataIndication, DisassociateIndication,
|
|
|
|
DpsIndication, GtsIndication, OrphanIndication, PollIndication, SyncLossIndication,
|
|
|
|
};
|
|
|
|
use super::responses::{
|
|
|
|
AssociateConfirm, CalibrateConfirm, DataConfirm, DisassociateConfirm, DpsConfirm, GetConfirm, GtsConfirm,
|
|
|
|
PollConfirm, PurgeConfirm, ResetConfirm, RxEnableConfirm, ScanConfirm, SetConfirm, SoundingConfirm, StartConfirm,
|
|
|
|
};
|
2023-07-16 22:09:30 +02:00
|
|
|
use crate::evt::EvtBox;
|
2023-07-15 21:47:34 +02:00
|
|
|
use crate::mac::opcodes::OpcodeM0ToM4;
|
2023-07-16 22:09:30 +02:00
|
|
|
use crate::sub::mac::Mac;
|
2023-07-12 16:06:56 +02:00
|
|
|
|
2023-07-16 22:09:30 +02:00
|
|
|
pub(crate) trait ParseableMacEvent: Sized {
|
|
|
|
fn from_buffer<'a>(buf: &'a [u8]) -> Result<&'a Self, ()> {
|
|
|
|
if buf.len() < mem::size_of::<Self>() {
|
|
|
|
Err(())
|
|
|
|
} else {
|
|
|
|
Ok(unsafe { &*(buf as *const _ as *const Self) })
|
2023-07-12 16:06:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-16 22:09:30 +02:00
|
|
|
pub struct Event {
|
|
|
|
event_box: EvtBox<Mac>,
|
2023-07-12 16:06:56 +02:00
|
|
|
}
|
|
|
|
|
2023-07-16 22:09:30 +02:00
|
|
|
impl Event {
|
|
|
|
pub(crate) fn new(event_box: EvtBox<Mac>) -> Self {
|
|
|
|
Self { event_box }
|
|
|
|
}
|
2023-07-12 16:06:56 +02:00
|
|
|
|
2023-07-16 22:09:30 +02:00
|
|
|
pub fn mac_event<'a>(&'a self) -> Result<MacEvent<'a>, ()> {
|
|
|
|
let payload = self.event_box.payload();
|
|
|
|
let opcode = u16::from_le_bytes(payload[0..2].try_into().unwrap());
|
2023-07-12 16:06:56 +02:00
|
|
|
|
|
|
|
let opcode = OpcodeM0ToM4::try_from(opcode)?;
|
2023-07-17 00:28:34 +02:00
|
|
|
let buf = &payload[2..];
|
2023-07-12 16:06:56 +02:00
|
|
|
|
|
|
|
match opcode {
|
2023-07-17 00:28:34 +02:00
|
|
|
OpcodeM0ToM4::MlmeAssociateCnf => Ok(MacEvent::MlmeAssociateCnf(AssociateConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeDisassociateCnf => {
|
|
|
|
Ok(MacEvent::MlmeDisassociateCnf(DisassociateConfirm::from_buffer(buf)?))
|
2023-07-16 22:09:30 +02:00
|
|
|
}
|
2023-07-17 00:28:34 +02:00
|
|
|
OpcodeM0ToM4::MlmeGetCnf => Ok(MacEvent::MlmeGetCnf(GetConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeGtsCnf => Ok(MacEvent::MlmeGtsCnf(GtsConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeResetCnf => Ok(MacEvent::MlmeResetCnf(ResetConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeRxEnableCnf => Ok(MacEvent::MlmeRxEnableCnf(RxEnableConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeScanCnf => Ok(MacEvent::MlmeScanCnf(ScanConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeSetCnf => Ok(MacEvent::MlmeSetCnf(SetConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeStartCnf => Ok(MacEvent::MlmeStartCnf(StartConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmePollCnf => Ok(MacEvent::MlmePollCnf(PollConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeDpsCnf => Ok(MacEvent::MlmeDpsCnf(DpsConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeSoundingCnf => Ok(MacEvent::MlmeSoundingCnf(SoundingConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeCalibrateCnf => Ok(MacEvent::MlmeCalibrateCnf(CalibrateConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::McpsDataCnf => Ok(MacEvent::McpsDataCnf(DataConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::McpsPurgeCnf => Ok(MacEvent::McpsPurgeCnf(PurgeConfirm::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeAssociateInd => Ok(MacEvent::MlmeAssociateInd(AssociateIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeDisassociateInd => {
|
|
|
|
Ok(MacEvent::MlmeDisassociateInd(DisassociateIndication::from_buffer(buf)?))
|
2023-07-16 22:09:30 +02:00
|
|
|
}
|
2023-07-17 00:28:34 +02:00
|
|
|
OpcodeM0ToM4::MlmeBeaconNotifyInd => {
|
|
|
|
Ok(MacEvent::MlmeBeaconNotifyInd(BeaconNotifyIndication::from_buffer(buf)?))
|
|
|
|
}
|
|
|
|
OpcodeM0ToM4::MlmeCommStatusInd => Ok(MacEvent::MlmeCommStatusInd(CommStatusIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeGtsInd => Ok(MacEvent::MlmeGtsInd(GtsIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeOrphanInd => Ok(MacEvent::MlmeOrphanInd(OrphanIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeSyncLossInd => Ok(MacEvent::MlmeSyncLossInd(SyncLossIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmeDpsInd => Ok(MacEvent::MlmeDpsInd(DpsIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::McpsDataInd => Ok(MacEvent::McpsDataInd(DataIndication::from_buffer(buf)?)),
|
|
|
|
OpcodeM0ToM4::MlmePollInd => Ok(MacEvent::MlmePollInd(PollIndication::from_buffer(buf)?)),
|
2023-07-12 16:06:56 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-07-16 16:32:54 +02:00
|
|
|
|
2023-07-16 22:09:30 +02:00
|
|
|
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
|
|
|
|
pub enum MacEvent<'a> {
|
|
|
|
MlmeAssociateCnf(&'a AssociateConfirm),
|
|
|
|
MlmeDisassociateCnf(&'a DisassociateConfirm),
|
|
|
|
MlmeGetCnf(&'a GetConfirm),
|
|
|
|
MlmeGtsCnf(&'a GtsConfirm),
|
|
|
|
MlmeResetCnf(&'a ResetConfirm),
|
|
|
|
MlmeRxEnableCnf(&'a RxEnableConfirm),
|
|
|
|
MlmeScanCnf(&'a ScanConfirm),
|
|
|
|
MlmeSetCnf(&'a SetConfirm),
|
|
|
|
MlmeStartCnf(&'a StartConfirm),
|
|
|
|
MlmePollCnf(&'a PollConfirm),
|
|
|
|
MlmeDpsCnf(&'a DpsConfirm),
|
|
|
|
MlmeSoundingCnf(&'a SoundingConfirm),
|
|
|
|
MlmeCalibrateCnf(&'a CalibrateConfirm),
|
|
|
|
McpsDataCnf(&'a DataConfirm),
|
|
|
|
McpsPurgeCnf(&'a PurgeConfirm),
|
|
|
|
MlmeAssociateInd(&'a AssociateIndication),
|
|
|
|
MlmeDisassociateInd(&'a DisassociateIndication),
|
|
|
|
MlmeBeaconNotifyInd(&'a BeaconNotifyIndication),
|
|
|
|
MlmeCommStatusInd(&'a CommStatusIndication),
|
|
|
|
MlmeGtsInd(&'a GtsIndication),
|
|
|
|
MlmeOrphanInd(&'a OrphanIndication),
|
|
|
|
MlmeSyncLossInd(&'a SyncLossIndication),
|
|
|
|
MlmeDpsInd(&'a DpsIndication),
|
|
|
|
McpsDataInd(&'a DataIndication),
|
|
|
|
MlmePollInd(&'a PollIndication),
|
|
|
|
}
|