Exemple #1
0
static uint32_t adv_data_encode(const ble_advdata_t * p_advdata,
                                uint8_t *             p_encoded_data,
                                uint8_t *             p_len)
{
    uint32_t err_code = NRF_SUCCESS;
    
    *p_len = 0;
    
    // Encode name
    if (p_advdata->name_type != BLE_ADVDATA_NO_NAME)
    {
        err_code = name_encode(p_advdata, p_encoded_data, p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode appearance
    if (p_advdata->include_appearance)
    {
        err_code = appearance_encode(p_encoded_data, p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode flags
    if (p_advdata->flags.size > 0)
    {
        err_code = uint8_array_encode(&p_advdata->flags,
                                      BLE_GAP_AD_TYPE_FLAGS,
                                      p_encoded_data,
                                      p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode TX power level
    if (p_advdata->p_tx_power_level != NULL)
    {
        err_code = tx_power_level_encode(*p_advdata->p_tx_power_level, p_encoded_data, p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode 'more available' uuid list
    if (p_advdata->uuids_more_available.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_more_available,
                                    BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE,
                                    BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE,
                                    p_encoded_data,
                                    p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode 'complete' uuid list
    if (p_advdata->uuids_complete.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_complete,
                                    BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE,
                                    BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE,
                                    p_encoded_data,
                                    p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode 'solicited service' uuid list
    if (p_advdata->uuids_solicited.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_solicited,
                                    BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT,
                                    BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT,
                                    p_encoded_data,
                                    p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode Slave Connection Interval Range
    if (p_advdata->p_slave_conn_int != NULL)
    {
        err_code = conn_int_encode(p_advdata->p_slave_conn_int, p_encoded_data, p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode Manufacturer Specific Data
    if (p_advdata->p_manuf_specific_data != NULL)
    {
        err_code = manuf_specific_data_encode(p_advdata->p_manuf_specific_data,
                                              p_encoded_data,
                                              p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    // Encode Service Data
    if (p_advdata->service_data_count > 0)
    {
        err_code = service_data_encode(p_advdata, p_encoded_data, p_len);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }
    
    return err_code;
}
uint32_t adv_data_encode(ble_advdata_t const * const p_advdata,
                         uint8_t             * const p_encoded_data,
                         uint16_t            * const p_len)
{
    uint32_t err_code = NRF_SUCCESS;
    uint16_t max_size = *p_len;
    *p_len = 0;

    //Encode Security Manager OOB Flags
    if (p_advdata->p_sec_mgr_oob_flags != NULL)
    {
        err_code = sec_mgr_oob_flags_encode(*p_advdata->p_sec_mgr_oob_flags,
                                            p_encoded_data,
                                            p_len,
                                            max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode Security Manager TK value
    if (NULL != p_advdata->p_tk_value)
    {
        err_code = tk_value_encode(p_advdata->p_tk_value, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode LE Role
    if (BLE_ADVDATA_ROLE_NOT_PRESENT != p_advdata->le_role)
    {
        err_code = le_role_encode(p_advdata->le_role, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode LE Bluetooth Device Address
    if (p_advdata->include_ble_device_addr)
    {
        err_code = ble_device_addr_encode(p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode appearance.
    if (p_advdata->include_appearance)
    {
        err_code = appearance_encode(p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    //Encode Flags
    if(p_advdata->flags != 0 )
    {
        err_code = flags_encode(p_advdata->flags, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode TX power level.
    if (p_advdata->p_tx_power_level != NULL)
    {
        err_code = tx_power_level_encode(*p_advdata->p_tx_power_level,
                                         p_encoded_data,
                                         p_len,
                                         max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode 'more available' uuid list.
    if (p_advdata->uuids_more_available.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_more_available,
                                    BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE,
                                    BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE,
                                    p_encoded_data,
                                    p_len,
                                    max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode 'complete' uuid list.
    if (p_advdata->uuids_complete.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_complete,
                                    BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE,
                                    BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE,
                                    p_encoded_data,
                                    p_len,
                                    max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode 'solicited service' uuid list.
    if (p_advdata->uuids_solicited.uuid_cnt > 0)
    {
        err_code = uuid_list_encode(&p_advdata->uuids_solicited,
                                    BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT,
                                    BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT,
                                    p_encoded_data,
                                    p_len,
                                    max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode Slave Connection Interval Range.
    if (p_advdata->p_slave_conn_int != NULL)
    {
        err_code = conn_int_encode(p_advdata->p_slave_conn_int, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode Manufacturer Specific Data.
    if (p_advdata->p_manuf_specific_data != NULL)
    {
        err_code = manuf_specific_data_encode(p_advdata->p_manuf_specific_data,
                                              p_encoded_data,
                                              p_len,
                                              max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode Service Data.
    if (p_advdata->service_data_count > 0)
    {
        err_code = service_data_encode(p_advdata, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    // Encode name. WARNING: it is encoded last on purpose since too long device name is truncated.
    if (p_advdata->name_type != BLE_ADVDATA_NO_NAME)
    {
        err_code = name_encode(p_advdata, p_encoded_data, p_len, max_size);
        if (err_code != NRF_SUCCESS)
        {
            return err_code;
        }
    }

    return err_code;
}