gjhn

Dependents:   BLE_GENERALE

Fork of X_NUCLEO_IDB0XA1 by ST

Revision:
191:d22cc4715b0c
Parent:
177:65d9b1b75fca
Parent:
189:30fa96fa8ec4
Child:
203:5b9c78101d45
--- a/source/BlueNRGGap.cpp	Wed Nov 18 15:17:24 2015 +0000
+++ b/source/BlueNRGGap.cpp	Fri Nov 20 16:59:49 2015 +0100
@@ -134,13 +134,15 @@
                 }
             case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS:  /**< Incomplete list of 16-bit Service IDs */
             case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS:    /**< Complete list of 16-bit Service IDs */
+            case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */
+            case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS:   /**< Complete list of 128-bit Service IDs */
                 {
-                PRINTF("Advertising type: INCOMPLETE_LIST_16BIT_SERVICE_IDS/COMPLETE_LIST_16BIT_SERVICE_IDS\n\r");
+                PRINTF("Advertising type: INCOMPLETE_LIST SERVICE_IDS/COMPLETE_LIST SERVICE_IDS\n\r");
                 
                 uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
                 // The total lenght should include the Data Type Value
                 if(buffSize>UUID_BUFFER_SIZE-1) {
-                    return BLE_ERROR_PARAM_OUT_OF_RANGE;
+                    return BLE_ERROR_INVALID_PARAM;
                 }
                 
                 servUuidlength = buffSize+1; // +1 to include the Data Type Value
@@ -149,7 +151,7 @@
                 PRINTF("servUuidlength=%d servUuidData[0]=%d buffSize=%d\n\r", servUuidlength, servUuidData[0], buffSize);
                 // Save the Service UUID list just after the Data Type Value field
                 memcpy(servUuidData+1, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
-                
+#ifdef DEBUG
                 for(unsigned i=0; i<servUuidlength; i++) {
                     PRINTF("servUuidData[%d] = 0x%x\n\r", i, servUuidData[i]);
                 }
@@ -157,7 +159,7 @@
                 for(unsigned i=0; i<buffSize; i++) {
                     PRINTF("loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r", i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
                 }
-
+#endif /* DEBUG */
                 break;
                 }
             case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS:  /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */
@@ -170,16 +172,6 @@
                 PRINTF("Advertising type: COMPLETE_LIST_32BIT_SERVICE_IDS\n\r");
                 return BLE_ERROR_NOT_IMPLEMENTED;
                 }
-            case GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS: /**< Incomplete list of 128-bit Service IDs */
-                {
-                PRINTF("Advertising type: INCOMPLETE_LIST_128BIT_SERVICE_IDS\n\r");
-                return BLE_ERROR_NOT_IMPLEMENTED;
-                }
-            case GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS:   /**< Complete list of 128-bit Service IDs */
-                {
-                PRINTF("Advertising type: COMPLETE_LIST_128BIT_SERVICE_IDS\n\r");
-                return BLE_ERROR_NOT_IMPLEMENTED;
-                }
             case GapAdvertisingData::SHORTENED_LOCAL_NAME:               /**< Shortened Local Name */
                 {
                 break;
@@ -264,8 +256,25 @@
                 PRINTF("advtInterval=%d\n\r", (int)advtInterval);
                 break;
                 }
-            case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA:        /**< Manufacturer Specific Data */                                
+            case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA:        /**< Manufacturer Specific Data */                             
                 {
+                PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA\n\r");
+                uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1;
+                PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA (buffSize=%d)\n\r", buffSize);
+                // the total ADV DATA LEN should include two more bytes:
+		// the buffer size byte;
+		// and the Manufacturer Specific Data Type Value byte
+                if(buffSize>ADV_DATA_MAX_SIZE-2) {
+                    return BLE_ERROR_PARAM_OUT_OF_RANGE;
+                }
+                for(int i=0; i<buffSize+1; i++) {
+                    PRINTF("Advertising type: MANUFACTURER_SPECIFIC_DATA loadPtr.getUnitAtIndex(index).getDataPtr()[%d] = 0x%x\n\r",
+				i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]);
+                }
+                AdvLen = buffSize+2; // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Manufacturer Specific Data Type Value byte
+                AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data)
+                AdvData[1] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA;
+                memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize);
                 break;
                 }
                 
@@ -343,7 +352,9 @@
 /**************************************************************************/
 
 ble_error_t BlueNRGGap::startAdvertising(const GapAdvertisingParams &params)
-{      
+{
+    tBleStatus ret;
+
     /* Make sure we support the advertising type */
     if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) {
         /* ToDo: This requires a propery security implementation, etc. */
@@ -377,22 +388,30 @@
         return BLE_ERROR_PARAM_OUT_OF_RANGE;
     }
 
-    //tBleStatus ret;
-    //const LongUUIDBytes_t HRM_SERVICE_UUID_128 = {0x18, 0x0D};
     /* set scan response data */
-    hci_le_set_scan_resp_data(scan_rsp_length, scan_response_payload); /*int hci_le_set_scan_resp_data(uint8_t length, const uint8_t data[]);*/
+    ret = hci_le_set_scan_resp_data(scan_rsp_length, scan_response_payload);
+    if(BLE_STATUS_SUCCESS!=ret) {
+        PRINTF(" error while setting scan response data (ret=0x%x)\n", ret);
+        switch (ret) {
+          case BLE_STATUS_TIMEOUT:
+            return BLE_STACK_BUSY;
+          default:
+            return BLE_ERROR_UNSPECIFIED;
+        }
+    }
 
     /*aci_gap_set_discoverable(Advertising_Event_Type, Adv_min_intvl, Adv_Max_Intvl, Addr_Type, Adv_Filter_Policy,
                         Local_Name_Length, local_name, service_uuid_length, service_uuid_list, Slave_conn_intvl_min, Slave_conn_intvl_max);*/
     /*LINK_LAYER.H DESCRIBES THE ADVERTISING TYPES*/ 
 
+    // Enable the else branch if you want to set default device name
     char* name = NULL;
     uint8_t nameLen = 0; 
     if(local_name!=NULL) {
         name = (char*)local_name;
         PRINTF("name=%s\n\r", name); 
         nameLen = local_name_length;
-    } else {
+    } /*else {
         char str[] = "ST_BLE_DEV";
         name = new char[strlen(str)+1];
         name[0] = AD_TYPE_COMPLETE_LOCAL_NAME;
@@ -400,7 +419,7 @@
         nameLen = strlen(name);
         PRINTF("nameLen=%d\n\r", nameLen);
         PRINTF("name=%s\n\r", name);      
-    }  
+    }*/
 
     advtInterval = params.getIntervalInADVUnits(); // set advtInterval in case it is not already set by user application  
     ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type                                
@@ -419,7 +438,18 @@
     PRINTF("!!!setting discoverable (servUuidlength=0x%x)\n", servUuidlength);
     if(BLE_STATUS_SUCCESS!=ret) {
        PRINTF("error occurred while setting discoverable (ret=0x%x)\n", ret);
-       return BLE_ERROR_PARAM_OUT_OF_RANGE;  // no other suitable error code is available
+       switch (ret) {
+         case BLE_STATUS_INVALID_PARAMS:
+           return BLE_ERROR_INVALID_PARAM;
+         case ERR_COMMAND_DISALLOWED:
+           return BLE_ERROR_OPERATION_NOT_PERMITTED;
+         case ERR_UNSUPPORTED_FEATURE:
+           return BLE_ERROR_NOT_IMPLEMENTED;
+         case BLE_STATUS_TIMEOUT:
+           return BLE_STACK_BUSY;
+         default:
+           return BLE_ERROR_UNSPECIFIED;
+       }
     }
 
     // Before updating the ADV data, delete COMPLETE_LOCAL_NAME and TX_POWER_LEVEL fields (if present)
@@ -427,28 +457,45 @@
       if(name!=NULL) {
         PRINTF("!!!calling aci_gap_delete_ad_type AD_TYPE_COMPLETE_LOCAL_NAME!!!\n");
         ret = aci_gap_delete_ad_type(AD_TYPE_COMPLETE_LOCAL_NAME);
-        if (ret != BLE_STATUS_SUCCESS){
+        if (BLE_STATUS_SUCCESS!=ret){
           PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
-          return BLE_ERROR_PARAM_OUT_OF_RANGE;
+          switch (ret) {
+            case BLE_STATUS_TIMEOUT:
+              return BLE_STACK_BUSY;
+            default:
+              return BLE_ERROR_UNSPECIFIED;
+          }
         }
       }
 
-      if(txPowerAdType) {
+      // If ADV Data Type is MANUFACTURER SPECIFIC, then the TxP is set implicitly
+      // (i.e., w/o calling setTxPower()
+      if(txPowerAdType || AdvData[1]==AD_TYPE_MANUFACTURER_SPECIFIC_DATA) {
         PRINTF("!!!calling aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL)!!!\n");
         ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL);
-        if (ret != BLE_STATUS_SUCCESS){
+        if (BLE_STATUS_SUCCESS!=ret){
           PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);
-          return BLE_ERROR_PARAM_OUT_OF_RANGE;
+          switch (ret) {
+            case BLE_STATUS_TIMEOUT:
+              return BLE_STACK_BUSY;
+            default:
+              return BLE_ERROR_UNSPECIFIED;
+          }
         }
       }
    
       ret = aci_gap_update_adv_data(AdvLen, AdvData);
       if(BLE_STATUS_SUCCESS!=ret) {
         PRINTF("error occurred while adding adv data (ret=0x%x)\n", ret);
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;  // no other suitable error code is available
+          switch (ret) {
+            case BLE_STATUS_TIMEOUT:
+              return BLE_STACK_BUSY;
+            default:
+              return BLE_ERROR_UNSPECIFIED;
+          }
       }
       
-    }
+    } // AdvLen>0
 
     state.advertising = 1;
 
@@ -490,10 +537,16 @@
         //Set non-discoverable to stop advertising
         ret = aci_gap_set_non_discoverable();
         
-        if (ret != BLE_STATUS_SUCCESS){
+        if (BLE_STATUS_SUCCESS!=ret){
             PRINTF("Error in stopping advertisement (ret=0x%x)!!\n\r", ret) ;
-            return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value 
-            //FIXME: Define Error values equivalent to BlueNRG Error Codes.
+            switch (ret) {
+              case ERR_COMMAND_DISALLOWED:
+                return BLE_ERROR_OPERATION_NOT_PERMITTED;
+              case BLE_STATUS_TIMEOUT:
+                return BLE_STACK_BUSY;
+              default:
+                return BLE_ERROR_UNSPECIFIED;
+            }
         }
         PRINTF("Advertisement stopped!!\n\r") ;
         //Set GapState_t::advertising state
@@ -533,10 +586,16 @@
     if(m_connectionHandle != BLE_CONN_HANDLE_INVALID) {
         ret = aci_gap_terminate(m_connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. 
 
-        if (ret != BLE_STATUS_SUCCESS){
-            PRINTF("Error in GAP termination!!\n\r") ;
-            return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value 
-            //FIXME: Define Error values equivalent to BlueNRG Error Codes.
+        if (BLE_STATUS_SUCCESS != ret){
+            PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
+            switch (ret) {
+              case ERR_COMMAND_DISALLOWED:
+                return BLE_ERROR_OPERATION_NOT_PERMITTED;
+              case BLE_STATUS_TIMEOUT:
+                return BLE_STACK_BUSY;
+              default:
+                return BLE_ERROR_UNSPECIFIED;
+            }
         }
         
         //PRINTF("Disconnected from localhost!!\n\r") ;
@@ -576,10 +635,16 @@
     if(connectionHandle != BLE_CONN_HANDLE_INVALID) {
         ret = aci_gap_terminate(connectionHandle, 0x16);//0x16 Connection Terminated by Local Host. 
 
-        if (ret != BLE_STATUS_SUCCESS){
-            PRINTF("Error in GAP termination!!\n\r") ;
-            return BLE_ERROR_PARAM_OUT_OF_RANGE ; //Not correct Error Value 
-            //FIXME: Define Error values equivalent to BlueNRG Error Codes.
+        if (BLE_STATUS_SUCCESS != ret){
+            PRINTF("Error in GAP termination (ret=0x%x)!!\n\r", ret) ;
+            switch (ret) {
+              case ERR_COMMAND_DISALLOWED:
+                return BLE_ERROR_OPERATION_NOT_PERMITTED;
+              case BLE_STATUS_TIMEOUT:
+                return BLE_STACK_BUSY;
+              default:
+                return BLE_ERROR_UNSPECIFIED;
+            }
         }
         
         //PRINTF("Disconnected from localhost!!\n\r") ;
@@ -790,7 +855,7 @@
 /**************************************************************************/
 ble_error_t BlueNRGGap::setDeviceName(const uint8_t *deviceName) 
 {
-    int ret;
+    tBleStatus ret;
     uint8_t nameLen = 0;     
     
     DeviceName = (uint8_t *)deviceName;
@@ -804,10 +869,20 @@
     0, 
     nameLen, 
     (uint8_t *)DeviceName);
-    
-    if(ret){
-        PRINTF("device set name failed\n\r");            
-        return BLE_ERROR_PARAM_OUT_OF_RANGE;//TODO:Wrong error code
+
+    if (BLE_STATUS_SUCCESS != ret){
+        PRINTF("device set name failed (ret=0x%x)!!\n\r", ret) ;
+        switch (ret) {
+          case BLE_STATUS_INVALID_HANDLE:
+          case BLE_STATUS_INVALID_PARAMETER:
+            return BLE_ERROR_INVALID_PARAM;
+          case BLE_STATUS_INSUFFICIENT_RESOURCES:
+            return BLE_ERROR_NO_MEM;
+          case BLE_STATUS_TIMEOUT:
+            return BLE_STACK_BUSY;
+          default:
+            return BLE_ERROR_UNSPECIFIED;
+        }
     }
 
     return BLE_ERROR_NONE;
@@ -837,10 +912,8 @@
 /**************************************************************************/
 ble_error_t BlueNRGGap::getDeviceName(uint8_t *deviceName, unsigned *lengthP) 
 {   
-    //int ret;
-    
     if(DeviceName==NULL) 
-    return BLE_ERROR_PARAM_OUT_OF_RANGE;
+      return BLE_ERROR_UNSPECIFIED;
     
     strcpy((char*)deviceName, (const char*)DeviceName);
     //PRINTF("GetDeviceName=%s\n\r", deviceName);
@@ -872,6 +945,8 @@
 /**************************************************************************/
 ble_error_t BlueNRGGap::setAppearance(GapAdvertisingData::Appearance appearance)
 {
+    tBleStatus ret;
+
     /* 
     Tested with GapAdvertisingData::GENERIC_PHONE. 
     for other appearances BLE Scanner android app is not behaving properly 
@@ -880,9 +955,23 @@
     STORE_LE_16(deviceAppearance, appearance);                 
     PRINTF("input: incoming = %d deviceAppearance= 0x%x 0x%x\n\r", appearance, deviceAppearance[1], deviceAppearance[0]);
     
-    aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance);
-    
-    return BLE_ERROR_NONE;    
+    ret = aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (uint8_t *)deviceAppearance);
+    if (BLE_STATUS_SUCCESS == ret){
+        return BLE_ERROR_NONE;
+    }
+
+    PRINTF("setAppearance failed (ret=0x%x)!!\n\r", ret) ;
+    switch (ret) {
+      case BLE_STATUS_INVALID_HANDLE:
+      case BLE_STATUS_INVALID_PARAMETER:
+        return BLE_ERROR_INVALID_PARAM;
+      case BLE_STATUS_INSUFFICIENT_RESOURCES:
+        return BLE_ERROR_NO_MEM;
+      case BLE_STATUS_TIMEOUT:
+        return BLE_STACK_BUSY;
+      default:
+        return BLE_ERROR_UNSPECIFIED;
+    }
 }
 
 /**************************************************************************/