Pull request for i.a. sensor buffer template
Dependencies: BLE_API MPU6050 mbed nRF51822
main.cpp@10:eed92ffd0bba, 2018-11-15 (annotated)
- Committer:
- JustinAtAlten
- Date:
- Thu Nov 15 15:13:52 2018 +0000
- Revision:
- 10:eed92ffd0bba
- Parent:
- 9:e9d6a9758cf7
added sensor value buffer template, added a temperature bulk request service, and changed how the tickers are handled (to save memory).
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pietermaljaars | 0:7c12d0922052 | 1 | #include "mbed.h" |
JustinAtAlten | 10:eed92ffd0bba | 2 | #include "mbed_mem_trace.h" |
pietermaljaars | 0:7c12d0922052 | 3 | #include "nrf51.h" |
pietermaljaars | 0:7c12d0922052 | 4 | #include "nrf51_bitfields.h" |
pietermaljaars | 3:7875f062a4ea | 5 | #include "MPU6050.h" |
pietermaljaars | 0:7c12d0922052 | 6 | |
pietermaljaars | 0:7c12d0922052 | 7 | #include "BLE.h" |
pietermaljaars | 0:7c12d0922052 | 8 | #include "DFUService.h" |
pietermaljaars | 0:7c12d0922052 | 9 | #include "UARTService.h" |
pietermaljaars | 2:bf1a19d489eb | 10 | #include "BatteryService.h" |
pietermaljaars | 2:bf1a19d489eb | 11 | #include "DeviceInformationService.h" |
pietermaljaars | 5:614164945894 | 12 | #include "TemperatureService.h" |
Pieter Maljaars |
7:d92f1383bd81 | 13 | #include "AccelerationService.h" |
pietermaljaars | 0:7c12d0922052 | 14 | |
JustinAtAlten | 10:eed92ffd0bba | 15 | #include "ReadIntervals.h" |
JustinAtAlten | 10:eed92ffd0bba | 16 | #include "Util.h" |
JustinAtAlten | 10:eed92ffd0bba | 17 | #include "IO.h" |
JustinAtAlten | 10:eed92ffd0bba | 18 | #include "MeasurementBufferTemplate.h" |
pietermaljaars | 0:7c12d0922052 | 19 | |
JustinAtAlten | 10:eed92ffd0bba | 20 | //https://os.mbed.com/handbook/SDFileSystem |
JustinAtAlten | 10:eed92ffd0bba | 21 | // http://os.mbed.com/users/mbed_official/code/SDFileSystem/ |
JustinAtAlten | 10:eed92ffd0bba | 22 | // needs: https://os.mbed.com/teams/mbed-official/code/FATFileSystem/pull-request/4 |
JustinAtAlten | 10:eed92ffd0bba | 23 | // #include "SDFileSystem.h" |
JustinAtAlten | 10:eed92ffd0bba | 24 | //https://os.mbed.com/cookbook/SD-Card-File-System |
pietermaljaars | 0:7c12d0922052 | 25 | |
pietermaljaars | 0:7c12d0922052 | 26 | |
JustinAtAlten | 10:eed92ffd0bba | 27 | /////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 28 | // DEFINES // |
JustinAtAlten | 10:eed92ffd0bba | 29 | /////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 30 | |
JustinAtAlten | 10:eed92ffd0bba | 31 | // Starting sampling rate. |
pietermaljaars | 0:7c12d0922052 | 32 | #define DEFAULT_MPU_HZ (100) |
pietermaljaars | 0:7c12d0922052 | 33 | |
JustinAtAlten | 10:eed92ffd0bba | 34 | // --- Device Information --- // |
pietermaljaars | 4:aea4ff8e52ef | 35 | #define MANUFACTURER "PM @ ALTEN" |
pietermaljaars | 4:aea4ff8e52ef | 36 | #define MODELNUMBER "IoT BLE" |
pietermaljaars | 4:aea4ff8e52ef | 37 | #define SERIALNUMBER "123456" |
pietermaljaars | 4:aea4ff8e52ef | 38 | #define HARDWAREREVISION "Seeed demo IoT" |
pietermaljaars | 2:bf1a19d489eb | 39 | #define FIRMWAREREVISION "1.0" |
pietermaljaars | 2:bf1a19d489eb | 40 | #define SOFTWAREREVISION "1.0" |
pietermaljaars | 2:bf1a19d489eb | 41 | |
JustinAtAlten | 10:eed92ffd0bba | 42 | ///////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 43 | // CONSTANTS // |
JustinAtAlten | 10:eed92ffd0bba | 44 | ///////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 45 | |
JustinAtAlten | 10:eed92ffd0bba | 46 | // --- UUIDs --- // |
JustinAtAlten | 10:eed92ffd0bba | 47 | const char acceleration128bitUUIDlist[] = { 0x53, 0xF8, 0x0E, 0x12, 0xAD, 0xBB, 0xF1, 0x38, 0xAC, 0x07, 0xD2, 0x3D, 0xF0, 0xE2, 0x34, 0x5D }; |
JustinAtAlten | 10:eed92ffd0bba | 48 | const UUID uuidTempBulkService("11111111-1000-2222-3333-444455556666"); |
JustinAtAlten | 10:eed92ffd0bba | 49 | const UUID uuidTempBulkCharRead("11111111-1001-2222-3333-444455556666"); |
pietermaljaars | 0:7c12d0922052 | 50 | |
JustinAtAlten | 10:eed92ffd0bba | 51 | // --- Temperature Buffer Data --- // |
JustinAtAlten | 10:eed92ffd0bba | 52 | const unsigned int TemperatureBufferSize = 100; |
JustinAtAlten | 10:eed92ffd0bba | 53 | const unsigned int TemperatureBulkUpdateSize = 6; |
JustinAtAlten | 10:eed92ffd0bba | 54 | // https://devzone.nordicsemi.com/f/nordic-q-a/519/reading-a-subset-of-data-on-a-ble-server |
JustinAtAlten | 10:eed92ffd0bba | 55 | // characteristic data max 512 bytes |
JustinAtAlten | 10:eed92ffd0bba | 56 | // https://github.com/pieterm/bledemo#step-8-add-callback-function-on-data-written-event |
JustinAtAlten | 10:eed92ffd0bba | 57 | // GattWriteCallbackParams |
JustinAtAlten | 10:eed92ffd0bba | 58 | |
pietermaljaars | 0:7c12d0922052 | 59 | |
JustinAtAlten | 10:eed92ffd0bba | 60 | ///////////////////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 61 | // FUNCTION DECLARATIONS // |
JustinAtAlten | 10:eed92ffd0bba | 62 | ///////////////////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 63 | |
JustinAtAlten | 10:eed92ffd0bba | 64 | uint16_t readTemperature(); |
pietermaljaars | 0:7c12d0922052 | 65 | |
JustinAtAlten | 10:eed92ffd0bba | 66 | //////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 67 | // TYPEDEFS // |
JustinAtAlten | 10:eed92ffd0bba | 68 | //////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 69 | |
JustinAtAlten | 10:eed92ffd0bba | 70 | typedef MeasurementBufferTemplate<uint16_t, TemperatureBufferSize, TemperatureBulkUpdateSize, ReadIntervals::TemperatureSensorPeriod, readTemperature> TemperatureBuffer; |
pietermaljaars | 0:7c12d0922052 | 71 | |
JustinAtAlten | 10:eed92ffd0bba | 72 | ///////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 73 | // VARIABLES // |
JustinAtAlten | 10:eed92ffd0bba | 74 | ///////////////////////////////////////// |
pietermaljaars | 0:7c12d0922052 | 75 | |
JustinAtAlten | 10:eed92ffd0bba | 76 | // --- Buffers --- // |
JustinAtAlten | 10:eed92ffd0bba | 77 | TemperatureBuffer temperatureBuffer; |
JustinAtAlten | 10:eed92ffd0bba | 78 | TemperatureBuffer::BulkUpdate tempUpdate; |
pietermaljaars | 3:7875f062a4ea | 79 | |
JustinAtAlten | 10:eed92ffd0bba | 80 | // --- Timing --- // |
JustinAtAlten | 10:eed92ffd0bba | 81 | Ticker ticker; |
JustinAtAlten | 10:eed92ffd0bba | 82 | |
JustinAtAlten | 10:eed92ffd0bba | 83 | // --- BLE --- // |
JustinAtAlten | 10:eed92ffd0bba | 84 | GattCharacteristic * tempBulkUpdateCharacteristic; |
pietermaljaars | 2:bf1a19d489eb | 85 | |
JustinAtAlten | 10:eed92ffd0bba | 86 | // --- Flags --- // |
JustinAtAlten | 10:eed92ffd0bba | 87 | volatile bool batteryVoltageChanged = false; |
JustinAtAlten | 10:eed92ffd0bba | 88 | volatile bool tempUpdateFlag = false; |
JustinAtAlten | 10:eed92ffd0bba | 89 | volatile bool startMeasure = false; |
JustinAtAlten | 10:eed92ffd0bba | 90 | |
JustinAtAlten | 10:eed92ffd0bba | 91 | ///////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 92 | // FUNCTIONS // |
JustinAtAlten | 10:eed92ffd0bba | 93 | ///////////////////////////////////////// |
JustinAtAlten | 10:eed92ffd0bba | 94 | |
pietermaljaars | 3:7875f062a4ea | 95 | |
JustinAtAlten | 10:eed92ffd0bba | 96 | uint16_t readTemperature(){ |
JustinAtAlten | 10:eed92ffd0bba | 97 | //read temperature (raw) |
JustinAtAlten | 10:eed92ffd0bba | 98 | int16_t tempRaw = mpu.getTempRaw(); |
JustinAtAlten | 10:eed92ffd0bba | 99 | // convert into 0.1 degrees Celsius |
JustinAtAlten | 10:eed92ffd0bba | 100 | tempRaw *= 10; |
JustinAtAlten | 10:eed92ffd0bba | 101 | tempRaw += 5210; |
JustinAtAlten | 10:eed92ffd0bba | 102 | tempRaw /= 340; |
JustinAtAlten | 10:eed92ffd0bba | 103 | tempRaw += 350; |
pietermaljaars | 0:7c12d0922052 | 104 | |
JustinAtAlten | 10:eed92ffd0bba | 105 | return tempRaw; |
JustinAtAlten | 10:eed92ffd0bba | 106 | } |
Pieter Maljaars |
8:d1f5c8801d59 | 107 | |
pietermaljaars | 0:7c12d0922052 | 108 | |
pietermaljaars | 0:7c12d0922052 | 109 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) |
pietermaljaars | 0:7c12d0922052 | 110 | { |
JustinAtAlten | 10:eed92ffd0bba | 111 | LOG("Connected!\n"); |
JustinAtAlten | 10:eed92ffd0bba | 112 | // bleIsConnected = true; |
pietermaljaars | 0:7c12d0922052 | 113 | } |
pietermaljaars | 0:7c12d0922052 | 114 | |
pietermaljaars | 0:7c12d0922052 | 115 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams) |
pietermaljaars | 0:7c12d0922052 | 116 | { |
JustinAtAlten | 10:eed92ffd0bba | 117 | LOG("Disconnected!\n"); |
JustinAtAlten | 10:eed92ffd0bba | 118 | LOG("Restarting the advertising process\n"); |
JustinAtAlten | 10:eed92ffd0bba | 119 | BLE & ble = BLE::Instance(BLE::DEFAULT_INSTANCE); |
JustinAtAlten | 10:eed92ffd0bba | 120 | ble.gap().startAdvertising(); |
JustinAtAlten | 10:eed92ffd0bba | 121 | // bleIsConnected = false; |
pietermaljaars | 0:7c12d0922052 | 122 | } |
pietermaljaars | 0:7c12d0922052 | 123 | |
pietermaljaars | 0:7c12d0922052 | 124 | void tick(void) |
pietermaljaars | 0:7c12d0922052 | 125 | { |
JustinAtAlten | 10:eed92ffd0bba | 126 | static int tickerSleepTime=0; |
JustinAtAlten | 10:eed92ffd0bba | 127 | blue = !blue; |
JustinAtAlten | 10:eed92ffd0bba | 128 | |
JustinAtAlten | 10:eed92ffd0bba | 129 | //update time |
JustinAtAlten | 10:eed92ffd0bba | 130 | ReadIntervals::updateTimeLeft(tickerSleepTime); |
JustinAtAlten | 10:eed92ffd0bba | 131 | |
JustinAtAlten | 10:eed92ffd0bba | 132 | //perform actions |
JustinAtAlten | 10:eed92ffd0bba | 133 | if(ReadIntervals::temperatureSensorPeriodPassed()){ |
JustinAtAlten | 10:eed92ffd0bba | 134 | green = !green; |
JustinAtAlten | 10:eed92ffd0bba | 135 | startMeasure = true; // notify the main-loop to start measuring the MPU6050 |
JustinAtAlten | 10:eed92ffd0bba | 136 | } |
JustinAtAlten | 10:eed92ffd0bba | 137 | if(ReadIntervals::batteryMonitorPeriodPassed()){ |
JustinAtAlten | 10:eed92ffd0bba | 138 | red = !red; |
JustinAtAlten | 10:eed92ffd0bba | 139 | batteryVoltageChanged = true; |
JustinAtAlten | 10:eed92ffd0bba | 140 | } |
JustinAtAlten | 10:eed92ffd0bba | 141 | |
JustinAtAlten | 10:eed92ffd0bba | 142 | //prep next ticker-sleep |
JustinAtAlten | 10:eed92ffd0bba | 143 | tickerSleepTime = ReadIntervals::getTickerSleepTime(); |
JustinAtAlten | 10:eed92ffd0bba | 144 | ticker.attach(tick, tickerSleepTime); |
pietermaljaars | 0:7c12d0922052 | 145 | } |
pietermaljaars | 0:7c12d0922052 | 146 | |
JustinAtAlten | 10:eed92ffd0bba | 147 | // void detect(void) |
JustinAtAlten | 10:eed92ffd0bba | 148 | // { |
JustinAtAlten | 10:eed92ffd0bba | 149 | // LOG("Button pressed\n"); |
JustinAtAlten | 10:eed92ffd0bba | 150 | // blue = !blue; |
JustinAtAlten | 10:eed92ffd0bba | 151 | // } |
JustinAtAlten | 10:eed92ffd0bba | 152 | |
JustinAtAlten | 10:eed92ffd0bba | 153 | void setAdvertisingPayload(BLE & ble){ |
JustinAtAlten | 10:eed92ffd0bba | 154 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
JustinAtAlten | 10:eed92ffd0bba | 155 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
JustinAtAlten | 10:eed92ffd0bba | 156 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
JustinAtAlten | 10:eed92ffd0bba | 157 | (const uint8_t *)acceleration128bitUUIDlist, sizeof(acceleration128bitUUIDlist)); |
pietermaljaars | 2:bf1a19d489eb | 158 | } |
pietermaljaars | 2:bf1a19d489eb | 159 | |
JustinAtAlten | 10:eed92ffd0bba | 160 | void setScanResponsePayload(BLE & ble){ |
JustinAtAlten | 10:eed92ffd0bba | 161 | uint8_t name[] = "iot aabbccddeeff"; |
JustinAtAlten | 10:eed92ffd0bba | 162 | Gap::AddressType_t addr_type; |
JustinAtAlten | 10:eed92ffd0bba | 163 | Gap::Address_t address; |
JustinAtAlten | 10:eed92ffd0bba | 164 | ble_error_t error = ble.gap().getAddress(&addr_type, address); |
JustinAtAlten | 10:eed92ffd0bba | 165 | if(error == BLE_ERROR_NONE){ |
JustinAtAlten | 10:eed92ffd0bba | 166 | for(int i = 5; i >= 0; i--){ |
JustinAtAlten | 10:eed92ffd0bba | 167 | char buffer[3]; |
JustinAtAlten | 10:eed92ffd0bba | 168 | sprintf(buffer, "%02x", address[i]); |
JustinAtAlten | 10:eed92ffd0bba | 169 | name[4 + ((5-i)*2)] = buffer[0]; |
JustinAtAlten | 10:eed92ffd0bba | 170 | name[4 + ((5-i)*2) + 1] = buffer[1]; |
JustinAtAlten | 10:eed92ffd0bba | 171 | } |
JustinAtAlten | 10:eed92ffd0bba | 172 | } |
JustinAtAlten | 10:eed92ffd0bba | 173 | |
JustinAtAlten | 10:eed92ffd0bba | 174 | ble.gap().accumulateScanResponse(GapAdvertisingData::COMPLETE_LOCAL_NAME, |
JustinAtAlten | 10:eed92ffd0bba | 175 | name, sizeof(name)); |
pietermaljaars | 0:7c12d0922052 | 176 | } |
pietermaljaars | 0:7c12d0922052 | 177 | |
pietermaljaars | 0:7c12d0922052 | 178 | |
JustinAtAlten | 10:eed92ffd0bba | 179 | void onDataWritten(const GattWriteCallbackParams * context) |
JustinAtAlten | 10:eed92ffd0bba | 180 | { |
JustinAtAlten | 10:eed92ffd0bba | 181 | if(context->handle == tempBulkUpdateCharacteristic->getValueHandle()){ |
JustinAtAlten | 10:eed92ffd0bba | 182 | const time_t & newSelectedTime = *(time_t*)context->data; |
JustinAtAlten | 10:eed92ffd0bba | 183 | tempUpdate = temperatureBuffer.getBulkUpdate(newSelectedTime); |
JustinAtAlten | 10:eed92ffd0bba | 184 | tempUpdateFlag = true; |
JustinAtAlten | 10:eed92ffd0bba | 185 | } |
JustinAtAlten | 10:eed92ffd0bba | 186 | } |
JustinAtAlten | 10:eed92ffd0bba | 187 | |
pietermaljaars | 0:7c12d0922052 | 188 | int main(void) |
pietermaljaars | 0:7c12d0922052 | 189 | { |
JustinAtAlten | 10:eed92ffd0bba | 190 | ///Start global timer |
JustinAtAlten | 10:eed92ffd0bba | 191 | AppTime::init(); |
JustinAtAlten | 10:eed92ffd0bba | 192 | |
JustinAtAlten | 10:eed92ffd0bba | 193 | ///Initialize led values |
JustinAtAlten | 10:eed92ffd0bba | 194 | blue = 0; |
JustinAtAlten | 10:eed92ffd0bba | 195 | green = 1; |
JustinAtAlten | 10:eed92ffd0bba | 196 | red = 1; |
JustinAtAlten | 10:eed92ffd0bba | 197 | |
JustinAtAlten | 10:eed92ffd0bba | 198 | wait(1); |
pietermaljaars | 0:7c12d0922052 | 199 | |
JustinAtAlten | 10:eed92ffd0bba | 200 | #ifdef USE_SERIAL |
JustinAtAlten | 10:eed92ffd0bba | 201 | pc.baud(115200); |
JustinAtAlten | 10:eed92ffd0bba | 202 | #endif /* USE_SERIAL */ |
JustinAtAlten | 10:eed92ffd0bba | 203 | |
JustinAtAlten | 10:eed92ffd0bba | 204 | LOG("---- Seeed Tiny BLE ----\n"); |
JustinAtAlten | 10:eed92ffd0bba | 205 | |
JustinAtAlten | 10:eed92ffd0bba | 206 | ///Initialize MPU6050 |
JustinAtAlten | 10:eed92ffd0bba | 207 | LOG("MPU6050 testConnection \n"); |
JustinAtAlten | 10:eed92ffd0bba | 208 | bool mpu6050TestResult = mpu.testConnection(); |
JustinAtAlten | 10:eed92ffd0bba | 209 | if(mpu6050TestResult) { |
JustinAtAlten | 10:eed92ffd0bba | 210 | LOG("MPU6050 test passed \n"); |
JustinAtAlten | 10:eed92ffd0bba | 211 | } else { |
JustinAtAlten | 10:eed92ffd0bba | 212 | LOG("MPU6050 test failed \n"); |
JustinAtAlten | 10:eed92ffd0bba | 213 | } |
JustinAtAlten | 10:eed92ffd0bba | 214 | |
JustinAtAlten | 10:eed92ffd0bba | 215 | ///Initialize temperature buffer & update |
JustinAtAlten | 10:eed92ffd0bba | 216 | uint16_t temperature = temperatureBuffer.performMeasurement(); |
JustinAtAlten | 10:eed92ffd0bba | 217 | tempUpdate = temperatureBuffer.getBulkUpdate(0); |
pietermaljaars | 0:7c12d0922052 | 218 | |
JustinAtAlten | 10:eed92ffd0bba | 219 | ///Initialize ticker |
JustinAtAlten | 10:eed92ffd0bba | 220 | ticker.attach(tick, ReadIntervals::TemperatureSensorPeriod); |
JustinAtAlten | 10:eed92ffd0bba | 221 | |
JustinAtAlten | 10:eed92ffd0bba | 222 | // button.fall(detect); |
JustinAtAlten | 10:eed92ffd0bba | 223 | |
JustinAtAlten | 10:eed92ffd0bba | 224 | ///Initialize BLE |
JustinAtAlten | 10:eed92ffd0bba | 225 | LOG("Initialising the nRF51822\n"); |
JustinAtAlten | 10:eed92ffd0bba | 226 | BLE & ble = BLE::Instance(BLE::DEFAULT_INSTANCE); |
JustinAtAlten | 10:eed92ffd0bba | 227 | ble.init(); |
JustinAtAlten | 10:eed92ffd0bba | 228 | ble.gap().onDisconnection(disconnectionCallback); |
JustinAtAlten | 10:eed92ffd0bba | 229 | ble.gap().onConnection(connectionCallback); |
pietermaljaars | 0:7c12d0922052 | 230 | |
JustinAtAlten | 10:eed92ffd0bba | 231 | // -> Initialize BLE - custom services |
JustinAtAlten | 10:eed92ffd0bba | 232 | tempBulkUpdateCharacteristic = new GattCharacteristic(uuidTempBulkCharRead, NULL, 1, sizeof(tempUpdate), |
JustinAtAlten | 10:eed92ffd0bba | 233 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
JustinAtAlten | 10:eed92ffd0bba | 234 | GattService tempBulkService(uuidTempBulkService, &tempBulkUpdateCharacteristic, 1); |
JustinAtAlten | 10:eed92ffd0bba | 235 | ble.gattServer().addService(tempBulkService); |
JustinAtAlten | 10:eed92ffd0bba | 236 | ble.gattServer().onDataWritten(onDataWritten); |
JustinAtAlten | 10:eed92ffd0bba | 237 | |
JustinAtAlten | 10:eed92ffd0bba | 238 | // -> Initialize BLE - advertising and scan payloads |
JustinAtAlten | 10:eed92ffd0bba | 239 | setAdvertisingPayload(ble); |
JustinAtAlten | 10:eed92ffd0bba | 240 | setScanResponsePayload(ble); |
JustinAtAlten | 10:eed92ffd0bba | 241 | |
JustinAtAlten | 10:eed92ffd0bba | 242 | // -> Initialize BLE - generic services |
JustinAtAlten | 10:eed92ffd0bba | 243 | DFUService dfu(ble); |
JustinAtAlten | 10:eed92ffd0bba | 244 | UARTService uartService(ble); |
JustinAtAlten | 10:eed92ffd0bba | 245 | BatteryService batteryService(ble); |
JustinAtAlten | 10:eed92ffd0bba | 246 | DeviceInformationService deviceInfo(ble, MANUFACTURER, MODELNUMBER, SERIALNUMBER, HARDWAREREVISION, FIRMWAREREVISION, SOFTWAREREVISION); |
JustinAtAlten | 10:eed92ffd0bba | 247 | TemperatureService tempService(ble); |
JustinAtAlten | 10:eed92ffd0bba | 248 | AccelerationService accelerationService(ble); |
JustinAtAlten | 10:eed92ffd0bba | 249 | |
JustinAtAlten | 10:eed92ffd0bba | 250 | // -> Initialize BLE - start advertising |
JustinAtAlten | 10:eed92ffd0bba | 251 | ble.gap().setAdvertisingInterval(160); // 100ms; in multiples of 0.625ms. |
JustinAtAlten | 10:eed92ffd0bba | 252 | ble.gap().startAdvertising(); |
JustinAtAlten | 10:eed92ffd0bba | 253 | |
JustinAtAlten | 10:eed92ffd0bba | 254 | tempService.updateTemperature(temperature); |
JustinAtAlten | 10:eed92ffd0bba | 255 | |
JustinAtAlten | 10:eed92ffd0bba | 256 | while(true) { |
JustinAtAlten | 10:eed92ffd0bba | 257 | ble.waitForEvent(); |
JustinAtAlten | 10:eed92ffd0bba | 258 | |
JustinAtAlten | 10:eed92ffd0bba | 259 | // update battery level after the level is measured |
JustinAtAlten | 10:eed92ffd0bba | 260 | if(batteryVoltageChanged == true) { |
JustinAtAlten | 10:eed92ffd0bba | 261 | float batteryVoltage = battery.read(); |
JustinAtAlten | 10:eed92ffd0bba | 262 | // LOG("VBat: %4.3f, ADC: %4.3f, Vadc: %4.3f\n", batteryVoltage*2.0f, batteryVoltage, batteryVoltage*3.3f); |
JustinAtAlten | 10:eed92ffd0bba | 263 | LOG("VBat: %s, ADC: %s, Vadc: %s\n", floatToCharArray(batteryVoltage*2.0f), floatToCharArray(batteryVoltage), floatToCharArray(batteryVoltage*3.3f)); |
JustinAtAlten | 10:eed92ffd0bba | 264 | batteryService.updateBatteryLevel((uint8_t)(batteryVoltage*100.0f)); // input is 0-1.0 of 3.3V -> *100 = percentage of 3.3V |
JustinAtAlten | 10:eed92ffd0bba | 265 | batteryVoltageChanged = false; |
JustinAtAlten | 10:eed92ffd0bba | 266 | } |
pietermaljaars | 0:7c12d0922052 | 267 | |
JustinAtAlten | 10:eed92ffd0bba | 268 | if(startMeasure == true) { |
JustinAtAlten | 10:eed92ffd0bba | 269 | //uartService.write("test\n", 5); |
JustinAtAlten | 10:eed92ffd0bba | 270 | //float a[3]; |
JustinAtAlten | 10:eed92ffd0bba | 271 | //mpu.getAccelero(a); |
JustinAtAlten | 10:eed92ffd0bba | 272 | //LOG("Acceleration %.2f;%.2f;%.2f\n", a[0], a[1], a[2]); |
Pieter Maljaars |
7:d92f1383bd81 | 273 | |
JustinAtAlten | 10:eed92ffd0bba | 274 | ///Acceleration |
JustinAtAlten | 10:eed92ffd0bba | 275 | //read accelerometer data |
JustinAtAlten | 10:eed92ffd0bba | 276 | int a[3]; |
JustinAtAlten | 10:eed92ffd0bba | 277 | mpu.getAcceleroRaw(a); |
JustinAtAlten | 10:eed92ffd0bba | 278 | //convert to format accepted by accelerionService |
JustinAtAlten | 10:eed92ffd0bba | 279 | int16_t a_16[3]; |
JustinAtAlten | 10:eed92ffd0bba | 280 | castArray(a, a_16, 3); //cannot simply cast 'a' to int16_t*, memory won't move accordingly |
JustinAtAlten | 10:eed92ffd0bba | 281 | // update BLE acceleration |
JustinAtAlten | 10:eed92ffd0bba | 282 | accelerationService.addAcceleration(a_16); |
JustinAtAlten | 10:eed92ffd0bba | 283 | LOG("Acceleration 0x%x;0x%x;0x%x\n", a[0], a[1], a[2]); |
JustinAtAlten | 10:eed92ffd0bba | 284 | |
JustinAtAlten | 10:eed92ffd0bba | 285 | ///Temperature |
JustinAtAlten | 10:eed92ffd0bba | 286 | uint16_t temperature = temperatureBuffer.performMeasurement(); |
JustinAtAlten | 10:eed92ffd0bba | 287 | tempService.updateTemperature(temperature); |
JustinAtAlten | 10:eed92ffd0bba | 288 | |
JustinAtAlten | 10:eed92ffd0bba | 289 | ///Reset measure flag |
JustinAtAlten | 10:eed92ffd0bba | 290 | startMeasure = false; |
JustinAtAlten | 10:eed92ffd0bba | 291 | } |
JustinAtAlten | 10:eed92ffd0bba | 292 | |
JustinAtAlten | 10:eed92ffd0bba | 293 | if(tempUpdateFlag){ |
JustinAtAlten | 10:eed92ffd0bba | 294 | ble_error_t err = ble.gattServer().write(tempBulkUpdateCharacteristic->getValueHandle(), (const uint8_t*)&tempUpdate, sizeof(tempUpdate)); |
JustinAtAlten | 10:eed92ffd0bba | 295 | LOG("err:[%d]\n", err); |
JustinAtAlten | 10:eed92ffd0bba | 296 | LOG("rT:[%d]\n", tempUpdate.requestedTime); |
JustinAtAlten | 10:eed92ffd0bba | 297 | LOG("iT:[%d]\n", tempUpdate.initialTime); |
JustinAtAlten | 10:eed92ffd0bba | 298 | LOG("nR:[%d]\n", tempUpdate.numberOfReadings); |
JustinAtAlten | 10:eed92ffd0bba | 299 | LOG("pT:[%s]\n", floatToCharArray(tempUpdate.sensorReadingInterval)); |
JustinAtAlten | 10:eed92ffd0bba | 300 | // LOG("pT:[%f]\n", tempUpdate.sensorReadingInterval); |
JustinAtAlten | 10:eed92ffd0bba | 301 | for(unsigned int i=0; i < tempUpdate.numberOfReadings; i++){ |
JustinAtAlten | 10:eed92ffd0bba | 302 | LOG("%#010x\n", tempUpdate.readings[i]); |
JustinAtAlten | 10:eed92ffd0bba | 303 | } |
JustinAtAlten | 10:eed92ffd0bba | 304 | tempUpdateFlag = false; |
JustinAtAlten | 10:eed92ffd0bba | 305 | } |
JustinAtAlten | 10:eed92ffd0bba | 306 | } |
pietermaljaars | 0:7c12d0922052 | 307 | } |
pietermaljaars | 0:7c12d0922052 | 308 | |
JustinAtAlten | 10:eed92ffd0bba | 309 |