add class for ServicesNeedingUUIDDiscovery

This commit is contained in:
Rohit Grover 2015-05-27 07:24:46 +01:00
parent c852d13470
commit 3d9816a463
2 changed files with 62 additions and 31 deletions

View File

@ -25,9 +25,6 @@
static NordicServiceDiscovery sdSingleton;
static unsigned numServicesNeedingUUIDDiscovery;
static int servicesNeedingUUIDDiscovery[NordicServiceDiscovery::BLE_DB_DISCOVERY_MAX_SRV];
ble_error_t
ServiceDiscovery::launch(Gap::Handle_t connectionHandle,
ServiceCallback_t sc,
@ -110,30 +107,30 @@ NordicServiceDiscovery::launchCharacteristicDiscovery(Gap::Handle_t connectionHa
}
void
NordicServiceDiscovery::triggerServiceUUIDDiscovery(void)
NordicServiceDiscovery::ServiceIndicesNeedingUUIDDiscovery::triggerFirst(void)
{
while (numServicesNeedingUUIDDiscovery) {
sdSingleton.state = DISCOVER_SERVICE_UUIDS;
while (numIndices) {
parentContainer->state = DISCOVER_SERVICE_UUIDS;
unsigned serviceIndex = servicesNeedingUUIDDiscovery[0];
unsigned serviceIndex = serviceIndices[0];
ble_uuid_t uuid = {
.uuid = BLE_UUID_SERVICE_PRIMARY,
.type = BLE_UUID_TYPE_BLE,
};
ble_gattc_handle_range_t handleRange = {
.start_handle = services[serviceIndex].getStartHandle(),
.end_handle = services[serviceIndex].getEndHandle(),
.start_handle = parentContainer->services[serviceIndex].getStartHandle(),
.end_handle = parentContainer->services[serviceIndex].getEndHandle(),
};
if (sd_ble_gattc_char_value_by_uuid_read(connHandle, &uuid, &handleRange) != NRF_SUCCESS) {
removeFirstServiceNeedingUUIDDiscovery();
if (sd_ble_gattc_char_value_by_uuid_read(parentContainer->connHandle, &uuid, &handleRange) != NRF_SUCCESS) {
removeFirst();
continue;
}
return;
}
if (sdSingleton.state == DISCOVER_SERVICE_UUIDS) {
sdSingleton.state = SERVICE_DISCOVERY_ACTIVE;
if (parentContainer->state == DISCOVER_SERVICE_UUIDS) {
parentContainer->state = SERVICE_DISCOVERY_ACTIVE;
}
}
@ -146,17 +143,8 @@ NordicServiceDiscovery::processDiscoverUUIDResponse(const ble_gattc_evt_char_val
}
printf("\r\n");
removeFirstServiceNeedingUUIDDiscovery();
triggerServiceUUIDDiscovery();
}
void
NordicServiceDiscovery::removeFirstServiceNeedingUUIDDiscovery(void)
{
numServicesNeedingUUIDDiscovery--;
for (unsigned serviceIndex = 0; serviceIndex < numServicesNeedingUUIDDiscovery; serviceIndex++) {
servicesNeedingUUIDDiscovery[serviceIndex] = servicesNeedingUUIDDiscovery[serviceIndex + 1];
}
serviceIndicesNeedingUUIDDiscovery.removeFirst();
serviceIndicesNeedingUUIDDiscovery.triggerFirst();
}
void
@ -170,13 +158,10 @@ NordicServiceDiscovery::setupDiscoveredServices(const ble_gattc_evt_prim_srvc_di
numServices = BLE_DB_DISCOVERY_MAX_SRV;
}
numServicesNeedingUUIDDiscovery = 0;
for (unsigned serviceIndex = 0; serviceIndex < BLE_DB_DISCOVERY_MAX_SRV; serviceIndex++) {
servicesNeedingUUIDDiscovery[serviceIndex] = -1;
}
serviceIndicesNeedingUUIDDiscovery.reset();
for (unsigned serviceIndex = 0; serviceIndex < numServices; serviceIndex++) {
if (response->services[serviceIndex].uuid.type == BLE_UUID_TYPE_UNKNOWN) {
servicesNeedingUUIDDiscovery[numServicesNeedingUUIDDiscovery++] = serviceIndex;
serviceIndicesNeedingUUIDDiscovery.append(serviceIndex);
}
services[serviceIndex].setup(response->services[serviceIndex].uuid.uuid,
response->services[serviceIndex].handle_range.start_handle,
@ -184,8 +169,8 @@ NordicServiceDiscovery::setupDiscoveredServices(const ble_gattc_evt_prim_srvc_di
}
/* Trigger discovery of service UUID if necessary. */
if (numServicesNeedingUUIDDiscovery) {
triggerServiceUUIDDiscovery();
if (serviceIndicesNeedingUUIDDiscovery.getCount()) {
serviceIndicesNeedingUUIDDiscovery.triggerFirst();
}
}

View File

@ -40,6 +40,7 @@ public:
state(INACTIVE),
services(),
characteristics(),
serviceIndicesNeedingUUIDDiscovery(this),
onTerminationCallback(NULL) {
/* empty */
}
@ -106,6 +107,49 @@ private:
state = CHARACTERISTIC_DISCOVERY_ACTIVE;
}
private:
class ServiceIndicesNeedingUUIDDiscovery {
public:
ServiceIndicesNeedingUUIDDiscovery(NordicServiceDiscovery *parent) :
numIndices(0),
serviceIndices(),
parentContainer(parent) {
/* empty */
}
public:
void reset(void) {
numIndices = 0;
for (unsigned index = 0; index < BLE_DB_DISCOVERY_MAX_SRV; index++) {
serviceIndices[index] = INVALID_SERVICE_INDEX;
}
}
void append(int serviceIndex) {
serviceIndices[numIndices++] = serviceIndex;
}
void removeFirst(void) {
numIndices--;
for (unsigned index = 0; index < numIndices; index++) {
serviceIndices[index] = serviceIndices[index + 1];
}
}
size_t getCount(void) const {
return numIndices;
}
void triggerFirst(void);
private:
static const int INVALID_SERVICE_INDEX = -1;
private:
size_t numIndices;
int serviceIndices[BLE_DB_DISCOVERY_MAX_SRV];
NordicServiceDiscovery *parentContainer;
};
friend class ServiceIndicesNeedingUUIDDiscovery;
private:
friend void bleGattcEventHandler(const ble_evt_t *p_ble_evt);
void progressCharacteristicDiscovery(void);
@ -128,6 +172,8 @@ private:
* This is intended for internal use during service discovery. */
DiscoveredCharacteristic characteristics[BLE_DB_DISCOVERY_MAX_CHAR_PER_SRV];
ServiceIndicesNeedingUUIDDiscovery serviceIndicesNeedingUUIDDiscovery;
TerminationCallback_t onTerminationCallback;
};