uint32_t conn_mw_ble_uuid_decode(uint8_t const * const p_rx_buf, uint32_t rx_buf_len, uint8_t * const p_tx_buf, uint32_t * const p_tx_buf_len) { SER_ASSERT_NOT_NULL(p_rx_buf); SER_ASSERT_NOT_NULL(p_tx_buf); SER_ASSERT_NOT_NULL(p_tx_buf_len); uint8_t raw_uuid[16]; uint8_t uuid_len = sizeof (raw_uuid); uint8_t * p_raw_uuid = raw_uuid; ble_uuid_t uuid; ble_uuid_t * p_uuid = &uuid; uint32_t err_code = NRF_SUCCESS; uint32_t sd_err_code; err_code = ble_uuid_decode_req_dec(p_rx_buf, rx_buf_len, &uuid_len, &p_raw_uuid, &p_uuid); SER_ASSERT(err_code == NRF_SUCCESS, err_code); sd_err_code = sd_ble_uuid_decode(uuid_len, p_raw_uuid, p_uuid); err_code = ble_uuid_decode_rsp_enc(sd_err_code, p_tx_buf, p_tx_buf_len, p_uuid); SER_ASSERT(err_code == NRF_SUCCESS, err_code); return err_code; }
error_t custom_decode_uuid_base(uint8_t const *const p_uuid_base, ble_uuid_t *p_uuid) { UUID::LongUUIDBytes_t uuid_base_le; for (uint8_t i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) { uuid_base_le[i] = p_uuid_base[i]; } ASSERT_STATUS( sd_ble_uuid_decode(UUID::LENGTH_OF_LONG_UUID, uuid_base_le, p_uuid)); return ERROR_NONE; }
error_t custom_decode_uuid_base(uint8_t const * const p_uuid_base, ble_uuid_t * p_uuid) { uint8_t uuid_base_le[16]; /* Reverse the bytes since ble_uuid128_t is LSB */ for(uint8_t i=0; i<16; i++) { uuid_base_le[i] = p_uuid_base[15-i]; } ASSERT_STATUS( sd_ble_uuid_decode(16, uuid_base_le, p_uuid) ); return ERROR_NONE; }
/* CENTRAL: Reads an advertising report and checks if a uuid is present in the service list. The function is able to search for 16-bit, 32-bit and 128-bit service uuids. Parameters: p_target_uuid The uuid to search fir p_adv_report Pointer to the advertisement report. Return: true if the UUID is present in the advertisement report. Otherwise false */ static bool is_uuid_present(const ble_uuid_t *p_target_uuid, const ble_gap_evt_adv_report_t *p_adv_report) { uint32_t err_code; uint32_t index = 0; uint8_t *p_data = (uint8_t *)p_adv_report->data; ble_uuid_t extracted_uuid; while (index < p_adv_report->dlen) { uint8_t field_length = p_data[index]; uint8_t field_type = p_data[index+1]; /* check UUID field */ if ( (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE) || (field_type == BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE) ) { for (uint32_t u_index = 0; u_index < (field_length/UUID16_SIZE); u_index++) { err_code = sd_ble_uuid_decode( UUID16_SIZE, &p_data[u_index * UUID16_SIZE + index + 2], &extracted_uuid); if (err_code == NRF_SUCCESS) { if ((extracted_uuid.uuid == p_target_uuid->uuid) && (extracted_uuid.type == p_target_uuid->type)) { return true; } } } } else if ( (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE) || (field_type == BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE) ) { for (uint32_t u_index = 0; u_index < (field_length/UUID32_SIZE); u_index++) { err_code = sd_ble_uuid_decode(UUID16_SIZE, &p_data[u_index * UUID32_SIZE + index + 2], &extracted_uuid); if (err_code == NRF_SUCCESS) { if ((extracted_uuid.uuid == p_target_uuid->uuid) && (extracted_uuid.type == p_target_uuid->type)) { return true; } } } } else if ( (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE) || (field_type == BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE) ) { err_code = sd_ble_uuid_decode(UUID128_SIZE, &p_data[index + 2], &extracted_uuid); if (err_code == NRF_SUCCESS) { if ((extracted_uuid.uuid == p_target_uuid->uuid) && (extracted_uuid.type == p_target_uuid->type)) { return true; } } } else { /* do nothing */ } /* increment index */ index += field_length + 1; } return false; }