mQ Branch for NA mote testing

Dependencies:   LoRaWAN-lib SX1272Lib-mQ lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo by Semtech

Committer:
mluis
Date:
Mon Apr 24 13:47:27 2017 +0000
Revision:
18:18408c3c2d0c
Parent:
5:6ffeac53b7cb
WARNING: Radio API timings changed from micro-seconds to milliseconds; ; Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739; Updated all libraries to the latest versions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ubhat 0:69f2e28d12c1 1 /*
ubhat 0:69f2e28d12c1 2 / _____) _ | |
ubhat 0:69f2e28d12c1 3 ( (____ _____ ____ _| |_ _____ ____| |__
ubhat 0:69f2e28d12c1 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
ubhat 0:69f2e28d12c1 5 _____) ) ____| | | || |_| ____( (___| | | |
ubhat 0:69f2e28d12c1 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
ubhat 0:69f2e28d12c1 7 (C)2015 Semtech
ubhat 0:69f2e28d12c1 8
ubhat 0:69f2e28d12c1 9 Description: MAC Layer Services: MLME & MCPS
ubhat 0:69f2e28d12c1 10
ubhat 0:69f2e28d12c1 11 License: Revised BSD License, see LICENSE.TXT file include in the project
ubhat 0:69f2e28d12c1 12
ubhat 0:69f2e28d12c1 13 Maintainer: Uttam Bhat
ubhat 0:69f2e28d12c1 14 */
ubhat 0:69f2e28d12c1 15
ubhat 0:69f2e28d12c1 16 #include "LoRaMacLayerService.h"
mluis 18:18408c3c2d0c 17 #include "SerialDisplay.h"
ubhat 0:69f2e28d12c1 18
ubhat 0:69f2e28d12c1 19 /*!
ubhat 0:69f2e28d12c1 20 * \brief MCPS-Confirm event function
ubhat 0:69f2e28d12c1 21 *
ubhat 0:69f2e28d12c1 22 * \param [IN] McpsConfirm - Pointer to the confirm structure,
ubhat 0:69f2e28d12c1 23 * containing confirm attributes.
ubhat 0:69f2e28d12c1 24 */
mluis 18:18408c3c2d0c 25 void McpsConfirm( McpsConfirm_t *mcpsConfirm )
ubhat 0:69f2e28d12c1 26 {
mluis 18:18408c3c2d0c 27 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 28 {
mluis 18:18408c3c2d0c 29 switch( mcpsConfirm->McpsRequest )
ubhat 0:69f2e28d12c1 30 {
ubhat 0:69f2e28d12c1 31 case MCPS_UNCONFIRMED:
ubhat 0:69f2e28d12c1 32 {
ubhat 0:69f2e28d12c1 33 // Check Datarate
ubhat 0:69f2e28d12c1 34 // Check TxPower
ubhat 0:69f2e28d12c1 35 break;
ubhat 0:69f2e28d12c1 36 }
ubhat 0:69f2e28d12c1 37 case MCPS_CONFIRMED:
ubhat 0:69f2e28d12c1 38 {
ubhat 0:69f2e28d12c1 39 // Check Datarate
ubhat 0:69f2e28d12c1 40 // Check TxPower
ubhat 0:69f2e28d12c1 41 // Check AckReceived
ubhat 0:69f2e28d12c1 42 // Check NbRetries
mluis 18:18408c3c2d0c 43 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
ubhat 0:69f2e28d12c1 44 break;
ubhat 0:69f2e28d12c1 45 }
ubhat 0:69f2e28d12c1 46 case MCPS_PROPRIETARY:
ubhat 0:69f2e28d12c1 47 {
ubhat 0:69f2e28d12c1 48 break;
ubhat 0:69f2e28d12c1 49 }
ubhat 0:69f2e28d12c1 50 default:
ubhat 0:69f2e28d12c1 51 break;
ubhat 0:69f2e28d12c1 52 }
ubhat 0:69f2e28d12c1 53 }
ubhat 0:69f2e28d12c1 54
mluis 18:18408c3c2d0c 55 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
mluis 18:18408c3c2d0c 56 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
mluis 18:18408c3c2d0c 57 LoRaMacUplinkStatus.TxPower = mcpsConfirm->TxPower;
mluis 18:18408c3c2d0c 58 LoRaMacUplinkStatus.UpLinkFrequency = mcpsConfirm->UpLinkFrequency;
mluis 18:18408c3c2d0c 59 SerialDisplayTxUpdate( );
ubhat 0:69f2e28d12c1 60
ubhat 5:6ffeac53b7cb 61 IsTxIntUpdate = true;
mluis 18:18408c3c2d0c 62 NextTx = true;
ubhat 0:69f2e28d12c1 63 }
ubhat 0:69f2e28d12c1 64
ubhat 0:69f2e28d12c1 65 /*!
ubhat 0:69f2e28d12c1 66 * \brief MCPS-Indication event function
ubhat 0:69f2e28d12c1 67 *
ubhat 0:69f2e28d12c1 68 * \param [IN] McpsIndication - Pointer to the indication structure,
ubhat 0:69f2e28d12c1 69 * containing indication attributes.
ubhat 0:69f2e28d12c1 70 */
mluis 18:18408c3c2d0c 71 void McpsIndication( McpsIndication_t *mcpsIndication )
ubhat 0:69f2e28d12c1 72 {
ubhat 0:69f2e28d12c1 73 Gps.service( );
ubhat 0:69f2e28d12c1 74
mluis 18:18408c3c2d0c 75 if( mcpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 76 {
ubhat 0:69f2e28d12c1 77 return;
ubhat 0:69f2e28d12c1 78 }
ubhat 0:69f2e28d12c1 79
mluis 18:18408c3c2d0c 80 switch( mcpsIndication->McpsIndication )
ubhat 0:69f2e28d12c1 81 {
ubhat 0:69f2e28d12c1 82 case MCPS_UNCONFIRMED:
ubhat 0:69f2e28d12c1 83 {
ubhat 0:69f2e28d12c1 84 break;
ubhat 0:69f2e28d12c1 85 }
ubhat 0:69f2e28d12c1 86 case MCPS_CONFIRMED:
ubhat 0:69f2e28d12c1 87 {
ubhat 0:69f2e28d12c1 88 break;
ubhat 0:69f2e28d12c1 89 }
ubhat 0:69f2e28d12c1 90 case MCPS_PROPRIETARY:
ubhat 0:69f2e28d12c1 91 {
ubhat 0:69f2e28d12c1 92 break;
ubhat 0:69f2e28d12c1 93 }
ubhat 0:69f2e28d12c1 94 case MCPS_MULTICAST:
ubhat 0:69f2e28d12c1 95 {
ubhat 0:69f2e28d12c1 96 break;
ubhat 0:69f2e28d12c1 97 }
ubhat 0:69f2e28d12c1 98 default:
ubhat 0:69f2e28d12c1 99 break;
ubhat 0:69f2e28d12c1 100 }
ubhat 0:69f2e28d12c1 101
ubhat 0:69f2e28d12c1 102 // Check Multicast
ubhat 0:69f2e28d12c1 103 // Check Port
ubhat 0:69f2e28d12c1 104 // Check Datarate
ubhat 0:69f2e28d12c1 105 // Check FramePending
ubhat 0:69f2e28d12c1 106 // Check Buffer
ubhat 0:69f2e28d12c1 107 // Check BufferSize
ubhat 0:69f2e28d12c1 108 // Check Rssi
ubhat 0:69f2e28d12c1 109 // Check Snr
ubhat 0:69f2e28d12c1 110 // Check RxSlot
mluis 18:18408c3c2d0c 111 LoRaMacDownlinkStatus.Rssi = mcpsIndication->Rssi;
mluis 18:18408c3c2d0c 112 if( mcpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
ubhat 0:69f2e28d12c1 113 {
ubhat 0:69f2e28d12c1 114 // Invert and divide by 4
mluis 18:18408c3c2d0c 115 LoRaMacDownlinkStatus.Snr = ( ( ~mcpsIndication->Snr + 1 ) & 0xFF ) >> 2;
ubhat 0:69f2e28d12c1 116 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
ubhat 0:69f2e28d12c1 117 }
ubhat 0:69f2e28d12c1 118 else
ubhat 0:69f2e28d12c1 119 {
ubhat 0:69f2e28d12c1 120 // Divide by 4
mluis 18:18408c3c2d0c 121 LoRaMacDownlinkStatus.Snr = ( mcpsIndication->Snr & 0xFF ) >> 2;
ubhat 0:69f2e28d12c1 122 }
ubhat 0:69f2e28d12c1 123 LoRaMacDownlinkStatus.DownlinkCounter++;
mluis 18:18408c3c2d0c 124 LoRaMacDownlinkStatus.RxData = mcpsIndication->RxData;
mluis 18:18408c3c2d0c 125 LoRaMacDownlinkStatus.Port = mcpsIndication->Port;
mluis 18:18408c3c2d0c 126 LoRaMacDownlinkStatus.Buffer = mcpsIndication->Buffer;
mluis 18:18408c3c2d0c 127 LoRaMacDownlinkStatus.BufferSize = mcpsIndication->BufferSize;
mluis 18:18408c3c2d0c 128 LoRaMacDownlinkStatus.RxSlot = mcpsIndication->RxSlot;
ubhat 0:69f2e28d12c1 129
ubhat 0:69f2e28d12c1 130 if( ComplianceTest.Running == 1 )
ubhat 0:69f2e28d12c1 131 {
ubhat 0:69f2e28d12c1 132 ComplianceTest.DownLinkCounter++;
ubhat 0:69f2e28d12c1 133 }
mluis 18:18408c3c2d0c 134
mluis 18:18408c3c2d0c 135 if( mcpsIndication->RxData == true )
ubhat 0:69f2e28d12c1 136 {
mluis 18:18408c3c2d0c 137 switch( mcpsIndication->Port )
ubhat 0:69f2e28d12c1 138 {
ubhat 0:69f2e28d12c1 139 case 1: // The application LED can be controlled on port 1 or 2
mluis 18:18408c3c2d0c 140 case 2:
ubhat 0:69f2e28d12c1 141 break;
ubhat 0:69f2e28d12c1 142 case 224:
mluis 18:18408c3c2d0c 143 PrepareComplianceTestFrame( mcpsIndication );
ubhat 0:69f2e28d12c1 144 break;
ubhat 0:69f2e28d12c1 145 default:
ubhat 0:69f2e28d12c1 146 break;
ubhat 0:69f2e28d12c1 147 }
ubhat 0:69f2e28d12c1 148 }
ubhat 0:69f2e28d12c1 149
ubhat 0:69f2e28d12c1 150 IsRxUpdate = true;
ubhat 0:69f2e28d12c1 151 }
ubhat 0:69f2e28d12c1 152
ubhat 0:69f2e28d12c1 153 /*!
ubhat 0:69f2e28d12c1 154 * \brief MLME-Confirm event function
ubhat 0:69f2e28d12c1 155 *
ubhat 0:69f2e28d12c1 156 * \param [IN] MlmeConfirm - Pointer to the confirm structure,
ubhat 0:69f2e28d12c1 157 * containing confirm attributes.
ubhat 0:69f2e28d12c1 158 */
ubhat 0:69f2e28d12c1 159 void MlmeConfirm( MlmeConfirm_t *MlmeConfirm )
ubhat 0:69f2e28d12c1 160 {
mluis 18:18408c3c2d0c 161 MibRequestConfirm_t mibGet;
mluis 18:18408c3c2d0c 162
mluis 18:18408c3c2d0c 163 // Debug for join not alternating between DR0/DR4
mluis 18:18408c3c2d0c 164 if( MlmeConfirm->MlmeRequest == MLME_JOIN )
mluis 18:18408c3c2d0c 165 {
mluis 18:18408c3c2d0c 166 mibGet.Type = MIB_CHANNELS_DATARATE;
mluis 18:18408c3c2d0c 167 LoRaMacMibGetRequestConfirm( &mibGet );
mluis 18:18408c3c2d0c 168 SerialDisplayJoinDataRateUpdate( mibGet.Param.ChannelsDatarate );
mluis 18:18408c3c2d0c 169 LoRaMacJoinStatus.LastDatarate = mibGet.Param.ChannelsDatarate;
mluis 18:18408c3c2d0c 170 }
mluis 18:18408c3c2d0c 171
ubhat 0:69f2e28d12c1 172 if( MlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 173 {
ubhat 0:69f2e28d12c1 174 switch( MlmeConfirm->MlmeRequest )
ubhat 0:69f2e28d12c1 175 {
ubhat 0:69f2e28d12c1 176 case MLME_JOIN:
ubhat 0:69f2e28d12c1 177 {
ubhat 0:69f2e28d12c1 178 // Status is OK, node has joined the network
ubhat 0:69f2e28d12c1 179 IsNetworkJoinedStatusUpdate = true;
mluis 18:18408c3c2d0c 180 DeviceState = DEVICE_STATE_SEND;
ubhat 0:69f2e28d12c1 181 break;
ubhat 0:69f2e28d12c1 182 }
ubhat 0:69f2e28d12c1 183 case MLME_LINK_CHECK:
ubhat 0:69f2e28d12c1 184 {
ubhat 0:69f2e28d12c1 185 // Check DemodMargin
ubhat 0:69f2e28d12c1 186 // Check NbGateways
ubhat 0:69f2e28d12c1 187 if( ComplianceTest.Running == true )
ubhat 0:69f2e28d12c1 188 {
ubhat 0:69f2e28d12c1 189 ComplianceTest.LinkCheck = true;
ubhat 0:69f2e28d12c1 190 ComplianceTest.DemodMargin = MlmeConfirm->DemodMargin;
ubhat 0:69f2e28d12c1 191 ComplianceTest.NbGateways = MlmeConfirm->NbGateways;
ubhat 0:69f2e28d12c1 192 }
ubhat 0:69f2e28d12c1 193 break;
ubhat 0:69f2e28d12c1 194 }
ubhat 0:69f2e28d12c1 195 default:
ubhat 0:69f2e28d12c1 196 break;
ubhat 0:69f2e28d12c1 197 }
ubhat 0:69f2e28d12c1 198 }
ubhat 0:69f2e28d12c1 199
mluis 18:18408c3c2d0c 200 NextTx = true;
mluis 18:18408c3c2d0c 201 }