SX1276 Shield based Applications

Dependencies:   X_NUCLEO_IKS01A1 LoRaWAN-lib SX1276Lib mbed

LoRaWAN-SX1276-Application Demo uses SX1276MB1LAS mbed component shield on a nucleo board platform to demonstrate a Class-A LoRaWAN device in the 915MHz ISM band for North American region. It uses the LoRaWAN-lib and SX1276Lib libraries.

Comissioning.h (LoRaWAN Network Configuration)

The end-device can be activated in one of the two ways:

Over the Air (OTA) activation can be enabled as shown in the figure below. /media/uploads/ubhat/ota_enable.png

The end-device must be configured with the following parameters:

  • LORAWAN_DEVICE_EUI (8 Bytes) : Fist 3 Bytes is the Organizationally Unique Identifier (OUI) followed by 5 bytes of unique ID. If not defined by user, then the firmware automatically assigns one to the end-device
  • LORAWAN_APPLICATION_EUI (8 Bytes)
  • LORAWAN_APPLICATION_KEY (or DEVKEY) (16 Bytes)

/media/uploads/ubhat/ota_eui.png

Activation by Personalization (ABP) can be enabled as shown in the figure below. /media/uploads/ubhat/abp_enable.png

The end-device must be configured with the following parameters:

  • LORAWAN_DEVICE_ADDRESS (4 Bytes) : If not defined by user, then the firmware automatically assigns one to the end-device
  • LORAWAN_NWKSKEY (16 Bytes)
  • LORAWAN_APPSKEY (16 Bytes)

/media/uploads/ubhat/abp_key.png

Config.h (LoRaWAN Communication Parameters)

  • Mode of Operation : Hybrid If the end-device needs to be configured to operate over 8-channels, then Hybrid Mode needs to be enabled /media/uploads/ubhat/hybridenable.png
  • Mode of Operation : Frequency Hop If the end-device needs to be configured to operate over 64-channels, then Hybrid Mode needs to be disabled
  • Delay between successive JOIN REQUESTs : The delay between successive Join Requests (until the end-device joins the network) can be configured using the parameter OVER_THE_AIR_ACTIVATION_DUTYCYCLE
  • Inter-Frame Delay : One can change the delay between each frame transmission using APP_TX_DUTYCYCLE It is advisable that APP_TX_DUTYCYCLE is greater than or equal to 3sec.
  • Data Rate : The data rate can be configured as per LoRaWAN specification using the paramter LORAWAN_DEFAULT_DATARATE. The range of values are DR_0, DR_1, DR_2, DR_3 and DR_4
  • Confirmed/Unconfirmed Messages : The uplink message or payload can be chosen to be confirmed or unconfirmed using the parameter LORAWAN_CONFIRMED_MSG_ON. When set to 1, the transmitted messages need to be confirmed with an ACK by the network server in the subsequent RX window. When set to 0, no ACK is requested.
  • ADR ON/OFF : The ADR can be enabled or disabled using the parameter LORAWAN_ADR_ON. When set to 1, ADR is enabled and disabled when set to 0.
  • Application Port : The application port can be set using parameter LORAWAN_APP_PORT. A few examples are associated to specific Application Port, and are defined in Config.h
  • Payload Length : The lenght of the payload (in bytes) to be transmitted can be configured using LORAWAN_APP_DATA_SIZE
  • Transmit Power : The transmit power can be configured using LORAWAN_TX_POWER (LoRaMAC verifies if the set power is compliant with the LoRaWAN spec and FCC guidelines)

/media/uploads/ubhat/loraconfig.png

The baud-rate for serial terminal display is 115200

Committer:
ubhat
Date:
Wed Jul 18 22:26:26 2018 +0000
Revision:
6:c5f2da0de0b0
Parent:
0:42863a11464a
Add Channel Block option in Config.h; Fix board specific DevEUI allocation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ubhat 0:42863a11464a 1 /*
ubhat 0:42863a11464a 2 / _____) _ | |
ubhat 0:42863a11464a 3 ( (____ _____ ____ _| |_ _____ ____| |__
ubhat 0:42863a11464a 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
ubhat 0:42863a11464a 5 _____) ) ____| | | || |_| ____( (___| | | |
ubhat 0:42863a11464a 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
ubhat 0:42863a11464a 7 (C)2015 Semtech
ubhat 0:42863a11464a 8
ubhat 0:42863a11464a 9 Description: Process function calls from various Device states
ubhat 0:42863a11464a 10
ubhat 0:42863a11464a 11 License: Revised BSD License, see LICENSE.TXT file include in the project
ubhat 0:42863a11464a 12
ubhat 0:42863a11464a 13 Maintainer: Uttam Bhat
ubhat 0:42863a11464a 14 */
ubhat 0:42863a11464a 15
ubhat 0:42863a11464a 16 #include "LoRaDeviceStateProc.h"
ubhat 0:42863a11464a 17 #include "LoRaMacLayerService.h"
ubhat 0:42863a11464a 18
ubhat 0:42863a11464a 19 eDevicState DeviceState;
ubhat 0:42863a11464a 20
ubhat 0:42863a11464a 21 sLoRaMacUplinkStatus LoRaMacUplinkStatus;
ubhat 0:42863a11464a 22
ubhat 0:42863a11464a 23 sLoRaMacDownlinkStatus LoRaMacDownlinkStatus;
ubhat 0:42863a11464a 24
ubhat 0:42863a11464a 25 LoRaMacPrimitives_t LoRaPrimitives;
ubhat 0:42863a11464a 26
ubhat 0:42863a11464a 27 LoRaMacCallback_t LoRaCallbacks;
ubhat 0:42863a11464a 28
ubhat 0:42863a11464a 29 MibRequestConfirm_t LoRaMibReq;
ubhat 0:42863a11464a 30
ubhat 0:42863a11464a 31 MlmeReq_t mlmeReq;
ubhat 0:42863a11464a 32
ubhat 6:c5f2da0de0b0 33 uint16_t ChannelMaskTemp[6] = {0};
ubhat 0:42863a11464a 34
ubhat 0:42863a11464a 35 /*!
ubhat 0:42863a11464a 36 * \brief Function executed on TxNextPacket Timeout event
ubhat 0:42863a11464a 37 */
ubhat 0:42863a11464a 38 static void OnTxNextPacketTimerEvent( void )
ubhat 0:42863a11464a 39 {
ubhat 0:42863a11464a 40 MibRequestConfirm_t mibReq;
ubhat 0:42863a11464a 41 LoRaMacStatus_t status;
ubhat 0:42863a11464a 42
ubhat 0:42863a11464a 43 TimerStop( &TxNextPacketTimer );
ubhat 0:42863a11464a 44
ubhat 0:42863a11464a 45 mibReq.Type = MIB_NETWORK_JOINED;
ubhat 0:42863a11464a 46 status = LoRaMacMibGetRequestConfirm( &mibReq );
ubhat 0:42863a11464a 47
ubhat 0:42863a11464a 48 if( status == LORAMAC_STATUS_OK )
ubhat 0:42863a11464a 49 {
ubhat 0:42863a11464a 50 if( mibReq.Param.IsNetworkJoined == true )
ubhat 0:42863a11464a 51 {
ubhat 0:42863a11464a 52 DeviceState = DEVICE_STATE_SEND;
ubhat 0:42863a11464a 53 }
ubhat 0:42863a11464a 54 else
ubhat 0:42863a11464a 55 {
ubhat 0:42863a11464a 56 DeviceState = DEVICE_STATE_JOIN;
ubhat 0:42863a11464a 57 }
ubhat 0:42863a11464a 58 NextTx = true;
ubhat 0:42863a11464a 59 }
ubhat 0:42863a11464a 60 }
ubhat 0:42863a11464a 61
ubhat 0:42863a11464a 62 void DeviceInit( void )
ubhat 0:42863a11464a 63 {
ubhat 0:42863a11464a 64 LoRaPrimitives.MacMcpsConfirm = McpsConfirm;
ubhat 0:42863a11464a 65 LoRaPrimitives.MacMcpsIndication = McpsIndication;
ubhat 0:42863a11464a 66 LoRaPrimitives.MacMlmeConfirm = MlmeConfirm;
ubhat 0:42863a11464a 67 LoRaCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
ubhat 0:42863a11464a 68 LoRaMacInitialization( &LoRaPrimitives, &LoRaCallbacks );
ubhat 0:42863a11464a 69
ubhat 0:42863a11464a 70 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
ubhat 0:42863a11464a 71
ubhat 0:42863a11464a 72 LoRaMibReq.Type = MIB_ADR;
ubhat 0:42863a11464a 73 LoRaMibReq.Param.AdrEnable = LORAWAN_ADR_ON;
ubhat 0:42863a11464a 74 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 75
ubhat 0:42863a11464a 76 LoRaMibReq.Type = MIB_PUBLIC_NETWORK;
ubhat 0:42863a11464a 77 LoRaMibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
ubhat 0:42863a11464a 78 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 79
ubhat 0:42863a11464a 80 LoRaMibReq.Type = MIB_CHANNELS_TX_POWER;
ubhat 0:42863a11464a 81 LoRaMibReq.Param.ChannelsTxPower = LORAWAN_TX_POWER;
ubhat 0:42863a11464a 82 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 6:c5f2da0de0b0 83
ubhat 6:c5f2da0de0b0 84 LoRaMibReq.Type = MIB_CHANNELS_MASK;
ubhat 6:c5f2da0de0b0 85 LoRaMibReq.Param.ChannelsMask = ChannelMaskTemp;
ubhat 6:c5f2da0de0b0 86
ubhat 6:c5f2da0de0b0 87 #ifdef USE_BAND_915_HYBRID_BLOCK_A
ubhat 6:c5f2da0de0b0 88
ubhat 6:c5f2da0de0b0 89 ChannelMaskTemp[0] = 0x00FF;
ubhat 6:c5f2da0de0b0 90 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 91 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 92 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 93 ChannelMaskTemp[4] = 0x0001;
ubhat 6:c5f2da0de0b0 94
ubhat 6:c5f2da0de0b0 95 #elif defined USE_BAND_915_HYBRID_BLOCK_B
ubhat 6:c5f2da0de0b0 96
ubhat 6:c5f2da0de0b0 97 ChannelMaskTemp[0] = 0xFF00;
ubhat 6:c5f2da0de0b0 98 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 99 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 100 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 101 ChannelMaskTemp[4] = 0x0002;
ubhat 6:c5f2da0de0b0 102
ubhat 6:c5f2da0de0b0 103 #elif defined USE_BAND_915_HYBRID_BLOCK_C
ubhat 6:c5f2da0de0b0 104
ubhat 6:c5f2da0de0b0 105 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 106 ChannelMaskTemp[1] = 0x00FF;
ubhat 6:c5f2da0de0b0 107 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 108 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 109 ChannelMaskTemp[4] = 0x0004;
ubhat 6:c5f2da0de0b0 110
ubhat 6:c5f2da0de0b0 111 #elif defined USE_BAND_915_HYBRID_BLOCK_D
ubhat 6:c5f2da0de0b0 112
ubhat 6:c5f2da0de0b0 113 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 114 ChannelMaskTemp[1] = 0xFF00;
ubhat 6:c5f2da0de0b0 115 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 116 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 117 ChannelMaskTemp[4] = 0x0008;
ubhat 6:c5f2da0de0b0 118
ubhat 6:c5f2da0de0b0 119 #elif defined USE_BAND_915_HYBRID_BLOCK_E
ubhat 6:c5f2da0de0b0 120
ubhat 6:c5f2da0de0b0 121 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 122 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 123 ChannelMaskTemp[2] = 0x00FF;
ubhat 6:c5f2da0de0b0 124 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 125 ChannelMaskTemp[4] = 0x0010;
ubhat 6:c5f2da0de0b0 126
ubhat 6:c5f2da0de0b0 127 #elif defined USE_BAND_915_HYBRID_BLOCK_F
ubhat 6:c5f2da0de0b0 128
ubhat 6:c5f2da0de0b0 129 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 130 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 131 ChannelMaskTemp[2] = 0xFF00;
ubhat 6:c5f2da0de0b0 132 ChannelMaskTemp[3] = 0x0000;
ubhat 6:c5f2da0de0b0 133 ChannelMaskTemp[4] = 0x0020;
ubhat 6:c5f2da0de0b0 134
ubhat 6:c5f2da0de0b0 135 #elif defined USE_BAND_915_HYBRID_BLOCK_G
ubhat 6:c5f2da0de0b0 136
ubhat 6:c5f2da0de0b0 137 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 138 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 139 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 140 ChannelMaskTemp[3] = 0x00FF;
ubhat 6:c5f2da0de0b0 141 ChannelMaskTemp[4] = 0x0040;
ubhat 6:c5f2da0de0b0 142
ubhat 6:c5f2da0de0b0 143 #elif defined USE_BAND_915_HYBRID_BLOCK_H
ubhat 6:c5f2da0de0b0 144
ubhat 6:c5f2da0de0b0 145 ChannelMaskTemp[0] = 0x0000;
ubhat 6:c5f2da0de0b0 146 ChannelMaskTemp[1] = 0x0000;
ubhat 6:c5f2da0de0b0 147 ChannelMaskTemp[2] = 0x0000;
ubhat 6:c5f2da0de0b0 148 ChannelMaskTemp[3] = 0xFF00;
ubhat 6:c5f2da0de0b0 149 ChannelMaskTemp[4] = 0x0080;
ubhat 6:c5f2da0de0b0 150
ubhat 6:c5f2da0de0b0 151 #elif defined USE_BAND_915
ubhat 6:c5f2da0de0b0 152
ubhat 6:c5f2da0de0b0 153 ChannelMaskTemp[0] = 0xFFFF;
ubhat 6:c5f2da0de0b0 154 ChannelMaskTemp[1] = 0xFFFF;
ubhat 6:c5f2da0de0b0 155 ChannelMaskTemp[2] = 0xFFFF;
ubhat 6:c5f2da0de0b0 156 ChannelMaskTemp[3] = 0xFFFF;
ubhat 6:c5f2da0de0b0 157 ChannelMaskTemp[4] = 0x00FF;
ubhat 6:c5f2da0de0b0 158 ChannelMaskTemp[5] = 0x0000;
ubhat 6:c5f2da0de0b0 159
ubhat 6:c5f2da0de0b0 160 #endif
ubhat 6:c5f2da0de0b0 161
ubhat 6:c5f2da0de0b0 162 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 163
ubhat 0:42863a11464a 164 LoRaMacDownlinkStatus.DownlinkCounter = 0;
ubhat 0:42863a11464a 165 }
ubhat 0:42863a11464a 166
ubhat 0:42863a11464a 167 void DeviceJoinUpdate( void )
ubhat 0:42863a11464a 168 {
ubhat 0:42863a11464a 169 LoRaMibReq.Type = MIB_NETWORK_JOINED;
ubhat 0:42863a11464a 170 LoRaMacMibGetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 171 }
ubhat 0:42863a11464a 172
ubhat 0:42863a11464a 173 void DeviceJoin( void )
ubhat 0:42863a11464a 174 {
ubhat 0:42863a11464a 175 #if( OVER_THE_AIR_ACTIVATION != 0 )
ubhat 0:42863a11464a 176
ubhat 0:42863a11464a 177 mlmeReq.Type = MLME_JOIN;
ubhat 0:42863a11464a 178
ubhat 0:42863a11464a 179 mlmeReq.Req.Join.DevEui = DevEui;
ubhat 0:42863a11464a 180 mlmeReq.Req.Join.AppEui = AppEui;
ubhat 0:42863a11464a 181 mlmeReq.Req.Join.AppKey = AppKey;
ubhat 0:42863a11464a 182
ubhat 0:42863a11464a 183 if( NextTx == true )
ubhat 0:42863a11464a 184 {
ubhat 0:42863a11464a 185 LoRaMacMlmeRequest( &mlmeReq );
ubhat 0:42863a11464a 186 }
ubhat 0:42863a11464a 187
ubhat 0:42863a11464a 188 #else
ubhat 0:42863a11464a 189 // Choose a random device address if not already defined in Config.h
ubhat 0:42863a11464a 190 if( DevAddr == 0 )
ubhat 0:42863a11464a 191 {
ubhat 0:42863a11464a 192 // Random seed initialization
ubhat 0:42863a11464a 193 srand1( BoardGetRandomSeed( ) );
ubhat 0:42863a11464a 194 DevAddr = randr( 0, 0x01FFFFFF );
ubhat 0:42863a11464a 195 }
ubhat 0:42863a11464a 196
ubhat 0:42863a11464a 197 LoRaMibReq.Type = MIB_NET_ID;
ubhat 0:42863a11464a 198 LoRaMibReq.Param.NetID = LORAWAN_NETWORK_ID;
ubhat 0:42863a11464a 199 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 200
ubhat 0:42863a11464a 201 LoRaMibReq.Type = MIB_DEV_ADDR;
ubhat 0:42863a11464a 202 LoRaMibReq.Param.DevAddr = DevAddr;
ubhat 0:42863a11464a 203 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 204
ubhat 0:42863a11464a 205 LoRaMibReq.Type = MIB_NWK_SKEY;
ubhat 0:42863a11464a 206 LoRaMibReq.Param.NwkSKey = NwkSKey;
ubhat 0:42863a11464a 207 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 208
ubhat 0:42863a11464a 209 LoRaMibReq.Type = MIB_APP_SKEY;
ubhat 0:42863a11464a 210 LoRaMibReq.Param.AppSKey = AppSKey;
ubhat 0:42863a11464a 211 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 212
ubhat 0:42863a11464a 213 LoRaMibReq.Type = MIB_NETWORK_JOINED;
ubhat 0:42863a11464a 214 LoRaMibReq.Param.IsNetworkJoined = true;
ubhat 0:42863a11464a 215 LoRaMacMibSetRequestConfirm( &LoRaMibReq );
ubhat 0:42863a11464a 216
ubhat 0:42863a11464a 217 #endif
ubhat 0:42863a11464a 218 }
ubhat 0:42863a11464a 219
ubhat 0:42863a11464a 220 /*!
ubhat 0:42863a11464a 221 * \brief Prepares the payload of the frame
ubhat 0:42863a11464a 222 */
ubhat 0:42863a11464a 223 void PrepareTxFrame( uint8_t port )
ubhat 0:42863a11464a 224 {
ubhat 0:42863a11464a 225 MibRequestConfirm_t mibReq;
ubhat 0:42863a11464a 226
ubhat 0:42863a11464a 227 if( BoardGetBatteryLevel( ) < LOW_BAT_THRESHOLD )
ubhat 0:42863a11464a 228 {
ubhat 0:42863a11464a 229 mibReq.Type = MIB_CHANNELS_TX_POWER;
ubhat 0:42863a11464a 230 LoRaMacMibGetRequestConfirm( &mibReq );
ubhat 0:42863a11464a 231 // TX_POWER_30_DBM = 0, TX_POWER_28_DBM = 1, ..., TX_POWER_20_DBM = 5, ..., TX_POWER_10_DBM = 10
ubhat 0:42863a11464a 232 // The if condition is then "less than" to check if the power is greater than 20 dBm
ubhat 0:42863a11464a 233 if( mibReq.Param.ChannelsTxPower < TX_POWER_20_DBM )
ubhat 0:42863a11464a 234 {
ubhat 0:42863a11464a 235 mibReq.Param.ChannelsTxPower = TX_POWER_20_DBM;
ubhat 0:42863a11464a 236 LoRaMacMibSetRequestConfirm( &mibReq );
ubhat 0:42863a11464a 237 }
ubhat 0:42863a11464a 238 }
ubhat 0:42863a11464a 239
ubhat 0:42863a11464a 240 if( port == 224 )
ubhat 0:42863a11464a 241 {
ubhat 0:42863a11464a 242 RunComplianceTest( );
ubhat 0:42863a11464a 243 }
ubhat 0:42863a11464a 244 else
ubhat 0:42863a11464a 245 {
ubhat 0:42863a11464a 246 PrepareLoRaFrame( port );
ubhat 0:42863a11464a 247 }
ubhat 0:42863a11464a 248 }
ubhat 0:42863a11464a 249
ubhat 0:42863a11464a 250 /*!
ubhat 0:42863a11464a 251 * \brief Prepares the payload of the frame
ubhat 0:42863a11464a 252 *
ubhat 0:42863a11464a 253 * \retval [0: frame could be send, 1: error]
ubhat 0:42863a11464a 254 */
ubhat 0:42863a11464a 255 bool SendFrame( void )
ubhat 0:42863a11464a 256 {
ubhat 0:42863a11464a 257 McpsReq_t mcpsReq;
ubhat 0:42863a11464a 258 LoRaMacTxInfo_t txInfo;
ubhat 0:42863a11464a 259
ubhat 0:42863a11464a 260 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
ubhat 0:42863a11464a 261 {
ubhat 0:42863a11464a 262 // Send empty frame in order to flush MAC commands
ubhat 0:42863a11464a 263 mcpsReq.Type = MCPS_UNCONFIRMED;
ubhat 0:42863a11464a 264 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
ubhat 0:42863a11464a 265 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
ubhat 0:42863a11464a 266 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:42863a11464a 267
ubhat 0:42863a11464a 268 LoRaMacUplinkStatus.Acked = false;
ubhat 0:42863a11464a 269 LoRaMacUplinkStatus.Port = 0;
ubhat 0:42863a11464a 270 LoRaMacUplinkStatus.Buffer = NULL;
ubhat 0:42863a11464a 271 LoRaMacUplinkStatus.BufferSize = 0;
ubhat 0:42863a11464a 272 }
ubhat 0:42863a11464a 273 else
ubhat 0:42863a11464a 274 {
ubhat 0:42863a11464a 275 LoRaMacUplinkStatus.Acked = false;
ubhat 0:42863a11464a 276 LoRaMacUplinkStatus.Port = AppPort;
ubhat 0:42863a11464a 277 LoRaMacUplinkStatus.Buffer = AppData;
ubhat 0:42863a11464a 278 LoRaMacUplinkStatus.BufferSize = AppDataSize;
ubhat 0:42863a11464a 279
ubhat 0:42863a11464a 280 if( ( IsTxConfirmed == false ) || ( LoRaMacUplinkStatus.UplinkCounter == 0 ) )
ubhat 0:42863a11464a 281 {
ubhat 0:42863a11464a 282 mcpsReq.Type = MCPS_UNCONFIRMED;
ubhat 0:42863a11464a 283 mcpsReq.Req.Unconfirmed.fPort = AppPort;
ubhat 0:42863a11464a 284 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
ubhat 0:42863a11464a 285 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
ubhat 0:42863a11464a 286 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:42863a11464a 287 }
ubhat 0:42863a11464a 288 else
ubhat 0:42863a11464a 289 {
ubhat 0:42863a11464a 290 mcpsReq.Type = MCPS_CONFIRMED;
ubhat 0:42863a11464a 291 mcpsReq.Req.Confirmed.fPort = AppPort;
ubhat 0:42863a11464a 292 mcpsReq.Req.Confirmed.fBuffer = AppData;
ubhat 0:42863a11464a 293 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
ubhat 0:42863a11464a 294 mcpsReq.Req.Confirmed.NbTrials = 8;
ubhat 0:42863a11464a 295 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
ubhat 0:42863a11464a 296 }
ubhat 0:42863a11464a 297 }
ubhat 0:42863a11464a 298
ubhat 0:42863a11464a 299 LoRaMacUplinkStatus.Type = mcpsReq.Type;
ubhat 0:42863a11464a 300
ubhat 0:42863a11464a 301 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
ubhat 0:42863a11464a 302 {
ubhat 0:42863a11464a 303 return false;
ubhat 0:42863a11464a 304 }
ubhat 0:42863a11464a 305 return true;
ubhat 0:42863a11464a 306 }