DISCO-L072CZ-LRWAN1-base

Dependencies:   BufferedSerial LoRaWAN-lib-st-murata ST-DEVKIT-LRWAN mbed

Committer:
alphaemmeo
Date:
Mon Dec 04 14:28:30 2017 +0000
Revision:
1:dcf49b02bfd9
Parent:
0:60680ad16314
base porting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alphaemmeo 0:60680ad16314 1 /*
alphaemmeo 0:60680ad16314 2 * Copyright (c) 2017 Ivano Calabrese
alphaemmeo 0:60680ad16314 3 * Licensed under the Apache License, Version 2.0);
alphaemmeo 0:60680ad16314 4 */
alphaemmeo 0:60680ad16314 5
alphaemmeo 0:60680ad16314 6 #include "mbed.h"
alphaemmeo 0:60680ad16314 7 #include "board.h"
alphaemmeo 0:60680ad16314 8 #include "radio.h"
alphaemmeo 0:60680ad16314 9 #include "LoRaMac.h"
alphaemmeo 0:60680ad16314 10
alphaemmeo 0:60680ad16314 11 #include "main.h"
alphaemmeo 0:60680ad16314 12
alphaemmeo 0:60680ad16314 13
alphaemmeo 0:60680ad16314 14 BufferedSerial *ser;
alphaemmeo 0:60680ad16314 15
alphaemmeo 0:60680ad16314 16 DigitalOut myled1(LED1);
alphaemmeo 0:60680ad16314 17 DigitalOut myled2(LED2);
alphaemmeo 0:60680ad16314 18 DigitalOut myled3(LED3);
alphaemmeo 0:60680ad16314 19 DigitalOut myled4(LED4);
alphaemmeo 0:60680ad16314 20
alphaemmeo 0:60680ad16314 21 /*!
alphaemmeo 0:60680ad16314 22 * Application port
alphaemmeo 0:60680ad16314 23 */
alphaemmeo 0:60680ad16314 24 static uint8_t AppPort = LORAWAN_APP_PORT;
alphaemmeo 0:60680ad16314 25
alphaemmeo 0:60680ad16314 26 /*!
alphaemmeo 0:60680ad16314 27 * User application data size
alphaemmeo 0:60680ad16314 28 */
alphaemmeo 0:60680ad16314 29 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
alphaemmeo 0:60680ad16314 30
alphaemmeo 0:60680ad16314 31 /*!
alphaemmeo 0:60680ad16314 32 * Defines the application data transmission duty cycle
alphaemmeo 0:60680ad16314 33 */
alphaemmeo 0:60680ad16314 34 static uint32_t TxDutyCycleTime;
alphaemmeo 0:60680ad16314 35
alphaemmeo 0:60680ad16314 36 /*!
alphaemmeo 0:60680ad16314 37 * User application data
alphaemmeo 0:60680ad16314 38 */
alphaemmeo 0:60680ad16314 39 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
alphaemmeo 0:60680ad16314 40
alphaemmeo 0:60680ad16314 41 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
alphaemmeo 0:60680ad16314 42 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
alphaemmeo 0:60680ad16314 43 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
alphaemmeo 0:60680ad16314 44
alphaemmeo 0:60680ad16314 45 #if( OVER_THE_AIR_ACTIVATION == 0 )
alphaemmeo 0:60680ad16314 46
alphaemmeo 0:60680ad16314 47 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
alphaemmeo 0:60680ad16314 48 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
alphaemmeo 0:60680ad16314 49
alphaemmeo 0:60680ad16314 50 /*!
alphaemmeo 0:60680ad16314 51 * Device address
alphaemmeo 0:60680ad16314 52 */
alphaemmeo 0:60680ad16314 53 static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
alphaemmeo 0:60680ad16314 54
alphaemmeo 0:60680ad16314 55 #endif
alphaemmeo 0:60680ad16314 56
alphaemmeo 0:60680ad16314 57 /*!
alphaemmeo 0:60680ad16314 58 * Indicates if a new packet can be sent
alphaemmeo 0:60680ad16314 59 */
alphaemmeo 0:60680ad16314 60 static bool NextTx = true;
alphaemmeo 0:60680ad16314 61
alphaemmeo 0:60680ad16314 62 /*!
alphaemmeo 0:60680ad16314 63 * Device states
alphaemmeo 0:60680ad16314 64 */
alphaemmeo 0:60680ad16314 65 static enum eDeviceState {
alphaemmeo 0:60680ad16314 66 DEVICE_STATE_INIT,
alphaemmeo 0:60680ad16314 67 DEVICE_STATE_JOIN,
alphaemmeo 0:60680ad16314 68 DEVICE_STATE_SEND,
alphaemmeo 0:60680ad16314 69 DEVICE_STATE_CYCLE,
alphaemmeo 0:60680ad16314 70 DEVICE_STATE_SLEEP
alphaemmeo 0:60680ad16314 71 }DeviceState;
alphaemmeo 0:60680ad16314 72
alphaemmeo 0:60680ad16314 73
alphaemmeo 0:60680ad16314 74 /*!
alphaemmeo 0:60680ad16314 75 * LoRaWAN compliance tests support data
alphaemmeo 0:60680ad16314 76 */
alphaemmeo 0:60680ad16314 77 struct ComplianceTest_s
alphaemmeo 0:60680ad16314 78 {
alphaemmeo 0:60680ad16314 79 bool Running;
alphaemmeo 0:60680ad16314 80 uint8_t State;
alphaemmeo 0:60680ad16314 81 bool IsTxConfirmed;
alphaemmeo 0:60680ad16314 82 uint8_t AppPort;
alphaemmeo 0:60680ad16314 83 uint8_t AppDataSize;
alphaemmeo 0:60680ad16314 84 uint8_t *AppDataBuffer;
alphaemmeo 0:60680ad16314 85 uint16_t DownLinkCounter;
alphaemmeo 0:60680ad16314 86 bool LinkCheck;
alphaemmeo 0:60680ad16314 87 uint8_t DemodMargin;
alphaemmeo 0:60680ad16314 88 uint8_t NbGateways;
alphaemmeo 0:60680ad16314 89 }ComplianceTest;
alphaemmeo 0:60680ad16314 90
alphaemmeo 0:60680ad16314 91 /*!
alphaemmeo 0:60680ad16314 92 * Strucure containing the Uplink status
alphaemmeo 0:60680ad16314 93 */
alphaemmeo 0:60680ad16314 94 struct sLoRaMacUplinkStatus {
alphaemmeo 0:60680ad16314 95 uint8_t Acked;
alphaemmeo 0:60680ad16314 96 int8_t Datarate;
alphaemmeo 0:60680ad16314 97 uint16_t UplinkCounter;
alphaemmeo 0:60680ad16314 98 uint8_t Port;
alphaemmeo 0:60680ad16314 99 uint8_t *Buffer;
alphaemmeo 0:60680ad16314 100 uint8_t BufferSize;
alphaemmeo 0:60680ad16314 101 }LoRaMacUplinkStatus;
alphaemmeo 0:60680ad16314 102 volatile bool UplinkStatusUpdated = false;
alphaemmeo 0:60680ad16314 103
alphaemmeo 0:60680ad16314 104 /*!
alphaemmeo 0:60680ad16314 105 * Strucure containing the Downlink status
alphaemmeo 0:60680ad16314 106 */
alphaemmeo 0:60680ad16314 107 struct sLoRaMacDownlinkStatus {
alphaemmeo 0:60680ad16314 108 int16_t Rssi;
alphaemmeo 0:60680ad16314 109 int8_t Snr;
alphaemmeo 0:60680ad16314 110 uint16_t DownlinkCounter;
alphaemmeo 0:60680ad16314 111 bool RxData;
alphaemmeo 0:60680ad16314 112 uint8_t Port;
alphaemmeo 0:60680ad16314 113 uint8_t *Buffer;
alphaemmeo 0:60680ad16314 114 uint8_t BufferSize;
alphaemmeo 0:60680ad16314 115 }LoRaMacDownlinkStatus;
alphaemmeo 0:60680ad16314 116 volatile bool DownlinkStatusUpdated = false;
alphaemmeo 0:60680ad16314 117
alphaemmeo 0:60680ad16314 118 /*!
alphaemmeo 0:60680ad16314 119 * Timer to handle the application data transmission duty cycle
alphaemmeo 0:60680ad16314 120 */
alphaemmeo 0:60680ad16314 121 static TimerEvent_t TxNextPacketTimer;
alphaemmeo 0:60680ad16314 122
alphaemmeo 0:60680ad16314 123
alphaemmeo 0:60680ad16314 124 /*!
alphaemmeo 0:60680ad16314 125 * \brief Prepares the payload of the frame
alphaemmeo 0:60680ad16314 126 */
alphaemmeo 0:60680ad16314 127 static void PrepareTxFrame( uint8_t port )
alphaemmeo 0:60680ad16314 128 {
alphaemmeo 0:60680ad16314 129 switch( port ) {
alphaemmeo 0:60680ad16314 130 case 1:
alphaemmeo 0:60680ad16314 131 {
alphaemmeo 0:60680ad16314 132 AppData[0] = 0;
alphaemmeo 0:60680ad16314 133 AppData[1] = 1;
alphaemmeo 0:60680ad16314 134 AppData[2] = 1;
alphaemmeo 0:60680ad16314 135 AppData[3] = 1;
alphaemmeo 0:60680ad16314 136 AppData[4] = 1;
alphaemmeo 0:60680ad16314 137 AppData[5] = 1;
alphaemmeo 0:60680ad16314 138 }
alphaemmeo 0:60680ad16314 139 break;
alphaemmeo 0:60680ad16314 140 default:
alphaemmeo 0:60680ad16314 141 break;
alphaemmeo 0:60680ad16314 142 }
alphaemmeo 0:60680ad16314 143 }
alphaemmeo 0:60680ad16314 144
alphaemmeo 0:60680ad16314 145
alphaemmeo 0:60680ad16314 146 /*!
alphaemmeo 0:60680ad16314 147 * \brief Prepares the payload of the frame
alphaemmeo 0:60680ad16314 148 *
alphaemmeo 0:60680ad16314 149 * \retval [0: frame could be send, 1: error]
alphaemmeo 0:60680ad16314 150 */
alphaemmeo 0:60680ad16314 151 static bool SendFrame( void )
alphaemmeo 0:60680ad16314 152 {
alphaemmeo 0:60680ad16314 153 McpsReq_t mcpsReq;
alphaemmeo 0:60680ad16314 154 LoRaMacTxInfo_t txInfo;
alphaemmeo 0:60680ad16314 155
alphaemmeo 0:60680ad16314 156 mcpsReq.Type = MCPS_UNCONFIRMED;
alphaemmeo 0:60680ad16314 157 mcpsReq.Req.Unconfirmed.fPort = AppPort;
alphaemmeo 0:60680ad16314 158 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
alphaemmeo 0:60680ad16314 159 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
alphaemmeo 0:60680ad16314 160 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
alphaemmeo 0:60680ad16314 161
alphaemmeo 0:60680ad16314 162 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
alphaemmeo 0:60680ad16314 163 {
alphaemmeo 0:60680ad16314 164 myled4 = 1; // LED4 is ON
alphaemmeo 0:60680ad16314 165 wait(0.3); // wait tempo
alphaemmeo 0:60680ad16314 166 myled4 = 0; // LED4 is OFF
alphaemmeo 0:60680ad16314 167 ser->printf("[MAIN] SendFrame == LORAMAC_STATUS_OK!! \n\r");
alphaemmeo 0:60680ad16314 168 return false;
alphaemmeo 0:60680ad16314 169 }
alphaemmeo 0:60680ad16314 170
alphaemmeo 0:60680ad16314 171 ser->printf("[MAIN] SendFrame != LORAMAC_STATUS_OK!!\n\r");
alphaemmeo 0:60680ad16314 172 return true;
alphaemmeo 0:60680ad16314 173 }
alphaemmeo 0:60680ad16314 174
alphaemmeo 0:60680ad16314 175 /*!
alphaemmeo 0:60680ad16314 176 * \brief Function executed on TxNextPacket Timeout event
alphaemmeo 0:60680ad16314 177 */
alphaemmeo 0:60680ad16314 178 static void OnTxNextPacketTimerEvent( void )
alphaemmeo 0:60680ad16314 179 {
alphaemmeo 0:60680ad16314 180 MibRequestConfirm_t mibReq;
alphaemmeo 0:60680ad16314 181 LoRaMacStatus_t status;
alphaemmeo 0:60680ad16314 182
alphaemmeo 0:60680ad16314 183 TimerStop( &TxNextPacketTimer );
alphaemmeo 0:60680ad16314 184
alphaemmeo 0:60680ad16314 185 mibReq.Type = MIB_NETWORK_JOINED;
alphaemmeo 0:60680ad16314 186 status = LoRaMacMibGetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 187
alphaemmeo 0:60680ad16314 188 if( status == LORAMAC_STATUS_OK )
alphaemmeo 0:60680ad16314 189 {
alphaemmeo 0:60680ad16314 190 if( mibReq.Param.IsNetworkJoined == true )
alphaemmeo 0:60680ad16314 191 {
alphaemmeo 0:60680ad16314 192 DeviceState = DEVICE_STATE_SEND;
alphaemmeo 0:60680ad16314 193 NextTx = true;
alphaemmeo 0:60680ad16314 194 }
alphaemmeo 0:60680ad16314 195 else
alphaemmeo 0:60680ad16314 196 {
alphaemmeo 0:60680ad16314 197 DeviceState = DEVICE_STATE_JOIN;
alphaemmeo 0:60680ad16314 198 }
alphaemmeo 0:60680ad16314 199 }
alphaemmeo 0:60680ad16314 200 }
alphaemmeo 0:60680ad16314 201
alphaemmeo 0:60680ad16314 202 /*!
alphaemmeo 0:60680ad16314 203 * \brief MCPS-Confirm event function
alphaemmeo 0:60680ad16314 204 *
alphaemmeo 0:60680ad16314 205 * \param [IN] mcpsConfirm - Pointer to the confirm structure,
alphaemmeo 0:60680ad16314 206 * containing confirm attributes.
alphaemmeo 0:60680ad16314 207 */
alphaemmeo 0:60680ad16314 208 static void McpsConfirm( McpsConfirm_t *mcpsConfirm )
alphaemmeo 0:60680ad16314 209 {
alphaemmeo 0:60680ad16314 210 if( mcpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
alphaemmeo 0:60680ad16314 211 {
alphaemmeo 0:60680ad16314 212 switch( mcpsConfirm->McpsRequest )
alphaemmeo 0:60680ad16314 213 {
alphaemmeo 0:60680ad16314 214 case MCPS_UNCONFIRMED:
alphaemmeo 0:60680ad16314 215 {
alphaemmeo 0:60680ad16314 216 // Check Datarate
alphaemmeo 0:60680ad16314 217 // Check TxPower
alphaemmeo 0:60680ad16314 218 break;
alphaemmeo 0:60680ad16314 219 }
alphaemmeo 0:60680ad16314 220 case MCPS_CONFIRMED:
alphaemmeo 0:60680ad16314 221 {
alphaemmeo 0:60680ad16314 222 // Check Datarate
alphaemmeo 0:60680ad16314 223 // Check TxPower
alphaemmeo 0:60680ad16314 224 // Check AckReceived
alphaemmeo 0:60680ad16314 225 // Check NbTrials
alphaemmeo 0:60680ad16314 226 LoRaMacUplinkStatus.Acked = mcpsConfirm->AckReceived;
alphaemmeo 0:60680ad16314 227 break;
alphaemmeo 0:60680ad16314 228 }
alphaemmeo 0:60680ad16314 229 case MCPS_PROPRIETARY:
alphaemmeo 0:60680ad16314 230 {
alphaemmeo 0:60680ad16314 231 break;
alphaemmeo 0:60680ad16314 232 }
alphaemmeo 0:60680ad16314 233 default:
alphaemmeo 0:60680ad16314 234 break;
alphaemmeo 0:60680ad16314 235 }
alphaemmeo 0:60680ad16314 236 LoRaMacUplinkStatus.Datarate = mcpsConfirm->Datarate;
alphaemmeo 0:60680ad16314 237 LoRaMacUplinkStatus.UplinkCounter = mcpsConfirm->UpLinkCounter;
alphaemmeo 0:60680ad16314 238
alphaemmeo 0:60680ad16314 239 UplinkStatusUpdated = true;
alphaemmeo 0:60680ad16314 240 }
alphaemmeo 0:60680ad16314 241 NextTx = true;
alphaemmeo 0:60680ad16314 242 }
alphaemmeo 0:60680ad16314 243
alphaemmeo 0:60680ad16314 244 /*!
alphaemmeo 0:60680ad16314 245 * \brief MLME-Confirm event function
alphaemmeo 0:60680ad16314 246 *
alphaemmeo 0:60680ad16314 247 * \param [IN] mlmeConfirm - Pointer to the confirm structure,
alphaemmeo 0:60680ad16314 248 * containing confirm attributes.
alphaemmeo 0:60680ad16314 249 */
alphaemmeo 0:60680ad16314 250 static void MlmeConfirm( MlmeConfirm_t *mlmeConfirm )
alphaemmeo 0:60680ad16314 251 {
alphaemmeo 0:60680ad16314 252 switch( mlmeConfirm->MlmeRequest )
alphaemmeo 0:60680ad16314 253 {
alphaemmeo 0:60680ad16314 254 case MLME_JOIN:
alphaemmeo 0:60680ad16314 255 {
alphaemmeo 0:60680ad16314 256 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
alphaemmeo 0:60680ad16314 257 {
alphaemmeo 0:60680ad16314 258 // Status is OK, node has joined the network
alphaemmeo 0:60680ad16314 259 IsNetworkJoinedStatusUpdate = true;
alphaemmeo 0:60680ad16314 260 DeviceState = DEVICE_STATE_SEND;
alphaemmeo 0:60680ad16314 261 }
alphaemmeo 0:60680ad16314 262 else
alphaemmeo 0:60680ad16314 263 {
alphaemmeo 0:60680ad16314 264 // Join was not successful. Try to join again
alphaemmeo 0:60680ad16314 265 DeviceState = DEVICE_STATE_JOIN;
alphaemmeo 0:60680ad16314 266 }
alphaemmeo 0:60680ad16314 267 break;
alphaemmeo 0:60680ad16314 268 }
alphaemmeo 0:60680ad16314 269 case MLME_LINK_CHECK:
alphaemmeo 0:60680ad16314 270 {
alphaemmeo 0:60680ad16314 271 if( mlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
alphaemmeo 0:60680ad16314 272 {
alphaemmeo 0:60680ad16314 273 // Check DemodMargin
alphaemmeo 0:60680ad16314 274 // Check NbGateways
alphaemmeo 0:60680ad16314 275 if( ComplianceTest.Running == true )
alphaemmeo 0:60680ad16314 276 {
alphaemmeo 0:60680ad16314 277 ComplianceTest.LinkCheck = true;
alphaemmeo 0:60680ad16314 278 ComplianceTest.DemodMargin = mlmeConfirm->DemodMargin;
alphaemmeo 0:60680ad16314 279 ComplianceTest.NbGateways = mlmeConfirm->NbGateways;
alphaemmeo 0:60680ad16314 280 }
alphaemmeo 0:60680ad16314 281 }
alphaemmeo 0:60680ad16314 282 break;
alphaemmeo 0:60680ad16314 283 }
alphaemmeo 0:60680ad16314 284 default:
alphaemmeo 0:60680ad16314 285 break;
alphaemmeo 0:60680ad16314 286 }
alphaemmeo 0:60680ad16314 287 NextTx = true;
alphaemmeo 0:60680ad16314 288 UplinkStatusUpdated = true;
alphaemmeo 0:60680ad16314 289 }
alphaemmeo 0:60680ad16314 290
alphaemmeo 0:60680ad16314 291 // MAIN ========================================================================
alphaemmeo 0:60680ad16314 292 int main() {
alphaemmeo 0:60680ad16314 293 SystemClock_Config();
alphaemmeo 0:60680ad16314 294 ser = new BufferedSerial(USBTX, USBRX);
alphaemmeo 0:60680ad16314 295 //ser->baud(115200*2);
alphaemmeo 0:60680ad16314 296 ser->baud(115200);
alphaemmeo 0:60680ad16314 297 ser->format(8);
alphaemmeo 0:60680ad16314 298 ser->printf("Hello World\n\r");
alphaemmeo 0:60680ad16314 299
alphaemmeo 0:60680ad16314 300
alphaemmeo 0:60680ad16314 301 double tempo = 0.3; // LED blinking delay
alphaemmeo 0:60680ad16314 302 /**
alphaemmeo 0:60680ad16314 303 while(1) {
alphaemmeo 0:60680ad16314 304 myled2 = 1; // LED2 is ON
alphaemmeo 0:60680ad16314 305 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 306 myled2 = 0; // LED2 is OFF
alphaemmeo 0:60680ad16314 307 myled1 = 1; // LED1 is ON
alphaemmeo 0:60680ad16314 308 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 309 myled1 = 0; // LED1 is OFF
alphaemmeo 0:60680ad16314 310 myled3 = 1; // LED3 is ON
alphaemmeo 0:60680ad16314 311 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 312 myled3 = 0; // LED3 is OFF
alphaemmeo 0:60680ad16314 313 myled4 = 1; // LED4 is ON
alphaemmeo 0:60680ad16314 314 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 315 myled4 = 0; // LED4 is OFF
alphaemmeo 0:60680ad16314 316 }
alphaemmeo 0:60680ad16314 317 */
alphaemmeo 0:60680ad16314 318
alphaemmeo 0:60680ad16314 319 // SX1276PingPong();
alphaemmeo 0:60680ad16314 320 LoRaMacPrimitives_t LoRaMacPrimitives;
alphaemmeo 0:60680ad16314 321 LoRaMacCallback_t LoRaMacCallbacks;
alphaemmeo 0:60680ad16314 322 MibRequestConfirm_t mibReq;
alphaemmeo 0:60680ad16314 323
alphaemmeo 0:60680ad16314 324 BoardInit( );
alphaemmeo 0:60680ad16314 325
alphaemmeo 0:60680ad16314 326 DeviceState = DEVICE_STATE_INIT;
alphaemmeo 0:60680ad16314 327 while( 1 ) {
alphaemmeo 0:60680ad16314 328 if( IsNetworkJoinedStatusUpdate == true ){
alphaemmeo 0:60680ad16314 329 IsNetworkJoinedStatusUpdate = false;
alphaemmeo 0:60680ad16314 330 mibReq.Type = MIB_NETWORK_JOINED;
alphaemmeo 0:60680ad16314 331 LoRaMacMibGetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 332 //SerialDisplayUpdateNetworkIsJoined( mibReq.Param.IsNetworkJoined );
alphaemmeo 0:60680ad16314 333 }
alphaemmeo 0:60680ad16314 334 switch( DeviceState ) {
alphaemmeo 0:60680ad16314 335 case DEVICE_STATE_INIT: {
alphaemmeo 0:60680ad16314 336 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
alphaemmeo 0:60680ad16314 337 //LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
alphaemmeo 0:60680ad16314 338 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
alphaemmeo 0:60680ad16314 339 LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
alphaemmeo 0:60680ad16314 340 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
alphaemmeo 0:60680ad16314 341
alphaemmeo 0:60680ad16314 342 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
alphaemmeo 0:60680ad16314 343
alphaemmeo 0:60680ad16314 344 mibReq.Type = MIB_ADR;
alphaemmeo 0:60680ad16314 345 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
alphaemmeo 0:60680ad16314 346 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 347
alphaemmeo 0:60680ad16314 348 mibReq.Type = MIB_PUBLIC_NETWORK;
alphaemmeo 0:60680ad16314 349 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
alphaemmeo 0:60680ad16314 350 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 351
alphaemmeo 0:60680ad16314 352 mibReq.Type = MIB_DEVICE_CLASS;
alphaemmeo 0:60680ad16314 353 mibReq.Param.Class = CLASS_A;
alphaemmeo 0:60680ad16314 354 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 355
alphaemmeo 0:60680ad16314 356 #if defined( USE_BAND_868 )
alphaemmeo 0:60680ad16314 357 //LoRaMacTestSetDutyCycleOn( LORAWAN_DUTYCYCLE_ON );
alphaemmeo 0:60680ad16314 358 ser->printf("USE_BAND_868 \n\r");
alphaemmeo 0:60680ad16314 359 LoRaMacChannelAdd( 3, ( ChannelParams_t )LC4 );
alphaemmeo 0:60680ad16314 360 LoRaMacChannelAdd( 4, ( ChannelParams_t )LC5 );
alphaemmeo 0:60680ad16314 361 LoRaMacChannelAdd( 5, ( ChannelParams_t )LC6 );
alphaemmeo 0:60680ad16314 362 LoRaMacChannelAdd( 6, ( ChannelParams_t )LC7 );
alphaemmeo 0:60680ad16314 363 LoRaMacChannelAdd( 7, ( ChannelParams_t )LC8 );
alphaemmeo 0:60680ad16314 364 LoRaMacChannelAdd( 8, ( ChannelParams_t )LC9 );
alphaemmeo 0:60680ad16314 365 LoRaMacChannelAdd( 9, ( ChannelParams_t )LC10 );
alphaemmeo 0:60680ad16314 366
alphaemmeo 0:60680ad16314 367 mibReq.Type = MIB_RX2_DEFAULT_CHANNEL;
alphaemmeo 0:60680ad16314 368 mibReq.Param.Rx2DefaultChannel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
alphaemmeo 0:60680ad16314 369 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 370
alphaemmeo 0:60680ad16314 371 mibReq.Type = MIB_RX2_CHANNEL;
alphaemmeo 0:60680ad16314 372 mibReq.Param.Rx2Channel = ( Rx2ChannelParams_t ){ 869525000, DR_3 };
alphaemmeo 0:60680ad16314 373 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 374 #endif
alphaemmeo 0:60680ad16314 375 LoRaMacDownlinkStatus.DownlinkCounter = 0;
alphaemmeo 0:60680ad16314 376
alphaemmeo 0:60680ad16314 377 DeviceState = DEVICE_STATE_JOIN;
alphaemmeo 0:60680ad16314 378 break;
alphaemmeo 0:60680ad16314 379 }
alphaemmeo 0:60680ad16314 380 case DEVICE_STATE_JOIN: {
alphaemmeo 0:60680ad16314 381 #if( OVER_THE_AIR_ACTIVATION != 0 )
alphaemmeo 0:60680ad16314 382
alphaemmeo 0:60680ad16314 383 myled3 = 1; // LED2 is ON
alphaemmeo 0:60680ad16314 384 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 385 myled3 = 0; // LED2 is OFF
alphaemmeo 0:60680ad16314 386
alphaemmeo 0:60680ad16314 387 MlmeReq_t mlmeReq;
alphaemmeo 0:60680ad16314 388
alphaemmeo 0:60680ad16314 389 mlmeReq.Type = MLME_JOIN;
alphaemmeo 0:60680ad16314 390
alphaemmeo 0:60680ad16314 391 mlmeReq.Req.Join.DevEui = DevEui;
alphaemmeo 0:60680ad16314 392 mlmeReq.Req.Join.AppEui = AppEui;
alphaemmeo 0:60680ad16314 393 mlmeReq.Req.Join.AppKey = AppKey;
alphaemmeo 0:60680ad16314 394
alphaemmeo 0:60680ad16314 395 ser->printf("DEVEUI ");
alphaemmeo 0:60680ad16314 396 for (int i = 0; i < 8; i++) {
alphaemmeo 0:60680ad16314 397 ser->printf("%02x", DevEui[i]);
alphaemmeo 0:60680ad16314 398 }
alphaemmeo 0:60680ad16314 399 ser->printf("\n\r");
alphaemmeo 0:60680ad16314 400
alphaemmeo 0:60680ad16314 401 ser->printf("APPEUI ");
alphaemmeo 0:60680ad16314 402 for (int i = 0; i < 8; i++) {
alphaemmeo 0:60680ad16314 403 ser->printf("%02x", AppEui[i]);
alphaemmeo 0:60680ad16314 404 }
alphaemmeo 0:60680ad16314 405 ser->printf("\n\r");
alphaemmeo 0:60680ad16314 406
alphaemmeo 0:60680ad16314 407 ser->printf("APPKEY ");
alphaemmeo 0:60680ad16314 408 for (int i = 0; i < 16; i++) {
alphaemmeo 0:60680ad16314 409 ser->printf("%02x", AppKey[i]);
alphaemmeo 0:60680ad16314 410 }
alphaemmeo 0:60680ad16314 411 ser->printf("\n\r");
alphaemmeo 0:60680ad16314 412
alphaemmeo 0:60680ad16314 413 if( NextTx == true ) {
alphaemmeo 0:60680ad16314 414 LoRaMacMlmeRequest( &mlmeReq );
alphaemmeo 0:60680ad16314 415 ser->printf("after LoRaMacMlmeRequest \n\r");
alphaemmeo 0:60680ad16314 416 }
alphaemmeo 0:60680ad16314 417 DeviceState = DEVICE_STATE_SLEEP;
alphaemmeo 0:60680ad16314 418 #else
alphaemmeo 0:60680ad16314 419 mibReq.Type = MIB_NET_ID;
alphaemmeo 0:60680ad16314 420 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
alphaemmeo 0:60680ad16314 421 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 422
alphaemmeo 0:60680ad16314 423 mibReq.Type = MIB_DEV_ADDR;
alphaemmeo 0:60680ad16314 424 mibReq.Param.DevAddr = DevAddr;
alphaemmeo 0:60680ad16314 425 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 426
alphaemmeo 0:60680ad16314 427 mibReq.Type = MIB_NWK_SKEY;
alphaemmeo 0:60680ad16314 428 mibReq.Param.NwkSKey = NwkSKey;
alphaemmeo 0:60680ad16314 429 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 430
alphaemmeo 0:60680ad16314 431 mibReq.Type = MIB_APP_SKEY;
alphaemmeo 0:60680ad16314 432 mibReq.Param.AppSKey = AppSKey;
alphaemmeo 0:60680ad16314 433 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 434
alphaemmeo 0:60680ad16314 435 mibReq.Type = MIB_NETWORK_JOINED;
alphaemmeo 0:60680ad16314 436 mibReq.Param.IsNetworkJoined = true;
alphaemmeo 0:60680ad16314 437 LoRaMacMibSetRequestConfirm( &mibReq );
alphaemmeo 0:60680ad16314 438
alphaemmeo 0:60680ad16314 439 DeviceState = DEVICE_STATE_SEND;
alphaemmeo 0:60680ad16314 440 #endif
alphaemmeo 0:60680ad16314 441 IsNetworkJoinedStatusUpdate = true;
alphaemmeo 0:60680ad16314 442 break;
alphaemmeo 0:60680ad16314 443 }
alphaemmeo 0:60680ad16314 444 case DEVICE_STATE_SEND:
alphaemmeo 0:60680ad16314 445 {
alphaemmeo 0:60680ad16314 446 if( NextTx == true )
alphaemmeo 0:60680ad16314 447 {
alphaemmeo 0:60680ad16314 448 PrepareTxFrame( AppPort );
alphaemmeo 0:60680ad16314 449
alphaemmeo 0:60680ad16314 450 NextTx = SendFrame( );
alphaemmeo 0:60680ad16314 451 }
alphaemmeo 0:60680ad16314 452 if( ComplianceTest.Running == true )
alphaemmeo 0:60680ad16314 453 {
alphaemmeo 0:60680ad16314 454 // Schedule next packet transmission
alphaemmeo 0:60680ad16314 455 TxDutyCycleTime = 5000; // 5000 ms
alphaemmeo 0:60680ad16314 456 }
alphaemmeo 0:60680ad16314 457 else
alphaemmeo 0:60680ad16314 458 {
alphaemmeo 0:60680ad16314 459 // Schedule next packet transmission
alphaemmeo 0:60680ad16314 460 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
alphaemmeo 0:60680ad16314 461 }
alphaemmeo 0:60680ad16314 462 DeviceState = DEVICE_STATE_CYCLE;
alphaemmeo 0:60680ad16314 463 break;
alphaemmeo 0:60680ad16314 464 }
alphaemmeo 0:60680ad16314 465 case DEVICE_STATE_CYCLE: {
alphaemmeo 0:60680ad16314 466 DeviceState = DEVICE_STATE_SLEEP;
alphaemmeo 0:60680ad16314 467
alphaemmeo 0:60680ad16314 468 // Schedule next packet transmission
alphaemmeo 0:60680ad16314 469 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
alphaemmeo 0:60680ad16314 470 TimerStart( &TxNextPacketTimer );
alphaemmeo 0:60680ad16314 471 break;
alphaemmeo 0:60680ad16314 472 }
alphaemmeo 0:60680ad16314 473 case DEVICE_STATE_SLEEP: {
alphaemmeo 0:60680ad16314 474 myled2 = 1; // LED2 is ON
alphaemmeo 0:60680ad16314 475 wait(tempo); // wait tempo
alphaemmeo 0:60680ad16314 476 myled2 = 0; // LED2 is OFF
alphaemmeo 0:60680ad16314 477 // Wake up through events
alphaemmeo 0:60680ad16314 478 break;
alphaemmeo 0:60680ad16314 479 }
alphaemmeo 0:60680ad16314 480 default: {
alphaemmeo 0:60680ad16314 481 DeviceState = DEVICE_STATE_INIT;
alphaemmeo 0:60680ad16314 482 break;
alphaemmeo 0:60680ad16314 483 }
alphaemmeo 0:60680ad16314 484 }
alphaemmeo 0:60680ad16314 485 }
alphaemmeo 0:60680ad16314 486 }
alphaemmeo 0:60680ad16314 487
alphaemmeo 0:60680ad16314 488
alphaemmeo 0:60680ad16314 489
alphaemmeo 0:60680ad16314 490
alphaemmeo 0:60680ad16314 491 void SystemClock_Config(void)
alphaemmeo 0:60680ad16314 492 {
alphaemmeo 0:60680ad16314 493 //#ifdef B_L072Z_LRWAN1_LORA
alphaemmeo 0:60680ad16314 494 /*
alphaemmeo 0:60680ad16314 495 * The L072Z_LRWAN1_LORA clock setup is somewhat differnt from the Nucleo board.
alphaemmeo 0:60680ad16314 496 * It has no LSE.
alphaemmeo 0:60680ad16314 497 */
alphaemmeo 0:60680ad16314 498 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
alphaemmeo 0:60680ad16314 499 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
alphaemmeo 0:60680ad16314 500
alphaemmeo 0:60680ad16314 501 /* Enable HSE Oscillator and Activate PLL with HSE as source */
alphaemmeo 0:60680ad16314 502 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
alphaemmeo 0:60680ad16314 503 RCC_OscInitStruct.HSEState = RCC_HSE_OFF;
alphaemmeo 0:60680ad16314 504 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
alphaemmeo 0:60680ad16314 505 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
alphaemmeo 0:60680ad16314 506 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
alphaemmeo 0:60680ad16314 507 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
alphaemmeo 0:60680ad16314 508 RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_6;
alphaemmeo 0:60680ad16314 509 RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_3;
alphaemmeo 0:60680ad16314 510
alphaemmeo 0:60680ad16314 511 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
alphaemmeo 0:60680ad16314 512 // Error_Handler();
alphaemmeo 0:60680ad16314 513 }
alphaemmeo 0:60680ad16314 514
alphaemmeo 0:60680ad16314 515 /* Set Voltage scale1 as MCU will run at 32MHz */
alphaemmeo 0:60680ad16314 516 __HAL_RCC_PWR_CLK_ENABLE();
alphaemmeo 0:60680ad16314 517 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
alphaemmeo 0:60680ad16314 518
alphaemmeo 0:60680ad16314 519 /* Poll VOSF bit of in PWR_CSR. Wait until it is reset to 0 */
alphaemmeo 0:60680ad16314 520 while (__HAL_PWR_GET_FLAG(PWR_FLAG_VOS) != RESET) {};
alphaemmeo 0:60680ad16314 521
alphaemmeo 0:60680ad16314 522 /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
alphaemmeo 0:60680ad16314 523 clocks dividers */
alphaemmeo 0:60680ad16314 524 RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
alphaemmeo 0:60680ad16314 525 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
alphaemmeo 0:60680ad16314 526 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
alphaemmeo 0:60680ad16314 527 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
alphaemmeo 0:60680ad16314 528 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
alphaemmeo 0:60680ad16314 529 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
alphaemmeo 0:60680ad16314 530 // Error_Handler();
alphaemmeo 0:60680ad16314 531 }
alphaemmeo 0:60680ad16314 532 //#endif
alphaemmeo 0:60680ad16314 533 }
alphaemmeo 0:60680ad16314 534
alphaemmeo 0:60680ad16314 535 void dump(const char *title, const void *data, int len, bool dwords)
alphaemmeo 0:60680ad16314 536 {
alphaemmeo 0:60680ad16314 537 dprintf("dump(\"%s\", 0x%x, %d bytes)", title, data, len);
alphaemmeo 0:60680ad16314 538
alphaemmeo 0:60680ad16314 539 int i, j, cnt;
alphaemmeo 0:60680ad16314 540 unsigned char *u;
alphaemmeo 0:60680ad16314 541 const int width = 16;
alphaemmeo 0:60680ad16314 542 const int seppos = 7;
alphaemmeo 0:60680ad16314 543
alphaemmeo 0:60680ad16314 544 cnt = 0;
alphaemmeo 0:60680ad16314 545 u = (unsigned char *)data;
alphaemmeo 0:60680ad16314 546 while (len > 0) {
alphaemmeo 0:60680ad16314 547 ser->printf("%08x: ", (unsigned int)data + cnt);
alphaemmeo 0:60680ad16314 548 if (dwords) {
alphaemmeo 0:60680ad16314 549 unsigned int *ip = ( unsigned int *)u;
alphaemmeo 0:60680ad16314 550 ser->printf(" 0x%08x\r\n", *ip);
alphaemmeo 0:60680ad16314 551 u+= 4;
alphaemmeo 0:60680ad16314 552 len -= 4;
alphaemmeo 0:60680ad16314 553 cnt += 4;
alphaemmeo 0:60680ad16314 554 continue;
alphaemmeo 0:60680ad16314 555 }
alphaemmeo 0:60680ad16314 556 cnt += width;
alphaemmeo 0:60680ad16314 557 j = len < width ? len : width;
alphaemmeo 0:60680ad16314 558 for (i = 0; i < j; i++) {
alphaemmeo 0:60680ad16314 559 ser->printf("%2.2x ", *(u + i));
alphaemmeo 0:60680ad16314 560 if (i == seppos)
alphaemmeo 0:60680ad16314 561 ser->putc(' ');
alphaemmeo 0:60680ad16314 562 }
alphaemmeo 0:60680ad16314 563 ser->putc(' ');
alphaemmeo 0:60680ad16314 564 if (j < width) {
alphaemmeo 0:60680ad16314 565 i = width - j;
alphaemmeo 0:60680ad16314 566 if (i > seppos + 1)
alphaemmeo 0:60680ad16314 567 ser->putc(' ');
alphaemmeo 0:60680ad16314 568 while (i--) {
alphaemmeo 0:60680ad16314 569 printf("%s", " ");
alphaemmeo 0:60680ad16314 570 }
alphaemmeo 0:60680ad16314 571 }
alphaemmeo 0:60680ad16314 572 for (i = 0; i < j; i++) {
alphaemmeo 0:60680ad16314 573 int c = *(u + i);
alphaemmeo 0:60680ad16314 574 if (c >= ' ' && c <= '~')
alphaemmeo 0:60680ad16314 575 ser->putc(c);
alphaemmeo 0:60680ad16314 576 else
alphaemmeo 0:60680ad16314 577 ser->putc('.');
alphaemmeo 0:60680ad16314 578 if (i == seppos)
alphaemmeo 0:60680ad16314 579 ser->putc(' ');
alphaemmeo 0:60680ad16314 580 }
alphaemmeo 0:60680ad16314 581 len -= width;
alphaemmeo 0:60680ad16314 582 u += width;
alphaemmeo 0:60680ad16314 583 ser->printf("\r\n");
alphaemmeo 0:60680ad16314 584 }
alphaemmeo 0:60680ad16314 585 ser->printf("--\r\n");
alphaemmeo 0:60680ad16314 586 }