Thread
Dependencies: fsl_phy_mcr20a fsl_smac mbed-rtos mbed
Fork of mcr20_connectivity_test_FRDMk64f by
Diff: Source/Connectivity_TestApp.cpp
- Revision:
- 0:4eb2240dbd22
- Child:
- 1:1eb1eccc81c2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Connectivity_TestApp.cpp Thu Jul 16 07:29:15 2015 +0000 @@ -0,0 +1,2537 @@ +/*! +* Copyright (c) 2015, Freescale Semiconductor, Inc. +* All rights reserved. +* +* \file Connectivity_TestApp.c +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* o Redistributions of source code must retain the above copyright notice, this list +* of conditions and the following disclaimer. +* +* o Redistributions in binary form must reproduce the above copyright notice, this +* list of conditions and the following disclaimer in the documentation and/or +* other materials provided with the distribution. +* +* o Neither the name of Freescale Semiconductor, Inc. nor the names of its +* contributors may be used to endorse or promote products derived from this +* software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/************************************************************************************ +************************************************************************************* +* Include +************************************************************************************* +************************************************************************************/ + +#include "Application_Interface.h" +#include "Connectivity_Test_Platform.h" +/************************************************************************************ +************************************************************************************* +* Private type definitions +************************************************************************************* +************************************************************************************/ + +/************************************************************************************ +************************************************************************************* +* Macros +************************************************************************************* +************************************************************************************/ +#define gPrbs9BufferLength_c ( 65 ) +#define gContTxModSelectPN9_c ( 2 ) +#define gContTxModSelectOnes_c ( 1 ) +#define gContTxModSelectZeros_c ( 0 ) +#define SelfNotificationEvent() mainTask->signal_set(gCTSelf_EVENT_c); + +#define gUART_RX_EVENT_c (1<<0) +#define gMcps_Cnf_EVENT_c (1<<1) +#define gMcps_Ind_EVENT_c (1<<2) +#define gMlme_EdCnf_EVENT_c (1<<3) +#define gMlme_CcaCnf_EVENT_c (1<<4) +#define gMlme_TimeoutInd_EVENT_c (1<<5) +#define gRangeTest_EVENT_c (1<<6) +#define gCTSelf_EVENT_c (1<<7) +#define gTimePassed_EVENT_c (1<<8) + +#define gEventsAll_c (gUART_RX_EVENT_c | gMcps_Ind_EVENT_c | gMcps_Cnf_EVENT_c | \ + gMlme_TimeoutInd_EVENT_c | gMlme_EdCnf_EVENT_c | gMlme_CcaCnf_EVENT_c | \ + gRangeTest_EVENT_c | gCTSelf_EVENT_c | gTimePassed_EVENT_c) + +#define Delay_ms(a) +#define FlaggedDelay_ms(a) TMR_StartSingleShotTimer(AppDelayTmr, a, DelayTimeElapsed, NULL) + +#ifdef gPHY_802_15_4g_d +#define GetTimestampUS() PhyTime_GetTimestampUs() +#define GetTransmissionTime(payload, bitrate) ((((gPhyFSKPreambleLength_c + \ + gPhyMRFSKPHRLength_c + gPhyMRFSKSFDLength_c + \ + sizeof(smacHeader_t) + payload + gPhyFCSSize_c )*8000 )/ bitrate)) +#else +#define GetTimestampUS() (16*PhyTime_GetTimestamp()) +#define GetTransmissionTime(payload, bitrate) (((6 + sizeof(smacHeader_t) + payload + 2)*32)) +//bitrate is fixed for 2.4 GHz +#define crtBitrate (0) +#endif +/************************************************************************************ +************************************************************************************* +* Public memory declarations +************************************************************************************* +************************************************************************************/ + +uint32_t gTaskEventFlags; + +/*smac related variables*/ +bool_t bTxDone; +bool_t bRxDone; +bool_t bScanDone; +bool_t gCCaGotResult; +bool_t gIsChannelIdle; +bool_t bEdDone; +bool_t failedPRBS9; +uint8_t u8LastRxRssiValue; +bool_t evTestParameters; +uint8_t au8ScanResults[129]; + +/*serial manager related variables*/ +uint8_t gu8UartData; +bool_t evDataFromUART; +uint8_t mAppSer; + +/*connectivity test state machine variables*/ +operationModes_t testOpMode; +operationModes_t prevOpMode; + +channels_t testChannel; +uint8_t testPower; +uint8_t testPayloadLen; +uint8_t contTxModBitValue; +uint8_t ccaThresh; +bool_t shortCutsEnabled; +ConnectivityStates_t connState; +ContinuousTxRxTestStates_t cTxRxState; +PerTxStates_t perTxState; +PerRxStates_t perRxState; +RangeTxStates_t rangeTxState; +RangeRxStates_t rangeRxState; +EditRegsStates_t eRState; +oRStates_t oRState; +rRStates_t rRState; +dRStates_t dRState; +CSenseTCtrlStates_t cstcState; +uint8_t ChannelToScan; +smacTestMode_t contTestRunning; + +/*asp related variables*/ +AppToAspMessage_t aspTestRequestMsg; + +extern uint8_t u8Prbs9Buffer[gPrbs9BufferLength_c]; + +Serial uart(USBTX,USBRX); +Thread *mainTask; + +/************************************************************************************ +************************************************************************************* +* Private memory declarations +************************************************************************************* +************************************************************************************/ +static uint8_t gau8RxDataBuffer[gMaxSmacSDULength_c + sizeof(txPacket_t)]; +static uint8_t gau8TxDataBuffer[gMaxSmacSDULength_c + sizeof(rxPacket_t)]; + +static txPacket_t * gAppTxPacket; +static rxPacket_t * gAppRxPacket; + +static uint8_t timePassed; +Timeout RangeTestTmr; +Timer AppDelayTmr; +/************************************************************************************ +************************************************************************************* +* Private prototypes +************************************************************************************* +************************************************************************************/ +#if CT_Feature_Calibration +extern void StoreTrimValueToFlash (uint32_t trimValue, CalibrationOptionSelect_t option); +#endif + +/*platform independent functions*/ +static void SerialUIStateMachine(void); +static bool_t SerialContinuousTxRxTest(void); +static bool_t PacketErrorRateTx(void); +static bool_t PacketErrorRateRx(void); +static void SetRadioRxOnNoTimeOut(void); +static void HandleEvents(int32_t evSignals); +static void PrintTestParameters(bool_t bEraseLine); + +static void PrintPerRxFinalLine(uint16_t u16Received, uint16_t u16Total); +extern uint32_t HexString2Dec(uint8_t * au8String); +static bool_t stringComp(uint8_t * au8leftString, uint8_t * au8RightString, uint8_t bytesToCompare); +/********************************/ + +static void RangeTest_Timer_CallBack (); +static bool_t RangeTx(void); +static bool_t RangeRx(void); + +static bool_t EditRegisters(void); +#if CT_Feature_Direct_Registers || CT_Feature_Indirect_Registers +bool_t OverrideRegisters(void); +bool_t ReadRegisters(void); +bool_t DumpRegisters(void); +bool_t bIsRegisterDirect = TRUE; +#endif + +static bool_t CSenseAndTCtrl(void); +static void TransmissionControlHandler(void); +static void CarrierSenseHandler(void); +static smacErrors_t TestMode ( smacTestMode_t mode); +static void PacketHandler_Prbs9(void); +static void DelayTimeElapsed(); +static void IncrementChannelOnEdEvent(); +extern void ReadRFRegs(registerAddressSize_t, registerAddressSize_t); +extern void PrintTestParameters(bool_t bEraseLine); + +/*************************************/ +/************************************************************************************ +************************************************************************************* +* Public functions +************************************************************************************* +************************************************************************************/ +void InitProject(void); +void InitSmac(void); +void main_task(void const *argument); +extern void ResetMCU(void); +void UartRxCallBack(void * param); +void PrintMenu(char * const pu8Menu[], uint8_t port); + +/************************************************************************************ +* +* InitProject +* +************************************************************************************/ +void InitProject(void) +{ + /*Global Data init*/ + testPayloadLen = gMaxSmacSDULength_c; + + testOpMode = gDefaultOperationMode_c; + testChannel = gDefaultChannelNumber_c; + testPower = gDefaultOutputPower_c; + testPayloadLen = gDefaultPayload_c; + contTestRunning = gTestModeForceIdle_c; + shortCutsEnabled = FALSE; + connState = gConnInitState_c; + cTxRxState = gCTxRxStateInit_c; + perTxState = gPerTxStateInit_c; + perRxState = gPerRxStateInit_c; + rangeTxState = gRangeTxStateInit_c; + rangeRxState = gRangeRxStateInit_c; + prevOpMode = gDefaultOperationMode_c; + oRState = gORStateInit_c; + rRState = gRRStateInit_c; + dRState = gDRStateInit_c; + ccaThresh = gDefaultCCAThreshold_c; + bEdDone = FALSE; + evDataFromUART = FALSE; + + InitProject_custom(); +} + +/************************************************************************************ +************************************************************************************* +* SAP functions +************************************************************************************* +************************************************************************************/ + +//(Management) Sap handler for managing timeout indication and ED confirm +smacErrors_t smacToAppMlmeSap(smacToAppMlmeMessage_t* pMsg, instanceId_t instance) +{ + switch(pMsg->msgType) + { + case gMlmeEdCnf_c: + au8ScanResults[pMsg->msgData.edCnf.scannedChannel] = pMsg->msgData.edCnf.energyLeveldB; + gTaskEventFlags |= gMlme_EdCnf_EVENT_c; + break; + case gMlmeCcaCnf_c: + gTaskEventFlags |= gMlme_CcaCnf_EVENT_c; + if(pMsg->msgData.ccaCnf.status == gErrorNoError_c) + gIsChannelIdle = TRUE; + else + gIsChannelIdle = FALSE; + break; + case gMlmeTimeoutInd_c: + gTaskEventFlags |= gMlme_TimeoutInd_EVENT_c; + break; + default: + break; + } + MEM_BufferFree(pMsg); + return gErrorNoError_c; +} +//(Data) Sap handler for managing data confirm and data indication +smacErrors_t smacToAppMcpsSap(smacToAppDataMessage_t* pMsg, instanceId_t instance) +{ + switch(pMsg->msgType) + { + case gMcpsDataInd_c: + if(pMsg->msgData.dataInd.pRxPacket->rxStatus == rxSuccessStatus_c) + { + u8LastRxRssiValue = pMsg->msgData.dataInd.u8LastRxRssi; + gTaskEventFlags |= gMcps_Ind_EVENT_c; + } + break; + case gMcpsDataCnf_c: + if(pMsg->msgData.dataCnf.status == gErrorNoError_c) + { + gTaskEventFlags |= gMcps_Cnf_EVENT_c; + + } + break; + default: + break; + } + + MEM_BufferFree(pMsg); + return gErrorNoError_c; +} + +static void HandleEvents(int32_t evSignals) +{ + if(evSignals & gUART_RX_EVENT_c) + { + if(shortCutsEnabled) + { + ShortCutsParser(gu8UartData); + } + else + { + evDataFromUART = TRUE; + } + } + if(evSignals & gMcps_Cnf_EVENT_c) + { + bTxDone = TRUE; + } + if(evSignals & gMcps_Ind_EVENT_c) + { + bRxDone = TRUE; + } + if(evSignals & gMlme_TimeoutInd_EVENT_c) + { + } + if(evSignals & gRangeTest_EVENT_c) + { + bRxDone=TRUE; + } + if(evSignals & gMlme_EdCnf_EVENT_c) + { + if (cTxRxState == gCTxRxStateRunnigScanTest_c) + { + IncrementChannelOnEdEvent(); + } + if (cTxRxState == gCTxRxStateRunnigEdTest_c) + { + cTxRxState = gCTxRxStateRunningEdTestGotResult_c; + } + if (connState == gConnCSenseAndTCtrl_c) + { + bScanDone = TRUE; + } + bEdDone = TRUE; + } + if(evSignals & gMlme_CcaCnf_EVENT_c) + { + gCCaGotResult = TRUE; + uart.printf("Channel %d is", (uint32_t)testChannel); + if(gIsChannelIdle) + uart.printf("Idle\r\n"); + else + uart.printf("Busy\r\n"); + } + if(evSignals & gCTSelf_EVENT_c) + { + } +} + + +/*************************************************************************/ +/*Main Task: Application entry point*/ +/*************************************************************************/ +void main_task(void const *argument) +{ + static bool_t bIsInitialized = FALSE; + static bool_t bUserInteraction = FALSE; + //Initialize Memory Manager, Timer Manager and LEDs. + if( !bIsInitialized ) + { + + MEM_Init(); + //initialize PHY + Phy_Init(); + + InitApp(); + + /*Prints the Welcome screens in the terminal*/ + PrintMenu(cu8FreescaleLogo, mAppSer); + + connState = gConnIdleState_c; + bIsInitialized = TRUE; + } + if(!bUserInteraction) + { + while(1) + { + //(void)OSA_EventWait(&gTaskEvent, gEventsAll_c, FALSE, OSA_WAIT_FOREVER ,&gTaskEventFlags); + Thread::signal_wait(gEventsAll_c); + if(gTaskEventFlags & gUART_RX_EVENT_c) + { + if(gu8UartData == '\r') + { + SelfNotificationEvent(); + bUserInteraction = TRUE; + break; + } + else + { + PrintMenu(cu8FreescaleLogo, mAppSer); + } + } + } + } + if(bUserInteraction) + { + while(1) + { + //(void)OSA_EventWait(&gTaskEvent, gEventsAll_c, FALSE, OSA_WAIT_FOREVER ,&gTaskEventFlags); + Thread::signal_wait(gEventsAll_c); + HandleEvents(gTaskEventFlags); + SerialUIStateMachine(); + } + } +} + +/*************************************************************************/ +/*InitApp: Initializes application mdoules and data*/ +/*************************************************************************/ +void InitApp() +{ + + gAppTxPacket = (txPacket_t*)gau8TxDataBuffer; //Map TX packet to buffer + gAppRxPacket = (rxPacket_t*)gau8RxDataBuffer; //Map Rx packet to buffer + gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + + uart.baud(115200); + + //Initialise SMAC + InitSmac(); + //Tell SMAC who to call when it needs to pass a message to the application thread. + Smac_RegisterSapHandlers((SMAC_APP_MCPS_SapHandler_t)smacToAppMcpsSap,(SMAC_APP_MLME_SapHandler_t)smacToAppMlmeSap,0); + + InitProject(); + + InitApp_custom(); + + ASP_Init(0, mAppSer); + + SMACFillHeader(&(gAppTxPacket->smacHeader), gBroadcastAddress_c); //@CMA, Conn Test. Start with broadcast address default + (void)MLMEPAOutputAdjust(testPower); + (void)MLMESetChannelRequest(testChannel); //@CMA, Conn Test. Start Foperation at default channel +} + +/************************************************************************************ +* +* Connectivity Test State Machine +* +************************************************************************************/ +void SerialUIStateMachine(void) +{ + if((gConnSelectTest_c == connState) && evTestParameters) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + switch(connState) + { + case gConnIdleState_c: + PrintMenu(cu8MainMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + connState = gConnSelectTest_c; + break; + case gConnSelectTest_c: + if(evDataFromUART){ + if('1' == gu8UartData) + { + cTxRxState = gCTxRxStateInit_c; + connState = gConnContinuousTxRxState_c; + } + else if('2' == gu8UartData) + { + perTxState = gPerTxStateInit_c; + perRxState = gPerRxStateInit_c; + connState = gConnPerState_c; + } + else if('3' == gu8UartData) + { + rangeTxState = gRangeTxStateInit_c; + rangeRxState = gRangeRxStateInit_c; + connState = gConnRangeState_c; + } + else if('4' == gu8UartData) + { + cstcState = gCsTcStateInit_c; + connState = gConnCSenseAndTCtrl_c; + } +#if CT_Feature_Direct_Registers || CT_Feature_Indirect_Registers + else if('5' == gu8UartData) + { + eRState = gERStateInit_c; + connState = gConnRegEditState_c; + } +#endif +#if CT_Feature_Bitrate_Select + else if('6' == gu8UartData) + { + bsState = gBSStateInit_c; + connState = gConnBitrateSelectState_c; + } +#endif +#if CT_Feature_Calibration + else if('7' == gu8UartData) + { + connState = gConnEDMeasCalib_c; + edCalState= gEdCalStateInit_c; + } +#endif + else if('!' == gu8UartData) + { + ResetMCU(); + } + evDataFromUART = FALSE; + SelfNotificationEvent(); + } + break; + case gConnContinuousTxRxState_c: + if(SerialContinuousTxRxTest()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + break; + case gConnPerState_c: + if(mTxOperation_c == testOpMode) + { + if(PacketErrorRateTx()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + } + else + { + if(PacketErrorRateRx()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + } + break; + case gConnRangeState_c: + if(mTxOperation_c == testOpMode) + { + if(RangeTx()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + } + else + { + if(RangeRx()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + } + break; + case gConnRegEditState_c: + if(EditRegisters()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + break; +#if CT_Feature_Bitrate_Select + case gConnBitrateSelectState_c: + if(Bitrate_Select()) + { + connState = gConnIdleState_c; + } + break; +#endif + case gConnCSenseAndTCtrl_c: + if(CSenseAndTCtrl()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + break; +#if CT_Feature_Calibration + case gConnEDMeasCalib_c: + if(EDCalibrationMeasurement()) + { + connState = gConnIdleState_c; + SelfNotificationEvent(); + } + break; +#endif + default: + break; + + } + if(prevOpMode != testOpMode) + { + perTxState = gPerTxStateInit_c; + perRxState = gPerRxStateInit_c; + rangeTxState = gRangeTxStateInit_c; + rangeRxState = gRangeRxStateInit_c; + prevOpMode = testOpMode; + SelfNotificationEvent(); + } +} + +/************************************************************************************ +* +* Continuous Tests State Machine +* +************************************************************************************/ +bool_t SerialContinuousTxRxTest(void) +{ + bool_t bBackFlag = FALSE; + uint8_t u8Index, u8TempEnergyValue, u8TempScanValue; + + if(evTestParameters) + { + (void)TestMode(gTestModeForceIdle_c); +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + + if(gTestModePRBS9_c == contTestRunning) + { + cTxRxState = gCTxRxStateRunningPRBS9Test_c; + } + (void)TestMode(contTestRunning); + + if(gCTxRxStateSelectTest_c == cTxRxState) + { + PrintTestParameters(TRUE); + } + else + { + PrintTestParameters(FALSE); + uart.printf("\r\n"); + } + + if(gCTxRxStateRunnigRxTest_c == cTxRxState) + { + bRxDone = FALSE; + gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + (void)MLMERXEnableRequest(gAppRxPacket, 0); + } + evTestParameters = FALSE; + } + + switch(cTxRxState) + { + case gCTxRxStateIdle_c: + if((evDataFromUART) && ('\r' == gu8UartData)) + { + cTxRxState = gCTxRxStateInit_c; + evDataFromUART = FALSE; + SelfNotificationEvent(); + } + break; + case gCTxRxStateInit_c: + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8ContinuousTestMenu, mAppSer); + //Phy in StandBy, smacstate in Idle. + (void)TestMode(gTestModeForceIdle_c); + while(MLMESetChannelRequest(testChannel)); + uart.printf(cu8ContinuousTestTags[contTestRunning]); + if(contTestRunning == gTestModeContinuousTxModulated_c) + { + uart.printf(cu8TxModTestTags[contTxModBitValue]); + } + (void)TestMode(contTestRunning); + uart.printf("\r\n\r\n"); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + cTxRxState = gCTxRxStateSelectTest_c; + break; + case gCTxRxStateSelectTest_c: + if(evDataFromUART) + { + if('1' == gu8UartData) + { + contTestRunning = gTestModeForceIdle_c; + cTxRxState = gCTxRxStateInit_c; + SelfNotificationEvent(); + } + else if('2' == gu8UartData) + { + shortCutsEnabled = FALSE; + (void)TestMode(gTestModeForceIdle_c); + contTestRunning = gTestModePRBS9_c; + MLMESetChannelRequest(testChannel); + uart.printf("\f\r\nPress [p] to stop the Continuous PRBS9 test\r\n"); + (void)TestMode(contTestRunning); + cTxRxState = gCTxRxStateRunningPRBS9Test_c; + } + else if('3' == gu8UartData) + { + contTestRunning = gTestModeContinuousTxModulated_c; + cTxRxState = gCTxRxStateRunningTXModSelectOpt; + // uart.printf( "\f\r\n To use this mode shunt pins 3-4 on J18"); + uart.printf("\f\r\nPress 2 for PN9, 1 to modulate values of 1 and 0 to modulate values of 0"); + + } + else if('4' == gu8UartData) + { + if(gTestModeContinuousTxUnmodulated_c != contTestRunning) + { + contTestRunning = gTestModeContinuousTxUnmodulated_c; + cTxRxState = gCTxRxStateInit_c; + SelfNotificationEvent(); + } + } + else if('5' == gu8UartData) + { + shortCutsEnabled = FALSE; + (void)TestMode(gTestModeForceIdle_c); + MLMESetChannelRequest(testChannel); + contTestRunning = gTestModeForceIdle_c; + uart.printf("\f\r\nPress [p] to stop receiving broadcast packets \r\n"); + bRxDone = FALSE; + gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + (void)MLMERXEnableRequest(gAppRxPacket, 0); + cTxRxState = gCTxRxStateRunnigRxTest_c; + } + else if('6' == gu8UartData) + { + (void)TestMode(gTestModeForceIdle_c); + contTestRunning = gTestModeForceIdle_c; + uart.printf("\f\r\nPress [p] to stop the Continuous ED test\r\n"); + cTxRxState = gCTxRxStateRunnigEdTest_c; + Thread::wait(200); + } + else if('7' == gu8UartData) + { + (void)TestMode(gTestModeForceIdle_c); + contTestRunning = gTestModeForceIdle_c; + ChannelToScan= gDefaultChannelNumber_c; + uart.printf("\f\r\nPress [p] to stop the Continuous SCAN test\r\n"); + bScanDone = FALSE; + cTxRxState = gCTxRxStateRunnigScanTest_c; + SelfNotificationEvent(); + } + else if('8' == gu8UartData) + { + (void)TestMode(gTestModeForceIdle_c); + uart.printf("\f\r\nPress [p] to stop the Continuous CCA test\r\n"); + contTestRunning = gTestModeForceIdle_c; + cTxRxState = gCTxRxStateRunnigCcaTest_c; + Thread::wait(100); + MLMECcaRequest(); + } +#if CT_Feature_BER_Test + else if ('9' == gu8UartData) + { + uart.printf( "\f\r\nPress [p] to stop the Continuous BER test\r\n"); + contTestRunning = gTestModeContinuousRxBER_c; + cTxRxState = gCTxRxStateInit_c; + SelfNotificationEvent(); + } +#endif + else if('p' == gu8UartData) + { + (void)TestMode(gTestModeForceIdle_c); + (void)MLMESetChannelRequest(testChannel); + AppDelayTmr.stop(); + timePassed = FALSE; + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + case gCTxRxStateRunningTXModSelectOpt: + if(evDataFromUART) + { + if(gu8UartData == '2') + contTxModBitValue = gContTxModSelectPN9_c; + else + if(gu8UartData == '1') + contTxModBitValue = gContTxModSelectOnes_c; + else + if(gu8UartData == '0') + contTxModBitValue = gContTxModSelectZeros_c; + + evDataFromUART = FALSE; + cTxRxState = gCTxRxStateInit_c; + SelfNotificationEvent(); + } + break; + case gCTxRxStateRunningPRBS9Test_c: + if(bTxDone || failedPRBS9) + { + failedPRBS9 = FALSE; + bTxDone = FALSE; + PacketHandler_Prbs9(); + } + if(evDataFromUART && 'p' == gu8UartData) + { + contTestRunning = gTestModeForceIdle_c; + (void)TestMode(gTestModeForceIdle_c); + (void)MLMESetChannelRequest(testChannel); + AppDelayTmr.stop(); + timePassed = FALSE; + uart.printf("\r\n\r\n Press [enter] to go back to the Continuous test menu "); + cTxRxState = gCTxRxStateIdle_c; + evDataFromUART = FALSE; + shortCutsEnabled = TRUE; + } + break; + case gCTxRxStateRunnigRxTest_c: + if(bRxDone) + { + if (gAppRxPacket->rxStatus == rxSuccessStatus_c) + { + uart.printf("New Packet: "); + for(u8Index = 0; u8Index < (gAppRxPacket->u8DataLength); u8Index++){ + uart.printf( (const char *)(&(gAppRxPacket->smacPdu.smacPdu[u8Index]))); + } + uart.printf(" \r\n"); + } + bRxDone = FALSE; + gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + (void)MLMERXEnableRequest(gAppRxPacket, 0); + } + if((evDataFromUART) && ('p' == gu8UartData)) + { + (void)MLMERXDisableRequest(); + (void)TestMode(gTestModeForceIdle_c); + uart.printf("\r\n\r\n Press [enter] to go back to the Continuous test menu "); + cTxRxState = gCTxRxStateIdle_c; + evDataFromUART = FALSE; + } + break; + case gCTxRxStateRunnigEdTest_c: + if(timePassed) + { + timePassed = FALSE; + Thread::wait(100); + MLMEScanRequest(testChannel); + } + if((evDataFromUART) && ('p' == gu8UartData)) + { + uart.printf("\r\n\r\n Press [enter] to go back to the Continuous test menu "); + cTxRxState = gCTxRxStateIdle_c; + evDataFromUART = FALSE; + timePassed = FALSE; + AppDelayTmr.stop(); + } + + break; + case gCTxRxStateRunningEdTestGotResult_c: + uart.printf("Energy on the Channel %d : ", (uint32_t)testChannel); + u8TempEnergyValue = au8ScanResults[testChannel]; + if(u8TempEnergyValue != 0) + uart.printf( "-"); + uart.printf("%d dBm\r\n ",(uint32_t)u8TempEnergyValue); + cTxRxState = gCTxRxStateRunnigEdTest_c; + break; + case gCTxRxStateRunnigCcaTest_c: + if(timePassed && gCCaGotResult) + { + gCCaGotResult = FALSE; + timePassed = FALSE; + MLMECcaRequest(); + Thread::wait(100); + } + if((evDataFromUART) && ('p' == gu8UartData)) + { + uart.printf("\r\n\r\n Press [enter] to go back to the Continuous test menu "); + cTxRxState = gCTxRxStateIdle_c; + evDataFromUART = FALSE; + timePassed = FALSE; + AppDelayTmr.stop(); + } + break; + case gCTxRxStateRunnigScanTest_c: + if(bScanDone && timePassed) + { + //Enters here until all channels have been scanned. Then starts to print. + uart.printf("Results : "); + for(u8Index = gMinChannel_c; u8Index <= gMaxChannel_c ; u8Index++) + { + u8TempScanValue= au8ScanResults[u8Index]; + if(u8TempScanValue != 0) + uart.printf("-"); + uart.printf("%d, ", (uint32_t) u8TempScanValue); + } + uart.printf("\b \r\n"); + bScanDone = FALSE; + ChannelToScan = gDefaultChannelNumber_c; // Restart channel count + timePassed = FALSE; + } + + if((evDataFromUART) && ('p' == gu8UartData)) + { + uart.printf("\r\n\r\n Press [enter] to go back to the Continuous test menu "); + cTxRxState = gCTxRxStateIdle_c; + evDataFromUART = FALSE; + } + else + { + if(ChannelToScan == gDefaultChannelNumber_c) + { + smacErrors_t err = MLMEScanRequest((channels_t)ChannelToScan); + if(err == gErrorNoError_c) + ChannelToScan++; + } + //Each of the other channels is scanned after SMAC notifies us that + //it has obtained the energy value on the currently scanned channel + //(channel scanning is performed asynchronously). See IncrementChannelOnEdEvent(). + } + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* PER Handler for board that is performing TX +* +************************************************************************************/ +bool_t PacketErrorRateTx(void) +{ + const uint16_t u16TotalPacketsOptions[] = {1,25,100,500,1000,2000,5000,10000,65535}; + static uint16_t u16TotalPackets; + static uint16_t u16SentPackets; + static uint32_t miliSecDelay; + static uint32_t u32MinDelay = 4; + uint8_t u8Index; + bool_t bBackFlag = FALSE; + + if(evTestParameters) + { + (void)MLMERXDisableRequest(); +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + + switch(perTxState) + { + case gPerTxStateInit_c: + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8PerTxTestMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + perTxState = gPerTxStateSelectPacketNum_c; + miliSecDelay = 0; + u32MinDelay = 4; + (void)MLMERXDisableRequest(); + break; + case gPerTxStateSelectPacketNum_c: + if(evDataFromUART) + { + if((gu8UartData >= '0') && (gu8UartData <= '8')) + { + u16TotalPackets = u16TotalPacketsOptions[gu8UartData - '0']; + shortCutsEnabled = FALSE; + u32MinDelay += (GetTransmissionTime(testPayloadLen, crtBitrate) / 1000); + uart.printf("\r\n\r\n Please type TX interval in miliseconds ( > %d ms ) and press [ENTER]\r\n", u32MinDelay); + perTxState = gPerTxStateInputPacketDelay_c; + } + else if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + case gPerTxStateInputPacketDelay_c: + if(evDataFromUART) + { + if(gu8UartData == '\r') + { + if(miliSecDelay < u32MinDelay) + { + uart.printf("\r\n\tError: TX Interval too small\r\n"); + perTxState = gPerTxStateInit_c; + SelfNotificationEvent(); + } + else + { + perTxState = gPerTxStateStartTest_c; + SelfNotificationEvent(); + } + } + else if((gu8UartData >= '0') && (gu8UartData <='9')) + { + miliSecDelay = miliSecDelay*10 + (gu8UartData - '0'); + uart.printf("%d", (uint32_t)(gu8UartData - '0')); + } + else if('p' == gu8UartData) + { + perTxState = gPerTxStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + case gPerTxStateStartTest_c: + gAppTxPacket->u8DataLength = testPayloadLen; + u16SentPackets = 0; + + gAppTxPacket->smacPdu.smacPdu[0] = (u16TotalPackets >> 8); + gAppTxPacket->smacPdu.smacPdu[1] = (uint8_t)u16TotalPackets; + gAppTxPacket->smacPdu.smacPdu[2] = ((u16SentPackets+1) >> 8); + gAppTxPacket->smacPdu.smacPdu[3] = (uint8_t)(u16SentPackets+1); + FLib_MemCpy(&(gAppTxPacket->smacPdu.smacPdu[4]), (void*)"SMAC PER Demo",13); + if(17 < testPayloadLen) + { + for(u8Index=17;u8Index<testPayloadLen;u8Index++) + { + gAppTxPacket->smacPdu.smacPdu[u8Index] = (u8Index%10)+'0'; + } + } + bTxDone = FALSE; + (void)MCPSDataRequest(gAppTxPacket); + u16SentPackets++; + uart.printf("\f\r\n Running PER Tx, Sending %d Packets",(uint32_t)u16TotalPackets); + perTxState = gPerTxStateRunningTest_c; + Thread::wait(miliSecDelay); + break; + case gPerTxStateRunningTest_c: + if(bTxDone && timePassed) + { + uart.printf("\r\n Packet %d ",(uint32_t)u16SentPackets); + if(u16SentPackets == u16TotalPackets) + { + uart.printf("\r\n\r\nSending last %d frames \r\n",(uint32_t)mTotalFinalFrames_c); + FLib_MemCpy(&(gAppTxPacket->smacPdu.smacPdu[4]), (void *)"DONE",4); + gAppTxPacket->u8DataLength = 8; + u16SentPackets = 0; + u16TotalPackets = mTotalFinalFrames_c; + gAppTxPacket->u8DataLength = 8; + perTxState = gPerTxStateSendingLastFrames_c; + } + else + { + gAppTxPacket->smacPdu.smacPdu[2] = ((u16SentPackets+1) >> 8); + gAppTxPacket->smacPdu.smacPdu[3] = (uint8_t)(u16SentPackets+1); + gAppTxPacket->u8DataLength = testPayloadLen; + } + bTxDone = FALSE; + (void)MCPSDataRequest(gAppTxPacket); + u16SentPackets++; + timePassed = FALSE; + Thread::wait(miliSecDelay); + } + if(evDataFromUART && gu8UartData == ' ') + { + uart.printf("\r\n\r\n-Test interrupted by user. Press [ENTER] to continue\r\n\r\n"); + perTxState = gPerTxStateIdle_c; + } + break; + case gPerTxStateSendingLastFrames_c: + if(bTxDone && timePassed) + { + bTxDone = FALSE; + timePassed = FALSE; + uart.printf("\r\n Final Packet %d",(uint32_t)u16SentPackets); + if(u16SentPackets == u16TotalPackets) + { + uart.printf( "\r\n PER Tx DONE \r\n"); + uart.printf( "\r\n\r\n Press [enter] to go back to the PER Tx test menu "); + perTxState = gPerTxStateIdle_c; + AppDelayTmr.stop(); + timePassed = FALSE; + } + else + { + gAppTxPacket->u8DataLength = 8; + (void)MCPSDataRequest(gAppTxPacket); + u16SentPackets++; + Thread::wait(miliSecDelay); + } + } + if(evDataFromUART && gu8UartData == ' ') + { + uart.printf("\r\n\r\n-Test interrupted by user. Press [ENTER] to continue\r\n\r\n"); + perTxState = gPerTxStateIdle_c; + } + break; + case gPerTxStateIdle_c: + if((evDataFromUART) && ('\r' == gu8UartData)) + { + perTxState = gPerTxStateInit_c; + evDataFromUART = FALSE; + SelfNotificationEvent(); + } + break; + default: + break; + } + + return bBackFlag; +} + +/************************************************************************************ +* +* PER Handler for board that is performing RX +* +************************************************************************************/ +bool_t PacketErrorRateRx(void) +{ + static uint16_t u16ReceivedPackets; + static uint16_t u16PacketsIndex; + static uint16_t u16TotalPackets; + static uint16_t u16FinalPacketsCount; + static uint32_t u32RssiSum; + static uint8_t u8AverageRssi; + uint8_t u8TempRssivalue; + + bool_t bBackFlag = FALSE; + if(evTestParameters) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + switch(perRxState) + { + case gPerRxStateInit_c: + u16TotalPackets = 0; + u16ReceivedPackets = 0; + u16PacketsIndex = 0; + u32RssiSum = 0; + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8PerRxTestMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + perRxState = gPerRxWaitStartTest_c; + break; + case gPerRxWaitStartTest_c: + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + uart.printf("\f\n\rPER Test Rx Running\r\n\r\n"); + SetRadioRxOnNoTimeOut(); + shortCutsEnabled = FALSE; + perRxState = gPerRxStateStartTest_c; + } + else if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + case gPerRxStateStartTest_c: + if(bRxDone) + { + if (gAppRxPacket->rxStatus == rxSuccessStatus_c) + { + if(stringComp((uint8_t*)"SMAC PER Demo",&gAppRxPacket->smacPdu.smacPdu[4],13)) + { + u16TotalPackets = ((uint16_t)gAppRxPacket->smacPdu.smacPdu[0] <<8) + gAppRxPacket->smacPdu.smacPdu[1]; + u16PacketsIndex = ((uint16_t)gAppRxPacket->smacPdu.smacPdu[2] <<8) + gAppRxPacket->smacPdu.smacPdu[3]; + u16ReceivedPackets++; + u8TempRssivalue= u8LastRxRssiValue; //@CMA, Conn Test. New line + u32RssiSum += u8TempRssivalue; + u8AverageRssi = (uint8_t)(u32RssiSum/u16ReceivedPackets); + uart.printf("Packet %d . Packet index: %d . Rssi during RX: - %d\r\n",(uint32_t)u16ReceivedPackets, (uint32_t)u16PacketsIndex, (uint32_t)u8LastRxRssiValue); + if(u16PacketsIndex == u16TotalPackets) + { + u16FinalPacketsCount = 0; + perRxState = gPerRxStateReceivingLastFrames_c; + } + } + else if(stringComp((uint8_t*)"DONE",&gAppRxPacket->smacPdu.smacPdu[4],4)) + { + u16FinalPacketsCount = 0; + perRxState = gPerRxStateReceivingLastFrames_c; + } + } + else + { + if(u16TotalPackets) + { + u16PacketsIndex++; + if(u16PacketsIndex == u16TotalPackets) + { + u16FinalPacketsCount = 0; + perRxState = gPerRxStateReceivingLastFrames_c; + } + } + } + + SetRadioRxOnNoTimeOut(); + } + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + (void)MLMERXDisableRequest(); + uart.printf("\r\nAverage Rssi during PER: -"); + uart.printf("%d",(uint32_t)u8AverageRssi); + uart.printf(" dBm\r\n"); + uart.printf( "\n\rPER Test Rx Stopped\r\n\r\n"); + PrintPerRxFinalLine(u16ReceivedPackets,u16TotalPackets); + perRxState = gPerRxStateIdle_c; + } + evDataFromUART = FALSE; + } + break; + case gPerRxStateReceivingLastFrames_c: + if(bRxDone) + { + u16FinalPacketsCount++; + if(mTotalFinalFrames_c == u16FinalPacketsCount) + { + uart.printf("\r\nAverage Rssi during PER: -"); + uart.printf("%d",(uint32_t)u8AverageRssi); + uart.printf(" dBm\r\n"); + uart.printf( "\n\rPER Test Finished\r\n\r\n"); + PrintPerRxFinalLine(u16ReceivedPackets,u16TotalPackets); + perRxState = gPerRxStateIdle_c; + } + else + { + SetRadioRxOnNoTimeOut(); + } + } + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + (void)MLMERXDisableRequest(); + uart.printf("\r\nAverage Rssi during PER: -"); + uart.printf("%d",(uint32_t)u8AverageRssi); + uart.printf(" dBm\r\n"); + uart.printf( "\n\rPER Test Rx Stopped\r\n\r\n"); + PrintPerRxFinalLine(u16ReceivedPackets,u16TotalPackets); + perRxState = gPerRxStateIdle_c; + } + evDataFromUART = FALSE; + } + break; + case gPerRxStateIdle_c: + if((evDataFromUART) && ('\r' == gu8UartData)) + { + perRxState = gPerRxStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Range Test Handler for board that is performing TX +* +************************************************************************************/ +bool_t RangeTx(void) +{ + bool_t bBackFlag = FALSE; + static uint32_t u32RSSISum; + static uint16_t u16ReceivedPackets; + static uint16_t u16PacketsDropped; + uint8_t u8AverageRSSI; + uint8_t u8CurrentRSSI; + + if(evTestParameters) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + + switch(rangeTxState) + { + case gRangeTxStateInit_c: + u32RSSISum = 0; + u16ReceivedPackets = 0; + u16PacketsDropped = 0; + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8RangeTxTestMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + rangeTxState = gRangeTxWaitStartTest_c; + break; + case gRangeTxWaitStartTest_c: + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + shortCutsEnabled = FALSE; + uart.printf( "\f\r\nRange Test Tx Running\r\n"); + rangeTxState = gRangeTxStateStartTest_c; + Thread::wait(200); + } + else if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + case gRangeTxStateStartTest_c: + if(!timePassed) //waiting 200 ms + break; + timePassed = FALSE; + bTxDone = FALSE; + gAppTxPacket->u8DataLength = 16; + gAppTxPacket->smacPdu.smacPdu[0] = 0; + FLib_MemCpy(&(gAppTxPacket->smacPdu.smacPdu[1]), (void*)"SMAC Range Demo",15); + MLMERXDisableRequest(); + //RangeTestTmr.stop(); //@CMA, Conn Test. Stop Rx timer + (void)MCPSDataRequest(gAppTxPacket); + rangeTxState = gRangeTxStateRunningTest_c; + break; + case gRangeTxStateRunningTest_c: + if(bTxDone) + { + RangeTestTmr.attach_us(RangeTest_Timer_CallBack, 80000); //@CMA, Conn Test. Start Timer + SetRadioRxOnNoTimeOut(); + rangeTxState = gRangeTxStatePrintTestResults_c; + } + break; + case gRangeTxStatePrintTestResults_c: + if(bRxDone) + { + if(gAppRxPacket->rxStatus == rxSuccessStatus_c) + { + if(stringComp((uint8_t*)"SMAC Range Demo",&gAppRxPacket->smacPdu.smacPdu[1],15)) + { + u8CurrentRSSI = (gAppRxPacket->smacPdu.smacPdu[0]); + u32RSSISum += u8CurrentRSSI; + u16ReceivedPackets++; + u8AverageRSSI = (uint8_t)(u32RSSISum/u16ReceivedPackets); + uart.printf( "\r\n RSSI = -"); + uart.printf("%d", (uint32_t)u8CurrentRSSI); + uart.printf(" dBm"); + } + else + { + RangeTestTmr.attach_us(RangeTest_Timer_CallBack, 80000); //@CMA, Conn Test. Start Timer + SetRadioRxOnNoTimeOut(); + } + } + else + { + u16PacketsDropped++; + uart.printf( "\r\nPacket Dropped"); + bRxDone= FALSE; //@CMA, Conn Test. Added + } + if(evDataFromUART && (' ' == gu8UartData)) + { + uart.printf( "\n\r\n\rRange Test Tx Stopped\r\n\r\n"); + u8AverageRSSI = (uint8_t)(u32RSSISum/u16ReceivedPackets); + uart.printf( "Average RSSI -"); + uart.printf("%d", (uint32_t)u8AverageRSSI); + uart.printf(" dBm"); + uart.printf( "\r\nPackets dropped "); + uart.printf("%d", (uint32_t)u16PacketsDropped); + uart.printf( "\r\n\r\n Press [enter] to go back to the Range Tx test menu"); + rangeTxState = gRangeTxStateIdle_c; + (void)MLMERXDisableRequest(); + AppDelayTmr.stop(); + timePassed = FALSE; + } + else + { + rangeTxState = gRangeTxStateStartTest_c; + Thread::wait(200); + } + evDataFromUART = FALSE; + } + + break; + case gRangeTxStateIdle_c: + if((evDataFromUART) && ('\r' == gu8UartData)) + { + rangeTxState = gRangeTxStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Range Test Handler for board that is performing RX +* +************************************************************************************/ +bool_t RangeRx(void) +{ + bool_t bBackFlag = FALSE; + static uint32_t u32RSSISum; + static uint16_t u16ReceivedPackets; + uint8_t u8AverageRSSI, u8TempRSSIvalue; + uint8_t u8CurrentRSSI; + + if(evTestParameters) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + + switch(rangeRxState) + { + case gRangeRxStateInit_c: + u32RSSISum = 0; + u16ReceivedPackets = 0; + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8RangeRxTestMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + rangeRxState = gRangeRxWaitStartTest_c; + break; + case gRangeRxWaitStartTest_c: + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + shortCutsEnabled = FALSE; + uart.printf( "\f\r\nRange Test Rx Running\r\n"); + rangeRxState = gRangeRxStateStartTest_c; + } + else if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + SelfNotificationEvent(); + } + break; + case gRangeRxStateStartTest_c: + SetRadioRxOnNoTimeOut(); + rangeRxState = gRangeRxStateRunningTest_c; + break; + case gRangeRxStateRunningTest_c: + if(evDataFromUART && (' ' == gu8UartData)) + { + (void)MLMERXDisableRequest(); + uart.printf( "\n\r\n\rRange Test Rx Stopped\r\n\r\n"); + u8AverageRSSI = (uint8_t)(u32RSSISum/u16ReceivedPackets); + uart.printf( "Average RSSI "); + if(u8AverageRSSI != 0) + { + uart.printf("-"); + } + uart.printf("%d", (uint32_t)u8AverageRSSI); + uart.printf(" dBm"); + uart.printf( "\r\n\r\n Press [enter] to go back to the Range Rx test menu"); + rangeRxState = gRangeRxStateIdle_c; + } + evDataFromUART = FALSE; + if(bRxDone) + { + if(gAppRxPacket->rxStatus == rxSuccessStatus_c) + { + if(stringComp((uint8_t*)"SMAC Range Demo",&gAppRxPacket->smacPdu.smacPdu[1],15)) + { + bRxDone = FALSE; + Thread::wait(4); + } + else + { + SetRadioRxOnNoTimeOut(); + } + } + else + { + SetRadioRxOnNoTimeOut(); + } + } + if(timePassed) + { + timePassed = FALSE; + bTxDone = FALSE; + u8TempRSSIvalue= u8LastRxRssiValue; + gAppTxPacket->smacPdu.smacPdu[0] = u8TempRSSIvalue; + FLib_MemCpy(&(gAppTxPacket->smacPdu.smacPdu[1]), (void *)"SMAC Range Demo",15); + gAppTxPacket->u8DataLength = 16; + (void)MCPSDataRequest(gAppTxPacket); + rangeRxState = gRangeRxStatePrintTestResults_c; + } + break; + case gRangeRxStatePrintTestResults_c: + if(bTxDone) + { + u8CurrentRSSI= u8LastRxRssiValue; + u32RSSISum += u8CurrentRSSI; + u16ReceivedPackets++; + u8AverageRSSI = (uint8_t)(u32RSSISum/u16ReceivedPackets); + uart.printf( "\r\n RSSI = -"); + uart.printf("%d", (uint32_t)u8CurrentRSSI); + uart.printf(" dBm"); + rangeRxState = gRangeRxStateStartTest_c; + SelfNotificationEvent(); + } + break; + case gRangeRxStateIdle_c: + if((evDataFromUART) && ('\r' == gu8UartData)) + { + rangeRxState = gRangeRxStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Handler for viewing/modifying XCVR registers +* +************************************************************************************/ +bool_t EditRegisters(void) +{ + bool_t bBackFlag = FALSE; + if(evTestParameters) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + + switch(eRState) + { + case gERStateInit_c: + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8RadioRegistersEditMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + eRState = gERWaitSelection_c; + break; + case gERWaitSelection_c: + if(evDataFromUART) + { +#if CT_Feature_Direct_Registers + if('1' == gu8UartData) + { + bIsRegisterDirect = TRUE; + oRState = gORStateInit_c; + eRState = gERStateOverrideReg_c; + SelfNotificationEvent(); + } + else if('2' == gu8UartData) + { + bIsRegisterDirect = TRUE; + rRState = gRRStateInit_c; + eRState = gERStateReadReg_c; + SelfNotificationEvent(); + } +#if CT_Feature_Indirect_Registers + else if('3' == gu8UartData) + { + bIsRegisterDirect = FALSE; + oRState = gORStateInit_c; + eRState = gERStateOverrideReg_c; + SelfNotificationEvent(); + } + else if('4' == gu8UartData) + { + bIsRegisterDirect = FALSE; + rRState = gRRStateInit_c; + eRState = gERStateReadReg_c; + SelfNotificationEvent(); + } + else if('5' == gu8UartData) + { + dRState = gDRStateInit_c; + eRState = gERStateDumpAllRegs_c; + SelfNotificationEvent(); + } +#else + else if('3' == gu8UartData) + { + dRState = gDRStateInit_c; + eRState = gERStateDumpAllRegs_c; + SelfNotificationEvent(); + } +#endif + else +#endif + if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + case gERStateOverrideReg_c: + if(OverrideRegisters()) + { + eRState = gERStateInit_c; + SelfNotificationEvent(); + } + break; + case gERStateReadReg_c: + if(ReadRegisters()) + { + eRState = gERStateInit_c; + SelfNotificationEvent(); + } + break; + case gERStateDumpAllRegs_c: + if(DumpRegisters()) { + eRState = gERStateInit_c; + SelfNotificationEvent(); + } + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Dump registers +* +************************************************************************************/ +bool_t DumpRegisters(void) +{ + bool_t bBackFlag = FALSE; + + switch(dRState) + { + case gDRStateInit_c: + uart.printf( "\f\r\rDump Registers\r\n"); + uart.printf( "\r\n-Press [space] to dump registers\r\n"); + uart.printf( "\r\n-Press [p] Previous Menu\r\n"); + shortCutsEnabled = FALSE; + dRState = gDRStateDumpRegs_c; + SelfNotificationEvent(); + break; + case gDRStateDumpRegs_c: + if(evDataFromUART){ + if(gu8UartData == 'p') + { + bBackFlag = TRUE; + } + else if (gu8UartData == ' ') + { + uart.printf( "\r\n -Dumping registers... \r\n"); + const registerLimits_t* interval = registerIntervals; + + while(!((*interval).regStart == 0 && (*interval).regEnd == 0)) + { + uart.printf( "\r\n -Access type: "); + if( (*interval).bIsRegisterDirect ) + uart.printf("direct\r\n"); + else + uart.printf("indirect\r\n"); + bIsRegisterDirect = (*interval).bIsRegisterDirect; + ReadRFRegs((*interval).regStart, (*interval).regEnd); + interval++; + } + dRState = gDRStateInit_c; + SelfNotificationEvent(); + } + } + evDataFromUART = FALSE; + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Read and print register values with addresses from u8RegStartAddress +* to u8RegStopAddress +* +************************************************************************************/ +void ReadRFRegs(registerAddressSize_t rasRegStartAddress, registerAddressSize_t rasRegStopAddress) +{ + + static uint16_t rasRegAddress; + registerSize_t rsRegValue; + uart.printf( " --------------------------------------- "); + for(rasRegAddress = rasRegStartAddress; rasRegAddress <= rasRegStopAddress; rasRegAddress+=(gRegisterSize_c)) + { + uart.printf( "\r\n| Address : 0x"); + uart.printf("%x", (uint8_t*)&rasRegAddress); + aspTestRequestMsg.msgType = aspMsgTypeXcvrReadReq_c; + aspTestRequestMsg.msgData.aspXcvrData.addr = (uint16_t)rasRegAddress; + aspTestRequestMsg.msgData.aspXcvrData.len = gRegisterSize_c; + aspTestRequestMsg.msgData.aspXcvrData.mode = !bIsRegisterDirect; + + APP_ASP_SapHandler(&aspTestRequestMsg, 0); + rsRegValue = *((registerSize_t*)aspTestRequestMsg.msgData.aspXcvrData.data); + uart.printf( " Data value : 0x"); + uart.printf("%x", (uint8_t*)&rsRegValue); + uart.printf( " |"); + } + uart.printf( "\r\n --------------------------------------- \r\n"); +} + +/************************************************************************************ +* +* Read register +* +************************************************************************************/ +bool_t ReadRegisters(void) +{ + bool_t bBackFlag = FALSE; + static uint8_t au8RxString[5]; + static uint8_t u8Index; + static registerAddressSize_t rasRegAddress; + static registerSize_t rsRegValue; + static char auxToPrint[2]; + + switch(rRState) + { + case gRRStateInit_c: + uart.printf( "\f\r\rRead Registers\r\n"); + uart.printf( "\r\n-Press [p] Previous Menu\r\n"); + shortCutsEnabled = FALSE; + rRState = gRRStateStart_c; + SelfNotificationEvent(); + break; + case gRRStateStart_c: + uart.printf( "\r\n -write the Register address in Hex and [enter]: 0x"); + u8Index = 0; + rRState = gRRWaitForTheAddress_c; + break; + case gRRWaitForTheAddress_c: + if(evDataFromUART) + { + if((!isAsciiHex(gu8UartData)) && ('\r' != gu8UartData)) + { + if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + else + { + uart.printf( "\r\n -Invalid Character!! "); + rRState = gRRStateStart_c; + SelfNotificationEvent(); + } + } + else if((gRegisterAddressASCII_c == u8Index) && ('\r' != gu8UartData)) + { + uart.printf( "\r\n -Value out of Range!! "); + rRState = gRRStateStart_c; + SelfNotificationEvent(); + } + else if(isAsciiHex(gu8UartData)) + { + au8RxString[u8Index++] = gu8UartData; + auxToPrint[0] = gu8UartData; + auxToPrint[1] = '\0'; + uart.printf( auxToPrint); + } + else + { + au8RxString[u8Index] = 0; + rasRegAddress = (registerAddressSize_t)HexString2Dec(au8RxString); + aspTestRequestMsg.msgType = aspMsgTypeXcvrReadReq_c; + aspTestRequestMsg.msgData.aspXcvrData.addr = (uint16_t)rasRegAddress; + aspTestRequestMsg.msgData.aspXcvrData.len = gRegisterSize_c; + aspTestRequestMsg.msgData.aspXcvrData.mode = !bIsRegisterDirect; + APP_ASP_SapHandler(&aspTestRequestMsg, 0); + rsRegValue = *((registerSize_t*)aspTestRequestMsg.msgData.aspXcvrData.data); + + uart.printf( "\r\n -Register value : 0x"); + uart.printf("%x", (uint8_t*)&rsRegValue); + uart.printf( "\r\n"); + + rRState = gRRStateStart_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Override Register +* +************************************************************************************/ +bool_t OverrideRegisters(void) +{ + bool_t bBackFlag = FALSE; + static uint8_t au8RxString[5]; + static uint8_t u8Index; + static registerAddressSize_t rasRegAddress; + static registerSize_t rsRegValue; + static char auxToPrint[2]; + + switch(oRState) + { + case gORStateInit_c: + uart.printf("\f\r\nWrite Registers\r\n"); + uart.printf("\r\n-Press [p] Previous Menu\r\n"); + shortCutsEnabled = FALSE; + oRState = gORStateStart_c; + SelfNotificationEvent(); + break; + case gORStateStart_c: + uart.printf("\r\n -write the Register address in Hex and [enter]: 0x"); + u8Index = 0; + oRState = gORWaitForTheAddress_c; + break; + case gORWaitForTheAddress_c: + if(evDataFromUART){ + if((!isAsciiHex(gu8UartData)) && ('\r' != gu8UartData)) + { + if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + else + { + uart.printf("\r\n -Invalid Character!! "); + oRState = gORStateStart_c; + SelfNotificationEvent(); + } + } + else if((gRegisterAddressASCII_c == u8Index) && ('\r' != gu8UartData)) + { + uart.printf("\r\n -Value out of Range!! "); + oRState = gORStateStart_c; + SelfNotificationEvent(); + } + else if(isAsciiHex(gu8UartData)) + { + au8RxString[u8Index++] = gu8UartData; + auxToPrint[0] = gu8UartData; + auxToPrint[1] = '\0'; + uart.printf(auxToPrint); + } + else + { + au8RxString[u8Index] = 0; + rasRegAddress = (registerAddressSize_t)HexString2Dec(au8RxString); + uart.printf("\r\n -write the Register value to override in Hex and [enter]: 0x"); + u8Index = 0; + oRState = gORWaitForTheValue_c; + } + evDataFromUART = FALSE; + } + break; + case gORWaitForTheValue_c: + if(evDataFromUART) + { + if((!isAsciiHex(gu8UartData)) && ('\r' != gu8UartData)) + { + if('p' == gu8UartData) + { + bBackFlag = TRUE; + } + else + { + uart.printf("\r\n -Invalid Character!! "); + oRState = gORStateStart_c; + SelfNotificationEvent(); + } + } + else if((2 == u8Index) && ('\r' != gu8UartData)) + { + uart.printf("\r\n -Value out of Range!! "); + oRState = gORStateStart_c; + SelfNotificationEvent(); + } + else if(isAsciiHex(gu8UartData)) + { + au8RxString[u8Index++] = gu8UartData; + auxToPrint[0] = gu8UartData; + auxToPrint[1] = '\0'; + uart.printf(auxToPrint); + } + else + { + au8RxString[u8Index] = 0; + rsRegValue = (registerSize_t)HexString2Dec(au8RxString); + aspTestRequestMsg.msgType = aspMsgTypeXcvrWriteReq_c; + aspTestRequestMsg.msgData.aspXcvrData.addr = (uint16_t)rasRegAddress; + aspTestRequestMsg.msgData.aspXcvrData.len = gRegisterAddress_c; + aspTestRequestMsg.msgData.aspXcvrData.mode = !bIsRegisterDirect; + FLib_MemCpy(aspTestRequestMsg.msgData.aspXcvrData.data, &rsRegValue, gRegisterSize_c); + APP_ASP_SapHandler(&aspTestRequestMsg, 0); + + uart.printf("\r\n Register overridden \r\n"); + u8Index = 0; + oRState = gORStateStart_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + default: + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Handler for Carrier Sense Test and Transmission Control Test +* +************************************************************************************/ +bool_t CSenseAndTCtrl(void) +{ + bool_t bBackFlag = FALSE; + static uint8_t testSelector = 0; + + if(evTestParameters){ + (void)MLMESetChannelRequest(testChannel); +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMEPAOutputAdjust(testPower); + PrintTestParameters(TRUE); + evTestParameters = FALSE; + } + + switch(cstcState) + { + case gCsTcStateInit_c: + TestMode(gTestModeForceIdle_c); + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8RadioCSTCSelectMenu, mAppSer); + PrintTestParameters(FALSE); + shortCutsEnabled = TRUE; + bTxDone = FALSE; + bScanDone = FALSE; + timePassed = FALSE; + + cstcState = gCsTcStateSelectTest_c; + break; + case gCsTcStateSelectTest_c: + if(evDataFromUART) + { + if('1' == gu8UartData) + { + cstcState = gCsTcStateCarrierSenseStart_c; + testSelector = 1; + SelfNotificationEvent(); + } + else if ('2' == gu8UartData) + { + cstcState = gCsTcStateTransmissionControlStart_c; + testSelector = 2; + SelfNotificationEvent(); + } + else if( 'p' == gu8UartData) + { + cstcState = gCsTcStateInit_c; + testSelector = 0; + bBackFlag = TRUE; + } + evDataFromUART = FALSE; + } + break; + default: + if(testSelector == 1) + CarrierSenseHandler(); + else if(testSelector == 2) + TransmissionControlHandler(); + break; + } + return bBackFlag; +} + +/************************************************************************************ +* +* Handler for Transmission Control Test called by above function +* +************************************************************************************/ +void TransmissionControlHandler(void) +{ + const uint16_t u16TotalPacketsOptions[] = {1,25,100,500,1000,2000,5000,10000,65535}; + static uint16_t u16TotalPackets; + static uint16_t u16PacketCounter = 0; + static uint16_t miliSecDelay = 0; + static phyTime_t startTime; + int8_t fillIndex = 0; + uint8_t* smacPduPtr; + uint32_t totalTimeMs; + + switch(cstcState) + { + case gCsTcStateTransmissionControlStart_c: + PrintMenu(cu8ShortCutsBar, mAppSer); + PrintMenu(cu8CsTcTestMenu, mAppSer); + PrintTestParameters(FALSE); + miliSecDelay = 0; + u16TotalPackets = 0; + u16PacketCounter = 0; + fillIndex = testPayloadLen / gPrbs9BufferLength_c; + + while(fillIndex > 0) + { + fillIndex--; + smacPduPtr = gAppTxPacket->smacPdu.smacPdu + fillIndex * gPrbs9BufferLength_c; + FLib_MemCpy(smacPduPtr, u8Prbs9Buffer, gPrbs9BufferLength_c); + } + smacPduPtr = gAppTxPacket->smacPdu.smacPdu + ((testPayloadLen / gPrbs9BufferLength_c)*gPrbs9BufferLength_c); + FLib_MemCpy(smacPduPtr, u8Prbs9Buffer, (testPayloadLen % gPrbs9BufferLength_c)); + + gAppTxPacket->u8DataLength = testPayloadLen; + + cstcState = gCsTcStateTransmissionControlSelectNumOfPackets_c; + break; + case gCsTcStateTransmissionControlSelectNumOfPackets_c: + if(evDataFromUART) + { + if((gu8UartData >= '0') && (gu8UartData <= '8')) + { + u16TotalPackets = u16TotalPacketsOptions[gu8UartData - '0']; + cstcState = gCsTcStateTransmissionControlSelectInterpacketDelay_c; + uart.printf("\r\n\r\n Please type InterPacket delay in miliseconds and press [ENTER]"); + uart.printf("\r\n(During test, exit by pressing [SPACE])\r\n\r\n"); + SelfNotificationEvent(); + } + else if('p' == gu8UartData) + { + cstcState = gCsTcStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + case gCsTcStateTransmissionControlSelectInterpacketDelay_c: + if(evDataFromUART) + { + if(gu8UartData == '\r' && miliSecDelay != 0) + { + cstcState = gCsTcStateTransmissionControlPerformingTest_c; + startTime = GetTimestampUS(); + (void)MLMEScanRequest(testChannel); + } + else if((gu8UartData >= '0') && (gu8UartData <='9')) + { + miliSecDelay = miliSecDelay*10 + (gu8UartData - '0'); + uart.printf("%d",(uint32_t)(gu8UartData - '0')); + } + else if('p' == gu8UartData) + { + cstcState = gCsTcStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + case gCsTcStateTransmissionControlPerformingTest_c: + if(bScanDone) + { + bScanDone = FALSE; + (void)MCPSDataRequest(gAppTxPacket); + } + if(bTxDone) + { + bTxDone = FALSE; + u16PacketCounter++; + uart.printf("\r\n\tPacket number: "); + uart.printf("%d", (uint32_t)(u16PacketCounter)); + uart.printf("; RSSI value: -"); + uart.printf("%d",(uint32_t)au8ScanResults[testChannel]); + uart.printf(" dBm\r\n"); + if(u16PacketCounter < u16TotalPackets) + { + totalTimeMs = (uint32_t)(GetTimestampUS() - startTime); + totalTimeMs -= GetTransmissionTime(testPayloadLen, crtBitrate); + totalTimeMs = (totalTimeMs % 1000 < 500) ? totalTimeMs/1000 : (totalTimeMs/1000)+1; + if(totalTimeMs > miliSecDelay) + { + uart.printf( " Overhead + Transmission + ED = ~"); + uart.printf("%d", totalTimeMs); + uart.printf("ms\r\n Interpacket delay too small (Press [ENTER] to continue)\r\n"); + cstcState = gCsTcStateTransmissionControlEndTest_c; + SelfNotificationEvent(); + break; + } + Thread::wait(miliSecDelay - totalTimeMs); + } + else + { + uart.printf("\r\n\r\nFinished transmitting "); + uart.printf("%d", (uint32_t)u16TotalPackets); + uart.printf(" packets!\r\n\r\n"); + uart.printf("\r\n -Press [ENTER] to end Transmission Control Test"); + cstcState = gCsTcStateTransmissionControlEndTest_c; + } + } + if(timePassed) + { + timePassed = FALSE; + startTime = GetTimestampUS(); + (void)MLMEScanRequest(testChannel); + } + if(evDataFromUART && gu8UartData == ' ') + { + uart.printf("\r\n\r\n-Test interrupted by user. Press [ENTER] to continue\r\n\r\n"); + cstcState = gCsTcStateTransmissionControlEndTest_c; + } + break; + case gCsTcStateTransmissionControlEndTest_c: + if(evDataFromUART && gu8UartData == '\r') + { + cstcState = gCsTcStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + break; + } +} +/************************************************************************************ +* +* Handler for Carrier Sense Test +* +************************************************************************************/ +void CarrierSenseHandler(void) +{ + int8_t fillIndex = 0; + uint8_t* smacPduPtr; + switch(cstcState) + { + case gCsTcStateCarrierSenseStart_c: +#if CT_Feature_Calibration + if( gMode1Bitrate_c == crtBitrate ) + { + (void)MLMESetAdditionalRFOffset(gOffsetIncrement + 30); + } + else + { + (void)MLMESetAdditionalRFOffset(gOffsetIncrement + 60); + } +#endif + (void)MLMESetChannelRequest(testChannel); + + uart.printf( "\r\n\r\n Press [SPACE] to begin/interrupt test"); + uart.printf( "\r\n Press [p] to return to previous menu"); +// PrintTestParameters(FALSE); + shortCutsEnabled = FALSE; + uart.printf("\r\n"); + + fillIndex = testPayloadLen / gPrbs9BufferLength_c; + while(fillIndex > 0) + { + fillIndex--; + smacPduPtr = gAppTxPacket->smacPdu.smacPdu + fillIndex * gPrbs9BufferLength_c; + FLib_MemCpy(smacPduPtr, u8Prbs9Buffer, gPrbs9BufferLength_c); + } + smacPduPtr = gAppTxPacket->smacPdu.smacPdu + ((testPayloadLen / gPrbs9BufferLength_c)*gPrbs9BufferLength_c); + FLib_MemCpy(smacPduPtr, u8Prbs9Buffer, (testPayloadLen % gPrbs9BufferLength_c)); + + gAppTxPacket->u8DataLength = testPayloadLen; + + cstcState = gCsTcStateCarrierSenseSelectType_c; + break; + case gCsTcStateCarrierSenseSelectType_c: + if(evDataFromUART) + { + if(' ' == gu8UartData) + { + cstcState = gCsTcStateCarrierSensePerformingTest_c; + (void)MLMEScanRequest(testChannel); + } + else if ('p' == gu8UartData) + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + cstcState = gCsTcStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + } + break; + case gCsTcStateCarrierSensePerformingTest_c: + if(bScanDone) + { + bScanDone = FALSE; + uart.printf( "\r\n\tSampling done. RSSI value: -"); + uart.printf("%d", (uint32_t) au8ScanResults[testChannel]); + uart.printf( "dBm"); + if(au8ScanResults[testChannel] > ccaThresh) + { + (void)MCPSDataRequest(gAppTxPacket); + } + else + { + (void)MLMEScanRequest(testChannel); + } + } + if(bTxDone) + { + bTxDone = FALSE; + + uart.printf("\r\n Transmission Performed\r\n"); + uart.printf("\r\n -Press [ENTER] to end Carrier Sense Test"); + cstcState = gCsTcStateCarrierSenseEndTest_c; + } + if(evDataFromUART && gu8UartData == ' ') + { + uart.printf("\r\n\r\n-Test interrupted by user. Press [ENTER] to continue\r\n\r\n"); + cstcState = gCsTcStateCarrierSenseEndTest_c; + } + break; + case gCsTcStateCarrierSenseEndTest_c: + if(evDataFromUART && gu8UartData == '\r') + { +#if CT_Feature_Calibration + (void)MLMESetAdditionalRFOffset(gOffsetIncrement); +#endif + (void)MLMESetChannelRequest(testChannel); + cstcState = gCsTcStateInit_c; + SelfNotificationEvent(); + } + evDataFromUART = FALSE; + break; + } +} + +/************************************************************************************ +* +* Auxiliary Functions +* +************************************************************************************/ + +/**************************************************************************************/ +void SetRadioRxOnNoTimeOut(void) +{ + bRxDone = FALSE; + gAppRxPacket->u8MaxDataLength = gMaxSmacSDULength_c; + (void)MLMERXEnableRequest(gAppRxPacket, 0); +} + +/**************************************************************************************/ +void PrintPerRxFinalLine(uint16_t u16Received, uint16_t u16Total) +{ + uart.printf("Received "); + uart.printf("%d",(uint32_t)u16Received); + uart.printf(" of "); + uart.printf("%d",(uint32_t)u16Total); + uart.printf(" packets transmitted \r\n"); + uart.printf("\r\n Press [enter] to go back to the Per Rx test menu"); +} + +/************************************************************************************ +* +* +* By employing this function, users can execute a test of the radio. Test mode +* implements the following: +* -PRBS9 Mode, +* -Force_idle, +* -Continuos TX without modulation, +* -Continuos TX with modulation.(0's,1's and PN patterns) +* +************************************************************************************/ +smacErrors_t TestMode +( +smacTestMode_t mode /*IN: The test mode to start.*/ +) +{ + aspTestRequestMsg.msgType = aspMsgTypeTelecTest_c; + +#if(TRUE == smacParametersValidation_d) + if(gMaxTestMode_c <= mode) + { + return gErrorOutOfRange_c; + } +#endif + + if(gTestModeForceIdle_c == mode) + { + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestForceIdle_c; + } + else if(gTestModeContinuousTxModulated_c == mode) + { + if(contTxModBitValue==gContTxModSelectOnes_c) + { + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestContinuousTxModOne_c; + } + else if(contTxModBitValue == gContTxModSelectZeros_c) + { + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestContinuousTxModZero_c; + } + else if(contTxModBitValue == gContTxModSelectPN9_c) + { +#ifdef gPHY_802_15_4g_d + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestContinuousTxContPN9_c; +#else + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestPulseTxPrbs9_c; +#endif + } + } + else if(gTestModeContinuousTxUnmodulated_c == mode) + { + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestContinuousTxNoMod_c; + } + else if(gTestModeContinuousRxBER_c == mode) + { + aspTestRequestMsg.msgData.aspTelecTest.mode = gTestContinuousRx_c; + } + else if(gTestModePRBS9_c == mode) + { + /*Set Data Mode*/ + gAppTxPacket->u8DataLength = gPrbs9BufferLength_c; + FLib_MemCpy(gAppTxPacket->smacPdu.smacPdu, u8Prbs9Buffer, gPrbs9BufferLength_c); + PacketHandler_Prbs9(); + } + if(gTestModePRBS9_c != mode) + (void)APP_ASP_SapHandler(&aspTestRequestMsg, 0); + + return gErrorNoError_c; +} + +/************************************************************************************ +* PacketHandler_Prbs9 +* +* This function sends OTA the content of a PRBS9 polynomial of 65 bytes of payload. +* +* +************************************************************************************/ + +void PacketHandler_Prbs9(void) +{ + smacErrors_t err; + /*@CMA, Need to set Smac to Idle in order to get PRBS9 to work after a second try on the Conn Test menu*/ + (void)MLMERXDisableRequest(); + (void)MLMETXDisableRequest(); + err = MCPSDataRequest(gAppTxPacket); + if(err != gErrorNoError_c) + { + failedPRBS9 = TRUE; + SelfNotificationEvent(); //in case data isn't sent, no confirm event will fire. + //this way we need to make sure the application will not freeze. + } +} + +/***************************************************************************** +* UartRxCallBack function +* +* Interface assumptions: +* This callback is triggered when a new byte is received over the UART +* +* Return Value: +* None +*****************************************************************************/ +void UartRxCallBack(void * param) +{ + uint16_t readBytes; + gu8UartData = uart.getc(); + gTaskEventFlags |= gUART_RX_EVENT_c; +} + +/*@CMA, Conn Test. Range Test CallBack*/ +void RangeTest_Timer_CallBack () +{ + gTaskEventFlags |= gRangeTest_EVENT_c; +} + + + +/************************************************************************************ +* +* Increments channel on the ED Confirm event and fires a new ED measurement request +* +************************************************************************************/ +void IncrementChannelOnEdEvent() +{ + bScanDone = FALSE; + smacErrors_t err; + if (ChannelToScan <= gMaxChannel_c) + { + err = MLMEScanRequest((channels_t)ChannelToScan); + if(err == gErrorNoError_c) + ChannelToScan++; //Increment channel to scan + } + else + { + bScanDone = TRUE; //PRINT ALL CHANNEL RESULTS + Thread::wait(300); //Add delay between channel scanning series. + } +} + +/*********************************************************************** +*********************Utilities Software******************************** +************************************************************************/ + +bool_t stringComp(uint8_t * au8leftString, uint8_t * au8RightString, uint8_t bytesToCompare) +{ + do + { + }while((*au8leftString++ == *au8RightString++) && --bytesToCompare); + return(0 == bytesToCompare); +} + +uint32_t HexString2Dec(uint8_t* au8String) +{ + uint8_t u8LocIndex=0; + uint8_t u8LocIndex2=0; + uint32_t u32DecValue = 0; + + while(au8String[u8LocIndex]){ + u8LocIndex++; + } + + while(u8LocIndex--){ + if((au8String[u8LocIndex] >= '0') && (au8String[u8LocIndex] <= '9')) + u32DecValue |= ((uint32_t)(au8String[u8LocIndex] - '0'))<<(u8LocIndex2*4); + else if((au8String[u8LocIndex] >= 'A') && (au8String[u8LocIndex] <= 'F')){ + u32DecValue |= ((uint32_t)(au8String[u8LocIndex] - 'A' + 0x0A))<<(u8LocIndex2*4); + }else{ + u32DecValue |= ((uint32_t)(au8String[u8LocIndex] - 'a' + 0x0A))<<(u8LocIndex2*4); + } + u8LocIndex2++; + } + + return u32DecValue; +} + +static void DelayTimeElapsed() +{ + timePassed = TRUE; + gTaskEventFlags |= gTimePassed_EVENT_c; +} + +/*********************************************************************************** +* +* PrintMenu +* +************************************************************************************/ +void PrintMenu(char * const pu8Menu[], uint8_t port) +{ + uint8_t u8Index = 0; + (void)port; + while(pu8Menu[u8Index]){ + uart.printf(pu8Menu[u8Index]); + u8Index++; + } +} + +/*********************************************************************** +************************************************************************/ + +/************************************************************************************ +* +* PrintTestParameters +* +************************************************************************************/ +void PrintTestParameters(bool_t bEraseLine) +{ + uint8_t u8lineLen = 63; + uint8_t u8Index; + + if(bEraseLine) + { + for(u8Index = 0;u8Index<u8lineLen;u8Index++) + { + uart.printf("\b"); + } + } + + uart.printf("Mode "); + if(mTxOperation_c == testOpMode) + { + uart.printf("Tx"); + } + else + { + uart.printf("Rx"); + } + uart.printf(", Channel "); + uart.printf("%d", (uint32_t)testChannel); + uart.printf(", Power "); + uart.printf("%d",(uint32_t)testPower); + uart.printf(", Payload "); + uart.printf("%d", (uint32_t)testPayloadLen); + uart.printf(", CCA Thresh "); + if(ccaThresh != 0) + { + uart.printf("-"); + } + uart.printf("%d", (uint32_t)ccaThresh); + uart.printf("dBm"); + uart.printf(" >"); +} +/*****************************************************************************/ + +int main() +{ + mainTask = new Thread(main_task); + while(1) + { + + } + return 0; +} \ No newline at end of file