PIR + LoRa

Dependencies:   BLE_API LMiC SX1276Lib mbed nRF51822 nrf51_rtc

Fork of BLE_PhysicalWeb by Bluetooth Low Energy

Committer:
janjongboom
Date:
Thu Sep 24 08:32:32 2015 +0000
Revision:
12:940eb88a2104
Parent:
11:bbe4157401e2
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:790a27ffc99b 1 /* mbed Microcontroller Library
rgrover1 0:790a27ffc99b 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:790a27ffc99b 3 *
rgrover1 0:790a27ffc99b 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:790a27ffc99b 5 * you may not use this file except in compliance with the License.
rgrover1 0:790a27ffc99b 6 * You may obtain a copy of the License at
rgrover1 0:790a27ffc99b 7 *
rgrover1 0:790a27ffc99b 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:790a27ffc99b 9 *
rgrover1 0:790a27ffc99b 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:790a27ffc99b 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:790a27ffc99b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:790a27ffc99b 13 * See the License for the specific language governing permissions and
rgrover1 0:790a27ffc99b 14 * limitations under the License.
rgrover1 0:790a27ffc99b 15 */
rgrover1 0:790a27ffc99b 16
rgrover1 0:790a27ffc99b 17 #include "mbed.h"
rgrover1 0:790a27ffc99b 18 #include "BLEDevice.h"
rgrover1 7:6faec5978fb4 19 #include "URIBeaconConfigService.h"
rgrover1 6:31b65d4ea67d 20 #include "DFUService.h"
rgrover1 6:31b65d4ea67d 21 #include "DeviceInformationService.h"
janjongboom 10:e7ab33223964 22 #include "nrf51_rtc/nrf51_rtc.h"
janjongboom 10:e7ab33223964 23
janjongboom 11:bbe4157401e2 24 #include "lmic.h"
janjongboom 11:bbe4157401e2 25 #include "oslmic.h"
janjongboom 11:bbe4157401e2 26 #include "debug.h"
janjongboom 11:bbe4157401e2 27
janjongboom 11:bbe4157401e2 28 /*!
janjongboom 11:bbe4157401e2 29 * When set to 1 the application uses the Over-the-Air activation procedure
janjongboom 11:bbe4157401e2 30 * When set to 0 the application uses the Personalization activation procedure
janjongboom 11:bbe4157401e2 31 */
janjongboom 12:940eb88a2104 32 #define OVER_THE_AIR_ACTIVATION 1
janjongboom 11:bbe4157401e2 33
janjongboom 11:bbe4157401e2 34 #if( OVER_THE_AIR_ACTIVATION == 0 )
janjongboom 11:bbe4157401e2 35
janjongboom 11:bbe4157401e2 36 /*!
janjongboom 11:bbe4157401e2 37 * Defines the network ID when using personalization activation procedure
janjongboom 11:bbe4157401e2 38 */
janjongboom 11:bbe4157401e2 39 #define LORAWAN_NET_ID ( uint32_t )0x00000000
janjongboom 11:bbe4157401e2 40
janjongboom 11:bbe4157401e2 41 /*!
janjongboom 11:bbe4157401e2 42 * Defines the device address when using personalization activation procedure
janjongboom 11:bbe4157401e2 43 */
janjongboom 12:940eb88a2104 44 #define LORAWAN_DEV_ADDR ( uint32_t )0x73318891
janjongboom 11:bbe4157401e2 45
janjongboom 11:bbe4157401e2 46 #endif
janjongboom 11:bbe4157401e2 47
janjongboom 11:bbe4157401e2 48 /*!
janjongboom 11:bbe4157401e2 49 * Defines the application data transmission duty cycle
janjongboom 11:bbe4157401e2 50 */
janjongboom 11:bbe4157401e2 51 #define APP_TX_DUTYCYCLE 5000 // 5 [s] value in ms
janjongboom 11:bbe4157401e2 52 #define APP_TX_DUTYCYCLE_RND 1000 // 1 [s] value in ms
janjongboom 11:bbe4157401e2 53
janjongboom 11:bbe4157401e2 54 /*!
janjongboom 11:bbe4157401e2 55 * LoRaWAN Adaptative Data Rate
janjongboom 11:bbe4157401e2 56 */
janjongboom 11:bbe4157401e2 57 #define LORAWAN_ADR_ON 1
janjongboom 11:bbe4157401e2 58
janjongboom 11:bbe4157401e2 59 /*!
janjongboom 11:bbe4157401e2 60 * LoRaWAN confirmed messages
janjongboom 11:bbe4157401e2 61 */
janjongboom 11:bbe4157401e2 62 #define LORAWAN_CONFIRMED_MSG_ON 0
janjongboom 11:bbe4157401e2 63
janjongboom 11:bbe4157401e2 64 /*!
janjongboom 11:bbe4157401e2 65 * LoRaWAN application port
janjongboom 11:bbe4157401e2 66 */
janjongboom 11:bbe4157401e2 67 #define LORAWAN_APP_PORT 2
janjongboom 11:bbe4157401e2 68
janjongboom 11:bbe4157401e2 69 /*!
janjongboom 11:bbe4157401e2 70 * User application data buffer size
janjongboom 11:bbe4157401e2 71 */
janjongboom 11:bbe4157401e2 72 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
janjongboom 11:bbe4157401e2 73 #define LORAWAN_APP_DATA_SIZE 9
janjongboom 11:bbe4157401e2 74
janjongboom 11:bbe4157401e2 75 #else
janjongboom 11:bbe4157401e2 76 #define LORAWAN_APP_DATA_SIZE 4
janjongboom 11:bbe4157401e2 77
janjongboom 11:bbe4157401e2 78 #endif
janjongboom 11:bbe4157401e2 79
janjongboom 11:bbe4157401e2 80 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 81 // CONFIGURATION (FOR APPLICATION CALLBACKS BELOW)
janjongboom 11:bbe4157401e2 82 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 83
janjongboom 11:bbe4157401e2 84 // application router ID (LSBF)
janjongboom 11:bbe4157401e2 85 static const uint8_t AppEui[8] =
janjongboom 12:940eb88a2104 86 { // 13-37-aa-bb-cc-dd-ee-ff
janjongboom 12:940eb88a2104 87 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x37, 0x13
janjongboom 12:940eb88a2104 88 // so its read rtl in the NS so when creating need to flip it in server
janjongboom 12:940eb88a2104 89 // compared to here. Really weird.
janjongboom 11:bbe4157401e2 90 };
janjongboom 11:bbe4157401e2 91
janjongboom 11:bbe4157401e2 92 // unique device ID (LSBF)
janjongboom 11:bbe4157401e2 93 static const u1_t DevEui[8] =
janjongboom 11:bbe4157401e2 94 {
janjongboom 11:bbe4157401e2 95 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
janjongboom 11:bbe4157401e2 96 };
janjongboom 11:bbe4157401e2 97
janjongboom 11:bbe4157401e2 98 // device-specific AES key (derived from device EUI)
janjongboom 12:940eb88a2104 99 static const uint8_t DevKey[16] =
janjongboom 11:bbe4157401e2 100 {
janjongboom 12:940eb88a2104 101 0xC1, 0x20, 0x2B, 0xB0, 0xAE, 0x97, 0x20, 0xC8,
janjongboom 12:940eb88a2104 102 0x18, 0xA3, 0x0F, 0xFA, 0x05, 0x14, 0xC5, 0x4F
janjongboom 11:bbe4157401e2 103 };
janjongboom 11:bbe4157401e2 104
janjongboom 11:bbe4157401e2 105 #if( OVER_THE_AIR_ACTIVATION == 0 )
janjongboom 11:bbe4157401e2 106 // network session key
janjongboom 12:940eb88a2104 107 static uint8_t NwkSKey[] =
janjongboom 12:940eb88a2104 108 {
janjongboom 12:940eb88a2104 109 0x50, 0x12, 0x78, 0x26, 0x23, 0x9A, 0x5E, 0x39,
janjongboom 12:940eb88a2104 110 0x86, 0x8A, 0xCA, 0x7B, 0xDE, 0x16, 0xE1, 0x32
janjongboom 11:bbe4157401e2 111 };
janjongboom 12:940eb88a2104 112 static uint8_t ArtSKey[] =
janjongboom 12:940eb88a2104 113 {
janjongboom 12:940eb88a2104 114 0x54, 0xEB, 0x54, 0x4B, 0x07, 0x0C, 0x10, 0x69,
janjongboom 12:940eb88a2104 115 0xB1, 0x44, 0x94, 0x44, 0xF1, 0xCC, 0x13, 0xDA
janjongboom 11:bbe4157401e2 116 };
janjongboom 11:bbe4157401e2 117
janjongboom 11:bbe4157401e2 118 #endif
janjongboom 11:bbe4157401e2 119
janjongboom 10:e7ab33223964 120 Serial pc(USBTX, USBRX); // tx, rx
rgrover1 0:790a27ffc99b 121
janjongboom 11:bbe4157401e2 122 // LEDs and Frame jobs
janjongboom 11:bbe4157401e2 123 osjob_t rxLedJob;
janjongboom 11:bbe4157401e2 124 osjob_t txLedJob;
janjongboom 11:bbe4157401e2 125 osjob_t sendFrameJob;
janjongboom 11:bbe4157401e2 126
janjongboom 11:bbe4157401e2 127 // LED state
janjongboom 11:bbe4157401e2 128 static bool AppLedStateOn = false;
janjongboom 11:bbe4157401e2 129
janjongboom 11:bbe4157401e2 130 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 131 // Utility functions
janjongboom 11:bbe4157401e2 132 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 133 /*!
janjongboom 11:bbe4157401e2 134 * \brief Computes a random number between min and max
janjongboom 11:bbe4157401e2 135 *
janjongboom 11:bbe4157401e2 136 * \param [IN] min range minimum value
janjongboom 11:bbe4157401e2 137 * \param [IN] max range maximum value
janjongboom 11:bbe4157401e2 138 * \retval random random value in range min..max
janjongboom 11:bbe4157401e2 139 */
janjongboom 11:bbe4157401e2 140 int32_t randr( int32_t min, int32_t max )
janjongboom 11:bbe4157401e2 141 {
janjongboom 11:bbe4157401e2 142 return ( int32_t )rand( ) % ( max - min + 1 ) + min;
janjongboom 11:bbe4157401e2 143 }
janjongboom 11:bbe4157401e2 144
janjongboom 11:bbe4157401e2 145 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 146 // APPLICATION CALLBACKS
janjongboom 11:bbe4157401e2 147 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 148
janjongboom 11:bbe4157401e2 149 // provide application router ID (8 bytes, LSBF)
janjongboom 11:bbe4157401e2 150 void os_getArtEui( uint8_t *buf )
janjongboom 11:bbe4157401e2 151 {
janjongboom 11:bbe4157401e2 152 memcpy( buf, AppEui, 8 );
janjongboom 11:bbe4157401e2 153 }
janjongboom 11:bbe4157401e2 154
janjongboom 11:bbe4157401e2 155 // provide device ID (8 bytes, LSBF)
janjongboom 11:bbe4157401e2 156 void os_getDevEui( uint8_t *buf )
janjongboom 11:bbe4157401e2 157 {
janjongboom 11:bbe4157401e2 158 memcpy( buf, DevEui, 8 );
janjongboom 11:bbe4157401e2 159 }
janjongboom 11:bbe4157401e2 160
janjongboom 11:bbe4157401e2 161 // provide device key (16 bytes)
janjongboom 11:bbe4157401e2 162 void os_getDevKey( uint8_t *buf )
janjongboom 11:bbe4157401e2 163 {
janjongboom 11:bbe4157401e2 164 memcpy( buf, DevKey, 16 );
janjongboom 11:bbe4157401e2 165 }
janjongboom 11:bbe4157401e2 166
janjongboom 11:bbe4157401e2 167 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 168 // MAIN - INITIALIZATION AND STARTUP
janjongboom 11:bbe4157401e2 169 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 170
janjongboom 11:bbe4157401e2 171 static void onRxLed( osjob_t* j )
janjongboom 11:bbe4157401e2 172 {
janjongboom 11:bbe4157401e2 173 debug_val("LED2 = ", 0 );
janjongboom 11:bbe4157401e2 174 }
janjongboom 11:bbe4157401e2 175
janjongboom 11:bbe4157401e2 176 static void onTxLed( osjob_t* j )
janjongboom 11:bbe4157401e2 177 {
janjongboom 11:bbe4157401e2 178 debug_val("LED1 = ", 0 );
janjongboom 11:bbe4157401e2 179 }
janjongboom 11:bbe4157401e2 180
janjongboom 11:bbe4157401e2 181 bool rise_state = false;
janjongboom 11:bbe4157401e2 182 uint16_t last_rise = 0;
janjongboom 11:bbe4157401e2 183
janjongboom 11:bbe4157401e2 184 static void prepareTxFrame( void )
janjongboom 11:bbe4157401e2 185 {
janjongboom 11:bbe4157401e2 186 uint16_t seconds_ago = rtc.time() - last_rise;
janjongboom 11:bbe4157401e2 187
janjongboom 11:bbe4157401e2 188 LMIC.frame[0] = 0x02; // PIR sensor
janjongboom 11:bbe4157401e2 189 LMIC.frame[1] = rise_state ? 1 : 0;
janjongboom 11:bbe4157401e2 190 LMIC.frame[2] = ( seconds_ago >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 191 LMIC.frame[3] = seconds_ago & 0xFF;
janjongboom 11:bbe4157401e2 192
janjongboom 11:bbe4157401e2 193 printf("prepareTxFrame %02x %02x %02x %02x\r\n",
janjongboom 11:bbe4157401e2 194 LMIC.frame[0], LMIC.frame[1], LMIC.frame[2], LMIC.frame[3]);
janjongboom 11:bbe4157401e2 195
janjongboom 11:bbe4157401e2 196 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
janjongboom 11:bbe4157401e2 197 LMIC.frame[4] = LMIC.seqnoDn >> 8;
janjongboom 11:bbe4157401e2 198 LMIC.frame[5] = LMIC.seqnoDn;
janjongboom 11:bbe4157401e2 199 LMIC.frame[6] = LMIC.rssi >> 8;
janjongboom 11:bbe4157401e2 200 LMIC.frame[7] = LMIC.rssi;
janjongboom 11:bbe4157401e2 201 LMIC.frame[8] = LMIC.snr;
janjongboom 11:bbe4157401e2 202 #endif
janjongboom 11:bbe4157401e2 203 }
janjongboom 11:bbe4157401e2 204
janjongboom 11:bbe4157401e2 205 static void prepareTxFrameLoRaMote( void )
janjongboom 11:bbe4157401e2 206 {
janjongboom 11:bbe4157401e2 207 pc.printf("prepareTxFrameLoRaMote\r\n");
janjongboom 11:bbe4157401e2 208
janjongboom 11:bbe4157401e2 209 uint16_t pressure = 0;
janjongboom 11:bbe4157401e2 210 int16_t altitudeBar = 0;
janjongboom 11:bbe4157401e2 211 int16_t temperature = 0;
janjongboom 11:bbe4157401e2 212 int32_t latitude, longitude = 0;
janjongboom 11:bbe4157401e2 213 uint16_t altitudeGps = 0xFFFF;
janjongboom 11:bbe4157401e2 214 uint8_t batteryLevel = 0;
janjongboom 11:bbe4157401e2 215
janjongboom 11:bbe4157401e2 216 pressure = 10132; // in hPa / 10
janjongboom 11:bbe4157401e2 217 temperature = 2300; // in °C * 100
janjongboom 11:bbe4157401e2 218 altitudeBar = 70; // in m * 10
janjongboom 11:bbe4157401e2 219 batteryLevel = 160; // 1 (very low) to 254 (fully charged)
janjongboom 11:bbe4157401e2 220 altitudeGps = 73; // in m
janjongboom 11:bbe4157401e2 221
janjongboom 11:bbe4157401e2 222 LMIC.frame[0] = AppLedStateOn;
janjongboom 11:bbe4157401e2 223 LMIC.frame[1] = ( pressure >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 224 LMIC.frame[2] = pressure & 0xFF;
janjongboom 11:bbe4157401e2 225 LMIC.frame[3] = ( temperature >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 226 LMIC.frame[4] = temperature & 0xFF;
janjongboom 11:bbe4157401e2 227 LMIC.frame[5] = ( altitudeBar >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 228 LMIC.frame[6] = altitudeBar & 0xFF;
janjongboom 11:bbe4157401e2 229 LMIC.frame[7] = batteryLevel;
janjongboom 11:bbe4157401e2 230 LMIC.frame[8] = ( latitude >> 16 ) & 0xFF;
janjongboom 11:bbe4157401e2 231 LMIC.frame[9] = ( latitude >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 232 LMIC.frame[10] = latitude & 0xFF;
janjongboom 11:bbe4157401e2 233 LMIC.frame[11] = ( longitude >> 16 ) & 0xFF;
janjongboom 11:bbe4157401e2 234 LMIC.frame[12] = ( longitude >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 235 LMIC.frame[13] = longitude & 0xFF;
janjongboom 11:bbe4157401e2 236 LMIC.frame[14] = ( altitudeGps >> 8 ) & 0xFF;
janjongboom 11:bbe4157401e2 237 LMIC.frame[15] = altitudeGps & 0xFF;
janjongboom 11:bbe4157401e2 238 #if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
janjongboom 11:bbe4157401e2 239 LMIC.frame[16] = LMIC.seqnoDn >> 8;
janjongboom 11:bbe4157401e2 240 LMIC.frame[17] = LMIC.seqnoDn;
janjongboom 11:bbe4157401e2 241 LMIC.frame[18] = LMIC.rssi >> 8;
janjongboom 11:bbe4157401e2 242 LMIC.frame[19] = LMIC.rssi;
janjongboom 11:bbe4157401e2 243 LMIC.frame[20] = LMIC.snr;
janjongboom 11:bbe4157401e2 244 #endif
janjongboom 11:bbe4157401e2 245 }
janjongboom 11:bbe4157401e2 246
janjongboom 11:bbe4157401e2 247 DigitalOut led2(LED2);
janjongboom 11:bbe4157401e2 248
janjongboom 11:bbe4157401e2 249 void processRxFrame( void )
janjongboom 11:bbe4157401e2 250 {
janjongboom 11:bbe4157401e2 251 switch( LMIC.frame[LMIC.dataBeg - 1] ) // Check Rx port number
janjongboom 11:bbe4157401e2 252 {
janjongboom 11:bbe4157401e2 253 case 1: // The application LED can be controlled on port 1 or 2
janjongboom 11:bbe4157401e2 254 case 2:
janjongboom 11:bbe4157401e2 255 if( LMIC.dataLen == 1 )
janjongboom 11:bbe4157401e2 256 {
janjongboom 11:bbe4157401e2 257 AppLedStateOn = LMIC.frame[LMIC.dataBeg] & 0x01;
janjongboom 11:bbe4157401e2 258 led2 = AppLedStateOn;
janjongboom 11:bbe4157401e2 259 debug_val( "LED3 = ", AppLedStateOn );
janjongboom 11:bbe4157401e2 260 }
janjongboom 11:bbe4157401e2 261 break;
janjongboom 11:bbe4157401e2 262 default:
janjongboom 11:bbe4157401e2 263 break;
janjongboom 11:bbe4157401e2 264 }
janjongboom 11:bbe4157401e2 265 }
janjongboom 11:bbe4157401e2 266
janjongboom 11:bbe4157401e2 267 static void onSendFrame( osjob_t* j )
janjongboom 11:bbe4157401e2 268 {
janjongboom 11:bbe4157401e2 269 prepareTxFrame( );
janjongboom 11:bbe4157401e2 270 LMIC_setTxData2( LORAWAN_APP_PORT, LMIC.frame, LORAWAN_APP_DATA_SIZE, LORAWAN_CONFIRMED_MSG_ON );
janjongboom 11:bbe4157401e2 271
janjongboom 11:bbe4157401e2 272 // Blink Tx LED
janjongboom 11:bbe4157401e2 273 debug_val( "LED1 = ", 1 );
janjongboom 11:bbe4157401e2 274 os_setTimedCallback( &txLedJob, os_getTime( ) + ms2osticks( 25 ), onTxLed );
janjongboom 11:bbe4157401e2 275 }
janjongboom 11:bbe4157401e2 276
janjongboom 11:bbe4157401e2 277 // Initialization job
janjongboom 11:bbe4157401e2 278 static void onInit( osjob_t* j )
janjongboom 11:bbe4157401e2 279 {
janjongboom 11:bbe4157401e2 280 // reset MAC state
janjongboom 11:bbe4157401e2 281 LMIC_reset( );
janjongboom 11:bbe4157401e2 282 LMIC_setAdrMode( LORAWAN_ADR_ON );
janjongboom 11:bbe4157401e2 283 LMIC_setDrTxpow( DR_SF12, 14 );
janjongboom 11:bbe4157401e2 284
janjongboom 11:bbe4157401e2 285 // start joining
janjongboom 11:bbe4157401e2 286 #if( OVER_THE_AIR_ACTIVATION != 0 )
janjongboom 11:bbe4157401e2 287 pc.printf("startJoining\n");
janjongboom 11:bbe4157401e2 288 LMIC_startJoining( );
janjongboom 11:bbe4157401e2 289 #else
janjongboom 11:bbe4157401e2 290 pc.printf("gonne send a frame yo\n");
janjongboom 11:bbe4157401e2 291 LMIC_setSession( LORAWAN_NET_ID, LORAWAN_DEV_ADDR, NwkSKey, ArtSKey );
janjongboom 11:bbe4157401e2 292 onSendFrame( NULL );
janjongboom 11:bbe4157401e2 293 #endif
janjongboom 11:bbe4157401e2 294 // init done - onEvent( ) callback will be invoked...
janjongboom 11:bbe4157401e2 295 }
janjongboom 11:bbe4157401e2 296
janjongboom 11:bbe4157401e2 297 //int main( void )
janjongboom 11:bbe4157401e2 298 //{
janjongboom 11:bbe4157401e2 299 // osjob_t initjob;
janjongboom 11:bbe4157401e2 300 //
janjongboom 11:bbe4157401e2 301 // // initialize runtime env
janjongboom 11:bbe4157401e2 302 // os_init( );
janjongboom 11:bbe4157401e2 303 // // setup initial job
janjongboom 11:bbe4157401e2 304 // os_setCallback( &initjob, onInit );
janjongboom 11:bbe4157401e2 305 // // execute scheduled jobs and events
janjongboom 11:bbe4157401e2 306 // os_runloop( );
janjongboom 11:bbe4157401e2 307 // // (not reached)
janjongboom 11:bbe4157401e2 308 //}
janjongboom 11:bbe4157401e2 309
janjongboom 11:bbe4157401e2 310 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 311 // LMIC EVENT CALLBACK
janjongboom 11:bbe4157401e2 312 //////////////////////////////////////////////////
janjongboom 11:bbe4157401e2 313 void onEvent( ev_t ev )
janjongboom 11:bbe4157401e2 314 {
janjongboom 11:bbe4157401e2 315 pc.printf("onEvent\r\n");
janjongboom 11:bbe4157401e2 316 bool txOn = false;
janjongboom 11:bbe4157401e2 317 debug_event( ev );
janjongboom 11:bbe4157401e2 318
janjongboom 11:bbe4157401e2 319 switch( ev )
janjongboom 11:bbe4157401e2 320 {
janjongboom 11:bbe4157401e2 321 // network joined, session established
janjongboom 11:bbe4157401e2 322 case EV_JOINED:
janjongboom 12:940eb88a2104 323 pc.printf("Joined, ID=%d\n", LMIC.netid);
janjongboom 11:bbe4157401e2 324 debug_val( "Net ID = ", LMIC.netid );
janjongboom 11:bbe4157401e2 325 txOn = true;
janjongboom 11:bbe4157401e2 326 break;
janjongboom 11:bbe4157401e2 327 // scheduled data sent (optionally data received)
janjongboom 11:bbe4157401e2 328 case EV_TXCOMPLETE:
janjongboom 12:940eb88a2104 329 pc.printf("TXComplete, datarate=%d\n", LMIC.datarate);
janjongboom 11:bbe4157401e2 330 debug_val( "Datarate = ", LMIC.datarate );
janjongboom 11:bbe4157401e2 331 // Check if we have a downlink on either Rx1 or Rx2 windows
janjongboom 11:bbe4157401e2 332 if( ( LMIC.txrxFlags & ( TXRX_DNW1 | TXRX_DNW2 ) ) != 0 )
janjongboom 11:bbe4157401e2 333 {
janjongboom 11:bbe4157401e2 334 debug_val( "LED2 = ", 1 );
janjongboom 11:bbe4157401e2 335 os_setTimedCallback( &rxLedJob, os_getTime( ) + ms2osticks( 25 ), onRxLed );
janjongboom 11:bbe4157401e2 336
janjongboom 11:bbe4157401e2 337 if( LMIC.dataLen != 0 )
janjongboom 11:bbe4157401e2 338 { // data received in rx slot after tx
janjongboom 11:bbe4157401e2 339 debug_buf( LMIC.frame + LMIC.dataBeg, LMIC.dataLen );
janjongboom 11:bbe4157401e2 340 processRxFrame( );
janjongboom 11:bbe4157401e2 341 }
janjongboom 11:bbe4157401e2 342 }
janjongboom 11:bbe4157401e2 343 txOn = true;
janjongboom 11:bbe4157401e2 344 break;
janjongboom 11:bbe4157401e2 345 default:
janjongboom 11:bbe4157401e2 346 break;
janjongboom 11:bbe4157401e2 347 }
janjongboom 11:bbe4157401e2 348 if( txOn == true )
janjongboom 11:bbe4157401e2 349 {
janjongboom 11:bbe4157401e2 350 //Sends frame every APP_TX_DUTYCYCLE +/- APP_TX_DUTYCYCLE_RND random time (if not duty cycle limited)
janjongboom 11:bbe4157401e2 351 os_setTimedCallback( &sendFrameJob,
janjongboom 11:bbe4157401e2 352 os_getTime( ) + ms2osticks( APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND ) ),
janjongboom 11:bbe4157401e2 353 onSendFrame );
janjongboom 11:bbe4157401e2 354
janjongboom 11:bbe4157401e2 355 ////Sends frame as soon as possible (duty cylce limitations)
janjongboom 11:bbe4157401e2 356 //onSendFrame( NULL );
janjongboom 11:bbe4157401e2 357 }
janjongboom 11:bbe4157401e2 358 }
janjongboom 11:bbe4157401e2 359
janjongboom 11:bbe4157401e2 360
janjongboom 11:bbe4157401e2 361 InterruptIn motion(p7);
janjongboom 11:bbe4157401e2 362 DigitalOut led(LED4);
janjongboom 11:bbe4157401e2 363
rgrover1 0:790a27ffc99b 364 BLEDevice ble;
rgrover1 8:b816829fb712 365 URIBeaconConfigService *uriBeaconConfig;
rgrover1 0:790a27ffc99b 366
rgrover1 6:31b65d4ea67d 367 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
rgrover1 6:31b65d4ea67d 368 {
rgrover1 6:31b65d4ea67d 369 ble.startAdvertising();
rgrover1 6:31b65d4ea67d 370 }
rgrover1 0:790a27ffc99b 371
janjongboom 10:e7ab33223964 372 void riseHandler(void)
rgrover1 8:b816829fb712 373 {
janjongboom 10:e7ab33223964 374 led = 0;
janjongboom 10:e7ab33223964 375 pc.printf("rise\r\n");
janjongboom 10:e7ab33223964 376 last_rise = rtc.time();
janjongboom 10:e7ab33223964 377 rise_state = true;
janjongboom 10:e7ab33223964 378 }
rgrover1 8:b816829fb712 379
janjongboom 10:e7ab33223964 380 void fallHandler(void)
janjongboom 10:e7ab33223964 381 {
janjongboom 10:e7ab33223964 382 led = 1;
janjongboom 10:e7ab33223964 383 pc.printf("fall\r\n");
janjongboom 10:e7ab33223964 384 last_rise = rtc.time();
janjongboom 10:e7ab33223964 385 rise_state = false;
janjongboom 10:e7ab33223964 386 }
rgrover1 8:b816829fb712 387
janjongboom 10:e7ab33223964 388 void lastRiseCallback(void)
janjongboom 10:e7ab33223964 389 {
janjongboom 10:e7ab33223964 390 pc.printf("Current state %d, last_rise %d\r\n", rise_state, rtc.time() - last_rise);
rgrover1 8:b816829fb712 391 }
rgrover1 8:b816829fb712 392
janjongboom 12:940eb88a2104 393 void run_ble() {
rgrover1 0:790a27ffc99b 394 ble.init();
rgrover1 6:31b65d4ea67d 395 ble.onDisconnection(disconnectionCallback);
rgrover1 0:790a27ffc99b 396
janjongboom 12:940eb88a2104 397 uriBeaconConfig = new URIBeaconConfigService(ble, "http://goo.gl/H9YK6O");
rgrover1 8:b816829fb712 398 if (!uriBeaconConfig->configuredSuccessfully()) {
rgrover1 6:31b65d4ea67d 399 error("failed to accommodate URI");
rgrover1 6:31b65d4ea67d 400 }
rgrover1 7:6faec5978fb4 401 /* optional use of the API offered by URIBeaconConfigService */
rgrover1 7:6faec5978fb4 402 const int8_t powerLevels[] = {-20, -4, 0, 10};
rgrover1 8:b816829fb712 403 uriBeaconConfig->setTxPowerLevels(powerLevels);
janjongboom 12:940eb88a2104 404 uriBeaconConfig->setTxPowerMode(URIBeaconConfigService::TX_POWER_MODE_HIGH);
rgrover1 0:790a27ffc99b 405
janjongboom 10:e7ab33223964 406 static const uint8_t BEACON_UUID[] = {0xD8, 0xFE};
janjongboom 10:e7ab33223964 407 static const uint8_t urldata[] = {
janjongboom 10:e7ab33223964 408 BEACON_UUID[0],
janjongboom 10:e7ab33223964 409 BEACON_UUID[1],
janjongboom 10:e7ab33223964 410 0x00, // flags
janjongboom 10:e7ab33223964 411 0x20, // power
janjongboom 11:bbe4157401e2 412 0x00, // http://www.
janjongboom 10:e7ab33223964 413 'g',
janjongboom 10:e7ab33223964 414 'o',
janjongboom 10:e7ab33223964 415 'o',
janjongboom 10:e7ab33223964 416 '.',
janjongboom 10:e7ab33223964 417 'g',
janjongboom 10:e7ab33223964 418 'l',
janjongboom 10:e7ab33223964 419 '/',
janjongboom 12:940eb88a2104 420 'H',
janjongboom 12:940eb88a2104 421 '9',
janjongboom 12:940eb88a2104 422 'Y',
janjongboom 12:940eb88a2104 423 'K',
janjongboom 11:bbe4157401e2 424 '6',
janjongboom 12:940eb88a2104 425 'O',
janjongboom 10:e7ab33223964 426 };
rgrover1 6:31b65d4ea67d 427
janjongboom 10:e7ab33223964 428 ble.clearAdvertisingPayload();
janjongboom 10:e7ab33223964 429 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, BEACON_UUID, sizeof(BEACON_UUID));
janjongboom 10:e7ab33223964 430 ble.accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, urldata, sizeof(urldata));
janjongboom 10:e7ab33223964 431
janjongboom 10:e7ab33223964 432 ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
janjongboom 12:940eb88a2104 433 ble.setAdvertisingInterval(800); /* .5s; in multiples of 0.625ms. */
rgrover1 0:790a27ffc99b 434 ble.startAdvertising();
janjongboom 12:940eb88a2104 435 }
janjongboom 12:940eb88a2104 436
janjongboom 12:940eb88a2104 437 int main(void)
janjongboom 12:940eb88a2104 438 {
janjongboom 12:940eb88a2104 439 Ticker ticker;
janjongboom 12:940eb88a2104 440 ticker.attach(&lastRiseCallback, 10);
rgrover1 0:790a27ffc99b 441
janjongboom 12:940eb88a2104 442 motion.rise(&riseHandler);
janjongboom 12:940eb88a2104 443 motion.fall(&fallHandler);
janjongboom 12:940eb88a2104 444
janjongboom 12:940eb88a2104 445 run_ble();
janjongboom 12:940eb88a2104 446
janjongboom 12:940eb88a2104 447 // run_ble();
janjongboom 12:940eb88a2104 448
janjongboom 12:940eb88a2104 449 // osjob_t initjob;
janjongboom 12:940eb88a2104 450 ////
janjongboom 12:940eb88a2104 451 // // initialize runtime env
janjongboom 12:940eb88a2104 452 // os_init( );
janjongboom 12:940eb88a2104 453 // // setup initial job
janjongboom 12:940eb88a2104 454 // os_setCallback( &initjob, onInit );
janjongboom 12:940eb88a2104 455 //
janjongboom 12:940eb88a2104 456 // os_runloop();
janjongboom 12:940eb88a2104 457
janjongboom 12:940eb88a2104 458 while (true) {
janjongboom 12:940eb88a2104 459 // execute scheduled jobs and events
janjongboom 12:940eb88a2104 460 // os_inner_loop();
janjongboom 12:940eb88a2104 461 ble.waitForEvent();
janjongboom 12:940eb88a2104 462 }
janjongboom 12:940eb88a2104 463
janjongboom 12:940eb88a2104 464
janjongboom 12:940eb88a2104 465
janjongboom 12:940eb88a2104 466 // os_runloop( );
janjongboom 11:bbe4157401e2 467 // (not reached)
rgrover1 0:790a27ffc99b 468 }