Update for latest nRF51822 code changes.
Dependencies: BLE_API nRF51822
Fork of Puck by
Diff: Puck.h
- Revision:
- 10:67e4694f2d74
- Parent:
- 8:49ffd38fb401
- Parent:
- 9:ba0527c6b6d0
- Child:
- 12:8a8cc109f048
- Child:
- 16:fb8678ee25b0
--- a/Puck.h Thu Jul 24 14:27:55 2014 +0000
+++ b/Puck.h Fri Aug 01 07:45:38 2014 +0000
@@ -5,7 +5,7 @@
#include <vector>
#include "Log.h"
- enum PuckState {
+enum PuckState {
CONNECTING,
CONNECTED,
ADVERTISING,
@@ -48,11 +48,15 @@
void init(uint16_t minor);
void startAdvertising();
void stopAdvertising();
+ void disconnect();
bool drive();
+ int countFreeMemory();
void onDataWritten(uint16_t handle);
void addCharacteristic(const UUID serviceUuid, const UUID characteristicUuid, int bytes, int properties = 0xA);
- void onCharacteristicWrite(const UUID uuid, CharacteristicWriteCallback callback);
+
+ void onCharacteristicWrite(const UUID* uuid, CharacteristicWriteCallback callback);
void updateCharacteristicValue(const UUID uuid, uint8_t* value, int length);
+
uint8_t* getCharacteristicValue(const UUID uuid);
};
@@ -79,14 +83,15 @@
bool isEqualUUID(const UUID* uuidA, const UUID uuidB) {
const uint8_t* uuidABase = uuidA->getBaseUUID();
const uint8_t* uuidBBase = uuidB.getBaseUUID();
- if(uuidA->getShortUUID() != uuidB.getShortUUID()) {
- return false;
- }
+
for(int i = 0; i < 16; i++) {
if(uuidABase[i] != uuidBBase[i]) {
return false;
}
}
+ if(uuidA->getShortUUID() != uuidB.getShortUUID()) {
+ return false;
+ }
return true;
}
@@ -98,6 +103,30 @@
return UUID(array);
}
+void Puck::disconnect() {
+ ble.disconnect();
+}
+
+int Puck::countFreeMemory() {
+ int blocksize = 256;
+ int amount = 0;
+ while (blocksize > 0) {
+ amount += blocksize;
+ LOG_VERBOSE("Trying to malloc %i bytes... ", amount);
+ char *p = (char *) malloc(amount);
+ if (p == NULL) {
+ LOG_VERBOSE("FAIL!\n", amount);
+ amount -= blocksize;
+ blocksize /= 2;
+ } else {
+ free(p);
+ LOG_VERBOSE("OK!\n", amount);
+ }
+ }
+ LOG_DEBUG("Free memory: %i bytes.\n", amount);
+ return amount;
+}
+
void Puck::setState(PuckState state) {
LOG_DEBUG("Changed state to %i\n", state);
this->state = state;
@@ -129,29 +158,30 @@
}
ble.init();
- LOG_VERBOSE("Inited BLEDevice.\n");
+ LOG_DEBUG("Inited BLEDevice.\n");
setState(DISCONNECTED);
ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
- LOG_VERBOSE("Accumulate advertising payload: BREDR_NOT_SUPPORTED.\n");
+ LOG_DEBUG("Accumulate advertising payload: BREDR_NOT_SUPPORTED.\n");
ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, beaconPayload, sizeof(beaconPayload));
- LOG_VERBOSE("Accumulate advertising payload: beacon data.\n");
+ LOG_DEBUG("Accumulate advertising payload: beacon data.\n");
ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
- LOG_VERBOSE("Setting advertising type: ADV_CONNECTABLE_UNDIRECTED.\n");
+ LOG_DEBUG("Setting advertising type: ADV_CONNECTABLE_UNDIRECTED.\n");
int hundredMillisecondsInAdvertisingIntervalFormat = 160;
ble.setAdvertisingInterval(hundredMillisecondsInAdvertisingIntervalFormat);
- LOG_VERBOSE("Set advertising interval: 160 (100 ms).\n");
+ LOG_DEBUG("Set advertising interval: 160 (100 ms).\n");
ble.onDisconnection(onDisconnection);
ble.onConnection(onConnection);
ble.onDataWritten(onDataWrittenCallback);
+ LOG_DEBUG("Hooked up internal event handlers.\n");
for(int i = 0; i < services.size(); i++) {
ble.addService(*services[i]);
- LOG_VERBOSE("Added service %x to BLEDevice\n", services[i]);
+ LOG_DEBUG("Added service %x to BLEDevice\n", services[i]);
}
LOG_INFO("Inited puck as 0x%X.\n", minor);
@@ -176,12 +206,18 @@
void Puck::addCharacteristic(const UUID serviceUuid, const UUID characteristicUuid, int bytes, int properties) {
MBED_ASSERT(bytes <= 20);
-
uint16_t size = sizeof(uint8_t) * bytes;
uint8_t* value = (uint8_t*) malloc(size);
+ if(value == NULL) {
+ LOG_ERROR("Unable to malloc value for characteristic. Possibly out of memory!\n");
+ }
+
GattCharacteristic* characteristic = new GattCharacteristic(characteristicUuid, value, size, size, properties);
characteristics.push_back(characteristic);
+
+
GattService* service = NULL;
+
int removeIndex = -1;
for(int i = 0; i < services.size(); i++) {
if(isEqualUUID(&services[i]->getUUID(), serviceUuid)) {
@@ -195,6 +231,9 @@
if(service != NULL) {
characteristicsLength = service->getCharacteristicCount() + 1;
characteristics = (GattCharacteristic**) malloc(sizeof(GattCharacteristic*) * characteristicsLength);
+ if(characteristics == NULL) {
+ LOG_ERROR("Unable to malloc array of characteristics for service creation. Possibly out of memory!\n");
+ }
for(int i = 0; i < characteristicsLength; i++) {
characteristics[i] = service->getCharacteristic(i);
}
@@ -204,11 +243,16 @@
} else {
characteristicsLength = 1;
characteristics = (GattCharacteristic**) malloc(sizeof(GattCharacteristic*) * characteristicsLength);
+ if(characteristics == NULL) {
+ LOG_ERROR("Unable to malloc array of characteristics for service creation. Possibly out of memory!\n");
+ }
}
+
characteristics[characteristicsLength - 1] = characteristic;
previousCharacteristics = characteristics;
service = new GattService(serviceUuid, characteristics, characteristicsLength);
services.push_back(service);
+ LOG_DEBUG("Added characteristic.\n");
}
@@ -234,27 +278,28 @@
startAdvertising();
}
while(pendingCallbackStack.size() > 0) {
- LOG_VERBOSE("PendingCallbackStack size: %i\n", pendingCallbackStack.size());
pendingCallbackStack.back()(pendingCallbackParameterStack.back());
pendingCallbackStack.pop_back();
pendingCallbackParameterStack.pop_back();
- LOG_VERBOSE("Callback fired\n");
}
return true;
}
-void Puck::onCharacteristicWrite(const UUID uuid, CharacteristicWriteCallback callback) {
+void Puck::onCharacteristicWrite(const UUID* uuid, CharacteristicWriteCallback callback) {
CharacteristicWriteCallbacks* cb = NULL;
for(int i = 0; i< writeCallbacks.size(); i++) {
- if(isEqualUUID(writeCallbacks[i]->uuid, uuid)) {
+ if(isEqualUUID(writeCallbacks[i]->uuid, *uuid)) {
cb = writeCallbacks[i];
break;
}
}
if(cb == NULL) {
cb = (CharacteristicWriteCallbacks*) malloc(sizeof(CharacteristicWriteCallbacks));
- cb->uuid = &uuid;
+ if(cb == NULL) {
+ LOG_ERROR("Could not malloc CharacteristicWriteCallbacks container. Possibly out of memory!\n");
+ }
+ cb->uuid = uuid;
cb->callbacks = new std::vector<CharacteristicWriteCallback>();
writeCallbacks.push_back(cb);
}
@@ -289,8 +334,8 @@
pendingCallbackStack.push_back(characteristicWriteCallbacks->callbacks->at(k));
pendingCallbackParameterStack.push_back(characteristic->getValuePtr());
}
+ return;
}
- return;
}
}
}
