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:
cotigac
Date:
Sat Apr 04 22:14:14 2015 +0000
Revision:
19:71b793021c78
Child:
23:6f13fea3cace
Added SMAC code

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