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; }