added subscribe/unsubscribe for indications

This commit is contained in:
Matthias Ringwald 2015-04-26 21:03:00 +02:00
parent e126fbda14
commit 22ea43c932
2 changed files with 32 additions and 2 deletions

View File

@ -82,6 +82,7 @@ static void (*bleDeviceDisconnectedCallback)(BLEDevice * device) = NULL;
static void (*gattServiceDiscoveredCallback)(BLEStatus status, BLEDevice * device, BLEService * bleService) = NULL; static void (*gattServiceDiscoveredCallback)(BLEStatus status, BLEDevice * device, BLEService * bleService) = NULL;
static void (*gattCharacteristicDiscoveredCallback)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic) = NULL; static void (*gattCharacteristicDiscoveredCallback)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic) = NULL;
static void (*gattCharacteristicNotificationCallback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length) = NULL; static void (*gattCharacteristicNotificationCallback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length) = NULL;
static void (*gattCharacteristicIndicationCallback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length) = NULL;
static void (*gattCharacteristicReadCallback)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length) = NULL; static void (*gattCharacteristicReadCallback)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length) = NULL;
static void (*gattCharacteristicWrittenCallback)(BLEStatus status, BLEDevice * device) = NULL; static void (*gattCharacteristicWrittenCallback)(BLEStatus status, BLEDevice * device) = NULL;
static void (*gattCharacteristicSubscribedCallback)(BLEStatus status, BLEDevice * device) = NULL; static void (*gattCharacteristicSubscribedCallback)(BLEStatus status, BLEDevice * device) = NULL;
@ -215,12 +216,17 @@ static void gatt_client_callback(le_event_t * event){
}; };
break; break;
case GATT_NOTIFICATION: case GATT_NOTIFICATION:
case GATT_INDICATION:
if (gattCharacteristicNotificationCallback) { if (gattCharacteristicNotificationCallback) {
le_characteristic_value_event_t * value_event = (le_characteristic_value_event_t *) event; le_characteristic_value_event_t * value_event = (le_characteristic_value_event_t *) event;
(*gattCharacteristicNotificationCallback)(&device, value_event->value_handle, value_event->blob, value_event->blob_length); (*gattCharacteristicNotificationCallback)(&device, value_event->value_handle, value_event->blob, value_event->blob_length);
} }
break; break;
case GATT_INDICATION:
if (gattCharacteristicIndicationCallback) {
le_characteristic_value_event_t * value_event = (le_characteristic_value_event_t *) event;
(*gattCharacteristicIndicationCallback)(&device, value_event->value_handle, value_event->blob, value_event->blob_length);
}
break;
case GATT_CHARACTERISTIC_VALUE_QUERY_RESULT: case GATT_CHARACTERISTIC_VALUE_QUERY_RESULT:
if (gattCharacteristicReadCallback) { if (gattCharacteristicReadCallback) {
le_characteristic_value_event_t * value_event = (le_characteristic_value_event_t *) event; le_characteristic_value_event_t * value_event = (le_characteristic_value_event_t *) event;
@ -444,6 +450,12 @@ int BLEDevice::subscribeForNotifications(BLECharacteristic * characteristic){
int BLEDevice::unsubscribeFromNotifications(BLECharacteristic * characteristic){ int BLEDevice::unsubscribeFromNotifications(BLECharacteristic * characteristic){
return BTstack.unsubscribeFromNotifications(this, characteristic); return BTstack.unsubscribeFromNotifications(this, characteristic);
} }
int BLEDevice::subscribeForIndications(BLECharacteristic * characteristic){
return BTstack.subscribeForIndications(this, characteristic);
}
int BLEDevice::unsubscribeFromIndications(BLECharacteristic * characteristic){
return BTstack.unsubscribeFromIndications(this, characteristic);
}
BTstackManager::BTstackManager() { BTstackManager::BTstackManager() {
@ -476,6 +488,9 @@ void BTstackManager::setGATTCharacteristicDiscoveredCallback(void (*callback)(BL
void BTstackManager::setGATTCharacteristicNotificationCallback(void (*callback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)){ void BTstackManager::setGATTCharacteristicNotificationCallback(void (*callback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)){
gattCharacteristicNotificationCallback = callback; gattCharacteristicNotificationCallback = callback;
} }
void BTstackManager::setGATTCharacteristicIndicationCallback(void (*callback)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)){
gattCharacteristicIndicationCallback = callback;
}
void BTstackManager::setGATTCharacteristicReadCallback(void (*callback)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)){ void BTstackManager::setGATTCharacteristicReadCallback(void (*callback)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)){
gattCharacteristicReadCallback = callback; gattCharacteristicReadCallback = callback;
} }
@ -514,11 +529,21 @@ int BTstackManager::subscribeForNotifications(BLEDevice * device, BLECharacteris
return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(), return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(),
GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
} }
int BTstackManager::subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic){
gattAction = gattActionSubscribe;
return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(),
GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION);
}
int BTstackManager::unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic){ int BTstackManager::unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic){
gattAction = gattActionUnsubscribe; gattAction = gattActionUnsubscribe;
return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(), return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(),
GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE); GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE);
} }
int BTstackManager::unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic){
gattAction = gattActionUnsubscribe;
return gatt_client_write_client_characteristic_configuration(gatt_client_id, device->getHandle(), (le_characteristic_t*) characteristic->getCharacteristic(),
GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE);
}
void BTstackManager::bleConnect(BLEAdvertisement * advertisement, int timeout_ms){ void BTstackManager::bleConnect(BLEAdvertisement * advertisement, int timeout_ms){
bleConnect(advertisement->getBdAddr(), timeout_ms); bleConnect(advertisement->getBdAddr(), timeout_ms);
} }

View File

@ -112,6 +112,8 @@ public:
// subscribe/unsubscribe // subscribe/unsubscribe
int subscribeForNotifications(BLECharacteristic * characteristic); int subscribeForNotifications(BLECharacteristic * characteristic);
int unsubscribeFromNotifications(BLECharacteristic * characteristic); int unsubscribeFromNotifications(BLECharacteristic * characteristic);
int subscribeForIndications(BLECharacteristic * characteristic);
int unsubscribeFromIndications(BLECharacteristic * characteristic);
}; };
class BTstackManager { class BTstackManager {
@ -147,9 +149,11 @@ public:
int writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); int writeCharacteristic(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
int writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size); int writeCharacteristicWithoutResponse(BLEDevice * device, BLECharacteristic * characteristic, uint8_t * data, uint16_t size);
// subscribe/unsubscribe // subscribe/unsubscribe notification and indications
int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic); int subscribeForNotifications(BLEDevice * device, BLECharacteristic * characteristic);
int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic); int unsubscribeFromNotifications(BLEDevice * device, BLECharacteristic * characteristic);
int subscribeForIndications(BLEDevice * device, BLECharacteristic * characteristic);
int unsubscribeFromIndications(BLEDevice * device, BLECharacteristic * characteristic);
// Callbacks // Callbacks
void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement)); void setBLEAdvertisementCallback(void (*)(BLEAdvertisement * bleAdvertisement));
@ -159,6 +163,7 @@ public:
void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic)); void setGATTCharacteristicDiscoveredCallback(void (*)(BLEStatus status, BLEDevice * device, BLECharacteristic * characteristic));
void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length)); void setGATTCharacteristicReadCallback(void (*)(BLEStatus status, BLEDevice * device, uint8_t * value, uint16_t length));
void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length)); void setGATTCharacteristicNotificationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
void setGATTCharacteristicIndicationCallback(void (*)(BLEDevice * device, uint16_t value_handle, uint8_t* value, uint16_t length));
void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device)); void setGATTDoneCallback(void (*)(BLEStatus status, BLEDevice * device));
void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device)); void setGATTCharacteristicWrittenCallback(void (*)(BLEStatus status, BLEDevice * device));