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