Nordic stack and drivers for the mbed BLE API

Dependents:   idd_hw5_bleFanProto

Fork of nRF51822 by Nordic Semiconductor

Revision:
56:a1071b629aa3
Parent:
52:120bd37b9d0d
Child:
57:2aa01a5008ac
--- a/nRF51GattServer.cpp	Fri Jul 25 10:33:52 2014 +0100
+++ b/nRF51GattServer.cpp	Tue Sep 02 15:50:05 2014 +0100
@@ -60,15 +60,15 @@
     for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
         GattCharacteristic *p_char = service.getCharacteristic(i);
 
-        nordicUUID = custom_convert_to_nordic_uuid(p_char->getUUID());
+        nordicUUID = custom_convert_to_nordic_uuid(p_char->getValueAttribute().getUUID());
 
         ASSERT ( ERROR_NONE ==
-                 custom_add_in_characteristic(service.getHandle(),
+                 custom_add_in_characteristic(BLE_GATT_HANDLE_INVALID,
                                               &nordicUUID,
                                               p_char->getProperties(),
-                                              NULL,
-                                              p_char->getInitialLength(),
-                                              p_char->getMaxLength(),
+                                              p_char->getValueAttribute().getValuePtr(),
+                                              p_char->getValueAttribute().getInitialLength(),
+                                              p_char->getValueAttribute().getMaxLength(),
                                               &nrfCharacteristicHandles[characteristicCount]),
                  BLE_ERROR_PARAM_OUT_OF_RANGE );
 
@@ -76,9 +76,27 @@
         uint16_t charHandle = characteristicCount;
         p_characteristics[characteristicCount++] = p_char;
 
-        p_char->setHandle(charHandle);
-        if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
-            updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
+        p_char->getValueAttribute().setHandle(charHandle);
+
+        /* Add optional descriptors if any */
+        /* ToDo: Make sure we don't overflow the array */
+        for (uint8_t j = 0; j < p_char->getDescriptorCount(); j++) {
+             GattAttribute *p_desc = p_char->getDescriptor(j);
+
+             nordicUUID = custom_convert_to_nordic_uuid(p_desc->getUUID());
+
+             ASSERT ( ERROR_NONE ==
+                      custom_add_in_descriptor(BLE_GATT_HANDLE_INVALID,
+                                               &nordicUUID,
+                                               p_desc->getValuePtr(),
+                                               p_desc->getInitialLength(),
+                                               p_desc->getMaxLength(),
+                                               &nrfDescriptorHandles[descriptorCount]),
+                 BLE_ERROR_PARAM_OUT_OF_RANGE );
+
+            uint16_t descHandle = descriptorCount;
+            p_descriptors[descriptorCount++] = p_desc;
+            p_desc->setHandle(descHandle);
         }
     }
 
@@ -194,45 +212,6 @@
     return BLE_ERROR_NONE;
 }
 
-ble_error_t nRF51GattServer::setDeviceName(const uint8_t *deviceName)
-{
-    ble_gap_conn_sec_mode_t sec_mode;
-    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); // no security is needed
-
-    if (sd_ble_gap_device_name_set(&sec_mode, deviceName, strlen((const char *)deviceName)) == NRF_SUCCESS) {
-        return BLE_ERROR_NONE;
-    } else {
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;
-    }
-}
-
-ble_error_t nRF51GattServer::getDeviceName(uint8_t *deviceName, unsigned *lengthP)
-{
-    if (sd_ble_gap_device_name_get(deviceName, (uint16_t *)lengthP) == NRF_SUCCESS) {
-        return BLE_ERROR_NONE;
-    } else {
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;
-    }
-}
-
-ble_error_t nRF51GattServer::setAppearance(uint16_t appearance)
-{
-    if (sd_ble_gap_appearance_set(appearance) == NRF_SUCCESS) {
-        return BLE_ERROR_NONE;
-    } else {
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;
-    }
-}
-
-ble_error_t nRF51GattServer::getAppearance(uint16_t *appearanceP)
-{
-    if (sd_ble_gap_appearance_get(appearanceP)) {
-        return BLE_ERROR_NONE;
-    } else {
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;
-    }
-}
-
 /**************************************************************************/
 /*!
     @brief  Callback handler for events getting pushed up from the SD
@@ -240,50 +219,52 @@
 /**************************************************************************/
 void nRF51GattServer::hwCallback(ble_evt_t *p_ble_evt)
 {
-    uint16_t                      handle_value;
-    GattServerEvents::gattEvent_t event;
+    uint16_t                       handle_value;
+    GattServerEvents::gattEvent_t  eventType;
+    const ble_gatts_evt_t         *gattsEventP = &p_ble_evt->evt.gatts_evt;
 
     switch (p_ble_evt->header.evt_id) {
         case BLE_GATTS_EVT_WRITE:
             /* There are 2 use case here: Values being updated & CCCD (indicate/notify) enabled */
 
             /* 1.) Handle CCCD changes */
-            handle_value = p_ble_evt->evt.gatts_evt.params.write.handle;
+            handle_value = gattsEventP->params.write.handle;
             for (uint8_t i = 0; i<characteristicCount; i++) {
                 if ((p_characteristics[i]->getProperties() & (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)) &&
                     (nrfCharacteristicHandles[i].cccd_handle == handle_value)) {
                     uint16_t cccd_value =
-                        (p_ble_evt->evt.gatts_evt.params.write.data[1] << 8) |
-                        p_ble_evt->evt.gatts_evt.params.write.data[0]; /* Little Endian but M0 may be mis-aligned */
+                        (gattsEventP->params.write.data[1] << 8) |
+                        gattsEventP->params.write.data[0]; /* Little Endian but M0 may be mis-aligned */
 
                     if (((p_characteristics[i]->getProperties() & GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE) && (cccd_value & BLE_GATT_HVX_INDICATION)) ||
                         ((p_characteristics[i]->getProperties() & GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY) && (cccd_value & BLE_GATT_HVX_NOTIFICATION))) {
-                        event = GattServerEvents::GATT_EVENT_UPDATES_ENABLED;
+                        eventType = GattServerEvents::GATT_EVENT_UPDATES_ENABLED;
                     } else {
-                        event = GattServerEvents::GATT_EVENT_UPDATES_DISABLED;
+                        eventType = GattServerEvents::GATT_EVENT_UPDATES_DISABLED;
                     }
 
-                    handleEvent(event, i);
+                    handleEvent(eventType, i);
                     return;
                 }
             }
 
             /* 2.) Changes to the characteristic value will be handled with other events below */
-            event = GattServerEvents::GATT_EVENT_DATA_WRITTEN;
+            eventType = GattServerEvents::GATT_EVENT_DATA_WRITTEN;
             break;
 
-        case BLE_EVT_TX_COMPLETE:
-            handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
-            return;
-
         case BLE_GATTS_EVT_HVC:
             /* Indication confirmation received */
-            event        = GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED;
-            handle_value = p_ble_evt->evt.gatts_evt.params.hvc.handle;
+            eventType    = GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED;
+            handle_value = gattsEventP->params.hvc.handle;
             break;
 
+        case BLE_EVT_TX_COMPLETE: {
+            handleDataSentEvent(p_ble_evt->evt.common_evt.params.tx_complete.count);
+            return;
+        }
+
         case BLE_GATTS_EVT_SYS_ATTR_MISSING:
-            sd_ble_gatts_sys_attr_set(p_ble_evt->evt.gatts_evt.conn_handle, NULL, 0);
+            sd_ble_gatts_sys_attr_set(gattsEventP->conn_handle, NULL, 0);
             return;
 
         default:
@@ -293,8 +274,21 @@
     /* Find index (charHandle) in the pool */
     for (uint8_t i = 0; i<characteristicCount; i++) {
         if (nrfCharacteristicHandles[i].value_handle == handle_value) {
-            handleEvent(event, i);
-            break;
+            switch (eventType) {
+                case GattServerEvents::GATT_EVENT_DATA_WRITTEN: {
+                    GattCharacteristicWriteCBParams cbParams = {
+                        .op     = static_cast<GattCharacteristicWriteCBParams::Type>(gattsEventP->params.write.op),
+                        .offset = gattsEventP->params.write.offset,
+                        .len    = gattsEventP->params.write.len,
+                        .data   = gattsEventP->params.write.data
+                    };
+                    handleDataWrittenEvent(i, &cbParams);
+                    break;
+                }
+                default:
+                    handleEvent(eventType, i);
+                    break;
+            }
         }
     }
 }