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:
Wed Jun 08 01:40:42 2016 +0000
Revision:
5:6ffeac53b7cb
Parent:
0:69f2e28d12c1
Change state machine flow in main.cpp

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 5:6ffeac53b7cb 58 IsTxIntUpdate = true;
ubhat 0:69f2e28d12c1 59 }
ubhat 0:69f2e28d12c1 60
ubhat 0:69f2e28d12c1 61 /*!
ubhat 0:69f2e28d12c1 62 * \brief MCPS-Indication event function
ubhat 0:69f2e28d12c1 63 *
ubhat 0:69f2e28d12c1 64 * \param [IN] McpsIndication - Pointer to the indication structure,
ubhat 0:69f2e28d12c1 65 * containing indication attributes.
ubhat 0:69f2e28d12c1 66 */
ubhat 0:69f2e28d12c1 67 void McpsIndication( McpsIndication_t *McpsIndication )
ubhat 0:69f2e28d12c1 68 {
ubhat 0:69f2e28d12c1 69 uint8_t port;
ubhat 0:69f2e28d12c1 70
ubhat 0:69f2e28d12c1 71 Gps.service( );
ubhat 0:69f2e28d12c1 72
ubhat 0:69f2e28d12c1 73 if( McpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 74 {
ubhat 0:69f2e28d12c1 75 return;
ubhat 0:69f2e28d12c1 76 }
ubhat 0:69f2e28d12c1 77
ubhat 0:69f2e28d12c1 78 switch( McpsIndication->McpsIndication )
ubhat 0:69f2e28d12c1 79 {
ubhat 0:69f2e28d12c1 80 case MCPS_UNCONFIRMED:
ubhat 0:69f2e28d12c1 81 {
ubhat 0:69f2e28d12c1 82 break;
ubhat 0:69f2e28d12c1 83 }
ubhat 0:69f2e28d12c1 84 case MCPS_CONFIRMED:
ubhat 0:69f2e28d12c1 85 {
ubhat 0:69f2e28d12c1 86 break;
ubhat 0:69f2e28d12c1 87 }
ubhat 0:69f2e28d12c1 88 case MCPS_PROPRIETARY:
ubhat 0:69f2e28d12c1 89 {
ubhat 0:69f2e28d12c1 90 break;
ubhat 0:69f2e28d12c1 91 }
ubhat 0:69f2e28d12c1 92 case MCPS_MULTICAST:
ubhat 0:69f2e28d12c1 93 {
ubhat 0:69f2e28d12c1 94 break;
ubhat 0:69f2e28d12c1 95 }
ubhat 0:69f2e28d12c1 96 default:
ubhat 0:69f2e28d12c1 97 break;
ubhat 0:69f2e28d12c1 98 }
ubhat 0:69f2e28d12c1 99
ubhat 0:69f2e28d12c1 100 // Check Multicast
ubhat 0:69f2e28d12c1 101 // Check Port
ubhat 0:69f2e28d12c1 102 // Check Datarate
ubhat 0:69f2e28d12c1 103 // Check FramePending
ubhat 0:69f2e28d12c1 104 // Check Buffer
ubhat 0:69f2e28d12c1 105 // Check BufferSize
ubhat 0:69f2e28d12c1 106 // Check Rssi
ubhat 0:69f2e28d12c1 107 // Check Snr
ubhat 0:69f2e28d12c1 108 // Check RxSlot
ubhat 0:69f2e28d12c1 109 LoRaMacDownlinkStatus.Rssi = McpsIndication->Rssi;
ubhat 0:69f2e28d12c1 110 if( McpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
ubhat 0:69f2e28d12c1 111 {
ubhat 0:69f2e28d12c1 112 // Invert and divide by 4
ubhat 0:69f2e28d12c1 113 LoRaMacDownlinkStatus.Snr = ( ( ~McpsIndication->Snr + 1 ) & 0xFF ) >> 2;
ubhat 0:69f2e28d12c1 114 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
ubhat 0:69f2e28d12c1 115 }
ubhat 0:69f2e28d12c1 116 else
ubhat 0:69f2e28d12c1 117 {
ubhat 0:69f2e28d12c1 118 // Divide by 4
ubhat 0:69f2e28d12c1 119 LoRaMacDownlinkStatus.Snr = ( McpsIndication->Snr & 0xFF ) >> 2;
ubhat 0:69f2e28d12c1 120 }
ubhat 0:69f2e28d12c1 121 LoRaMacDownlinkStatus.DownlinkCounter++;
ubhat 0:69f2e28d12c1 122 LoRaMacDownlinkStatus.RxData = McpsIndication->RxData;
ubhat 0:69f2e28d12c1 123 LoRaMacDownlinkStatus.Port = McpsIndication->Port;
ubhat 0:69f2e28d12c1 124 LoRaMacDownlinkStatus.Buffer = McpsIndication->Buffer;
ubhat 0:69f2e28d12c1 125 LoRaMacDownlinkStatus.BufferSize = McpsIndication->BufferSize;
ubhat 0:69f2e28d12c1 126 LoRaMacDownlinkStatus.RxSlot = McpsIndication->RxSlot;
ubhat 0:69f2e28d12c1 127
ubhat 0:69f2e28d12c1 128 if( ComplianceTest.Running == 1 )
ubhat 0:69f2e28d12c1 129 {
ubhat 0:69f2e28d12c1 130 port = 224;
ubhat 0:69f2e28d12c1 131 ComplianceTest.DownLinkCounter++;
ubhat 0:69f2e28d12c1 132 }
ubhat 0:69f2e28d12c1 133 else
ubhat 0:69f2e28d12c1 134 {
ubhat 0:69f2e28d12c1 135 port = McpsIndication->Port;
ubhat 0:69f2e28d12c1 136 }
ubhat 0:69f2e28d12c1 137
ubhat 0:69f2e28d12c1 138 if( McpsIndication->RxData == true )
ubhat 0:69f2e28d12c1 139 {
ubhat 0:69f2e28d12c1 140 switch( port )
ubhat 0:69f2e28d12c1 141 {
ubhat 0:69f2e28d12c1 142 case 1: // The application LED can be controlled on port 1 or 2
ubhat 0:69f2e28d12c1 143 case 2:
ubhat 0:69f2e28d12c1 144 break;
ubhat 0:69f2e28d12c1 145 case 224:
ubhat 0:69f2e28d12c1 146 PrepareComplianceTestFrame( McpsIndication );
ubhat 0:69f2e28d12c1 147 break;
ubhat 0:69f2e28d12c1 148 default:
ubhat 0:69f2e28d12c1 149 break;
ubhat 0:69f2e28d12c1 150 }
ubhat 0:69f2e28d12c1 151 }
ubhat 0:69f2e28d12c1 152
ubhat 0:69f2e28d12c1 153 IsRxUpdate = true;
ubhat 0:69f2e28d12c1 154
ubhat 0:69f2e28d12c1 155 }
ubhat 0:69f2e28d12c1 156
ubhat 0:69f2e28d12c1 157 /*!
ubhat 0:69f2e28d12c1 158 * \brief MLME-Confirm event function
ubhat 0:69f2e28d12c1 159 *
ubhat 0:69f2e28d12c1 160 * \param [IN] MlmeConfirm - Pointer to the confirm structure,
ubhat 0:69f2e28d12c1 161 * containing confirm attributes.
ubhat 0:69f2e28d12c1 162 */
ubhat 0:69f2e28d12c1 163 void MlmeConfirm( MlmeConfirm_t *MlmeConfirm )
ubhat 0:69f2e28d12c1 164 {
ubhat 0:69f2e28d12c1 165 if( MlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
ubhat 0:69f2e28d12c1 166 {
ubhat 0:69f2e28d12c1 167 switch( MlmeConfirm->MlmeRequest )
ubhat 0:69f2e28d12c1 168 {
ubhat 0:69f2e28d12c1 169 case MLME_JOIN:
ubhat 0:69f2e28d12c1 170 {
ubhat 0:69f2e28d12c1 171 // Status is OK, node has joined the network
ubhat 0:69f2e28d12c1 172 IsNetworkJoinedStatusUpdate = true;
ubhat 0:69f2e28d12c1 173 break;
ubhat 0:69f2e28d12c1 174 }
ubhat 0:69f2e28d12c1 175 case MLME_LINK_CHECK:
ubhat 0:69f2e28d12c1 176 {
ubhat 0:69f2e28d12c1 177 // Check DemodMargin
ubhat 0:69f2e28d12c1 178 // Check NbGateways
ubhat 0:69f2e28d12c1 179 if( ComplianceTest.Running == true )
ubhat 0:69f2e28d12c1 180 {
ubhat 0:69f2e28d12c1 181 ComplianceTest.LinkCheck = true;
ubhat 0:69f2e28d12c1 182 ComplianceTest.DemodMargin = MlmeConfirm->DemodMargin;
ubhat 0:69f2e28d12c1 183 ComplianceTest.NbGateways = MlmeConfirm->NbGateways;
ubhat 0:69f2e28d12c1 184 }
ubhat 0:69f2e28d12c1 185 break;
ubhat 0:69f2e28d12c1 186 }
ubhat 0:69f2e28d12c1 187 default:
ubhat 0:69f2e28d12c1 188 break;
ubhat 0:69f2e28d12c1 189 }
ubhat 0:69f2e28d12c1 190 }
ubhat 0:69f2e28d12c1 191
ubhat 5:6ffeac53b7cb 192 // Schedule next packet transmission
ubhat 5:6ffeac53b7cb 193 TimerSetValue( &TxNextPacketTimer, OVER_THE_AIR_ACTIVATION_DUTYCYCLE );
ubhat 5:6ffeac53b7cb 194 TimerStart( &TxNextPacketTimer );
ubhat 5:6ffeac53b7cb 195
ubhat 5:6ffeac53b7cb 196 DeviceState = DEVICE_STATE_SLEEP;
ubhat 0:69f2e28d12c1 197 }