Did I feed the dog? How much dog food is left?

Dependencies:   BLE_API VL6180 mbed nRF51822

Fork of BLE_Sensor by Eric Tsai

Committer:
electronichamsters
Date:
Thu May 03 02:56:54 2018 +0000
Revision:
12:1049290dd610
Parent:
11:4f925834167d
VL6180 "Dog Food" sensor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
electronichamsters 12:1049290dd610 1 /*
electronichamsters 12:1049290dd610 2 * Copyright (c) Eric Tsai 2017
electronichamsters 12:1049290dd610 3 *
electronichamsters 12:1049290dd610 4 *
electronichamsters 12:1049290dd610 5 * Licensed under the Apache License, Version 2.0 (the "License");
electronichamsters 12:1049290dd610 6 * you may not use this file except in compliance with the License.
electronichamsters 12:1049290dd610 7 * You may obtain a copy of the License at
electronichamsters 12:1049290dd610 8 *
electronichamsters 12:1049290dd610 9 * http://www.apache.org/licenses/LICENSE-2.0
electronichamsters 12:1049290dd610 10 *
electronichamsters 12:1049290dd610 11 * Unless required by applicable law or agreed to in writing, software
electronichamsters 12:1049290dd610 12 * distributed under the License is distributed on an "AS IS" BASIS,
electronichamsters 12:1049290dd610 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
electronichamsters 12:1049290dd610 14 * See the License for the specific language governing permissions and
electronichamsters 12:1049290dd610 15 * limitations under the License.
electronichamsters 12:1049290dd610 16 *
electronichamsters 12:1049290dd610 17 *
electronichamsters 12:1049290dd610 18 * Credit: started with the basic BLE Temperature Beacon code from mbed Bluetooth Low Energy team
electronichamsters 12:1049290dd610 19 * https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_TemperatureBeacon/file/0a8bbb6dea16/main.cpp
electronichamsters 12:1049290dd610 20 *
electronichamsters 12:1049290dd610 21 * Dog food sensor (feed activity and level)
electronichamsters 12:1049290dd610 22 * keywords: todo, tochange
electronichamsters 12:1049290dd610 23 */
electronichamsters 8:46c5e0bfab05 24
sunsmile2015 0:3dc6e424dba0 25
electronichamsters 8:46c5e0bfab05 26 extern "C"
electronichamsters 8:46c5e0bfab05 27 {
electronichamsters 12:1049290dd610 28 #include "nrf_ecb.h" //required to call the ecb functions for encryption
electronichamsters 8:46c5e0bfab05 29 }
electronichamsters 8:46c5e0bfab05 30
sunsmile2015 0:3dc6e424dba0 31 #include "mbed.h"
rgrover1 5:f4d74a8cad43 32 #include "toolchain.h"
sunsmile2015 0:3dc6e424dba0 33 #include "ble/BLE.h"
electronichamsters 12:1049290dd610 34 //#include "TMP_nrf51/TMP_nrf51.h"
electronichamsters 12:1049290dd610 35 //#include "TMP102.h"
electronichamsters 12:1049290dd610 36 #include "VL6180.h" //https://developer.mbed.org/users/sburg/code/VL6180/
electronichamsters 12:1049290dd610 37 //https://developer.mbed.org/users/sburg/notebook/vl6180-time-of-flight-range-finder/
electronichamsters 8:46c5e0bfab05 38
electronichamsters 12:1049290dd610 39 /*******************************************************************************************
electronichamsters 12:1049290dd610 40 * START tochange: items that may need customization depending on sensors, hardware, and desired behavior
electronichamsters 12:1049290dd610 41 *******************************************************************************************/
electronichamsters 12:1049290dd610 42 const uint16_t Periodic_Update_Seconds = 900; //number of seconds between periodic I/O status re-transmits 900s =15 min.
electronichamsters 12:1049290dd610 43 #define MyDebugEnb 0 //enables serial output for debug, consumes ~1mA when idle
electronichamsters 12:1049290dd610 44 uint8_t magnet_near=0; //this I/O, specifically for reed switch sensor
electronichamsters 12:1049290dd610 45 //TMP102 tempI2C(p0, p1, 0x90);
electronichamsters 12:1049290dd610 46 //VL6180 rf(p12, p15); //I2C purple board sda=p12, scl=p15
electronichamsters 12:1049290dd610 47 VL6180 rf(p9, p11); //I2C purple board sda=p12, scl=p15
electronichamsters 12:1049290dd610 48 //DigitalOut pinHandShake(p0); //shutdown pin
electronichamsters 12:1049290dd610 49 //VL6180 rf(p12, p15); //I2C sda=P0 and scl=p1
electronichamsters 12:1049290dd610 50 /* hardware interrupt pins, selected based on hardware
electronichamsters 12:1049290dd610 51 *Syntax: Pin "P0.4" on nRF51822 documentation is mbed "p4".
electronichamsters 12:1049290dd610 52 * InterruptIn is pulled-up. GND the pin to activate.
electronichamsters 12:1049290dd610 53 */
electronichamsters 8:46c5e0bfab05 54
electronichamsters 12:1049290dd610 55 //tilt switch on "button1", should be open (not shorted) in rest state
electronichamsters 12:1049290dd610 56 InterruptIn button1(p0); //nRF51822 P0.0
electronichamsters 12:1049290dd610 57 //InterruptIn button2(p1); //nRF51822 P0.1
electronichamsters 10:79e8f92ef156 58
electronichamsters 11:4f925834167d 59
electronichamsters 12:1049290dd610 60 /******************************************************************************************
electronichamsters 12:1049290dd610 61 * END tochange
electronichamsters 12:1049290dd610 62 *******************************************************************************************/
electronichamsters 8:46c5e0bfab05 63
electronichamsters 12:1049290dd610 64
electronichamsters 8:46c5e0bfab05 65 #if MyDebugEnb
electronichamsters 12:1049290dd610 66 // if you see ~1mA consumption during sleep, that's because MyDebugEnb==1, it's enabled.
electronichamsters 8:46c5e0bfab05 67 Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11
electronichamsters 8:46c5e0bfab05 68 #endif
electronichamsters 8:46c5e0bfab05 69
electronichamsters 12:1049290dd610 70 static Ticker Tic_Stop_Adv; //used to stop advertising after X seconds
electronichamsters 12:1049290dd610 71 static Ticker Tic_Debounce; //debounce I/O
electronichamsters 12:1049290dd610 72 static Ticker Tic_Periodic; //transmit sensor data on a periodic basis outside I/O events
electronichamsters 8:46c5e0bfab05 73
electronichamsters 12:1049290dd610 74 const uint16_t Periodicity = 1800; //birthday periodicity used for spoof checking, must match gateway. Should be 1800 seconds for 30minutes
electronichamsters 12:1049290dd610 75 static Timer Tmr_From_Birthday; //holds number of seconds since birthday, for spoof detection
electronichamsters 12:1049290dd610 76 static Ticker Tic_Birthday; //resets Tmr_From_Birthday every Periodicity seconds, for spoof detection
electronichamsters 12:1049290dd610 77
electronichamsters 8:46c5e0bfab05 78
electronichamsters 12:1049290dd610 79 static bool Flag_Update_IO = false; //flag to indicate event is hardware interrupt
electronichamsters 12:1049290dd610 80 static bool Flag_Periodic_Call = false; //flag to indicate event is periodic callback
electronichamsters 12:1049290dd610 81 static bool Flag_Detach_Adv_Tic = false; //flag to stop advertising
electronichamsters 12:1049290dd610 82
electronichamsters 12:1049290dd610 83 /* Optional: Device Name, add for human read-ability */
electronichamsters 12:1049290dd610 84 const static char DEVICE_NAME[] = "LOL";
electronichamsters 12:1049290dd610 85
electronichamsters 12:1049290dd610 86 //dog food sensor
electronichamsters 12:1049290dd610 87 uint16_t button1_released_counter = 0;
electronichamsters 8:46c5e0bfab05 88
electronichamsters 8:46c5e0bfab05 89
electronichamsters 12:1049290dd610 90 //Advertisement Data
electronichamsters 12:1049290dd610 91 //note: AdvData[] holds bytes [5] to byte [30] of entire advertising data. The user content part after ADV flag and header
electronichamsters 12:1049290dd610 92 static uint8_t AdvData[] = {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}; //26 Bytes manufacturer specific data
electronichamsters 12:1049290dd610 93 char buffer[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //hold I/O reading json
electronichamsters 12:1049290dd610 94 char bat_volt_char[6] = {0, 0, 0, 0, 0, 0}; //hold json for battery reading
electronichamsters 12:1049290dd610 95 uint8_t Adv_First_Section[10]; //holds the first several bytes with a pattern indicating this sensor is "one of ours"
electronichamsters 12:1049290dd610 96 uint8_t mac_reverse[6] = {0x0,0x0,0x0,0x0,0x0,0x0}; //mac address for this module
electronichamsters 12:1049290dd610 97 char sensor_char[8] = {0, 0, 0, 0, 0, 0}; //hold json for temperature
rgrover1 5:f4d74a8cad43 98
electronichamsters 12:1049290dd610 99 /***** Advertisement structure is 31 Bytes ****************
electronichamsters 12:1049290dd610 100
electronichamsters 12:1049290dd610 101 https://docs.mbed.com/docs/ble-intros/en/latest/Advanced/CustomGAP/
electronichamsters 8:46c5e0bfab05 102
electronichamsters 12:1049290dd610 103 Full Advertisement:
electronichamsters 12:1049290dd610 104 First 5 bytes are set by stack according to flag and header parameters.
electronichamsters 12:1049290dd610 105 Last 26 bytes are user data
electronichamsters 12:1049290dd610 106 -- tabbed --
electronichamsters 12:1049290dd610 107 Byte 0 | AD1 Length | 0x02 | AD1 is 2 bytes long
electronichamsters 12:1049290dd610 108 Byte 1 | AD1 Type | 0x01 | AD1 Data interpreted as flag
electronichamsters 12:1049290dd610 109 Byte 2 | AD1 Data 0 | 0x06 | AD1 Data flag mean "00000110"
electronichamsters 12:1049290dd610 110 Byte 3 | AD2 Length | 0x1B | AD2 is 27 bytes (0x1B) long (rest of this data)
electronichamsters 12:1049290dd610 111 Byte 4 | AD2 Type | 0xFF | 0xFF mean Manufacturer Specific Data
electronichamsters 12:1049290dd610 112 Byte 5 | AD2 Data 0 | ADV_Data[0] | "our device" flag, MAC[3]
electronichamsters 12:1049290dd610 113 Byte 6 | AD2 Data 1 | ADV_Data[1] | "out device" flag, MAC[2]
electronichamsters 12:1049290dd610 114 Byte 7 | AD2 Data 2 | ADV_Data[2] | "out device" flag, MAC[1]
electronichamsters 12:1049290dd610 115 Byte 8 | AD2 Data 3 | ADV_Data[3] | "out device" flag, MAC[0]
electronichamsters 12:1049290dd610 116 Byte 9 | AD2 Data 4 | ADV_Data[4] | battery voltage json MSB, ie 3 in 3.14
electronichamsters 12:1049290dd610 117 Byte 10 | AD2 Data 5 | ADV_Data[5] | battery voltage json
electronichamsters 12:1049290dd610 118 Byte 11 | AD2 Data 6 | ADV_Data[6] | battery voltage json
electronichamsters 12:1049290dd610 119 Byte 12 | AD2 Data 7 | ADV_Data[7] | battery voltage json LSB, ie 4 in 3.14
electronichamsters 12:1049290dd610 120 Byte 13 | AD2 Data 8 | ADV_Data[8] | reserved
electronichamsters 12:1049290dd610 121 Byte 14 | AD2 Data 9 | ADV_Data[9] | reserved
electronichamsters 12:1049290dd610 122 Byte 15 | AD2 Data 10 | ADV_Data[10] Encrypted | spoof - clock high byte, range 0 to 1800 seconds
electronichamsters 12:1049290dd610 123 Byte 16 | AD2 Data 11 | ADV_Data[11] Encrypted | spoof - clock low byte
electronichamsters 12:1049290dd610 124 Byte 17 | AD2 Data 12 | ADV_Data[12] Encrypted | Xmit_Cnt - increments per transmit event, 0-255
electronichamsters 12:1049290dd610 125 Byte 18 | AD2 Data 13 | ADV_Data[13] Encrypted | JSON[0]
electronichamsters 12:1049290dd610 126 Byte 19 | AD2 Data 14 | ADV_Data[14] Encrypted | JSON[1]
electronichamsters 12:1049290dd610 127 Byte 20 | AD2 Data 15 | ADV_Data[15] Encrypted | JSON[2]
electronichamsters 12:1049290dd610 128 Byte 21 | AD2 Data 16 | ADV_Data[16] Encrypted | JSON[3]
electronichamsters 12:1049290dd610 129 Byte 22 | AD2 Data 17 | ADV_Data[17] Encrypted | JSON[4]
electronichamsters 12:1049290dd610 130 Byte 23 | AD2 Data 18 | ADV_Data[18] Encrypted | JSON[5]
electronichamsters 12:1049290dd610 131 Byte 24 | AD2 Data 19 | ADV_Data[19] Encrypted | JSON[6]
electronichamsters 12:1049290dd610 132 Byte 25 | AD2 Data 20 | ADV_Data[20] Encrypted | JSON[7]
electronichamsters 12:1049290dd610 133 Byte 26 | AD2 Data 21 | ADV_Data[21] Encrypted | JSON[8]
electronichamsters 12:1049290dd610 134 Byte 27 | AD2 Data 22 | ADV_Data[22] Encrypted | JSON[9]
electronichamsters 12:1049290dd610 135 Byte 28 | AD2 Data 23 | ADV_Data[23] Encrypted | JSON[10]
electronichamsters 12:1049290dd610 136 Byte 29 | AD2 Data 24 | ADV_Data[24] Encrypted | JSON[11]
electronichamsters 12:1049290dd610 137 Byte 30 | AD2 Data 25 | ADV_Data[25] Encrypted | JSON[12]
electronichamsters 8:46c5e0bfab05 138
electronichamsters 12:1049290dd610 139 ***************************************************/
electronichamsters 8:46c5e0bfab05 140
electronichamsters 8:46c5e0bfab05 141
electronichamsters 8:46c5e0bfab05 142 static uint8_t key[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 143 //26 bytes adv data
electronichamsters 8:46c5e0bfab05 144 static uint8_t encrypted[26] = {0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x3,0x4,0x4,0x4,0x5,0x5,0x5,0x6,0x6,0x6,0x7,0x7,0x7,0x8,0x8}; /* Example of hex data */
electronichamsters 8:46c5e0bfab05 145 //static uint8_t key_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 146 static uint8_t key_buf[16] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2};
electronichamsters 8:46c5e0bfab05 147 static uint8_t src_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 148 static uint8_t des_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 149
electronichamsters 10:79e8f92ef156 150 uint8_t Xmit_Cnt = 1;
electronichamsters 8:46c5e0bfab05 151
electronichamsters 8:46c5e0bfab05 152
electronichamsters 8:46c5e0bfab05 153
electronichamsters 8:46c5e0bfab05 154 /* **** NOT USED **** */
electronichamsters 8:46c5e0bfab05 155 //16byte UUID loading happens here
electronichamsters 8:46c5e0bfab05 156 //Look at <GapAdvertisingData.h> for rest of definition
sunsmile2015 4:e5fa4c8838db 157 struct ApplicationData_t {
electronichamsters 8:46c5e0bfab05 158 //Byte 0: AppID High Byte
electronichamsters 8:46c5e0bfab05 159 //Byte 1: AppID Low Byte
electronichamsters 8:46c5e0bfab05 160 //Byte 2: sensor High Word
electronichamsters 8:46c5e0bfab05 161 //Byte 3:
electronichamsters 8:46c5e0bfab05 162 //Byte 4:
electronichamsters 8:46c5e0bfab05 163 //Byte 5: sensor Low Byte
electronichamsters 8:46c5e0bfab05 164
electronichamsters 8:46c5e0bfab05 165
electronichamsters 8:46c5e0bfab05 166 //app ID is 16 bit, (0xFEFE)
electronichamsters 8:46c5e0bfab05 167 uint16_t applicationSpecificId; /* An ID used to identify temperature value in the manufacture specific AD data field */
electronichamsters 8:46c5e0bfab05 168
electronichamsters 12:1049290dd610 169 //TMP_nrf51::TempSensorValue_t tmpSensorValue; /* this is a float (32-bit), user data */
rgrover1 5:f4d74a8cad43 170 } PACKED;
sunsmile2015 0:3dc6e424dba0 171
electronichamsters 8:46c5e0bfab05 172
electronichamsters 8:46c5e0bfab05 173
electronichamsters 8:46c5e0bfab05 174 void debounce_Callback(void)
electronichamsters 8:46c5e0bfab05 175 {
electronichamsters 12:1049290dd610 176 //Tic_Debounce.detach();
electronichamsters 12:1049290dd610 177 button1.mode(PullUp); //tilt switch should be opened (not shorted) in rest state
electronichamsters 12:1049290dd610 178 wait_ms(1);
electronichamsters 12:1049290dd610 179 uint8_t button1_state = button1.read();
electronichamsters 12:1049290dd610 180 if ( button1_state == 1) //open circuit, top is in rest position
electronichamsters 12:1049290dd610 181 {
electronichamsters 12:1049290dd610 182 button1_released_counter++;
electronichamsters 12:1049290dd610 183 }
electronichamsters 12:1049290dd610 184 else
electronichamsters 12:1049290dd610 185 {
electronichamsters 12:1049290dd610 186 button1_released_counter = 0;
electronichamsters 12:1049290dd610 187 }
electronichamsters 12:1049290dd610 188 if (button1_released_counter >= 3)
electronichamsters 12:1049290dd610 189 {
electronichamsters 12:1049290dd610 190 Flag_Update_IO = true; //start advertising
electronichamsters 12:1049290dd610 191 Tic_Debounce.detach();
electronichamsters 12:1049290dd610 192 button1_released_counter = 0;
electronichamsters 12:1049290dd610 193 //Period = false;
electronichamsters 12:1049290dd610 194 }
electronichamsters 12:1049290dd610 195
electronichamsters 8:46c5e0bfab05 196 /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
electronichamsters 8:46c5e0bfab05 197 * BLE device API from the main thread. */
electronichamsters 12:1049290dd610 198
electronichamsters 8:46c5e0bfab05 199 }
electronichamsters 8:46c5e0bfab05 200
electronichamsters 12:1049290dd610 201 /*
electronichamsters 12:1049290dd610 202 //ISR for I/O interrupt
electronichamsters 8:46c5e0bfab05 203 void buttonPressedCallback(void)
sunsmile2015 2:b935358da5ba 204 {
electronichamsters 12:1049290dd610 205 Tic_Debounce.attach(debounce_Callback, 1); //ok to attach multiple times, recent one wins
electronichamsters 8:46c5e0bfab05 206 }
electronichamsters 12:1049290dd610 207 */
electronichamsters 12:1049290dd610 208 //ISR for I/O interrupt
electronichamsters 8:46c5e0bfab05 209 void buttonReleasedCallback(void)
electronichamsters 8:46c5e0bfab05 210 {
electronichamsters 8:46c5e0bfab05 211
electronichamsters 12:1049290dd610 212 Tic_Debounce.attach(debounce_Callback, 3);
electronichamsters 8:46c5e0bfab05 213 }
electronichamsters 8:46c5e0bfab05 214
electronichamsters 8:46c5e0bfab05 215
electronichamsters 8:46c5e0bfab05 216 void stop_adv_Callback(void)
electronichamsters 8:46c5e0bfab05 217 {
electronichamsters 8:46c5e0bfab05 218 //stops advertising after X seconds
electronichamsters 8:46c5e0bfab05 219 /* Note that the Callback() executes in interrupt context, so it is safer to do
rgrover1 5:f4d74a8cad43 220 * heavy-weight sensor polling from the main thread (where we should be able to block safely, if needed). */
electronichamsters 12:1049290dd610 221 Flag_Detach_Adv_Tic = true;
electronichamsters 12:1049290dd610 222
electronichamsters 12:1049290dd610 223 }
electronichamsters 8:46c5e0bfab05 224
electronichamsters 12:1049290dd610 225 /* ****************************************
electronichamsters 12:1049290dd610 226 * Decides what actions need to be performed on periodic basis
electronichamsters 12:1049290dd610 227 *******************************************/
electronichamsters 12:1049290dd610 228 void periodic_Callback(void)
electronichamsters 12:1049290dd610 229 {
electronichamsters 12:1049290dd610 230 Flag_Update_IO = true;
electronichamsters 12:1049290dd610 231 Flag_Periodic_Call = true;
electronichamsters 12:1049290dd610 232 }
electronichamsters 12:1049290dd610 233
electronichamsters 12:1049290dd610 234 /* ****************************************
electronichamsters 12:1049290dd610 235 * Decides what actions need to be performed on periodic basis
electronichamsters 12:1049290dd610 236 *******************************************/
electronichamsters 12:1049290dd610 237 void read_IO_Callback(void)
electronichamsters 12:1049290dd610 238 {
electronichamsters 12:1049290dd610 239 Flag_Update_IO = true;
electronichamsters 12:1049290dd610 240 Flag_Periodic_Call = false;
electronichamsters 8:46c5e0bfab05 241 }
electronichamsters 8:46c5e0bfab05 242
electronichamsters 8:46c5e0bfab05 243
electronichamsters 12:1049290dd610 244 /* ****************************************
electronichamsters 12:1049290dd610 245 * No RTC available, tickers only have a 35 minute range.
electronichamsters 12:1049290dd610 246 * So periodicity for spoof avoidance is set to 30 minutes
electronichamsters 12:1049290dd610 247 *******************************************/
electronichamsters 10:79e8f92ef156 248 void clock_reset_Callback(void)
electronichamsters 10:79e8f92ef156 249 {
electronichamsters 10:79e8f92ef156 250 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 251 device.printf("===== reset timer =====");
electronichamsters 10:79e8f92ef156 252 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 253 #endif
electronichamsters 12:1049290dd610 254 Tmr_From_Birthday.reset();
electronichamsters 10:79e8f92ef156 255 };
electronichamsters 10:79e8f92ef156 256
electronichamsters 12:1049290dd610 257
rgrover1 5:f4d74a8cad43 258 void setupApplicationData(ApplicationData_t &appData)
sunsmile2015 4:e5fa4c8838db 259 {
electronichamsters 8:46c5e0bfab05 260 // two byte ID: 0xFEFE
electronichamsters 8:46c5e0bfab05 261 static const uint16_t APP_SPECIFIC_ID_TEST = 0xFEFE; //2 byte application ID
andresag 7:0a8bbb6dea16 262
sunsmile2015 4:e5fa4c8838db 263 appData.applicationSpecificId = APP_SPECIFIC_ID_TEST;
sunsmile2015 0:3dc6e424dba0 264 }
sunsmile2015 0:3dc6e424dba0 265
electronichamsters 8:46c5e0bfab05 266
electronichamsters 8:46c5e0bfab05 267
andresag 7:0a8bbb6dea16 268 /**
andresag 7:0a8bbb6dea16 269 * This function is called when the ble initialization process has failled
andresag 7:0a8bbb6dea16 270 */
andresag 7:0a8bbb6dea16 271 void onBleInitError(BLE &ble, ble_error_t error)
andresag 7:0a8bbb6dea16 272 {
andresag 7:0a8bbb6dea16 273 /* Initialization error handling should go here */
andresag 7:0a8bbb6dea16 274 }
andresag 7:0a8bbb6dea16 275
electronichamsters 12:1049290dd610 276
electronichamsters 12:1049290dd610 277
andresag 7:0a8bbb6dea16 278 /**
andresag 7:0a8bbb6dea16 279 * Callback triggered when the ble initialization process has finished
andresag 7:0a8bbb6dea16 280 */
andresag 7:0a8bbb6dea16 281 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sunsmile2015 2:b935358da5ba 282 {
andresag 7:0a8bbb6dea16 283 BLE& ble = params->ble;
andresag 7:0a8bbb6dea16 284 ble_error_t error = params->error;
andresag 7:0a8bbb6dea16 285
andresag 7:0a8bbb6dea16 286 if (error != BLE_ERROR_NONE) {
andresag 7:0a8bbb6dea16 287 /* In case of error, forward the error handling to onBleInitError */
andresag 7:0a8bbb6dea16 288 onBleInitError(ble, error);
andresag 7:0a8bbb6dea16 289 return;
andresag 7:0a8bbb6dea16 290 }
andresag 7:0a8bbb6dea16 291
andresag 7:0a8bbb6dea16 292 /* Ensure that it is the default instance of BLE */
andresag 7:0a8bbb6dea16 293 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 7:0a8bbb6dea16 294 return;
andresag 7:0a8bbb6dea16 295 }
electronichamsters 8:46c5e0bfab05 296
electronichamsters 8:46c5e0bfab05 297 /* Set device name characteristic data */
electronichamsters 8:46c5e0bfab05 298 ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME);
andresag 7:0a8bbb6dea16 299
rgrover1 5:f4d74a8cad43 300 /* Setup advertising payload */
electronichamsters 8:46c5e0bfab05 301 //set modes "no EDR", "discoverable" for beacon type advertisements
rgrover1 5:f4d74a8cad43 302 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
electronichamsters 8:46c5e0bfab05 303
electronichamsters 11:4f925834167d 304
electronichamsters 8:46c5e0bfab05 305 //from GAP example
electronichamsters 8:46c5e0bfab05 306 /* Sacrifice 2B of 31B to AdvType overhead, rest goes to AdvData array you define */
electronichamsters 8:46c5e0bfab05 307 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 308
electronichamsters 8:46c5e0bfab05 309 /* Setup advertising parameters: not connectable */
electronichamsters 8:46c5e0bfab05 310 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
electronichamsters 12:1049290dd610 311 ble.gap().setAdvertisingInterval(200); //one advertisment every 300ms. Self tickers, so you don't have to worry.
electronichamsters 8:46c5e0bfab05 312
electronichamsters 12:1049290dd610 313 }
electronichamsters 8:46c5e0bfab05 314
electronichamsters 8:46c5e0bfab05 315
electronichamsters 11:4f925834167d 316 //not needed anymore
electronichamsters 8:46c5e0bfab05 317 void my_analogin_init(void)
electronichamsters 8:46c5e0bfab05 318 {
electronichamsters 10:79e8f92ef156 319
electronichamsters 8:46c5e0bfab05 320 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 8:46c5e0bfab05 321 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 322 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 8:46c5e0bfab05 323 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 8:46c5e0bfab05 324 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 325 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 8:46c5e0bfab05 326 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 327 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 328 }
sunsmile2015 2:b935358da5ba 329
electronichamsters 12:1049290dd610 330
electronichamsters 12:1049290dd610 331 /* ****************************************
electronichamsters 12:1049290dd610 332 * Read battery voltage using bandgap reference
electronichamsters 12:1049290dd610 333 * shunt Vdd to ADC, thanks to Marcelo Salazar's notes here:
electronichamsters 12:1049290dd610 334 * https://developer.mbed.org/users/MarceloSalazar/notebook/measuring-battery-voltage-with-nordic-nrf51x/
electronichamsters 12:1049290dd610 335 *******************************************/
electronichamsters 12:1049290dd610 336 uint16_t read_bat_volt(void)
electronichamsters 8:46c5e0bfab05 337 {
electronichamsters 10:79e8f92ef156 338 //10 bit resolution, route Vdd as analog input, set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 339 //disable analog pin select "PSEL" because we're using Vdd as analog input
electronichamsters 10:79e8f92ef156 340 //no external voltage reference
electronichamsters 10:79e8f92ef156 341 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 342 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 343 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 344 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 345 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 346 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 347 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 348
electronichamsters 10:79e8f92ef156 349 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 350 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 351 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 10:79e8f92ef156 352 NRF_ADC->TASKS_START = 1;
electronichamsters 10:79e8f92ef156 353
electronichamsters 10:79e8f92ef156 354
electronichamsters 10:79e8f92ef156 355 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 10:79e8f92ef156 356 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 12:1049290dd610 357 wait_ms(1);
electronichamsters 10:79e8f92ef156 358
electronichamsters 10:79e8f92ef156 359 //save off RESULT before disabling.
electronichamsters 10:79e8f92ef156 360 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 10:79e8f92ef156 361
electronichamsters 10:79e8f92ef156 362 //disable ADC to lower bat consumption
electronichamsters 10:79e8f92ef156 363 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 364 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 10:79e8f92ef156 365
electronichamsters 10:79e8f92ef156 366 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 10:79e8f92ef156 367 //return myresult;
electronichamsters 12:1049290dd610 368 } //end read_bat_volt
electronichamsters 12:1049290dd610 369
electronichamsters 12:1049290dd610 370
electronichamsters 10:79e8f92ef156 371
electronichamsters 12:1049290dd610 372 /* ****************************************
electronichamsters 12:1049290dd610 373 * Read battery voltage using bandgap reference
electronichamsters 12:1049290dd610 374 * shunt analog pin to ADC, from API here
electronichamsters 12:1049290dd610 375 * https://developer.mbed.org/users/mbed_official/code/mbed-src/file/cb4253f91ada/targets/hal/TARGET_NORDIC/TARGET_NRF51822/analogin_api.c
electronichamsters 12:1049290dd610 376 *******************************************/
electronichamsters 12:1049290dd610 377 uint16_t read_ADC_pin(void)
electronichamsters 10:79e8f92ef156 378 {
electronichamsters 10:79e8f92ef156 379
electronichamsters 10:79e8f92ef156 380 //10 bit resolution, route PSEL pin as 1/3 input sel,
electronichamsters 10:79e8f92ef156 381 //set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 382 //set AnalogInput4 as input pin (this is P0.03)
electronichamsters 10:79e8f92ef156 383 //no external voltage reference
electronichamsters 10:79e8f92ef156 384 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 385 //(ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 386 (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 387 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 388 //ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 389 (ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 390 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 391 //set pin select to AnalogInput4 = pin 7 = p0.03 = AIN4
electronichamsters 10:79e8f92ef156 392 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 393 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 394 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 395 NRF_ADC->TASKS_START = 1;
electronichamsters 8:46c5e0bfab05 396
electronichamsters 8:46c5e0bfab05 397
electronichamsters 8:46c5e0bfab05 398 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 8:46c5e0bfab05 399 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 12:1049290dd610 400 wait_ms(1); //needed because busy while loop doesn't run.
electronichamsters 8:46c5e0bfab05 401
electronichamsters 8:46c5e0bfab05 402 //save off RESULT before disabling.
electronichamsters 8:46c5e0bfab05 403 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 8:46c5e0bfab05 404
electronichamsters 8:46c5e0bfab05 405 //disable ADC to lower bat consumption
electronichamsters 8:46c5e0bfab05 406 //NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 407 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 408
electronichamsters 8:46c5e0bfab05 409 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 8:46c5e0bfab05 410 //return myresult;
electronichamsters 12:1049290dd610 411 } //end read_ADC_pin
sunsmile2015 4:e5fa4c8838db 412
electronichamsters 10:79e8f92ef156 413
electronichamsters 12:1049290dd610 414 /* ****************************************
electronichamsters 12:1049290dd610 415 * Pattern scheme indicating "one of ours"
electronichamsters 12:1049290dd610 416 * generate first part of ADV data so that observer can recognize it as "one of ours".
electronichamsters 12:1049290dd610 417 * use specific schema to decide how we're recognizing our sensor ADV
electronichamsters 12:1049290dd610 418 *******************************************/
electronichamsters 10:79e8f92ef156 419 void hash_first_section(uint8_t * dest, const uint8_t * mac_addr, const char * bat_volt_str)
electronichamsters 10:79e8f92ef156 420 {
electronichamsters 10:79e8f92ef156 421 dest[0] = mac_addr[3];
electronichamsters 10:79e8f92ef156 422 dest[1] = mac_addr[2];
electronichamsters 10:79e8f92ef156 423 dest[2] = mac_addr[1];
electronichamsters 10:79e8f92ef156 424 dest[3] = mac_addr[0];
electronichamsters 10:79e8f92ef156 425 dest[4] = bat_volt_str[0];
electronichamsters 10:79e8f92ef156 426 dest[5] = bat_volt_str[1];
electronichamsters 10:79e8f92ef156 427 dest[6] = bat_volt_str[2];
electronichamsters 10:79e8f92ef156 428 dest[7] = bat_volt_str[3];
electronichamsters 10:79e8f92ef156 429 dest[8] = 0x10;
electronichamsters 10:79e8f92ef156 430 dest[9] = 0x11;
electronichamsters 12:1049290dd610 431 #if MyDebugEnb
electronichamsters 12:1049290dd610 432
electronichamsters 12:1049290dd610 433 device.printf("hash array: ");
electronichamsters 12:1049290dd610 434 for (int i=0; i<10; i++)
electronichamsters 12:1049290dd610 435 {
electronichamsters 12:1049290dd610 436 device.printf("%x ", dest[i]);
electronichamsters 12:1049290dd610 437 }
electronichamsters 12:1049290dd610 438 device.printf("\r\n");
electronichamsters 12:1049290dd610 439 #endif
electronichamsters 10:79e8f92ef156 440 }
electronichamsters 10:79e8f92ef156 441
electronichamsters 10:79e8f92ef156 442
electronichamsters 12:1049290dd610 443 /* ****************************************
electronichamsters 12:1049290dd610 444 *
electronichamsters 12:1049290dd610 445 * Main Loop
electronichamsters 12:1049290dd610 446 *
electronichamsters 12:1049290dd610 447 *******************************************/
sunsmile2015 2:b935358da5ba 448 int main(void)
sunsmile2015 2:b935358da5ba 449 {
electronichamsters 8:46c5e0bfab05 450
electronichamsters 12:1049290dd610 451 #if MyDebugEnb
electronichamsters 12:1049290dd610 452 device.baud(9600);
electronichamsters 12:1049290dd610 453 device.printf("started sensor node 36 ");
electronichamsters 12:1049290dd610 454 device.printf("\r\n");
electronichamsters 12:1049290dd610 455 #endif
electronichamsters 8:46c5e0bfab05 456
electronichamsters 12:1049290dd610 457 //pinHandShake = 0;
electronichamsters 12:1049290dd610 458 //pinHandShake.mode(PullNone); //Expecting gateway to set pin high for flow control
electronichamsters 12:1049290dd610 459 Tmr_From_Birthday.start(); //tracks # sec since birthday
electronichamsters 8:46c5e0bfab05 460
sunsmile2015 0:3dc6e424dba0 461
andresag 7:0a8bbb6dea16 462 BLE &ble = BLE::Instance();
andresag 7:0a8bbb6dea16 463 ble.init(bleInitComplete);
electronichamsters 8:46c5e0bfab05 464
electronichamsters 8:46c5e0bfab05 465 float bat_reading; //hold battery voltage reading (Vbg/Vcc)
electronichamsters 8:46c5e0bfab05 466
electronichamsters 8:46c5e0bfab05 467 my_analogin_init();//routes band-gap to analog input
andresag 7:0a8bbb6dea16 468
andresag 7:0a8bbb6dea16 469 /* SpinWait for initialization to complete. This is necessary because the
andresag 7:0a8bbb6dea16 470 * BLE object is used in the main loop below. */
electronichamsters 8:46c5e0bfab05 471 while (ble.hasInitialized() == false) { /* spin loop */ }
electronichamsters 8:46c5e0bfab05 472
electronichamsters 8:46c5e0bfab05 473 //every X seconds, sends period update, up to 1800 (30 minutes)
electronichamsters 12:1049290dd610 474 Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds); //send updated I/O every x seconds
electronichamsters 12:1049290dd610 475 Tic_Birthday.attach(clock_reset_Callback, Periodicity); //clock algorithm periodicity
rgrover1 5:f4d74a8cad43 476
electronichamsters 10:79e8f92ef156 477
electronichamsters 12:1049290dd610 478 ble.getAddress(0,mac_reverse); //last byte of MAC (as shown on phone app) is at mac[0], not mac[6];
electronichamsters 12:1049290dd610 479 #if MyDebugEnb
electronichamsters 12:1049290dd610 480 device.printf("mac = ");
electronichamsters 12:1049290dd610 481 for (int i=0; i<6; i++) //prints out MAC address in reverse order; opps.
electronichamsters 12:1049290dd610 482 {
electronichamsters 12:1049290dd610 483 device.printf("%x:", mac_reverse[i]);
electronichamsters 12:1049290dd610 484 }
electronichamsters 12:1049290dd610 485 device.printf("\r\n");
electronichamsters 12:1049290dd610 486 #endif
electronichamsters 12:1049290dd610 487
electronichamsters 12:1049290dd610 488 button1.rise(NULL); //disable interrupt on rise
electronichamsters 12:1049290dd610 489
electronichamsters 12:1049290dd610 490 while (true)
electronichamsters 12:1049290dd610 491 { //Main Loop
electronichamsters 12:1049290dd610 492
electronichamsters 12:1049290dd610 493 uint16_t seconds_Old =(uint16_t)(Tmr_From_Birthday.read_ms()/1000); // 0-1800 seconds (30 minutes)
electronichamsters 12:1049290dd610 494
electronichamsters 12:1049290dd610 495 #if MyDebugEnb
electronichamsters 12:1049290dd610 496 device.printf("current time in seconds: %d \r\n", seconds_Old);
electronichamsters 12:1049290dd610 497 #endif
electronichamsters 12:1049290dd610 498
electronichamsters 8:46c5e0bfab05 499
electronichamsters 12:1049290dd610 500 button1.mode(PullUp); //tilt switch should be opened (not shorted) in rest state
electronichamsters 12:1049290dd610 501 //0 = activity
electronichamsters 12:1049290dd610 502 //1 = no activity
electronichamsters 8:46c5e0bfab05 503
electronichamsters 12:1049290dd610 504 uint8_t button1_state = button1.read();
electronichamsters 12:1049290dd610 505 if ( button1_state == 0) //pin grounded, there's activity, set sleep for 3 seconds
electronichamsters 12:1049290dd610 506 {
electronichamsters 12:1049290dd610 507 Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds); //reset periodic
electronichamsters 12:1049290dd610 508 button1.fall(NULL); //disable interrupt
electronichamsters 12:1049290dd610 509 button1.mode(PullNone); //float pin to save battery
electronichamsters 12:1049290dd610 510
electronichamsters 12:1049290dd610 511 //Tic_Periodic.attach(read_IO_Callback, 3); //wait 3 seconds before reading pins again
electronichamsters 12:1049290dd610 512 //Flag_Update_IO = false;
electronichamsters 12:1049290dd610 513 }
electronichamsters 12:1049290dd610 514 else //pin open, no activity
electronichamsters 12:1049290dd610 515 {
electronichamsters 12:1049290dd610 516 button1.fall(buttonReleasedCallback); //enable interrupt
electronichamsters 12:1049290dd610 517 button1.mode(PullUp); //pull up on pin to get interrupt
electronichamsters 12:1049290dd610 518
electronichamsters 12:1049290dd610 519 }
electronichamsters 12:1049290dd610 520
electronichamsters 12:1049290dd610 521 /* comment out button interrupts
electronichamsters 12:1049290dd610 522
electronichamsters 8:46c5e0bfab05 523
electronichamsters 8:46c5e0bfab05 524 //set both pins to pull-up, so they're not floating when we read state
electronichamsters 8:46c5e0bfab05 525 button1.mode(PullUp);
electronichamsters 8:46c5e0bfab05 526 button2.mode(PullUp);
electronichamsters 8:46c5e0bfab05 527
electronichamsters 8:46c5e0bfab05 528 //expect either button1 or button2 is grounded, b/c using SPDT reed switch
electronichamsters 8:46c5e0bfab05 529 //the "common" pin on the reed switch should be on GND
electronichamsters 8:46c5e0bfab05 530 uint8_t button1_state = button1.read();
electronichamsters 8:46c5e0bfab05 531 uint8_t button2_state = button2.read();
electronichamsters 8:46c5e0bfab05 532
electronichamsters 8:46c5e0bfab05 533
electronichamsters 8:46c5e0bfab05 534 //let's just update the pins on every wake. Insurance against const drain.
electronichamsters 12:1049290dd610 535 //if state == 0, pin is grounded. Unset interrupt and float pin, set the other pin for ISR
electronichamsters 8:46c5e0bfab05 536 if ( (button1_state == 0) && (button2_state == 1) )
electronichamsters 8:46c5e0bfab05 537 {
electronichamsters 8:46c5e0bfab05 538 magnet_near = 1;
electronichamsters 8:46c5e0bfab05 539 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 540 button1.fall(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 541 button1.rise(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 542 button1.mode(PullNone); //float pin to save battery
electronichamsters 8:46c5e0bfab05 543
electronichamsters 8:46c5e0bfab05 544 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 10:79e8f92ef156 545 button2.fall(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 546 button2.rise(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 547 button2.mode(PullUp); //pull up on pin to get interrupt
electronichamsters 12:1049290dd610 548 #if MyDebugEnb
electronichamsters 12:1049290dd610 549 device.printf("=== button 1! %d seconds=== \r\n", seconds_Old);
electronichamsters 12:1049290dd610 550 #endif
electronichamsters 12:1049290dd610 551 } //end if button2
electronichamsters 8:46c5e0bfab05 552 else if ( (button1_state == 1) && (button2_state == 0) ) //assume other pin is open circuit
electronichamsters 8:46c5e0bfab05 553 {
electronichamsters 8:46c5e0bfab05 554 magnet_near = 0;
electronichamsters 8:46c5e0bfab05 555 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 10:79e8f92ef156 556 button1.fall(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 557 button1.rise(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 558 button1.mode(PullUp); //pull up on pin to get interrupt
electronichamsters 8:46c5e0bfab05 559
electronichamsters 8:46c5e0bfab05 560 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 561 button2.fall(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 562 button2.rise(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 563 button2.mode(PullNone); //float pin to save battery
electronichamsters 12:1049290dd610 564 #if MyDebugEnb
electronichamsters 12:1049290dd610 565 device.printf("=== button 2! === %d seconds\r\n", seconds_Old);
electronichamsters 12:1049290dd610 566 #endif
electronichamsters 12:1049290dd610 567 } //end if button1
electronichamsters 8:46c5e0bfab05 568 else //odd state, shouldn't happen, suck battery and pullup both pins
electronichamsters 8:46c5e0bfab05 569 {
electronichamsters 8:46c5e0bfab05 570 magnet_near = 2;
electronichamsters 8:46c5e0bfab05 571 //AdvData[4] = 0x33;
electronichamsters 8:46c5e0bfab05 572 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 573 button1.fall(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 574 button1.rise(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 575 button1.mode(PullUp); //float pin to save battery
electronichamsters 8:46c5e0bfab05 576
electronichamsters 8:46c5e0bfab05 577 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 578 button2.fall(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 579 button2.rise(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 580 button2.mode(PullUp); //float pin to save battery
electronichamsters 12:1049290dd610 581 #if MyDebugEnb
electronichamsters 12:1049290dd610 582 device.printf("no buttons!! %d seconds\r\n", seconds_Old);
electronichamsters 12:1049290dd610 583 #endif
electronichamsters 12:1049290dd610 584 } //end odd state
electronichamsters 8:46c5e0bfab05 585
electronichamsters 8:46c5e0bfab05 586
electronichamsters 12:1049290dd610 587 **** end comment out button interrupts */
electronichamsters 12:1049290dd610 588
electronichamsters 12:1049290dd610 589
electronichamsters 12:1049290dd610 590 if (Flag_Update_IO) {
electronichamsters 12:1049290dd610 591
electronichamsters 12:1049290dd610 592 //pinHandShake = 1; //enable distance sensor
electronichamsters 12:1049290dd610 593 //wait_ms(500); //let sensor run
andresag 7:0a8bbb6dea16 594 /* Do blocking calls or whatever hardware-specific action is
andresag 7:0a8bbb6dea16 595 * necessary to poll the sensor. */
electronichamsters 8:46c5e0bfab05 596
electronichamsters 12:1049290dd610 597 //call attach again on periodic update to reset ticker
electronichamsters 12:1049290dd610 598 //next periodic updates happens Perioidc_Update_Seconds after I/O events
electronichamsters 12:1049290dd610 599 Tic_Periodic.attach(periodic_Callback, Periodic_Update_Seconds);
electronichamsters 10:79e8f92ef156 600 Xmit_Cnt++; //increment transmit counter when updating I/O
electronichamsters 10:79e8f92ef156 601
electronichamsters 10:79e8f92ef156 602
electronichamsters 12:1049290dd610 603 //read and convert battery voltage
electronichamsters 12:1049290dd610 604 bat_reading = (float)read_bat_volt();
electronichamsters 8:46c5e0bfab05 605 bat_reading = (bat_reading * 3.6) / 1024.0;
electronichamsters 12:1049290dd610 606 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 607 device.printf("bat reading: %f \r\n", bat_reading);
electronichamsters 12:1049290dd610 608 #endif
electronichamsters 12:1049290dd610 609 //write battery voltage
electronichamsters 12:1049290dd610 610 uint8_t total_chars;
electronichamsters 12:1049290dd610 611 memset(&bat_volt_char[0], 0, sizeof(bat_volt_char)); //clear out buffer
electronichamsters 12:1049290dd610 612 //convert battery voltage float value to string reprsentation to 2 decimal places, and save the size of string.
electronichamsters 12:1049290dd610 613 total_chars = sprintf (bat_volt_char, "%.2f", bat_reading);
electronichamsters 8:46c5e0bfab05 614
electronichamsters 12:1049290dd610 615
electronichamsters 12:1049290dd610 616 //read and convert analog voltage. Comment out this section if note needed, saves some battery
electronichamsters 10:79e8f92ef156 617 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 618 float analogreading;
electronichamsters 12:1049290dd610 619 analogreading = (float)read_ADC_pin();
electronichamsters 10:79e8f92ef156 620 analogreading = (analogreading * 3.6) / 1024.0;
electronichamsters 10:79e8f92ef156 621 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 622 device.printf("separate analog reading: %.02f \r\n", analogreading);
electronichamsters 10:79e8f92ef156 623 #endif
electronichamsters 10:79e8f92ef156 624
electronichamsters 12:1049290dd610 625 //disable ADC to save power
electronichamsters 8:46c5e0bfab05 626 NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 627 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 628
electronichamsters 12:1049290dd610 629 //read distance using VL6180
electronichamsters 12:1049290dd610 630 float sensor_reading = rf;
electronichamsters 12:1049290dd610 631 uint8_t total_chars_sensor;
electronichamsters 12:1049290dd610 632 memset(&sensor_char[0], 0, sizeof(sensor_char)); //clear out buffer
electronichamsters 12:1049290dd610 633 total_chars_sensor = sprintf (sensor_char, "%.2f", sensor_reading);
electronichamsters 12:1049290dd610 634
electronichamsters 12:1049290dd610 635 //pinHandShake = 0; //enable distance sensor
electronichamsters 10:79e8f92ef156 636
electronichamsters 12:1049290dd610 637 #if MyDebugEnb
electronichamsters 12:1049290dd610 638 device.printf("char buff: %c%c%c%c \r\n", bat_volt_char[0], bat_volt_char[1], bat_volt_char[2], bat_volt_char[3]);
electronichamsters 12:1049290dd610 639 device.printf("num chars: %d \r\n", total_chars);
electronichamsters 12:1049290dd610 640 #endif
electronichamsters 8:46c5e0bfab05 641
electronichamsters 8:46c5e0bfab05 642
electronichamsters 12:1049290dd610 643 //Generate "First Section" for ADV_Data so gateway will recognize our advertisement pattern
electronichamsters 12:1049290dd610 644 hash_first_section(Adv_First_Section, mac_reverse, bat_volt_char);
electronichamsters 8:46c5e0bfab05 645
electronichamsters 10:79e8f92ef156 646
electronichamsters 12:1049290dd610 647 /* ****************************************
electronichamsters 12:1049290dd610 648 * start writing out ADVData array
electronichamsters 12:1049290dd610 649 * todo: this is easy to write but hard to read. Maybe make it easy to read and hard to write?
electronichamsters 12:1049290dd610 650 ******************************************/
electronichamsters 10:79e8f92ef156 651 memset(&AdvData[0], 0, sizeof(AdvData));
electronichamsters 10:79e8f92ef156 652 uint8_t JSON_loc=0; //AdvData[0]
electronichamsters 10:79e8f92ef156 653
electronichamsters 12:1049290dd610 654 AdvData[0] = Adv_First_Section[0]; //"our device" flag, MAC[3]
electronichamsters 12:1049290dd610 655 JSON_loc++; //JSON_loc == 1
electronichamsters 12:1049290dd610 656 AdvData[1] = Adv_First_Section[1]; //"out device" flag, MAC[2]...
electronichamsters 12:1049290dd610 657 JSON_loc++; //JSON_loc == 2
electronichamsters 12:1049290dd610 658 AdvData[2] = Adv_First_Section[2];
electronichamsters 12:1049290dd610 659 JSON_loc++; //JSON_loc == 3
electronichamsters 12:1049290dd610 660 AdvData[3] = Adv_First_Section[3];
electronichamsters 12:1049290dd610 661 JSON_loc++; //JSON_loc == 4
electronichamsters 12:1049290dd610 662 AdvData[4] = Adv_First_Section[4];
electronichamsters 12:1049290dd610 663 JSON_loc++; //JSON_loc == 5
electronichamsters 12:1049290dd610 664 AdvData[5] = Adv_First_Section[5];
electronichamsters 12:1049290dd610 665 JSON_loc++; //JSON_loc == 6
electronichamsters 12:1049290dd610 666 AdvData[6] = Adv_First_Section[6];
electronichamsters 10:79e8f92ef156 667 JSON_loc++;
electronichamsters 12:1049290dd610 668 AdvData[7] = Adv_First_Section[7];
electronichamsters 10:79e8f92ef156 669 JSON_loc++;
electronichamsters 12:1049290dd610 670 AdvData[8] = Adv_First_Section[8];
electronichamsters 10:79e8f92ef156 671 JSON_loc++;
electronichamsters 12:1049290dd610 672 AdvData[9] = Adv_First_Section[9];
electronichamsters 8:46c5e0bfab05 673 JSON_loc++;
electronichamsters 10:79e8f92ef156 674
electronichamsters 12:1049290dd610 675 #if MyDebugEnb
electronichamsters 12:1049290dd610 676 device.printf("ADV first 10 array: ");
electronichamsters 12:1049290dd610 677 for (int i=0; i<10; i++)
electronichamsters 12:1049290dd610 678 {
electronichamsters 12:1049290dd610 679 device.printf("%x ", AdvData[i]);
electronichamsters 12:1049290dd610 680 }
electronichamsters 12:1049290dd610 681 device.printf("\r\n");
electronichamsters 12:1049290dd610 682 #endif
electronichamsters 10:79e8f92ef156 683
electronichamsters 10:79e8f92ef156 684
electronichamsters 10:79e8f92ef156 685 JSON_loc = 10;
electronichamsters 12:1049290dd610 686 //Start of encrypted user data
electronichamsters 12:1049290dd610 687
electronichamsters 12:1049290dd610 688 //[10] and [11] hold 2 bytes for how many seconds since birthday, little endian
electronichamsters 12:1049290dd610 689 AdvData[10] = seconds_Old & 0xFF;
electronichamsters 8:46c5e0bfab05 690 JSON_loc++;
electronichamsters 12:1049290dd610 691 AdvData[11] = (seconds_Old >> 8) & 0xFF;
electronichamsters 10:79e8f92ef156 692 JSON_loc++;
electronichamsters 12:1049290dd610 693
electronichamsters 10:79e8f92ef156 694 AdvData[12] = Xmit_Cnt;
electronichamsters 8:46c5e0bfab05 695 JSON_loc++;
electronichamsters 12:1049290dd610 696
electronichamsters 10:79e8f92ef156 697 //start of jason data
electronichamsters 12:1049290dd610 698 //"mag":
electronichamsters 12:1049290dd610 699 JSON_loc = 13; //hardcode should be 13
electronichamsters 12:1049290dd610 700 AdvData[JSON_loc] = 0x22; //ADV_Data[13] = "
electronichamsters 10:79e8f92ef156 701 JSON_loc++; //14
electronichamsters 8:46c5e0bfab05 702
electronichamsters 12:1049290dd610 703 AdvData[JSON_loc] = 'd'; //ADV_Data[14] = d
electronichamsters 10:79e8f92ef156 704 JSON_loc++; //15
electronichamsters 10:79e8f92ef156 705
electronichamsters 12:1049290dd610 706 AdvData[JSON_loc] = 'i'; //ADV_Data[15] = i
electronichamsters 10:79e8f92ef156 707 JSON_loc++; //16
electronichamsters 10:79e8f92ef156 708
electronichamsters 12:1049290dd610 709 AdvData[JSON_loc] = 's'; //ADV_Data[16] = s
electronichamsters 10:79e8f92ef156 710 JSON_loc++; //17
electronichamsters 8:46c5e0bfab05 711
electronichamsters 12:1049290dd610 712 //for periodic calls, we want to add an extra mqtt level "p", using "/p"
electronichamsters 12:1049290dd610 713 //to delineate between MQTT publishes from real world I/O interrupts vs timer interrupts
electronichamsters 12:1049290dd610 714 if (Flag_Periodic_Call)
electronichamsters 8:46c5e0bfab05 715 {
electronichamsters 12:1049290dd610 716 AdvData[JSON_loc] = 0x2f; // ADV_Data[17] = /
electronichamsters 12:1049290dd610 717 JSON_loc++; //18
electronichamsters 12:1049290dd610 718 AdvData[JSON_loc] = 0x70; // ADV_Data[18] =p
electronichamsters 12:1049290dd610 719 JSON_loc++; //19
electronichamsters 12:1049290dd610 720 }
electronichamsters 8:46c5e0bfab05 721
electronichamsters 12:1049290dd610 722 AdvData[JSON_loc] = 0x22; //ADV_Data[17 or 19] = "
electronichamsters 10:79e8f92ef156 723 JSON_loc++; //20
electronichamsters 8:46c5e0bfab05 724
electronichamsters 12:1049290dd610 725 AdvData[JSON_loc] = 0x3a; //ADV_Data[18 or 20] = :
electronichamsters 12:1049290dd610 726 JSON_loc++; //21
electronichamsters 8:46c5e0bfab05 727
electronichamsters 12:1049290dd610 728 //convert magnet variable to string, for magnet sensor, this is easy
electronichamsters 12:1049290dd610 729 //since we only have 1 or 0, but this also works for analog values
electronichamsters 12:1049290dd610 730 /*
electronichamsters 8:46c5e0bfab05 731 memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 10:79e8f92ef156 732 total_chars = sprintf (buffer, "%d", magnet_near); //returns total number of characters, which is 1 character.
electronichamsters 8:46c5e0bfab05 733 for (int i=0; i < total_chars; i++)
electronichamsters 8:46c5e0bfab05 734 {
electronichamsters 8:46c5e0bfab05 735 AdvData[JSON_loc] = buffer[i];
electronichamsters 10:79e8f92ef156 736 JSON_loc++; //23
electronichamsters 8:46c5e0bfab05 737 } //JSON_loc left at location of next character
electronichamsters 12:1049290dd610 738 */
electronichamsters 8:46c5e0bfab05 739
electronichamsters 12:1049290dd610 740 //memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 12:1049290dd610 741 for (int i=0; i < total_chars_sensor; i++)
electronichamsters 12:1049290dd610 742 {
electronichamsters 12:1049290dd610 743 AdvData[JSON_loc] = sensor_char[i];
electronichamsters 12:1049290dd610 744 JSON_loc++;
electronichamsters 12:1049290dd610 745 } //JSON_loc left at location of next character
electronichamsters 8:46c5e0bfab05 746
electronichamsters 12:1049290dd610 747
electronichamsters 12:1049290dd610 748 //AdvData[JSON_loc] = 0x0; //since AdvData was cleared to start with, we don't need to null term
electronichamsters 8:46c5e0bfab05 749
rgrover1 5:f4d74a8cad43 750 ApplicationData_t appData;
rgrover1 5:f4d74a8cad43 751 setupApplicationData(appData);
electronichamsters 8:46c5e0bfab05 752
electronichamsters 12:1049290dd610 753 /*********************
electronichamsters 12:1049290dd610 754 * start encrypting last 16 bytes of ADV_Data
electronichamsters 12:1049290dd610 755 *********************/
electronichamsters 8:46c5e0bfab05 756 for (int i=0; i<16; i++)
electronichamsters 8:46c5e0bfab05 757 {
electronichamsters 10:79e8f92ef156 758 src_buf[i] = AdvData[i+10]; //start of encrypted section is at AdvData[10]
electronichamsters 8:46c5e0bfab05 759 }
electronichamsters 8:46c5e0bfab05 760 nrf_ecb_init();
electronichamsters 8:46c5e0bfab05 761 nrf_ecb_set_key(key_buf);
electronichamsters 8:46c5e0bfab05 762 bool successful_ecb = nrf_ecb_crypt(des_buf, src_buf);
electronichamsters 12:1049290dd610 763 #if MyDebugEnb
electronichamsters 12:1049290dd610 764 device.printf("success ecb = %d \r\n", successful_ecb);
electronichamsters 12:1049290dd610 765 device.printf("src_buf: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \r\n", src_buf[0], src_buf[1], src_buf[2], src_buf[3], src_buf[4], src_buf[5], src_buf[6], src_buf[7], src_buf[8], src_buf[9], src_buf[10], src_buf[11], src_buf[12], src_buf[13], src_buf[14], src_buf[15]);
electronichamsters 12:1049290dd610 766 device.printf("des_buf: %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \r\n", des_buf[0], des_buf[1], des_buf[2], des_buf[3], des_buf[4], des_buf[5], des_buf[6], des_buf[7], des_buf[8], des_buf[9], des_buf[10], des_buf[11], des_buf[12], des_buf[13], des_buf[14], des_buf[15]);
electronichamsters 12:1049290dd610 767 #endif
electronichamsters 12:1049290dd610 768 for (int i=0; i<16; i++) //replace last 16 bytes with encrypted 16 bytes
electronichamsters 8:46c5e0bfab05 769 {
electronichamsters 10:79e8f92ef156 770 AdvData[i+10] = des_buf[i];
electronichamsters 8:46c5e0bfab05 771 }
electronichamsters 8:46c5e0bfab05 772
electronichamsters 12:1049290dd610 773 //set payload for advertisement to our custom manufactured data. First 5 bytes is BLE standard, last 26 bytes is our array
electronichamsters 8:46c5e0bfab05 774 //ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *) &appData, sizeof(ApplicationData_t));
electronichamsters 8:46c5e0bfab05 775 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 776
electronichamsters 12:1049290dd610 777 Flag_Update_IO = false;
electronichamsters 12:1049290dd610 778 Flag_Periodic_Call = false;
electronichamsters 8:46c5e0bfab05 779
electronichamsters 8:46c5e0bfab05 780 ble.gap().startAdvertising();
electronichamsters 12:1049290dd610 781 Tic_Stop_Adv.attach(stop_adv_Callback, 4); /* trigger turn off advertisement after X seconds */
electronichamsters 8:46c5e0bfab05 782
electronichamsters 12:1049290dd610 783 }//end Flag_Update_IO
electronichamsters 8:46c5e0bfab05 784
electronichamsters 8:46c5e0bfab05 785
electronichamsters 12:1049290dd610 786 if (Flag_Detach_Adv_Tic == true) //ticker callback flag to stop advertising
electronichamsters 8:46c5e0bfab05 787 {
electronichamsters 8:46c5e0bfab05 788 ble.gap().stopAdvertising(); //may be safer to execute BLE operations in main
electronichamsters 12:1049290dd610 789 Tic_Stop_Adv.detach();
electronichamsters 12:1049290dd610 790 Flag_Detach_Adv_Tic = false;
electronichamsters 8:46c5e0bfab05 791 }
electronichamsters 12:1049290dd610 792
electronichamsters 8:46c5e0bfab05 793
electronichamsters 12:1049290dd610 794 ble.waitForEvent(); //sleeps until interrupt form ticker or I/O
electronichamsters 8:46c5e0bfab05 795 }//end forever while
electronichamsters 8:46c5e0bfab05 796 }//end main