BLE lib

Fork of Nucleo_BLE_BlueNRG by STM32 eKairn

Revision:
3:89230b3e003b
Parent:
2:d76864b8a341
Child:
4:c8ed8022e996
diff -r d76864b8a341 -r 89230b3e003b BlueNRGGattServer.cpp
--- a/BlueNRGGattServer.cpp	Mon Dec 22 18:25:34 2014 +0000
+++ b/BlueNRGGattServer.cpp	Tue Jan 20 12:11:36 2015 +0000
@@ -40,7 +40,7 @@
     /* ToDo: Make sure we don't overflow the array, etc. */
     /* ToDo: Make sure this service UUID doesn't already exist (?) */
     /* ToDo: Basic validation */
-    
+
     tBleStatus ret;
     uint8_t type;
     uint16_t short_uuid;
@@ -49,50 +49,49 @@
     uint8_t char_base_uuid[16];
     const uint8_t *base_uuid;
     const uint8_t *base_char_uuid;
-    
+
     type = (service.getUUID()).shortOrLong();
     DEBUG("AddService(): Type:%d\n\r", type);
-    
+
     /* Add the service to the BlueNRG */
     short_uuid = (service.getUUID()).getShortUUID();
     STORE_LE_16(primary_short_uuid, short_uuid);
-    
+
     if(type==UUID::UUID_TYPE_LONG) {
-        base_uuid = (service.getUUID()).getBaseUUID();   
-        
+        base_uuid = (service.getUUID()).getBaseUUID();
+
         COPY_UUID_128(primary_base_uuid, base_uuid[15],base_uuid[14],base_uuid[13],base_uuid[12],base_uuid[11],base_uuid[10],base_uuid[9],
-        base_uuid[8],base_uuid[7],base_uuid[6],base_uuid[5],base_uuid[4],primary_short_uuid[1],primary_short_uuid[0],base_uuid[1],base_uuid[0]);
+                      base_uuid[8],base_uuid[7],base_uuid[6],base_uuid[5],base_uuid[4],primary_short_uuid[1],primary_short_uuid[0],base_uuid[1],base_uuid[0]);
     }
-    
+
     if(type==UUID::UUID_TYPE_SHORT) {
-        ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7, 
-        &servHandle);
+        ret = aci_gatt_add_serv(UUID_TYPE_16, primary_short_uuid, PRIMARY_SERVICE, 7,
+                                &servHandle);
+    } else if(type==UUID::UUID_TYPE_LONG) {
+        ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7,
+                                &servHandle);
     }
-    else if(type==UUID::UUID_TYPE_LONG) {
-        ret = aci_gatt_add_serv(UUID_TYPE_128, primary_base_uuid, PRIMARY_SERVICE, 7, 
-        &servHandle);
-    }
-    
+
     service.setHandle(servHandle);
     //serviceHandleVector.push_back(servHandle);
     DEBUG("added servHandle handle =%u\n\r", servHandle);
     tHalUint16 bleCharacteristic;
-    
+
     //iterate to include all characteristics
     for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
         GattCharacteristic *p_char = service.getCharacteristic(i);
-        uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();   
-        
+        uint16_t char_uuid = (p_char->getValueAttribute().getUUID()).getShortUUID();
+
         uint8_t int_8_uuid[2];
         STORE_LE_16(int_8_uuid, char_uuid);
-        
+
         if(type==UUID::UUID_TYPE_LONG) {
             base_char_uuid = (p_char->getValueAttribute().getUUID()).getBaseUUID();
-            
+
             COPY_UUID_128(char_base_uuid, base_char_uuid[15],base_char_uuid[14],base_char_uuid[13],base_char_uuid[12],base_char_uuid[11],base_char_uuid[10],base_char_uuid[9],
-            base_char_uuid[8],base_char_uuid[7],base_char_uuid[6],base_char_uuid[5],base_char_uuid[4],int_8_uuid[1],int_8_uuid[0],base_char_uuid[1],base_char_uuid[0]);
+                          base_char_uuid[8],base_char_uuid[7],base_char_uuid[6],base_char_uuid[5],base_char_uuid[4],int_8_uuid[1],int_8_uuid[0],base_char_uuid[1],base_char_uuid[0]);
         }
-        
+
         DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
         /*
         * Gatt_Evt_Mask -> HardCoded (0)
@@ -100,65 +99,64 @@
         * isVariable (variable length value field) -> Hardcoded (1)
         */
         tGattServerEvent Gatt_Evt_Mask = 0x0;
-        
+
         if((p_char->getProperties() &
-                    (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
-                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
+                (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|
+                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE))) {
             DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
             Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
         }
         if((p_char->getProperties() &
-                    (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
-                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
+                (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
+                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY| GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE))) {
             DEBUG("Setting up Gatt GATT_INTIMATE_APPL_WHEN_READ_N_WAIT Mask\n\r");
-            Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT; 
+            Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_INTIMATE_APPL_WHEN_READ_N_WAIT;
         }    //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
-        
+
         if(type==UUID::UUID_TYPE_SHORT) {
             ret =  aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
-            p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
-            16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
-        }
-        else if(type==UUID::UUID_TYPE_LONG) {
+                                     p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
+                                     16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
+        } else if(type==UUID::UUID_TYPE_LONG) {
             ret =  aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getValueAttribute().getMaxLength() /*2*/ /*Value Length*/,
-            p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
-            16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
+                                     p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
+                                     16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristic);
         }
         /* Update the characteristic handle */
-        uint16_t charHandle = characteristicCount;   
-        
-        bleCharHanldeMap.insert(std::pair<tHalUint16, tHalUint16>(bleCharacteristic, servHandle)); 
-        
+        uint16_t charHandle = characteristicCount;
+
+        bleCharHanldeMap.insert(std::pair<tHalUint16, tHalUint16>(bleCharacteristic, servHandle));
+
         p_characteristics[characteristicCount++] = p_char;
         p_char->getValueAttribute().setHandle(bleCharacteristic);    //Set the characteristic count as the corresponding char handle
         DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
-        
+
         if ((p_char->getValueAttribute().getValuePtr() != NULL) && (p_char->getValueAttribute().getInitialLength() > 0)) {
             updateValue(p_char->getValueAttribute().getHandle(), p_char->getValueAttribute().getValuePtr(), p_char->getValueAttribute().getInitialLength(), false /* localOnly */);
         }
-        
+
         // add descriptors now
         uint16_t descHandle = 0;
         for(uint8_t descIndex=0; descIndex<p_char->getDescriptorCount(); descIndex++) {
             GattAttribute *descriptor = p_char->getDescriptor(descIndex);
             uint16_t shortUUID = descriptor->getUUID().getShortUUID();
             const tHalUint8 uuidArray[] = {(shortUUID>>8)&0xFF, (shortUUID&0xFF)};
-            ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(), 
-            CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(), 
-            descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_SERVER_ATTR_READ_WRITE,
-            MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
+            ret = aci_gatt_add_char_desc(service.getHandle(), p_char->getValueAttribute().getHandle(),
+                                         CHAR_DESC_TYPE_16_BIT, uuidArray, descriptor->getMaxLength(), descriptor->getInitialLength(),
+                                         descriptor->getValuePtr(), CHAR_DESC_SECURITY_PERMISSION, CHAR_DESC_ACCESS_PERMISSION, GATT_SERVER_ATTR_READ_WRITE,
+                                         MIN_ENCRY_KEY_SIZE, CHAR_ATTRIBUTE_LEN_IS_FIXED, &descHandle);
             if(ret==(tBleStatus)0) {
                 DEBUG("Descriptor added successfully, descriptor handle=%d\n\r", descHandle);
                 descriptor->setHandle(descHandle);
             }
         }
-    }    
-    
+    }
+
     serviceCount++;
-    
-    //FIXME: There is no GattService pointer array in GattServer. 
+
+    //FIXME: There is no GattService pointer array in GattServer.
     //        There should be one? (Only the user is aware of GattServices!) Report to forum.
-    
+
     return BLE_ERROR_NONE;
 }
 
@@ -189,7 +187,14 @@
 /**************************************************************************/
 ble_error_t BlueNRGGattServer::readValue(uint16_t charHandle, uint8_t buffer[], uint16_t *const lengthP)
 {
-    DEBUG("ReadValue() Not Supported\n\r");
+    uint8_t *ptr;
+    GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
+    *lengthP=p_char->getValueAttribute().getInitialLength();
+    ptr = p_char->getValueAttribute().getValuePtr();
+    DEBUG("BLE Write %d Bytes\r\n", *lengthP);
+    for(int i=0; i<*lengthP; i++) {
+        buffer[i]=ptr[i];
+    }
     return BLE_ERROR_NONE;
 }
 
@@ -220,16 +225,16 @@
 /**************************************************************************/
 ble_error_t BlueNRGGattServer::updateValue(uint16_t charHandle, uint8_t buffer[], uint16_t len, bool localOnly)
 {
-    tBleStatus ret;    
+    tBleStatus ret;
     tHalUint8 buff[2];
 
-    // DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);  
-   
+    // DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);
+
     ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
 
-    if (ret != BLE_STATUS_SUCCESS){
+    if (ret != BLE_STATUS_SUCCESS) {
         DEBUG("Error while updating characteristic.\n\r") ;
-        return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value 
+        return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value
         //FIXME: Define Error values equivalent to BlueNRG Error Codes.
     }
 
@@ -237,7 +242,7 @@
     //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
     GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
     if(p_char->getProperties() &  (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
-                | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
+                                   | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
         BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT, charHandle);
     }
 
@@ -267,10 +272,10 @@
 {
     //signed short refvalue;
     uint16_t gapConnectionHandle = BlueNRGGap::getInstance().getConnectionHandle();
-    
+
     //EXIT:
     if(gapConnectionHandle != 0)
-    aci_gatt_allow_read(gapConnectionHandle);
+        aci_gatt_allow_read(gapConnectionHandle);
 }
 
 /**************************************************************************/
@@ -299,23 +304,18 @@
     uint16_t handle;
 
     //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
-    for(i=0; i<characteristicCount; i++)
-    {
+    for(i=0; i<characteristicCount; i++) {
         handle = p_characteristics[i]->getValueAttribute().getHandle();
-        
-        if(i==characteristicCount-1)//Last Characteristic check
-        {
-            if(attrHandle>=bleCharacteristicHandles[handle])
-            {
+
+        if(i==characteristicCount-1) { //Last Characteristic check
+            if(attrHandle>=bleCharacteristicHandles[handle]) {
                 p_char = p_characteristics[i];
                 DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
                 break;
-            }            
-        }
-        else {
+            }
+        } else {
             //Testing if attribute handle is between two Characteristic Handles
-            if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1])
-            {
+            if(attrHandle>=bleCharacteristicHandles[handle] && attrHandle<bleCharacteristicHandles[handle+1]) {
                 p_char = p_characteristics[i];
                 //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
                 break;