return BT_STATUS_SUCCESS;
}
+static int __bt_hal_parse_service_data(int len, char *src, uint8_t *dest)
+{
+ int total_service_len = len;
+ int service_data_len = 0;
+ char *ptr = NULL;
+ int idx = 0;
+
+ if (src == NULL || dest == NULL)
+ return 0;
+
+ ptr = src;
+
+ while (total_service_len) {
+ /* parse length1 + service_data1 + length2 + service data2*/
+ service_data_len = ptr[0];
+
+ dest[idx] = 1 + service_data_len;
+ dest[idx + 1] = 0x16; /* Fixed */
+ memcpy(dest + idx + 2, ptr +1, service_data_len);
+ idx = idx + 2 + service_data_len;
+
+ ptr = ptr + service_data_len + 1;
+ total_service_len = total_service_len - service_data_len - 1;
+ }
+
+ return idx;
+}
+
+
/* Takes care of both Scan Response and Advertising data */
int _bt_hal_set_advertising_data(btgatt_adv_param_setup_t adv_param_setup)
{
/* Service Data UUID*/
if (adv_param_setup.service_data_len > 0) {
- adv_data[index] = 1 + adv_param_setup.service_data_len;
- adv_data[index+1] = 0x16; /* Fixed */
- memcpy(&adv_data[index+2], adv_param_setup.service_data, adv_param_setup.service_data_len);
- index += (2 + adv_param_setup.service_data_len);
- length += (2 + adv_param_setup.service_data_len);
- DBG("After Service data: Index [%d]", index);
+ int l = 0;
+ l = __bt_hal_parse_service_data(adv_param_setup.service_data_len,
+ adv_param_setup.service_data, &adv_data[index]);
+
+ index = index + l;
+ length = length + l;
}
/* Set Apperance */
return BLUETOOTH_ERROR_NONE;
}
+void print_adv_data(unsigned char * adv_data, int len)
+{
+ char adv_data_str[(31 * 2) + 1];
+
+ for (int i = 0; i < len ; i++)
+ snprintf(&adv_data_str[i * 2], 3, "%02X", adv_data[i]);
+
+ BT_INFO("data: [%s]", adv_data_str);
+}
+
+
static int __bt_set_multi_adv_param(oal_ble_multi_adv_param_setup_t *adv_setup,
bluetooth_advertising_data_t *adv_data, int length)
{
break;
}
case 0x16: { /* Service Data */
- adv_setup->service_data = g_malloc0(sizeof(char) * (len - 1));
- memcpy(adv_setup->service_data, (ptr + 2), (len - 1));
- adv_setup->service_data_len = len - 1;
+ if (adv_setup->service_data == NULL) {
+ /* first service data */
+ adv_setup->service_data = g_malloc0(sizeof(char) * (len));
+ adv_setup->service_data[0] = len -1; /*length1 + service_data1*/
+ memcpy(adv_setup->service_data + 1, (ptr + 2), (len - 1));
+ adv_setup->service_data_len = len;
+ } else {
+ /* Next service data */
+ char *prev_service_data = adv_setup->service_data;
+ int prev_service_len = adv_setup->service_data_len;
+
+ /* create new memory */
+ adv_setup->service_data = g_malloc0(sizeof(char) * (len + prev_service_len));
+ memcpy(adv_setup->service_data, prev_service_data, prev_service_len);
+ adv_setup->service_data[prev_service_len] = len -1; /*length2 + service_data2*/
+ memcpy(adv_setup->service_data + prev_service_len + 1, (ptr + 2), (len - 1));
+
+ adv_setup->service_data_len = prev_service_len + len;
+
+ /* remove the existing memory */
+ g_free(prev_service_data);
+ }
+ BT_INFO("service data is packed:");
+ print_adv_data((unsigned char *)adv_setup->service_data, adv_setup->service_data_len);
break;
}
case 0x21: {