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.
Fork of X_NUCLEO_IDB0XA1 by
Diff: source/BlueNRGGap.cpp
- Revision:
- 251:86df2c289e7c
- Parent:
- 240:f487d8c86ce4
- Child:
- 252:0c2cb16a7166
diff -r 2e94d2835c45 -r 86df2c289e7c source/BlueNRGGap.cpp --- a/source/BlueNRGGap.cpp Tue Jun 21 16:58:38 2016 +0200 +++ b/source/BlueNRGGap.cpp Mon Jun 27 15:49:11 2016 +0200 @@ -108,6 +108,7 @@ PRINTF("advData.getPayloadLen() == 0\n\r"); //return BLE_ERROR_PARAM_OUT_OF_RANGE; local_name_length = 0; + txPowLevSet = 0; servUuidlength = 0; AdvLen = 0; } else { @@ -181,6 +182,7 @@ { PRINTF("Advertising type: COMPLETE_LOCAL_NAME\n\r"); loadPtr.getUnitAtIndex(index).printDataAsString(); + loadPtr.getUnitAtIndex(index).printDataAsHex(); local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; // The total length should include the Data Type Value if(local_name_length>ADV_DATA_MAX_SIZE-1) { @@ -188,7 +190,7 @@ } local_name[0] = (uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr()); //Data Type Value memcpy(local_name+1, (uint8_t*)loadPtr.getUnitAtIndex(index).getDataPtr(), local_name_length-1); - PRINTF("Advertising type: COMPLETE_LOCAL_NAME local_name=%s local_name_length=%d\n\r", local_name, local_name_length); + PRINTF("Advertising type: COMPLETE_LOCAL_NAME local_name=%s local_name_length=%d\n\r", local_name+1, local_name_length); break; } @@ -197,13 +199,17 @@ PRINTF("Advertising type: TX_POWER_LEVEL\n\r"); int8_t enHighPower = 0; int8_t paLevel = 0; -#ifdef DEBUG + int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr(); - int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel); + tBleStatus ret = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel); +#ifdef DEBUG + PRINTF("dbm=%d, ret=%d\n\r", dbm, ret); + PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel); #endif - PRINTF("dbm=%d, dbmActuallySet=%d\n\r", dbm, dbmActuallySet); - PRINTF("enHighPower=%d, paLevel=%d\n\r", enHighPower, paLevel); - aci_hal_set_tx_power_level(enHighPower, paLevel); + if(ret == BLE_STATUS_SUCCESS) { + aci_hal_set_tx_power_level(enHighPower, paLevel); + txPowLevSet = 1; + } break; } case GapAdvertisingData::DEVICE_ID: /**< Device ID */ @@ -212,6 +218,11 @@ } case GapAdvertisingData::SLAVE_CONNECTION_INTERVAL_RANGE: /**< Slave :Connection Interval Range */ { + PRINTF("Advertising type: SLAVE_CONNECTION_INTERVAL_RANGE\n\r"); + uint8_t *ptr = loadPtr.getUnitAtIndex(index).getDataPtr(); + slaveConnIntervMin = ptr[0]|ptr[1]<<8; + slaveConnIntervMax = ptr[2]|ptr[3]<<8; + break; } case GapAdvertisingData::SERVICE_DATA: /**< Service Data */ @@ -229,17 +240,22 @@ i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); } #endif - AdvLen = buffSize+2; // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte - AdvData[0] = buffSize+1; // the fisrt byte is the data buffer size (type+data) - AdvData[1] = AD_TYPE_SERVICE_DATA; - memcpy(AdvData+2, loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); + // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Service Data Type Value byte + AdvData[AdvLen++] = buffSize+1; // the fisrt byte is the data buffer size (type+data) + AdvData[AdvLen++] = AD_TYPE_SERVICE_DATA; + memcpy(&AdvData[AdvLen], loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); + AdvLen += buffSize; break; } case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */ { - PRINTF("Advertising type: ADVERTISING_INTERVAL\n\r"); - //uint32_t advInt = (uint32_t)(*loadPtr.getUnitAtIndex(index).getDataPtr()); + printf("Advertising type: ADVERTISING_INTERVAL\n\r"); + uint8_t buffSize = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; + AdvData[AdvLen++] = buffSize+1; // the fisrt byte is the data buffer size (type+data) + AdvData[AdvLen++] = AD_TYPE_ADVERTISING_INTERVAL; + memcpy(&AdvData[AdvLen], loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); + AdvLen += buffSize; break; } case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */ @@ -259,10 +275,11 @@ i, loadPtr.getUnitAtIndex(index).getDataPtr()[i]); } #endif - 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); + // the total ADV DATA LEN should include two more bytes: the buffer size byte; and the Manufacturer Specific Data Type Value byte + AdvData[AdvLen++] = buffSize+1; // the fisrt byte is the data buffer size (type+data) + AdvData[AdvLen++] = AD_TYPE_MANUFACTURER_SPECIFIC_DATA; + memcpy(&AdvData[AdvLen], loadPtr.getUnitAtIndex(index).getDataPtr(), buffSize); + AdvLen += buffSize; break; } } // end switch @@ -467,8 +484,8 @@ (const char*)local_name, // LocalName servUuidlength, // ServiceUUIDLen servUuidData, // ServiceUUIDList - 0, // SlaveConnIntervMin - 0); // SlaveConnIntervMax + slaveConnIntervMin, // SlaveConnIntervMin + slaveConnIntervMax); // SlaveConnIntervMax PRINTF("!!!setting discoverable (servUuidlength=0x%x)\n\r", servUuidlength); @@ -476,6 +493,7 @@ PRINTF("error occurred while setting discoverable (ret=0x%x)\n\r", ret); switch (ret) { case BLE_STATUS_INVALID_PARAMS: + case ERR_INVALID_HCI_CMD_PARAMS: return BLE_ERROR_INVALID_PARAM; case ERR_COMMAND_DISALLOWED: return BLE_ERROR_OPERATION_NOT_PERMITTED; @@ -488,6 +506,13 @@ } } + // Since AD_TYPE_TX_POWER_LEVEL has not been set by application, we delete it + if(!txPowLevSet) { + PRINTF("Deleting TX POW LEV\n"); + aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL); + txPowLevSet = 0; + } + // Stop Advertising if an error occurs while updating ADV data rc = updateAdvertisingData(); if(rc != BLE_ERROR_NONE) { @@ -514,7 +539,7 @@ { tBleStatus ret; - // Before updating the ADV data, delete COMPLETE_LOCAL_NAME and TX_POWER_LEVEL fields (if present) + // Before updating the ADV data, delete COMPLETE_LOCAL_NAME field if(AdvLen > 0) { if(local_name_length > 0) { ret = aci_gap_delete_ad_type(AD_TYPE_COMPLETE_LOCAL_NAME); @@ -533,9 +558,8 @@ } } - // If ADV Data Type is SERVICE DATA or MANUFACTURER SPECIFIC DATA, - // we need to delete it to make the needed room in ADV payload - if(AdvData[1]==AD_TYPE_SERVICE_DATA || AdvData[1]==AD_TYPE_MANUFACTURER_SPECIFIC_DATA) { + // ...and TX_POWER_LEVEL field to make the needed room in ADV payload + if(txPowLevSet) { ret = aci_gap_delete_ad_type(AD_TYPE_TX_POWER_LEVEL); if (BLE_STATUS_SUCCESS!=ret){ PRINTF("aci_gap_delete_ad_type failed return=%d\n", ret);