The MCR20A Wireless UART application functions as an wireless UART bridge between two (one-to-one) or several (one to many) boards. The application can be used with both a TERM, or with software that is capable of opening a serial port and writing to or reading from it. The characters sent or received are not necessarily ASCII printable characters.

Dependencies:   fsl_phy_mcr20a fsl_smac mbed-rtos mbed

Fork of mcr20_wireless_uart by Freescale

By default, the application uses broadcast addresses for OTA communication. This way, the application can be directly downloaded and run without any user intervention. The following use case assumes no changes have been done to the project.

  • Two (or more) MCR20A platforms (plugged into the FRDM-K64F Freescale Freedom Development platform) have to be connected to the PC using the mini/micro-USB cables.
  • The code must be downloaded on the platforms via CMSIS-DAP (or other means).
  • After that, two or more TERM applications must be opened, and the serial ports must be configured with the same baud rate as the one in the project (default baud rate is 115200). Other necessary serial configurations are 8 bit, no parity, and 1 stop bit.
  • To start the setup, each platform must be reset, and one of the (user) push buttons found on the MCR20A platform must be pressed. The user can press any of the non-reset buttons on the FRDM-K64F Freescale Freedom Development platform as well. *This initiates the state machine of the application so user can start.

Documentation

SMAC Demo Applications User Guide

Committer:
FSL\B36402
Date:
Sat Apr 25 00:50:20 2015 -0500
Revision:
23:6f13fea3cace
Parent:
19:71b793021c78
Child:
26:56ca40dcfae1
First version working with IAR

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cotigac 19:71b793021c78 1 /**************************************************************************************************
cotigac 19:71b793021c78 2 * SMAC implementation.
cotigac 19:71b793021c78 3 *
cotigac 19:71b793021c78 4 * Freescale Semiconductor Inc.
cotigac 19:71b793021c78 5 * (c) Copyright 2004-2014 Freescale Semiconductor, Inc.
cotigac 19:71b793021c78 6 * ALL RIGHTS RESERVED.
cotigac 19:71b793021c78 7 *
cotigac 19:71b793021c78 8 ***************************************************************************************************
cotigac 19:71b793021c78 9 *
cotigac 19:71b793021c78 10 * THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
cotigac 19:71b793021c78 11 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
cotigac 19:71b793021c78 12 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
cotigac 19:71b793021c78 13 * IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
cotigac 19:71b793021c78 14 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
cotigac 19:71b793021c78 15 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
cotigac 19:71b793021c78 16 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
cotigac 19:71b793021c78 17 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
cotigac 19:71b793021c78 18 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
cotigac 19:71b793021c78 19 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
cotigac 19:71b793021c78 20 * THE POSSIBILITY OF SUCH DAMAGE.
cotigac 19:71b793021c78 21 *
cotigac 19:71b793021c78 22 ***********************************************************************************************//*!
cotigac 19:71b793021c78 23 **************************************************************************************************/
cotigac 19:71b793021c78 24 #include "SMAC.h"
cotigac 19:71b793021c78 25 #include "PhyInterface.h"
cotigac 19:71b793021c78 26 #include "EmbeddedTypes.h"
cotigac 19:71b793021c78 27
cotigac 19:71b793021c78 28 #include "SMAC_Config.h"
FSL\B36402 23:6f13fea3cace 29 #if 0
FSL\B36402 23:6f13fea3cace 30 #include "MemManager.h"
FSL\B36402 23:6f13fea3cace 31 #include "FunctionLib.h"
FSL\B36402 23:6f13fea3cace 32 #include "panic.h"
FSL\B36402 23:6f13fea3cace 33 #endif
cotigac 19:71b793021c78 34
cotigac 19:71b793021c78 35 #include "cmsis_os.h"
FSL\B36402 23:6f13fea3cace 36 #include "rtos.h"
FSL\B36402 23:6f13fea3cace 37
cotigac 19:71b793021c78 38 /************************************************************************************
cotigac 19:71b793021c78 39 *************************************************************************************
cotigac 19:71b793021c78 40 * Public memory declarations
cotigac 19:71b793021c78 41 *************************************************************************************
cotigac 19:71b793021c78 42 ************************************************************************************/
cotigac 19:71b793021c78 43 uint8_t gTotalChannels;
cotigac 19:71b793021c78 44
cotigac 19:71b793021c78 45 /************************************************************************************
cotigac 19:71b793021c78 46 *************************************************************************************
cotigac 19:71b793021c78 47 * Private memory declarations
cotigac 19:71b793021c78 48 *************************************************************************************
cotigac 19:71b793021c78 49 ************************************************************************************/
cotigac 19:71b793021c78 50 static smacStates_t smacState;
cotigac 19:71b793021c78 51 /*volatile*/ static prssPacketPtr_t smacProccesPacketPtr;
cotigac 19:71b793021c78 52 static phyRxParams_t smacLastDataRxParams;
cotigac 19:71b793021c78 53 #if defined (gPHY_802_15_4g_d)
cotigac 19:71b793021c78 54 static smacPacket_t smacPacketConfig;
cotigac 19:71b793021c78 55 #endif
cotigac 19:71b793021c78 56 static macToPdDataMessage_t * gSmacDataMessage;
cotigac 19:71b793021c78 57 static macToPlmeMessage_t * gSmacMlmeMessage;
cotigac 19:71b793021c78 58
cotigac 19:71b793021c78 59 static uint16_t u16PanID;
cotigac 19:71b793021c78 60 static uint16_t u16ShortSrcAddress;
cotigac 19:71b793021c78 61
cotigac 19:71b793021c78 62 static uint8_t u8AckRetryCounter = 0;
cotigac 19:71b793021c78 63 static uint8_t u8CCARetryCounter = 0;
cotigac 19:71b793021c78 64
cotigac 19:71b793021c78 65 static uint8_t mSmacInitialized;
cotigac 19:71b793021c78 66 static uint8_t mSmacTimeoutAsked;
cotigac 19:71b793021c78 67 static uint8_t u8BackoffTimerId;
cotigac 19:71b793021c78 68 static txContextConfig_t txConfigurator;
cotigac 19:71b793021c78 69 static uint8_t u8SmacSeqNo;
cotigac 19:71b793021c78 70 //Sap Handlers Called by PHY
cotigac 19:71b793021c78 71 phyStatus_t PD_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId);
cotigac 19:71b793021c78 72 phyStatus_t PLME_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId);
cotigac 19:71b793021c78 73
cotigac 19:71b793021c78 74 /************************************************************************************
cotigac 19:71b793021c78 75 *************************************************************************************
cotigac 19:71b793021c78 76 * Private functions
cotigac 19:71b793021c78 77 *************************************************************************************
cotigac 19:71b793021c78 78 ************************************************************************************/
cotigac 19:71b793021c78 79 static bool_t SMACPacketCheck(pdDataToMacMessage_t* pMsgFromPhy);
cotigac 19:71b793021c78 80 static void BackoffTimeElapsed(void const *arg);
cotigac 19:71b793021c78 81
cotigac 19:71b793021c78 82 osTimerDef (SmacTimer, BackoffTimeElapsed);
cotigac 19:71b793021c78 83 /************************************************************************************
cotigac 19:71b793021c78 84 *************************************************************************************
cotigac 19:71b793021c78 85 * Interface functions
cotigac 19:71b793021c78 86 *************************************************************************************
cotigac 19:71b793021c78 87 ************************************************************************************/
cotigac 19:71b793021c78 88 uint8_t TMR_AllocateTimer
cotigac 19:71b793021c78 89 (
cotigac 19:71b793021c78 90 void
cotigac 19:71b793021c78 91 )
cotigac 19:71b793021c78 92 {
cotigac 19:71b793021c78 93 //RtosTimer smac_timer(u8BackoffTimerId, osTimerOnce , NULL);
cotigac 19:71b793021c78 94 return 0;
cotigac 19:71b793021c78 95 }
cotigac 19:71b793021c78 96
cotigac 19:71b793021c78 97 uint8_t TMR_StartSingleShotTimer
cotigac 19:71b793021c78 98 (
cotigac 19:71b793021c78 99 uint8_t timerID,
cotigac 19:71b793021c78 100 uint32_t timeInMilliseconds,
cotigac 19:71b793021c78 101 void (*pfTimerCallBack)(const void *),
cotigac 19:71b793021c78 102 void *param
cotigac 19:71b793021c78 103 )
cotigac 19:71b793021c78 104 {
FSL\B36402 23:6f13fea3cace 105 //RtosTimer smac_timer(pfTimerCallBack, osTimerOnce , NULL);
FSL\B36402 23:6f13fea3cace 106
FSL\B36402 23:6f13fea3cace 107 osTimerId id = osTimerCreate (osTimer(SmacTimer), osTimerOnce, NULL);
cotigac 19:71b793021c78 108 osTimerStart (id, timeInMilliseconds);
cotigac 19:71b793021c78 109 return 0;
cotigac 19:71b793021c78 110 }
cotigac 19:71b793021c78 111
cotigac 19:71b793021c78 112
cotigac 19:71b793021c78 113 /***********************************************************************************/
cotigac 19:71b793021c78 114 /******************************** SMAC Data primitives *****************************/
cotigac 19:71b793021c78 115 /***********************************************************************************/
cotigac 19:71b793021c78 116
cotigac 19:71b793021c78 117 /************************************************************************************
cotigac 19:71b793021c78 118 * MCPSDataRequest
cotigac 19:71b793021c78 119 *
cotigac 19:71b793021c78 120 * This data primitive is used to send an over the air packet. This is an asynchronous
cotigac 19:71b793021c78 121 * function, it means it asks SMAC to transmit one OTA packet, but when the function
cotigac 19:71b793021c78 122 * returns it is not sent already.
cotigac 19:71b793021c78 123 *
cotigac 19:71b793021c78 124 ************************************************************************************/
cotigac 19:71b793021c78 125 smacErrors_t MCPSDataRequest
cotigac 19:71b793021c78 126 (
cotigac 19:71b793021c78 127 txPacket_t *psTxPacket //IN:Pointer to the packet to be transmitted
cotigac 19:71b793021c78 128 )
cotigac 19:71b793021c78 129 {
cotigac 19:71b793021c78 130 macToPdDataMessage_t *pMsg;
cotigac 19:71b793021c78 131 phyStatus_t u8PhyRes = gPhySuccess_c;
cotigac 19:71b793021c78 132
cotigac 19:71b793021c78 133 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 134 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 135 {
cotigac 19:71b793021c78 136 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 137 }
cotigac 19:71b793021c78 138 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 139
cotigac 19:71b793021c78 140 #if(TRUE == smacParametersValidation_d)
cotigac 19:71b793021c78 141 uint8_t u8MaxLen=0;
cotigac 19:71b793021c78 142
cotigac 19:71b793021c78 143 u8MaxLen = gMaxSmacSDULength_c;
cotigac 19:71b793021c78 144
cotigac 19:71b793021c78 145 if((NULL == psTxPacket) || (u8MaxLen < psTxPacket->u8DataLength))
cotigac 19:71b793021c78 146 {
cotigac 19:71b793021c78 147 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 148 }
cotigac 19:71b793021c78 149 #endif /* TRUE == smacParametersValidation_d */
cotigac 19:71b793021c78 150
cotigac 19:71b793021c78 151 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 152 {
cotigac 19:71b793021c78 153 return gErrorBusy_c;
cotigac 19:71b793021c78 154 }
cotigac 19:71b793021c78 155
cotigac 19:71b793021c78 156 u8SmacSeqNo++;
cotigac 19:71b793021c78 157 u8AckRetryCounter = 0;
cotigac 19:71b793021c78 158 u8CCARetryCounter = 0;
cotigac 19:71b793021c78 159
cotigac 19:71b793021c78 160 psTxPacket->u8DataLength = psTxPacket->u8DataLength + gSmacHeaderBytes_c;
cotigac 19:71b793021c78 161
cotigac 19:71b793021c78 162 pMsg = (macToPdDataMessage_t*)MEM_BufferAlloc( sizeof(macToPdDataMessage_t) +
cotigac 19:71b793021c78 163 psTxPacket->u8DataLength);
cotigac 19:71b793021c78 164 if(pMsg == NULL )
cotigac 19:71b793021c78 165 {
cotigac 19:71b793021c78 166 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 167 }
cotigac 19:71b793021c78 168 /* Fill with Phy related data */
cotigac 19:71b793021c78 169 pMsg->macInstance = smacInstance;
cotigac 19:71b793021c78 170 pMsg->msgType = gPdDataReq_c;
cotigac 19:71b793021c78 171 //SMAC doesn't use slotted mode
cotigac 19:71b793021c78 172 pMsg->msgData.dataReq.slottedTx = gPhyUnslottedMode_c;
cotigac 19:71b793021c78 173 //start transmission immediately
cotigac 19:71b793021c78 174 pMsg->msgData.dataReq.startTime = gPhySeqStartAsap_c;
cotigac 19:71b793021c78 175 #ifdef gPHY_802_15_4g_d
cotigac 19:71b793021c78 176 //for sub-Gig phy handles duration in case of ACK
cotigac 19:71b793021c78 177 pMsg->msgData.dataReq.txDuration = 0xFFFFFFFF;
cotigac 19:71b793021c78 178 #else
cotigac 19:71b793021c78 179 if(txConfigurator.autoAck &&
cotigac 19:71b793021c78 180 psTxPacket->smacHeader.destAddr != 0xFFFF &&
cotigac 19:71b793021c78 181 psTxPacket->smacHeader.panId != 0xFFFF)
cotigac 19:71b793021c78 182 {
cotigac 19:71b793021c78 183 //Turn@ + phy payload(symbols)+ Turn@ + ACK
cotigac 19:71b793021c78 184 pMsg->msgData.dataReq.txDuration = 12 + (6 + psTxPacket->u8DataLength + 2)*2 + 12 + 42;
cotigac 19:71b793021c78 185 if(txConfigurator.ccaBeforeTx)
cotigac 19:71b793021c78 186 {
cotigac 19:71b793021c78 187 pMsg->msgData.dataReq.txDuration += 0x08; //CCA Duration: 8 symbols
cotigac 19:71b793021c78 188 }
cotigac 19:71b793021c78 189 }
cotigac 19:71b793021c78 190 else
cotigac 19:71b793021c78 191 {
cotigac 19:71b793021c78 192 pMsg->msgData.dataReq.txDuration = 0xFFFFFFFF;
cotigac 19:71b793021c78 193 }
cotigac 19:71b793021c78 194 #endif
cotigac 19:71b793021c78 195 pMsg->msgData.dataReq.psduLength = psTxPacket->u8DataLength;
cotigac 19:71b793021c78 196 pMsg->msgData.dataReq.pPsdu = (uint8_t*)&pMsg->msgData.dataReq.pPsdu +
cotigac 19:71b793021c78 197 sizeof(pMsg->msgData.dataReq.pPsdu);
cotigac 19:71b793021c78 198
cotigac 19:71b793021c78 199 FLib_MemCpy(pMsg->msgData.dataReq.pPsdu, &(psTxPacket->smacHeader), gSmacHeaderBytes_c);
cotigac 19:71b793021c78 200 FLib_MemCpy(pMsg->msgData.dataReq.pPsdu + gSmacHeaderBytes_c,
cotigac 19:71b793021c78 201 &(psTxPacket->smacPdu),
cotigac 19:71b793021c78 202 psTxPacket->u8DataLength - gSmacHeaderBytes_c);
cotigac 19:71b793021c78 203
cotigac 19:71b793021c78 204 if(txConfigurator.ccaBeforeTx)
cotigac 19:71b793021c78 205 {
cotigac 19:71b793021c78 206 //tell phy to perform CCA before transmission
cotigac 19:71b793021c78 207 pMsg->msgData.dataReq.CCABeforeTx = gPhyCCAMode1_c;
cotigac 19:71b793021c78 208 }
cotigac 19:71b793021c78 209 else
cotigac 19:71b793021c78 210 {
cotigac 19:71b793021c78 211 pMsg->msgData.dataReq.CCABeforeTx = gPhyNoCCABeforeTx_c;
cotigac 19:71b793021c78 212 }
cotigac 19:71b793021c78 213
cotigac 19:71b793021c78 214 if(txConfigurator.autoAck &&
cotigac 19:71b793021c78 215 psTxPacket->smacHeader.destAddr != 0xFFFF &&
cotigac 19:71b793021c78 216 psTxPacket->smacHeader.panId != 0xFFFF)
cotigac 19:71b793021c78 217 {
cotigac 19:71b793021c78 218 //set frame control option: ACK.
cotigac 19:71b793021c78 219 pMsg->msgData.dataReq.pPsdu[0] |= FRAME_CTRL_ACK_FIELD_SET;
cotigac 19:71b793021c78 220 pMsg->msgData.dataReq.ackRequired = gPhyRxAckRqd_c;
cotigac 19:71b793021c78 221 }
cotigac 19:71b793021c78 222 else
cotigac 19:71b793021c78 223 {
cotigac 19:71b793021c78 224 pMsg->msgData.dataReq.ackRequired = gPhyNoAckRqd_c;
cotigac 19:71b793021c78 225 }
cotigac 19:71b793021c78 226 //set sequence number;
cotigac 19:71b793021c78 227 pMsg->msgData.dataReq.pPsdu[2] = u8SmacSeqNo;
cotigac 19:71b793021c78 228 gSmacDataMessage = pMsg; //Store pointer for freeing later
cotigac 19:71b793021c78 229 u8PhyRes = MAC_PD_SapHandler(pMsg, 0);
cotigac 19:71b793021c78 230
cotigac 19:71b793021c78 231 psTxPacket->u8DataLength -= gSmacHeaderBytes_c;
cotigac 19:71b793021c78 232
cotigac 19:71b793021c78 233 if(u8PhyRes == gPhySuccess_c)
cotigac 19:71b793021c78 234 {
cotigac 19:71b793021c78 235 smacState= mSmacStateTransmitting_c;
cotigac 19:71b793021c78 236 return gErrorNoError_c;
cotigac 19:71b793021c78 237 }
cotigac 19:71b793021c78 238 else
cotigac 19:71b793021c78 239 {
cotigac 19:71b793021c78 240 MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 241 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 242 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 243 }
cotigac 19:71b793021c78 244 }
cotigac 19:71b793021c78 245
cotigac 19:71b793021c78 246 /************************************************************************************
cotigac 19:71b793021c78 247 * MLMEConfigureTxContext
cotigac 19:71b793021c78 248 *
cotigac 19:71b793021c78 249 * This management primitive is used to configure the conditions under which SMAC will
cotigac 19:71b793021c78 250 * perform a transmission OTA.
cotigac 19:71b793021c78 251 *
cotigac 19:71b793021c78 252 ************************************************************************************/
cotigac 19:71b793021c78 253 smacErrors_t MLMEConfigureTxContext(txContextConfig_t* pTxConfig)
cotigac 19:71b793021c78 254 {
cotigac 19:71b793021c78 255 if( (pTxConfig->autoAck == FALSE && pTxConfig->retryCountAckFail !=0) ||
cotigac 19:71b793021c78 256 (pTxConfig->ccaBeforeTx == FALSE && pTxConfig->retryCountCCAFail !=0) )
cotigac 19:71b793021c78 257 {
cotigac 19:71b793021c78 258 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 259 }
cotigac 19:71b793021c78 260 if( pTxConfig->retryCountAckFail > gMaxRetriesAllowed_c ||
cotigac 19:71b793021c78 261 pTxConfig->retryCountCCAFail > gMaxRetriesAllowed_c)
cotigac 19:71b793021c78 262 {
cotigac 19:71b793021c78 263 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 264 }
cotigac 19:71b793021c78 265 txConfigurator.autoAck = pTxConfig->autoAck;
cotigac 19:71b793021c78 266 txConfigurator.ccaBeforeTx = pTxConfig->ccaBeforeTx;
cotigac 19:71b793021c78 267 txConfigurator.retryCountAckFail = pTxConfig->retryCountAckFail;
cotigac 19:71b793021c78 268 txConfigurator.retryCountCCAFail = pTxConfig->retryCountCCAFail;
cotigac 19:71b793021c78 269
cotigac 19:71b793021c78 270 return gErrorNoError_c;
cotigac 19:71b793021c78 271 }
cotigac 19:71b793021c78 272
cotigac 19:71b793021c78 273 /************************************************************************************
cotigac 19:71b793021c78 274 * MLMERXEnableRequest
cotigac 19:71b793021c78 275 *
cotigac 19:71b793021c78 276 * Function used to place the radio into receive mode
cotigac 19:71b793021c78 277 *
cotigac 19:71b793021c78 278 ************************************************************************************/
cotigac 19:71b793021c78 279 smacErrors_t MLMERXEnableRequest
cotigac 19:71b793021c78 280 (
cotigac 19:71b793021c78 281 rxPacket_t *gsRxPacket, //OUT: Pointer to the structure where the reception results
cotigac 19:71b793021c78 282 // will be stored.
cotigac 19:71b793021c78 283 smacTime_t stTimeout //IN: 64-bit timeout value, absolute value in symbols
cotigac 19:71b793021c78 284 )
cotigac 19:71b793021c78 285 {
cotigac 19:71b793021c78 286
cotigac 19:71b793021c78 287 uint8_t u8PhyRes = 0;
cotigac 19:71b793021c78 288 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 289
cotigac 19:71b793021c78 290 #if(TRUE == smacParametersValidation_d)
cotigac 19:71b793021c78 291 uint8_t u8MaxLen=0;
cotigac 19:71b793021c78 292
cotigac 19:71b793021c78 293 u8MaxLen = gMaxSmacSDULength_c;
cotigac 19:71b793021c78 294 #endif /* TRUE == smacParametersValidation_d */
cotigac 19:71b793021c78 295
cotigac 19:71b793021c78 296 #if(TRUE == smacParametersValidation_d)
cotigac 19:71b793021c78 297 if((NULL == gsRxPacket) || (u8MaxLen < gsRxPacket->u8MaxDataLength))
cotigac 19:71b793021c78 298 {
cotigac 19:71b793021c78 299 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 300 }
cotigac 19:71b793021c78 301 #endif /* TRUE == smacParametersValidation_d */
cotigac 19:71b793021c78 302
cotigac 19:71b793021c78 303 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 304 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 305 {
cotigac 19:71b793021c78 306 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 307 }
cotigac 19:71b793021c78 308 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 309
cotigac 19:71b793021c78 310 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 311 {
cotigac 19:71b793021c78 312 return gErrorBusy_c;
cotigac 19:71b793021c78 313 }
cotigac 19:71b793021c78 314 if(stTimeout)
cotigac 19:71b793021c78 315 {
cotigac 19:71b793021c78 316 lMsg.msgType = gPlmeSetTRxStateReq_c;
cotigac 19:71b793021c78 317 lMsg.msgData.setTRxStateReq.startTime = gPhySeqStartAsap_c;
cotigac 19:71b793021c78 318 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 319 lMsg.msgData.setTRxStateReq.state = gPhySetRxOn_c;
cotigac 19:71b793021c78 320 mSmacTimeoutAsked = TRUE;
cotigac 19:71b793021c78 321 lMsg.msgData.setTRxStateReq.rxDuration = stTimeout;
cotigac 19:71b793021c78 322 }
cotigac 19:71b793021c78 323 else
cotigac 19:71b793021c78 324 {
cotigac 19:71b793021c78 325 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 326 lMsg.msgData.setReq.PibAttribute = gPhyPibRxOnWhenIdle;
cotigac 19:71b793021c78 327 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)1;
cotigac 19:71b793021c78 328 }
cotigac 19:71b793021c78 329 u8PhyRes = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 330 if(u8PhyRes == gPhySuccess_c)
cotigac 19:71b793021c78 331 {
cotigac 19:71b793021c78 332 gsRxPacket->rxStatus = rxProcessingReceptionStatus_c;
cotigac 19:71b793021c78 333 smacProccesPacketPtr.smacRxPacketPointer = gsRxPacket;
cotigac 19:71b793021c78 334
cotigac 19:71b793021c78 335 smacState= mSmacStateReceiving_c;
cotigac 19:71b793021c78 336 return gErrorNoError_c;
cotigac 19:71b793021c78 337 }
cotigac 19:71b793021c78 338 else
cotigac 19:71b793021c78 339 {
cotigac 19:71b793021c78 340 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 341 }
cotigac 19:71b793021c78 342 }
cotigac 19:71b793021c78 343 #if defined (gPHY_802_15_4g_d)
cotigac 19:71b793021c78 344 /************************************************************************************
cotigac 19:71b793021c78 345 * MLMESetPreambleLength
cotigac 19:71b793021c78 346 *
cotigac 19:71b793021c78 347 * Function used to change the preamble size in the OTA Packet
cotigac 19:71b793021c78 348 *
cotigac 19:71b793021c78 349 ************************************************************************************/
cotigac 19:71b793021c78 350 smacErrors_t MLMESetPreambleLength
cotigac 19:71b793021c78 351 (
cotigac 19:71b793021c78 352 uint16_t u16preambleLength
cotigac 19:71b793021c78 353 )
cotigac 19:71b793021c78 354 {
cotigac 19:71b793021c78 355 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 356 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 357 {
cotigac 19:71b793021c78 358 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 359 }
cotigac 19:71b793021c78 360 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 361
cotigac 19:71b793021c78 362 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 363 {
cotigac 19:71b793021c78 364 return gErrorBusy_c;
cotigac 19:71b793021c78 365 }
cotigac 19:71b793021c78 366 smacPacketConfig.u16PreambleLength = u16preambleLength;
cotigac 19:71b793021c78 367 gPhyPib.mPIBphyFSKPreambleRepetitions = u16preambleLength;
cotigac 19:71b793021c78 368 PhyPib_RFUpdatePreambleLength();
cotigac 19:71b793021c78 369
cotigac 19:71b793021c78 370 return gErrorNoError_c;
cotigac 19:71b793021c78 371
cotigac 19:71b793021c78 372 }
cotigac 19:71b793021c78 373
cotigac 19:71b793021c78 374 /************************************************************************************
cotigac 19:71b793021c78 375 * MLMESetSyncWordSize
cotigac 19:71b793021c78 376 *
cotigac 19:71b793021c78 377 * Function used to change the synchronization word size. Values from 0 to 8 required.
cotigac 19:71b793021c78 378 * IMPORTANT-> Use below arguments only (indicating a direct value from 1-8 will not work)
cotigac 19:71b793021c78 379 * Inputs :
cotigac 19:71b793021c78 380 * SyncConfig_SyncSize_1
cotigac 19:71b793021c78 381 * SyncConfig_SyncSize_2
cotigac 19:71b793021c78 382 * SyncConfig_SyncSize_3
cotigac 19:71b793021c78 383 * SyncConfig_SyncSize_4
cotigac 19:71b793021c78 384 * SyncConfig_SyncSize_5
cotigac 19:71b793021c78 385 * SyncConfig_SyncSize_6
cotigac 19:71b793021c78 386 * SyncConfig_SyncSize_7
cotigac 19:71b793021c78 387 * SyncConfig_SyncSize_8
cotigac 19:71b793021c78 388 *
cotigac 19:71b793021c78 389 ************************************************************************************/
cotigac 19:71b793021c78 390 smacErrors_t MLMESetSyncWordSize
cotigac 19:71b793021c78 391 (
cotigac 19:71b793021c78 392 uint8_t u8syncWordSize
cotigac 19:71b793021c78 393 )
cotigac 19:71b793021c78 394 {
cotigac 19:71b793021c78 395
cotigac 19:71b793021c78 396 phyStatus_t status;
cotigac 19:71b793021c78 397 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 398 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 399 {
cotigac 19:71b793021c78 400 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 401 }
cotigac 19:71b793021c78 402 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 403
cotigac 19:71b793021c78 404 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 405 {
cotigac 19:71b793021c78 406 return gErrorBusy_c;
cotigac 19:71b793021c78 407 }
cotigac 19:71b793021c78 408
cotigac 19:71b793021c78 409 status = (phyStatus_t)Phy_SetSyncWordSize(u8syncWordSize);
cotigac 19:71b793021c78 410 if(status == gPhyInvalidParameter_c)
cotigac 19:71b793021c78 411 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 412
cotigac 19:71b793021c78 413 smacPacketConfig.u8SyncWordSize = u8syncWordSize;
cotigac 19:71b793021c78 414
cotigac 19:71b793021c78 415 return gErrorNoError_c;
cotigac 19:71b793021c78 416
cotigac 19:71b793021c78 417 }
cotigac 19:71b793021c78 418
cotigac 19:71b793021c78 419 /************************************************************************************
cotigac 19:71b793021c78 420 * MLMESetSyncWordValue
cotigac 19:71b793021c78 421 *
cotigac 19:71b793021c78 422 * Function used to change the synchronization word value.
cotigac 19:71b793021c78 423 *
cotigac 19:71b793021c78 424 *
cotigac 19:71b793021c78 425 ************************************************************************************/
cotigac 19:71b793021c78 426 smacErrors_t MLMESetSyncWordValue
cotigac 19:71b793021c78 427 (
cotigac 19:71b793021c78 428 uint8_t *u8syncWordValue
cotigac 19:71b793021c78 429 )
cotigac 19:71b793021c78 430 {
cotigac 19:71b793021c78 431 uint8_t syncWordSizeTemp = smacPacketConfig.u8SyncWordSize;
cotigac 19:71b793021c78 432 uint8_t syncValueRegIndex = 0;
cotigac 19:71b793021c78 433
cotigac 19:71b793021c78 434 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 435 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 436 {
cotigac 19:71b793021c78 437 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 438 }
cotigac 19:71b793021c78 439 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 440
cotigac 19:71b793021c78 441 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 442 {
cotigac 19:71b793021c78 443 return gErrorBusy_c;
cotigac 19:71b793021c78 444 }
cotigac 19:71b793021c78 445
cotigac 19:71b793021c78 446 smacPacketConfig.u8SyncWordValue = u8syncWordValue;
cotigac 19:71b793021c78 447
cotigac 19:71b793021c78 448 while (syncWordSizeTemp--)
cotigac 19:71b793021c78 449 {
cotigac 19:71b793021c78 450 Phy_SetSyncWordValue(syncValueRegIndex, (uint8_t)*u8syncWordValue);
cotigac 19:71b793021c78 451 syncValueRegIndex++;
cotigac 19:71b793021c78 452 u8syncWordValue++;
cotigac 19:71b793021c78 453 }
cotigac 19:71b793021c78 454 while(syncValueRegIndex < 8)
cotigac 19:71b793021c78 455 {
cotigac 19:71b793021c78 456 Phy_SetSyncWordValue(syncValueRegIndex, 0x00);
cotigac 19:71b793021c78 457 syncValueRegIndex++;
cotigac 19:71b793021c78 458 }
cotigac 19:71b793021c78 459
cotigac 19:71b793021c78 460 return gErrorNoError_c;
cotigac 19:71b793021c78 461
cotigac 19:71b793021c78 462 }
cotigac 19:71b793021c78 463
cotigac 19:71b793021c78 464 /************************************************************************************
cotigac 19:71b793021c78 465 * MLMEPacketConfig
cotigac 19:71b793021c78 466 *
cotigac 19:71b793021c78 467 *
cotigac 19:71b793021c78 468 *
cotigac 19:71b793021c78 469 ************************************************************************************/
cotigac 19:71b793021c78 470 smacErrors_t MLMEPacketConfig
cotigac 19:71b793021c78 471 (
cotigac 19:71b793021c78 472 packetConfig_t *pPacketCfg
cotigac 19:71b793021c78 473 )
cotigac 19:71b793021c78 474 {
cotigac 19:71b793021c78 475 smacErrors_t err = gErrorNoError_c;
cotigac 19:71b793021c78 476 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 477 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 478 {
cotigac 19:71b793021c78 479 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 480 }
cotigac 19:71b793021c78 481 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 482
cotigac 19:71b793021c78 483 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 484 {
cotigac 19:71b793021c78 485 return gErrorBusy_c;
cotigac 19:71b793021c78 486 }
cotigac 19:71b793021c78 487 err = MLMESetSyncWordSize(pPacketCfg->u8SyncWordSize);
cotigac 19:71b793021c78 488 err |= MLMESetSyncWordValue(pPacketCfg->pu8SyncWord);
cotigac 19:71b793021c78 489 err |= MLMESetPreambleLength(pPacketCfg->u16PreambleSize);
cotigac 19:71b793021c78 490 if(err != gErrorNoError_c)
cotigac 19:71b793021c78 491 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 492
cotigac 19:71b793021c78 493 return gErrorNoError_c;
cotigac 19:71b793021c78 494 }
cotigac 19:71b793021c78 495
cotigac 19:71b793021c78 496 #endif
cotigac 19:71b793021c78 497
cotigac 19:71b793021c78 498 /************************************************************************************
cotigac 19:71b793021c78 499 * MLMESetChannelRequest
cotigac 19:71b793021c78 500 *
cotigac 19:71b793021c78 501 *
cotigac 19:71b793021c78 502 *
cotigac 19:71b793021c78 503 ************************************************************************************/
cotigac 19:71b793021c78 504 smacErrors_t MLMESetChannelRequest
cotigac 19:71b793021c78 505 (
cotigac 19:71b793021c78 506 channels_t newChannel
cotigac 19:71b793021c78 507 )
cotigac 19:71b793021c78 508 {
cotigac 19:71b793021c78 509 uint8_t errorVal;
cotigac 19:71b793021c78 510 smacErrors_t err = gErrorNoError_c;
cotigac 19:71b793021c78 511
cotigac 19:71b793021c78 512 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 513 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 514 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 515 {
cotigac 19:71b793021c78 516 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 517 }
cotigac 19:71b793021c78 518 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 519 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 520 {
cotigac 19:71b793021c78 521 return gErrorBusy_c;
cotigac 19:71b793021c78 522 }
cotigac 19:71b793021c78 523 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 524 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 525 lMsg.msgData.setReq.PibAttribute = gPhyPibCurrentChannel_c;
cotigac 19:71b793021c78 526 lMsg.msgData.setReq.PibAttributeValue = (uint64_t) newChannel;
cotigac 19:71b793021c78 527
cotigac 19:71b793021c78 528 errorVal = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 529 switch (errorVal)
cotigac 19:71b793021c78 530 {
cotigac 19:71b793021c78 531 case gPhyBusy_c:
cotigac 19:71b793021c78 532 err = gErrorBusy_c;
cotigac 19:71b793021c78 533 break;
cotigac 19:71b793021c78 534
cotigac 19:71b793021c78 535 case gPhyInvalidParameter_c:
cotigac 19:71b793021c78 536 err = gErrorOutOfRange_c;
cotigac 19:71b793021c78 537 break;
cotigac 19:71b793021c78 538
cotigac 19:71b793021c78 539 case gPhySuccess_c:
cotigac 19:71b793021c78 540 err = gErrorNoError_c;
cotigac 19:71b793021c78 541 break;
cotigac 19:71b793021c78 542
cotigac 19:71b793021c78 543 default:
cotigac 19:71b793021c78 544 err = gErrorOutOfRange_c;
cotigac 19:71b793021c78 545 break;
cotigac 19:71b793021c78 546 }
cotigac 19:71b793021c78 547
cotigac 19:71b793021c78 548 return err;
cotigac 19:71b793021c78 549 }
cotigac 19:71b793021c78 550
cotigac 19:71b793021c78 551
cotigac 19:71b793021c78 552 /************************************************************************************
cotigac 19:71b793021c78 553 * MLMESetAdditionalRFOffset
cotigac 19:71b793021c78 554 *
cotigac 19:71b793021c78 555 *************************************************************************************/
cotigac 19:71b793021c78 556 smacErrors_t MLMESetAdditionalRFOffset (uint32_t additionalRFOffset)
cotigac 19:71b793021c78 557 {
cotigac 19:71b793021c78 558 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 559 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 560 {
cotigac 19:71b793021c78 561 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 562 }
cotigac 19:71b793021c78 563 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 564
cotigac 19:71b793021c78 565 #ifdef gIncludeCalibrationOption
cotigac 19:71b793021c78 566 gPhyPib.mPIBAdditionalRFFrequencyOffset = additionalRFOffset;
cotigac 19:71b793021c78 567 return gErrorNoError_c;
cotigac 19:71b793021c78 568 #else
cotigac 19:71b793021c78 569 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 570 #endif
cotigac 19:71b793021c78 571 }
cotigac 19:71b793021c78 572
cotigac 19:71b793021c78 573
cotigac 19:71b793021c78 574 /************************************************************************************
cotigac 19:71b793021c78 575 * MLMEGetAdditionalRFOffset
cotigac 19:71b793021c78 576 *
cotigac 19:71b793021c78 577 *************************************************************************************/
cotigac 19:71b793021c78 578 uint32_t MLMEGetAdditionalRFOffset( void )
cotigac 19:71b793021c78 579 {
cotigac 19:71b793021c78 580 #ifdef gIncludeCalibrationOption
cotigac 19:71b793021c78 581 return gPhyPib.mPIBAdditionalRFFrequencyOffset;
cotigac 19:71b793021c78 582 #else
cotigac 19:71b793021c78 583 return 0;
cotigac 19:71b793021c78 584 #endif
cotigac 19:71b793021c78 585 }
cotigac 19:71b793021c78 586
cotigac 19:71b793021c78 587 #if defined (gPHY_802_15_4g_d)
cotigac 19:71b793021c78 588 /************************************************************************************
cotigac 19:71b793021c78 589 * MLMESetFreqBand
cotigac 19:71b793021c78 590 *
cotigac 19:71b793021c78 591 ************************************************************************************/
cotigac 19:71b793021c78 592 smacErrors_t MLMESetFreqBand
cotigac 19:71b793021c78 593 (
cotigac 19:71b793021c78 594 smacFrequencyBands_t freqBand,
cotigac 19:71b793021c78 595 smacRFModes_t phyMode
cotigac 19:71b793021c78 596 )
cotigac 19:71b793021c78 597 {
cotigac 19:71b793021c78 598 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 599 }
cotigac 19:71b793021c78 600
cotigac 19:71b793021c78 601 smacErrors_t MLMESetPhyMode(smacRFModes_t phyMode)
cotigac 19:71b793021c78 602 {
cotigac 19:71b793021c78 603 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 604 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 605 {
cotigac 19:71b793021c78 606 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 607 }
cotigac 19:71b793021c78 608 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 609 phyStatus_t err;
cotigac 19:71b793021c78 610 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 611
cotigac 19:71b793021c78 612 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 613 {
cotigac 19:71b793021c78 614 return gErrorBusy_c;
cotigac 19:71b793021c78 615 }
cotigac 19:71b793021c78 616 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 617 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 618 lMsg.msgData.setReq.PibAttribute = gPhyPibCurrentMode_c;
cotigac 19:71b793021c78 619 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)phyMode;
cotigac 19:71b793021c78 620 err = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 621 if(err == gPhyInvalidParameter_c)
cotigac 19:71b793021c78 622 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 623 if(err == gPhyBusy_c)
cotigac 19:71b793021c78 624 return gErrorBusy_c;
cotigac 19:71b793021c78 625
cotigac 19:71b793021c78 626 gTotalChannels = gPhyPib.pPIBphyRfConstants->totalNumChannels;
cotigac 19:71b793021c78 627
cotigac 19:71b793021c78 628 return gErrorNoError_c;
cotigac 19:71b793021c78 629 }
cotigac 19:71b793021c78 630
cotigac 19:71b793021c78 631 #endif
cotigac 19:71b793021c78 632 /************************************************************************************
cotigac 19:71b793021c78 633 * MLMEGetChannelRequest
cotigac 19:71b793021c78 634 *
cotigac 19:71b793021c78 635 *
cotigac 19:71b793021c78 636 *
cotigac 19:71b793021c78 637 ************************************************************************************/
cotigac 19:71b793021c78 638 channels_t MLMEGetChannelRequest
cotigac 19:71b793021c78 639 (
cotigac 19:71b793021c78 640 void
cotigac 19:71b793021c78 641 )
cotigac 19:71b793021c78 642 {
cotigac 19:71b793021c78 643 channels_t currentChannel;
cotigac 19:71b793021c78 644 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 645 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 646 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 647 {
cotigac 19:71b793021c78 648 //panic(0,0,0,0);
cotigac 19:71b793021c78 649 }
cotigac 19:71b793021c78 650 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 651 lMsg.msgType = gPlmeGetReq_c;
cotigac 19:71b793021c78 652 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 653 lMsg.msgData.getReq.PibAttribute = gPhyPibCurrentChannel_c;
cotigac 19:71b793021c78 654 lMsg.msgData.getReq.pPibAttributeValue = (uint64_t*)&currentChannel;
cotigac 19:71b793021c78 655 MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 656 return currentChannel;
cotigac 19:71b793021c78 657 }
cotigac 19:71b793021c78 658
cotigac 19:71b793021c78 659 #if defined (gPHY_802_15_4g_d)
cotigac 19:71b793021c78 660 /************************************************************************************
cotigac 19:71b793021c78 661 * MLMERssi
cotigac 19:71b793021c78 662 *
cotigac 19:71b793021c78 663 *
cotigac 19:71b793021c78 664 *
cotigac 19:71b793021c78 665 ************************************************************************************/
cotigac 19:71b793021c78 666 uint8_t MLMERssi(void )
cotigac 19:71b793021c78 667 {
cotigac 19:71b793021c78 668 uint8_t rssiVal;
cotigac 19:71b793021c78 669
cotigac 19:71b793021c78 670 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 671 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 672 {
cotigac 19:71b793021c78 673 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 674 }
cotigac 19:71b793021c78 675 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 676
cotigac 19:71b793021c78 677 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 678 {
cotigac 19:71b793021c78 679 return gErrorBusy_c;
cotigac 19:71b793021c78 680 }
cotigac 19:71b793021c78 681
cotigac 19:71b793021c78 682 rssiVal = Phy_GetRssi();
cotigac 19:71b793021c78 683 return rssiVal;
cotigac 19:71b793021c78 684 }
cotigac 19:71b793021c78 685
cotigac 19:71b793021c78 686 /************************************************************************************
cotigac 19:71b793021c78 687 * MLMESetCCADuration
cotigac 19:71b793021c78 688 *
cotigac 19:71b793021c78 689 *
cotigac 19:71b793021c78 690 *
cotigac 19:71b793021c78 691 ************************************************************************************/
cotigac 19:71b793021c78 692 smacErrors_t MLMESetCCADuration(uint64_t usCCADuration )
cotigac 19:71b793021c78 693 {
cotigac 19:71b793021c78 694 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 695 phyStatus_t status;
cotigac 19:71b793021c78 696
cotigac 19:71b793021c78 697 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 698 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 699 {
cotigac 19:71b793021c78 700 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 701 }
cotigac 19:71b793021c78 702 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 703
cotigac 19:71b793021c78 704 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 705 {
cotigac 19:71b793021c78 706 return gErrorBusy_c;
cotigac 19:71b793021c78 707 }
cotigac 19:71b793021c78 708
cotigac 19:71b793021c78 709 usCCADuration = TIME_US_TO_TICKS(usCCADuration);
cotigac 19:71b793021c78 710 Phy_TimeDivider((phyTime_t*)&usCCADuration);
cotigac 19:71b793021c78 711
cotigac 19:71b793021c78 712 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 713 lMsg.msgData.setReq.PibAttribute = gPhyPibCCADuration_c;
cotigac 19:71b793021c78 714 lMsg.msgData.setReq.PibAttributeValue = usCCADuration;
cotigac 19:71b793021c78 715 status = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 716
cotigac 19:71b793021c78 717 if(status == gPhySuccess_c)
cotigac 19:71b793021c78 718 return gErrorNoError_c;
cotigac 19:71b793021c78 719 else
cotigac 19:71b793021c78 720 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 721 }
cotigac 19:71b793021c78 722
cotigac 19:71b793021c78 723 /************************************************************************************
cotigac 19:71b793021c78 724 * MLMESetInterPacketRxDelay
cotigac 19:71b793021c78 725 *
cotigac 19:71b793021c78 726 * IMPORTANT-> Use below arguments only (indicating a direct value from 1-12 will not work)
cotigac 19:71b793021c78 727 * Inputs :
cotigac 19:71b793021c78 728 *
cotigac 19:71b793021c78 729 * InterPacketRxDelay_0
cotigac 19:71b793021c78 730 * InterPacketRxDelay_1
cotigac 19:71b793021c78 731 * InterPacketRxDelay_2
cotigac 19:71b793021c78 732 * InterPacketRxDelay_3
cotigac 19:71b793021c78 733 * InterPacketRxDelay_4
cotigac 19:71b793021c78 734 * InterPacketRxDelay_5
cotigac 19:71b793021c78 735 * InterPacketRxDelay_6
cotigac 19:71b793021c78 736 * InterPacketRxDelay_7
cotigac 19:71b793021c78 737 * InterPacketRxDelay_8
cotigac 19:71b793021c78 738 * InterPacketRxDelay_9
cotigac 19:71b793021c78 739 * InterPacketRxDelay_A
cotigac 19:71b793021c78 740 * InterPacketRxDelay_B
cotigac 19:71b793021c78 741 ************************************************************************************/
cotigac 19:71b793021c78 742 smacErrors_t MLMESetInterPacketRxDelay
cotigac 19:71b793021c78 743 (
cotigac 19:71b793021c78 744 uint8_t u8InterPacketRxDelay
cotigac 19:71b793021c78 745 )
cotigac 19:71b793021c78 746 {
cotigac 19:71b793021c78 747 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 748 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 749 {
cotigac 19:71b793021c78 750 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 751 }
cotigac 19:71b793021c78 752 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 753
cotigac 19:71b793021c78 754 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 755 {
cotigac 19:71b793021c78 756 return gErrorBusy_c;
cotigac 19:71b793021c78 757 }
cotigac 19:71b793021c78 758
cotigac 19:71b793021c78 759 if (gPhySuccess_c != Phy_SetInterPacketRxDelay(u8InterPacketRxDelay))
cotigac 19:71b793021c78 760 {
cotigac 19:71b793021c78 761 return gErrorOutOfRange_c;
cotigac 19:71b793021c78 762 }
cotigac 19:71b793021c78 763 return gErrorNoError_c;
cotigac 19:71b793021c78 764 }
cotigac 19:71b793021c78 765
cotigac 19:71b793021c78 766 #endif
cotigac 19:71b793021c78 767 /************************************************************************************
cotigac 19:71b793021c78 768 * MLMERXDisableRequest
cotigac 19:71b793021c78 769 *
cotigac 19:71b793021c78 770 * Returns the radio to idle mode from receive mode.
cotigac 19:71b793021c78 771 *
cotigac 19:71b793021c78 772 ************************************************************************************/
cotigac 19:71b793021c78 773 smacErrors_t MLMERXDisableRequest(void)
cotigac 19:71b793021c78 774 {
cotigac 19:71b793021c78 775 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 776 phyStatus_t err;
cotigac 19:71b793021c78 777 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 778 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 779 {
cotigac 19:71b793021c78 780 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 781 }
cotigac 19:71b793021c78 782 #endif
cotigac 19:71b793021c78 783 if((mSmacStateReceiving_c != smacState) && (mSmacStateIdle_c != smacState))
cotigac 19:71b793021c78 784 {
cotigac 19:71b793021c78 785 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 786 }
cotigac 19:71b793021c78 787 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 788 if(!mSmacTimeoutAsked)
cotigac 19:71b793021c78 789 {
cotigac 19:71b793021c78 790 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 791 lMsg.msgData.setReq.PibAttribute = gPhyPibRxOnWhenIdle;
cotigac 19:71b793021c78 792 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)0;
cotigac 19:71b793021c78 793 err = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 794 if(err != gPhySuccess_c)
cotigac 19:71b793021c78 795 return gErrorBusy_c;
cotigac 19:71b793021c78 796 }
cotigac 19:71b793021c78 797 else
cotigac 19:71b793021c78 798 {
cotigac 19:71b793021c78 799 lMsg.msgType = gPlmeSetTRxStateReq_c;
cotigac 19:71b793021c78 800 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
cotigac 19:71b793021c78 801 (void)MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 802 mSmacTimeoutAsked = FALSE;
cotigac 19:71b793021c78 803 }
cotigac 19:71b793021c78 804 smacState= mSmacStateIdle_c;
cotigac 19:71b793021c78 805
cotigac 19:71b793021c78 806 return gErrorNoError_c;
cotigac 19:71b793021c78 807
cotigac 19:71b793021c78 808 }
cotigac 19:71b793021c78 809
cotigac 19:71b793021c78 810 /*@CMA, Conn Test Added*/
cotigac 19:71b793021c78 811 /************************************************************************************
cotigac 19:71b793021c78 812 * MLMETXDisableRequest
cotigac 19:71b793021c78 813 *
cotigac 19:71b793021c78 814 * Returns the radio to idle mode from Tx mode.
cotigac 19:71b793021c78 815 *
cotigac 19:71b793021c78 816 ************************************************************************************/
cotigac 19:71b793021c78 817 void MLMETXDisableRequest(void)
cotigac 19:71b793021c78 818 {
cotigac 19:71b793021c78 819 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 820 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 821 lMsg.msgType = gPlmeSetTRxStateReq_c;
cotigac 19:71b793021c78 822 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
cotigac 19:71b793021c78 823 (void)MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 824 if(gSmacDataMessage != NULL)
cotigac 19:71b793021c78 825 {
cotigac 19:71b793021c78 826 (void)MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 827 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 828 }
cotigac 19:71b793021c78 829 smacState= mSmacStateIdle_c;
cotigac 19:71b793021c78 830 }
cotigac 19:71b793021c78 831
cotigac 19:71b793021c78 832 /************************************************************************************
cotigac 19:71b793021c78 833 * MLMELinkQuality
cotigac 19:71b793021c78 834 *
cotigac 19:71b793021c78 835 * This function returns an integer value that is the link quality from the last
cotigac 19:71b793021c78 836 * received packet of the form: dBm = (-Link Quality/2).
cotigac 19:71b793021c78 837 *
cotigac 19:71b793021c78 838 ************************************************************************************/
cotigac 19:71b793021c78 839 uint8_t MLMELinkQuality(void)
cotigac 19:71b793021c78 840 {
cotigac 19:71b793021c78 841 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 842 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 843 {
cotigac 19:71b793021c78 844 return 0;
cotigac 19:71b793021c78 845 }
cotigac 19:71b793021c78 846 #endif
cotigac 19:71b793021c78 847 return smacLastDataRxParams.linkQuality;
cotigac 19:71b793021c78 848 }
cotigac 19:71b793021c78 849
cotigac 19:71b793021c78 850 /************************************************************************************
cotigac 19:71b793021c78 851 * MLMEPAOutputAdjust
cotigac 19:71b793021c78 852 *
cotigac 19:71b793021c78 853 *
cotigac 19:71b793021c78 854 ************************************************************************************/
cotigac 19:71b793021c78 855 smacErrors_t MLMEPAOutputAdjust
cotigac 19:71b793021c78 856 (
cotigac 19:71b793021c78 857 uint8_t u8PaValue
cotigac 19:71b793021c78 858 )
cotigac 19:71b793021c78 859 {
cotigac 19:71b793021c78 860 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 861 smacErrors_t err = gErrorNoError_c;
cotigac 19:71b793021c78 862 uint8_t errorVal;
cotigac 19:71b793021c78 863 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 864 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 865 {
cotigac 19:71b793021c78 866 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 867 }
cotigac 19:71b793021c78 868 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 869
cotigac 19:71b793021c78 870 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 871 {
cotigac 19:71b793021c78 872 return gErrorBusy_c;
cotigac 19:71b793021c78 873 }
cotigac 19:71b793021c78 874 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 875 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 876 lMsg.msgData.setReq.PibAttribute = gPhyPibTransmitPower_c;
cotigac 19:71b793021c78 877 lMsg.msgData.setReq.PibAttributeValue = (uint64_t) u8PaValue;
cotigac 19:71b793021c78 878 errorVal = MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 879 switch (errorVal)
cotigac 19:71b793021c78 880 {
cotigac 19:71b793021c78 881 case gPhyBusy_c:
cotigac 19:71b793021c78 882 err = gErrorBusy_c;
cotigac 19:71b793021c78 883 break;
cotigac 19:71b793021c78 884
cotigac 19:71b793021c78 885 case gPhyInvalidParameter_c:
cotigac 19:71b793021c78 886 err = gErrorOutOfRange_c;
cotigac 19:71b793021c78 887 break;
cotigac 19:71b793021c78 888
cotigac 19:71b793021c78 889 case gPhySuccess_c:
cotigac 19:71b793021c78 890 err = gErrorNoError_c;
cotigac 19:71b793021c78 891 break;
cotigac 19:71b793021c78 892
cotigac 19:71b793021c78 893 default:
cotigac 19:71b793021c78 894 err = gErrorOutOfRange_c;
cotigac 19:71b793021c78 895 break;
cotigac 19:71b793021c78 896 }
cotigac 19:71b793021c78 897
cotigac 19:71b793021c78 898 return err;
cotigac 19:71b793021c78 899 }
cotigac 19:71b793021c78 900
cotigac 19:71b793021c78 901 /************************************************************************************
cotigac 19:71b793021c78 902 * MLMEScanRequest
cotigac 19:71b793021c78 903 *
cotigac 19:71b793021c78 904 * This function returns the RSSI value of the channel passes as a parameter
cotigac 19:71b793021c78 905 *
cotigac 19:71b793021c78 906 *
cotigac 19:71b793021c78 907 ************************************************************************************/
cotigac 19:71b793021c78 908 smacErrors_t MLMEScanRequest(channels_t u8ChannelToScan)
cotigac 19:71b793021c78 909 {
cotigac 19:71b793021c78 910 smacErrors_t err = gErrorNoError_c;
cotigac 19:71b793021c78 911 phyStatus_t u8PhyRes;
cotigac 19:71b793021c78 912 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 913 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 914 {
cotigac 19:71b793021c78 915 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 916 }
cotigac 19:71b793021c78 917 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 918
cotigac 19:71b793021c78 919 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 920 {
cotigac 19:71b793021c78 921 return gErrorBusy_c;
cotigac 19:71b793021c78 922 }
cotigac 19:71b793021c78 923 if(u8ChannelToScan != MLMEGetChannelRequest())
cotigac 19:71b793021c78 924 err = MLMESetChannelRequest(u8ChannelToScan);
cotigac 19:71b793021c78 925 if(err != gErrorNoError_c)
cotigac 19:71b793021c78 926 return err;
cotigac 19:71b793021c78 927
cotigac 19:71b793021c78 928 macToPlmeMessage_t* pMsg = (macToPlmeMessage_t*)MEM_BufferAlloc(sizeof(macToPlmeMessage_t));
cotigac 19:71b793021c78 929 pMsg->msgType = gPlmeEdReq_c;
cotigac 19:71b793021c78 930 pMsg->msgData.edReq.startTime = gPhySeqStartAsap_c;
cotigac 19:71b793021c78 931 pMsg->macInstance = smacInstance;
cotigac 19:71b793021c78 932 gSmacMlmeMessage = pMsg;
cotigac 19:71b793021c78 933 u8PhyRes = MAC_PLME_SapHandler(pMsg,0);
cotigac 19:71b793021c78 934 if(u8PhyRes != gPhySuccess_c)
cotigac 19:71b793021c78 935 {
cotigac 19:71b793021c78 936 MEM_BufferFree(gSmacMlmeMessage);
cotigac 19:71b793021c78 937 gSmacMlmeMessage = NULL;
cotigac 19:71b793021c78 938 return gErrorBusy_c;
cotigac 19:71b793021c78 939 }
cotigac 19:71b793021c78 940 smacState = mSmacStateScanningChannels_c;
cotigac 19:71b793021c78 941 return gErrorNoError_c;
cotigac 19:71b793021c78 942 }
cotigac 19:71b793021c78 943
cotigac 19:71b793021c78 944
cotigac 19:71b793021c78 945 /************************************************************************************
cotigac 19:71b793021c78 946 * MLMECcaRequest
cotigac 19:71b793021c78 947 *
cotigac 19:71b793021c78 948 * This function performs Clear Channel Assessment on the active channel
cotigac 19:71b793021c78 949 *
cotigac 19:71b793021c78 950 *
cotigac 19:71b793021c78 951 ************************************************************************************/
cotigac 19:71b793021c78 952 smacErrors_t MLMECcaRequest()
cotigac 19:71b793021c78 953 {
cotigac 19:71b793021c78 954 phyStatus_t u8PhyRes;
cotigac 19:71b793021c78 955 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 956 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 957 {
cotigac 19:71b793021c78 958 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 959 }
cotigac 19:71b793021c78 960 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 961
cotigac 19:71b793021c78 962 if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 963 {
cotigac 19:71b793021c78 964 return gErrorBusy_c;
cotigac 19:71b793021c78 965 }
cotigac 19:71b793021c78 966 macToPlmeMessage_t* pMsg = (macToPlmeMessage_t*)MEM_BufferAlloc(sizeof(macToPlmeMessage_t));
cotigac 19:71b793021c78 967 pMsg->msgType = gPlmeCcaReq_c;
cotigac 19:71b793021c78 968 pMsg->msgData.ccaReq.ccaType = gPhyCCAMode1_c;
cotigac 19:71b793021c78 969 pMsg->msgData.ccaReq.contCcaMode = gPhyContCcaDisabled;
cotigac 19:71b793021c78 970 pMsg->macInstance = smacInstance;
cotigac 19:71b793021c78 971 gSmacMlmeMessage = pMsg;
cotigac 19:71b793021c78 972 u8PhyRes = MAC_PLME_SapHandler(pMsg,0);
cotigac 19:71b793021c78 973 if(u8PhyRes != gPhySuccess_c)
cotigac 19:71b793021c78 974 {
cotigac 19:71b793021c78 975 MEM_BufferFree(gSmacMlmeMessage);
cotigac 19:71b793021c78 976 gSmacMlmeMessage = NULL;
cotigac 19:71b793021c78 977 return gErrorBusy_c;
cotigac 19:71b793021c78 978 }
cotigac 19:71b793021c78 979 smacState = mSmacStatePerformingCca_c;
cotigac 19:71b793021c78 980 return gErrorNoError_c;
cotigac 19:71b793021c78 981 }
cotigac 19:71b793021c78 982 /************************************************************************************
cotigac 19:71b793021c78 983 * MLMEPhySoftReset
cotigac 19:71b793021c78 984 *
cotigac 19:71b793021c78 985 * This function performs a software reset on the radio, PHY and SMAC state machines.
cotigac 19:71b793021c78 986 *
cotigac 19:71b793021c78 987 *
cotigac 19:71b793021c78 988 ************************************************************************************/
cotigac 19:71b793021c78 989 smacErrors_t MLMEPhySoftReset
cotigac 19:71b793021c78 990 (
cotigac 19:71b793021c78 991 void
cotigac 19:71b793021c78 992 )
cotigac 19:71b793021c78 993 {
cotigac 19:71b793021c78 994 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 995 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 996 if(FALSE == mSmacInitialized)
cotigac 19:71b793021c78 997 {
cotigac 19:71b793021c78 998 return gErrorNoValidCondition_c;
cotigac 19:71b793021c78 999 }
cotigac 19:71b793021c78 1000 #endif /* TRUE == smacInitializationValidation_d */
cotigac 19:71b793021c78 1001 //
cotigac 19:71b793021c78 1002 // if(mSmacStateIdle_c != smacState)
cotigac 19:71b793021c78 1003 // {
cotigac 19:71b793021c78 1004 // return gErrorBusy_c;
cotigac 19:71b793021c78 1005 // }
cotigac 19:71b793021c78 1006 lMsg.macInstance = smacInstance;
cotigac 19:71b793021c78 1007 lMsg.msgType = gPlmeSetTRxStateReq_c;
cotigac 19:71b793021c78 1008 lMsg.msgData.setTRxStateReq.state = gPhyForceTRxOff_c;
cotigac 19:71b793021c78 1009 (void)MAC_PLME_SapHandler(&lMsg, 0);
cotigac 19:71b793021c78 1010 smacState= mSmacStateIdle_c;
cotigac 19:71b793021c78 1011
cotigac 19:71b793021c78 1012 return gErrorNoError_c;
cotigac 19:71b793021c78 1013 }
cotigac 19:71b793021c78 1014 /************************************************************************************
cotigac 19:71b793021c78 1015 * PD_SMAC_SapHandler
cotigac 19:71b793021c78 1016 *
cotigac 19:71b793021c78 1017 * This SAP handles data confirm and data indication from PHY.
cotigac 19:71b793021c78 1018 *
cotigac 19:71b793021c78 1019 ************************************************************************************/
cotigac 19:71b793021c78 1020 phyStatus_t PD_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId)
cotigac 19:71b793021c78 1021 {
cotigac 19:71b793021c78 1022 phyStatus_t status = gPhyInvalidPrimitive_c;
cotigac 19:71b793021c78 1023 smacToAppDataMessage_t* pSmacMsg;
cotigac 19:71b793021c78 1024 pdDataToMacMessage_t* pDataMsg = (pdDataToMacMessage_t*)pMsg;
cotigac 19:71b793021c78 1025 (void)smacInstanceId;
cotigac 19:71b793021c78 1026
cotigac 19:71b793021c78 1027 switch(pDataMsg->msgType)
cotigac 19:71b793021c78 1028 {
cotigac 19:71b793021c78 1029 case gPdDataCnf_c:
cotigac 19:71b793021c78 1030 //no data request was fired
cotigac 19:71b793021c78 1031 if(NULL == gSmacDataMessage)
cotigac 19:71b793021c78 1032 {
cotigac 19:71b793021c78 1033 status = gPhySuccess_c;
cotigac 19:71b793021c78 1034 }
cotigac 19:71b793021c78 1035 else
cotigac 19:71b793021c78 1036 {
cotigac 19:71b793021c78 1037 //phy finished work with the data request packet so it can be freed
cotigac 19:71b793021c78 1038 MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 1039 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 1040
cotigac 19:71b793021c78 1041 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
cotigac 19:71b793021c78 1042 if(pSmacMsg == NULL)
cotigac 19:71b793021c78 1043 {
cotigac 19:71b793021c78 1044 status = gPhySuccess_c;
cotigac 19:71b793021c78 1045 }
cotigac 19:71b793021c78 1046 else
cotigac 19:71b793021c78 1047 {
cotigac 19:71b793021c78 1048 pSmacMsg->msgType = gMcpsDataCnf_c;
cotigac 19:71b793021c78 1049 pSmacMsg->msgData.dataCnf.status = gErrorNoError_c;
cotigac 19:71b793021c78 1050 // call App Sap
cotigac 19:71b793021c78 1051 gSMAC_APP_MCPS_SapHandler(pSmacMsg,smacInstance);
cotigac 19:71b793021c78 1052 }
cotigac 19:71b793021c78 1053 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1054 }
cotigac 19:71b793021c78 1055 break;
cotigac 19:71b793021c78 1056 case gPdDataInd_c:
cotigac 19:71b793021c78 1057 if(FALSE == SMACPacketCheck(pDataMsg))
cotigac 19:71b793021c78 1058 {
cotigac 19:71b793021c78 1059 MEM_BufferFree(pDataMsg);
cotigac 19:71b793021c78 1060 status = gPhySuccess_c;
cotigac 19:71b793021c78 1061 }
cotigac 19:71b793021c78 1062 else
cotigac 19:71b793021c78 1063 {
cotigac 19:71b793021c78 1064 smacLastDataRxParams.linkQuality = ((pdDataToMacMessage_t*)pMsg)->msgData.dataInd.ppduLinkQuality;
cotigac 19:71b793021c78 1065 smacLastDataRxParams.timeStamp = (phyTime_t)((pdDataToMacMessage_t*)pMsg)->msgData.dataInd.timeStamp;
cotigac 19:71b793021c78 1066 smacProccesPacketPtr.smacRxPacketPointer->rxStatus = rxSuccessStatus_c;
cotigac 19:71b793021c78 1067
cotigac 19:71b793021c78 1068 // in case no timeout was asked we need to unset RXOnWhenIdle Pib.
cotigac 19:71b793021c78 1069 if(!mSmacTimeoutAsked)
cotigac 19:71b793021c78 1070 {
cotigac 19:71b793021c78 1071 (void)MLMERXDisableRequest();
cotigac 19:71b793021c78 1072 }
cotigac 19:71b793021c78 1073 smacProccesPacketPtr.smacRxPacketPointer->u8DataLength =
cotigac 19:71b793021c78 1074 pDataMsg->msgData.dataInd.psduLength - gSmacHeaderBytes_c;
cotigac 19:71b793021c78 1075 FLib_MemCpy(&smacProccesPacketPtr.smacRxPacketPointer->smacHeader,
cotigac 19:71b793021c78 1076 ((smacHeader_t*)pDataMsg->msgData.dataInd.pPsdu),
cotigac 19:71b793021c78 1077 gSmacHeaderBytes_c);
cotigac 19:71b793021c78 1078 FLib_MemCpy(&smacProccesPacketPtr.smacRxPacketPointer->smacPdu,
cotigac 19:71b793021c78 1079 ((smacPdu_t*)(pDataMsg->msgData.dataInd.pPsdu + gSmacHeaderBytes_c)),
cotigac 19:71b793021c78 1080 smacProccesPacketPtr.smacRxPacketPointer->u8DataLength);
cotigac 19:71b793021c78 1081
cotigac 19:71b793021c78 1082 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
cotigac 19:71b793021c78 1083 if(pSmacMsg == NULL)
cotigac 19:71b793021c78 1084 {
cotigac 19:71b793021c78 1085 status = gPhySuccess_c;
cotigac 19:71b793021c78 1086 }
cotigac 19:71b793021c78 1087 else
cotigac 19:71b793021c78 1088 {
cotigac 19:71b793021c78 1089 pSmacMsg->msgType = gMcpsDataInd_c;
cotigac 19:71b793021c78 1090 pSmacMsg->msgData.dataInd.pRxPacket = smacProccesPacketPtr.smacRxPacketPointer;
cotigac 19:71b793021c78 1091 pSmacMsg->msgData.dataInd.u8LastRxRssi = PhyGetLastRxRssiValue();
cotigac 19:71b793021c78 1092 gSMAC_APP_MCPS_SapHandler(pSmacMsg,smacInstance);
cotigac 19:71b793021c78 1093 }
cotigac 19:71b793021c78 1094 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1095 }
cotigac 19:71b793021c78 1096 break;
cotigac 19:71b793021c78 1097 default:
cotigac 19:71b793021c78 1098 break;
cotigac 19:71b793021c78 1099 }
cotigac 19:71b793021c78 1100 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 1101 return status;
cotigac 19:71b793021c78 1102 }
cotigac 19:71b793021c78 1103
cotigac 19:71b793021c78 1104 /************************************************************************************
cotigac 19:71b793021c78 1105 * PLME_SMAC_SapHandler
cotigac 19:71b793021c78 1106 *
cotigac 19:71b793021c78 1107 * This SAP handles management for confirms and indications from PHY.
cotigac 19:71b793021c78 1108 *
cotigac 19:71b793021c78 1109 ************************************************************************************/
cotigac 19:71b793021c78 1110
cotigac 19:71b793021c78 1111 phyStatus_t PLME_SMAC_SapHandler(void* pMsg, instanceId_t smacInstanceId)
cotigac 19:71b793021c78 1112 {
cotigac 19:71b793021c78 1113 MEM_BufferFree(gSmacMlmeMessage);
cotigac 19:71b793021c78 1114 gSmacMlmeMessage = NULL;
cotigac 19:71b793021c78 1115 uint32_t backOffTime;
cotigac 19:71b793021c78 1116
cotigac 19:71b793021c78 1117 plmeToMacMessage_t* pPlmeMsg = (plmeToMacMessage_t*)pMsg;
cotigac 19:71b793021c78 1118
cotigac 19:71b793021c78 1119 smacToAppMlmeMessage_t* pSmacToApp;
cotigac 19:71b793021c78 1120 smacToAppDataMessage_t* pSmacMsg;
cotigac 19:71b793021c78 1121 switch(pPlmeMsg->msgType)
cotigac 19:71b793021c78 1122 {
cotigac 19:71b793021c78 1123 case gPlmeCcaCnf_c:
cotigac 19:71b793021c78 1124 if(pPlmeMsg->msgData.ccaCnf.status == gPhyChannelBusy_c &&
cotigac 19:71b793021c78 1125 smacState == mSmacStateTransmitting_c)
cotigac 19:71b793021c78 1126 {
cotigac 19:71b793021c78 1127 if(txConfigurator.ccaBeforeTx)
cotigac 19:71b793021c78 1128 {
cotigac 19:71b793021c78 1129 if(txConfigurator.retryCountCCAFail > u8CCARetryCounter)
cotigac 19:71b793021c78 1130 {
cotigac 19:71b793021c78 1131 //increment cca fail counter
cotigac 19:71b793021c78 1132 u8CCARetryCounter++;
cotigac 19:71b793021c78 1133 //get random number for backoff time.
cotigac 19:71b793021c78 1134 RNG_GetRandomNo(&backOffTime);
cotigac 19:71b793021c78 1135 //start event timer. After time elapses, Data request will be fired.
cotigac 19:71b793021c78 1136 TMR_StartSingleShotTimer(u8BackoffTimerId, ((backOffTime & gMaxBackoffTime_c) + gMinBackoffTime_c), BackoffTimeElapsed, NULL);
cotigac 19:71b793021c78 1137 }
cotigac 19:71b793021c78 1138 else
cotigac 19:71b793021c78 1139 {
cotigac 19:71b793021c78 1140 MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 1141 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 1142
cotigac 19:71b793021c78 1143 //retries failed so create message for the application
cotigac 19:71b793021c78 1144 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
cotigac 19:71b793021c78 1145 if(pSmacMsg != NULL)
cotigac 19:71b793021c78 1146 {
cotigac 19:71b793021c78 1147 //error type : Channel Busy
cotigac 19:71b793021c78 1148 pSmacMsg->msgData.dataCnf.status = gErrorChannelBusy_c;
cotigac 19:71b793021c78 1149 //type is Data Confirm
cotigac 19:71b793021c78 1150 pSmacMsg->msgType = gMcpsDataCnf_c;
cotigac 19:71b793021c78 1151 gSMAC_APP_MCPS_SapHandler(pSmacMsg, smacInstance);
cotigac 19:71b793021c78 1152 }
cotigac 19:71b793021c78 1153 //place SMAC into idle state
cotigac 19:71b793021c78 1154 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1155 }
cotigac 19:71b793021c78 1156 }
cotigac 19:71b793021c78 1157 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 1158 return gPhySuccess_c;
cotigac 19:71b793021c78 1159 }
cotigac 19:71b793021c78 1160 //if SMAC isn't in TX then definitely it is a CCA confirm
cotigac 19:71b793021c78 1161 //allocate a message for the application
cotigac 19:71b793021c78 1162 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
cotigac 19:71b793021c78 1163 if(pSmacToApp != NULL)
cotigac 19:71b793021c78 1164 {
cotigac 19:71b793021c78 1165 //type is CCA Confirm
cotigac 19:71b793021c78 1166 pSmacToApp->msgType = gMlmeCcaCnf_c;
cotigac 19:71b793021c78 1167 //Channel status translated into SMAC messages: idle channel means no error.
cotigac 19:71b793021c78 1168 if(pPlmeMsg->msgData.ccaCnf.status == gPhyChannelIdle_c)
cotigac 19:71b793021c78 1169 {
cotigac 19:71b793021c78 1170 pSmacToApp->msgData.ccaCnf.status = gErrorNoError_c;
cotigac 19:71b793021c78 1171 }
cotigac 19:71b793021c78 1172 else
cotigac 19:71b793021c78 1173 {
cotigac 19:71b793021c78 1174 pSmacToApp->msgData.ccaCnf.status = gErrorChannelBusy_c;
cotigac 19:71b793021c78 1175 }
cotigac 19:71b793021c78 1176 }
cotigac 19:71b793021c78 1177 break;
cotigac 19:71b793021c78 1178 case gPlmeEdCnf_c:
cotigac 19:71b793021c78 1179 //allocate a message for the application
cotigac 19:71b793021c78 1180 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
cotigac 19:71b793021c78 1181 if(pSmacToApp != NULL)
cotigac 19:71b793021c78 1182 {
cotigac 19:71b793021c78 1183 //message type is ED Confirm
cotigac 19:71b793021c78 1184 pSmacToApp->msgType = gMlmeEdCnf_c;
cotigac 19:71b793021c78 1185 if(pPlmeMsg->msgData.edCnf.status == gPhySuccess_c)
cotigac 19:71b793021c78 1186 {
cotigac 19:71b793021c78 1187 pSmacToApp->msgData.edCnf.status = gErrorNoError_c;
cotigac 19:71b793021c78 1188 pSmacToApp->msgData.edCnf.energyLevel = pPlmeMsg->msgData.edCnf.energyLevel;
cotigac 19:71b793021c78 1189 pSmacToApp->msgData.edCnf.energyLeveldB = pPlmeMsg->msgData.edCnf.energyLeveldB;
cotigac 19:71b793021c78 1190 pSmacToApp->msgData.edCnf.scannedChannel = MLMEGetChannelRequest();
cotigac 19:71b793021c78 1191 }
cotigac 19:71b793021c78 1192 else
cotigac 19:71b793021c78 1193 {
cotigac 19:71b793021c78 1194 pSmacToApp->msgData.edCnf.status = gErrorBusy_c;
cotigac 19:71b793021c78 1195 }
cotigac 19:71b793021c78 1196 }
cotigac 19:71b793021c78 1197 break;
cotigac 19:71b793021c78 1198 case gPlmeTimeoutInd_c:
cotigac 19:71b793021c78 1199 if(smacState == mSmacStateTransmitting_c)
cotigac 19:71b793021c78 1200 {
cotigac 19:71b793021c78 1201 if(txConfigurator.autoAck)
cotigac 19:71b793021c78 1202 {
cotigac 19:71b793021c78 1203 //re-arm retries for channel busy at retransmission.
cotigac 19:71b793021c78 1204 u8CCARetryCounter = 0;
cotigac 19:71b793021c78 1205
cotigac 19:71b793021c78 1206 if(txConfigurator.retryCountAckFail > u8AckRetryCounter)
cotigac 19:71b793021c78 1207 {
cotigac 19:71b793021c78 1208 u8AckRetryCounter++;
cotigac 19:71b793021c78 1209
cotigac 19:71b793021c78 1210 RNG_GetRandomNo(&backOffTime);
cotigac 19:71b793021c78 1211 //start event timer. After time elapses, Data request will be fired.
cotigac 19:71b793021c78 1212 TMR_StartSingleShotTimer(u8BackoffTimerId, ((backOffTime & gMaxBackoffTime_c) + gMinBackoffTime_c), BackoffTimeElapsed, NULL);
cotigac 19:71b793021c78 1213 }
cotigac 19:71b793021c78 1214 else
cotigac 19:71b793021c78 1215 {
cotigac 19:71b793021c78 1216 (void)MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 1217 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 1218
cotigac 19:71b793021c78 1219 //retries failed so create message for the application
cotigac 19:71b793021c78 1220 pSmacMsg = (smacToAppDataMessage_t*)MEM_BufferAlloc(sizeof(smacToAppDataMessage_t));
cotigac 19:71b793021c78 1221 if(pSmacMsg != NULL)
cotigac 19:71b793021c78 1222 {
cotigac 19:71b793021c78 1223 //set error code: No Ack
cotigac 19:71b793021c78 1224 pSmacMsg->msgData.dataCnf.status = gErrorNoAck_c;
cotigac 19:71b793021c78 1225 //type is Data Confirm
cotigac 19:71b793021c78 1226 pSmacMsg->msgType = gMcpsDataCnf_c;
cotigac 19:71b793021c78 1227
cotigac 19:71b793021c78 1228 gSMAC_APP_MCPS_SapHandler(pSmacMsg, smacInstance);
cotigac 19:71b793021c78 1229 }
cotigac 19:71b793021c78 1230 //place SMAC into idle state
cotigac 19:71b793021c78 1231 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1232 }
cotigac 19:71b793021c78 1233 }
cotigac 19:71b793021c78 1234 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 1235 return gPhySuccess_c;
cotigac 19:71b793021c78 1236 }
cotigac 19:71b793021c78 1237 //if no ack timeout was received then it is definitely a RX timeout
cotigac 19:71b793021c78 1238 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
cotigac 19:71b793021c78 1239 if(pSmacToApp != NULL)
cotigac 19:71b793021c78 1240 {
cotigac 19:71b793021c78 1241 if(smacState == mSmacStateReceiving_c)
cotigac 19:71b793021c78 1242 {
cotigac 19:71b793021c78 1243 smacProccesPacketPtr.smacRxPacketPointer->rxStatus = rxTimeOutStatus_c;
cotigac 19:71b793021c78 1244 }
cotigac 19:71b793021c78 1245 pSmacToApp->msgType = gMlmeTimeoutInd_c;
cotigac 19:71b793021c78 1246 }
cotigac 19:71b793021c78 1247 break;
cotigac 19:71b793021c78 1248 case gPlme_UnexpectedRadioResetInd_c:
cotigac 19:71b793021c78 1249 pSmacToApp = (smacToAppMlmeMessage_t*)MEM_BufferAlloc(sizeof(smacToAppMlmeMessage_t));
cotigac 19:71b793021c78 1250 if(pSmacToApp != NULL)
cotigac 19:71b793021c78 1251 pSmacToApp->msgType = gMlme_UnexpectedRadioResetInd_c;
cotigac 19:71b793021c78 1252 break;
cotigac 19:71b793021c78 1253 default:
cotigac 19:71b793021c78 1254 //MEM_BufferFree(pSmacToApp);
cotigac 19:71b793021c78 1255 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 1256 return gPhySuccess_c;
cotigac 19:71b793021c78 1257 }
cotigac 19:71b793021c78 1258 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1259 //send message to upper layer if it is not NULL
cotigac 19:71b793021c78 1260 if(pSmacToApp != NULL)
cotigac 19:71b793021c78 1261 (gSMAC_APP_MLME_SapHandler)(pSmacToApp,0);
cotigac 19:71b793021c78 1262 MEM_BufferFree(pMsg);
cotigac 19:71b793021c78 1263 return gPhySuccess_c;
cotigac 19:71b793021c78 1264 }
cotigac 19:71b793021c78 1265
cotigac 19:71b793021c78 1266 /************************************************************************************
cotigac 19:71b793021c78 1267 * Smac_RegisterSapHandlers
cotigac 19:71b793021c78 1268 *
cotigac 19:71b793021c78 1269 * This function helps the user register the handlers for the messages that come from
cotigac 19:71b793021c78 1270 * SMAC.
cotigac 19:71b793021c78 1271 *
cotigac 19:71b793021c78 1272 ************************************************************************************/
cotigac 19:71b793021c78 1273
cotigac 19:71b793021c78 1274 void Smac_RegisterSapHandlers(
cotigac 19:71b793021c78 1275 SMAC_APP_MCPS_SapHandler_t pSMAC_APP_MCPS_SapHandler,
cotigac 19:71b793021c78 1276 SMAC_APP_MLME_SapHandler_t pSMAC_APP_MLME_SapHandler,
cotigac 19:71b793021c78 1277 instanceId_t smacInstanceId
cotigac 19:71b793021c78 1278 )
cotigac 19:71b793021c78 1279 {
cotigac 19:71b793021c78 1280 gSMAC_APP_MCPS_SapHandler = pSMAC_APP_MCPS_SapHandler;
cotigac 19:71b793021c78 1281 gSMAC_APP_MLME_SapHandler = pSMAC_APP_MLME_SapHandler;
cotigac 19:71b793021c78 1282 (void)smacInstanceId;
cotigac 19:71b793021c78 1283 }
cotigac 19:71b793021c78 1284
cotigac 19:71b793021c78 1285 /************************************************************************************
cotigac 19:71b793021c78 1286 * SMACFillHeader
cotigac 19:71b793021c78 1287 *
cotigac 19:71b793021c78 1288 * This function helps the user fill the SMAC header(short hardcoded MAC header) with
cotigac 19:71b793021c78 1289 * the desired short destination address.
cotigac 19:71b793021c78 1290 *
cotigac 19:71b793021c78 1291 ************************************************************************************/
cotigac 19:71b793021c78 1292
cotigac 19:71b793021c78 1293 void SMACFillHeader(smacHeader_t* pSmacHeader, uint16_t destAddr)
cotigac 19:71b793021c78 1294 {
cotigac 19:71b793021c78 1295 pSmacHeader->frameControl = gSmacDefaultFrameCtrl;
cotigac 19:71b793021c78 1296 pSmacHeader->panId = u16PanID;
cotigac 19:71b793021c78 1297 pSmacHeader->seqNo = gSmacDefaultSeqNo;
cotigac 19:71b793021c78 1298 pSmacHeader->srcAddr = u16ShortSrcAddress;
cotigac 19:71b793021c78 1299 pSmacHeader->destAddr = destAddr;
cotigac 19:71b793021c78 1300 }
cotigac 19:71b793021c78 1301
cotigac 19:71b793021c78 1302 /************************************************************************************
cotigac 19:71b793021c78 1303 * InitSmac
cotigac 19:71b793021c78 1304 *
cotigac 19:71b793021c78 1305 * Basic SMAC initialisation.
cotigac 19:71b793021c78 1306 *
cotigac 19:71b793021c78 1307 ************************************************************************************/
cotigac 19:71b793021c78 1308 void InitSmac(void)
cotigac 19:71b793021c78 1309 {
cotigac 19:71b793021c78 1310 /* SMAC Initialization */
cotigac 19:71b793021c78 1311 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1312 smacLastDataRxParams.linkQuality = 0;
cotigac 19:71b793021c78 1313 smacLastDataRxParams.timeStamp = 0;
cotigac 19:71b793021c78 1314 uint32_t u32RandomNo;
cotigac 19:71b793021c78 1315 #if defined(gPHY_802_15_4g_d)
cotigac 19:71b793021c78 1316 gTotalChannels = gPhyPib.pPIBphyRfConstants->totalNumChannels;
cotigac 19:71b793021c78 1317 #else
cotigac 19:71b793021c78 1318 gTotalChannels = 26;
cotigac 19:71b793021c78 1319 #endif
cotigac 19:71b793021c78 1320
cotigac 19:71b793021c78 1321
cotigac 19:71b793021c78 1322 #if(TRUE == smacInitializationValidation_d)
cotigac 19:71b793021c78 1323 mSmacInitialized = TRUE;
cotigac 19:71b793021c78 1324 #endif
cotigac 19:71b793021c78 1325 txConfigurator.autoAck = FALSE;
cotigac 19:71b793021c78 1326 txConfigurator.ccaBeforeTx = FALSE;
cotigac 19:71b793021c78 1327 txConfigurator.retryCountAckFail = 0;
cotigac 19:71b793021c78 1328 txConfigurator.retryCountCCAFail = 0;
cotigac 19:71b793021c78 1329 u8BackoffTimerId = (uint8_t)TMR_AllocateTimer();
cotigac 19:71b793021c78 1330 RNG_Init();
cotigac 19:71b793021c78 1331 RNG_GetRandomNo(&u32RandomNo);
cotigac 19:71b793021c78 1332 u8SmacSeqNo = (uint8_t)u32RandomNo;
cotigac 19:71b793021c78 1333 //Notify the PHY what function to call for communicating with SMAC
cotigac 19:71b793021c78 1334 Phy_RegisterSapHandlers((PD_MAC_SapHandler_t)PD_SMAC_SapHandler, (PLME_MAC_SapHandler_t)PLME_SMAC_SapHandler, 0);
cotigac 19:71b793021c78 1335 u16PanID = gDefaultPanID_c;
cotigac 19:71b793021c78 1336 u16ShortSrcAddress = gNodeAddress_c;
cotigac 19:71b793021c78 1337 (void)SMACSetShortSrcAddress(u16ShortSrcAddress);
cotigac 19:71b793021c78 1338 (void)SMACSetPanID(u16PanID);
cotigac 19:71b793021c78 1339 }
cotigac 19:71b793021c78 1340
cotigac 19:71b793021c78 1341 /************************************************************************************
cotigac 19:71b793021c78 1342 * SMACSetShortSrcAddress
cotigac 19:71b793021c78 1343 *
cotigac 19:71b793021c78 1344 * This function sets the short source address so that PHY can perform filtering
cotigac 19:71b793021c78 1345 *
cotigac 19:71b793021c78 1346 ************************************************************************************/
cotigac 19:71b793021c78 1347
cotigac 19:71b793021c78 1348 smacErrors_t SMACSetShortSrcAddress(uint16_t nwShortAddress)
cotigac 19:71b793021c78 1349 {
cotigac 19:71b793021c78 1350 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 1351 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 1352 lMsg.msgData.setReq.PibAttribute = gPhyPibShortAddress_c;
cotigac 19:71b793021c78 1353 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)nwShortAddress;
cotigac 19:71b793021c78 1354
cotigac 19:71b793021c78 1355 phyStatus_t u8PhyRes = MAC_PLME_SapHandler(&lMsg,0);
cotigac 19:71b793021c78 1356 if(u8PhyRes == gPhyBusy_c || u8PhyRes == gPhyBusyTx_c || u8PhyRes == gPhyBusyRx_c)
cotigac 19:71b793021c78 1357 return gErrorBusy_c;
cotigac 19:71b793021c78 1358 if(u8PhyRes != gPhySuccess_c)
cotigac 19:71b793021c78 1359 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 1360 u16ShortSrcAddress = nwShortAddress;
cotigac 19:71b793021c78 1361 return gErrorNoError_c;
cotigac 19:71b793021c78 1362 }
cotigac 19:71b793021c78 1363
cotigac 19:71b793021c78 1364 /************************************************************************************
cotigac 19:71b793021c78 1365 * SMACSetPanID
cotigac 19:71b793021c78 1366 *
cotigac 19:71b793021c78 1367 * This function sets the pan ID so that PHY can perform filtering
cotigac 19:71b793021c78 1368 *
cotigac 19:71b793021c78 1369 ************************************************************************************/
cotigac 19:71b793021c78 1370
cotigac 19:71b793021c78 1371 smacErrors_t SMACSetPanID(uint16_t nwShortPanID)
cotigac 19:71b793021c78 1372 {
cotigac 19:71b793021c78 1373 macToPlmeMessage_t lMsg;
cotigac 19:71b793021c78 1374 lMsg.msgType = gPlmeSetReq_c;
cotigac 19:71b793021c78 1375 lMsg.msgData.setReq.PibAttribute = gPhyPibPanId_c;
cotigac 19:71b793021c78 1376 lMsg.msgData.setReq.PibAttributeValue = (uint64_t)nwShortPanID;
cotigac 19:71b793021c78 1377
cotigac 19:71b793021c78 1378 phyStatus_t u8PhyRes = MAC_PLME_SapHandler(&lMsg,0);
cotigac 19:71b793021c78 1379 if(u8PhyRes == gPhyBusy_c || u8PhyRes == gPhyBusyTx_c || u8PhyRes == gPhyBusyRx_c)
cotigac 19:71b793021c78 1380 return gErrorBusy_c;
cotigac 19:71b793021c78 1381 if(u8PhyRes != gPhySuccess_c)
cotigac 19:71b793021c78 1382 return gErrorNoResourcesAvailable_c;
cotigac 19:71b793021c78 1383 u16PanID = nwShortPanID;
cotigac 19:71b793021c78 1384 return gErrorNoError_c;
cotigac 19:71b793021c78 1385 }
cotigac 19:71b793021c78 1386
cotigac 19:71b793021c78 1387 void BackoffTimeElapsed(void const *arg)
cotigac 19:71b793021c78 1388 {
cotigac 19:71b793021c78 1389 uint8_t u8PhyRes = MAC_PD_SapHandler(gSmacDataMessage, 0);
cotigac 19:71b793021c78 1390 if(u8PhyRes != gPhySuccess_c)
cotigac 19:71b793021c78 1391 {
cotigac 19:71b793021c78 1392 smacState = mSmacStateIdle_c;
cotigac 19:71b793021c78 1393 MEM_BufferFree(gSmacDataMessage);
cotigac 19:71b793021c78 1394 gSmacDataMessage = NULL;
cotigac 19:71b793021c78 1395 }
cotigac 19:71b793021c78 1396 }
cotigac 19:71b793021c78 1397
cotigac 19:71b793021c78 1398 /************************************************************************************
cotigac 19:71b793021c78 1399 * SMACPacketCheck
cotigac 19:71b793021c78 1400 *
cotigac 19:71b793021c78 1401 * This function returns TRUE if Phy payload can be of SMAC packet type
cotigac 19:71b793021c78 1402 *
cotigac 19:71b793021c78 1403 ************************************************************************************/
cotigac 19:71b793021c78 1404
cotigac 19:71b793021c78 1405 bool_t SMACPacketCheck(pdDataToMacMessage_t* pMsgFromPhy)
cotigac 19:71b793021c78 1406 {
cotigac 19:71b793021c78 1407 //check if packet is of type Data
cotigac 19:71b793021c78 1408 if( (pMsgFromPhy->msgData.dataInd.pPsdu[0] & 0x07) != 0x01 )
cotigac 19:71b793021c78 1409 return FALSE;
cotigac 19:71b793021c78 1410 //check if PSDU length is at least of smac header size.
cotigac 19:71b793021c78 1411 if( (pMsgFromPhy->msgData.dataInd.psduLength < gSmacHeaderBytes_c) )
cotigac 19:71b793021c78 1412 return FALSE;
cotigac 19:71b793021c78 1413
cotigac 19:71b793021c78 1414 return TRUE;
cotigac 19:71b793021c78 1415 }