HW layer for the Nucleo board, it only work with old BLE_API
Dependents: Hello_BLE F446RE-BLE
Fork of X_NUCLEO_IDB0XA1 by
Diff: BlueNRGGap.cpp
- Revision:
- 18:6d5f4c638f6a
- Parent:
- 16:8aeb0c44869b
- Child:
- 19:0f87aaf1362d
--- a/BlueNRGGap.cpp Thu Aug 07 09:33:27 2014 +0000 +++ b/BlueNRGGap.cpp Fri Aug 08 10:45:53 2014 +0000 @@ -67,6 +67,8 @@ /**************************************************************************/ ble_error_t BlueNRGGap::setAdvertisingData(const GapAdvertisingData &advData, const GapAdvertisingData &scanResponse) { +#if 1 + DEBUG("BlueNRGGap::setAdvertisingData\n"); /* Make sure we don't exceed the advertising payload length */ if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) { return BLE_ERROR_BUFFER_OVERFLOW; @@ -75,21 +77,29 @@ /* Make sure we have a payload! */ if (advData.getPayloadLen() <= 0) { return BLE_ERROR_PARAM_OUT_OF_RANGE; - } else { //set the advData here in some local variable so that startAdvertising can use it. - Payload load(advData.getPayload(), advData.getPayloadLen()); - - for(uint8_t index=0; index<load.getPayloadUnitCount(); index++) { + } else { + PayloadPtr loadPtr(advData.getPayload(), advData.getPayloadLen()); + for(uint8_t index=0; index<loadPtr.getPayloadUnitCount(); index++) { + // add AD data to the + PayloadUnit unit = loadPtr.getUnitAtIndex(index); + DEBUG("adData[%d].length=%d\n", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getLenPtr())); + DEBUG("adData[%d].AdType=0x%x\n", index,(uint8_t)(*loadPtr.getUnitAtIndex(index).getAdTypePtr())); + #if 0 + int err = aci_gap_update_adv_data(*loadPtr.getUnitAtIndex(index).getLenPtr(), loadPtr.getUnitAtIndex(index).getAdTypePtr()); + + if(BLE_STATUS_SUCCESS!=err) { + DEBUG("error occurred while adding adv data\n"); + return BLE_ERROR_PARAM_OUT_OF_RANGE; // no other suitable error code is available + } + #endif //UnitPayload unitLoad = load.getPayLoadAtIndex(index); - switch(load.getIDAtIndex(index)) { - case GapAdvertisingData::FLAGS: /* ref *Flags */ + switch(*loadPtr.getUnitAtIndex(index).getAdTypePtr()) { + case GapAdvertisingData::FLAGS: /* ref *Flags */ break; case GapAdvertisingData::INCOMPLETE_LIST_16BIT_SERVICE_IDS: /**< Incomplete list of 16-bit Service IDs */ break; case GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS: /**< Complete list of 16-bit Service IDs */ DEBUG("Advertising type: COMPLETE_LIST_16BIT_SERVICE_IDS\n"); - servUuidlength = load.getLengthAtIndex(index)-1; - servUuidData = load.getDataAtIndex(index); - DEBUG("servUuidlength=%d\n", servUuidlength); break; case GapAdvertisingData::INCOMPLETE_LIST_32BIT_SERVICE_IDS: /**< Incomplete list of 32-bit Service IDs (not relevant for Bluetooth 4.0) */ break; @@ -103,31 +113,29 @@ break; case GapAdvertisingData::COMPLETE_LOCAL_NAME: /**< Complete Local Name */ DEBUG("Advertising type: COMPLETE_LOCAL_NAME\n"); - const char *device_name = NULL; - device_name = (const char*)load.getDataAtIndex(index); // to be set later when startAdvertising() is called - DEBUG("input: device_name= %s...\n", device_name); - DEBUG("input: device_name length= %d...\n", load.getLengthAtIndex(index)-1); - char *namePtr = new char[load.getLengthAtIndex(index)]; - namePtr[0] = AD_TYPE_COMPLETE_LOCAL_NAME; - strcpy(namePtr+1, device_name); - local_name_length = load.getLengthAtIndex(index)-1; - local_name = (const char*)namePtr; - // also set device name in GAP service - aci_gatt_update_char_value(g_gap_service_handle, g_device_name_char_handle, 0, local_name_length, (tHalUint8 *)local_name); - - DEBUG("setting name to: %s...\n", namePtr+1); - DEBUG("name string length: %d...\n", local_name_length+1); // This includes 'AD_TYPE_COMPLETE_LOCAL_NAME' byte + loadPtr.getUnitAtIndex(index).printDataAsString(); + local_name_length = *loadPtr.getUnitAtIndex(index).getLenPtr()-1; + local_name = (const char*)loadPtr.getUnitAtIndex(index).getAdTypePtr(); + //for(int i=0; i<local_name_length; i++) + // DEBUG("\n%c", local_name[i]); + aci_gatt_update_char_value(g_gap_service_handle, + g_device_name_char_handle, + 0, + local_name_length, + (tHalUint8 *)local_name); + + DEBUG("device_name length=%d", local_name_length); break; case GapAdvertisingData::TX_POWER_LEVEL: /**< TX Power Level (in dBm) */ - DEBUG("Advertising type: TX_POWER_LEVEL\n"); - int8_t dbm = load.getInt8AtIndex(index); + DEBUG("Advertising type: TX_POWER_LEVEL\n"); + int8_t dbm = *loadPtr.getUnitAtIndex(index).getDataPtr(); int8_t enHighPower = 0; int8_t paLevel = 0; int8_t dbmActuallySet = getHighPowerAndPALevelValue(dbm, enHighPower, paLevel); DEBUG("dbm=%d, dbmActuallySet=%d\n", dbm, dbmActuallySet); - DEBUG("enHighPower=%d, paLevel=%d\n", enHighPower, paLevel); + DEBUG("enHighPower=%d, paLevel=%d\n", enHighPower, paLevel); aci_hal_set_tx_power_level(enHighPower, paLevel); break; case GapAdvertisingData::DEVICE_ID: /**< Device ID */ @@ -142,25 +150,25 @@ for other appearances BLE Scanner android app is not behaving properly */ DEBUG("Advertising type: APPEARANCE\n"); - const char *deviceAppearance = NULL; - deviceAppearance = (const char*)load.getDataAtIndex(index); // to be set later when startAdvertising() is called - DEBUG("input: deviceAppearance= 0x%x 0x%x..., strlen(deviceAppearance)=%d\n", deviceAppearance[1], deviceAppearance[0], load.getLengthAtIndex(index)-1); /**< \ref Appearance */ + const char *deviceAppearance = NULL; + deviceAppearance = (const char*)loadPtr.getUnitAtIndex(index).getDataPtr(); // to be set later when startAdvertising() is called + DEBUG("input: deviceAppearance= 0x%x 0x%x..., strlen(deviceAppearance)=%d\n", deviceAppearance[1], deviceAppearance[0], (uint8_t)*loadPtr.getUnitAtIndex(index).getLenPtr()-1); /**< \ref Appearance */ aci_gatt_update_char_value(g_gap_service_handle, g_appearance_char_handle, 0, 2, (tHalUint8 *)deviceAppearance); break; case GapAdvertisingData::ADVERTISING_INTERVAL: /**< Advertising Interval */ - // taken care of in startAdvertising(params) - advtInterval = load.getUint16AtIndex(index); + advtInterval = (uint16_t)(*loadPtr.getUnitAtIndex(index).getDataPtr()); DEBUG("advtInterval=%d\n", advtInterval); break; case GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA: /**< Manufacturer Specific Data */ break; } +//#endif } //const uint8_t *payload = advData.getPayload(); } - + #endif return BLE_ERROR_NONE; } @@ -234,15 +242,31 @@ /*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*/ - + + char* name = NULL; + uint8_t nameLen = 0; + if(local_name!=NULL) { + name = (char*)local_name; + nameLen = local_name_length; + } else { + char str[] = "ST_BLE_DEV"; + name = new char[strlen(str)+1]; + name[0] = AD_TYPE_COMPLETE_LOCAL_NAME; + strcpy(name+1, str); + nameLen = strlen(name); + DEBUG("nameLen=%d\n", nameLen); + DEBUG("name=%s\n", name); + } + + advtInterval = params.getInterval(); // set advtInterval in case it is not already set by user application ret = aci_gap_set_discoverable(params.getAdvertisingType(), // Advertising_Event_Type 0, // Adv_Interval_Min advtInterval, // Adv_Interval_Max RANDOM_ADDR, // Address_Type <hdd> It seems there is some problem with RANDOM_ADDRESS. <problem_desc> When RANDOM_ADDRESS is selected device name is not being handled properly, i.e. wrong device name is seen by android app </problem_desc> NO_WHITE_LIST_USE, // Adv_Filter_Policy - local_name_length, // Local_Name_Length - local_name, // Local_Name + nameLen, //local_name_length, // Local_Name_Length + (const char*)name, //local_name, // Local_Name servUuidlength, //Service_Uuid_Length servUuidData, //Service_Uuid_List 0, // Slave_Conn_Interval_Min