Previous version which works for my stm32f401 Nucleo board

Fork of X_NUCLEO_IDB0XA1 by ST

Revision:
52:94638d2461c1
Parent:
51:963982e7c17c
Child:
53:8c10d592ca49
--- a/BlueNRGGattServer.cpp	Wed Sep 17 06:34:57 2014 +0000
+++ b/BlueNRGGattServer.cpp	Thu Sep 25 08:21:49 2014 +0000
@@ -58,11 +58,11 @@
     STORE_LE_16(primary_short_uuid, short_uuid);
     
     if(type==UUID::UUID_TYPE_LONG) {
-    base_uuid = (service.getUUID()).getBaseUUID();   
-    
-    //TODO:128 bit support for UUID
-    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 = (service.getUUID()).getBaseUUID();   
+        
+        //TODO:128 bit support for UUID
+        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]);
     }
     
     //TODO: Check UUID existence??
@@ -74,7 +74,11 @@
         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;
     
     //TODO: iterate to include all characteristics
     for (uint8_t i = 0; i < service.getCharacteristicCount(); i++) {
@@ -85,51 +89,55 @@
         STORE_LE_16(int_8_uuid, char_uuid);
         
         if(type==UUID::UUID_TYPE_LONG) {
-        base_char_uuid = (p_char->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]);
-    }
-    //TODO: Check UUID existence??
-    DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
-    /*
-    * Gatt_Evt_Mask -> HardCoded (0)
-    * Encryption_Key_Size -> Hardcoded (16)
-    * 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))) {
-            DEBUG("Setting up Gatt GATT_SERVER_ATTR_WRITE Mask\n\r");
-            Gatt_Evt_Mask = Gatt_Evt_Mask | GATT_SERVER_ATTR_WRITE;
+            base_char_uuid = (p_char->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]);
         }
-    if((p_char->getProperties() &
-         (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; 
-        }    //This will support also GATT_SERVER_ATTR_READ_WRITE since it will be covered by previous if() check.
+        //TODO: Check UUID existence??
+        DEBUG("Char Properties 0x%x\n\r", p_char->getProperties());
+        /*
+        * Gatt_Evt_Mask -> HardCoded (0)
+        * Encryption_Key_Size -> Hardcoded (16)
+        * isVariable (variable length value field) -> Hardcoded (1)
+        */
+        tGattServerEvent Gatt_Evt_Mask = 0x0;
     
-    if(type==UUID::UUID_TYPE_SHORT) {
-        ret =  aci_gatt_add_char(service.getHandle(), UUID_TYPE_16, int_8_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
-                           p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
-                           16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristicHandles[characteristicCount]);
-    }
-    else if(type==UUID::UUID_TYPE_LONG) {
-        ret =  aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
-                           p_char->getProperties(), ATTR_PERMISSION_NONE, Gatt_Evt_Mask /*Gatt_Evt_Mask*/,
-                           16 /*Encryption_Key_Size*/, 1 /*isVariable*/, &bleCharacteristicHandles[characteristicCount]);
-    }
-    /* Update the characteristic handle */
-    uint16_t charHandle = characteristicCount;    
-    
-    p_characteristics[characteristicCount++] = p_char;
-    p_char->setHandle(charHandle);    //Set the characteristic count as the corresponding char handle
-    
-    if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
-            updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
+        if((p_char->getProperties() &
+             (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))) {
+                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; 
+            }    //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->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) {
+            ret =  aci_gatt_add_char(service.getHandle(), UUID_TYPE_128, char_base_uuid, p_char->getMaxLength() /*2*/ /*Value Length*/,
+                               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)); 
+        
+        p_characteristics[characteristicCount++] = p_char;
+        p_char->setHandle(bleCharacteristic);    //Set the characteristic count as the corresponding char handle
+        DEBUG("added bleCharacteristic handle =%u\n\r", bleCharacteristic);
+        
+        if ((p_char->getValuePtr() != NULL) && (p_char->getInitialLength() > 0)) {
+                //updateValue(charHandle, p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
+                updateValue(p_char->getHandle(), p_char->getValuePtr(), p_char->getInitialLength(), false /* localOnly */);
         }
     }    
                        
@@ -141,7 +149,6 @@
     return BLE_ERROR_NONE;
 }
 
-
 /**************************************************************************/
 /*!
     @brief  Reads the value of a characteristic, based on the service
@@ -202,17 +209,10 @@
 {
   tBleStatus ret;    
   tHalUint8 buff[2];
-    
-  //STORE_LE_16(buff,125);
   
-  //DEBUG("CharHandle: %d\n\r", charHandle);
-  //DEBUG("Actual Handle: 0x%x\n\r", bleCharacteristicHandles[charHandle]);
-  //DEBUG("Service Handle: 0x%x\n\r", servHandle);
-  //DEBUG("buffer[0]: %d\n\r", buffer[0]);
-  //DEBUG("buffer[1]: %d\n\r", buffer[1]);
-  //DEBUG("len: %d\n\r", len);
-    
-  ret = aci_gatt_update_char_value(servHandle, bleCharacteristicHandles[charHandle], 0, len, buffer);
+  DEBUG("updating bleCharacteristic charHandle =%u, corresponding serviceHanle= %u\n\r", charHandle, bleCharHanldeMap.find(charHandle)->second);  
+  // <hdd>ret = aci_gatt_update_char_value(servHandle, bleCharacteristicHandles[charHandle], 0, len, buffer);
+  ret = aci_gatt_update_char_value(bleCharHanldeMap.find(charHandle)->second, charHandle, 0, len, buffer);
 
   if (ret != BLE_STATUS_SUCCESS){
       DEBUG("Error while updating characteristic.\n\r") ;
@@ -222,7 +222,7 @@
 
   //Generate Data Sent Event Here? (GattServerEvents::GATT_EVENT_DATA_SENT)  //FIXME: Is this correct?
   //Check if characteristic property is NOTIFY|INDICATE, if yes generate event
-  GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(bleCharacteristicHandles[charHandle]);
+  GattCharacteristic *p_char = BlueNRGGattServer::getInstance().getCharacteristicFromHandle(charHandle);
   if(p_char->getProperties() &  (GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
                                   | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE)) {
           BlueNRGGattServer::getInstance().handleEvent(GattServerEvents::GATT_EVENT_DATA_SENT);
@@ -291,10 +291,10 @@
 /**************************************************************************/
 GattCharacteristic* BlueNRGGattServer::getCharacteristicFromHandle(tHalUint16 attrHandle)
 {
-    GattCharacteristic *p_char;
+    GattCharacteristic *p_char = NULL;
     int i;
     uint16_t handle;
-    
+#if 1
     //DEBUG("BlueNRGGattServer::getCharacteristicFromHandle()>>Attribute Handle received 0x%x\n\r",attrHandle);
     for(i=0; i<characteristicCount; i++)
     {
@@ -305,7 +305,7 @@
             if(attrHandle>=bleCharacteristicHandles[handle])
             {
                 p_char = p_characteristics[i];
-                //DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
+                DEBUG("Found Characteristic Properties 0x%x\n\r",p_char->getProperties());
                 break;
                 }            
         }
@@ -319,6 +319,7 @@
             } else continue;
         }
     }
+#endif    
     return p_char;
 }