BLE washer / dryer sensor
main.cpp@15:11ccd63ab1d9, 2018-06-19 (annotated)
- Committer:
- electronichamsters
- Date:
- Tue Jun 19 04:05:02 2018 +0000
- Revision:
- 15:11ccd63ab1d9
- Parent:
- 14:69eb8aa4cbfd
main comments
Who changed what in which revision?
User | Revision | Line number | New 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 |