Semtech stack for ELMO - ver. 4.1.0.

Dependencies:   SX1272lib mbed

Fork of LoRaWAN_Semtech_stack_v4.1 by Michal Leksinski

Committer:
mleksio
Date:
Fri Apr 22 07:37:04 2016 +0000
Revision:
5:cbb921e2a03b
Parent:
1:2be292bd43f9
Removed unused files.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mleksio 1:2be292bd43f9 1 /*
mleksio 1:2be292bd43f9 2 / _____) _ | |
mleksio 1:2be292bd43f9 3 ( (____ _____ ____ _| |_ _____ ____| |__
mleksio 1:2be292bd43f9 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
mleksio 1:2be292bd43f9 5 _____) ) ____| | | || |_| ____( (___| | | |
mleksio 1:2be292bd43f9 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mleksio 1:2be292bd43f9 7 (C)2013 Semtech
mleksio 1:2be292bd43f9 8 ___ _____ _ ___ _ _____ ___ ___ ___ ___
mleksio 1:2be292bd43f9 9 / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __|
mleksio 1:2be292bd43f9 10 \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _|
mleksio 1:2be292bd43f9 11 |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___|
mleksio 1:2be292bd43f9 12 embedded.connectivity.solutions===============
mleksio 1:2be292bd43f9 13 Description: LoRa MAC layer implementation
mleksio 1:2be292bd43f9 14 License: Revised BSD License, see LICENSE.TXT file include in the project
mleksio 1:2be292bd43f9 15 Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jäckle ( STACKFORCE )
mleksio 1:2be292bd43f9 16 */
mleksio 1:2be292bd43f9 17 //#include "board.h"
mleksio 1:2be292bd43f9 18 #include "mbed.h"
mleksio 1:2be292bd43f9 19 #include "LoRaMac-api-v3.h"
mleksio 1:2be292bd43f9 20 #include "LoRaMacTest.h"
mleksio 1:2be292bd43f9 21 #include "utilities.h"
mleksio 1:2be292bd43f9 22
mleksio 1:2be292bd43f9 23 /*!
mleksio 1:2be292bd43f9 24 * Extern function declarations.
mleksio 1:2be292bd43f9 25 */
mleksio 1:2be292bd43f9 26 extern LoRaMacStatus_t Send( LoRaMacHeader_t *macHdr, uint8_t fPort,
mleksio 1:2be292bd43f9 27 void *fBuffer, uint16_t fBufferSize );
mleksio 1:2be292bd43f9 28 extern LoRaMacStatus_t PrepareFrame( LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl,
mleksio 1:2be292bd43f9 29 uint8_t fPort, void *fBuffer, uint16_t fBufferSize );
mleksio 1:2be292bd43f9 30 extern LoRaMacStatus_t SendFrameOnChannel( ChannelParams_t channel );
mleksio 1:2be292bd43f9 31 extern uint32_t LoRaMacState;
mleksio 1:2be292bd43f9 32 extern LoRaMacFlags_t LoRaMacFlags;
mleksio 1:2be292bd43f9 33
mleksio 1:2be292bd43f9 34 /*!
mleksio 1:2be292bd43f9 35 * Static variables
mleksio 1:2be292bd43f9 36 */
mleksio 1:2be292bd43f9 37 static LoRaMacEventFlags_t LoRaMacEventFlags;
mleksio 1:2be292bd43f9 38 static LoRaMacEventInfo_t LoRaMacEventInfo;
mleksio 1:2be292bd43f9 39 static LoRaMacPrimitives_t LoRaMacPrimitives;
mleksio 1:2be292bd43f9 40 static LoRaMacCallback_t LoRaMacCallback;
mleksio 1:2be292bd43f9 41 static LoRaMacCallbacks_t LoRaMacCallbacks;
mleksio 1:2be292bd43f9 42
mleksio 1:2be292bd43f9 43 /*!
mleksio 1:2be292bd43f9 44 * \brief MCPS-Confirm event function
mleksio 1:2be292bd43f9 45 *
mleksio 1:2be292bd43f9 46 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
mleksio 1:2be292bd43f9 47 * containing confirm attributes.
mleksio 1:2be292bd43f9 48 */
mleksio 1:2be292bd43f9 49 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
mleksio 1:2be292bd43f9 50 {
mleksio 1:2be292bd43f9 51 LoRaMacEventInfo.Status = mcpsConfirm->Status;
mleksio 1:2be292bd43f9 52 LoRaMacEventFlags.Bits.Tx = 1;
mleksio 1:2be292bd43f9 53
mleksio 1:2be292bd43f9 54 LoRaMacEventInfo.TxDatarate = mcpsConfirm->Datarate;
mleksio 1:2be292bd43f9 55 LoRaMacEventInfo.TxNbRetries = mcpsConfirm->NbRetries;
mleksio 1:2be292bd43f9 56 LoRaMacEventInfo.TxAckReceived = mcpsConfirm->AckReceived;
mleksio 1:2be292bd43f9 57
mleksio 1:2be292bd43f9 58 if( ( LoRaMacFlags.Bits.McpsInd != 1 ) && ( LoRaMacFlags.Bits.MlmeReq != 1 ) )
mleksio 1:2be292bd43f9 59 {
mleksio 1:2be292bd43f9 60 LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
mleksio 1:2be292bd43f9 61 LoRaMacEventFlags.Value = 0;
mleksio 1:2be292bd43f9 62 }
mleksio 1:2be292bd43f9 63 }
mleksio 1:2be292bd43f9 64
mleksio 1:2be292bd43f9 65 /*!
mleksio 1:2be292bd43f9 66 * \brief MCPS-Indication event function
mleksio 1:2be292bd43f9 67 *
mleksio 1:2be292bd43f9 68 * \param [IN] mcpsIndication - Pointer to the indication structure,
mleksio 1:2be292bd43f9 69 * containing indication attributes.
mleksio 1:2be292bd43f9 70 */
mleksio 1:2be292bd43f9 71 static void McpsIndication( McpsIndication_t *mcpsIndication )
mleksio 1:2be292bd43f9 72 {
mleksio 1:2be292bd43f9 73 LoRaMacEventInfo.Status = mcpsIndication->Status;
mleksio 1:2be292bd43f9 74 LoRaMacEventFlags.Bits.Rx = 1;
mleksio 1:2be292bd43f9 75 LoRaMacEventFlags.Bits.RxSlot = mcpsIndication->RxSlot;
mleksio 1:2be292bd43f9 76 LoRaMacEventFlags.Bits.Multicast = mcpsIndication->Multicast;
mleksio 1:2be292bd43f9 77 if( mcpsIndication->RxData == true )
mleksio 1:2be292bd43f9 78 {
mleksio 1:2be292bd43f9 79 LoRaMacEventFlags.Bits.RxData = 1;
mleksio 1:2be292bd43f9 80 }
mleksio 1:2be292bd43f9 81
mleksio 1:2be292bd43f9 82 LoRaMacEventInfo.RxPort = mcpsIndication->Port;
mleksio 1:2be292bd43f9 83 LoRaMacEventInfo.RxBuffer = mcpsIndication->Buffer;
mleksio 1:2be292bd43f9 84 LoRaMacEventInfo.RxBufferSize = mcpsIndication->BufferSize;
mleksio 1:2be292bd43f9 85 LoRaMacEventInfo.RxRssi = mcpsIndication->Rssi;
mleksio 1:2be292bd43f9 86 LoRaMacEventInfo.RxSnr = mcpsIndication->Snr;
mleksio 1:2be292bd43f9 87
mleksio 1:2be292bd43f9 88 LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
mleksio 1:2be292bd43f9 89 LoRaMacEventFlags.Value = 0;
mleksio 1:2be292bd43f9 90 }
mleksio 1:2be292bd43f9 91
mleksio 1:2be292bd43f9 92 /*!
mleksio 1:2be292bd43f9 93 * \brief MLME-Confirm event function
mleksio 1:2be292bd43f9 94 *
mleksio 1:2be292bd43f9 95 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
mleksio 1:2be292bd43f9 96 * containing confirm attributes.
mleksio 1:2be292bd43f9 97 */
mleksio 1:2be292bd43f9 98 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
mleksio 1:2be292bd43f9 99 {
mleksio 1:2be292bd43f9 100 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
mleksio 1:2be292bd43f9 101 {
mleksio 1:2be292bd43f9 102 switch( mlmeConfirm->MlmeRequest )
mleksio 1:2be292bd43f9 103 {
mleksio 1:2be292bd43f9 104 case MLME_JOIN:
mleksio 1:2be292bd43f9 105 {
mleksio 1:2be292bd43f9 106 // Status is OK, node has joined the network
mleksio 1:2be292bd43f9 107 LoRaMacEventInfo.Status = mlmeConfirm->Status;
mleksio 1:2be292bd43f9 108 LoRaMacEventFlags.Bits.Tx = 1;
mleksio 1:2be292bd43f9 109 LoRaMacEventFlags.Bits.Rx = 1;
mleksio 1:2be292bd43f9 110 LoRaMacEventFlags.Bits.JoinAccept = 1;
mleksio 1:2be292bd43f9 111 break;
mleksio 1:2be292bd43f9 112 }
mleksio 1:2be292bd43f9 113 case MLME_LINK_CHECK:
mleksio 1:2be292bd43f9 114 {
mleksio 1:2be292bd43f9 115 LoRaMacEventFlags.Bits.Tx = 1;
mleksio 1:2be292bd43f9 116 LoRaMacEventFlags.Bits.Rx = 1;
mleksio 1:2be292bd43f9 117 LoRaMacEventFlags.Bits.LinkCheck = 1;
mleksio 1:2be292bd43f9 118
mleksio 1:2be292bd43f9 119 LoRaMacEventInfo.DemodMargin = mlmeConfirm->DemodMargin;
mleksio 1:2be292bd43f9 120 LoRaMacEventInfo.NbGateways = mlmeConfirm->NbGateways;
mleksio 1:2be292bd43f9 121 break;
mleksio 1:2be292bd43f9 122 }
mleksio 1:2be292bd43f9 123 default:
mleksio 1:2be292bd43f9 124 break;
mleksio 1:2be292bd43f9 125 }
mleksio 1:2be292bd43f9 126 }
mleksio 1:2be292bd43f9 127
mleksio 1:2be292bd43f9 128 if( LoRaMacFlags.Bits.McpsInd != 1 )
mleksio 1:2be292bd43f9 129 {
mleksio 1:2be292bd43f9 130 LoRaMacCallbacks.MacEvent( &LoRaMacEventFlags, &LoRaMacEventInfo );
mleksio 1:2be292bd43f9 131 LoRaMacEventFlags.Value = 0;
mleksio 1:2be292bd43f9 132 }
mleksio 1:2be292bd43f9 133 }
mleksio 1:2be292bd43f9 134
mleksio 1:2be292bd43f9 135 void LoRaMacInit( LoRaMacCallbacks_t *callbacks )
mleksio 1:2be292bd43f9 136 {
mleksio 1:2be292bd43f9 137 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
mleksio 1:2be292bd43f9 138 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
mleksio 1:2be292bd43f9 139 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
mleksio 1:2be292bd43f9 140
mleksio 1:2be292bd43f9 141 LoRaMacCallbacks.MacEvent = callbacks->MacEvent;
mleksio 1:2be292bd43f9 142 LoRaMacCallbacks.GetBatteryLevel = callbacks->GetBatteryLevel;
mleksio 1:2be292bd43f9 143 LoRaMacCallback.GetBatteryLevel = callbacks->GetBatteryLevel;
mleksio 1:2be292bd43f9 144
mleksio 1:2be292bd43f9 145 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallback );
mleksio 1:2be292bd43f9 146 }
mleksio 1:2be292bd43f9 147
mleksio 1:2be292bd43f9 148 void LoRaMacSetAdrOn( bool enable )
mleksio 1:2be292bd43f9 149 {
mleksio 1:2be292bd43f9 150 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 151
mleksio 1:2be292bd43f9 152 mibSet.Type = MIB_ADR;
mleksio 1:2be292bd43f9 153 mibSet.Param.AdrEnable = enable;
mleksio 1:2be292bd43f9 154
mleksio 1:2be292bd43f9 155 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 156 }
mleksio 1:2be292bd43f9 157
mleksio 1:2be292bd43f9 158 void LoRaMacInitNwkIds( uint32_t netID, uint32_t devAddr, uint8_t *nwkSKey, uint8_t *appSKey )
mleksio 1:2be292bd43f9 159 {
mleksio 1:2be292bd43f9 160 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 161
mleksio 1:2be292bd43f9 162 mibSet.Type = MIB_NET_ID;
mleksio 1:2be292bd43f9 163 mibSet.Param.NetID = netID;
mleksio 1:2be292bd43f9 164
mleksio 1:2be292bd43f9 165 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 166
mleksio 1:2be292bd43f9 167 mibSet.Type = MIB_DEV_ADDR;
mleksio 1:2be292bd43f9 168 mibSet.Param.DevAddr = devAddr;
mleksio 1:2be292bd43f9 169
mleksio 1:2be292bd43f9 170 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 171
mleksio 1:2be292bd43f9 172 mibSet.Type = MIB_NWK_SKEY;
mleksio 1:2be292bd43f9 173 mibSet.Param.NwkSKey = nwkSKey;
mleksio 1:2be292bd43f9 174
mleksio 1:2be292bd43f9 175 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 176
mleksio 1:2be292bd43f9 177 mibSet.Type = MIB_APP_SKEY;
mleksio 1:2be292bd43f9 178 mibSet.Param.AppSKey = appSKey;
mleksio 1:2be292bd43f9 179
mleksio 1:2be292bd43f9 180 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 181
mleksio 1:2be292bd43f9 182 mibSet.Type = MIB_NETWORK_JOINED;
mleksio 1:2be292bd43f9 183 mibSet.Param.IsNetworkJoined = true;
mleksio 1:2be292bd43f9 184
mleksio 1:2be292bd43f9 185 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 186 }
mleksio 1:2be292bd43f9 187
mleksio 1:2be292bd43f9 188 void LoRaMacMulticastChannelAdd( MulticastParams_t *channelParam )
mleksio 1:2be292bd43f9 189 {
mleksio 1:2be292bd43f9 190 LoRaMacMulticastChannelLink( channelParam );
mleksio 1:2be292bd43f9 191 }
mleksio 1:2be292bd43f9 192
mleksio 1:2be292bd43f9 193 void LoRaMacMulticastChannelRemove( MulticastParams_t *channelParam )
mleksio 1:2be292bd43f9 194 {
mleksio 1:2be292bd43f9 195 LoRaMacMulticastChannelUnlink( channelParam );
mleksio 1:2be292bd43f9 196 }
mleksio 1:2be292bd43f9 197
mleksio 1:2be292bd43f9 198 uint8_t LoRaMacJoinReq( uint8_t *devEui, uint8_t *appEui, uint8_t *appKey )
mleksio 1:2be292bd43f9 199 {
mleksio 1:2be292bd43f9 200 MlmeReq_t mlmeRequest;
mleksio 1:2be292bd43f9 201 uint8_t status;
mleksio 1:2be292bd43f9 202
mleksio 1:2be292bd43f9 203 mlmeRequest.Type = MLME_JOIN;
mleksio 1:2be292bd43f9 204 mlmeRequest.Req.Join.AppEui = appEui;
mleksio 1:2be292bd43f9 205 mlmeRequest.Req.Join.AppKey = appKey;
mleksio 1:2be292bd43f9 206 mlmeRequest.Req.Join.DevEui = devEui;
mleksio 1:2be292bd43f9 207
mleksio 1:2be292bd43f9 208 switch( LoRaMacMlmeRequest( &mlmeRequest ) )
mleksio 1:2be292bd43f9 209 {
mleksio 1:2be292bd43f9 210 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 211 {
mleksio 1:2be292bd43f9 212 status = 0;
mleksio 1:2be292bd43f9 213 break;
mleksio 1:2be292bd43f9 214 }
mleksio 1:2be292bd43f9 215 case LORAMAC_STATUS_BUSY:
mleksio 1:2be292bd43f9 216 {
mleksio 1:2be292bd43f9 217 status = 1;
mleksio 1:2be292bd43f9 218 break;
mleksio 1:2be292bd43f9 219 }
mleksio 1:2be292bd43f9 220 case LORAMAC_STATUS_NO_NETWORK_JOINED:
mleksio 1:2be292bd43f9 221 {
mleksio 1:2be292bd43f9 222 status = 2;
mleksio 1:2be292bd43f9 223 break;
mleksio 1:2be292bd43f9 224 }
mleksio 1:2be292bd43f9 225 case LORAMAC_STATUS_LENGTH_ERROR:
mleksio 1:2be292bd43f9 226 case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
mleksio 1:2be292bd43f9 227 {
mleksio 1:2be292bd43f9 228 status = 3;
mleksio 1:2be292bd43f9 229 break;
mleksio 1:2be292bd43f9 230 }
mleksio 1:2be292bd43f9 231 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 232 {
mleksio 1:2be292bd43f9 233 status = 4;
mleksio 1:2be292bd43f9 234 break;
mleksio 1:2be292bd43f9 235 }
mleksio 1:2be292bd43f9 236 case LORAMAC_STATUS_DEVICE_OFF:
mleksio 1:2be292bd43f9 237 {
mleksio 1:2be292bd43f9 238 status = 6;
mleksio 1:2be292bd43f9 239 break;
mleksio 1:2be292bd43f9 240 }
mleksio 1:2be292bd43f9 241 default:
mleksio 1:2be292bd43f9 242 {
mleksio 1:2be292bd43f9 243 status = 1;
mleksio 1:2be292bd43f9 244 break;
mleksio 1:2be292bd43f9 245 }
mleksio 1:2be292bd43f9 246 }
mleksio 1:2be292bd43f9 247
mleksio 1:2be292bd43f9 248 return status;
mleksio 1:2be292bd43f9 249 }
mleksio 1:2be292bd43f9 250
mleksio 1:2be292bd43f9 251 uint8_t LoRaMacLinkCheckReq( void )
mleksio 1:2be292bd43f9 252 {
mleksio 1:2be292bd43f9 253 MlmeReq_t mlmeRequest;
mleksio 1:2be292bd43f9 254 uint8_t status;
mleksio 1:2be292bd43f9 255
mleksio 1:2be292bd43f9 256 mlmeRequest.Type = MLME_LINK_CHECK;
mleksio 1:2be292bd43f9 257
mleksio 1:2be292bd43f9 258 switch( LoRaMacMlmeRequest( &mlmeRequest ) )
mleksio 1:2be292bd43f9 259 {
mleksio 1:2be292bd43f9 260 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 261 {
mleksio 1:2be292bd43f9 262 status = 0;
mleksio 1:2be292bd43f9 263 break;
mleksio 1:2be292bd43f9 264 }
mleksio 1:2be292bd43f9 265 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 266 {
mleksio 1:2be292bd43f9 267 status = 1;
mleksio 1:2be292bd43f9 268 break;
mleksio 1:2be292bd43f9 269 }
mleksio 1:2be292bd43f9 270 default:
mleksio 1:2be292bd43f9 271 {
mleksio 1:2be292bd43f9 272 status = 1;
mleksio 1:2be292bd43f9 273 break;
mleksio 1:2be292bd43f9 274 }
mleksio 1:2be292bd43f9 275 }
mleksio 1:2be292bd43f9 276
mleksio 1:2be292bd43f9 277 return status;
mleksio 1:2be292bd43f9 278 }
mleksio 1:2be292bd43f9 279
mleksio 1:2be292bd43f9 280 uint8_t LoRaMacSendFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
mleksio 1:2be292bd43f9 281 {
mleksio 1:2be292bd43f9 282 MibRequestConfirm_t mibGet;
mleksio 1:2be292bd43f9 283 McpsReq_t mcpsRequest;
mleksio 1:2be292bd43f9 284 uint8_t retStatus;
mleksio 1:2be292bd43f9 285
mleksio 1:2be292bd43f9 286 memset1( ( uint8_t* )&LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
mleksio 1:2be292bd43f9 287
mleksio 1:2be292bd43f9 288 mibGet.Type = MIB_CHANNELS_DATARATE;
mleksio 1:2be292bd43f9 289 LoRaMacMibGetRequestConfirm( &mibGet );
mleksio 1:2be292bd43f9 290
mleksio 1:2be292bd43f9 291 mcpsRequest.Type = MCPS_UNCONFIRMED;
mleksio 1:2be292bd43f9 292 mcpsRequest.Req.Unconfirmed.fBuffer = fBuffer;
mleksio 1:2be292bd43f9 293 mcpsRequest.Req.Unconfirmed.fBufferSize = fBufferSize;
mleksio 1:2be292bd43f9 294 mcpsRequest.Req.Unconfirmed.fPort = fPort;
mleksio 1:2be292bd43f9 295 mcpsRequest.Req.Unconfirmed.Datarate = mibGet.Param.ChannelsDatarate;
mleksio 1:2be292bd43f9 296
mleksio 1:2be292bd43f9 297 switch( LoRaMacMcpsRequest( &mcpsRequest ) )
mleksio 1:2be292bd43f9 298 {
mleksio 1:2be292bd43f9 299 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 300 retStatus = 0U;
mleksio 1:2be292bd43f9 301 break;
mleksio 1:2be292bd43f9 302 case LORAMAC_STATUS_BUSY:
mleksio 1:2be292bd43f9 303 retStatus = 1U;
mleksio 1:2be292bd43f9 304 break;
mleksio 1:2be292bd43f9 305 case LORAMAC_STATUS_NO_NETWORK_JOINED:
mleksio 1:2be292bd43f9 306 retStatus = 2U;
mleksio 1:2be292bd43f9 307 break;
mleksio 1:2be292bd43f9 308 case LORAMAC_STATUS_LENGTH_ERROR:
mleksio 1:2be292bd43f9 309 case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
mleksio 1:2be292bd43f9 310 retStatus = 3U;
mleksio 1:2be292bd43f9 311 break;
mleksio 1:2be292bd43f9 312 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 313 retStatus = 4U;
mleksio 1:2be292bd43f9 314 break;
mleksio 1:2be292bd43f9 315 case LORAMAC_STATUS_DEVICE_OFF:
mleksio 1:2be292bd43f9 316 retStatus = 6U;
mleksio 1:2be292bd43f9 317 break;
mleksio 1:2be292bd43f9 318 default:
mleksio 1:2be292bd43f9 319 retStatus = 1U;
mleksio 1:2be292bd43f9 320 break;
mleksio 1:2be292bd43f9 321 }
mleksio 1:2be292bd43f9 322
mleksio 1:2be292bd43f9 323 return retStatus;
mleksio 1:2be292bd43f9 324 }
mleksio 1:2be292bd43f9 325
mleksio 1:2be292bd43f9 326 uint8_t LoRaMacSendConfirmedFrame( uint8_t fPort, void *fBuffer, uint16_t fBufferSize, uint8_t nbRetries )
mleksio 1:2be292bd43f9 327 {
mleksio 1:2be292bd43f9 328 MibRequestConfirm_t mibGet;
mleksio 1:2be292bd43f9 329 McpsReq_t mcpsRequest;
mleksio 1:2be292bd43f9 330 uint8_t retStatus;
mleksio 1:2be292bd43f9 331
mleksio 1:2be292bd43f9 332 memset1( ( uint8_t* )&LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
mleksio 1:2be292bd43f9 333
mleksio 1:2be292bd43f9 334 mibGet.Type = MIB_CHANNELS_DATARATE;
mleksio 1:2be292bd43f9 335 LoRaMacMibGetRequestConfirm( &mibGet );
mleksio 1:2be292bd43f9 336
mleksio 1:2be292bd43f9 337 mcpsRequest.Type = MCPS_CONFIRMED;
mleksio 1:2be292bd43f9 338 mcpsRequest.Req.Confirmed.fBuffer = fBuffer;
mleksio 1:2be292bd43f9 339 mcpsRequest.Req.Confirmed.fBufferSize = fBufferSize;
mleksio 1:2be292bd43f9 340 mcpsRequest.Req.Confirmed.fPort = fPort;
mleksio 1:2be292bd43f9 341 mcpsRequest.Req.Confirmed.NbTrials = nbRetries;
mleksio 1:2be292bd43f9 342 mcpsRequest.Req.Confirmed.Datarate = mibGet.Param.ChannelsDatarate;
mleksio 1:2be292bd43f9 343
mleksio 1:2be292bd43f9 344 switch( LoRaMacMcpsRequest( &mcpsRequest ) )
mleksio 1:2be292bd43f9 345 {
mleksio 1:2be292bd43f9 346 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 347 retStatus = 0U;
mleksio 1:2be292bd43f9 348 break;
mleksio 1:2be292bd43f9 349 case LORAMAC_STATUS_BUSY:
mleksio 1:2be292bd43f9 350 retStatus = 1U;
mleksio 1:2be292bd43f9 351 break;
mleksio 1:2be292bd43f9 352 case LORAMAC_STATUS_NO_NETWORK_JOINED:
mleksio 1:2be292bd43f9 353 retStatus = 2U;
mleksio 1:2be292bd43f9 354 break;
mleksio 1:2be292bd43f9 355 case LORAMAC_STATUS_LENGTH_ERROR:
mleksio 1:2be292bd43f9 356 case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
mleksio 1:2be292bd43f9 357 retStatus = 3U;
mleksio 1:2be292bd43f9 358 break;
mleksio 1:2be292bd43f9 359 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 360 retStatus = 4U;
mleksio 1:2be292bd43f9 361 break;
mleksio 1:2be292bd43f9 362 case LORAMAC_STATUS_DEVICE_OFF:
mleksio 1:2be292bd43f9 363 retStatus = 6U;
mleksio 1:2be292bd43f9 364 break;
mleksio 1:2be292bd43f9 365 default:
mleksio 1:2be292bd43f9 366 retStatus = 1U;
mleksio 1:2be292bd43f9 367 break;
mleksio 1:2be292bd43f9 368 }
mleksio 1:2be292bd43f9 369
mleksio 1:2be292bd43f9 370 return retStatus;
mleksio 1:2be292bd43f9 371 }
mleksio 1:2be292bd43f9 372
mleksio 1:2be292bd43f9 373 uint8_t LoRaMacSend( LoRaMacHeader_t *macHdr, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
mleksio 1:2be292bd43f9 374 {
mleksio 1:2be292bd43f9 375 uint8_t retStatus;
mleksio 1:2be292bd43f9 376
mleksio 1:2be292bd43f9 377 memset1( ( uint8_t* ) &LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
mleksio 1:2be292bd43f9 378
mleksio 1:2be292bd43f9 379 switch( Send( macHdr, fPort, fBuffer, fBufferSize ) )
mleksio 1:2be292bd43f9 380 {
mleksio 1:2be292bd43f9 381 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 382 retStatus = 0U;
mleksio 1:2be292bd43f9 383 break;
mleksio 1:2be292bd43f9 384 case LORAMAC_STATUS_BUSY:
mleksio 1:2be292bd43f9 385 retStatus = 1U;
mleksio 1:2be292bd43f9 386 break;
mleksio 1:2be292bd43f9 387 case LORAMAC_STATUS_NO_NETWORK_JOINED:
mleksio 1:2be292bd43f9 388 retStatus = 2U;
mleksio 1:2be292bd43f9 389 break;
mleksio 1:2be292bd43f9 390 case LORAMAC_STATUS_LENGTH_ERROR:
mleksio 1:2be292bd43f9 391 case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
mleksio 1:2be292bd43f9 392 retStatus = 3U;
mleksio 1:2be292bd43f9 393 break;
mleksio 1:2be292bd43f9 394 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 395 retStatus = 4U;
mleksio 1:2be292bd43f9 396 break;
mleksio 1:2be292bd43f9 397 case LORAMAC_STATUS_DEVICE_OFF:
mleksio 1:2be292bd43f9 398 retStatus = 6U;
mleksio 1:2be292bd43f9 399 break;
mleksio 1:2be292bd43f9 400 default:
mleksio 1:2be292bd43f9 401 retStatus = 1U;
mleksio 1:2be292bd43f9 402 break;
mleksio 1:2be292bd43f9 403 }
mleksio 1:2be292bd43f9 404
mleksio 1:2be292bd43f9 405 return retStatus;
mleksio 1:2be292bd43f9 406 }
mleksio 1:2be292bd43f9 407
mleksio 1:2be292bd43f9 408 uint8_t LoRaMacPrepareFrame( ChannelParams_t channel,LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
mleksio 1:2be292bd43f9 409 {
mleksio 1:2be292bd43f9 410 uint8_t retStatus;
mleksio 1:2be292bd43f9 411
mleksio 1:2be292bd43f9 412 switch( PrepareFrame( macHdr, fCtrl, fPort, fBuffer, fBufferSize ) )
mleksio 1:2be292bd43f9 413 {
mleksio 1:2be292bd43f9 414 case LORAMAC_STATUS_OK:
mleksio 1:2be292bd43f9 415 retStatus = 0U;
mleksio 1:2be292bd43f9 416 break;
mleksio 1:2be292bd43f9 417 case LORAMAC_STATUS_BUSY:
mleksio 1:2be292bd43f9 418 retStatus = 1U;
mleksio 1:2be292bd43f9 419 break;
mleksio 1:2be292bd43f9 420 case LORAMAC_STATUS_NO_NETWORK_JOINED:
mleksio 1:2be292bd43f9 421 retStatus = 2U;
mleksio 1:2be292bd43f9 422 break;
mleksio 1:2be292bd43f9 423 case LORAMAC_STATUS_LENGTH_ERROR:
mleksio 1:2be292bd43f9 424 case LORAMAC_STATUS_MAC_CMD_LENGTH_ERROR:
mleksio 1:2be292bd43f9 425 retStatus = 3U;
mleksio 1:2be292bd43f9 426 break;
mleksio 1:2be292bd43f9 427 case LORAMAC_STATUS_SERVICE_UNKNOWN:
mleksio 1:2be292bd43f9 428 retStatus = 4U;
mleksio 1:2be292bd43f9 429 break;
mleksio 1:2be292bd43f9 430 default:
mleksio 1:2be292bd43f9 431 retStatus = 1U;
mleksio 1:2be292bd43f9 432 break;
mleksio 1:2be292bd43f9 433 }
mleksio 1:2be292bd43f9 434
mleksio 1:2be292bd43f9 435 return retStatus;
mleksio 1:2be292bd43f9 436 }
mleksio 1:2be292bd43f9 437
mleksio 1:2be292bd43f9 438 uint8_t LoRaMacSendFrameOnChannel( ChannelParams_t channel )
mleksio 1:2be292bd43f9 439 {
mleksio 1:2be292bd43f9 440 memset1( ( uint8_t* ) &LoRaMacEventInfo, 0, sizeof( LoRaMacEventInfo ) );
mleksio 1:2be292bd43f9 441
mleksio 1:2be292bd43f9 442 SendFrameOnChannel( channel );
mleksio 1:2be292bd43f9 443
mleksio 1:2be292bd43f9 444 /* SendFrameOnChannel has always status "OK" */
mleksio 1:2be292bd43f9 445 return 0;
mleksio 1:2be292bd43f9 446 }
mleksio 1:2be292bd43f9 447
mleksio 1:2be292bd43f9 448 uint8_t LoRaMacSendOnChannel( ChannelParams_t channel, LoRaMacHeader_t *macHdr, LoRaMacFrameCtrl_t *fCtrl, uint8_t *fOpts, uint8_t fPort, void *fBuffer, uint16_t fBufferSize )
mleksio 1:2be292bd43f9 449 {
mleksio 1:2be292bd43f9 450 uint8_t status = 0;
mleksio 1:2be292bd43f9 451
mleksio 1:2be292bd43f9 452 if( ( LoRaMacState & 0x00000001 ) == 0x00000001 )
mleksio 1:2be292bd43f9 453 {
mleksio 1:2be292bd43f9 454 return 1; // MAC is busy transmitting a previous frame
mleksio 1:2be292bd43f9 455 }
mleksio 1:2be292bd43f9 456
mleksio 1:2be292bd43f9 457 status = LoRaMacPrepareFrame( channel, macHdr, fCtrl, fOpts, fPort, fBuffer, fBufferSize );
mleksio 1:2be292bd43f9 458 if( status != 0 )
mleksio 1:2be292bd43f9 459 {
mleksio 1:2be292bd43f9 460 return status;
mleksio 1:2be292bd43f9 461 }
mleksio 1:2be292bd43f9 462
mleksio 1:2be292bd43f9 463 LoRaMacEventInfo.TxNbRetries = 0;
mleksio 1:2be292bd43f9 464 LoRaMacEventInfo.TxAckReceived = false;
mleksio 1:2be292bd43f9 465
mleksio 1:2be292bd43f9 466 return LoRaMacSendFrameOnChannel( channel );
mleksio 1:2be292bd43f9 467 }
mleksio 1:2be292bd43f9 468
mleksio 1:2be292bd43f9 469 void LoRaMacSetDeviceClass( DeviceClass_t deviceClass )
mleksio 1:2be292bd43f9 470 {
mleksio 1:2be292bd43f9 471 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 472
mleksio 1:2be292bd43f9 473 mibSet.Type = MIB_DEVICE_CLASS;
mleksio 1:2be292bd43f9 474 mibSet.Param.Class = deviceClass;
mleksio 1:2be292bd43f9 475
mleksio 1:2be292bd43f9 476 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 477 }
mleksio 1:2be292bd43f9 478
mleksio 1:2be292bd43f9 479 void LoRaMacSetPublicNetwork( bool enable )
mleksio 1:2be292bd43f9 480 {
mleksio 1:2be292bd43f9 481 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 482
mleksio 1:2be292bd43f9 483 mibSet.Type = MIB_PUBLIC_NETWORK;
mleksio 1:2be292bd43f9 484 mibSet.Param.EnablePublicNetwork = enable;
mleksio 1:2be292bd43f9 485
mleksio 1:2be292bd43f9 486 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 487 }
mleksio 1:2be292bd43f9 488
mleksio 1:2be292bd43f9 489 void LoRaMacSetDutyCycleOn( bool enable )
mleksio 1:2be292bd43f9 490 {
mleksio 1:2be292bd43f9 491 LoRaMacTestSetDutyCycleOn( enable );
mleksio 1:2be292bd43f9 492 }
mleksio 1:2be292bd43f9 493
mleksio 1:2be292bd43f9 494 void LoRaMacSetChannel( uint8_t id, ChannelParams_t params )
mleksio 1:2be292bd43f9 495 {
mleksio 1:2be292bd43f9 496 LoRaMacChannelAdd( id, params );
mleksio 1:2be292bd43f9 497 }
mleksio 1:2be292bd43f9 498
mleksio 1:2be292bd43f9 499 void LoRaMacSetRx2Channel( Rx2ChannelParams_t param )
mleksio 1:2be292bd43f9 500 {
mleksio 1:2be292bd43f9 501 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 502
mleksio 1:2be292bd43f9 503 mibSet.Type = MIB_RX2_CHANNEL;
mleksio 1:2be292bd43f9 504 mibSet.Param.Rx2Channel = param;
mleksio 1:2be292bd43f9 505
mleksio 1:2be292bd43f9 506 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 507 }
mleksio 1:2be292bd43f9 508
mleksio 1:2be292bd43f9 509 void LoRaMacSetChannelsMask( uint16_t *mask )
mleksio 1:2be292bd43f9 510 {
mleksio 1:2be292bd43f9 511 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 512
mleksio 1:2be292bd43f9 513 mibSet.Type = MIB_CHANNELS_MASK;
mleksio 1:2be292bd43f9 514 mibSet.Param.ChannelsMask = mask;
mleksio 1:2be292bd43f9 515
mleksio 1:2be292bd43f9 516 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 517 }
mleksio 1:2be292bd43f9 518
mleksio 1:2be292bd43f9 519 void LoRaMacSetChannelsNbRep( uint8_t nbRep )
mleksio 1:2be292bd43f9 520 {
mleksio 1:2be292bd43f9 521 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 522
mleksio 1:2be292bd43f9 523 mibSet.Type = MIB_CHANNELS_NB_REP;
mleksio 1:2be292bd43f9 524 mibSet.Param.ChannelNbRep = nbRep;
mleksio 1:2be292bd43f9 525
mleksio 1:2be292bd43f9 526 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 527 }
mleksio 1:2be292bd43f9 528
mleksio 1:2be292bd43f9 529 void LoRaMacSetMaxRxWindow( uint32_t delay )
mleksio 1:2be292bd43f9 530 {
mleksio 1:2be292bd43f9 531 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 532
mleksio 1:2be292bd43f9 533 mibSet.Type = MIB_MAX_RX_WINDOW_DURATION;
mleksio 1:2be292bd43f9 534 mibSet.Param.MaxRxWindow = delay;
mleksio 1:2be292bd43f9 535
mleksio 1:2be292bd43f9 536 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 537 }
mleksio 1:2be292bd43f9 538
mleksio 1:2be292bd43f9 539 void LoRaMacSetReceiveDelay1( uint32_t delay )
mleksio 1:2be292bd43f9 540 {
mleksio 1:2be292bd43f9 541 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 542
mleksio 1:2be292bd43f9 543 mibSet.Type = MIB_RECEIVE_DELAY_1;
mleksio 1:2be292bd43f9 544 mibSet.Param.ReceiveDelay1 = delay;
mleksio 1:2be292bd43f9 545
mleksio 1:2be292bd43f9 546 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 547 }
mleksio 1:2be292bd43f9 548
mleksio 1:2be292bd43f9 549 void LoRaMacSetReceiveDelay2( uint32_t delay )
mleksio 1:2be292bd43f9 550 {
mleksio 1:2be292bd43f9 551 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 552
mleksio 1:2be292bd43f9 553 mibSet.Type = MIB_RECEIVE_DELAY_2;
mleksio 1:2be292bd43f9 554 mibSet.Param.ReceiveDelay2 = delay;
mleksio 1:2be292bd43f9 555
mleksio 1:2be292bd43f9 556 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 557 }
mleksio 1:2be292bd43f9 558
mleksio 1:2be292bd43f9 559 void LoRaMacSetJoinAcceptDelay1( uint32_t delay )
mleksio 1:2be292bd43f9 560 {
mleksio 1:2be292bd43f9 561 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 562
mleksio 1:2be292bd43f9 563 mibSet.Type = MIB_JOIN_ACCEPT_DELAY_1;
mleksio 1:2be292bd43f9 564 mibSet.Param.JoinAcceptDelay1 = delay;
mleksio 1:2be292bd43f9 565
mleksio 1:2be292bd43f9 566 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 567 }
mleksio 1:2be292bd43f9 568
mleksio 1:2be292bd43f9 569 void LoRaMacSetJoinAcceptDelay2( uint32_t delay )
mleksio 1:2be292bd43f9 570 {
mleksio 1:2be292bd43f9 571 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 572
mleksio 1:2be292bd43f9 573 mibSet.Type = MIB_JOIN_ACCEPT_DELAY_2;
mleksio 1:2be292bd43f9 574 mibSet.Param.JoinAcceptDelay2 = delay;
mleksio 1:2be292bd43f9 575
mleksio 1:2be292bd43f9 576 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 577 }
mleksio 1:2be292bd43f9 578
mleksio 1:2be292bd43f9 579 void LoRaMacSetChannelsDatarate( int8_t datarate )
mleksio 1:2be292bd43f9 580 {
mleksio 1:2be292bd43f9 581 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 582
mleksio 1:2be292bd43f9 583 mibSet.Type = MIB_CHANNELS_DATARATE;
mleksio 1:2be292bd43f9 584 mibSet.Param.ChannelsDatarate = datarate;
mleksio 1:2be292bd43f9 585
mleksio 1:2be292bd43f9 586 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 587 }
mleksio 1:2be292bd43f9 588
mleksio 1:2be292bd43f9 589 void LoRaMacSetChannelsTxPower( int8_t txPower )
mleksio 1:2be292bd43f9 590 {
mleksio 1:2be292bd43f9 591 MibRequestConfirm_t mibSet;
mleksio 1:2be292bd43f9 592
mleksio 1:2be292bd43f9 593 mibSet.Type = MIB_CHANNELS_TX_POWER;
mleksio 1:2be292bd43f9 594 mibSet.Param.ChannelsTxPower = txPower;
mleksio 1:2be292bd43f9 595
mleksio 1:2be292bd43f9 596 LoRaMacMibSetRequestConfirm( &mibSet );
mleksio 1:2be292bd43f9 597 }
mleksio 1:2be292bd43f9 598
mleksio 1:2be292bd43f9 599 uint32_t LoRaMacGetUpLinkCounter( void )
mleksio 1:2be292bd43f9 600 {
mleksio 1:2be292bd43f9 601 MibRequestConfirm_t mibGet;
mleksio 1:2be292bd43f9 602
mleksio 1:2be292bd43f9 603 mibGet.Type = MIB_UPLINK_COUNTER;
mleksio 1:2be292bd43f9 604
mleksio 1:2be292bd43f9 605 LoRaMacMibGetRequestConfirm( &mibGet );
mleksio 1:2be292bd43f9 606
mleksio 1:2be292bd43f9 607 return mibGet.Param.UpLinkCounter;
mleksio 1:2be292bd43f9 608 }
mleksio 1:2be292bd43f9 609
mleksio 1:2be292bd43f9 610 uint32_t LoRaMacGetDownLinkCounter( void )
mleksio 1:2be292bd43f9 611 {
mleksio 1:2be292bd43f9 612 MibRequestConfirm_t mibGet;
mleksio 1:2be292bd43f9 613
mleksio 1:2be292bd43f9 614 mibGet.Type = MIB_DOWNLINK_COUNTER;
mleksio 1:2be292bd43f9 615
mleksio 1:2be292bd43f9 616 LoRaMacMibGetRequestConfirm( &mibGet );
mleksio 1:2be292bd43f9 617
mleksio 1:2be292bd43f9 618 return mibGet.Param.DownLinkCounter;
mleksio 1:2be292bd43f9 619 }
mleksio 1:2be292bd43f9 620
mleksio 1:2be292bd43f9 621 void LoRaMacSetMicTest( uint16_t txPacketCounter )
mleksio 1:2be292bd43f9 622 {
mleksio 1:2be292bd43f9 623 LoRaMacTestSetMic( txPacketCounter );
mleksio 1:2be292bd43f9 624 }