diff options
| -rw-r--r-- | embassy-stm32-wpan/src/mac/event.rs | 163 | ||||
| -rw-r--r-- | embassy-stm32-wpan/src/mac/indications.rs | 269 | ||||
| -rw-r--r-- | embassy-stm32-wpan/src/mac/responses.rs | 271 | ||||
| -rw-r--r-- | embassy-stm32-wpan/src/sub/mac.rs | 9 | ||||
| -rw-r--r-- | examples/stm32wb/src/bin/mac_ffd.rs | 46 | ||||
| -rw-r--r-- | examples/stm32wb/src/bin/mac_rfd.rs | 55 | ||||
| -rw-r--r-- | tests/stm32/src/bin/wpan_mac.rs | 32 |
7 files changed, 240 insertions, 605 deletions
diff --git a/embassy-stm32-wpan/src/mac/event.rs b/embassy-stm32-wpan/src/mac/event.rs index c2bdc7e11..67f207d57 100644 --- a/embassy-stm32-wpan/src/mac/event.rs +++ b/embassy-stm32-wpan/src/mac/event.rs | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | use core::mem; | ||
| 2 | |||
| 1 | use super::indications::{ | 3 | use super::indications::{ |
| 2 | AssociateIndication, BeaconNotifyIndication, CommStatusIndication, DataIndication, DisassociateIndication, | 4 | AssociateIndication, BeaconNotifyIndication, CommStatusIndication, DataIndication, DisassociateIndication, |
| 3 | DpsIndication, GtsIndication, OrphanIndication, PollIndication, SyncLossIndication, | 5 | DpsIndication, GtsIndication, OrphanIndication, PollIndication, SyncLossIndication, |
| @@ -6,89 +8,110 @@ use super::responses::{ | |||
| 6 | AssociateConfirm, CalibrateConfirm, DataConfirm, DisassociateConfirm, DpsConfirm, GetConfirm, GtsConfirm, | 8 | AssociateConfirm, CalibrateConfirm, DataConfirm, DisassociateConfirm, DpsConfirm, GetConfirm, GtsConfirm, |
| 7 | PollConfirm, PurgeConfirm, ResetConfirm, RxEnableConfirm, ScanConfirm, SetConfirm, SoundingConfirm, StartConfirm, | 9 | PollConfirm, PurgeConfirm, ResetConfirm, RxEnableConfirm, ScanConfirm, SetConfirm, SoundingConfirm, StartConfirm, |
| 8 | }; | 10 | }; |
| 11 | use crate::evt::EvtBox; | ||
| 9 | use crate::mac::opcodes::OpcodeM0ToM4; | 12 | use crate::mac::opcodes::OpcodeM0ToM4; |
| 13 | use crate::sub::mac::Mac; | ||
| 10 | 14 | ||
| 11 | pub trait ParseableMacEvent { | 15 | pub(crate) trait ParseableMacEvent: Sized { |
| 12 | const SIZE: usize; | 16 | fn from_buffer<'a>(buf: &'a [u8]) -> Result<&'a Self, ()> { |
| 13 | 17 | if buf.len() < mem::size_of::<Self>() { | |
| 14 | fn validate(buf: &[u8]) -> Result<(), ()> { | 18 | Err(()) |
| 15 | if buf.len() < Self::SIZE { | 19 | } else { |
| 16 | return Err(()); | 20 | Ok(unsafe { &*(buf as *const _ as *const Self) }) |
| 17 | } | 21 | } |
| 18 | |||
| 19 | Ok(()) | ||
| 20 | } | 22 | } |
| 21 | |||
| 22 | fn try_parse(buf: &[u8]) -> Result<Self, ()> | ||
| 23 | where | ||
| 24 | Self: Sized; | ||
| 25 | } | 23 | } |
| 26 | 24 | ||
| 27 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 25 | pub struct Event { |
| 28 | pub enum MacEvent { | 26 | event_box: EvtBox<Mac>, |
| 29 | MlmeAssociateCnf(AssociateConfirm), | ||
| 30 | MlmeDisassociateCnf(DisassociateConfirm), | ||
| 31 | MlmeGetCnf(GetConfirm), | ||
| 32 | MlmeGtsCnf(GtsConfirm), | ||
| 33 | MlmeResetCnf(ResetConfirm), | ||
| 34 | MlmeRxEnableCnf(RxEnableConfirm), | ||
| 35 | MlmeScanCnf(ScanConfirm), | ||
| 36 | MlmeSetCnf(SetConfirm), | ||
| 37 | MlmeStartCnf(StartConfirm), | ||
| 38 | MlmePollCnf(PollConfirm), | ||
| 39 | MlmeDpsCnf(DpsConfirm), | ||
| 40 | MlmeSoundingCnf(SoundingConfirm), | ||
| 41 | MlmeCalibrateCnf(CalibrateConfirm), | ||
| 42 | McpsDataCnf(DataConfirm), | ||
| 43 | McpsPurgeCnf(PurgeConfirm), | ||
| 44 | MlmeAssociateInd(AssociateIndication), | ||
| 45 | MlmeDisassociateInd(DisassociateIndication), | ||
| 46 | MlmeBeaconNotifyInd(BeaconNotifyIndication), | ||
| 47 | MlmeCommStatusInd(CommStatusIndication), | ||
| 48 | MlmeGtsInd(GtsIndication), | ||
| 49 | MlmeOrphanInd(OrphanIndication), | ||
| 50 | MlmeSyncLossInd(SyncLossIndication), | ||
| 51 | MlmeDpsInd(DpsIndication), | ||
| 52 | McpsDataInd(DataIndication), | ||
| 53 | MlmePollInd(PollIndication), | ||
| 54 | } | 27 | } |
| 55 | 28 | ||
| 56 | impl TryFrom<&[u8]> for MacEvent { | 29 | impl Event { |
| 57 | type Error = (); | 30 | pub(crate) fn new(event_box: EvtBox<Mac>) -> Self { |
| 31 | Self { event_box } | ||
| 32 | } | ||
| 58 | 33 | ||
| 59 | fn try_from(value: &[u8]) -> Result<Self, Self::Error> { | 34 | pub fn mac_event<'a>(&'a self) -> Result<MacEvent<'a>, ()> { |
| 60 | let opcode = u16::from_le_bytes(value[0..2].try_into().unwrap()); | 35 | let payload = self.event_box.payload(); |
| 36 | let opcode = u16::from_le_bytes(payload[0..2].try_into().unwrap()); | ||
| 61 | 37 | ||
| 62 | let opcode = OpcodeM0ToM4::try_from(opcode)?; | 38 | let opcode = OpcodeM0ToM4::try_from(opcode)?; |
| 63 | 39 | ||
| 64 | let buf = &value[2..]; | ||
| 65 | |||
| 66 | match opcode { | 40 | match opcode { |
| 67 | OpcodeM0ToM4::MlmeAssociateCnf => Ok(Self::MlmeAssociateCnf(AssociateConfirm::try_parse(buf)?)), | 41 | OpcodeM0ToM4::MlmeAssociateCnf => Ok(MacEvent::MlmeAssociateCnf(AssociateConfirm::from_buffer( |
| 68 | OpcodeM0ToM4::MlmeDisassociateCnf => Ok(Self::MlmeDisassociateCnf(DisassociateConfirm::try_parse(buf)?)), | 42 | &payload[2..], |
| 69 | OpcodeM0ToM4::MlmeGetCnf => Ok(Self::MlmeGetCnf(GetConfirm::try_parse(buf)?)), | 43 | )?)), |
| 70 | OpcodeM0ToM4::MlmeGtsCnf => Ok(Self::MlmeGtsCnf(GtsConfirm::try_parse(buf)?)), | 44 | OpcodeM0ToM4::MlmeDisassociateCnf => Ok(MacEvent::MlmeDisassociateCnf(DisassociateConfirm::from_buffer( |
| 71 | OpcodeM0ToM4::MlmeResetCnf => Ok(Self::MlmeResetCnf(ResetConfirm::try_parse(buf)?)), | 45 | &payload[2..], |
| 72 | OpcodeM0ToM4::MlmeRxEnableCnf => Ok(Self::MlmeRxEnableCnf(RxEnableConfirm::try_parse(buf)?)), | 46 | )?)), |
| 73 | OpcodeM0ToM4::MlmeScanCnf => Ok(Self::MlmeScanCnf(ScanConfirm::try_parse(buf)?)), | 47 | OpcodeM0ToM4::MlmeGetCnf => Ok(MacEvent::MlmeGetCnf(GetConfirm::from_buffer(&payload[2..])?)), |
| 74 | OpcodeM0ToM4::MlmeSetCnf => Ok(Self::MlmeSetCnf(SetConfirm::try_parse(buf)?)), | 48 | OpcodeM0ToM4::MlmeGtsCnf => Ok(MacEvent::MlmeGtsCnf(GtsConfirm::from_buffer(&payload[2..])?)), |
| 75 | OpcodeM0ToM4::MlmeStartCnf => Ok(Self::MlmeStartCnf(StartConfirm::try_parse(buf)?)), | 49 | OpcodeM0ToM4::MlmeResetCnf => Ok(MacEvent::MlmeResetCnf(ResetConfirm::from_buffer(&payload[2..])?)), |
| 76 | OpcodeM0ToM4::MlmePollCnf => Ok(Self::MlmePollCnf(PollConfirm::try_parse(buf)?)), | 50 | OpcodeM0ToM4::MlmeRxEnableCnf => { |
| 77 | OpcodeM0ToM4::MlmeDpsCnf => Ok(Self::MlmeDpsCnf(DpsConfirm::try_parse(buf)?)), | 51 | Ok(MacEvent::MlmeRxEnableCnf(RxEnableConfirm::from_buffer(&payload[2..])?)) |
| 78 | OpcodeM0ToM4::MlmeSoundingCnf => Ok(Self::MlmeSoundingCnf(SoundingConfirm::try_parse(buf)?)), | 52 | } |
| 79 | OpcodeM0ToM4::MlmeCalibrateCnf => Ok(Self::MlmeCalibrateCnf(CalibrateConfirm::try_parse(buf)?)), | 53 | OpcodeM0ToM4::MlmeScanCnf => Ok(MacEvent::MlmeScanCnf(ScanConfirm::from_buffer(&payload[2..])?)), |
| 80 | OpcodeM0ToM4::McpsDataCnf => Ok(Self::McpsDataCnf(DataConfirm::try_parse(buf)?)), | 54 | OpcodeM0ToM4::MlmeSetCnf => Ok(MacEvent::MlmeSetCnf(SetConfirm::from_buffer(&payload[2..])?)), |
| 81 | OpcodeM0ToM4::McpsPurgeCnf => Ok(Self::McpsPurgeCnf(PurgeConfirm::try_parse(buf)?)), | 55 | OpcodeM0ToM4::MlmeStartCnf => Ok(MacEvent::MlmeStartCnf(StartConfirm::from_buffer(&payload[2..])?)), |
| 82 | OpcodeM0ToM4::MlmeAssociateInd => Ok(Self::MlmeAssociateInd(AssociateIndication::try_parse(buf)?)), | 56 | OpcodeM0ToM4::MlmePollCnf => Ok(MacEvent::MlmePollCnf(PollConfirm::from_buffer(&payload[2..])?)), |
| 83 | OpcodeM0ToM4::MlmeDisassociateInd => Ok(Self::MlmeDisassociateInd(DisassociateIndication::try_parse(buf)?)), | 57 | OpcodeM0ToM4::MlmeDpsCnf => Ok(MacEvent::MlmeDpsCnf(DpsConfirm::from_buffer(&payload[2..])?)), |
| 84 | OpcodeM0ToM4::MlmeBeaconNotifyInd => Ok(Self::MlmeBeaconNotifyInd(BeaconNotifyIndication::try_parse(buf)?)), | 58 | OpcodeM0ToM4::MlmeSoundingCnf => { |
| 85 | OpcodeM0ToM4::MlmeCommStatusInd => Ok(Self::MlmeCommStatusInd(CommStatusIndication::try_parse(buf)?)), | 59 | Ok(MacEvent::MlmeSoundingCnf(SoundingConfirm::from_buffer(&payload[2..])?)) |
| 86 | OpcodeM0ToM4::MlmeGtsInd => Ok(Self::MlmeGtsInd(GtsIndication::try_parse(buf)?)), | 60 | } |
| 87 | OpcodeM0ToM4::MlmeOrphanInd => Ok(Self::MlmeOrphanInd(OrphanIndication::try_parse(buf)?)), | 61 | OpcodeM0ToM4::MlmeCalibrateCnf => Ok(MacEvent::MlmeCalibrateCnf(CalibrateConfirm::from_buffer( |
| 88 | OpcodeM0ToM4::MlmeSyncLossInd => Ok(Self::MlmeSyncLossInd(SyncLossIndication::try_parse(buf)?)), | 62 | &payload[2..], |
| 89 | OpcodeM0ToM4::MlmeDpsInd => Ok(Self::MlmeDpsInd(DpsIndication::try_parse(buf)?)), | 63 | )?)), |
| 90 | OpcodeM0ToM4::McpsDataInd => Ok(Self::McpsDataInd(DataIndication::try_parse(buf)?)), | 64 | OpcodeM0ToM4::McpsDataCnf => Ok(MacEvent::McpsDataCnf(DataConfirm::from_buffer(&payload[2..])?)), |
| 91 | OpcodeM0ToM4::MlmePollInd => Ok(Self::MlmePollInd(PollIndication::try_parse(buf)?)), | 65 | OpcodeM0ToM4::McpsPurgeCnf => Ok(MacEvent::McpsPurgeCnf(PurgeConfirm::from_buffer(&payload[2..])?)), |
| 66 | OpcodeM0ToM4::MlmeAssociateInd => Ok(MacEvent::MlmeAssociateInd(AssociateIndication::from_buffer( | ||
| 67 | &payload[2..], | ||
| 68 | )?)), | ||
| 69 | OpcodeM0ToM4::MlmeDisassociateInd => Ok(MacEvent::MlmeDisassociateInd( | ||
| 70 | DisassociateIndication::from_buffer(&payload[2..])?, | ||
| 71 | )), | ||
| 72 | OpcodeM0ToM4::MlmeBeaconNotifyInd => Ok(MacEvent::MlmeBeaconNotifyInd( | ||
| 73 | BeaconNotifyIndication::from_buffer(&payload[2..])?, | ||
| 74 | )), | ||
| 75 | OpcodeM0ToM4::MlmeCommStatusInd => Ok(MacEvent::MlmeCommStatusInd(CommStatusIndication::from_buffer( | ||
| 76 | &payload[2..], | ||
| 77 | )?)), | ||
| 78 | OpcodeM0ToM4::MlmeGtsInd => Ok(MacEvent::MlmeGtsInd(GtsIndication::from_buffer(&payload[2..])?)), | ||
| 79 | OpcodeM0ToM4::MlmeOrphanInd => Ok(MacEvent::MlmeOrphanInd(OrphanIndication::from_buffer(&payload[2..])?)), | ||
| 80 | OpcodeM0ToM4::MlmeSyncLossInd => Ok(MacEvent::MlmeSyncLossInd(SyncLossIndication::from_buffer( | ||
| 81 | &payload[2..], | ||
| 82 | )?)), | ||
| 83 | OpcodeM0ToM4::MlmeDpsInd => Ok(MacEvent::MlmeDpsInd(DpsIndication::from_buffer(&payload[2..])?)), | ||
| 84 | OpcodeM0ToM4::McpsDataInd => Ok(MacEvent::McpsDataInd(DataIndication::from_buffer(&payload[2..])?)), | ||
| 85 | OpcodeM0ToM4::MlmePollInd => Ok(MacEvent::MlmePollInd(PollIndication::from_buffer(&payload[2..])?)), | ||
| 92 | } | 86 | } |
| 93 | } | 87 | } |
| 94 | } | 88 | } |
| 89 | |||
| 90 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | ||
| 91 | pub enum MacEvent<'a> { | ||
| 92 | MlmeAssociateCnf(&'a AssociateConfirm), | ||
| 93 | MlmeDisassociateCnf(&'a DisassociateConfirm), | ||
| 94 | MlmeGetCnf(&'a GetConfirm), | ||
| 95 | MlmeGtsCnf(&'a GtsConfirm), | ||
| 96 | MlmeResetCnf(&'a ResetConfirm), | ||
| 97 | MlmeRxEnableCnf(&'a RxEnableConfirm), | ||
| 98 | MlmeScanCnf(&'a ScanConfirm), | ||
| 99 | MlmeSetCnf(&'a SetConfirm), | ||
| 100 | MlmeStartCnf(&'a StartConfirm), | ||
| 101 | MlmePollCnf(&'a PollConfirm), | ||
| 102 | MlmeDpsCnf(&'a DpsConfirm), | ||
| 103 | MlmeSoundingCnf(&'a SoundingConfirm), | ||
| 104 | MlmeCalibrateCnf(&'a CalibrateConfirm), | ||
| 105 | McpsDataCnf(&'a DataConfirm), | ||
| 106 | McpsPurgeCnf(&'a PurgeConfirm), | ||
| 107 | MlmeAssociateInd(&'a AssociateIndication), | ||
| 108 | MlmeDisassociateInd(&'a DisassociateIndication), | ||
| 109 | MlmeBeaconNotifyInd(&'a BeaconNotifyIndication), | ||
| 110 | MlmeCommStatusInd(&'a CommStatusIndication), | ||
| 111 | MlmeGtsInd(&'a GtsIndication), | ||
| 112 | MlmeOrphanInd(&'a OrphanIndication), | ||
| 113 | MlmeSyncLossInd(&'a SyncLossIndication), | ||
| 114 | MlmeDpsInd(&'a DpsIndication), | ||
| 115 | McpsDataInd(&'a DataIndication), | ||
| 116 | MlmePollInd(&'a PollIndication), | ||
| 117 | } | ||
diff --git a/embassy-stm32-wpan/src/mac/indications.rs b/embassy-stm32-wpan/src/mac/indications.rs index 436b9ac9c..c7e9be84a 100644 --- a/embassy-stm32-wpan/src/mac/indications.rs +++ b/embassy-stm32-wpan/src/mac/indications.rs | |||
| @@ -23,22 +23,7 @@ pub struct AssociateIndication { | |||
| 23 | pub key_source: [u8; 8], | 23 | pub key_source: [u8; 8], |
| 24 | } | 24 | } |
| 25 | 25 | ||
| 26 | impl ParseableMacEvent for AssociateIndication { | 26 | impl ParseableMacEvent for AssociateIndication {} |
| 27 | const SIZE: usize = 20; | ||
| 28 | |||
| 29 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 30 | Self::validate(buf)?; | ||
| 31 | |||
| 32 | Ok(Self { | ||
| 33 | device_address: [buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]], | ||
| 34 | capability_information: Capabilities::from_bits(buf[8]).ok_or(())?, | ||
| 35 | security_level: SecurityLevel::try_from(buf[9])?, | ||
| 36 | key_id_mode: KeyIdMode::try_from(buf[10])?, | ||
| 37 | key_index: buf[11], | ||
| 38 | key_source: [buf[12], buf[13], buf[14], buf[15], buf[16], buf[17], buf[18], buf[19]], | ||
| 39 | }) | ||
| 40 | } | ||
| 41 | } | ||
| 42 | 27 | ||
| 43 | /// MLME DISASSOCIATE indication which will be used to send | 28 | /// MLME DISASSOCIATE indication which will be used to send |
| 44 | /// disassociation indication to the application. | 29 | /// disassociation indication to the application. |
| @@ -58,22 +43,7 @@ pub struct DisassociateIndication { | |||
| 58 | pub key_source: [u8; 8], | 43 | pub key_source: [u8; 8], |
| 59 | } | 44 | } |
| 60 | 45 | ||
| 61 | impl ParseableMacEvent for DisassociateIndication { | 46 | impl ParseableMacEvent for DisassociateIndication {} |
| 62 | const SIZE: usize = 20; | ||
| 63 | |||
| 64 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 65 | Self::validate(buf)?; | ||
| 66 | |||
| 67 | Ok(Self { | ||
| 68 | device_address: [buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]], | ||
| 69 | disassociation_reason: DisassociationReason::try_from(buf[8])?, | ||
| 70 | security_level: SecurityLevel::try_from(buf[9])?, | ||
| 71 | key_id_mode: KeyIdMode::try_from(buf[10])?, | ||
| 72 | key_index: buf[11], | ||
| 73 | key_source: [buf[12], buf[13], buf[14], buf[15], buf[16], buf[17], buf[18], buf[19]], | ||
| 74 | }) | ||
| 75 | } | ||
| 76 | } | ||
| 77 | 47 | ||
| 78 | /// MLME BEACON NOTIIFY Indication which is used to send parameters contained | 48 | /// MLME BEACON NOTIIFY Indication which is used to send parameters contained |
| 79 | /// within a beacon frame received by the MAC to the application | 49 | /// within a beacon frame received by the MAC to the application |
| @@ -94,34 +64,7 @@ pub struct BeaconNotifyIndication { | |||
| 94 | pub sdu_length: u8, | 64 | pub sdu_length: u8, |
| 95 | } | 65 | } |
| 96 | 66 | ||
| 97 | impl ParseableMacEvent for BeaconNotifyIndication { | 67 | impl ParseableMacEvent for BeaconNotifyIndication {} |
| 98 | const SIZE: usize = 88; | ||
| 99 | |||
| 100 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 101 | // TODO: this is unchecked | ||
| 102 | |||
| 103 | Self::validate(buf)?; | ||
| 104 | |||
| 105 | let addr_list = [ | ||
| 106 | MacAddress::try_from(&buf[26..34])?, | ||
| 107 | MacAddress::try_from(&buf[34..42])?, | ||
| 108 | MacAddress::try_from(&buf[42..50])?, | ||
| 109 | MacAddress::try_from(&buf[50..58])?, | ||
| 110 | MacAddress::try_from(&buf[58..66])?, | ||
| 111 | MacAddress::try_from(&buf[66..74])?, | ||
| 112 | MacAddress::try_from(&buf[74..82])?, | ||
| 113 | ]; | ||
| 114 | |||
| 115 | Ok(Self { | ||
| 116 | sdu_ptr: u32::from_le_bytes(buf[0..4].try_into().unwrap()) as *const u8, | ||
| 117 | pan_descriptor: PanDescriptor::try_from(&buf[4..26])?, | ||
| 118 | addr_list, | ||
| 119 | bsn: buf[82], | ||
| 120 | pend_addr_spec: buf[83], | ||
| 121 | sdu_length: buf[83], | ||
| 122 | }) | ||
| 123 | } | ||
| 124 | } | ||
| 125 | 68 | ||
| 126 | /// MLME COMM STATUS Indication which is used by the MAC to indicate a communications status | 69 | /// MLME COMM STATUS Indication which is used by the MAC to indicate a communications status |
| 127 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 70 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -149,51 +92,7 @@ pub struct CommStatusIndication { | |||
| 149 | pub key_source: [u8; 8], | 92 | pub key_source: [u8; 8], |
| 150 | } | 93 | } |
| 151 | 94 | ||
| 152 | impl ParseableMacEvent for CommStatusIndication { | 95 | impl ParseableMacEvent for CommStatusIndication {} |
| 153 | const SIZE: usize = 32; | ||
| 154 | |||
| 155 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 156 | Self::validate(buf)?; | ||
| 157 | |||
| 158 | let src_addr_mode = AddressMode::try_from(buf[2])?; | ||
| 159 | let dst_addr_mode = AddressMode::try_from(buf[3])?; | ||
| 160 | |||
| 161 | let src_address = match src_addr_mode { | ||
| 162 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 163 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 164 | AddressMode::Short => MacAddress { | ||
| 165 | short: [buf[4], buf[5]], | ||
| 166 | }, | ||
| 167 | AddressMode::Extended => MacAddress { | ||
| 168 | extended: [buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]], | ||
| 169 | }, | ||
| 170 | }; | ||
| 171 | |||
| 172 | let dst_address = match dst_addr_mode { | ||
| 173 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 174 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 175 | AddressMode::Short => MacAddress { | ||
| 176 | short: [buf[12], buf[13]], | ||
| 177 | }, | ||
| 178 | AddressMode::Extended => MacAddress { | ||
| 179 | extended: [buf[12], buf[13], buf[14], buf[15], buf[16], buf[17], buf[18], buf[19]], | ||
| 180 | }, | ||
| 181 | }; | ||
| 182 | |||
| 183 | Ok(Self { | ||
| 184 | pan_id: PanId([buf[0], buf[1]]), | ||
| 185 | src_addr_mode, | ||
| 186 | dst_addr_mode, | ||
| 187 | src_address, | ||
| 188 | dst_address, | ||
| 189 | status: MacStatus::try_from(buf[20])?, | ||
| 190 | security_level: SecurityLevel::try_from(buf[21])?, | ||
| 191 | key_id_mode: KeyIdMode::try_from(buf[22])?, | ||
| 192 | key_index: buf[23], | ||
| 193 | key_source: [buf[24], buf[25], buf[26], buf[27], buf[28], buf[29], buf[30], buf[31]], | ||
| 194 | }) | ||
| 195 | } | ||
| 196 | } | ||
| 197 | 96 | ||
| 198 | /// MLME GTS Indication indicates that a GTS has been allocated or that a | 97 | /// MLME GTS Indication indicates that a GTS has been allocated or that a |
| 199 | /// previously allocated GTS has been deallocated | 98 | /// previously allocated GTS has been deallocated |
| @@ -209,27 +108,13 @@ pub struct GtsIndication { | |||
| 209 | pub key_id_mode: KeyIdMode, | 108 | pub key_id_mode: KeyIdMode, |
| 210 | /// Index of the key to be used | 109 | /// Index of the key to be used |
| 211 | pub key_index: u8, | 110 | pub key_index: u8, |
| 111 | /// byte stuffing to keep 32 bit alignment | ||
| 112 | a_stuffing: [u8; 2], | ||
| 212 | /// Originator of the key to be used | 113 | /// Originator of the key to be used |
| 213 | pub key_source: [u8; 8], | 114 | pub key_source: [u8; 8], |
| 214 | } | 115 | } |
| 215 | 116 | ||
| 216 | impl ParseableMacEvent for GtsIndication { | 117 | impl ParseableMacEvent for GtsIndication {} |
| 217 | const SIZE: usize = 16; | ||
| 218 | |||
| 219 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 220 | Self::validate(buf)?; | ||
| 221 | |||
| 222 | Ok(Self { | ||
| 223 | device_address: [buf[0], buf[1]], | ||
| 224 | gts_characteristics: buf[2], | ||
| 225 | security_level: SecurityLevel::try_from(buf[3])?, | ||
| 226 | key_id_mode: KeyIdMode::try_from(buf[4])?, | ||
| 227 | key_index: buf[5], | ||
| 228 | // 2 byte stuffing | ||
| 229 | key_source: [buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]], | ||
| 230 | }) | ||
| 231 | } | ||
| 232 | } | ||
| 233 | 118 | ||
| 234 | /// MLME ORPHAN Indication which is used by the coordinator to notify the | 119 | /// MLME ORPHAN Indication which is used by the coordinator to notify the |
| 235 | /// application of the presence of an orphaned device | 120 | /// application of the presence of an orphaned device |
| @@ -245,24 +130,11 @@ pub struct OrphanIndication { | |||
| 245 | pub key_id_mode: KeyIdMode, | 130 | pub key_id_mode: KeyIdMode, |
| 246 | /// Index of the key used by the originator of the received frame | 131 | /// Index of the key used by the originator of the received frame |
| 247 | pub key_index: u8, | 132 | pub key_index: u8, |
| 133 | /// byte stuffing to keep 32 bit alignment | ||
| 134 | a_stuffing: [u8; 1], | ||
| 248 | } | 135 | } |
| 249 | 136 | ||
| 250 | impl ParseableMacEvent for OrphanIndication { | 137 | impl ParseableMacEvent for OrphanIndication {} |
| 251 | const SIZE: usize = 20; | ||
| 252 | |||
| 253 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 254 | Self::validate(buf)?; | ||
| 255 | |||
| 256 | Ok(Self { | ||
| 257 | orphan_address: [buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]], | ||
| 258 | key_source: [buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]], | ||
| 259 | security_level: SecurityLevel::try_from(buf[16])?, | ||
| 260 | key_id_mode: KeyIdMode::try_from(buf[17])?, | ||
| 261 | key_index: buf[18], | ||
| 262 | // 1 byte stuffing | ||
| 263 | }) | ||
| 264 | } | ||
| 265 | } | ||
| 266 | 138 | ||
| 267 | /// MLME SYNC LOSS Indication which is used by the MAC to indicate the loss | 139 | /// MLME SYNC LOSS Indication which is used by the MAC to indicate the loss |
| 268 | /// of synchronization with the coordinator | 140 | /// of synchronization with the coordinator |
| @@ -286,42 +158,20 @@ pub struct SyncLossIndication { | |||
| 286 | pub key_source: [u8; 8], | 158 | pub key_source: [u8; 8], |
| 287 | } | 159 | } |
| 288 | 160 | ||
| 289 | impl ParseableMacEvent for SyncLossIndication { | 161 | impl ParseableMacEvent for SyncLossIndication {} |
| 290 | const SIZE: usize = 16; | ||
| 291 | |||
| 292 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 293 | Self::validate(buf)?; | ||
| 294 | |||
| 295 | Ok(Self { | ||
| 296 | pan_id: PanId([buf[0], buf[1]]), | ||
| 297 | loss_reason: buf[2], | ||
| 298 | channel_number: MacChannel::try_from(buf[3])?, | ||
| 299 | channel_page: buf[4], | ||
| 300 | security_level: SecurityLevel::try_from(buf[5])?, | ||
| 301 | key_id_mode: KeyIdMode::try_from(buf[6])?, | ||
| 302 | key_index: buf[7], | ||
| 303 | key_source: [buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]], | ||
| 304 | }) | ||
| 305 | } | ||
| 306 | } | ||
| 307 | 162 | ||
| 308 | /// MLME DPS Indication which indicates the expiration of the DPSIndexDuration | 163 | /// MLME DPS Indication which indicates the expiration of the DPSIndexDuration |
| 309 | /// and the resetting of the DPS values in the PHY | 164 | /// and the resetting of the DPS values in the PHY |
| 310 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 165 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 311 | pub struct DpsIndication; | 166 | pub struct DpsIndication { |
| 312 | 167 | /// byte stuffing to keep 32 bit alignment | |
| 313 | impl ParseableMacEvent for DpsIndication { | 168 | a_stuffing: [u8; 4], |
| 314 | const SIZE: usize = 4; | ||
| 315 | |||
| 316 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 317 | Self::validate(buf)?; | ||
| 318 | |||
| 319 | Ok(Self) | ||
| 320 | } | ||
| 321 | } | 169 | } |
| 322 | 170 | ||
| 171 | impl ParseableMacEvent for DpsIndication {} | ||
| 172 | |||
| 323 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 173 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 324 | #[repr(C, align(8))] | 174 | #[repr(C)] |
| 325 | pub struct DataIndication { | 175 | pub struct DataIndication { |
| 326 | /// Pointer to the set of octets forming the MSDU being indicated | 176 | /// Pointer to the set of octets forming the MSDU being indicated |
| 327 | pub msdu_ptr: *const u8, | 177 | pub msdu_ptr: *const u8, |
| @@ -373,65 +223,7 @@ pub struct DataIndication { | |||
| 373 | pub rssi: u8, | 223 | pub rssi: u8, |
| 374 | } | 224 | } |
| 375 | 225 | ||
| 376 | impl ParseableMacEvent for DataIndication { | 226 | impl ParseableMacEvent for DataIndication {} |
| 377 | const SIZE: usize = 68; | ||
| 378 | |||
| 379 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 380 | Self::validate(buf)?; | ||
| 381 | |||
| 382 | let src_addr_mode = AddressMode::try_from(buf[4])?; | ||
| 383 | let src_address = match src_addr_mode { | ||
| 384 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 385 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 386 | AddressMode::Short => MacAddress { | ||
| 387 | short: [buf[7], buf[8]], | ||
| 388 | }, | ||
| 389 | AddressMode::Extended => MacAddress { | ||
| 390 | extended: [buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14]], | ||
| 391 | }, | ||
| 392 | }; | ||
| 393 | |||
| 394 | let dst_addr_mode = AddressMode::try_from(buf[15])?; | ||
| 395 | let dst_address = match dst_addr_mode { | ||
| 396 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 397 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 398 | AddressMode::Short => MacAddress { | ||
| 399 | short: [buf[18], buf[19]], | ||
| 400 | }, | ||
| 401 | AddressMode::Extended => MacAddress { | ||
| 402 | extended: [buf[18], buf[19], buf[20], buf[21], buf[22], buf[23], buf[24], buf[25]], | ||
| 403 | }, | ||
| 404 | }; | ||
| 405 | |||
| 406 | Ok(Self { | ||
| 407 | msdu_ptr: u32::from_le_bytes(buf[0..4].try_into().unwrap()) as *const u8, | ||
| 408 | src_addr_mode, | ||
| 409 | src_pan_id: PanId([buf[5], buf[6]]), | ||
| 410 | src_address, | ||
| 411 | dst_addr_mode, | ||
| 412 | dst_pan_id: PanId([buf[16], buf[17]]), | ||
| 413 | dst_address, | ||
| 414 | msdu_length: buf[26], | ||
| 415 | mpdu_link_quality: buf[27], | ||
| 416 | dsn: buf[28], | ||
| 417 | time_stamp: [buf[29], buf[30], buf[31], buf[32]], | ||
| 418 | security_level: SecurityLevel::try_from(buf[33]).unwrap_or(SecurityLevel::Unsecure), // TODO: this is totaly wrong, but I'm too smol brain to fix it | ||
| 419 | key_id_mode: KeyIdMode::try_from(buf[34]).unwrap_or(KeyIdMode::Implicite), // TODO: this is totaly wrong, but I'm too smol brain to fix it | ||
| 420 | key_source: [buf[35], buf[36], buf[37], buf[38], buf[39], buf[40], buf[41], buf[42]], | ||
| 421 | key_index: buf[43], | ||
| 422 | uwbprf: buf[44], | ||
| 423 | uwn_preamble_symbol_repetitions: buf[45], | ||
| 424 | datrate: buf[46], | ||
| 425 | ranging_received: buf[47], | ||
| 426 | ranging_counter_start: u32::from_le_bytes(buf[48..52].try_into().unwrap()), | ||
| 427 | ranging_counter_stop: u32::from_le_bytes(buf[52..56].try_into().unwrap()), | ||
| 428 | ranging_tracking_interval: u32::from_le_bytes(buf[56..60].try_into().unwrap()), | ||
| 429 | ranging_offset: u32::from_le_bytes(buf[60..64].try_into().unwrap()), | ||
| 430 | ranging_fom: buf[65], | ||
| 431 | rssi: buf[66], | ||
| 432 | }) | ||
| 433 | } | ||
| 434 | } | ||
| 435 | 227 | ||
| 436 | /// MLME POLL Indication which will be used for indicating the Data Request | 228 | /// MLME POLL Indication which will be used for indicating the Data Request |
| 437 | /// reception to upper layer as defined in Zigbee r22 - D.8.2 | 229 | /// reception to upper layer as defined in Zigbee r22 - D.8.2 |
| @@ -443,27 +235,4 @@ pub struct PollIndication { | |||
| 443 | pub request_address: MacAddress, | 235 | pub request_address: MacAddress, |
| 444 | } | 236 | } |
| 445 | 237 | ||
| 446 | impl ParseableMacEvent for PollIndication { | 238 | impl ParseableMacEvent for PollIndication {} |
| 447 | const SIZE: usize = 9; | ||
| 448 | |||
| 449 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 450 | Self::validate(buf)?; | ||
| 451 | |||
| 452 | let addr_mode = AddressMode::try_from(buf[0])?; | ||
| 453 | let request_address = match addr_mode { | ||
| 454 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 455 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 456 | AddressMode::Short => MacAddress { | ||
| 457 | short: [buf[1], buf[2]], | ||
| 458 | }, | ||
| 459 | AddressMode::Extended => MacAddress { | ||
| 460 | extended: [buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8]], | ||
| 461 | }, | ||
| 462 | }; | ||
| 463 | |||
| 464 | Ok(Self { | ||
| 465 | addr_mode, | ||
| 466 | request_address, | ||
| 467 | }) | ||
| 468 | } | ||
| 469 | } | ||
diff --git a/embassy-stm32-wpan/src/mac/responses.rs b/embassy-stm32-wpan/src/mac/responses.rs index d29257f84..e0376a7f5 100644 --- a/embassy-stm32-wpan/src/mac/responses.rs +++ b/embassy-stm32-wpan/src/mac/responses.rs | |||
| @@ -21,24 +21,11 @@ pub struct AssociateConfirm { | |||
| 21 | pub key_id_mode: KeyIdMode, | 21 | pub key_id_mode: KeyIdMode, |
| 22 | /// the index of the key to be used | 22 | /// the index of the key to be used |
| 23 | pub key_index: u8, | 23 | pub key_index: u8, |
| 24 | /// byte stuffing to keep 32 bit alignment | ||
| 25 | a_stuffing: [u8; 2], | ||
| 24 | } | 26 | } |
| 25 | 27 | ||
| 26 | impl ParseableMacEvent for AssociateConfirm { | 28 | impl ParseableMacEvent for AssociateConfirm {} |
| 27 | const SIZE: usize = 16; | ||
| 28 | |||
| 29 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 30 | Self::validate(buf)?; | ||
| 31 | |||
| 32 | Ok(Self { | ||
| 33 | assoc_short_address: [buf[0], buf[1]], | ||
| 34 | status: AssociationStatus::try_from(buf[2])?, | ||
| 35 | security_level: SecurityLevel::try_from(buf[3])?, | ||
| 36 | key_source: [buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]], | ||
| 37 | key_id_mode: KeyIdMode::try_from(buf[12])?, | ||
| 38 | key_index: buf[13], | ||
| 39 | }) | ||
| 40 | } | ||
| 41 | } | ||
| 42 | 29 | ||
| 43 | /// MLME DISASSOCIATE Confirm used to send disassociation Confirmation to the application. | 30 | /// MLME DISASSOCIATE Confirm used to send disassociation Confirmation to the application. |
| 44 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 31 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -53,32 +40,7 @@ pub struct DisassociateConfirm { | |||
| 53 | pub device_address: MacAddress, | 40 | pub device_address: MacAddress, |
| 54 | } | 41 | } |
| 55 | 42 | ||
| 56 | impl ParseableMacEvent for DisassociateConfirm { | 43 | impl ParseableMacEvent for DisassociateConfirm {} |
| 57 | const SIZE: usize = 12; | ||
| 58 | |||
| 59 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 60 | Self::validate(buf)?; | ||
| 61 | |||
| 62 | let device_addr_mode = AddressMode::try_from(buf[1])?; | ||
| 63 | let device_address = match device_addr_mode { | ||
| 64 | AddressMode::NoAddress => MacAddress { short: [0, 0] }, | ||
| 65 | AddressMode::Reserved => MacAddress { short: [0, 0] }, | ||
| 66 | AddressMode::Short => MacAddress { | ||
| 67 | short: [buf[4], buf[5]], | ||
| 68 | }, | ||
| 69 | AddressMode::Extended => MacAddress { | ||
| 70 | extended: [buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]], | ||
| 71 | }, | ||
| 72 | }; | ||
| 73 | |||
| 74 | Ok(Self { | ||
| 75 | status: MacStatus::try_from(buf[0])?, | ||
| 76 | device_addr_mode, | ||
| 77 | device_pan_id: PanId([buf[2], buf[3]]), | ||
| 78 | device_address, | ||
| 79 | }) | ||
| 80 | } | ||
| 81 | } | ||
| 82 | 44 | ||
| 83 | /// MLME GET Confirm which requests information about a given PIB attribute | 45 | /// MLME GET Confirm which requests information about a given PIB attribute |
| 84 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 46 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -91,24 +53,11 @@ pub struct GetConfirm { | |||
| 91 | pub pib_attribute: PibId, | 53 | pub pib_attribute: PibId, |
| 92 | /// The lenght of the PIB attribute Value return | 54 | /// The lenght of the PIB attribute Value return |
| 93 | pub pib_attribute_value_len: u8, | 55 | pub pib_attribute_value_len: u8, |
| 56 | /// byte stuffing to keep 32 bit alignment | ||
| 57 | a_stuffing: [u8; 1], | ||
| 94 | } | 58 | } |
| 95 | 59 | ||
| 96 | impl ParseableMacEvent for GetConfirm { | 60 | impl ParseableMacEvent for GetConfirm {} |
| 97 | const SIZE: usize = 8; | ||
| 98 | |||
| 99 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 100 | Self::validate(buf)?; | ||
| 101 | |||
| 102 | let address = u32::from_le_bytes(buf[0..4].try_into().unwrap()); | ||
| 103 | |||
| 104 | Ok(Self { | ||
| 105 | pib_attribute_value_ptr: address as *const u8, | ||
| 106 | status: MacStatus::try_from(buf[4])?, | ||
| 107 | pib_attribute: PibId::try_from(buf[5])?, | ||
| 108 | pib_attribute_value_len: buf[6], | ||
| 109 | }) | ||
| 110 | } | ||
| 111 | } | ||
| 112 | 61 | ||
| 113 | /// MLME GTS Confirm which eports the results of a request to allocate a new GTS | 62 | /// MLME GTS Confirm which eports the results of a request to allocate a new GTS |
| 114 | /// or to deallocate an existing GTS | 63 | /// or to deallocate an existing GTS |
| @@ -118,39 +67,22 @@ pub struct GtsConfirm { | |||
| 118 | pub gts_characteristics: u8, | 67 | pub gts_characteristics: u8, |
| 119 | /// The status of the GTS reques | 68 | /// The status of the GTS reques |
| 120 | pub status: MacStatus, | 69 | pub status: MacStatus, |
| 70 | /// byte stuffing to keep 32 bit alignment | ||
| 71 | a_stuffing: [u8; 2], | ||
| 121 | } | 72 | } |
| 122 | 73 | ||
| 123 | impl ParseableMacEvent for GtsConfirm { | 74 | impl ParseableMacEvent for GtsConfirm {} |
| 124 | const SIZE: usize = 4; | ||
| 125 | |||
| 126 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 127 | Self::validate(buf)?; | ||
| 128 | |||
| 129 | Ok(Self { | ||
| 130 | gts_characteristics: buf[0], | ||
| 131 | status: MacStatus::try_from(buf[1])?, | ||
| 132 | }) | ||
| 133 | } | ||
| 134 | } | ||
| 135 | 75 | ||
| 136 | /// MLME RESET Confirm which is used to report the results of the reset operation | 76 | /// MLME RESET Confirm which is used to report the results of the reset operation |
| 137 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 77 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 138 | pub struct ResetConfirm { | 78 | pub struct ResetConfirm { |
| 139 | /// The result of the reset operation | 79 | /// The result of the reset operation |
| 140 | status: MacStatus, | 80 | status: MacStatus, |
| 81 | /// byte stuffing to keep 32 bit alignment | ||
| 82 | a_stuffing: [u8; 3], | ||
| 141 | } | 83 | } |
| 142 | 84 | ||
| 143 | impl ParseableMacEvent for ResetConfirm { | 85 | impl ParseableMacEvent for ResetConfirm {} |
| 144 | const SIZE: usize = 4; | ||
| 145 | |||
| 146 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 147 | Self::validate(buf)?; | ||
| 148 | |||
| 149 | Ok(Self { | ||
| 150 | status: MacStatus::try_from(buf[0])?, | ||
| 151 | }) | ||
| 152 | } | ||
| 153 | } | ||
| 154 | 86 | ||
| 155 | /// MLME RX ENABLE Confirm which is used to report the results of the attempt | 87 | /// MLME RX ENABLE Confirm which is used to report the results of the attempt |
| 156 | /// to enable or disable the receiver | 88 | /// to enable or disable the receiver |
| @@ -158,19 +90,11 @@ impl ParseableMacEvent for ResetConfirm { | |||
| 158 | pub struct RxEnableConfirm { | 90 | pub struct RxEnableConfirm { |
| 159 | /// Result of the request to enable or disable the receiver | 91 | /// Result of the request to enable or disable the receiver |
| 160 | status: MacStatus, | 92 | status: MacStatus, |
| 93 | /// byte stuffing to keep 32 bit alignment | ||
| 94 | a_stuffing: [u8; 3], | ||
| 161 | } | 95 | } |
| 162 | 96 | ||
| 163 | impl ParseableMacEvent for RxEnableConfirm { | 97 | impl ParseableMacEvent for RxEnableConfirm {} |
| 164 | const SIZE: usize = 4; | ||
| 165 | |||
| 166 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 167 | Self::validate(buf)?; | ||
| 168 | |||
| 169 | Ok(Self { | ||
| 170 | status: MacStatus::try_from(buf[0])?, | ||
| 171 | }) | ||
| 172 | } | ||
| 173 | } | ||
| 174 | 98 | ||
| 175 | /// MLME SCAN Confirm which is used to report the result of the channel scan request | 99 | /// MLME SCAN Confirm which is used to report the result of the channel scan request |
| 176 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 100 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -195,42 +119,7 @@ pub struct ScanConfirm { | |||
| 195 | pub uwb_energy_detect_list: [u8; MAX_ED_SCAN_RESULTS_SUPPORTED], | 119 | pub uwb_energy_detect_list: [u8; MAX_ED_SCAN_RESULTS_SUPPORTED], |
| 196 | } | 120 | } |
| 197 | 121 | ||
| 198 | impl ParseableMacEvent for ScanConfirm { | 122 | impl ParseableMacEvent for ScanConfirm {} |
| 199 | const SIZE: usize = 185; | ||
| 200 | |||
| 201 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 202 | // TODO: this is unchecked | ||
| 203 | |||
| 204 | Self::validate(buf)?; | ||
| 205 | |||
| 206 | let mut energy_detect_list = [0; MAX_ED_SCAN_RESULTS_SUPPORTED]; | ||
| 207 | energy_detect_list.copy_from_slice(&buf[8..24]); | ||
| 208 | |||
| 209 | let pan_descriptor_list = [ | ||
| 210 | PanDescriptor::try_from(&buf[24..46])?, | ||
| 211 | PanDescriptor::try_from(&buf[46..68])?, | ||
| 212 | PanDescriptor::try_from(&buf[68..90])?, | ||
| 213 | PanDescriptor::try_from(&buf[90..102])?, | ||
| 214 | PanDescriptor::try_from(&buf[102..124])?, | ||
| 215 | PanDescriptor::try_from(&buf[124..146])?, | ||
| 216 | ]; | ||
| 217 | |||
| 218 | let mut uwb_energy_detect_list = [0; MAX_ED_SCAN_RESULTS_SUPPORTED]; | ||
| 219 | uwb_energy_detect_list.copy_from_slice(&buf[147..163]); | ||
| 220 | |||
| 221 | Ok(Self { | ||
| 222 | status: MacStatus::try_from(buf[0])?, | ||
| 223 | scan_type: ScanType::try_from(buf[1])?, | ||
| 224 | channel_page: buf[2], | ||
| 225 | unscanned_channels: [buf[3], buf[4], buf[5], buf[6]], | ||
| 226 | result_list_size: buf[7], | ||
| 227 | energy_detect_list, | ||
| 228 | pan_descriptor_list, | ||
| 229 | detected_category: buf[146], | ||
| 230 | uwb_energy_detect_list, | ||
| 231 | }) | ||
| 232 | } | ||
| 233 | } | ||
| 234 | 123 | ||
| 235 | /// MLME SET Confirm which reports the result of an attempt to write a value to a PIB attribute | 124 | /// MLME SET Confirm which reports the result of an attempt to write a value to a PIB attribute |
| 236 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 125 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| @@ -239,20 +128,11 @@ pub struct SetConfirm { | |||
| 239 | pub status: MacStatus, | 128 | pub status: MacStatus, |
| 240 | /// The name of the PIB attribute that was written | 129 | /// The name of the PIB attribute that was written |
| 241 | pub pin_attribute: PibId, | 130 | pub pin_attribute: PibId, |
| 131 | /// byte stuffing to keep 32 bit alignment | ||
| 132 | a_stuffing: [u8; 2], | ||
| 242 | } | 133 | } |
| 243 | 134 | ||
| 244 | impl ParseableMacEvent for SetConfirm { | 135 | impl ParseableMacEvent for SetConfirm {} |
| 245 | const SIZE: usize = 4; | ||
| 246 | |||
| 247 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 248 | Self::validate(buf)?; | ||
| 249 | |||
| 250 | Ok(Self { | ||
| 251 | status: MacStatus::try_from(buf[0])?, | ||
| 252 | pin_attribute: PibId::try_from(buf[1])?, | ||
| 253 | }) | ||
| 254 | } | ||
| 255 | } | ||
| 256 | 136 | ||
| 257 | /// MLME START Confirm which is used to report the results of the attempt to | 137 | /// MLME START Confirm which is used to report the results of the attempt to |
| 258 | /// start using a new superframe configuration | 138 | /// start using a new superframe configuration |
| @@ -260,57 +140,33 @@ impl ParseableMacEvent for SetConfirm { | |||
| 260 | pub struct StartConfirm { | 140 | pub struct StartConfirm { |
| 261 | /// Result of the attempt to start using an updated superframe configuration | 141 | /// Result of the attempt to start using an updated superframe configuration |
| 262 | pub status: MacStatus, | 142 | pub status: MacStatus, |
| 143 | /// byte stuffing to keep 32 bit alignment | ||
| 144 | a_stuffing: [u8; 3], | ||
| 263 | } | 145 | } |
| 264 | 146 | ||
| 265 | impl ParseableMacEvent for StartConfirm { | 147 | impl ParseableMacEvent for StartConfirm {} |
| 266 | const SIZE: usize = 4; | ||
| 267 | |||
| 268 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 269 | Self::validate(buf)?; | ||
| 270 | |||
| 271 | Ok(Self { | ||
| 272 | status: MacStatus::try_from(buf[0])?, | ||
| 273 | }) | ||
| 274 | } | ||
| 275 | } | ||
| 276 | 148 | ||
| 277 | /// MLME POLL Confirm which is used to report the result of a request to poll the coordinator for data | 149 | /// MLME POLL Confirm which is used to report the result of a request to poll the coordinator for data |
| 278 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 150 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 279 | pub struct PollConfirm { | 151 | pub struct PollConfirm { |
| 280 | /// The status of the data request | 152 | /// The status of the data request |
| 281 | pub status: MacStatus, | 153 | pub status: MacStatus, |
| 154 | /// byte stuffing to keep 32 bit alignment | ||
| 155 | a_stuffing: [u8; 3], | ||
| 282 | } | 156 | } |
| 283 | 157 | ||
| 284 | impl ParseableMacEvent for PollConfirm { | 158 | impl ParseableMacEvent for PollConfirm {} |
| 285 | const SIZE: usize = 4; | ||
| 286 | |||
| 287 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 288 | Self::validate(buf)?; | ||
| 289 | |||
| 290 | Ok(Self { | ||
| 291 | status: MacStatus::try_from(buf[0])?, | ||
| 292 | }) | ||
| 293 | } | ||
| 294 | } | ||
| 295 | 159 | ||
| 296 | /// MLME DPS Confirm which reports the results of the attempt to enable or disable the DPS | 160 | /// MLME DPS Confirm which reports the results of the attempt to enable or disable the DPS |
| 297 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 161 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 298 | pub struct DpsConfirm { | 162 | pub struct DpsConfirm { |
| 299 | /// The status of the DPS request | 163 | /// The status of the DPS request |
| 300 | pub status: MacStatus, | 164 | pub status: MacStatus, |
| 165 | /// byte stuffing to keep 32 bit alignment | ||
| 166 | a_stuffing: [u8; 3], | ||
| 301 | } | 167 | } |
| 302 | 168 | ||
| 303 | impl ParseableMacEvent for DpsConfirm { | 169 | impl ParseableMacEvent for DpsConfirm {} |
| 304 | const SIZE: usize = 4; | ||
| 305 | |||
| 306 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 307 | Self::validate(buf)?; | ||
| 308 | |||
| 309 | Ok(Self { | ||
| 310 | status: MacStatus::try_from(buf[0])?, | ||
| 311 | }) | ||
| 312 | } | ||
| 313 | } | ||
| 314 | 170 | ||
| 315 | /// MLME SOUNDING Confirm which reports the result of a request to the PHY to provide | 171 | /// MLME SOUNDING Confirm which reports the result of a request to the PHY to provide |
| 316 | /// channel sounding information | 172 | /// channel sounding information |
| @@ -318,27 +174,20 @@ impl ParseableMacEvent for DpsConfirm { | |||
| 318 | pub struct SoundingConfirm { | 174 | pub struct SoundingConfirm { |
| 319 | /// Results of the sounding measurement | 175 | /// Results of the sounding measurement |
| 320 | sounding_list: [u8; MAX_SOUNDING_LIST_SUPPORTED], | 176 | sounding_list: [u8; MAX_SOUNDING_LIST_SUPPORTED], |
| 321 | } | ||
| 322 | 177 | ||
| 323 | impl ParseableMacEvent for SoundingConfirm { | 178 | status: u8, |
| 324 | const SIZE: usize = 1; | ||
| 325 | |||
| 326 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 327 | Self::validate(buf)?; | ||
| 328 | |||
| 329 | let mut sounding_list = [0u8; MAX_SOUNDING_LIST_SUPPORTED]; | ||
| 330 | sounding_list[..buf.len()].copy_from_slice(buf); | ||
| 331 | |||
| 332 | Ok(Self { sounding_list }) | ||
| 333 | } | ||
| 334 | } | 179 | } |
| 335 | 180 | ||
| 181 | impl ParseableMacEvent for SoundingConfirm {} | ||
| 182 | |||
| 336 | /// MLME CALIBRATE Confirm which reports the result of a request to the PHY | 183 | /// MLME CALIBRATE Confirm which reports the result of a request to the PHY |
| 337 | /// to provide internal propagation path information | 184 | /// to provide internal propagation path information |
| 338 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] | 185 | #[cfg_attr(feature = "defmt", derive(defmt::Format))] |
| 339 | pub struct CalibrateConfirm { | 186 | pub struct CalibrateConfirm { |
| 340 | /// The status of the attempt to return sounding data | 187 | /// The status of the attempt to return sounding data |
| 341 | pub status: MacStatus, | 188 | pub status: MacStatus, |
| 189 | /// byte stuffing to keep 32 bit alignment | ||
| 190 | a_stuffing: [u8; 3], | ||
| 342 | /// A count of the propagation time from the ranging counter | 191 | /// A count of the propagation time from the ranging counter |
| 343 | /// to the transmit antenna | 192 | /// to the transmit antenna |
| 344 | pub cal_tx_rmaker_offset: u32, | 193 | pub cal_tx_rmaker_offset: u32, |
| @@ -347,20 +196,7 @@ pub struct CalibrateConfirm { | |||
| 347 | pub cal_rx_rmaker_offset: u32, | 196 | pub cal_rx_rmaker_offset: u32, |
| 348 | } | 197 | } |
| 349 | 198 | ||
| 350 | impl ParseableMacEvent for CalibrateConfirm { | 199 | impl ParseableMacEvent for CalibrateConfirm {} |
| 351 | const SIZE: usize = 12; | ||
| 352 | |||
| 353 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 354 | Self::validate(buf)?; | ||
| 355 | |||
| 356 | Ok(Self { | ||
| 357 | status: MacStatus::try_from(buf[0])?, | ||
| 358 | // 3 byte stuffing | ||
| 359 | cal_tx_rmaker_offset: u32::from_le_bytes(buf[4..8].try_into().unwrap()), | ||
| 360 | cal_rx_rmaker_offset: u32::from_le_bytes(buf[8..12].try_into().unwrap()), | ||
| 361 | }) | ||
| 362 | } | ||
| 363 | } | ||
| 364 | 200 | ||
| 365 | /// MCPS DATA Confirm which will be used for reporting the results of | 201 | /// MCPS DATA Confirm which will be used for reporting the results of |
| 366 | /// MAC data related requests from the application | 202 | /// MAC data related requests from the application |
| @@ -386,27 +222,11 @@ pub struct DataConfirm { | |||
| 386 | pub ranging_offset: u32, | 222 | pub ranging_offset: u32, |
| 387 | /// The FoM characterizing the ranging measurement | 223 | /// The FoM characterizing the ranging measurement |
| 388 | pub ranging_fom: u8, | 224 | pub ranging_fom: u8, |
| 225 | /// byte stuffing to keep 32 bit alignment | ||
| 226 | a_stuffing: [u8; 3], | ||
| 389 | } | 227 | } |
| 390 | 228 | ||
| 391 | impl ParseableMacEvent for DataConfirm { | 229 | impl ParseableMacEvent for DataConfirm {} |
| 392 | const SIZE: usize = 28; | ||
| 393 | |||
| 394 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 395 | Self::validate(buf)?; | ||
| 396 | |||
| 397 | Ok(Self { | ||
| 398 | msdu_handle: buf[0], | ||
| 399 | time_stamp: [buf[1], buf[2], buf[3], buf[4]], | ||
| 400 | ranging_received: buf[5], | ||
| 401 | status: MacStatus::try_from(buf[6])?, | ||
| 402 | ranging_counter_start: u32::from_le_bytes(buf[7..11].try_into().unwrap()), | ||
| 403 | ranging_counter_stop: u32::from_le_bytes(buf[11..15].try_into().unwrap()), | ||
| 404 | ranging_tracking_interval: u32::from_le_bytes(buf[15..19].try_into().unwrap()), | ||
| 405 | ranging_offset: u32::from_le_bytes(buf[19..23].try_into().unwrap()), | ||
| 406 | ranging_fom: buf[24], | ||
| 407 | }) | ||
| 408 | } | ||
| 409 | } | ||
| 410 | 230 | ||
| 411 | /// MCPS PURGE Confirm which will be used by the MAC to notify the application of | 231 | /// MCPS PURGE Confirm which will be used by the MAC to notify the application of |
| 412 | /// the status of its request to purge an MSDU from the transaction queue | 232 | /// the status of its request to purge an MSDU from the transaction queue |
| @@ -416,17 +236,8 @@ pub struct PurgeConfirm { | |||
| 416 | pub msdu_handle: u8, | 236 | pub msdu_handle: u8, |
| 417 | /// The status of the request | 237 | /// The status of the request |
| 418 | pub status: MacStatus, | 238 | pub status: MacStatus, |
| 239 | /// byte stuffing to keep 32 bit alignment | ||
| 240 | a_stuffing: [u8; 2], | ||
| 419 | } | 241 | } |
| 420 | 242 | ||
| 421 | impl ParseableMacEvent for PurgeConfirm { | 243 | impl ParseableMacEvent for PurgeConfirm {} |
| 422 | const SIZE: usize = 4; | ||
| 423 | |||
| 424 | fn try_parse(buf: &[u8]) -> Result<Self, ()> { | ||
| 425 | Self::validate(buf)?; | ||
| 426 | |||
| 427 | Ok(Self { | ||
| 428 | msdu_handle: buf[0], | ||
| 429 | status: MacStatus::try_from(buf[1])?, | ||
| 430 | }) | ||
| 431 | } | ||
| 432 | } | ||
diff --git a/embassy-stm32-wpan/src/sub/mac.rs b/embassy-stm32-wpan/src/sub/mac.rs index d30ed2f11..d9bf4c909 100644 --- a/embassy-stm32-wpan/src/sub/mac.rs +++ b/embassy-stm32-wpan/src/sub/mac.rs | |||
| @@ -12,7 +12,7 @@ use crate::cmd::CmdPacket; | |||
| 12 | use crate::consts::TlPacketType; | 12 | use crate::consts::TlPacketType; |
| 13 | use crate::evt::{EvtBox, EvtPacket}; | 13 | use crate::evt::{EvtBox, EvtPacket}; |
| 14 | use crate::mac::commands::MacCommand; | 14 | use crate::mac::commands::MacCommand; |
| 15 | use crate::mac::event::MacEvent; | 15 | use crate::mac::event::Event; |
| 16 | use crate::mac::typedefs::MacError; | 16 | use crate::mac::typedefs::MacError; |
| 17 | use crate::tables::{MAC_802_15_4_CMD_BUFFER, MAC_802_15_4_NOTIF_RSP_EVT_BUFFER}; | 17 | use crate::tables::{MAC_802_15_4_CMD_BUFFER, MAC_802_15_4_NOTIF_RSP_EVT_BUFFER}; |
| 18 | use crate::{channels, evt}; | 18 | use crate::{channels, evt}; |
| @@ -94,11 +94,8 @@ impl Mac { | |||
| 94 | } | 94 | } |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | pub async fn read(&self) -> Result<MacEvent, ()> { | 97 | pub async fn read(&self) -> Event { |
| 98 | let evt_box = self.tl_read().await; | 98 | Event::new(self.tl_read().await) |
| 99 | let payload = evt_box.payload(); | ||
| 100 | |||
| 101 | MacEvent::try_from(payload) | ||
| 102 | } | 99 | } |
| 103 | } | 100 | } |
| 104 | 101 | ||
diff --git a/examples/stm32wb/src/bin/mac_ffd.rs b/examples/stm32wb/src/bin/mac_ffd.rs index f8c8ba288..86413ea0f 100644 --- a/examples/stm32wb/src/bin/mac_ffd.rs +++ b/examples/stm32wb/src/bin/mac_ffd.rs | |||
| @@ -73,8 +73,10 @@ async fn main(spawner: Spawner) { | |||
| 73 | }) | 73 | }) |
| 74 | .await | 74 | .await |
| 75 | .unwrap(); | 75 | .unwrap(); |
| 76 | let evt = mbox.mac_subsystem.read().await; | 76 | { |
| 77 | defmt::info!("{:#x}", evt); | 77 | let evt = mbox.mac_subsystem.read().await; |
| 78 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 79 | } | ||
| 78 | 80 | ||
| 79 | info!("setting extended address"); | 81 | info!("setting extended address"); |
| 80 | let extended_address: u64 = 0xACDE480000000001; | 82 | let extended_address: u64 = 0xACDE480000000001; |
| @@ -85,8 +87,10 @@ async fn main(spawner: Spawner) { | |||
| 85 | }) | 87 | }) |
| 86 | .await | 88 | .await |
| 87 | .unwrap(); | 89 | .unwrap(); |
| 88 | let evt = mbox.mac_subsystem.read().await; | 90 | { |
| 89 | defmt::info!("{:#x}", evt); | 91 | let evt = mbox.mac_subsystem.read().await; |
| 92 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 93 | } | ||
| 90 | 94 | ||
| 91 | info!("setting short address"); | 95 | info!("setting short address"); |
| 92 | let short_address: u16 = 0x1122; | 96 | let short_address: u16 = 0x1122; |
| @@ -97,8 +101,10 @@ async fn main(spawner: Spawner) { | |||
| 97 | }) | 101 | }) |
| 98 | .await | 102 | .await |
| 99 | .unwrap(); | 103 | .unwrap(); |
| 100 | let evt = mbox.mac_subsystem.read().await; | 104 | { |
| 101 | defmt::info!("{:#x}", evt); | 105 | let evt = mbox.mac_subsystem.read().await; |
| 106 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 107 | } | ||
| 102 | 108 | ||
| 103 | info!("setting association permit"); | 109 | info!("setting association permit"); |
| 104 | let association_permit: bool = true; | 110 | let association_permit: bool = true; |
| @@ -109,8 +115,10 @@ async fn main(spawner: Spawner) { | |||
| 109 | }) | 115 | }) |
| 110 | .await | 116 | .await |
| 111 | .unwrap(); | 117 | .unwrap(); |
| 112 | let evt = mbox.mac_subsystem.read().await; | 118 | { |
| 113 | defmt::info!("{:#x}", evt); | 119 | let evt = mbox.mac_subsystem.read().await; |
| 120 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 121 | } | ||
| 114 | 122 | ||
| 115 | info!("setting TX power"); | 123 | info!("setting TX power"); |
| 116 | let transmit_power: i8 = 2; | 124 | let transmit_power: i8 = 2; |
| @@ -121,8 +129,10 @@ async fn main(spawner: Spawner) { | |||
| 121 | }) | 129 | }) |
| 122 | .await | 130 | .await |
| 123 | .unwrap(); | 131 | .unwrap(); |
| 124 | let evt = mbox.mac_subsystem.read().await; | 132 | { |
| 125 | defmt::info!("{:#x}", evt); | 133 | let evt = mbox.mac_subsystem.read().await; |
| 134 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 135 | } | ||
| 126 | 136 | ||
| 127 | info!("starting FFD device"); | 137 | info!("starting FFD device"); |
| 128 | mbox.mac_subsystem | 138 | mbox.mac_subsystem |
| @@ -137,8 +147,10 @@ async fn main(spawner: Spawner) { | |||
| 137 | }) | 147 | }) |
| 138 | .await | 148 | .await |
| 139 | .unwrap(); | 149 | .unwrap(); |
| 140 | let evt = mbox.mac_subsystem.read().await; | 150 | { |
| 141 | defmt::info!("{:#x}", evt); | 151 | let evt = mbox.mac_subsystem.read().await; |
| 152 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 153 | } | ||
| 142 | 154 | ||
| 143 | info!("setting RX on when idle"); | 155 | info!("setting RX on when idle"); |
| 144 | let rx_on_while_idle: bool = true; | 156 | let rx_on_while_idle: bool = true; |
| @@ -149,14 +161,16 @@ async fn main(spawner: Spawner) { | |||
| 149 | }) | 161 | }) |
| 150 | .await | 162 | .await |
| 151 | .unwrap(); | 163 | .unwrap(); |
| 152 | let evt = mbox.mac_subsystem.read().await; | 164 | { |
| 153 | defmt::info!("{:#x}", evt); | 165 | let evt = mbox.mac_subsystem.read().await; |
| 166 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 167 | } | ||
| 154 | 168 | ||
| 155 | loop { | 169 | loop { |
| 156 | let evt = mbox.mac_subsystem.read().await; | 170 | let evt = mbox.mac_subsystem.read().await; |
| 157 | defmt::info!("{:#x}", evt); | 171 | defmt::info!("{:#x}", evt.mac_event()); |
| 158 | 172 | ||
| 159 | if let Ok(evt) = evt { | 173 | if let Ok(evt) = evt.mac_event() { |
| 160 | match evt { | 174 | match evt { |
| 161 | MacEvent::MlmeAssociateInd(association) => mbox | 175 | MacEvent::MlmeAssociateInd(association) => mbox |
| 162 | .mac_subsystem | 176 | .mac_subsystem |
diff --git a/examples/stm32wb/src/bin/mac_rfd.rs b/examples/stm32wb/src/bin/mac_rfd.rs index b0eb91061..7cb401d89 100644 --- a/examples/stm32wb/src/bin/mac_rfd.rs +++ b/examples/stm32wb/src/bin/mac_rfd.rs | |||
| @@ -75,8 +75,10 @@ async fn main(spawner: Spawner) { | |||
| 75 | }) | 75 | }) |
| 76 | .await | 76 | .await |
| 77 | .unwrap(); | 77 | .unwrap(); |
| 78 | let evt = mbox.mac_subsystem.read().await; | 78 | { |
| 79 | info!("{:#x}", evt); | 79 | let evt = mbox.mac_subsystem.read().await; |
| 80 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 81 | } | ||
| 80 | 82 | ||
| 81 | info!("setting extended address"); | 83 | info!("setting extended address"); |
| 82 | let extended_address: u64 = 0xACDE480000000002; | 84 | let extended_address: u64 = 0xACDE480000000002; |
| @@ -87,8 +89,10 @@ async fn main(spawner: Spawner) { | |||
| 87 | }) | 89 | }) |
| 88 | .await | 90 | .await |
| 89 | .unwrap(); | 91 | .unwrap(); |
| 90 | let evt = mbox.mac_subsystem.read().await; | 92 | { |
| 91 | info!("{:#x}", evt); | 93 | let evt = mbox.mac_subsystem.read().await; |
| 94 | defmt::info!("{:#x}", evt.mac_event()); | ||
| 95 | } | ||
| 92 | 96 | ||
| 93 | info!("getting extended address"); | 97 | info!("getting extended address"); |
| 94 | mbox.mac_subsystem | 98 | mbox.mac_subsystem |
| @@ -98,14 +102,17 @@ async fn main(spawner: Spawner) { | |||
| 98 | }) | 102 | }) |
| 99 | .await | 103 | .await |
| 100 | .unwrap(); | 104 | .unwrap(); |
| 101 | let evt = mbox.mac_subsystem.read().await; | ||
| 102 | info!("{:#x}", evt); | ||
| 103 | 105 | ||
| 104 | if let Ok(MacEvent::MlmeGetCnf(evt)) = evt { | 106 | { |
| 105 | if evt.pib_attribute_value_len == 8 { | 107 | let evt = mbox.mac_subsystem.read().await; |
| 106 | let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) }; | 108 | info!("{:#x}", evt.mac_event()); |
| 109 | |||
| 110 | if let Ok(MacEvent::MlmeGetCnf(evt)) = evt.mac_event() { | ||
| 111 | if evt.pib_attribute_value_len == 8 { | ||
| 112 | let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) }; | ||
| 107 | 113 | ||
| 108 | info!("value {:#x}", value) | 114 | info!("value {:#x}", value) |
| 115 | } | ||
| 109 | } | 116 | } |
| 110 | } | 117 | } |
| 111 | 118 | ||
| @@ -124,13 +131,15 @@ async fn main(spawner: Spawner) { | |||
| 124 | }; | 131 | }; |
| 125 | info!("{}", a); | 132 | info!("{}", a); |
| 126 | mbox.mac_subsystem.send_command(&a).await.unwrap(); | 133 | mbox.mac_subsystem.send_command(&a).await.unwrap(); |
| 127 | let evt = mbox.mac_subsystem.read().await; | 134 | let short_addr = { |
| 128 | info!("{:#x}", evt); | 135 | let evt = mbox.mac_subsystem.read().await; |
| 136 | info!("{:#x}", evt.mac_event()); | ||
| 129 | 137 | ||
| 130 | let short_addr = if let Ok(MacEvent::MlmeAssociateCnf(conf)) = evt { | 138 | if let Ok(MacEvent::MlmeAssociateCnf(conf)) = evt.mac_event() { |
| 131 | conf.assoc_short_address | 139 | conf.assoc_short_address |
| 132 | } else { | 140 | } else { |
| 133 | defmt::panic!() | 141 | defmt::panic!() |
| 142 | } | ||
| 134 | }; | 143 | }; |
| 135 | 144 | ||
| 136 | info!("setting short address"); | 145 | info!("setting short address"); |
| @@ -141,8 +150,10 @@ async fn main(spawner: Spawner) { | |||
| 141 | }) | 150 | }) |
| 142 | .await | 151 | .await |
| 143 | .unwrap(); | 152 | .unwrap(); |
| 144 | let evt = mbox.mac_subsystem.read().await; | 153 | { |
| 145 | info!("{:#x}", evt); | 154 | let evt = mbox.mac_subsystem.read().await; |
| 155 | info!("{:#x}", evt.mac_event()); | ||
| 156 | } | ||
| 146 | 157 | ||
| 147 | info!("sending data"); | 158 | info!("sending data"); |
| 148 | let data = b"Hello from embassy!"; | 159 | let data = b"Hello from embassy!"; |
| @@ -163,11 +174,13 @@ async fn main(spawner: Spawner) { | |||
| 163 | ) | 174 | ) |
| 164 | .await | 175 | .await |
| 165 | .unwrap(); | 176 | .unwrap(); |
| 166 | let evt = mbox.mac_subsystem.read().await; | 177 | { |
| 167 | info!("{:#x}", evt); | 178 | let evt = mbox.mac_subsystem.read().await; |
| 179 | info!("{:#x}", evt.mac_event()); | ||
| 180 | } | ||
| 168 | 181 | ||
| 169 | loop { | 182 | loop { |
| 170 | let evt = mbox.mac_subsystem.read().await; | 183 | let evt = mbox.mac_subsystem.read().await; |
| 171 | info!("{:#x}", evt); | 184 | info!("{:#x}", evt.mac_event()); |
| 172 | } | 185 | } |
| 173 | } | 186 | } |
diff --git a/tests/stm32/src/bin/wpan_mac.rs b/tests/stm32/src/bin/wpan_mac.rs index 2fc15dc9d..d64a5ef81 100644 --- a/tests/stm32/src/bin/wpan_mac.rs +++ b/tests/stm32/src/bin/wpan_mac.rs | |||
| @@ -55,8 +55,10 @@ async fn main(spawner: Spawner) { | |||
| 55 | }) | 55 | }) |
| 56 | .await | 56 | .await |
| 57 | .unwrap(); | 57 | .unwrap(); |
| 58 | let evt = mbox.mac_subsystem.read().await; | 58 | { |
| 59 | info!("{:#x}", evt); | 59 | let evt = mbox.mac_subsystem.read().await; |
| 60 | info!("{:#x}", evt.mac_event()); | ||
| 61 | } | ||
| 60 | 62 | ||
| 61 | info!("setting extended address"); | 63 | info!("setting extended address"); |
| 62 | let extended_address: u64 = 0xACDE480000000002; | 64 | let extended_address: u64 = 0xACDE480000000002; |
| @@ -67,8 +69,10 @@ async fn main(spawner: Spawner) { | |||
| 67 | }) | 69 | }) |
| 68 | .await | 70 | .await |
| 69 | .unwrap(); | 71 | .unwrap(); |
| 70 | let evt = mbox.mac_subsystem.read().await; | 72 | { |
| 71 | info!("{:#x}", evt); | 73 | let evt = mbox.mac_subsystem.read().await; |
| 74 | info!("{:#x}", evt.mac_event()); | ||
| 75 | } | ||
| 72 | 76 | ||
| 73 | info!("getting extended address"); | 77 | info!("getting extended address"); |
| 74 | mbox.mac_subsystem | 78 | mbox.mac_subsystem |
| @@ -78,14 +82,16 @@ async fn main(spawner: Spawner) { | |||
| 78 | }) | 82 | }) |
| 79 | .await | 83 | .await |
| 80 | .unwrap(); | 84 | .unwrap(); |
| 81 | let evt = mbox.mac_subsystem.read().await; | 85 | { |
| 82 | info!("{:#x}", evt); | 86 | let evt = mbox.mac_subsystem.read().await; |
| 87 | info!("{:#x}", evt.mac_event()); | ||
| 83 | 88 | ||
| 84 | if let Ok(MacEvent::MlmeGetCnf(evt)) = evt { | 89 | if let Ok(MacEvent::MlmeGetCnf(evt)) = evt.mac_event() { |
| 85 | if evt.pib_attribute_value_len == 8 { | 90 | if evt.pib_attribute_value_len == 8 { |
| 86 | let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) }; | 91 | let value = unsafe { core::ptr::read_unaligned(evt.pib_attribute_value_ptr as *const u64) }; |
| 87 | 92 | ||
| 88 | info!("value {:#x}", value) | 93 | info!("value {:#x}", value) |
| 94 | } | ||
| 89 | } | 95 | } |
| 90 | } | 96 | } |
| 91 | 97 | ||
| @@ -104,8 +110,10 @@ async fn main(spawner: Spawner) { | |||
| 104 | }; | 110 | }; |
| 105 | info!("{}", a); | 111 | info!("{}", a); |
| 106 | mbox.mac_subsystem.send_command(&a).await.unwrap(); | 112 | mbox.mac_subsystem.send_command(&a).await.unwrap(); |
| 107 | let evt = mbox.mac_subsystem.read().await; | 113 | { |
| 108 | info!("{:#x}", evt); | 114 | let evt = mbox.mac_subsystem.read().await; |
| 115 | info!("{:#x}", evt.mac_event()); | ||
| 116 | } | ||
| 109 | 117 | ||
| 110 | info!("Test OK"); | 118 | info!("Test OK"); |
| 111 | cortex_m::asm::bkpt(); | 119 | cortex_m::asm::bkpt(); |
