Minor temporary patch to allow DFU packet callback
Fork of BLE_API by
Diff: services/URIBeacon2Service.h
- Revision:
- 185:7cd70497aec8
- Parent:
- 184:ec211f2288ef
- Child:
- 186:ce34008cea95
diff -r ec211f2288ef -r 7cd70497aec8 services/URIBeacon2Service.h --- a/services/URIBeacon2Service.h Fri Nov 28 14:11:23 2014 +0000 +++ b/services/URIBeacon2Service.h Fri Nov 28 14:11:24 2014 +0000 @@ -165,68 +165,6 @@ ble.onDataWritten(this, &URIBeacon2Service::onDataWritten); } -protected: - /** - * This callback allows the DFU service to receive the initial trigger to - * handover control to the bootloader; but first the application is given a - * chance to clean up. - */ - virtual void onDataWritten(const GattCharacteristicWriteCBParams *params) { - if (params->charHandle == uriDataChar.getValueAttribute().getHandle()) { - if (lockedState) { /* When locked, the device isn't allowed to update the uriData characteristic. */ - /* Restore GATT database with previous value. */ - ble.updateCharacteristicValue(uriDataChar.getValueAttribute().getHandle(), uriDataValue, uriDataLength); - return; - } - - /* We don't handle very large writes at the moment. */ - if ((params->offset != 0) || (params->len > MAX_SIZE_URI_DATA_CHAR_VALUE)) { - return; - } - - uriDataLength = params->len; - memcpy(uriDataValue, params->data, uriDataLength); - } else if (params->charHandle == flagsChar.getValueAttribute().getHandle()) { - if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ - /* Restore GATT database with previous value. */ - ble.updateCharacteristicValue(flagsChar.getValueAttribute().getHandle(), &flags, 1 /* size */); - return; - } else { - flags = *(params->data); - } - } else if (params->charHandle == txPowerLevelsChar.getValueAttribute().getHandle()) { - if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ - /* Restore GATT database with previous value. */ - ble.updateCharacteristicValue(txPowerLevelsChar.getValueAttribute().getHandle(), reinterpret_cast<uint8_t *>(powerLevels), NUM_POWER_MODES * sizeof(int8_t)); - return; - } else { - memcpy(powerLevels, params->data, NUM_POWER_MODES * sizeof(int8_t)); - } - } else if (params->charHandle == beaconPeriodChar.getValueAttribute().getHandle()) { - if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ - /* Restore GATT database with previous value. */ - ble.updateCharacteristicValue(beaconPeriodChar.getValueAttribute().getHandle(), (uint8_t *)&beaconPeriod, 2 /* size */); - return; - } else { - beaconPeriod = *((uint16_t *)(params->data)); - } - } - configure(); - ble.setAdvertisingPayload(); - } - - /** - * For debugging only. - */ - void dumpEncodedSeviceData() const { - printf("encoded: '"); - for (unsigned i = 0; i < payloadIndex; i++) { - printf(" %02x", serviceDataPayload[i]); - } - printf("'\r\n"); - } - -private: void configure(void) { const uint8_t BEACON_UUID[] = {0xD8, 0xFE}; @@ -326,6 +264,67 @@ return encodedBytes; } + /** + * This callback allows the DFU service to receive the initial trigger to + * handover control to the bootloader; but first the application is given a + * chance to clean up. + */ + virtual void onDataWritten(const GattCharacteristicWriteCBParams *params) { + if (params->charHandle == uriDataChar.getValueAttribute().getHandle()) { + if (lockedState) { /* When locked, the device isn't allowed to update the uriData characteristic. */ + /* Restore GATT database with previous value. */ + ble.updateCharacteristicValue(uriDataChar.getValueAttribute().getHandle(), uriDataValue, uriDataLength); + return; + } + + /* We don't handle very large writes at the moment. */ + if ((params->offset != 0) || (params->len > MAX_SIZE_URI_DATA_CHAR_VALUE)) { + return; + } + + uriDataLength = params->len; + memcpy(uriDataValue, params->data, uriDataLength); + } else if (params->charHandle == flagsChar.getValueAttribute().getHandle()) { + if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ + /* Restore GATT database with previous value. */ + ble.updateCharacteristicValue(flagsChar.getValueAttribute().getHandle(), &flags, 1 /* size */); + return; + } else { + flags = *(params->data); + } + } else if (params->charHandle == txPowerLevelsChar.getValueAttribute().getHandle()) { + if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ + /* Restore GATT database with previous value. */ + ble.updateCharacteristicValue(txPowerLevelsChar.getValueAttribute().getHandle(), reinterpret_cast<uint8_t *>(powerLevels), NUM_POWER_MODES * sizeof(int8_t)); + return; + } else { + memcpy(powerLevels, params->data, NUM_POWER_MODES * sizeof(int8_t)); + } + } else if (params->charHandle == beaconPeriodChar.getValueAttribute().getHandle()) { + if (lockedState) { /* When locked, the device isn't allowed to update the characteristic. */ + /* Restore GATT database with previous value. */ + ble.updateCharacteristicValue(beaconPeriodChar.getValueAttribute().getHandle(), (uint8_t *)&beaconPeriod, 2 /* size */); + return; + } else { + beaconPeriod = *((uint16_t *)(params->data)); + } + } + configure(); + ble.setAdvertisingPayload(); + } + +private: + /** + * For debugging only. + */ + void dumpEncodedSeviceData() const { + printf("encoded: '"); + for (unsigned i = 0; i < payloadIndex; i++) { + printf(" %02x", serviceDataPayload[i]); + } + printf("'\r\n"); + } + private: static const size_t MAX_SIZEOF_SERVICE_DATA_PAYLOAD = 27; static const size_t MAX_SIZE_URI_DATA_CHAR_VALUE = 48;