BLE washer / dryer sensor

Committer:
electronichamsters
Date:
Tue Jun 19 04:02:25 2018 +0000
Revision:
14:69eb8aa4cbfd
Parent:
13:4b9bbd8d8d1f
comments

Who changed what in which revision?

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