lora experiments

Dependencies:   BLE_API LoRaWAN-lib SX1276Lib mbed nRF51822 HCSR04Lib

Fork of LoRa by Olav Nymoen

Committer:
haaspors
Date:
Wed Jun 08 12:40:38 2016 +0000
Revision:
3:70d40f678f37
Parent:
2:ce7cea075e95
Child:
4:63d6744a61b6
Add HC-SR04 sensor readings to a bluetooth GATT char.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
olav 0:4c1fcbfcc7bf 1 #include "mbed.h"
olav 0:4c1fcbfcc7bf 2 #include "board.h"
olav 0:4c1fcbfcc7bf 3 #include "radio.h"
olav 0:4c1fcbfcc7bf 4
olav 0:4c1fcbfcc7bf 5 #include "LoRaMac.h"
olav 0:4c1fcbfcc7bf 6 #include "Comissioning.h"
olav 0:4c1fcbfcc7bf 7
haaspors 2:ce7cea075e95 8 #include "ble/BLE.h"
haaspors 2:ce7cea075e95 9 #include "ble/services/DFUService.h"
haaspors 2:ce7cea075e95 10
haaspors 3:70d40f678f37 11 #include "hcsr04.h"
haaspors 3:70d40f678f37 12
haaspors 3:70d40f678f37 13 /* I/O stuff */
haaspors 3:70d40f678f37 14 InterruptIn button(BUTTON3);
haaspors 3:70d40f678f37 15 DigitalOut led1(LED1);
haaspors 3:70d40f678f37 16 DigitalOut led2(LED2);
haaspors 3:70d40f678f37 17 HCSR04 usonic(P0_2, P0_3);
haaspors 3:70d40f678f37 18
haaspors 3:70d40f678f37 19
olav 0:4c1fcbfcc7bf 20 /*!
olav 0:4c1fcbfcc7bf 21 * Join requests trials duty cycle.
olav 0:4c1fcbfcc7bf 22 */
olav 0:4c1fcbfcc7bf 23 #define OVER_THE_AIR_ACTIVATION_DUTYCYCLE 10000000 // 10 [s] value in us
olav 0:4c1fcbfcc7bf 24
olav 0:4c1fcbfcc7bf 25 /*!
olav 0:4c1fcbfcc7bf 26 * Defines the application data transmission duty cycle. 5s, value in [us].
olav 0:4c1fcbfcc7bf 27 */
olav 0:4c1fcbfcc7bf 28 #define APP_TX_DUTYCYCLE 5000000
olav 0:4c1fcbfcc7bf 29
olav 0:4c1fcbfcc7bf 30 /*!
olav 0:4c1fcbfcc7bf 31 * Defines a random delay for application data transmission duty cycle. 1s,
olav 0:4c1fcbfcc7bf 32 * value in [us].
olav 0:4c1fcbfcc7bf 33 */
olav 0:4c1fcbfcc7bf 34 #define APP_TX_DUTYCYCLE_RND 1000000
olav 0:4c1fcbfcc7bf 35
olav 0:4c1fcbfcc7bf 36 /*!
olav 0:4c1fcbfcc7bf 37 * Default mote datarate
olav 0:4c1fcbfcc7bf 38 */
olav 0:4c1fcbfcc7bf 39 #define LORAWAN_DEFAULT_DATARATE DR_0
olav 0:4c1fcbfcc7bf 40
olav 0:4c1fcbfcc7bf 41 /*!
olav 0:4c1fcbfcc7bf 42 * LoRaWAN confirmed messages
olav 0:4c1fcbfcc7bf 43 */
olav 0:4c1fcbfcc7bf 44 #define LORAWAN_CONFIRMED_MSG_ON false
olav 0:4c1fcbfcc7bf 45
olav 0:4c1fcbfcc7bf 46 #define LORAWAN_ADR_ON 1
olav 0:4c1fcbfcc7bf 47
olav 0:4c1fcbfcc7bf 48 #define LORAWAN_DUTYCYCLE_ON false
olav 0:4c1fcbfcc7bf 49
olav 0:4c1fcbfcc7bf 50 #define LORAWAN_APP_PORT 15
olav 0:4c1fcbfcc7bf 51
olav 0:4c1fcbfcc7bf 52 /*!
olav 0:4c1fcbfcc7bf 53 * User application data buffer size
olav 0:4c1fcbfcc7bf 54 */
olav 0:4c1fcbfcc7bf 55 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
olav 0:4c1fcbfcc7bf 56 #define LORAWAN_APP_DATA_SIZE 6
olav 0:4c1fcbfcc7bf 57
olav 0:4c1fcbfcc7bf 58 #else
olav 0:4c1fcbfcc7bf 59 #define LORAWAN_APP_DATA_SIZE 1
olav 0:4c1fcbfcc7bf 60
olav 0:4c1fcbfcc7bf 61 #endif
olav 0:4c1fcbfcc7bf 62
olav 0:4c1fcbfcc7bf 63 #if( OVER_THE_AIR_ACTIVATION != 0 )
olav 0:4c1fcbfcc7bf 64
olav 0:4c1fcbfcc7bf 65 static uint8_t DevEui[] = LORAWAN_DEVICE_EUI;
olav 0:4c1fcbfcc7bf 66 static uint8_t AppEui[] = LORAWAN_APPLICATION_EUI;
olav 0:4c1fcbfcc7bf 67 static uint8_t AppKey[] = LORAWAN_APPLICATION_KEY;
olav 0:4c1fcbfcc7bf 68
olav 0:4c1fcbfcc7bf 69 #else
olav 0:4c1fcbfcc7bf 70
olav 0:4c1fcbfcc7bf 71 static uint8_t NwkSKey[] = LORAWAN_NWKSKEY;
olav 0:4c1fcbfcc7bf 72 static uint8_t AppSKey[] = LORAWAN_APPSKEY;
olav 0:4c1fcbfcc7bf 73
olav 0:4c1fcbfcc7bf 74 /*!
olav 0:4c1fcbfcc7bf 75 * Device address
olav 0:4c1fcbfcc7bf 76 */
olav 0:4c1fcbfcc7bf 77 static uint32_t DevAddr = LORAWAN_DEVICE_ADDRESS;
olav 0:4c1fcbfcc7bf 78
olav 0:4c1fcbfcc7bf 79 #endif
olav 0:4c1fcbfcc7bf 80
olav 0:4c1fcbfcc7bf 81 /*!
olav 0:4c1fcbfcc7bf 82 * Application port
olav 0:4c1fcbfcc7bf 83 */
olav 0:4c1fcbfcc7bf 84 static uint8_t AppPort = LORAWAN_APP_PORT;
olav 0:4c1fcbfcc7bf 85
olav 0:4c1fcbfcc7bf 86 /*!
olav 0:4c1fcbfcc7bf 87 * User application data size
olav 0:4c1fcbfcc7bf 88 */
olav 0:4c1fcbfcc7bf 89 static uint8_t AppDataSize = LORAWAN_APP_DATA_SIZE;
olav 0:4c1fcbfcc7bf 90
olav 0:4c1fcbfcc7bf 91 /*!
olav 0:4c1fcbfcc7bf 92 * User application data buffer size
olav 0:4c1fcbfcc7bf 93 */
olav 0:4c1fcbfcc7bf 94 #define LORAWAN_APP_DATA_MAX_SIZE 64
olav 0:4c1fcbfcc7bf 95
olav 0:4c1fcbfcc7bf 96 /*!
olav 0:4c1fcbfcc7bf 97 * User application data
olav 0:4c1fcbfcc7bf 98 */
olav 0:4c1fcbfcc7bf 99 static uint8_t AppData[LORAWAN_APP_DATA_MAX_SIZE];
olav 0:4c1fcbfcc7bf 100
olav 0:4c1fcbfcc7bf 101 /*!
olav 0:4c1fcbfcc7bf 102 * Indicates if the node is sending confirmed or unconfirmed messages
olav 0:4c1fcbfcc7bf 103 */
olav 0:4c1fcbfcc7bf 104 static uint8_t IsTxConfirmed = LORAWAN_CONFIRMED_MSG_ON;
olav 0:4c1fcbfcc7bf 105
olav 0:4c1fcbfcc7bf 106 /*!
olav 0:4c1fcbfcc7bf 107 * Defines the application data transmission duty cycle
olav 0:4c1fcbfcc7bf 108 */
olav 0:4c1fcbfcc7bf 109 static uint32_t TxDutyCycleTime;
olav 0:4c1fcbfcc7bf 110
olav 0:4c1fcbfcc7bf 111 /*!
olav 0:4c1fcbfcc7bf 112 * Timer to handle the application data transmission duty cycle
olav 0:4c1fcbfcc7bf 113 */
olav 0:4c1fcbfcc7bf 114 static TimerEvent_t TxNextPacketTimer;
olav 0:4c1fcbfcc7bf 115
olav 0:4c1fcbfcc7bf 116 /*!
olav 0:4c1fcbfcc7bf 117 * Indicates if a new packet can be sent
olav 0:4c1fcbfcc7bf 118 */
olav 0:4c1fcbfcc7bf 119 static bool NextTx = true;
olav 0:4c1fcbfcc7bf 120
olav 0:4c1fcbfcc7bf 121 /*!
olav 0:4c1fcbfcc7bf 122 * Device states
olav 0:4c1fcbfcc7bf 123 */
olav 0:4c1fcbfcc7bf 124 static enum eDevicState
olav 0:4c1fcbfcc7bf 125 {
olav 0:4c1fcbfcc7bf 126 DEVICE_STATE_INIT,
olav 0:4c1fcbfcc7bf 127 DEVICE_STATE_JOIN,
olav 0:4c1fcbfcc7bf 128 DEVICE_STATE_SEND,
olav 0:4c1fcbfcc7bf 129 DEVICE_STATE_CYCLE,
olav 0:4c1fcbfcc7bf 130 DEVICE_STATE_SLEEP
olav 0:4c1fcbfcc7bf 131 }DeviceState;
olav 0:4c1fcbfcc7bf 132
olav 0:4c1fcbfcc7bf 133 /*!
olav 0:4c1fcbfcc7bf 134 * Strucure containing the Downlink status
olav 0:4c1fcbfcc7bf 135 */
olav 0:4c1fcbfcc7bf 136 struct sLoRaMacDownlinkStatus
olav 0:4c1fcbfcc7bf 137 {
olav 0:4c1fcbfcc7bf 138 int16_t Rssi;
olav 0:4c1fcbfcc7bf 139 int8_t Snr;
olav 0:4c1fcbfcc7bf 140 uint16_t DownlinkCounter;
olav 0:4c1fcbfcc7bf 141 bool RxData;
olav 0:4c1fcbfcc7bf 142 uint8_t Port;
olav 0:4c1fcbfcc7bf 143 uint8_t *Buffer;
olav 0:4c1fcbfcc7bf 144 uint8_t BufferSize;
olav 0:4c1fcbfcc7bf 145 }LoRaMacDownlinkStatus;
olav 0:4c1fcbfcc7bf 146
olav 0:4c1fcbfcc7bf 147 /*!
olav 0:4c1fcbfcc7bf 148 * Strucure containing the Uplink status
olav 0:4c1fcbfcc7bf 149 */
olav 0:4c1fcbfcc7bf 150 struct sLoRaMacUplinkStatus
olav 0:4c1fcbfcc7bf 151 {
olav 0:4c1fcbfcc7bf 152 uint8_t Acked;
olav 0:4c1fcbfcc7bf 153 int8_t Datarate;
olav 0:4c1fcbfcc7bf 154 uint16_t UplinkCounter;
olav 0:4c1fcbfcc7bf 155 uint8_t Port;
olav 0:4c1fcbfcc7bf 156 uint8_t *Buffer;
olav 0:4c1fcbfcc7bf 157 uint8_t BufferSize;
olav 0:4c1fcbfcc7bf 158 }LoRaMacUplinkStatus;
olav 0:4c1fcbfcc7bf 159
olav 0:4c1fcbfcc7bf 160 MibRequestConfirm_t mibReq;
olav 0:4c1fcbfcc7bf 161
haaspors 2:ce7cea075e95 162
haaspors 2:ce7cea075e95 163 /* BLE stuff */
haaspors 3:70d40f678f37 164 const uint16_t loraConfServiceUUID = 0xA000;
haaspors 3:70d40f678f37 165 const uint16_t echoServiceUUID = 0xB000;
haaspors 2:ce7cea075e95 166 const static char DEVICE_NAME[] = "TD Test Device";
haaspors 2:ce7cea075e95 167
haaspors 2:ce7cea075e95 168 #if( OVER_THE_AIR_ACTIVATION != 0 )
haaspors 2:ce7cea075e95 169 const uint16_t DevEuiUUID = 0xA001;
haaspors 2:ce7cea075e95 170 const uint16_t AppEuiUUID = 0xA002;
haaspors 2:ce7cea075e95 171 const uint16_t AppKeyUUID = 0xA003;
haaspors 2:ce7cea075e95 172
haaspors 2:ce7cea075e95 173 ReadWriteArrayGattCharacteristic<uint8_t, sizeof(DevEui)> DevEuiChar(DevEuiUUID, DevEui);
haaspors 2:ce7cea075e95 174 ReadWriteArrayGattCharacteristic<uint8_t, sizeof(AppEui)> AppEuiChar(AppEuiUUID, AppEui);
haaspors 2:ce7cea075e95 175 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(AppKey)> AppKeyChar(AppKeyUUID, AppKey);
haaspors 2:ce7cea075e95 176
haaspors 3:70d40f678f37 177 GattCharacteristic *loraChars[] = {&DevEuiChar, &AppEuiChar, &AppKeyChar};
haaspors 2:ce7cea075e95 178 #else
haaspors 2:ce7cea075e95 179 const uint16_t DevAddrUUID = 0xA004;
haaspors 2:ce7cea075e95 180 const uint16_t NwkSKeyUUID = 0xA005;
haaspors 2:ce7cea075e95 181 const uint16_t AppSKeyUUID = 0xA006;
haaspors 2:ce7cea075e95 182
haaspors 2:ce7cea075e95 183 ReadWriteGattCharacteristic<uint32_t> DevAddrChar(DevAddrUUID, &DevAddr);
haaspors 2:ce7cea075e95 184 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(NwkSKey)> NwkSKeyChar(NwkSKeyUUID, NwkSKey);
haaspors 2:ce7cea075e95 185 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(AppSKey)> AppSKeyChar(AppSKeyUUID, AppSKey);
haaspors 2:ce7cea075e95 186
haaspors 3:70d40f678f37 187 GattCharacteristic *loraChars[] = {&DevAddrChar, &NwkSKeyChar, &AppSKeyChar};
haaspors 2:ce7cea075e95 188 #endif
haaspors 3:70d40f678f37 189 GattService loraConfService(loraConfServiceUUID, loraChars, sizeof(loraChars) / sizeof(GattCharacteristic *));
haaspors 2:ce7cea075e95 190
haaspors 3:70d40f678f37 191 uint32_t echoDist = 0;
haaspors 3:70d40f678f37 192 const uint16_t EchoDistUUID = 0xB001;
haaspors 3:70d40f678f37 193 ReadOnlyGattCharacteristic<uint32_t> echoDistChar(EchoDistUUID, &echoDist);
haaspors 3:70d40f678f37 194 GattCharacteristic *echoChars[] = {&echoDistChar};
haaspors 3:70d40f678f37 195 GattService echoService(echoServiceUUID, echoChars, sizeof(echoChars) / sizeof(GattCharacteristic *));
haaspors 3:70d40f678f37 196
olav 0:4c1fcbfcc7bf 197
olav 0:4c1fcbfcc7bf 198 /*!
olav 0:4c1fcbfcc7bf 199 * Indicates if the MAC layer network join status has changed.
olav 0:4c1fcbfcc7bf 200 */
olav 0:4c1fcbfcc7bf 201 static bool IsNetworkJoinedStatusUpdate = false;
olav 0:4c1fcbfcc7bf 202
olav 0:4c1fcbfcc7bf 203 static void PrepareTxFrame( uint8_t port )
olav 0:4c1fcbfcc7bf 204 {
olav 0:4c1fcbfcc7bf 205 switch( port )
olav 0:4c1fcbfcc7bf 206 {
olav 0:4c1fcbfcc7bf 207 case 15:
olav 0:4c1fcbfcc7bf 208 {}
olav 0:4c1fcbfcc7bf 209 default:
olav 0:4c1fcbfcc7bf 210 {
olav 0:4c1fcbfcc7bf 211 AppData[0] = 1;
olav 0:4c1fcbfcc7bf 212 if( IsTxConfirmed == true )
olav 0:4c1fcbfcc7bf 213 {
olav 0:4c1fcbfcc7bf 214 AppData[1] = LoRaMacDownlinkStatus.DownlinkCounter >> 8;
olav 0:4c1fcbfcc7bf 215 AppData[2] = LoRaMacDownlinkStatus.DownlinkCounter;
olav 0:4c1fcbfcc7bf 216 AppData[3] = LoRaMacDownlinkStatus.Rssi >> 8;
olav 0:4c1fcbfcc7bf 217 AppData[4] = LoRaMacDownlinkStatus.Rssi;
olav 0:4c1fcbfcc7bf 218 AppData[5] = LoRaMacDownlinkStatus.Snr;
olav 0:4c1fcbfcc7bf 219
olav 0:4c1fcbfcc7bf 220 AppData[6] = 1;
olav 0:4c1fcbfcc7bf 221 }
olav 0:4c1fcbfcc7bf 222 else
olav 0:4c1fcbfcc7bf 223 {
olav 0:4c1fcbfcc7bf 224 AppData[1] = 1;
olav 0:4c1fcbfcc7bf 225 }
olav 0:4c1fcbfcc7bf 226 }
olav 0:4c1fcbfcc7bf 227 break;
olav 0:4c1fcbfcc7bf 228 }
olav 0:4c1fcbfcc7bf 229 }
olav 0:4c1fcbfcc7bf 230
olav 0:4c1fcbfcc7bf 231 /*!
olav 0:4c1fcbfcc7bf 232 * \brief MCPS-Confirm event function
olav 0:4c1fcbfcc7bf 233 *
olav 0:4c1fcbfcc7bf 234 * \param [IN] McpsConfirm - Pointer to the confirm structure,
olav 0:4c1fcbfcc7bf 235 * containing confirm attributes.
olav 0:4c1fcbfcc7bf 236 */
olav 0:4c1fcbfcc7bf 237 static void McpsConfirm( McpsConfirm_t *McpsConfirm )
olav 0:4c1fcbfcc7bf 238 {
olav 0:4c1fcbfcc7bf 239 if( McpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
olav 0:4c1fcbfcc7bf 240 {
olav 0:4c1fcbfcc7bf 241 switch( McpsConfirm->McpsRequest )
olav 0:4c1fcbfcc7bf 242 {
olav 0:4c1fcbfcc7bf 243 case MCPS_UNCONFIRMED:
olav 0:4c1fcbfcc7bf 244 {
olav 0:4c1fcbfcc7bf 245 // Check Datarate
olav 0:4c1fcbfcc7bf 246 // Check TxPower
olav 0:4c1fcbfcc7bf 247 break;
olav 0:4c1fcbfcc7bf 248 }
olav 0:4c1fcbfcc7bf 249 case MCPS_CONFIRMED:
olav 0:4c1fcbfcc7bf 250 {
olav 0:4c1fcbfcc7bf 251 // Check Datarate
olav 0:4c1fcbfcc7bf 252 // Check TxPower
olav 0:4c1fcbfcc7bf 253 // Check AckReceived
olav 0:4c1fcbfcc7bf 254 // Check NbRetries
olav 0:4c1fcbfcc7bf 255 break;
olav 0:4c1fcbfcc7bf 256 }
olav 0:4c1fcbfcc7bf 257 case MCPS_PROPRIETARY:
olav 0:4c1fcbfcc7bf 258 {
olav 0:4c1fcbfcc7bf 259 break;
olav 0:4c1fcbfcc7bf 260 }
olav 0:4c1fcbfcc7bf 261 default:
olav 0:4c1fcbfcc7bf 262 break;
olav 0:4c1fcbfcc7bf 263 }
olav 0:4c1fcbfcc7bf 264 }
olav 0:4c1fcbfcc7bf 265 NextTx = true;
olav 0:4c1fcbfcc7bf 266 }
olav 0:4c1fcbfcc7bf 267
olav 0:4c1fcbfcc7bf 268 /*!
olav 0:4c1fcbfcc7bf 269 * \brief MCPS-Indication event function
olav 0:4c1fcbfcc7bf 270 *
olav 0:4c1fcbfcc7bf 271 * \param [IN] McpsIndication - Pointer to the indication structure,
olav 0:4c1fcbfcc7bf 272 * containing indication attributes.
olav 0:4c1fcbfcc7bf 273 */
olav 0:4c1fcbfcc7bf 274 static void McpsIndication( McpsIndication_t *McpsIndication )
olav 0:4c1fcbfcc7bf 275 {
olav 0:4c1fcbfcc7bf 276 printf("Downstream message! \r\n");
olav 0:4c1fcbfcc7bf 277 if( McpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
olav 0:4c1fcbfcc7bf 278 {
olav 0:4c1fcbfcc7bf 279 printf("Something fishy %d \r\n", McpsIndication->Status);
olav 0:4c1fcbfcc7bf 280 return;
olav 0:4c1fcbfcc7bf 281 }
olav 0:4c1fcbfcc7bf 282
olav 0:4c1fcbfcc7bf 283 switch( McpsIndication->McpsIndication )
olav 0:4c1fcbfcc7bf 284 {
olav 0:4c1fcbfcc7bf 285 case MCPS_UNCONFIRMED:
olav 0:4c1fcbfcc7bf 286 {
olav 0:4c1fcbfcc7bf 287 break;
olav 0:4c1fcbfcc7bf 288 }
olav 0:4c1fcbfcc7bf 289 case MCPS_CONFIRMED:
olav 0:4c1fcbfcc7bf 290 {
olav 0:4c1fcbfcc7bf 291 break;
olav 0:4c1fcbfcc7bf 292 }
olav 0:4c1fcbfcc7bf 293 case MCPS_PROPRIETARY:
olav 0:4c1fcbfcc7bf 294 {
olav 0:4c1fcbfcc7bf 295 break;
olav 0:4c1fcbfcc7bf 296 }
olav 0:4c1fcbfcc7bf 297 case MCPS_MULTICAST:
olav 0:4c1fcbfcc7bf 298 {
olav 0:4c1fcbfcc7bf 299 break;
olav 0:4c1fcbfcc7bf 300 }
olav 0:4c1fcbfcc7bf 301 default:
olav 0:4c1fcbfcc7bf 302 break;
olav 0:4c1fcbfcc7bf 303 }
olav 0:4c1fcbfcc7bf 304
olav 0:4c1fcbfcc7bf 305 // Check Multicast
olav 0:4c1fcbfcc7bf 306 // Check Port
olav 0:4c1fcbfcc7bf 307 // Check Datarate
olav 0:4c1fcbfcc7bf 308 // Check FramePending
olav 0:4c1fcbfcc7bf 309 // Check Buffer
olav 0:4c1fcbfcc7bf 310 // Check BufferSize
olav 0:4c1fcbfcc7bf 311 // Check Rssi
olav 0:4c1fcbfcc7bf 312 // Check Snr
olav 0:4c1fcbfcc7bf 313 // Check RxSlot
olav 0:4c1fcbfcc7bf 314
olav 0:4c1fcbfcc7bf 315 LoRaMacDownlinkStatus.Rssi = McpsIndication->Rssi;
olav 0:4c1fcbfcc7bf 316 if( McpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
olav 0:4c1fcbfcc7bf 317 {
olav 0:4c1fcbfcc7bf 318 // Invert and divide by 4
olav 0:4c1fcbfcc7bf 319 LoRaMacDownlinkStatus.Snr = ( ( ~McpsIndication->Snr + 1 ) & 0xFF ) >> 2;
olav 0:4c1fcbfcc7bf 320 LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
olav 0:4c1fcbfcc7bf 321 }
olav 0:4c1fcbfcc7bf 322 else
olav 0:4c1fcbfcc7bf 323 {
olav 0:4c1fcbfcc7bf 324 // Divide by 4
olav 0:4c1fcbfcc7bf 325 LoRaMacDownlinkStatus.Snr = ( McpsIndication->Snr & 0xFF ) >> 2;
olav 0:4c1fcbfcc7bf 326 }
olav 0:4c1fcbfcc7bf 327 LoRaMacDownlinkStatus.DownlinkCounter++;
olav 0:4c1fcbfcc7bf 328 LoRaMacDownlinkStatus.RxData = McpsIndication->RxData;
olav 0:4c1fcbfcc7bf 329 LoRaMacDownlinkStatus.Port = McpsIndication->Port;
olav 0:4c1fcbfcc7bf 330 LoRaMacDownlinkStatus.Buffer = McpsIndication->Buffer;
olav 0:4c1fcbfcc7bf 331 LoRaMacDownlinkStatus.BufferSize = McpsIndication->BufferSize;
olav 0:4c1fcbfcc7bf 332
olav 0:4c1fcbfcc7bf 333 if( McpsIndication->RxData == true )
olav 0:4c1fcbfcc7bf 334 {
olav 0:4c1fcbfcc7bf 335 printf("Got a nice thingie! \r\n");
olav 0:4c1fcbfcc7bf 336 switch( McpsIndication->Port )
olav 0:4c1fcbfcc7bf 337 {
olav 0:4c1fcbfcc7bf 338 case 1:
olav 0:4c1fcbfcc7bf 339 printf("Logic for port1 %u\r\n", McpsIndication->Buffer[0]);
olav 0:4c1fcbfcc7bf 340 if( McpsIndication->BufferSize == 1 )
olav 0:4c1fcbfcc7bf 341 {
olav 0:4c1fcbfcc7bf 342 led1 = !McpsIndication->Buffer[0];
olav 0:4c1fcbfcc7bf 343 }
olav 0:4c1fcbfcc7bf 344 break;
olav 0:4c1fcbfcc7bf 345 case 2:
olav 0:4c1fcbfcc7bf 346 printf("Logic for port2 %u\r\n", McpsIndication->Buffer[0]);
olav 0:4c1fcbfcc7bf 347 if( McpsIndication->BufferSize == 1 )
olav 0:4c1fcbfcc7bf 348 {
olav 0:4c1fcbfcc7bf 349 led2 = !McpsIndication->Buffer[0];
olav 0:4c1fcbfcc7bf 350 }
olav 0:4c1fcbfcc7bf 351 break;
olav 0:4c1fcbfcc7bf 352 default:
olav 0:4c1fcbfcc7bf 353 break;
olav 0:4c1fcbfcc7bf 354 }
olav 0:4c1fcbfcc7bf 355 }
olav 0:4c1fcbfcc7bf 356 }
olav 0:4c1fcbfcc7bf 357
olav 0:4c1fcbfcc7bf 358 /*!
olav 0:4c1fcbfcc7bf 359 * \brief MLME-Confirm event function
olav 0:4c1fcbfcc7bf 360 *
olav 0:4c1fcbfcc7bf 361 * \param [IN] MlmeConfirm - Pointer to the confirm structure,
olav 0:4c1fcbfcc7bf 362 * containing confirm attributes.
olav 0:4c1fcbfcc7bf 363 */
olav 0:4c1fcbfcc7bf 364 static void MlmeConfirm( MlmeConfirm_t *MlmeConfirm )
olav 0:4c1fcbfcc7bf 365 {
olav 0:4c1fcbfcc7bf 366 if( MlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
olav 0:4c1fcbfcc7bf 367 {
olav 0:4c1fcbfcc7bf 368 switch( MlmeConfirm->MlmeRequest )
olav 0:4c1fcbfcc7bf 369 {
olav 0:4c1fcbfcc7bf 370 case MLME_JOIN:
olav 0:4c1fcbfcc7bf 371 {
olav 0:4c1fcbfcc7bf 372 printf("We joined! \r\n");
olav 0:4c1fcbfcc7bf 373 // Status is OK, node has joined the network
olav 0:4c1fcbfcc7bf 374 IsNetworkJoinedStatusUpdate = true;
olav 0:4c1fcbfcc7bf 375 break;
olav 0:4c1fcbfcc7bf 376 }
olav 0:4c1fcbfcc7bf 377 default:
olav 0:4c1fcbfcc7bf 378 break;
olav 0:4c1fcbfcc7bf 379 }
olav 0:4c1fcbfcc7bf 380 }
olav 0:4c1fcbfcc7bf 381 NextTx = true;
olav 0:4c1fcbfcc7bf 382 }
olav 0:4c1fcbfcc7bf 383
olav 0:4c1fcbfcc7bf 384 /*!
olav 0:4c1fcbfcc7bf 385 * \brief Prepares the payload of the frame
olav 0:4c1fcbfcc7bf 386 *
olav 0:4c1fcbfcc7bf 387 * \retval [0: frame could be send, 1: error]
olav 0:4c1fcbfcc7bf 388 */
olav 0:4c1fcbfcc7bf 389 static bool SendFrame( void )
olav 0:4c1fcbfcc7bf 390 {
olav 0:4c1fcbfcc7bf 391 printf("Sending!\r\n");
olav 0:4c1fcbfcc7bf 392 McpsReq_t mcpsReq;
olav 0:4c1fcbfcc7bf 393 LoRaMacTxInfo_t txInfo;
olav 0:4c1fcbfcc7bf 394
olav 0:4c1fcbfcc7bf 395 if( LoRaMacQueryTxPossible( AppDataSize, &txInfo ) != LORAMAC_STATUS_OK )
olav 0:4c1fcbfcc7bf 396 {
olav 0:4c1fcbfcc7bf 397 printf("Flush mac\r\n");
olav 0:4c1fcbfcc7bf 398 // Send empty frame in order to flush MAC commands
olav 0:4c1fcbfcc7bf 399 mcpsReq.Type = MCPS_UNCONFIRMED;
olav 0:4c1fcbfcc7bf 400 mcpsReq.Req.Unconfirmed.fBuffer = NULL;
olav 0:4c1fcbfcc7bf 401 mcpsReq.Req.Unconfirmed.fBufferSize = 0;
olav 0:4c1fcbfcc7bf 402 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
olav 0:4c1fcbfcc7bf 403 }
olav 0:4c1fcbfcc7bf 404 else
olav 0:4c1fcbfcc7bf 405 {
olav 0:4c1fcbfcc7bf 406 if( IsTxConfirmed == false )
olav 0:4c1fcbfcc7bf 407 {
olav 0:4c1fcbfcc7bf 408 mcpsReq.Type = MCPS_UNCONFIRMED;
olav 0:4c1fcbfcc7bf 409 mcpsReq.Req.Unconfirmed.fPort = AppPort;
olav 0:4c1fcbfcc7bf 410 mcpsReq.Req.Unconfirmed.fBuffer = AppData;
olav 0:4c1fcbfcc7bf 411 mcpsReq.Req.Unconfirmed.fBufferSize = AppDataSize;
olav 0:4c1fcbfcc7bf 412 mcpsReq.Req.Unconfirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
olav 0:4c1fcbfcc7bf 413 }
olav 0:4c1fcbfcc7bf 414 else
olav 0:4c1fcbfcc7bf 415 {
olav 0:4c1fcbfcc7bf 416 mcpsReq.Type = MCPS_CONFIRMED;
olav 0:4c1fcbfcc7bf 417 mcpsReq.Req.Confirmed.fPort = AppPort;
olav 0:4c1fcbfcc7bf 418 mcpsReq.Req.Confirmed.fBuffer = AppData;
olav 0:4c1fcbfcc7bf 419 mcpsReq.Req.Confirmed.fBufferSize = AppDataSize;
olav 0:4c1fcbfcc7bf 420 mcpsReq.Req.Confirmed.NbTrials = 8;
olav 0:4c1fcbfcc7bf 421 mcpsReq.Req.Confirmed.Datarate = LORAWAN_DEFAULT_DATARATE;
olav 0:4c1fcbfcc7bf 422 }
olav 0:4c1fcbfcc7bf 423 }
olav 0:4c1fcbfcc7bf 424 if( LoRaMacMcpsRequest( &mcpsReq ) == LORAMAC_STATUS_OK )
olav 0:4c1fcbfcc7bf 425 {
olav 0:4c1fcbfcc7bf 426 return false;
olav 0:4c1fcbfcc7bf 427 }
olav 0:4c1fcbfcc7bf 428
olav 0:4c1fcbfcc7bf 429 return true;
olav 0:4c1fcbfcc7bf 430 }
olav 0:4c1fcbfcc7bf 431
olav 0:4c1fcbfcc7bf 432 /*!
olav 0:4c1fcbfcc7bf 433 * \brief Function executed on TxNextPacket Timeout event
olav 0:4c1fcbfcc7bf 434 */
olav 0:4c1fcbfcc7bf 435 static void OnTxNextPacketTimerEvent( void )
olav 0:4c1fcbfcc7bf 436 {
olav 0:4c1fcbfcc7bf 437 LoRaMacStatus_t status;
olav 0:4c1fcbfcc7bf 438 status = LoRaMacMibGetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 439
olav 0:4c1fcbfcc7bf 440 TimerStop( &TxNextPacketTimer );
olav 0:4c1fcbfcc7bf 441
olav 0:4c1fcbfcc7bf 442 if( status == LORAMAC_STATUS_OK )
olav 0:4c1fcbfcc7bf 443 {
olav 0:4c1fcbfcc7bf 444 if( mibReq.Param.IsNetworkJoined == true )
olav 0:4c1fcbfcc7bf 445 {
olav 0:4c1fcbfcc7bf 446 //DeviceState = DEVICE_STATE_SEND;
olav 0:4c1fcbfcc7bf 447 DeviceState = DEVICE_STATE_SLEEP;
olav 0:4c1fcbfcc7bf 448 NextTx = true;
olav 0:4c1fcbfcc7bf 449 }
olav 0:4c1fcbfcc7bf 450 else
olav 0:4c1fcbfcc7bf 451 {
olav 0:4c1fcbfcc7bf 452 DeviceState = DEVICE_STATE_JOIN;
olav 0:4c1fcbfcc7bf 453 }
olav 0:4c1fcbfcc7bf 454 }
olav 0:4c1fcbfcc7bf 455 }
olav 0:4c1fcbfcc7bf 456
haaspors 2:ce7cea075e95 457 /*
haaspors 2:ce7cea075e95 458 * Restart advertising when phone app disconnects
haaspors 2:ce7cea075e95 459 */
haaspors 2:ce7cea075e95 460 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
haaspors 2:ce7cea075e95 461 {
haaspors 2:ce7cea075e95 462 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
haaspors 2:ce7cea075e95 463 }
haaspors 2:ce7cea075e95 464
haaspors 2:ce7cea075e95 465 /*
haaspors 2:ce7cea075e95 466 * Handle writes to writeCharacteristic
haaspors 2:ce7cea075e95 467 */
haaspors 2:ce7cea075e95 468 void writeCharCallback(const GattWriteCallbackParams *params)
haaspors 2:ce7cea075e95 469 {
haaspors 2:ce7cea075e95 470 /* Restart the lora stack */
haaspors 2:ce7cea075e95 471 #if( OVER_THE_AIR_ACTIVATION != 0 )
haaspors 2:ce7cea075e95 472 if (params->handle == AppKeyChar.getValueHandle()) {
haaspors 2:ce7cea075e95 473 printf("Value written, device state set to JOIN\r\n");
haaspors 2:ce7cea075e95 474 memcpy(AppKey, params->data, params->len);
haaspors 2:ce7cea075e95 475 DeviceState = DEVICE_STATE_JOIN;
haaspors 2:ce7cea075e95 476 } else if (params->handle == AppEuiChar.getValueHandle()) {
haaspors 2:ce7cea075e95 477 memcpy(AppEui, params->data, params->len);
haaspors 2:ce7cea075e95 478 } else if (params->handle == DevEuiChar.getValueHandle()) {
haaspors 2:ce7cea075e95 479 memcpy(DevEui, params->data, params->len);
haaspors 2:ce7cea075e95 480 }
haaspors 2:ce7cea075e95 481 #else
haaspors 2:ce7cea075e95 482 printf("Value written, device state set to JOIN\r\n");
haaspors 2:ce7cea075e95 483 DeviceState = DEVICE_STATE_JOIN;
haaspors 2:ce7cea075e95 484 #endif
haaspors 2:ce7cea075e95 485 BLE::Instance(BLE::DEFAULT_INSTANCE).updateCharacteristicValue(params->handle, params->data, params->len);
haaspors 2:ce7cea075e95 486 }
haaspors 2:ce7cea075e95 487
haaspors 2:ce7cea075e95 488 /*
haaspors 2:ce7cea075e95 489 * Initialization callback
haaspors 2:ce7cea075e95 490 */
haaspors 2:ce7cea075e95 491 void bleInitComplete(BLE::InitializationCompleteCallbackContext * params)
haaspors 2:ce7cea075e95 492 {
haaspors 3:70d40f678f37 493 const uint16_t uuid16_list[] = { loraConfServiceUUID, echoServiceUUID, DFUServiceShortUUID };
haaspors 2:ce7cea075e95 494 BLE &ble = params->ble;
haaspors 2:ce7cea075e95 495 ble_error_t error = params->error;
haaspors 2:ce7cea075e95 496
haaspors 2:ce7cea075e95 497 if (error != BLE_ERROR_NONE) {
haaspors 2:ce7cea075e95 498 return;
haaspors 2:ce7cea075e95 499 }
haaspors 2:ce7cea075e95 500
haaspors 2:ce7cea075e95 501 ble.gap().onDisconnection(disconnectionCallback);
haaspors 2:ce7cea075e95 502 ble.gattServer().onDataWritten(writeCharCallback);
haaspors 2:ce7cea075e95 503
haaspors 2:ce7cea075e95 504 /* Setup advertising, BLE only */
haaspors 2:ce7cea075e95 505 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
haaspors 2:ce7cea075e95 506 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
haaspors 2:ce7cea075e95 507 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
haaspors 2:ce7cea075e95 508 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
haaspors 2:ce7cea075e95 509 ble.gap().setAdvertisingInterval(100);
haaspors 2:ce7cea075e95 510
haaspors 3:70d40f678f37 511 ble.addService(loraConfService);
haaspors 3:70d40f678f37 512 ble.addService(echoService);
haaspors 2:ce7cea075e95 513 static DFUService dfu(ble);
haaspors 2:ce7cea075e95 514
haaspors 2:ce7cea075e95 515 /* Start advertising */
haaspors 2:ce7cea075e95 516 ble.gap().startAdvertising();
haaspors 2:ce7cea075e95 517 }
haaspors 2:ce7cea075e95 518
haaspors 3:70d40f678f37 519
olav 0:4c1fcbfcc7bf 520 void buttonPressedCallback(void)
olav 0:4c1fcbfcc7bf 521 {
olav 0:4c1fcbfcc7bf 522 printf("Button pressed \r\n");
olav 0:4c1fcbfcc7bf 523 PrepareTxFrame( AppPort );
olav 0:4c1fcbfcc7bf 524 NextTx = SendFrame( );
olav 0:4c1fcbfcc7bf 525 printf("res: %d \r\n",NextTx);
olav 0:4c1fcbfcc7bf 526 }
olav 0:4c1fcbfcc7bf 527
haaspors 3:70d40f678f37 528 void echoReceivedCallback(uint32_t dist)
haaspors 3:70d40f678f37 529 {
haaspors 3:70d40f678f37 530 printf("Object is %u mm away!\r\n", dist);
haaspors 3:70d40f678f37 531 echoDist = dist;
haaspors 3:70d40f678f37 532 BLE::Instance(BLE::DEFAULT_INSTANCE).updateCharacteristicValue(echoDistChar.getValueHandle(),
haaspors 3:70d40f678f37 533 (const uint8_t *)&echoDist, sizeof (echoDist));
haaspors 3:70d40f678f37 534 }
haaspors 3:70d40f678f37 535
haaspors 3:70d40f678f37 536
olav 0:4c1fcbfcc7bf 537 int main( void )
olav 0:4c1fcbfcc7bf 538 {
olav 0:4c1fcbfcc7bf 539 printf("Hello world! \r\n");
haaspors 2:ce7cea075e95 540
olav 0:4c1fcbfcc7bf 541 LoRaMacPrimitives_t LoRaMacPrimitives;
olav 0:4c1fcbfcc7bf 542 LoRaMacCallback_t LoRaMacCallbacks;
haaspors 2:ce7cea075e95 543 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
haaspors 3:70d40f678f37 544
olav 0:4c1fcbfcc7bf 545 BoardInit( );
haaspors 2:ce7cea075e95 546
haaspors 2:ce7cea075e95 547 ble.init(bleInitComplete);
haaspors 2:ce7cea075e95 548
haaspors 2:ce7cea075e95 549 button.fall(buttonPressedCallback);
haaspors 3:70d40f678f37 550 usonic.start(echoReceivedCallback, 10.0);
haaspors 3:70d40f678f37 551
haaspors 2:ce7cea075e95 552 /* SpinWait for initialization to complete. This is necessary because the
haaspors 2:ce7cea075e95 553 * BLE object is used in the main loop below. */
haaspors 2:ce7cea075e95 554 while (ble.hasInitialized() == false) { /* spin loop */ }
haaspors 2:ce7cea075e95 555
olav 0:4c1fcbfcc7bf 556 DeviceState = DEVICE_STATE_INIT;
olav 0:4c1fcbfcc7bf 557 while( 1 )
olav 0:4c1fcbfcc7bf 558 {
olav 0:4c1fcbfcc7bf 559 if (DeviceState != DEVICE_STATE_SLEEP)
olav 0:4c1fcbfcc7bf 560 printf("State: %d \r\n", DeviceState);
olav 0:4c1fcbfcc7bf 561
olav 0:4c1fcbfcc7bf 562 if( IsNetworkJoinedStatusUpdate == true )
olav 0:4c1fcbfcc7bf 563 {
olav 0:4c1fcbfcc7bf 564 printf("Joined okay \r\n");
olav 0:4c1fcbfcc7bf 565 IsNetworkJoinedStatusUpdate = false;
olav 0:4c1fcbfcc7bf 566 mibReq.Type = MIB_NETWORK_JOINED;
olav 0:4c1fcbfcc7bf 567 LoRaMacMibGetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 568 }
olav 0:4c1fcbfcc7bf 569 switch( DeviceState )
olav 0:4c1fcbfcc7bf 570 {
olav 0:4c1fcbfcc7bf 571 case DEVICE_STATE_INIT:
olav 0:4c1fcbfcc7bf 572 {
olav 0:4c1fcbfcc7bf 573 LoRaMacPrimitives.MacMcpsConfirm = McpsConfirm;
olav 0:4c1fcbfcc7bf 574 LoRaMacPrimitives.MacMcpsIndication = McpsIndication;
olav 0:4c1fcbfcc7bf 575 LoRaMacPrimitives.MacMlmeConfirm = MlmeConfirm;
olav 0:4c1fcbfcc7bf 576 LoRaMacCallbacks.GetBatteryLevel = BoardGetBatteryLevel;
olav 0:4c1fcbfcc7bf 577 LoRaMacInitialization( &LoRaMacPrimitives, &LoRaMacCallbacks );
olav 0:4c1fcbfcc7bf 578
olav 0:4c1fcbfcc7bf 579 TimerInit( &TxNextPacketTimer, OnTxNextPacketTimerEvent );
olav 0:4c1fcbfcc7bf 580 mibReq.Type = MIB_ADR;
olav 0:4c1fcbfcc7bf 581 mibReq.Param.AdrEnable = LORAWAN_ADR_ON;
olav 0:4c1fcbfcc7bf 582 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 583
olav 0:4c1fcbfcc7bf 584 mibReq.Type = MIB_PUBLIC_NETWORK;
olav 0:4c1fcbfcc7bf 585 mibReq.Param.EnablePublicNetwork = LORAWAN_PUBLIC_NETWORK;
olav 0:4c1fcbfcc7bf 586 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 587
olav 0:4c1fcbfcc7bf 588 LoRaMacTestSetDutyCycleOn( false );
olav 0:4c1fcbfcc7bf 589
olav 0:4c1fcbfcc7bf 590 DeviceState = DEVICE_STATE_JOIN;
olav 0:4c1fcbfcc7bf 591 break;
olav 0:4c1fcbfcc7bf 592 }
olav 0:4c1fcbfcc7bf 593 case DEVICE_STATE_JOIN:
olav 0:4c1fcbfcc7bf 594 {
olav 0:4c1fcbfcc7bf 595 #if( OVER_THE_AIR_ACTIVATION != 0 )
olav 0:4c1fcbfcc7bf 596 MlmeReq_t mlmeReq;
olav 0:4c1fcbfcc7bf 597
olav 0:4c1fcbfcc7bf 598 mlmeReq.Type = MLME_JOIN;
olav 0:4c1fcbfcc7bf 599
olav 0:4c1fcbfcc7bf 600 mlmeReq.Req.Join.DevEui = DevEui;
olav 0:4c1fcbfcc7bf 601 mlmeReq.Req.Join.AppEui = AppEui;
olav 0:4c1fcbfcc7bf 602 mlmeReq.Req.Join.AppKey = AppKey;
olav 0:4c1fcbfcc7bf 603
olav 0:4c1fcbfcc7bf 604 if( NextTx == true )
olav 0:4c1fcbfcc7bf 605 {
olav 0:4c1fcbfcc7bf 606 LoRaMacMlmeRequest( &mlmeReq );
olav 0:4c1fcbfcc7bf 607 }
olav 0:4c1fcbfcc7bf 608
olav 0:4c1fcbfcc7bf 609 // Schedule next packet transmission
olav 0:4c1fcbfcc7bf 610 TxDutyCycleTime = OVER_THE_AIR_ACTIVATION_DUTYCYCLE;
olav 0:4c1fcbfcc7bf 611 DeviceState = DEVICE_STATE_CYCLE;
olav 0:4c1fcbfcc7bf 612
olav 0:4c1fcbfcc7bf 613 #else
olav 0:4c1fcbfcc7bf 614 mibReq.Type = MIB_NET_ID;
olav 0:4c1fcbfcc7bf 615 mibReq.Param.NetID = LORAWAN_NETWORK_ID;
olav 0:4c1fcbfcc7bf 616 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 617
olav 0:4c1fcbfcc7bf 618 mibReq.Type = MIB_DEV_ADDR;
olav 0:4c1fcbfcc7bf 619 mibReq.Param.DevAddr = DevAddr;
olav 0:4c1fcbfcc7bf 620 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 621
olav 0:4c1fcbfcc7bf 622 mibReq.Type = MIB_NWK_SKEY;
olav 0:4c1fcbfcc7bf 623 mibReq.Param.NwkSKey = NwkSKey;
olav 0:4c1fcbfcc7bf 624 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 625
olav 0:4c1fcbfcc7bf 626 mibReq.Type = MIB_APP_SKEY;
olav 0:4c1fcbfcc7bf 627 mibReq.Param.AppSKey = AppSKey;
olav 0:4c1fcbfcc7bf 628 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 629
olav 0:4c1fcbfcc7bf 630 mibReq.Type = MIB_NETWORK_JOINED;
olav 0:4c1fcbfcc7bf 631 mibReq.Param.IsNetworkJoined = true;
olav 0:4c1fcbfcc7bf 632 LoRaMacMibSetRequestConfirm( &mibReq );
olav 0:4c1fcbfcc7bf 633
olav 0:4c1fcbfcc7bf 634 DeviceState = DEVICE_STATE_SEND;
olav 0:4c1fcbfcc7bf 635 #endif
olav 0:4c1fcbfcc7bf 636 IsNetworkJoinedStatusUpdate = true;
olav 0:4c1fcbfcc7bf 637 break;
olav 0:4c1fcbfcc7bf 638 }
olav 0:4c1fcbfcc7bf 639 case DEVICE_STATE_SEND:
olav 0:4c1fcbfcc7bf 640 {
olav 0:4c1fcbfcc7bf 641 if( NextTx == true )
olav 0:4c1fcbfcc7bf 642 {
olav 0:4c1fcbfcc7bf 643 printf("Send a frame! \r\n");
olav 0:4c1fcbfcc7bf 644 PrepareTxFrame( AppPort );
olav 0:4c1fcbfcc7bf 645
olav 0:4c1fcbfcc7bf 646 NextTx = SendFrame( );
olav 0:4c1fcbfcc7bf 647
olav 0:4c1fcbfcc7bf 648 }
olav 0:4c1fcbfcc7bf 649
olav 0:4c1fcbfcc7bf 650 // Schedule next packet transmission
olav 0:4c1fcbfcc7bf 651 TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
olav 0:4c1fcbfcc7bf 652
olav 0:4c1fcbfcc7bf 653 DeviceState = DEVICE_STATE_CYCLE;
olav 0:4c1fcbfcc7bf 654 break;
olav 0:4c1fcbfcc7bf 655 }
olav 0:4c1fcbfcc7bf 656 case DEVICE_STATE_CYCLE:
olav 0:4c1fcbfcc7bf 657 {
olav 0:4c1fcbfcc7bf 658 // Schedule next packet transmission
olav 0:4c1fcbfcc7bf 659 printf("Do some cycling .. \r\n");
olav 0:4c1fcbfcc7bf 660 TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
olav 0:4c1fcbfcc7bf 661 TimerStart( &TxNextPacketTimer );
olav 0:4c1fcbfcc7bf 662
olav 0:4c1fcbfcc7bf 663 DeviceState = DEVICE_STATE_SLEEP;
olav 0:4c1fcbfcc7bf 664 break;
olav 0:4c1fcbfcc7bf 665 }
olav 0:4c1fcbfcc7bf 666 case DEVICE_STATE_SLEEP:
olav 0:4c1fcbfcc7bf 667 {
olav 0:4c1fcbfcc7bf 668 // Wake up through events
haaspors 2:ce7cea075e95 669 ble.waitForEvent();
olav 0:4c1fcbfcc7bf 670 break;
olav 0:4c1fcbfcc7bf 671 }
olav 0:4c1fcbfcc7bf 672 default:
olav 0:4c1fcbfcc7bf 673 {
olav 0:4c1fcbfcc7bf 674 DeviceState = DEVICE_STATE_INIT;
olav 0:4c1fcbfcc7bf 675 break;
olav 0:4c1fcbfcc7bf 676 }
olav 0:4c1fcbfcc7bf 677 }
olav 0:4c1fcbfcc7bf 678 }
haaspors 3:70d40f678f37 679 }