void
BLEPeripheral::_advDataInit(void)
{
    uint8_t *adv_tmp = _adv_data;

    memset(_adv_data, 0, sizeof(_adv_data));

    /* Add flags */
    *adv_tmp++ = 2;
    *adv_tmp++ = BLE_ADV_TYPE_FLAGS;
    *adv_tmp++ = BLE_SVC_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
    _adv_data_len = 3;

    if (_advertise_service_uuid) {
        BLEUuid bleUuid = BLEUuid(_advertise_service_uuid);
        struct bt_uuid uuid = bleUuid.uuid();

        if (BT_UUID16 == uuid.type) {
            uint8_t *adv_tmp = &_adv_data[_adv_data_len];
            *adv_tmp++ = (1 + sizeof(uint16_t)); /* Segment data length */
            *adv_tmp++ = BLE_ADV_TYPE_COMP_16_UUID; /* Needed for Eddystone */
            UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16);
            _adv_data_len += (2 + sizeof(uint16_t));
        } else if (BT_UUID128 == uuid.type) {
            uint8_t *adv_tmp = &_adv_data[_adv_data_len];
            *adv_tmp++ = (1 + MAX_UUID_SIZE); /* Segment data length */
            *adv_tmp++ = BLE_ADV_TYPE_INC_128_UUID;
            memcpy(adv_tmp, uuid.uuid128, MAX_UUID_SIZE);
            _adv_data_len += (2 + MAX_UUID_SIZE);
        }
    }

    if (_local_name) {
        /* Add device name (truncated if too long) */
        uint8_t calculated_len;

        adv_tmp = &_adv_data[_adv_data_len];
        if (_adv_data_len + strlen(_local_name) + 2 <= BLE_MAX_ADV_SIZE) {
            *adv_tmp++ = strlen(_local_name) + 1;
            *adv_tmp++ = BLE_ADV_TYPE_COMP_LOCAL_NAME;
            calculated_len = strlen(_local_name);
        } else {
            *adv_tmp++ = BLE_MAX_ADV_SIZE - _adv_data_len - 1;
            *adv_tmp++ = BLE_ADV_TYPE_SHORT_LOCAL_NAME;
            calculated_len = BLE_MAX_ADV_SIZE - _adv_data_len - 2;
        }

        memcpy(adv_tmp, _local_name, calculated_len);
        _adv_data_len += calculated_len + 2;
    }

    if (_service_data) {
        /* Add Service Data (if it will fit) */

        BLEUuid bleUuid = BLEUuid(_service_data_uuid);
        struct bt_uuid uuid = bleUuid.uuid();

        /* A 128-bit Service Data UUID won't fit in an Advertising packet */
        if (BT_UUID16 != uuid.type) {
            return; /* We support service data only for 16-bit service UUID */
        }

        uint8_t block_len = 1 + sizeof(uint16_t) + _service_data_length;
        if (_adv_data_len + 1 + block_len > BLE_MAX_ADV_SIZE) {
            return; // Service data block is too large.
        }

        adv_tmp = &_adv_data[_adv_data_len];

        *adv_tmp++ = block_len;
        _adv_data_len++;

        *adv_tmp++ = BLE_ADV_TYPE_SERVICE_DATA_16_UUID;
        UINT16_TO_LESTREAM(adv_tmp, uuid.uuid16);
        memcpy(adv_tmp, _service_data, _service_data_length);

        _adv_data_len += block_len;
    }
}