BLE ADV sensor for 2-pin interrupt (i.e. window/door sensor w/ reed switch)

Dependencies:   BLE_API mbed nRF51822

Basic door/window sensor for nRF51822 BLE modules.

Committer:
electronichamsters
Date:
Sat Jul 29 21:49:44 2017 +0000
Revision:
10:79e8f92ef156
Parent:
9:b6302fc4e754
Child:
11:4f925834167d
Added spoof checking

Who changed what in which revision?

UserRevisionLine numberNew contents of line
electronichamsters 10:79e8f92ef156 1 /*
electronichamsters 10:79e8f92ef156 2 Eric Tsai
electronichamsters 8:46c5e0bfab05 3
electronichamsters 10:79e8f92ef156 4 7/29/2017: added clock algorithm to corresond with gateway spoof checking
electronichamsters 10:79e8f92ef156 5
sunsmile2015 0:3dc6e424dba0 6 */
sunsmile2015 0:3dc6e424dba0 7
electronichamsters 8:46c5e0bfab05 8 //required to call the ecb functions
electronichamsters 8:46c5e0bfab05 9 extern "C"
electronichamsters 8:46c5e0bfab05 10 {
electronichamsters 8:46c5e0bfab05 11 #include "nrf_ecb.h"
electronichamsters 8:46c5e0bfab05 12 }
electronichamsters 8:46c5e0bfab05 13
sunsmile2015 0:3dc6e424dba0 14 #include "mbed.h"
rgrover1 5:f4d74a8cad43 15 #include "toolchain.h"
sunsmile2015 0:3dc6e424dba0 16 #include "ble/BLE.h"
sunsmile2015 0:3dc6e424dba0 17 #include "TMP_nrf51/TMP_nrf51.h"
sunsmile2015 0:3dc6e424dba0 18
electronichamsters 8:46c5e0bfab05 19 //comment out when done with debug uart, else eats batteries
electronichamsters 10:79e8f92ef156 20 #define MyDebugEnb 0
electronichamsters 8:46c5e0bfab05 21
electronichamsters 8:46c5e0bfab05 22 //Pin "P0.4" on nRF51822 = mbed "p4".
electronichamsters 8:46c5e0bfab05 23 //InterruptIn is pulled-up. GND the pin to activate.
electronichamsters 8:46c5e0bfab05 24
electronichamsters 8:46c5e0bfab05 25 // waveshare board ******
electronichamsters 8:46c5e0bfab05 26 //InterruptIn button1(p10);
electronichamsters 8:46c5e0bfab05 27 //InterruptIn button2(p11);
electronichamsters 8:46c5e0bfab05 28
electronichamsters 8:46c5e0bfab05 29 // purple board ******
electronichamsters 10:79e8f92ef156 30 //InterruptIn button1(p23);
electronichamsters 10:79e8f92ef156 31 //InterruptIn button2(p24);
electronichamsters 8:46c5e0bfab05 32
electronichamsters 10:79e8f92ef156 33 // universal
electronichamsters 10:79e8f92ef156 34 InterruptIn button1(p0);
electronichamsters 10:79e8f92ef156 35 InterruptIn button2(p1);
electronichamsters 10:79e8f92ef156 36
electronichamsters 10:79e8f92ef156 37 // Rigado BMD200 ******
electronichamsters 10:79e8f92ef156 38 //InterruptIn button1(p4);
electronichamsters 10:79e8f92ef156 39 //InterruptIn button2(p5);
electronichamsters 8:46c5e0bfab05 40
electronichamsters 8:46c5e0bfab05 41 //Serial device(p9, p11); // tx, rx, purple board and Rigado
electronichamsters 8:46c5e0bfab05 42 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 43 // if you see ~1mA consumption during sleep, that's because uart is enabled.
electronichamsters 8:46c5e0bfab05 44 Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11
electronichamsters 8:46c5e0bfab05 45 #endif
electronichamsters 8:46c5e0bfab05 46
electronichamsters 8:46c5e0bfab05 47
electronichamsters 10:79e8f92ef156 48 static Timer myTimer; //timed advertising
electronichamsters 8:46c5e0bfab05 49 static Ticker tic_adv; //stop adv
electronichamsters 8:46c5e0bfab05 50 static Ticker tic_debounce; //debounce I/O
electronichamsters 8:46c5e0bfab05 51 static Ticker tic_periodic; //regular updates
electronichamsters 10:79e8f92ef156 52 static Ticker tic_clock_reset; //resets clock
electronichamsters 10:79e8f92ef156 53 const uint16_t Periodicity = 180; //clock periodicity used for spoof checking, should be 1800 seconds for 30minutes
electronichamsters 8:46c5e0bfab05 54 //static TMP_nrf51 tempSensor;
electronichamsters 8:46c5e0bfab05 55 static bool flag_update_io = false;
electronichamsters 8:46c5e0bfab05 56 static bool flag_periodic_call = false;
electronichamsters 8:46c5e0bfab05 57 static bool flag_detach_adv_tic = false;
electronichamsters 8:46c5e0bfab05 58 static bool flag_set_debounce_tic = false; //not used
electronichamsters 8:46c5e0bfab05 59
electronichamsters 8:46c5e0bfab05 60 //static DigitalOut alivenessLED(LED1, 1);
electronichamsters 8:46c5e0bfab05 61 float mySensor = 2.0f;
electronichamsters 8:46c5e0bfab05 62
electronichamsters 8:46c5e0bfab05 63
electronichamsters 8:46c5e0bfab05 64 /* Optional: Device Name, add for human read-ability */
electronichamsters 8:46c5e0bfab05 65 const static char DEVICE_NAME[] = "CUU";
rgrover1 5:f4d74a8cad43 66
electronichamsters 8:46c5e0bfab05 67 /* You have up to 26 bytes of advertising data to use. */
electronichamsters 8:46c5e0bfab05 68 /*
electronichamsters 8:46c5e0bfab05 69 Advertisement
electronichamsters 8:46c5e0bfab05 70
electronichamsters 8:46c5e0bfab05 71 DECvolt:3.11111111,mag:1
electronichamsters 8:46c5e0bfab05 72 AdvData[0-2] = Look for DEC on observer
electronichamsters 8:46c5e0bfab05 73 AdvData[3] = beginning of data
electronichamsters 8:46c5e0bfab05 74 */
electronichamsters 8:46c5e0bfab05 75 //full with nullls
electronichamsters 8:46c5e0bfab05 76 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}; /* Example of hex data */
electronichamsters 8:46c5e0bfab05 77 char buffer[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //battery analog reading
electronichamsters 10:79e8f92ef156 78 char bat_volt_char[6] = {0, 0, 0, 0, 0, 0};
electronichamsters 10:79e8f92ef156 79 uint8_t Adv_First_Section[10];
electronichamsters 10:79e8f92ef156 80 uint8_t mac_reverse[6] = {0x0,0x0,0x0,0x0,0x0,0x0};
electronichamsters 8:46c5e0bfab05 81 uint8_t magnet_near=0;
electronichamsters 8:46c5e0bfab05 82
electronichamsters 8:46c5e0bfab05 83
electronichamsters 8:46c5e0bfab05 84
electronichamsters 8:46c5e0bfab05 85 static uint8_t key[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 8:46c5e0bfab05 86 //26 bytes adv data
electronichamsters 8:46c5e0bfab05 87 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 88 //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 89 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 90 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 91 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 92
electronichamsters 10:79e8f92ef156 93 uint8_t Xmit_Cnt = 1;
electronichamsters 8:46c5e0bfab05 94 //const static uint8_t AdvData[] = {"ChangeThisData"}; /* Example of character data */
electronichamsters 8:46c5e0bfab05 95
electronichamsters 8:46c5e0bfab05 96
electronichamsters 8:46c5e0bfab05 97
electronichamsters 8:46c5e0bfab05 98 /* **** NOT USED **** */
electronichamsters 8:46c5e0bfab05 99 //16byte UUID loading happens here
electronichamsters 8:46c5e0bfab05 100 //Look at <GapAdvertisingData.h> for rest of definition
sunsmile2015 4:e5fa4c8838db 101 struct ApplicationData_t {
electronichamsters 8:46c5e0bfab05 102 //Byte 0: AppID High Byte
electronichamsters 8:46c5e0bfab05 103 //Byte 1: AppID Low Byte
electronichamsters 8:46c5e0bfab05 104 //Byte 2: sensor High Word
electronichamsters 8:46c5e0bfab05 105 //Byte 3:
electronichamsters 8:46c5e0bfab05 106 //Byte 4:
electronichamsters 8:46c5e0bfab05 107 //Byte 5: sensor Low Byte
electronichamsters 8:46c5e0bfab05 108
electronichamsters 8:46c5e0bfab05 109
electronichamsters 8:46c5e0bfab05 110 //app ID is 16 bit, (0xFEFE)
electronichamsters 8:46c5e0bfab05 111 uint16_t applicationSpecificId; /* An ID used to identify temperature value in the manufacture specific AD data field */
electronichamsters 8:46c5e0bfab05 112
electronichamsters 8:46c5e0bfab05 113 //float = 32-bit.
electronichamsters 8:46c5e0bfab05 114 //tsai: change this to uint32_t!!!
electronichamsters 8:46c5e0bfab05 115 TMP_nrf51::TempSensorValue_t tmpSensorValue; /* this is a float (32-bit), user data */
rgrover1 5:f4d74a8cad43 116 } PACKED;
sunsmile2015 0:3dc6e424dba0 117
electronichamsters 8:46c5e0bfab05 118
electronichamsters 8:46c5e0bfab05 119
electronichamsters 8:46c5e0bfab05 120 void debounce_Callback(void)
electronichamsters 8:46c5e0bfab05 121 {
electronichamsters 8:46c5e0bfab05 122 tic_debounce.detach();
electronichamsters 8:46c5e0bfab05 123 flag_set_debounce_tic = false; //not used
electronichamsters 8:46c5e0bfab05 124 flag_update_io = true; //start advertising
electronichamsters 8:46c5e0bfab05 125 /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
electronichamsters 8:46c5e0bfab05 126 * BLE device API from the main thread. */
electronichamsters 8:46c5e0bfab05 127 //buttonState = PRESSED;
electronichamsters 8:46c5e0bfab05 128 }
electronichamsters 8:46c5e0bfab05 129
electronichamsters 8:46c5e0bfab05 130 //----- button rising ---
electronichamsters 8:46c5e0bfab05 131 void buttonPressedCallback(void)
sunsmile2015 2:b935358da5ba 132 {
electronichamsters 8:46c5e0bfab05 133
electronichamsters 8:46c5e0bfab05 134
electronichamsters 8:46c5e0bfab05 135 //flag_update_io = true;
electronichamsters 8:46c5e0bfab05 136
electronichamsters 8:46c5e0bfab05 137 tic_debounce.attach(debounce_Callback, 1); //ok to attach multiple times, first one wins
electronichamsters 8:46c5e0bfab05 138
electronichamsters 8:46c5e0bfab05 139
electronichamsters 8:46c5e0bfab05 140 //buttonState = PRESSED;
electronichamsters 8:46c5e0bfab05 141
electronichamsters 8:46c5e0bfab05 142 /*
electronichamsters 8:46c5e0bfab05 143 if (flag_set_debounce_tic == false)
electronichamsters 8:46c5e0bfab05 144 {
electronichamsters 8:46c5e0bfab05 145 flag_set_debounce_tic = true;
electronichamsters 8:46c5e0bfab05 146
electronichamsters 8:46c5e0bfab05 147 }
electronichamsters 8:46c5e0bfab05 148 */
electronichamsters 8:46c5e0bfab05 149 }
rgrover1 5:f4d74a8cad43 150
electronichamsters 8:46c5e0bfab05 151 //----- button falling ---
electronichamsters 8:46c5e0bfab05 152 void buttonReleasedCallback(void)
electronichamsters 8:46c5e0bfab05 153 {
electronichamsters 8:46c5e0bfab05 154
electronichamsters 8:46c5e0bfab05 155
electronichamsters 8:46c5e0bfab05 156 //flag_update_io = true;
electronichamsters 8:46c5e0bfab05 157
electronichamsters 8:46c5e0bfab05 158 tic_debounce.attach(debounce_Callback, 1);
electronichamsters 8:46c5e0bfab05 159
electronichamsters 8:46c5e0bfab05 160
electronichamsters 8:46c5e0bfab05 161
electronichamsters 8:46c5e0bfab05 162 }
electronichamsters 8:46c5e0bfab05 163
electronichamsters 8:46c5e0bfab05 164
electronichamsters 8:46c5e0bfab05 165 void stop_adv_Callback(void)
electronichamsters 8:46c5e0bfab05 166 {
electronichamsters 8:46c5e0bfab05 167 //stops advertising after X seconds
electronichamsters 8:46c5e0bfab05 168 /* Note that the Callback() executes in interrupt context, so it is safer to do
rgrover1 5:f4d74a8cad43 169 * heavy-weight sensor polling from the main thread (where we should be able to block safely, if needed). */
electronichamsters 8:46c5e0bfab05 170
electronichamsters 8:46c5e0bfab05 171 //tic_adv.detach();
electronichamsters 8:46c5e0bfab05 172
electronichamsters 8:46c5e0bfab05 173 flag_detach_adv_tic = true;
electronichamsters 8:46c5e0bfab05 174 //ble.gap().stopAdvertising();
electronichamsters 8:46c5e0bfab05 175
electronichamsters 8:46c5e0bfab05 176
electronichamsters 8:46c5e0bfab05 177 }
electronichamsters 8:46c5e0bfab05 178
electronichamsters 8:46c5e0bfab05 179
electronichamsters 8:46c5e0bfab05 180
electronichamsters 8:46c5e0bfab05 181
electronichamsters 8:46c5e0bfab05 182
electronichamsters 8:46c5e0bfab05 183 void periodic_Callback(void)
electronichamsters 8:46c5e0bfab05 184 {
electronichamsters 8:46c5e0bfab05 185 flag_update_io = true;
electronichamsters 8:46c5e0bfab05 186 flag_periodic_call = true;
sunsmile2015 4:e5fa4c8838db 187 }
sunsmile2015 4:e5fa4c8838db 188
electronichamsters 10:79e8f92ef156 189 void clock_reset_Callback(void)
electronichamsters 10:79e8f92ef156 190 {
electronichamsters 10:79e8f92ef156 191 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 192 device.printf("===== reset timer =====");
electronichamsters 10:79e8f92ef156 193 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 194 #endif
electronichamsters 10:79e8f92ef156 195 myTimer.reset();
electronichamsters 10:79e8f92ef156 196 };
electronichamsters 10:79e8f92ef156 197
rgrover1 5:f4d74a8cad43 198 void setupApplicationData(ApplicationData_t &appData)
sunsmile2015 4:e5fa4c8838db 199 {
electronichamsters 8:46c5e0bfab05 200 // two byte ID: 0xFEFE
electronichamsters 8:46c5e0bfab05 201 static const uint16_t APP_SPECIFIC_ID_TEST = 0xFEFE; //2 byte application ID
andresag 7:0a8bbb6dea16 202
sunsmile2015 4:e5fa4c8838db 203 appData.applicationSpecificId = APP_SPECIFIC_ID_TEST;
electronichamsters 8:46c5e0bfab05 204 //appData.tmpSensorValue = tempSensor.get();
electronichamsters 8:46c5e0bfab05 205 appData.tmpSensorValue = mySensor;
sunsmile2015 0:3dc6e424dba0 206 }
sunsmile2015 0:3dc6e424dba0 207
electronichamsters 8:46c5e0bfab05 208
electronichamsters 8:46c5e0bfab05 209
andresag 7:0a8bbb6dea16 210 /**
andresag 7:0a8bbb6dea16 211 * This function is called when the ble initialization process has failled
andresag 7:0a8bbb6dea16 212 */
andresag 7:0a8bbb6dea16 213 void onBleInitError(BLE &ble, ble_error_t error)
andresag 7:0a8bbb6dea16 214 {
andresag 7:0a8bbb6dea16 215 /* Initialization error handling should go here */
andresag 7:0a8bbb6dea16 216 }
andresag 7:0a8bbb6dea16 217
andresag 7:0a8bbb6dea16 218 /**
andresag 7:0a8bbb6dea16 219 * Callback triggered when the ble initialization process has finished
andresag 7:0a8bbb6dea16 220 */
andresag 7:0a8bbb6dea16 221 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sunsmile2015 2:b935358da5ba 222 {
andresag 7:0a8bbb6dea16 223 BLE& ble = params->ble;
andresag 7:0a8bbb6dea16 224 ble_error_t error = params->error;
andresag 7:0a8bbb6dea16 225
andresag 7:0a8bbb6dea16 226 if (error != BLE_ERROR_NONE) {
andresag 7:0a8bbb6dea16 227 /* In case of error, forward the error handling to onBleInitError */
andresag 7:0a8bbb6dea16 228 onBleInitError(ble, error);
andresag 7:0a8bbb6dea16 229 return;
andresag 7:0a8bbb6dea16 230 }
andresag 7:0a8bbb6dea16 231
andresag 7:0a8bbb6dea16 232 /* Ensure that it is the default instance of BLE */
andresag 7:0a8bbb6dea16 233 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 7:0a8bbb6dea16 234 return;
andresag 7:0a8bbb6dea16 235 }
electronichamsters 8:46c5e0bfab05 236
electronichamsters 8:46c5e0bfab05 237 /* Set device name characteristic data */
electronichamsters 8:46c5e0bfab05 238 ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME);
andresag 7:0a8bbb6dea16 239
rgrover1 5:f4d74a8cad43 240 /* Setup advertising payload */
electronichamsters 8:46c5e0bfab05 241 //set modes "no EDR", "discoverable" for beacon type advertisements
rgrover1 5:f4d74a8cad43 242 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
electronichamsters 8:46c5e0bfab05 243
electronichamsters 8:46c5e0bfab05 244 //set device profile in ADV/GATT
electronichamsters 8:46c5e0bfab05 245 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER);
electronichamsters 8:46c5e0bfab05 246
electronichamsters 8:46c5e0bfab05 247 //set advertising data (ADV data)
electronichamsters 8:46c5e0bfab05 248 //ApplicationData_t appData;
electronichamsters 8:46c5e0bfab05 249 //setupApplicationData(appData);
electronichamsters 8:46c5e0bfab05 250 //in /BLE_API/ble/GapAdvertisingData.h: sets payload (uuid)
electronichamsters 8:46c5e0bfab05 251 //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&appData, sizeof(ApplicationData_t));
electronichamsters 8:46c5e0bfab05 252
electronichamsters 8:46c5e0bfab05 253 //from GAP example
electronichamsters 8:46c5e0bfab05 254 /* Sacrifice 2B of 31B to AdvType overhead, rest goes to AdvData array you define */
electronichamsters 8:46c5e0bfab05 255 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 256
electronichamsters 8:46c5e0bfab05 257 /* Setup advertising parameters: not connectable */
electronichamsters 8:46c5e0bfab05 258 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
electronichamsters 8:46c5e0bfab05 259 ble.gap().setAdvertisingInterval(300); //one advertisment every 300ms. Self tickers, so you don't have to worry.
electronichamsters 8:46c5e0bfab05 260
electronichamsters 8:46c5e0bfab05 261
electronichamsters 8:46c5e0bfab05 262
electronichamsters 8:46c5e0bfab05 263 //don't start advertising on init. Only advertise on pin interrupt.
electronichamsters 8:46c5e0bfab05 264 //ble.gap().startAdvertising();
electronichamsters 8:46c5e0bfab05 265 }
electronichamsters 8:46c5e0bfab05 266
rgrover1 5:f4d74a8cad43 267
electronichamsters 8:46c5e0bfab05 268 //https://developer.mbed.org/users/MarceloSalazar/notebook/measuring-battery-voltage-with-nordic-nrf51x/
electronichamsters 8:46c5e0bfab05 269 void my_analogin_init(void)
electronichamsters 8:46c5e0bfab05 270 {
electronichamsters 10:79e8f92ef156 271
electronichamsters 8:46c5e0bfab05 272 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 8:46c5e0bfab05 273 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 274 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 8:46c5e0bfab05 275 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 8:46c5e0bfab05 276 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 277 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 8:46c5e0bfab05 278 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 279 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 280 }
sunsmile2015 2:b935358da5ba 281
electronichamsters 8:46c5e0bfab05 282 uint16_t my_analogin_read_u16(void)
electronichamsters 8:46c5e0bfab05 283 {
electronichamsters 10:79e8f92ef156 284 //10 bit resolution, route Vdd as analog input, set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 285 //disable analog pin select "PSEL" because we're using Vdd as analog input
electronichamsters 10:79e8f92ef156 286 //no external voltage reference
electronichamsters 10:79e8f92ef156 287 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 288 (ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 289 //(ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 290 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 291 (ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 292 //(ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 293 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 294
electronichamsters 10:79e8f92ef156 295 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 296 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 297 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 10:79e8f92ef156 298 NRF_ADC->TASKS_START = 1;
electronichamsters 10:79e8f92ef156 299
electronichamsters 10:79e8f92ef156 300
electronichamsters 10:79e8f92ef156 301 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 10:79e8f92ef156 302 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 10:79e8f92ef156 303 wait_ms(2);
electronichamsters 10:79e8f92ef156 304
electronichamsters 10:79e8f92ef156 305 //save off RESULT before disabling.
electronichamsters 10:79e8f92ef156 306 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 10:79e8f92ef156 307
electronichamsters 10:79e8f92ef156 308 //disable ADC to lower bat consumption
electronichamsters 10:79e8f92ef156 309 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 310 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 10:79e8f92ef156 311
electronichamsters 10:79e8f92ef156 312 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 10:79e8f92ef156 313 //return myresult;
electronichamsters 10:79e8f92ef156 314 }
electronichamsters 10:79e8f92ef156 315
electronichamsters 10:79e8f92ef156 316 uint16_t my_analog_pin_read(void)
electronichamsters 10:79e8f92ef156 317 {
electronichamsters 10:79e8f92ef156 318
electronichamsters 10:79e8f92ef156 319 //10 bit resolution, route PSEL pin as 1/3 input sel,
electronichamsters 10:79e8f92ef156 320 //set ADC ref to VBG band gap
electronichamsters 10:79e8f92ef156 321 //set AnalogInput4 as input pin (this is P0.03)
electronichamsters 10:79e8f92ef156 322 //no external voltage reference
electronichamsters 10:79e8f92ef156 323 NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) |
electronichamsters 10:79e8f92ef156 324 //(ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 325 (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) |
electronichamsters 10:79e8f92ef156 326 (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) |
electronichamsters 10:79e8f92ef156 327 //ADC_CONFIG_PSEL_Disabled << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 328 (ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos) |
electronichamsters 10:79e8f92ef156 329 (ADC_CONFIG_EXTREFSEL_None << ADC_CONFIG_EXTREFSEL_Pos);
electronichamsters 10:79e8f92ef156 330 //set pin select to AnalogInput4 = pin 7 = p0.03 = AIN4
electronichamsters 10:79e8f92ef156 331 //NRF_ADC->CONFIG &= ~ADC_CONFIG_PSEL_Msk;
electronichamsters 10:79e8f92ef156 332 //NRF_ADC->CONFIG |= ADC_CONFIG_PSEL_AnalogInput4 << ADC_CONFIG_PSEL_Pos;
electronichamsters 10:79e8f92ef156 333 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Enabled;
electronichamsters 8:46c5e0bfab05 334 NRF_ADC->TASKS_START = 1;
electronichamsters 8:46c5e0bfab05 335
electronichamsters 8:46c5e0bfab05 336
electronichamsters 8:46c5e0bfab05 337 //while loop doesn't actually loop until reading comlete, use a wait.
electronichamsters 8:46c5e0bfab05 338 while (((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) >> ADC_BUSY_BUSY_Pos) == ADC_BUSY_BUSY_Busy) {};
electronichamsters 8:46c5e0bfab05 339 wait_ms(2);
electronichamsters 8:46c5e0bfab05 340
electronichamsters 8:46c5e0bfab05 341 //save off RESULT before disabling.
electronichamsters 8:46c5e0bfab05 342 //uint16_t myresult = (uint16_t)NRF_ADC->RESULT;
electronichamsters 8:46c5e0bfab05 343
electronichamsters 8:46c5e0bfab05 344 //disable ADC to lower bat consumption
electronichamsters 8:46c5e0bfab05 345 //NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 346 //NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 347
electronichamsters 8:46c5e0bfab05 348 return (uint16_t)NRF_ADC->RESULT; // 10 bit
electronichamsters 8:46c5e0bfab05 349 //return myresult;
sunsmile2015 4:e5fa4c8838db 350 }
sunsmile2015 4:e5fa4c8838db 351
electronichamsters 10:79e8f92ef156 352
electronichamsters 10:79e8f92ef156 353 //hash_first_section(Adv_First_Section, mac_reverse, bat_reading);
electronichamsters 10:79e8f92ef156 354 void hash_first_section(uint8_t * dest, const uint8_t * mac_addr, const char * bat_volt_str)
electronichamsters 10:79e8f92ef156 355 {
electronichamsters 10:79e8f92ef156 356 dest[0] = mac_addr[3];
electronichamsters 10:79e8f92ef156 357 dest[1] = mac_addr[2];
electronichamsters 10:79e8f92ef156 358 dest[2] = mac_addr[1];
electronichamsters 10:79e8f92ef156 359 dest[3] = mac_addr[0];
electronichamsters 10:79e8f92ef156 360 dest[4] = bat_volt_str[0];
electronichamsters 10:79e8f92ef156 361 dest[5] = bat_volt_str[1];
electronichamsters 10:79e8f92ef156 362 dest[6] = bat_volt_str[2];
electronichamsters 10:79e8f92ef156 363 dest[7] = bat_volt_str[3];
electronichamsters 10:79e8f92ef156 364 dest[8] = 0x10;
electronichamsters 10:79e8f92ef156 365 dest[9] = 0x11;
electronichamsters 10:79e8f92ef156 366 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 367
electronichamsters 10:79e8f92ef156 368 device.printf("hash array: ");
electronichamsters 10:79e8f92ef156 369 for (int i=0; i<10; i++)
electronichamsters 10:79e8f92ef156 370 {
electronichamsters 10:79e8f92ef156 371 device.printf("%x ", dest[i]);
electronichamsters 10:79e8f92ef156 372 }
electronichamsters 10:79e8f92ef156 373 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 374 #endif
electronichamsters 10:79e8f92ef156 375 }
electronichamsters 10:79e8f92ef156 376
electronichamsters 10:79e8f92ef156 377
electronichamsters 10:79e8f92ef156 378 uint16_t clock_remainder = 0;
electronichamsters 10:79e8f92ef156 379
sunsmile2015 2:b935358da5ba 380 int main(void)
sunsmile2015 2:b935358da5ba 381 {
electronichamsters 8:46c5e0bfab05 382
electronichamsters 8:46c5e0bfab05 383 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 384 device.baud(9600);
electronichamsters 8:46c5e0bfab05 385 device.printf("started sensor node 36 ");
electronichamsters 8:46c5e0bfab05 386 device.printf("\r\n");
electronichamsters 8:46c5e0bfab05 387 #endif
electronichamsters 8:46c5e0bfab05 388
electronichamsters 8:46c5e0bfab05 389
electronichamsters 8:46c5e0bfab05 390
electronichamsters 10:79e8f92ef156 391 //Timer myTimer; //moved to global
electronichamsters 8:46c5e0bfab05 392 myTimer.start();
electronichamsters 8:46c5e0bfab05 393
electronichamsters 8:46c5e0bfab05 394
electronichamsters 8:46c5e0bfab05 395 AdvData[0] = 0x44; //D
electronichamsters 8:46c5e0bfab05 396 AdvData[1] = 0x45; //E
electronichamsters 8:46c5e0bfab05 397 AdvData[2] = 0x43; //C
electronichamsters 8:46c5e0bfab05 398 AdvData[3] = 0x22; //"
electronichamsters 8:46c5e0bfab05 399 AdvData[4] = 0x76; //V volt
electronichamsters 8:46c5e0bfab05 400 AdvData[5] = 0x6f; //o
electronichamsters 8:46c5e0bfab05 401 AdvData[6] = 0x22; //"
electronichamsters 8:46c5e0bfab05 402 AdvData[7] = 0x3a; //:
electronichamsters 8:46c5e0bfab05 403 AdvData[8] = 0x24; //3 #
electronichamsters 8:46c5e0bfab05 404 AdvData[9] = 0x24; //. #
electronichamsters 8:46c5e0bfab05 405 AdvData[10] = 0x24; //1 #
electronichamsters 8:46c5e0bfab05 406 AdvData[11] = 0x24; //1 #
electronichamsters 8:46c5e0bfab05 407 AdvData[12] = 0x2c; //,
electronichamsters 8:46c5e0bfab05 408 AdvData[13] = 0x22; //" mag
electronichamsters 8:46c5e0bfab05 409 AdvData[14] = 0x6d; //a
electronichamsters 8:46c5e0bfab05 410 AdvData[15] = 0x22; //"
electronichamsters 8:46c5e0bfab05 411 AdvData[16] = 0x3a; //:
electronichamsters 8:46c5e0bfab05 412 AdvData[17] = 0x24; //0 or 1, 30 or 31
electronichamsters 8:46c5e0bfab05 413
electronichamsters 8:46c5e0bfab05 414 button1.fall(buttonPressedCallback);
electronichamsters 8:46c5e0bfab05 415 button1.rise(buttonReleasedCallback);
electronichamsters 8:46c5e0bfab05 416 button1.mode(PullNone);
electronichamsters 8:46c5e0bfab05 417 button1.fall(NULL);
electronichamsters 8:46c5e0bfab05 418 button1.rise(NULL);
sunsmile2015 0:3dc6e424dba0 419
andresag 7:0a8bbb6dea16 420 BLE &ble = BLE::Instance();
andresag 7:0a8bbb6dea16 421 ble.init(bleInitComplete);
electronichamsters 8:46c5e0bfab05 422
electronichamsters 8:46c5e0bfab05 423 //debug uart
electronichamsters 8:46c5e0bfab05 424 //device.baud(115200);
electronichamsters 8:46c5e0bfab05 425 float bat_reading; //hold battery voltage reading (Vbg/Vcc)
electronichamsters 8:46c5e0bfab05 426
electronichamsters 8:46c5e0bfab05 427 my_analogin_init();//routes band-gap to analog input
andresag 7:0a8bbb6dea16 428
andresag 7:0a8bbb6dea16 429 /* SpinWait for initialization to complete. This is necessary because the
andresag 7:0a8bbb6dea16 430 * BLE object is used in the main loop below. */
electronichamsters 8:46c5e0bfab05 431 while (ble.hasInitialized() == false) { /* spin loop */ }
electronichamsters 8:46c5e0bfab05 432
electronichamsters 8:46c5e0bfab05 433 //every X seconds, sends period update, up to 1800 (30 minutes)
electronichamsters 10:79e8f92ef156 434 tic_periodic.attach(periodic_Callback, 1600);
electronichamsters 10:79e8f92ef156 435 tic_clock_reset.attach(clock_reset_Callback, Periodicity);
electronichamsters 10:79e8f92ef156 436
electronichamsters 10:79e8f92ef156 437 //how to generate random number using die tempearature
electronichamsters 10:79e8f92ef156 438 uint32_t myTempRand;
electronichamsters 10:79e8f92ef156 439 uint32_t * p_temp;
electronichamsters 10:79e8f92ef156 440 //get temperature for random number
electronichamsters 10:79e8f92ef156 441 //SVCALL(SD_TEMP_GET, myTempRand, sd_temp_get(p_temp));
electronichamsters 10:79e8f92ef156 442 //sd_temp_get(& myTempRand);
rgrover1 5:f4d74a8cad43 443
electronichamsters 10:79e8f92ef156 444
electronichamsters 10:79e8f92ef156 445 ble.getAddress(0,mac_reverse); //NOTE: last byte of MAC (as shown on phone app) is at mac[0], not mac[6];
electronichamsters 10:79e8f92ef156 446 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 447 device.printf("mac = ");
electronichamsters 10:79e8f92ef156 448 for (int i=0; i<6; i++) //prints out MAC address in reverse order; opps.
electronichamsters 10:79e8f92ef156 449 {
electronichamsters 10:79e8f92ef156 450 device.printf("%x:", mac_reverse[i]);
electronichamsters 10:79e8f92ef156 451 }
electronichamsters 10:79e8f92ef156 452 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 453 #endif
sunsmile2015 0:3dc6e424dba0 454 while (true) {
electronichamsters 10:79e8f92ef156 455 //seconds counts to 35 minutes: mySeconds=2142, then 63392 which should be 2450 but isn't.
electronichamsters 10:79e8f92ef156 456 //00001000,01011110 -> 11110111,10100000
electronichamsters 10:79e8f92ef156 457 uint16_t mySeconds =(uint16_t)(myTimer.read_ms()/1000); //problem: mySeconds is only 2 byte
electronichamsters 10:79e8f92ef156 458 //xmit_cnt++;
electronichamsters 10:79e8f92ef156 459 //if (mySeconds > 1800)
electronichamsters 10:79e8f92ef156 460 //{
electronichamsters 10:79e8f92ef156 461 // myTimer.reset();
electronichamsters 10:79e8f92ef156 462 //clock_remainder = mySeconds - 1800;
electronichamsters 10:79e8f92ef156 463 //}
electronichamsters 10:79e8f92ef156 464 //mySeconds = mySeconds + clock_remainder; l3kjl3
electronichamsters 8:46c5e0bfab05 465
electronichamsters 8:46c5e0bfab05 466 //reading the ADV value, only goes up to 0-255;
electronichamsters 8:46c5e0bfab05 467 //reading the uart: current time in seconds: -1782, goes negative.
electronichamsters 8:46c5e0bfab05 468 //need to be able to count 1800 seconds since that's the length of timer.
electronichamsters 8:46c5e0bfab05 469
electronichamsters 8:46c5e0bfab05 470 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 471 device.printf("current time in seconds: %d \r\n", mySeconds);
electronichamsters 8:46c5e0bfab05 472 #endif
electronichamsters 8:46c5e0bfab05 473 //**** set which pin should be interrupt, set pullups ***
electronichamsters 8:46c5e0bfab05 474
electronichamsters 8:46c5e0bfab05 475 //set both pins to pull-up, so they're not floating when we read state
electronichamsters 8:46c5e0bfab05 476 button1.mode(PullUp);
electronichamsters 8:46c5e0bfab05 477 button2.mode(PullUp);
electronichamsters 8:46c5e0bfab05 478
electronichamsters 8:46c5e0bfab05 479 //wait_ms(300); //contact settle
electronichamsters 8:46c5e0bfab05 480
electronichamsters 8:46c5e0bfab05 481
electronichamsters 8:46c5e0bfab05 482 //AdvData[12] is automatically CR? why?
electronichamsters 8:46c5e0bfab05 483
electronichamsters 8:46c5e0bfab05 484 //0x33 0x2E 0x33 0x32 0x13
electronichamsters 8:46c5e0bfab05 485 // 3 . 3 2 CR
electronichamsters 8:46c5e0bfab05 486
electronichamsters 8:46c5e0bfab05 487 //expect either button1 or button2 is grounded, b/c using SPDT reed switch
electronichamsters 8:46c5e0bfab05 488 //the "common" pin on the reed switch should be on GND
electronichamsters 8:46c5e0bfab05 489 uint8_t button1_state = button1.read();
electronichamsters 8:46c5e0bfab05 490 uint8_t button2_state = button2.read();
electronichamsters 8:46c5e0bfab05 491
electronichamsters 8:46c5e0bfab05 492
electronichamsters 8:46c5e0bfab05 493 //let's just update the pins on every wake. Insurance against const drain.
electronichamsters 8:46c5e0bfab05 494 //if state == 0, pin is grounded. Unset interrupt and float pin
electronichamsters 8:46c5e0bfab05 495 //set the other input
electronichamsters 8:46c5e0bfab05 496 if ( (button1_state == 0) && (button2_state == 1) )
electronichamsters 8:46c5e0bfab05 497 {
electronichamsters 8:46c5e0bfab05 498 magnet_near = 1;
electronichamsters 8:46c5e0bfab05 499 //AdvData[4] = 0x11; //dont' set ADV data directly. Using json now, need spacing
electronichamsters 8:46c5e0bfab05 500 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 501 button1.fall(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 502 button1.rise(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 503 button1.mode(PullNone); //float pin to save battery
electronichamsters 8:46c5e0bfab05 504
electronichamsters 8:46c5e0bfab05 505 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 10:79e8f92ef156 506 button2.fall(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 507 button2.rise(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 508 button2.mode(PullUp); //pull up on pin to get interrupt
electronichamsters 10:79e8f92ef156 509 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 510 device.printf("=== button 1! %d seconds=== \r\n", mySeconds);
electronichamsters 10:79e8f92ef156 511 #endif
electronichamsters 8:46c5e0bfab05 512 }
electronichamsters 8:46c5e0bfab05 513 else if ( (button1_state == 1) && (button2_state == 0) ) //assume other pin is open circuit
electronichamsters 8:46c5e0bfab05 514 {
electronichamsters 8:46c5e0bfab05 515 magnet_near = 0;
electronichamsters 8:46c5e0bfab05 516 //AdvData[4] = 0x22; //dont' set ADV data directly. Using json now, need spacing
electronichamsters 8:46c5e0bfab05 517 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 10:79e8f92ef156 518 button1.fall(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 519 button1.rise(buttonReleasedCallback); //enable interrupt
electronichamsters 10:79e8f92ef156 520 button1.mode(PullUp); //pull up on pin to get interrupt
electronichamsters 8:46c5e0bfab05 521
electronichamsters 8:46c5e0bfab05 522 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 523 button2.fall(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 524 button2.rise(NULL); //disable interrupt
electronichamsters 8:46c5e0bfab05 525 button2.mode(PullNone); //float pin to save battery
electronichamsters 10:79e8f92ef156 526 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 527 device.printf("=== button 2! === %d seconds\r\n", mySeconds);
electronichamsters 10:79e8f92ef156 528 #endif
electronichamsters 8:46c5e0bfab05 529 }
electronichamsters 8:46c5e0bfab05 530 else //odd state, shouldn't happen, suck battery and pullup both pins
electronichamsters 8:46c5e0bfab05 531 {
electronichamsters 8:46c5e0bfab05 532 magnet_near = 2;
electronichamsters 8:46c5e0bfab05 533 //AdvData[4] = 0x33;
electronichamsters 8:46c5e0bfab05 534 //button1.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 535 button1.fall(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 536 button1.rise(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 537 button1.mode(PullUp); //float pin to save battery
electronichamsters 8:46c5e0bfab05 538
electronichamsters 8:46c5e0bfab05 539 //button2.disable_irq() //don't know if disables IRQ on port or pin
electronichamsters 8:46c5e0bfab05 540 button2.fall(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 541 button2.rise(buttonReleasedCallback); //disable interrupt
electronichamsters 8:46c5e0bfab05 542 button2.mode(PullUp); //float pin to save battery
electronichamsters 10:79e8f92ef156 543 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 544 device.printf("no buttons!! %d seconds\r\n", mySeconds);
electronichamsters 10:79e8f92ef156 545 #endif
electronichamsters 8:46c5e0bfab05 546 }
electronichamsters 8:46c5e0bfab05 547
electronichamsters 8:46c5e0bfab05 548
electronichamsters 8:46c5e0bfab05 549 if (flag_update_io) {
andresag 7:0a8bbb6dea16 550 /* Do blocking calls or whatever hardware-specific action is
andresag 7:0a8bbb6dea16 551 * necessary to poll the sensor. */
electronichamsters 8:46c5e0bfab05 552
electronichamsters 10:79e8f92ef156 553 Xmit_Cnt++; //increment transmit counter when updating I/O
electronichamsters 10:79e8f92ef156 554
electronichamsters 10:79e8f92ef156 555
electronichamsters 10:79e8f92ef156 556 //read battery voltage
electronichamsters 8:46c5e0bfab05 557 //analog reading consumes 940uA if not disabled
electronichamsters 10:79e8f92ef156 558
electronichamsters 10:79e8f92ef156 559
electronichamsters 8:46c5e0bfab05 560 bat_reading = (float)my_analogin_read_u16();
electronichamsters 10:79e8f92ef156 561
electronichamsters 8:46c5e0bfab05 562 bat_reading = (bat_reading * 3.6) / 1024.0;
electronichamsters 8:46c5e0bfab05 563 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 564 device.printf("bat reading: %f \r\n", bat_reading);
electronichamsters 8:46c5e0bfab05 565 #endif
electronichamsters 8:46c5e0bfab05 566
electronichamsters 8:46c5e0bfab05 567 //memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 8:46c5e0bfab05 568 //sprintf (buffer, "%f.2", bat_reading); //don't know what i'm doing
electronichamsters 8:46c5e0bfab05 569 //sprintf (buffer, "%.2f", bat_reading);
electronichamsters 8:46c5e0bfab05 570 //AdvData[8] = buffer[0]; //"3"=0x33
electronichamsters 8:46c5e0bfab05 571 //AdvData[9] = buffer[1]; //"."=0x2E
electronichamsters 8:46c5e0bfab05 572 //AdvData[10] = buffer[2];//"3"=0x33
electronichamsters 8:46c5e0bfab05 573 //AdvData[11] = buffer[3];//"2"=0x32
electronichamsters 8:46c5e0bfab05 574
electronichamsters 10:79e8f92ef156 575 //try this
electronichamsters 10:79e8f92ef156 576 //https://developer.mbed.org/users/mbed_official/code/mbed-src/file/cb4253f91ada/targets/hal/TARGET_NORDIC/TARGET_NRF51822/analogin_api.c
electronichamsters 10:79e8f92ef156 577 NRF_ADC->TASKS_STOP = 1;
electronichamsters 10:79e8f92ef156 578 float analogreading;
electronichamsters 10:79e8f92ef156 579 analogreading = (float)my_analog_pin_read();
electronichamsters 10:79e8f92ef156 580 analogreading = (analogreading * 3.6) / 1024.0;
electronichamsters 10:79e8f92ef156 581 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 582 device.printf("separate analog reading: %.02f \r\n", analogreading);
electronichamsters 10:79e8f92ef156 583 #endif
electronichamsters 10:79e8f92ef156 584
electronichamsters 8:46c5e0bfab05 585 //disable ADC
electronichamsters 8:46c5e0bfab05 586 NRF_ADC->TASKS_STOP = 1;
electronichamsters 8:46c5e0bfab05 587 NRF_ADC->ENABLE = ADC_ENABLE_ENABLE_Disabled; //disable to shutdown ADC & lower bat consumption
electronichamsters 8:46c5e0bfab05 588
electronichamsters 10:79e8f92ef156 589
electronichamsters 10:79e8f92ef156 590
electronichamsters 8:46c5e0bfab05 591 //***********************************
electronichamsters 8:46c5e0bfab05 592 //form JSON string in ADV_DATA
electronichamsters 8:46c5e0bfab05 593 //1) volts starts at AdvData[8]
electronichamsters 8:46c5e0bfab05 594
electronichamsters 8:46c5e0bfab05 595
electronichamsters 8:46c5e0bfab05 596
electronichamsters 8:46c5e0bfab05 597 //write battery voltage
electronichamsters 8:46c5e0bfab05 598 uint8_t total_chars;
electronichamsters 10:79e8f92ef156 599 memset(&bat_volt_char[0], 0, sizeof(bat_volt_char)); //clear out buffer
electronichamsters 10:79e8f92ef156 600 total_chars = sprintf (bat_volt_char, "%.2f", bat_reading); //returns total number of characters
electronichamsters 8:46c5e0bfab05 601
electronichamsters 8:46c5e0bfab05 602 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 603 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 8:46c5e0bfab05 604 device.printf("num chars: %d \r\n", total_chars);
electronichamsters 8:46c5e0bfab05 605 #endif
electronichamsters 8:46c5e0bfab05 606
electronichamsters 10:79e8f92ef156 607
electronichamsters 10:79e8f92ef156 608
electronichamsters 10:79e8f92ef156 609 //memset(&Adv_First_Section[0], 0, sizeof(Adv_First_Section)); //not needed to reset
electronichamsters 10:79e8f92ef156 610 hash_first_section(Adv_First_Section, mac_reverse, bat_volt_char);
electronichamsters 10:79e8f92ef156 611
electronichamsters 10:79e8f92ef156 612
electronichamsters 8:46c5e0bfab05 613
electronichamsters 10:79e8f92ef156 614 //------------------------------------------------------------------
electronichamsters 10:79e8f92ef156 615 //start writing out ADVData array
electronichamsters 10:79e8f92ef156 616 //------------------------------------------------------------------
electronichamsters 10:79e8f92ef156 617
electronichamsters 10:79e8f92ef156 618 memset(&AdvData[0], 0, sizeof(AdvData));
electronichamsters 10:79e8f92ef156 619 uint8_t JSON_loc=0; //AdvData[0]
electronichamsters 10:79e8f92ef156 620
electronichamsters 10:79e8f92ef156 621 AdvData[0] = Adv_First_Section[0]; //AdvData[0] = manf ID 01
electronichamsters 10:79e8f92ef156 622 JSON_loc++; //1
electronichamsters 10:79e8f92ef156 623 AdvData[1] = Adv_First_Section[1]; //AdvData[1] = manf ID 02
electronichamsters 10:79e8f92ef156 624 JSON_loc++; //2
electronichamsters 10:79e8f92ef156 625 AdvData[2] = Adv_First_Section[2]; //AdvData[2] = reserved
electronichamsters 10:79e8f92ef156 626 JSON_loc++; //3...
electronichamsters 10:79e8f92ef156 627 AdvData[3] = Adv_First_Section[3]; //AdvData[3] = reserved
electronichamsters 10:79e8f92ef156 628 JSON_loc++;
electronichamsters 10:79e8f92ef156 629 AdvData[4] = Adv_First_Section[4]; //AdvData[4] = voltage 01
electronichamsters 10:79e8f92ef156 630 JSON_loc++;
electronichamsters 10:79e8f92ef156 631 AdvData[5] = Adv_First_Section[5]; //AdvData[5] = voltage 02
electronichamsters 10:79e8f92ef156 632 JSON_loc++;
electronichamsters 10:79e8f92ef156 633 AdvData[6] = Adv_First_Section[6]; //AdvData[6] = voltage 03
electronichamsters 10:79e8f92ef156 634 JSON_loc++;
electronichamsters 10:79e8f92ef156 635 AdvData[7] = Adv_First_Section[7]; //AdvData[7] = voltage 04
electronichamsters 10:79e8f92ef156 636 JSON_loc++;
electronichamsters 10:79e8f92ef156 637 AdvData[8] = Adv_First_Section[8]; //AdvData[8] = reserved
electronichamsters 10:79e8f92ef156 638 JSON_loc++;
electronichamsters 10:79e8f92ef156 639 AdvData[9] = Adv_First_Section[9]; //AdvData[9] = reserved
electronichamsters 8:46c5e0bfab05 640 JSON_loc++;
electronichamsters 10:79e8f92ef156 641
electronichamsters 10:79e8f92ef156 642 #if MyDebugEnb
electronichamsters 10:79e8f92ef156 643
electronichamsters 10:79e8f92ef156 644 device.printf("ADV first 10 array: ");
electronichamsters 10:79e8f92ef156 645 for (int i=0; i<10; i++)
electronichamsters 10:79e8f92ef156 646 {
electronichamsters 10:79e8f92ef156 647 device.printf("%x ", AdvData[i]);
electronichamsters 10:79e8f92ef156 648 }
electronichamsters 10:79e8f92ef156 649 device.printf("\r\n");
electronichamsters 10:79e8f92ef156 650 #endif
electronichamsters 10:79e8f92ef156 651
electronichamsters 10:79e8f92ef156 652
electronichamsters 10:79e8f92ef156 653 JSON_loc = 10;
electronichamsters 10:79e8f92ef156 654 //start of encrypted data
electronichamsters 10:79e8f92ef156 655 //AdvData[10]
electronichamsters 10:79e8f92ef156 656 AdvData[10] = mySeconds & 0xFF; //reserved for timer
electronichamsters 8:46c5e0bfab05 657 JSON_loc++;
electronichamsters 10:79e8f92ef156 658 AdvData[11] = (mySeconds >> 8) & 0xFF; //reserved for timer
electronichamsters 10:79e8f92ef156 659 JSON_loc++;
electronichamsters 10:79e8f92ef156 660 AdvData[12] = Xmit_Cnt;
electronichamsters 8:46c5e0bfab05 661 JSON_loc++;
electronichamsters 10:79e8f92ef156 662 //start of jason data
electronichamsters 10:79e8f92ef156 663 JSON_loc = 13;
electronichamsters 10:79e8f92ef156 664 AdvData[JSON_loc] = 0x22; //" start mag pos=13
electronichamsters 10:79e8f92ef156 665 JSON_loc++; //14
electronichamsters 8:46c5e0bfab05 666
electronichamsters 10:79e8f92ef156 667 AdvData[JSON_loc] = 0x6d; //m, pos=14
electronichamsters 10:79e8f92ef156 668 JSON_loc++; //15
electronichamsters 10:79e8f92ef156 669
electronichamsters 10:79e8f92ef156 670 AdvData[JSON_loc] = 0x61; //a, pos=15
electronichamsters 10:79e8f92ef156 671 JSON_loc++; //16
electronichamsters 10:79e8f92ef156 672
electronichamsters 10:79e8f92ef156 673 AdvData[JSON_loc] = 0x67; //g, pos=16
electronichamsters 10:79e8f92ef156 674 JSON_loc++; //17
electronichamsters 8:46c5e0bfab05 675
electronichamsters 8:46c5e0bfab05 676 if (flag_periodic_call)
electronichamsters 8:46c5e0bfab05 677 {
electronichamsters 8:46c5e0bfab05 678 //AdvData[JSON_loc] = 0x2f; // "/"
electronichamsters 8:46c5e0bfab05 679 //JSON_loc++;
electronichamsters 10:79e8f92ef156 680 AdvData[JSON_loc] = 0x2f; // "/" pos=17
electronichamsters 10:79e8f92ef156 681 JSON_loc++;//pos=18
electronichamsters 10:79e8f92ef156 682 AdvData[JSON_loc] = 0x70; // "p" poes=18
electronichamsters 10:79e8f92ef156 683 JSON_loc++;//pos=19
electronichamsters 8:46c5e0bfab05 684 }//end if period call
electronichamsters 8:46c5e0bfab05 685
electronichamsters 10:79e8f92ef156 686 AdvData[JSON_loc] = 0x22; //" pos = 17 or 19
electronichamsters 10:79e8f92ef156 687 JSON_loc++; //20
electronichamsters 8:46c5e0bfab05 688
electronichamsters 10:79e8f92ef156 689 AdvData[JSON_loc] = 0x3a; //: pos = 18 or 20
electronichamsters 10:79e8f92ef156 690 JSON_loc++; //22
electronichamsters 8:46c5e0bfab05 691
electronichamsters 8:46c5e0bfab05 692 //prep magnet location (1 or 0) for char[]
electronichamsters 8:46c5e0bfab05 693 memset(&buffer[0], 0, sizeof(buffer)); //clear out buffer
electronichamsters 8:46c5e0bfab05 694 //magnet_near is an integer
electronichamsters 10:79e8f92ef156 695 total_chars = sprintf (buffer, "%d", magnet_near); //returns total number of characters, which is 1 character.
electronichamsters 8:46c5e0bfab05 696 for (int i=0; i < total_chars; i++)
electronichamsters 8:46c5e0bfab05 697 {
electronichamsters 8:46c5e0bfab05 698 AdvData[JSON_loc] = buffer[i];
electronichamsters 10:79e8f92ef156 699 JSON_loc++; //23
electronichamsters 8:46c5e0bfab05 700 } //JSON_loc left at location of next character
electronichamsters 8:46c5e0bfab05 701
electronichamsters 8:46c5e0bfab05 702 //MUST null terminate for JSON to read correctly, else get intermittent JSON parse errors at gateway
electronichamsters 8:46c5e0bfab05 703 //happens when string is shorter than last string, get trash left overs
electronichamsters 8:46c5e0bfab05 704 //not really needed after clearning AdvData at start.
electronichamsters 8:46c5e0bfab05 705
electronichamsters 8:46c5e0bfab05 706
electronichamsters 8:46c5e0bfab05 707 //AdvData[JSON_loc] = 0x0; //null terminate here
electronichamsters 8:46c5e0bfab05 708
rgrover1 5:f4d74a8cad43 709 ApplicationData_t appData;
rgrover1 5:f4d74a8cad43 710 setupApplicationData(appData);
electronichamsters 8:46c5e0bfab05 711
electronichamsters 10:79e8f92ef156 712
electronichamsters 8:46c5e0bfab05 713 for (int i=0; i<16; i++)
electronichamsters 8:46c5e0bfab05 714 {
electronichamsters 10:79e8f92ef156 715 src_buf[i] = AdvData[i+10]; //start of encrypted section is at AdvData[10]
electronichamsters 8:46c5e0bfab05 716 }
rgrover1 5:f4d74a8cad43 717
electronichamsters 8:46c5e0bfab05 718 //nrf_ecb_set_key(key_buf);
electronichamsters 8:46c5e0bfab05 719 nrf_ecb_init();
electronichamsters 8:46c5e0bfab05 720 nrf_ecb_set_key(key_buf);
electronichamsters 8:46c5e0bfab05 721 bool successful_ecb = nrf_ecb_crypt(des_buf, src_buf);
electronichamsters 8:46c5e0bfab05 722 #if MyDebugEnb
electronichamsters 8:46c5e0bfab05 723 device.printf("success ecb = %d \r\n", successful_ecb);
electronichamsters 8:46c5e0bfab05 724 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 8:46c5e0bfab05 725 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 8:46c5e0bfab05 726 #endif
electronichamsters 8:46c5e0bfab05 727 for (int i=0; i<16; i++)
electronichamsters 8:46c5e0bfab05 728 {
electronichamsters 10:79e8f92ef156 729 AdvData[i+10] = des_buf[i];
electronichamsters 8:46c5e0bfab05 730 }
electronichamsters 8:46c5e0bfab05 731
electronichamsters 8:46c5e0bfab05 732 //ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *) &appData, sizeof(ApplicationData_t));
electronichamsters 8:46c5e0bfab05 733 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, AdvData, sizeof(AdvData));
electronichamsters 8:46c5e0bfab05 734
electronichamsters 8:46c5e0bfab05 735 flag_update_io = false;
electronichamsters 8:46c5e0bfab05 736 flag_periodic_call = false;
electronichamsters 8:46c5e0bfab05 737
electronichamsters 8:46c5e0bfab05 738 //GAP::AddressType_t *myType;
electronichamsters 8:46c5e0bfab05 739 //GAP::Address_t myAddress
electronichamsters 8:46c5e0bfab05 740 //ble_error_t getAddress(Gap::AddressType_t *typeP, Gap::Address_t address)
electronichamsters 8:46c5e0bfab05 741 //ble.gap().getAddress(myType, myAddress);
electronichamsters 8:46c5e0bfab05 742 //ble.gap().getAddress(Gap::AddressType_t *typeP, Gap::Address_t address);
electronichamsters 10:79e8f92ef156 743
electronichamsters 10:79e8f92ef156 744
electronichamsters 10:79e8f92ef156 745
electronichamsters 8:46c5e0bfab05 746 ble.gap().startAdvertising();
electronichamsters 8:46c5e0bfab05 747 tic_adv.attach(stop_adv_Callback, 2); /* trigger turn off advertisement after X seconds */
electronichamsters 8:46c5e0bfab05 748
electronichamsters 8:46c5e0bfab05 749 /*
electronichamsters 8:46c5e0bfab05 750 Timer myTimer; //timed advertising
electronichamsters 8:46c5e0bfab05 751 myTimer.start();
electronichamsters 8:46c5e0bfab05 752 uint32_t duration = myTimer.read_ms();
electronichamsters 8:46c5e0bfab05 753
electronichamsters 8:46c5e0bfab05 754 //do this as a ticker instead of keeping processor on
electronichamsters 8:46c5e0bfab05 755 while (duration < 15000) //advertise for 1000 ms
electronichamsters 8:46c5e0bfab05 756 {
electronichamsters 8:46c5e0bfab05 757 duration = myTimer.read_ms(); //read miliseconds
electronichamsters 8:46c5e0bfab05 758 }
electronichamsters 8:46c5e0bfab05 759 myTimer.stop();
electronichamsters 8:46c5e0bfab05 760 ble.gap().stopAdvertising();
electronichamsters 8:46c5e0bfab05 761 */
electronichamsters 8:46c5e0bfab05 762
electronichamsters 8:46c5e0bfab05 763 }//end flag_update_io
electronichamsters 8:46c5e0bfab05 764
electronichamsters 8:46c5e0bfab05 765
electronichamsters 8:46c5e0bfab05 766 /*
electronichamsters 8:46c5e0bfab05 767 if (flag_set_debounce_tic == true)
electronichamsters 8:46c5e0bfab05 768 {
electronichamsters 8:46c5e0bfab05 769 tic_debounce.attach();
electronichamsters 8:46c5e0bfab05 770 //flag_set_debounce_tic = false;
electronichamsters 8:46c5e0bfab05 771
sunsmile2015 0:3dc6e424dba0 772 }
electronichamsters 8:46c5e0bfab05 773 */
electronichamsters 8:46c5e0bfab05 774
electronichamsters 8:46c5e0bfab05 775 //if (trigger_Detach_ADV_Tick == false)
electronichamsters 8:46c5e0bfab05 776 //{
electronichamsters 8:46c5e0bfab05 777 //}
electronichamsters 8:46c5e0bfab05 778 if (flag_detach_adv_tic == true) //Stop Advertising
electronichamsters 8:46c5e0bfab05 779 {
electronichamsters 8:46c5e0bfab05 780 ble.gap().stopAdvertising(); //may be safer to execute BLE operations in main
electronichamsters 8:46c5e0bfab05 781 tic_adv.detach();
electronichamsters 8:46c5e0bfab05 782 flag_detach_adv_tic = false;
electronichamsters 8:46c5e0bfab05 783 }
electronichamsters 8:46c5e0bfab05 784 //device.printf("Input Voltage: %f\n\r",bat_reading);
electronichamsters 8:46c5e0bfab05 785
electronichamsters 8:46c5e0bfab05 786 ble.waitForEvent(); //sleeps until interrupt
electronichamsters 8:46c5e0bfab05 787
rgrover1 5:f4d74a8cad43 788
electronichamsters 8:46c5e0bfab05 789 }//end forever while
electronichamsters 8:46c5e0bfab05 790 }//end main