Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: source/BlueNRGGap.cpp
- Revision:
- 191:d22cc4715b0c
- Parent:
- 177:65d9b1b75fca
- Parent:
- 189:30fa96fa8ec4
- Child:
- 203:5b9c78101d45
diff -r b2a22cb6c87c -r d22cc4715b0c source/BlueNRGGap.cpp
--- 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 ¶ms)
-{
+{
+ 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;
+ }
}
/**************************************************************************/