
BLE GATT-service implementation for high quantity sensor data from a MPU6050-accelerator/gyroscope
Dependencies: BLE_API mbed nRF51822 MPU6050_lib
main.cpp@9:6a28d9c0e486, 2015-07-22 (annotated)
- Committer:
- fruediger
- Date:
- Wed Jul 22 16:03:03 2015 +0000
- Revision:
- 9:6a28d9c0e486
- Parent:
- 7:af3e2b9c137a
- Child:
- 10:b305e261e7d1
implemented the MPU6050Service
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fruediger | 1:6a40ad9ac7e5 | 1 | /** Includes */ |
fruediger | 1:6a40ad9ac7e5 | 2 | |
fruediger | 1:6a40ad9ac7e5 | 3 | #include "common.h" |
fruediger | 0:23fd064af409 | 4 | #include "mbed.h" |
fruediger | 0:23fd064af409 | 5 | #include "BLE.h" |
fruediger | 3:d72d9195dc26 | 6 | #include "MPU6050Service.h" |
fruediger | 4:a97e6917f731 | 7 | #include "services/BatteryService.h" |
fruediger | 5:ea4d280a0a2f | 8 | #include "services/DeviceInformationService.h" |
fruediger | 7:af3e2b9c137a | 9 | /***/ |
fruediger | 7:af3e2b9c137a | 10 | #include "LedPwmService.h" |
fruediger | 9:6a28d9c0e486 | 11 | #include "PowerService.h" |
fruediger | 1:6a40ad9ac7e5 | 12 | |
fruediger | 1:6a40ad9ac7e5 | 13 | /** Constants */ |
fruediger | 1:6a40ad9ac7e5 | 14 | |
fruediger | 9:6a28d9c0e486 | 15 | static const char deviceName[] = "nano bear"; |
fruediger | 9:6a28d9c0e486 | 16 | static const char deviceManufacturers[] = "???"; |
fruediger | 9:6a28d9c0e486 | 17 | static const char deviceModelNumber[] = ""; |
fruediger | 9:6a28d9c0e486 | 18 | static const char deviceSerialNumber[] = XSTRING_(MBED_BUILD_TIMESTAMP); |
fruediger | 9:6a28d9c0e486 | 19 | static const char deviceHardwareRev[] = "0.1"; |
fruediger | 9:6a28d9c0e486 | 20 | static const char deviceFirmwareRev[] = "0.1"; |
fruediger | 9:6a28d9c0e486 | 21 | static const char deviceSoftwareRev[] = ""; |
fruediger | 1:6a40ad9ac7e5 | 22 | |
fruediger | 9:6a28d9c0e486 | 23 | static const uint16_t minimumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(20); // 20ms |
fruediger | 9:6a28d9c0e486 | 24 | static const uint16_t maximumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(40); // 40ms; |
fruediger | 9:6a28d9c0e486 | 25 | static const uint16_t slaveLatency = 0; |
fruediger | 9:6a28d9c0e486 | 26 | |
fruediger | 9:6a28d9c0e486 | 27 | static const float batteryCritBlinkSequ[] = { 0.000f, 0.146f, 0.500f, 0.854f, 1.000f, 0.854f, 0.500f, 0.146f }; |
fruediger | 0:23fd064af409 | 28 | |
fruediger | 9:6a28d9c0e486 | 29 | static const float bluetoothLedTimeout = 0.05f; |
fruediger | 9:6a28d9c0e486 | 30 | static const float connectedBlinkSequ[] = { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 31 | 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 32 | 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 33 | 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 34 | 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 35 | 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, |
fruediger | 9:6a28d9c0e486 | 36 | 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f, |
fruediger | 9:6a28d9c0e486 | 37 | 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f }; |
fruediger | 9:6a28d9c0e486 | 38 | static const float disconnectedBlinkSequ[] = { 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f, |
fruediger | 9:6a28d9c0e486 | 39 | 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f, |
fruediger | 9:6a28d9c0e486 | 40 | 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f, |
fruediger | 9:6a28d9c0e486 | 41 | 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f, |
fruediger | 9:6a28d9c0e486 | 42 | 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f, |
fruediger | 9:6a28d9c0e486 | 43 | 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f, |
fruediger | 9:6a28d9c0e486 | 44 | 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, |
fruediger | 9:6a28d9c0e486 | 45 | 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, |
fruediger | 9:6a28d9c0e486 | 46 | 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f }; |
fruediger | 9:6a28d9c0e486 | 47 | |
fruediger | 9:6a28d9c0e486 | 48 | static const float powerAccumulationTimeout = 0.005f; |
fruediger | 7:af3e2b9c137a | 49 | |
fruediger | 7:af3e2b9c137a | 50 | /** Power determination stuff: |
fruediger | 7:af3e2b9c137a | 51 | * |
fruediger | 7:af3e2b9c137a | 52 | * The following is the schematic circuit ... |
fruediger | 7:af3e2b9c137a | 53 | * |
fruediger | 7:af3e2b9c137a | 54 | * I0-> ____ |
fruediger | 7:af3e2b9c137a | 55 | * --------*-|____|-*----------- ... where ... |
fruediger | 7:af3e2b9c137a | 56 | * | | R2 | | |
fruediger | 7:af3e2b9c137a | 57 | * | | | _____|_____ | |
fruediger | 7:af3e2b9c137a | 58 | * | | | | | | | | | ____ |
fruediger | 7:af3e2b9c137a | 59 | * | R1 | | R4 | | | BLE nano | | | and -|____|- are resistors ... |
fruediger | 7:af3e2b9c137a | 60 | * | |_| |_| | |--... |_| |
fruediger | 7:af3e2b9c137a | 61 | * | |~0-> | | | | |
fruediger | 7:af3e2b9c137a | 62 | * | Uref1 *--------|----| P0_4 |--... |
fruediger | 7:af3e2b9c137a | 63 | * + __|__ | |~0->| | ... and ... |
fruediger | 7:af3e2b9c137a | 64 | * U0 ___ | Uref2 *----| P0_5 |--... |
fruediger | 7:af3e2b9c137a | 65 | * | | | | | + __|__ |
fruediger | 7:af3e2b9c137a | 66 | * | | | | | | |--... ___ is the constant voltage source |
fruediger | 7:af3e2b9c137a | 67 | * | R2 | | R5 | | | | | (a battery in this case) |
fruediger | 7:af3e2b9c137a | 68 | * | |_| |_| |___________| |
fruediger | 7:af3e2b9c137a | 69 | * | | | | |
fruediger | 7:af3e2b9c137a | 70 | * | | | | |
fruediger | 7:af3e2b9c137a | 71 | * *-------*--------*----------*--------... |
fruediger | 7:af3e2b9c137a | 72 | * _|_ |
fruediger | 7:af3e2b9c137a | 73 | * |
fruediger | 7:af3e2b9c137a | 74 | * |
fruediger | 7:af3e2b9c137a | 75 | * Therefore the input values are |
fruediger | 7:af3e2b9c137a | 76 | * |
fruediger | 7:af3e2b9c137a | 77 | * U0 = (R1 / R2 + 1) * Uref1 |
fruediger | 7:af3e2b9c137a | 78 | * |
fruediger | 7:af3e2b9c137a | 79 | * I0 = ((R1 + R3) / R2 + 1) / R3 * Uref1 - (R4 / R5 + 1) / R3 * Uref2 |
fruediger | 7:af3e2b9c137a | 80 | * |
fruediger | 7:af3e2b9c137a | 81 | */ |
fruediger | 7:af3e2b9c137a | 82 | |
fruediger | 7:af3e2b9c137a | 83 | #define R1 1000.0f |
fruediger | 7:af3e2b9c137a | 84 | #define R2 1000.0f |
fruediger | 7:af3e2b9c137a | 85 | #define R3 220.0f |
fruediger | 7:af3e2b9c137a | 86 | #define R4 1000.0f |
fruediger | 7:af3e2b9c137a | 87 | #define R5 1000.0f |
fruediger | 7:af3e2b9c137a | 88 | #define NANO_OP_VOLT 3.3f |
fruediger | 7:af3e2b9c137a | 89 | |
fruediger | 9:6a28d9c0e486 | 90 | static const float voltFac = ((R1 / R2) + 1.0f) * NANO_OP_VOLT; |
fruediger | 9:6a28d9c0e486 | 91 | static const float currFac1 = ((((R1 + R3) / R2) + 1.0f) / R3) * NANO_OP_VOLT; |
fruediger | 9:6a28d9c0e486 | 92 | static const float currFac2 = (((R4 / R5) + 1.0f) / R3) * NANO_OP_VOLT; |
fruediger | 9:6a28d9c0e486 | 93 | |
fruediger | 9:6a28d9c0e486 | 94 | static const float powerServiceUpdateTimeout = 0.1f; |
fruediger | 1:6a40ad9ac7e5 | 95 | |
fruediger | 1:6a40ad9ac7e5 | 96 | |
fruediger | 1:6a40ad9ac7e5 | 97 | |
fruediger | 1:6a40ad9ac7e5 | 98 | /** Global variables */ |
fruediger | 1:6a40ad9ac7e5 | 99 | |
fruediger | 3:d72d9195dc26 | 100 | Serial pc(USBTX, USBRX); |
fruediger | 3:d72d9195dc26 | 101 | |
fruediger | 0:23fd064af409 | 102 | BLE ble; |
fruediger | 0:23fd064af409 | 103 | Gap::ConnectionParams_t fast; |
fruediger | 0:23fd064af409 | 104 | |
fruediger | 9:6a28d9c0e486 | 105 | MPU6050 mpu(I2C_SDA0, I2C_SCL0, MPU6050::ADDRESS_0); |
fruediger | 0:23fd064af409 | 106 | |
fruediger | 4:a97e6917f731 | 107 | PwmOut btLed(P0_28); |
fruediger | 9:6a28d9c0e486 | 108 | //PwmOut batLed(P0_29); |
fruediger | 9:6a28d9c0e486 | 109 | DigitalOut aliveLed(LED); |
fruediger | 7:af3e2b9c137a | 110 | AnalogIn uRef1(P0_4); |
fruediger | 7:af3e2b9c137a | 111 | AnalogIn uRef2(P0_5); |
fruediger | 4:a97e6917f731 | 112 | |
fruediger | 9:6a28d9c0e486 | 113 | Ticker powerAccumulationTicker; |
fruediger | 9:6a28d9c0e486 | 114 | Ticker powerServiceUpdateTicker; |
fruediger | 9:6a28d9c0e486 | 115 | Ticker bluetoothLedTicker; |
fruediger | 9:6a28d9c0e486 | 116 | |
fruediger | 0:23fd064af409 | 117 | |
fruediger | 1:6a40ad9ac7e5 | 118 | |
fruediger | 3:d72d9195dc26 | 119 | /** Helpers */ |
fruediger | 1:6a40ad9ac7e5 | 120 | |
fruediger | 7:af3e2b9c137a | 121 | float funitf(char *cunit_out, float value, int unit = 0, float divisor = 1000.0f, float upper_bound = 900.0f, float lower_bound = 0.9f) |
fruediger | 7:af3e2b9c137a | 122 | { |
fruediger | 7:af3e2b9c137a | 123 | static const char prefix[] = { 'y', 'z', 'a', 'f', 'p', 'n', 'u', 'm', 0, 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' }; |
fruediger | 7:af3e2b9c137a | 124 | static const int prefixOffset = 8; |
fruediger | 7:af3e2b9c137a | 125 | |
fruediger | 7:af3e2b9c137a | 126 | if (unit < -8) |
fruediger | 7:af3e2b9c137a | 127 | do |
fruediger | 7:af3e2b9c137a | 128 | { |
fruediger | 7:af3e2b9c137a | 129 | unit++; |
fruediger | 7:af3e2b9c137a | 130 | value *= divisor; |
fruediger | 7:af3e2b9c137a | 131 | } while (unit < -8); |
fruediger | 7:af3e2b9c137a | 132 | else if (unit > 8) |
fruediger | 7:af3e2b9c137a | 133 | do |
fruediger | 7:af3e2b9c137a | 134 | { |
fruediger | 7:af3e2b9c137a | 135 | unit--; |
fruediger | 7:af3e2b9c137a | 136 | value /= divisor; |
fruediger | 7:af3e2b9c137a | 137 | } while (unit > 8); |
fruediger | 7:af3e2b9c137a | 138 | else while (unit != -8 && unit != 8) |
fruediger | 7:af3e2b9c137a | 139 | if (value > upper_bound) |
fruediger | 7:af3e2b9c137a | 140 | { |
fruediger | 7:af3e2b9c137a | 141 | unit++; |
fruediger | 7:af3e2b9c137a | 142 | value /= divisor; |
fruediger | 7:af3e2b9c137a | 143 | } |
fruediger | 7:af3e2b9c137a | 144 | else if (value < lower_bound) |
fruediger | 7:af3e2b9c137a | 145 | { |
fruediger | 7:af3e2b9c137a | 146 | unit--; |
fruediger | 7:af3e2b9c137a | 147 | value *= divisor; |
fruediger | 7:af3e2b9c137a | 148 | } |
fruediger | 7:af3e2b9c137a | 149 | else |
fruediger | 7:af3e2b9c137a | 150 | break; |
fruediger | 7:af3e2b9c137a | 151 | |
fruediger | 7:af3e2b9c137a | 152 | cunit_out[0] = prefix[prefixOffset + unit]; |
fruediger | 7:af3e2b9c137a | 153 | return value; |
fruediger | 7:af3e2b9c137a | 154 | } |
fruediger | 7:af3e2b9c137a | 155 | |
fruediger | 1:6a40ad9ac7e5 | 156 | |
fruediger | 1:6a40ad9ac7e5 | 157 | |
fruediger | 9:6a28d9c0e486 | 158 | /** Callback and handler functions */ |
fruediger | 9:6a28d9c0e486 | 159 | |
fruediger | 9:6a28d9c0e486 | 160 | // Accumulate discharge |
fruediger | 9:6a28d9c0e486 | 161 | |
fruediger | 9:6a28d9c0e486 | 162 | static float U0 = 0.0f; |
fruediger | 9:6a28d9c0e486 | 163 | static float I0 = 0.0f; |
fruediger | 9:6a28d9c0e486 | 164 | static float Q = 0.0f; |
fruediger | 9:6a28d9c0e486 | 165 | |
fruediger | 9:6a28d9c0e486 | 166 | void powerAccumulationPeriodicCallback() |
fruediger | 9:6a28d9c0e486 | 167 | { |
fruediger | 9:6a28d9c0e486 | 168 | // we have to do it in here, since we want a good approximation of the dt-timestep |
fruediger | 9:6a28d9c0e486 | 169 | // since these are simple calculations this won't take much time |
fruediger | 9:6a28d9c0e486 | 170 | |
fruediger | 9:6a28d9c0e486 | 171 | register float u1 = uRef1.read(); |
fruediger | 9:6a28d9c0e486 | 172 | |
fruediger | 9:6a28d9c0e486 | 173 | U0 = u1 * voltFac; |
fruediger | 9:6a28d9c0e486 | 174 | I0 = (u1 * currFac1) - (uRef2.read() * currFac2); |
fruediger | 9:6a28d9c0e486 | 175 | Q += I0 * powerAccumulationTimeout; |
fruediger | 9:6a28d9c0e486 | 176 | } |
fruediger | 9:6a28d9c0e486 | 177 | |
fruediger | 9:6a28d9c0e486 | 178 | |
fruediger | 9:6a28d9c0e486 | 179 | |
fruediger | 9:6a28d9c0e486 | 180 | // Update the power service characteristics |
fruediger | 9:6a28d9c0e486 | 181 | |
fruediger | 9:6a28d9c0e486 | 182 | static bool powerServiceUpdateTrigger = false; |
fruediger | 1:6a40ad9ac7e5 | 183 | |
fruediger | 9:6a28d9c0e486 | 184 | void powerServiceUpdateHandler(PowerService* powerService) |
fruediger | 9:6a28d9c0e486 | 185 | { |
fruediger | 9:6a28d9c0e486 | 186 | powerServiceUpdateTrigger = false; |
fruediger | 9:6a28d9c0e486 | 187 | |
fruediger | 9:6a28d9c0e486 | 188 | powerService->updateVoltage(U0); |
fruediger | 9:6a28d9c0e486 | 189 | powerService->updateCurrent(I0 * 1000); |
fruediger | 9:6a28d9c0e486 | 190 | powerService->updateDischarge(Q * 0.277777777f); |
fruediger | 9:6a28d9c0e486 | 191 | } |
fruediger | 9:6a28d9c0e486 | 192 | |
fruediger | 9:6a28d9c0e486 | 193 | void powerServiceUpdatePeriodicCallback() |
fruediger | 9:6a28d9c0e486 | 194 | { |
fruediger | 9:6a28d9c0e486 | 195 | powerServiceUpdateTrigger = true; |
fruediger | 9:6a28d9c0e486 | 196 | } |
fruediger | 9:6a28d9c0e486 | 197 | |
fruediger | 9:6a28d9c0e486 | 198 | |
fruediger | 9:6a28d9c0e486 | 199 | // Update the bluetooth connection state LED |
fruediger | 9:6a28d9c0e486 | 200 | |
fruediger | 9:6a28d9c0e486 | 201 | static bool bluetoothLedTrigger = false; |
fruediger | 9:6a28d9c0e486 | 202 | |
fruediger | 9:6a28d9c0e486 | 203 | void bluetoothLedHandler(Gap &gap) |
fruediger | 9:6a28d9c0e486 | 204 | { |
fruediger | 9:6a28d9c0e486 | 205 | bluetoothLedTrigger = false; |
fruediger | 9:6a28d9c0e486 | 206 | |
fruediger | 9:6a28d9c0e486 | 207 | aliveLed = !aliveLed; |
fruediger | 9:6a28d9c0e486 | 208 | |
fruediger | 9:6a28d9c0e486 | 209 | static int conCnt = -1; |
fruediger | 3:d72d9195dc26 | 210 | static const int connectedBlinkSequSize = sizeof(connectedBlinkSequ) / sizeof(float); |
fruediger | 3:d72d9195dc26 | 211 | static const int disconnectedBlinkSequSize = sizeof(disconnectedBlinkSequ) / sizeof(float); |
fruediger | 3:d72d9195dc26 | 212 | |
fruediger | 9:6a28d9c0e486 | 213 | if (gap.getState().connected) |
fruediger | 3:d72d9195dc26 | 214 | { |
fruediger | 4:a97e6917f731 | 215 | conCnt = ((conCnt + 1) % connectedBlinkSequSize); |
fruediger | 7:af3e2b9c137a | 216 | btLed = connectedBlinkSequ[conCnt]; |
fruediger | 3:d72d9195dc26 | 217 | } |
fruediger | 3:d72d9195dc26 | 218 | else |
fruediger | 3:d72d9195dc26 | 219 | { |
fruediger | 4:a97e6917f731 | 220 | conCnt = ((conCnt + 1) % disconnectedBlinkSequSize); |
fruediger | 4:a97e6917f731 | 221 | btLed = disconnectedBlinkSequ[conCnt]; |
fruediger | 4:a97e6917f731 | 222 | } |
fruediger | 0:23fd064af409 | 223 | } |
fruediger | 0:23fd064af409 | 224 | |
fruediger | 9:6a28d9c0e486 | 225 | void bluetoothLedPeriodicCallback() |
fruediger | 0:23fd064af409 | 226 | { |
fruediger | 9:6a28d9c0e486 | 227 | bluetoothLedTrigger = true; |
fruediger | 9:6a28d9c0e486 | 228 | } |
fruediger | 9:6a28d9c0e486 | 229 | |
fruediger | 9:6a28d9c0e486 | 230 | |
fruediger | 9:6a28d9c0e486 | 231 | |
fruediger | 9:6a28d9c0e486 | 232 | // Connection timeout |
fruediger | 9:6a28d9c0e486 | 233 | |
fruediger | 9:6a28d9c0e486 | 234 | static bool timeoutTrigger = false; |
fruediger | 9:6a28d9c0e486 | 235 | |
fruediger | 9:6a28d9c0e486 | 236 | void timeoutHandler(Gap &gap) |
fruediger | 9:6a28d9c0e486 | 237 | { |
fruediger | 9:6a28d9c0e486 | 238 | timeoutTrigger = false; |
fruediger | 4:a97e6917f731 | 239 | |
fruediger | 9:6a28d9c0e486 | 240 | gap.startAdvertising(); |
fruediger | 9:6a28d9c0e486 | 241 | } |
fruediger | 9:6a28d9c0e486 | 242 | |
fruediger | 9:6a28d9c0e486 | 243 | void timeoutCallback(Gap::TimeoutSource_t source) |
fruediger | 9:6a28d9c0e486 | 244 | { |
fruediger | 9:6a28d9c0e486 | 245 | timeoutTrigger = true; |
fruediger | 9:6a28d9c0e486 | 246 | } |
fruediger | 9:6a28d9c0e486 | 247 | |
fruediger | 9:6a28d9c0e486 | 248 | |
fruediger | 9:6a28d9c0e486 | 249 | |
fruediger | 9:6a28d9c0e486 | 250 | // Disconnection |
fruediger | 9:6a28d9c0e486 | 251 | |
fruediger | 9:6a28d9c0e486 | 252 | static bool disconnectionTrigger = false; |
fruediger | 9:6a28d9c0e486 | 253 | |
fruediger | 9:6a28d9c0e486 | 254 | void disconnectionHandler(Gap &gap) |
fruediger | 9:6a28d9c0e486 | 255 | { |
fruediger | 9:6a28d9c0e486 | 256 | disconnectionTrigger = false; |
fruediger | 4:a97e6917f731 | 257 | |
fruediger | 9:6a28d9c0e486 | 258 | gap.startAdvertising(); |
fruediger | 0:23fd064af409 | 259 | } |
fruediger | 0:23fd064af409 | 260 | |
fruediger | 0:23fd064af409 | 261 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
fruediger | 0:23fd064af409 | 262 | { |
fruediger | 9:6a28d9c0e486 | 263 | timeoutTrigger = true; |
fruediger | 9:6a28d9c0e486 | 264 | } |
fruediger | 9:6a28d9c0e486 | 265 | |
fruediger | 9:6a28d9c0e486 | 266 | |
fruediger | 9:6a28d9c0e486 | 267 | // Connection |
fruediger | 9:6a28d9c0e486 | 268 | |
fruediger | 9:6a28d9c0e486 | 269 | static bool connectionTrigger = false; |
fruediger | 9:6a28d9c0e486 | 270 | |
fruediger | 9:6a28d9c0e486 | 271 | void connectionHandler(MPU6050Service *mpu6050) |
fruediger | 9:6a28d9c0e486 | 272 | { |
fruediger | 9:6a28d9c0e486 | 273 | connectionTrigger = false; |
fruediger | 4:a97e6917f731 | 274 | |
fruediger | 9:6a28d9c0e486 | 275 | mpu6050->start(); |
fruediger | 0:23fd064af409 | 276 | } |
fruediger | 0:23fd064af409 | 277 | |
fruediger | 0:23fd064af409 | 278 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) |
fruediger | 9:6a28d9c0e486 | 279 | { |
fruediger | 0:23fd064af409 | 280 | // update the connection parameters with the tuned fast ones |
fruediger | 0:23fd064af409 | 281 | ble.updateConnectionParams(params->handle, &fast); |
fruediger | 0:23fd064af409 | 282 | |
fruediger | 9:6a28d9c0e486 | 283 | connectionTrigger = true; |
fruediger | 0:23fd064af409 | 284 | } |
fruediger | 0:23fd064af409 | 285 | |
fruediger | 1:6a40ad9ac7e5 | 286 | |
fruediger | 1:6a40ad9ac7e5 | 287 | |
fruediger | 1:6a40ad9ac7e5 | 288 | /** Main */ |
fruediger | 1:6a40ad9ac7e5 | 289 | |
fruediger | 0:23fd064af409 | 290 | int main() |
fruediger | 7:af3e2b9c137a | 291 | { |
fruediger | 4:a97e6917f731 | 292 | btLed = 1.0f; |
fruediger | 9:6a28d9c0e486 | 293 | aliveLed = 0; |
fruediger | 1:6a40ad9ac7e5 | 294 | |
fruediger | 9:6a28d9c0e486 | 295 | ble.init(); |
fruediger | 9:6a28d9c0e486 | 296 | |
fruediger | 9:6a28d9c0e486 | 297 | Gap &gap = ble.gap(); |
fruediger | 1:6a40ad9ac7e5 | 298 | |
fruediger | 9:6a28d9c0e486 | 299 | powerAccumulationTicker.attach(powerAccumulationPeriodicCallback, powerAccumulationTimeout); |
fruediger | 9:6a28d9c0e486 | 300 | powerServiceUpdateTicker.attach(powerServiceUpdatePeriodicCallback, powerServiceUpdateTimeout); |
fruediger | 9:6a28d9c0e486 | 301 | bluetoothLedTicker.attach(bluetoothLedPeriodicCallback, bluetoothLedTimeout); |
fruediger | 0:23fd064af409 | 302 | |
fruediger | 9:6a28d9c0e486 | 303 | gap.onTimeout(timeoutCallback); |
fruediger | 9:6a28d9c0e486 | 304 | gap.onDisconnection(disconnectionCallback); |
fruediger | 9:6a28d9c0e486 | 305 | gap.onConnection(connectionCallback); |
fruediger | 0:23fd064af409 | 306 | |
fruediger | 9:6a28d9c0e486 | 307 | gap.setDeviceName((const uint8_t*)deviceName); |
fruediger | 0:23fd064af409 | 308 | |
fruediger | 9:6a28d9c0e486 | 309 | gap.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
fruediger | 9:6a28d9c0e486 | 310 | gap.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t*)deviceName, sizeof(deviceName)); |
fruediger | 9:6a28d9c0e486 | 311 | gap.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
fruediger | 0:23fd064af409 | 312 | |
fruediger | 0:23fd064af409 | 313 | //TODO: DECISION: advertising at minimal interval may consumes to much power, but is way faster |
fruediger | 9:6a28d9c0e486 | 314 | gap.setAdvertisingInterval(gap.getMinAdvertisingInterval()); |
fruediger | 0:23fd064af409 | 315 | |
fruediger | 0:23fd064af409 | 316 | // tune the preferred connection parameters to enable transfer more often |
fruediger | 0:23fd064af409 | 317 | // TODO: DECISION: also waht about power consumption? |
fruediger | 9:6a28d9c0e486 | 318 | gap.getPreferredConnectionParams(&fast); |
fruediger | 0:23fd064af409 | 319 | fast.minConnectionInterval = minimumConnectionInterval; |
fruediger | 0:23fd064af409 | 320 | fast.maxConnectionInterval = maximumConnectionInterval; |
fruediger | 0:23fd064af409 | 321 | fast.slaveLatency = slaveLatency; |
fruediger | 9:6a28d9c0e486 | 322 | gap.setPreferredConnectionParams(&fast); |
fruediger | 5:ea4d280a0a2f | 323 | |
fruediger | 9:6a28d9c0e486 | 324 | BatteryService battery(ble); |
fruediger | 9:6a28d9c0e486 | 325 | DeviceInformationService deviceInformation(ble, deviceManufacturers, deviceModelNumber, deviceSerialNumber, deviceHardwareRev, deviceFirmwareRev, deviceSoftwareRev); |
fruediger | 9:6a28d9c0e486 | 326 | PowerService powerService(ble); |
fruediger | 9:6a28d9c0e486 | 327 | MPU6050Service mpu6050(ble, mpu); |
fruediger | 9:6a28d9c0e486 | 328 | LedPwmService ledService(ble, P0_29, 0.0f, &pc); |
fruediger | 5:ea4d280a0a2f | 329 | |
fruediger | 9:6a28d9c0e486 | 330 | gap.startAdvertising(); |
fruediger | 7:af3e2b9c137a | 331 | |
fruediger | 0:23fd064af409 | 332 | while (true) |
fruediger | 9:6a28d9c0e486 | 333 | { |
fruediger | 9:6a28d9c0e486 | 334 | // Handle all stuff within the user context |
fruediger | 9:6a28d9c0e486 | 335 | |
fruediger | 9:6a28d9c0e486 | 336 | mpu6050.handleService(); |
fruediger | 9:6a28d9c0e486 | 337 | |
fruediger | 9:6a28d9c0e486 | 338 | if (powerServiceUpdateTrigger) |
fruediger | 9:6a28d9c0e486 | 339 | powerServiceUpdateHandler(&powerService); |
fruediger | 9:6a28d9c0e486 | 340 | |
fruediger | 9:6a28d9c0e486 | 341 | if (bluetoothLedTrigger) |
fruediger | 9:6a28d9c0e486 | 342 | bluetoothLedHandler(gap); |
fruediger | 9:6a28d9c0e486 | 343 | |
fruediger | 9:6a28d9c0e486 | 344 | if (connectionTrigger) |
fruediger | 9:6a28d9c0e486 | 345 | connectionHandler(&mpu6050); |
fruediger | 9:6a28d9c0e486 | 346 | |
fruediger | 9:6a28d9c0e486 | 347 | if (disconnectionTrigger) |
fruediger | 9:6a28d9c0e486 | 348 | disconnectionHandler(gap); |
fruediger | 9:6a28d9c0e486 | 349 | |
fruediger | 9:6a28d9c0e486 | 350 | if (timeoutTrigger) |
fruediger | 9:6a28d9c0e486 | 351 | timeoutHandler(gap); |
fruediger | 9:6a28d9c0e486 | 352 | |
fruediger | 0:23fd064af409 | 353 | ble.waitForEvent(); |
fruediger | 9:6a28d9c0e486 | 354 | } |
fruediger | 0:23fd064af409 | 355 | } |