LoRa on Multitech with Semtech mote

Dependencies:   LoRaWAN-lib SX1272Lib lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo_Multitech by Nagaraj Krishnamurthy

Committer:
ubhat
Date:
Tue May 17 00:21:55 2016 +0000
Revision:
0:69f2e28d12c1
Child:
5:6ffeac53b7cb
Project for LoRa Bootcamp

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"
ubhat 0:69f2e28d12c1 17
ubhat 0:69f2e28d12c1 18 /*!
ubhat 0:69f2e28d12c1 19 * \brief MCPS-Confirm event function
ubhat 0:69f2e28d12c1 20 *
ubhat 0:69f2e28d12c1 21 * \param [IN] McpsConfirm - Pointer to the confirm structure,
ubhat 0:69f2e28d12c1 22 * containing confirm attributes.
ubhat 0:69f2e28d12c1 23 */
ubhat 0:69f2e28d12c1 24 void McpsConfirm( McpsConfirm_t *McpsConfirm )
ubhat 0:69f2e28d12c1 25 {
ubhat 0:69f2e28d12c1 26 if( McpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 27 {
ubhat 0:69f2e28d12c1 28 switch( McpsConfirm->McpsRequest )
ubhat 0:69f2e28d12c1 29 {
ubhat 0:69f2e28d12c1 30 case MCPS_UNCONFIRMED:
ubhat 0:69f2e28d12c1 31 {
ubhat 0:69f2e28d12c1 32 // Check Datarate
ubhat 0:69f2e28d12c1 33 // Check TxPower
ubhat 0:69f2e28d12c1 34 break;
ubhat 0:69f2e28d12c1 35 }
ubhat 0:69f2e28d12c1 36 case MCPS_CONFIRMED:
ubhat 0:69f2e28d12c1 37 {
ubhat 0:69f2e28d12c1 38 // Check Datarate
ubhat 0:69f2e28d12c1 39 // Check TxPower
ubhat 0:69f2e28d12c1 40 // Check AckReceived
ubhat 0:69f2e28d12c1 41 // Check NbRetries
ubhat 0:69f2e28d12c1 42 LoRaMacUplinkStatus.Acked = McpsConfirm->AckReceived;
ubhat 0:69f2e28d12c1 43 break;
ubhat 0:69f2e28d12c1 44 }
ubhat 0:69f2e28d12c1 45 case MCPS_PROPRIETARY:
ubhat 0:69f2e28d12c1 46 {
ubhat 0:69f2e28d12c1 47 break;
ubhat 0:69f2e28d12c1 48 }
ubhat 0:69f2e28d12c1 49 default:
ubhat 0:69f2e28d12c1 50 break;
ubhat 0:69f2e28d12c1 51 }
ubhat 0:69f2e28d12c1 52 }
ubhat 0:69f2e28d12c1 53
ubhat 0:69f2e28d12c1 54 LoRaMacUplinkStatus.Datarate = McpsConfirm->Datarate;
ubhat 0:69f2e28d12c1 55 LoRaMacUplinkStatus.UplinkCounter = McpsConfirm->UpLinkCounter;
ubhat 0:69f2e28d12c1 56 LoRaMacUplinkStatus.TxPower = McpsConfirm->TxPower;
ubhat 0:69f2e28d12c1 57
ubhat 0:69f2e28d12c1 58 DeviceState = DEVICE_STATE_CYCLE;
ubhat 0:69f2e28d12c1 59
ubhat 0:69f2e28d12c1 60 IsTxUpdate = true;
ubhat 0:69f2e28d12c1 61 }
ubhat 0:69f2e28d12c1 62
ubhat 0:69f2e28d12c1 63 /*!
ubhat 0:69f2e28d12c1 64 * \brief MCPS-Indication event function
ubhat 0:69f2e28d12c1 65 *
ubhat 0:69f2e28d12c1 66 * \param [IN] McpsIndication - Pointer to the indication structure,
ubhat 0:69f2e28d12c1 67 * containing indication attributes.
ubhat 0:69f2e28d12c1 68 */
ubhat 0:69f2e28d12c1 69 void McpsIndication( McpsIndication_t *McpsIndication )
ubhat 0:69f2e28d12c1 70 {
ubhat 0:69f2e28d12c1 71 uint8_t port;
ubhat 0:69f2e28d12c1 72
ubhat 0:69f2e28d12c1 73 Gps.service( );
ubhat 0:69f2e28d12c1 74
ubhat 0:69f2e28d12c1 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
ubhat 0:69f2e28d12c1 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
ubhat 0:69f2e28d12c1 111 LoRaMacDownlinkStatus.Rssi = McpsIndication->Rssi;
ubhat 0:69f2e28d12c1 112 if( McpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
ubhat 0:69f2e28d12c1 113 {
ubhat 0:69f2e28d12c1 114 // Invert and divide by 4
ubhat 0:69f2e28d12c1 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
ubhat 0:69f2e28d12c1 121 LoRaMacDownlinkStatus.Snr = ( McpsIndication->Snr & 0xFF ) >> 2;
ubhat 0:69f2e28d12c1 122 }
ubhat 0:69f2e28d12c1 123 LoRaMacDownlinkStatus.DownlinkCounter++;
ubhat 0:69f2e28d12c1 124 LoRaMacDownlinkStatus.RxData = McpsIndication->RxData;
ubhat 0:69f2e28d12c1 125 LoRaMacDownlinkStatus.Port = McpsIndication->Port;
ubhat 0:69f2e28d12c1 126 LoRaMacDownlinkStatus.Buffer = McpsIndication->Buffer;
ubhat 0:69f2e28d12c1 127 LoRaMacDownlinkStatus.BufferSize = McpsIndication->BufferSize;
ubhat 0:69f2e28d12c1 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 port = 224;
ubhat 0:69f2e28d12c1 133 ComplianceTest.DownLinkCounter++;
ubhat 0:69f2e28d12c1 134 }
ubhat 0:69f2e28d12c1 135 else
ubhat 0:69f2e28d12c1 136 {
ubhat 0:69f2e28d12c1 137 port = McpsIndication->Port;
ubhat 0:69f2e28d12c1 138 }
ubhat 0:69f2e28d12c1 139
ubhat 0:69f2e28d12c1 140 if( McpsIndication->RxData == true )
ubhat 0:69f2e28d12c1 141 {
ubhat 0:69f2e28d12c1 142 switch( port )
ubhat 0:69f2e28d12c1 143 {
ubhat 0:69f2e28d12c1 144 case 1: // The application LED can be controlled on port 1 or 2
ubhat 0:69f2e28d12c1 145 case 2:
ubhat 0:69f2e28d12c1 146 break;
ubhat 0:69f2e28d12c1 147 case 224:
ubhat 0:69f2e28d12c1 148 PrepareComplianceTestFrame( McpsIndication );
ubhat 0:69f2e28d12c1 149 break;
ubhat 0:69f2e28d12c1 150 default:
ubhat 0:69f2e28d12c1 151 break;
ubhat 0:69f2e28d12c1 152 }
ubhat 0:69f2e28d12c1 153 }
ubhat 0:69f2e28d12c1 154
ubhat 0:69f2e28d12c1 155 IsRxUpdate = true;
ubhat 0:69f2e28d12c1 156
ubhat 0:69f2e28d12c1 157 }
ubhat 0:69f2e28d12c1 158
ubhat 0:69f2e28d12c1 159 /*!
ubhat 0:69f2e28d12c1 160 * \brief MLME-Confirm event function
ubhat 0:69f2e28d12c1 161 *
ubhat 0:69f2e28d12c1 162 * \param [IN] MlmeConfirm - Pointer to the confirm structure,
ubhat 0:69f2e28d12c1 163 * containing confirm attributes.
ubhat 0:69f2e28d12c1 164 */
ubhat 0:69f2e28d12c1 165 void MlmeConfirm( MlmeConfirm_t *MlmeConfirm )
ubhat 0:69f2e28d12c1 166 {
ubhat 0:69f2e28d12c1 167 if( MlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 168 {
ubhat 0:69f2e28d12c1 169 switch( MlmeConfirm->MlmeRequest )
ubhat 0:69f2e28d12c1 170 {
ubhat 0:69f2e28d12c1 171 case MLME_JOIN:
ubhat 0:69f2e28d12c1 172 {
ubhat 0:69f2e28d12c1 173 // Status is OK, node has joined the network
ubhat 0:69f2e28d12c1 174 IsNetworkJoinedStatusUpdate = true;
ubhat 0:69f2e28d12c1 175 break;
ubhat 0:69f2e28d12c1 176 }
ubhat 0:69f2e28d12c1 177 case MLME_LINK_CHECK:
ubhat 0:69f2e28d12c1 178 {
ubhat 0:69f2e28d12c1 179 // Check DemodMargin
ubhat 0:69f2e28d12c1 180 // Check NbGateways
ubhat 0:69f2e28d12c1 181 if( ComplianceTest.Running == true )
ubhat 0:69f2e28d12c1 182 {
ubhat 0:69f2e28d12c1 183 ComplianceTest.LinkCheck = true;
ubhat 0:69f2e28d12c1 184 ComplianceTest.DemodMargin = MlmeConfirm->DemodMargin;
ubhat 0:69f2e28d12c1 185 ComplianceTest.NbGateways = MlmeConfirm->NbGateways;
ubhat 0:69f2e28d12c1 186 }
ubhat 0:69f2e28d12c1 187 break;
ubhat 0:69f2e28d12c1 188 }
ubhat 0:69f2e28d12c1 189 default:
ubhat 0:69f2e28d12c1 190 break;
ubhat 0:69f2e28d12c1 191 }
ubhat 0:69f2e28d12c1 192 }
ubhat 0:69f2e28d12c1 193
ubhat 0:69f2e28d12c1 194 DeviceState = DEVICE_STATE_CYCLE;
ubhat 0:69f2e28d12c1 195 }