bool wpan_mcps_data_req(uint8_t SrcAddrMode, wpan_addr_spec_t *DstAddrSpec, uint8_t msduLength, uint8_t *msdu, uint8_t msduHandle, uint8_t TxOptions) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MCPS_DATA_REQUEST; *tx_buff_ptr++ = SrcAddrMode; *tx_buff_ptr++ = DstAddrSpec->AddrMode; *tx_buff_ptr++ = (uint8_t)DstAddrSpec->PANId; *tx_buff_ptr++ = (uint8_t)(DstAddrSpec->PANId >> 8); memcpy(tx_buff_ptr, &(DstAddrSpec->Addr).long_address, sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = msduHandle; *tx_buff_ptr++ = TxOptions; *tx_buff_ptr++ = msduLength; *tx_buff_ptr++ = msduLength; memcpy(tx_buff_ptr, msdu, msduLength); tx_buff_ptr += msduLength; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_associate_req(uint8_t LogicalChannel, uint8_t ChannelPage, wpan_addr_spec_t *CoordAddrSpec, uint8_t CapabilityInformation) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_ASSOCIATE_REQUEST; *tx_buff_ptr++ = LogicalChannel; *tx_buff_ptr++ = ChannelPage; *tx_buff_ptr++ = CoordAddrSpec->AddrMode; *tx_buff_ptr++ = (uint8_t)CoordAddrSpec->PANId; *tx_buff_ptr++ = (uint8_t)(CoordAddrSpec->PANId >> 8); memcpy(tx_buff_ptr, &(CoordAddrSpec->Addr).long_address, sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = CapabilityInformation; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
/** * @brief Function to handle the state machine serial data exchange. */ bool nwk_task(void) { /* Rx processing */ if (data_length == 0) { /* No data to process, read the stream IO */ rx_index = 0; data_length = sio2ncp_rx(data, SIO_RX2NCP_BUF_SIZE); } else { /* Data has been received, process the data */ /* Process each single byte */ process_incoming_data(); data_length--; rx_index++; } /* Tx processing */ if (buf_count != 0) { if (sio2ncp_tx(sio_tx_buf[head], (sio_tx_buf[head][1] + 3)) != 0) { head++; head %= SIO_BUF_COUNT; buf_count--; } else { /* @ToDo what happens if none or only a part of the * bytes could be transmitted? */ } } return true; }
bool wpan_mlme_start_req(uint16_t PANId, uint8_t LogicalChannel, uint8_t ChannelPage, uint8_t BeaconOrder, uint8_t SuperframeOrder, bool PANCoordinator, bool BatteryLifeExtension, bool CoordRealignment) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_START_REQUEST; *tx_buff_ptr++ = (uint8_t)PANId; *tx_buff_ptr++ = (uint8_t)(PANId >> 8); *tx_buff_ptr++ = LogicalChannel; *tx_buff_ptr++ = ChannelPage; *tx_buff_ptr++ = BeaconOrder; *tx_buff_ptr++ = SuperframeOrder; *tx_buff_ptr++ = PANCoordinator; *tx_buff_ptr++ = BatteryLifeExtension; *tx_buff_ptr++ = CoordRealignment; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_set_req(uint8_t PIBAttribute, void *PIBAttributeValue) { uint8_t pib_len; if (macBeaconPayload == PIBAttribute) { pib_len = *((uint8_t *)PIBAttributeValue - 1); } else { pib_len = mac_get_pib_attribute_size(PIBAttribute); } length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_SET_REQUEST; *tx_buff_ptr++ = PIBAttribute; *tx_buff_ptr++ = pib_len; memcpy(tx_buff_ptr, (uint8_t *)PIBAttributeValue, pib_len); tx_buff_ptr += pib_len; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_disassociate_req(wpan_addr_spec_t *DeviceAddrSpec, uint8_t DisassociateReason, bool TxIndirect) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_DISASSOCIATE_REQUEST; *tx_buff_ptr++ = DeviceAddrSpec->AddrMode; *tx_buff_ptr++ = (uint8_t)DeviceAddrSpec->PANId; *tx_buff_ptr++ = (uint8_t)(DeviceAddrSpec->PANId >> 8); memcpy(tx_buff_ptr, &((DeviceAddrSpec->Addr).long_address), sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = DisassociateReason; *tx_buff_ptr++ = TxIndirect; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mcps_purge_req(const uint8_t msduHandle) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MCPS_PURGE_REQUEST; *tx_buff_ptr++ = msduHandle; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
void serial_bridge_handler() { length_received_host = sio2host_rx(temp, SIO_RX_BUF_SIZE); if (length_received_host != 0) { sio2ncp_tx(temp, length_received_host); length_received_host = 0; } length_received_ncp = sio2ncp_rx(temp, SIO_RX_BUF_SIZE); if (length_received_ncp != 0) { sio2host_tx(temp, length_received_ncp); length_received_ncp = 0; } }
bool wpan_mlme_reset_req(bool SetDefaultPib) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_RESET_REQUEST; *tx_buff_ptr++ = SetDefaultPib; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_get_req(uint8_t PIBAttribute) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_GET_REQUEST; *tx_buff_ptr++ = PIBAttribute; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_gts_req(uint16_t DevShortAddr, gts_char_t GtsChar) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_GTS_REQUEST; *tx_buff_ptr++ = (uint8_t)DevShortAddr; *tx_buff_ptr++ = (uint8_t)DevShortAddr >> 8; *tx_buff_ptr++ = *((uint8_t*)&GtsChar); *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_sync_req(uint8_t LogicalChannel, uint8_t ChannelPage, bool TrackBeacon) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_SYNC_REQUEST; *tx_buff_ptr++ = LogicalChannel; *tx_buff_ptr++ = ChannelPage; *tx_buff_ptr++ = TrackBeacon; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_poll_req(wpan_addr_spec_t *CoordAddrSpec) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_POLL_REQUEST; *tx_buff_ptr++ = CoordAddrSpec->AddrMode; *tx_buff_ptr++ = (uint8_t)CoordAddrSpec->PANId; *tx_buff_ptr++ = (uint8_t)(CoordAddrSpec->PANId >> 8); memcpy(tx_buff_ptr, &(CoordAddrSpec->Addr).long_address, sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_orphan_resp(uint64_t OrphanAddress, uint16_t ShortAddress, bool AssociatedMember) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_ORPHAN_RESPONSE; memcpy(tx_buff_ptr, &OrphanAddress, sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = (uint8_t)ShortAddress; *tx_buff_ptr++ = (uint8_t)(ShortAddress >> 8); *tx_buff_ptr++ = AssociatedMember; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_associate_resp(uint64_t DeviceAddress, uint16_t AssocShortAddress, uint8_t status) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_ASSOCIATE_RESPONSE; memcpy(tx_buff_ptr, &DeviceAddress, sizeof(uint64_t)); tx_buff_ptr += sizeof(uint64_t); *tx_buff_ptr++ = (uint8_t)AssocShortAddress; *tx_buff_ptr++ = (uint8_t)(AssocShortAddress >> 8); *tx_buff_ptr++ = status; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_scan_req(uint8_t ScanType, uint32_t ScanChannels, uint8_t ScanDuration, uint8_t ChannelPage) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_SCAN_REQUEST; *tx_buff_ptr++ = ScanType; memcpy(tx_buff_ptr, &ScanChannels, sizeof(uint32_t)); tx_buff_ptr += sizeof(uint32_t); *tx_buff_ptr++ = ScanDuration; *tx_buff_ptr++ = ChannelPage; *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }
bool wpan_mlme_rx_enable_req(bool DeferPermit, uint32_t RxOnTime, uint32_t RxOnDuration) { length = 0; tx_buff_ptr = &tx_buffer[CMD_POS]; *tx_buff_ptr++ = MLME_RX_ENABLE_REQUEST; *tx_buff_ptr++ = DeferPermit; memcpy(tx_buff_ptr, &RxOnTime, sizeof(uint32_t)); tx_buff_ptr += sizeof(uint32_t); memcpy(tx_buff_ptr, &RxOnDuration, sizeof(uint32_t)); tx_buff_ptr += sizeof(uint32_t); *tx_buff_ptr++ = EOT; length = tx_buff_ptr - (uint8_t *)&tx_buffer[0]; tx_buffer[LEN_POS] = length - 3; sio2ncp_tx(tx_buffer, length); return true; }