1 /*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 #include "hci/distance_measurement_manager.h"
17
18 #include <bluetooth/log.h>
19 #include <com_android_bluetooth_flags.h>
20 #include <math.h>
21
22 #include <chrono>
23 #include <complex>
24 #include <unordered_map>
25
26 #include "acl_manager/assembler.h"
27 #include "common/strings.h"
28 #include "hal/ranging_hal.h"
29 #include "hci/acl_manager.h"
30 #include "hci/controller.h"
31 #include "hci/distance_measurement_interface.h"
32 #include "hci/event_checkers.h"
33 #include "hci/hci_layer.h"
34 #include "module.h"
35 #include "os/handler.h"
36 #include "os/repeating_alarm.h"
37 #include "packet/packet_view.h"
38 #include "ras/ras_packets.h"
39
40 using namespace bluetooth::ras;
41 using bluetooth::hal::ProcedureDataV2;
42 using bluetooth::hci::acl_manager::PacketViewForRecombination;
43
44 namespace bluetooth {
45 namespace hci {
46 const ModuleFactory DistanceMeasurementManager::Factory =
__anon822770ff0102() 47 ModuleFactory([]() { return new DistanceMeasurementManager(); });
48 static constexpr uint16_t kIllegalConnectionHandle = 0xffff;
49 static constexpr uint8_t kTxPowerNotAvailable = 0xfe;
50 static constexpr int8_t kRSSIDropOffAt1M = 41;
51 static constexpr uint8_t kCsMaxTxPower = 10; // 10 dBm
52 static constexpr CsSyncAntennaSelection kCsSyncAntennaSelection =
53 CsSyncAntennaSelection::ANTENNAS_IN_ORDER;
54 static constexpr uint8_t kMinMainModeSteps = 0x02;
55 static constexpr uint8_t kMaxMainModeSteps = 0x05;
56 static constexpr uint8_t kMainModeRepetition = 0x00; // No repetition
57 static constexpr uint8_t kMode0Steps =
58 0x03; // Maximum number of mode-0 steps to increase success subevent rate
59 static constexpr uint8_t kChannelMapRepetition = 0x01; // No repetition
60 static constexpr uint8_t kCh3cJump = 0x03; // Skip 3 Channels
61 static constexpr uint16_t kMaxProcedureLen = 0x2710; // 6.25s
62 static constexpr uint16_t kMinProcedureInterval = 0x01;
63 static constexpr uint16_t kMaxProcedureInterval = 0xFF;
64 static constexpr uint16_t kMaxProcedureCount = 0x01;
65 static constexpr uint32_t kMinSubeventLen = 0x0004E2; // 1250us
66 static constexpr uint32_t kMaxSubeventLen = 0x3d0900; // 4s
67 static constexpr uint8_t kTxPwrDelta = 0x00;
68 static constexpr uint8_t kProcedureDataBufferSize = 0x10; // Buffer size of Procedure data
69 static constexpr uint16_t kMtuForRasData = 507; // 512 - 5
70 static constexpr uint16_t kRangingCounterMask = 0x0FFF;
71 static constexpr uint8_t kInvalidConfigId = 0xFF;
72 static constexpr uint8_t kMinConfigId = 0;
73 static constexpr uint8_t kMaxConfigId = 3;
74 static constexpr uint16_t kDefaultIntervalMs = 1000; // 1s
75 static constexpr uint8_t kMaxRetryCounterForCreateConfig = 0x03;
76 static constexpr uint16_t kInvalidConnInterval = 0; // valid value is from 0x0006 to 0x0C80
77
78 struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
79 struct CsProcedureData {
CsProcedureDatabluetooth::hci::DistanceMeasurementManager::impl::CsProcedureData80 CsProcedureData(uint16_t procedure_counter, uint8_t num_antenna_paths, uint8_t configuration_id,
81 uint8_t selected_tx_power)
82 : counter(procedure_counter), num_antenna_paths(num_antenna_paths) {
83 local_status = CsProcedureDoneStatus::PARTIAL_RESULTS;
84 remote_status = CsProcedureDoneStatus::PARTIAL_RESULTS;
85 // In ascending order of antenna position with tone extension data at the end
86 uint16_t num_tone_data = num_antenna_paths + 1;
87 for (uint8_t i = 0; i < num_tone_data; i++) {
88 std::vector<std::complex<double>> empty_complex_vector;
89 tone_pct_initiator.push_back(empty_complex_vector);
90 tone_pct_reflector.push_back(empty_complex_vector);
91 std::vector<uint8_t> empty_vector;
92 tone_quality_indicator_initiator.push_back(empty_vector);
93 tone_quality_indicator_reflector.push_back(empty_vector);
94 }
95 // RAS data
96 segmentation_header_.first_segment_ = 1;
97 segmentation_header_.last_segment_ = 0;
98 segmentation_header_.rolling_segment_counter_ = 0;
99 ranging_header_.ranging_counter_ = counter;
100 ranging_header_.configuration_id_ = configuration_id;
101 ranging_header_.selected_tx_power_ = selected_tx_power;
102 ranging_header_.antenna_paths_mask_ = 0;
103 for (uint8_t i = 0; i < num_antenna_paths; i++) {
104 ranging_header_.antenna_paths_mask_ |= (1 << i);
105 }
106 ranging_header_.pct_format_ = PctFormat::IQ;
107 procedure_data_v2_.local_selected_tx_power_ = selected_tx_power;
108 }
109 // Procedure counter
110 uint16_t counter;
111 // Number of antenna paths (1 to 4) reported in the procedure
112 uint8_t num_antenna_paths;
113 // Frequency Compensation indicates fractional frequency offset (FFO) value of initiator, in
114 // 0.01ppm
115 std::vector<uint16_t> frequency_compensation;
116 // The channel indices of every step in a CS procedure (in time order)
117 std::vector<uint8_t> step_channel;
118 // Measured Frequency Offset from mode 0, relative to the remote device, in 0.01ppm
119 std::vector<uint16_t> measured_freq_offset;
120 // Initiator's PCT (complex value) measured from mode-2 or mode-3 steps in a CS procedure (in
121 // time order)
122 std::vector<std::vector<std::complex<double>>> tone_pct_initiator;
123 // Reflector's PCT (complex value) measured from mode-2 or mode-3 steps in a CS procedure (in
124 // time order)
125 std::vector<std::vector<std::complex<double>>> tone_pct_reflector;
126 std::vector<std::vector<uint8_t>> tone_quality_indicator_initiator;
127 std::vector<std::vector<uint8_t>> tone_quality_indicator_reflector;
128 std::vector<int8_t> packet_quality_initiator;
129 std::vector<int8_t> packet_quality_reflector;
130 std::vector<int16_t> toa_tod_initiators;
131 std::vector<int16_t> tod_toa_reflectors;
132 std::vector<int8_t> rssi_initiator;
133 std::vector<int8_t> rssi_reflector;
134 bool contains_sounding_sequence_local_;
135 bool contains_sounding_sequence_remote_;
136 CsProcedureDoneStatus local_status;
137 CsProcedureDoneStatus remote_status;
138 // If any subevent is received with a Subevent_Done_Status of 0x0 (All results complete for the
139 // CS subevent)
140 bool contains_complete_subevent_ = false;
141 // RAS data
142 SegmentationHeader segmentation_header_;
143 RangingHeader ranging_header_;
144 std::vector<uint8_t> ras_raw_data_; // raw data for multi_subevents;
145 uint16_t ras_raw_data_index_ = 0;
146 RasSubeventHeader ras_subevent_header_;
147 std::vector<uint8_t> ras_subevent_data_;
148 uint8_t ras_subevent_counter_ = 0;
149
150 // procedure data for HAL v2
151 ProcedureDataV2 procedure_data_v2_;
152 };
153 struct RSSITracker {
154 uint16_t handle;
155 uint16_t interval_ms;
156 uint8_t remote_tx_power;
157 bool started;
158 std::unique_ptr<os::RepeatingAlarm> repeating_alarm;
159 };
160
161 // TODO: use state machine to manage the tracker.
162 enum class CsTrackerState : uint8_t {
163 UNSPECIFIED = 0x00,
164 STOPPED = 1 << 0,
165 INIT = 1 << 1,
166 RAS_CONNECTED = 1 << 2,
167 WAIT_FOR_CONFIG_COMPLETE = 1 << 3,
168 WAIT_FOR_SECURITY_ENABLED = 1 << 4,
169 WAIT_FOR_PROCEDURE_ENABLED = 1 << 5,
170 STARTED = 1 << 6,
171 };
172
173 struct CsTracker {
174 CsTrackerState state = CsTrackerState::STOPPED;
175 Address address;
176 hci::Role local_hci_role = hci::Role::CENTRAL;
177 uint16_t procedure_counter = 0;
178 CsRole role = CsRole::INITIATOR;
179 bool local_start = false; // If the CS was started by the local device.
180 // TODO: clean up, replace the measurement_ongoing with STOPPED
181 bool measurement_ongoing = false;
182 bool ras_connected = false;
183 bool setup_complete = false;
184 uint8_t retry_counter_for_create_config = 0;
185 uint16_t n_procedure_count = 0;
186 CsMainModeType main_mode_type = CsMainModeType::MODE_2;
187 CsSubModeType sub_mode_type = CsSubModeType::UNUSED;
188 CsRttType rtt_type = CsRttType::RTT_AA_ONLY;
189 bool remote_support_phase_based_ranging = false;
190 uint8_t remote_num_antennas_supported_ = 0x01;
191 uint8_t remote_supported_sw_time_ = 0;
192 // sending from host to controller with CS config command, request the controller to use it.
193 uint8_t requesting_config_id = kInvalidConfigId;
194 // received from controller to host with CS config complete event, it will be used
195 // for the following measurement.
196 uint8_t used_config_id = kInvalidConfigId;
197 uint8_t selected_tx_power = 0;
198 std::vector<CsProcedureData> procedure_data_list = {};
199 uint16_t interval_ms = kDefaultIntervalMs;
200 uint16_t max_procedure_count = 1;
201 bool waiting_for_start_callback = false;
202 std::unique_ptr<os::RepeatingAlarm> repeating_alarm = nullptr;
203 // RAS data
204 RangingHeader ranging_header_;
205 PacketViewForRecombination segment_data_;
206 uint16_t conn_interval_ = kInvalidConnInterval;
207 };
208
get_free_config_idbluetooth::hci::DistanceMeasurementManager::impl209 bool get_free_config_id(uint16_t connection_handle, uint8_t& config_id) {
210 uint8_t requester_used_config_id = kInvalidConfigId;
211 if (cs_requester_trackers_.find(connection_handle) != cs_requester_trackers_.end()) {
212 requester_used_config_id = cs_requester_trackers_[connection_handle].used_config_id;
213 }
214 uint8_t responder_used_config_id = kInvalidConfigId;
215 if (cs_responder_trackers_.find(connection_handle) != cs_responder_trackers_.end()) {
216 responder_used_config_id = cs_responder_trackers_[connection_handle].used_config_id;
217 }
218
219 for (auto i = kMinConfigId; i <= kMaxConfigId; i++) {
220 if (i != requester_used_config_id && i != responder_used_config_id) {
221 config_id = i;
222 return true;
223 }
224 }
225 log::warn("config ids are used up.");
226 return false;
227 }
228
OnOpenedbluetooth::hci::DistanceMeasurementManager::impl229 void OnOpened(
230 uint16_t connection_handle,
231 const std::vector<bluetooth::hal::VendorSpecificCharacteristic>& vendor_specific_reply) {
232 log::info("connection_handle:0x{:04x}, vendor_specific_reply size:{}", connection_handle,
233 vendor_specific_reply.size());
234 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
235 log::error("Can't find CS tracker for connection_handle {}", connection_handle);
236 return;
237 }
238
239 auto& tracker = cs_requester_trackers_[connection_handle];
240 if (!vendor_specific_reply.empty()) {
241 // Send reply to remote
242 distance_measurement_callbacks_->OnVendorSpecificReply(tracker.address,
243 vendor_specific_reply);
244 return;
245 }
246
247 start_distance_measurement_with_cs(tracker.address, connection_handle);
248 }
249
OnOpenFailedbluetooth::hci::DistanceMeasurementManager::impl250 void OnOpenFailed(uint16_t connection_handle) {
251 log::info("connection_handle:0x{:04x}", connection_handle);
252 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
253 log::error("Can't find CS tracker for connection_handle {}", connection_handle);
254 return;
255 }
256 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
257 cs_requester_trackers_[connection_handle].address, REASON_INTERNAL_ERROR, METHOD_CS);
258 }
259
OnHandleVendorSpecificReplyCompletebluetooth::hci::DistanceMeasurementManager::impl260 void OnHandleVendorSpecificReplyComplete(uint16_t connection_handle, bool success) {
261 log::info("connection_handle:0x{:04x}, success:{}", connection_handle, success);
262 auto it = cs_responder_trackers_.find(connection_handle);
263 if (it == cs_responder_trackers_.end()) {
264 log::error("Can't find CS tracker for connection_handle {}", connection_handle);
265 return;
266 }
267 distance_measurement_callbacks_->OnHandleVendorSpecificReplyComplete(it->second.address,
268 success);
269 }
270
OnResultbluetooth::hci::DistanceMeasurementManager::impl271 void OnResult(uint16_t connection_handle, const bluetooth::hal::RangingResult& ranging_result) {
272 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
273 log::warn("Can't find CS tracker for connection_handle {}", connection_handle);
274 return;
275 }
276 log::debug("address {}, resultMeters {}", cs_requester_trackers_[connection_handle].address,
277 ranging_result.result_meters_);
278 using namespace std::chrono;
279 uint64_t elapsedRealtimeNanos =
280 duration_cast<nanoseconds>(steady_clock::now().time_since_epoch()).count();
281 distance_measurement_callbacks_->OnDistanceMeasurementResult(
282 cs_requester_trackers_[connection_handle].address, ranging_result.result_meters_ * 100,
283 0.0, -1, -1, -1, -1, elapsedRealtimeNanos, ranging_result.confidence_level_,
284 DistanceMeasurementMethod::METHOD_CS);
285 }
286
~implbluetooth::hci::DistanceMeasurementManager::impl287 ~impl() {}
startbluetooth::hci::DistanceMeasurementManager::impl288 void start(os::Handler* handler, hci::Controller* controller, hal::RangingHal* ranging_hal,
289 hci::HciLayer* hci_layer, hci::AclManager* acl_manager) {
290 handler_ = handler;
291 controller_ = controller;
292 ranging_hal_ = ranging_hal;
293 hci_layer_ = hci_layer;
294 acl_manager_ = acl_manager;
295 hci_layer_->RegisterLeEventHandler(hci::SubeventCode::TRANSMIT_POWER_REPORTING,
296 handler_->BindOn(this, &impl::on_transmit_power_reporting));
297 if (!com::android::bluetooth::flags::channel_sounding_in_stack()) {
298 log::info("IS_FLAG_ENABLED channel_sounding_in_stack: false");
299 return;
300 }
301 if (!controller_->SupportsBleChannelSounding()) {
302 log::info("The controller doesn't support Channel Sounding feature.");
303 return;
304 }
305 distance_measurement_interface_ = hci_layer_->GetDistanceMeasurementInterface(
306 handler_->BindOn(this, &DistanceMeasurementManager::impl::handle_event));
307 distance_measurement_interface_->EnqueueCommand(
308 LeCsReadLocalSupportedCapabilitiesBuilder::Create(),
309 handler_->BindOnceOn(this, &impl::on_cs_read_local_supported_capabilities));
310 if (ranging_hal_->IsBound()) {
311 ranging_hal_->RegisterCallback(this);
312 }
313 }
314
stopbluetooth::hci::DistanceMeasurementManager::impl315 void stop() { hci_layer_->UnregisterLeEventHandler(hci::SubeventCode::TRANSMIT_POWER_REPORTING); }
316
register_distance_measurement_callbacksbluetooth::hci::DistanceMeasurementManager::impl317 void register_distance_measurement_callbacks(DistanceMeasurementCallbacks* callbacks) {
318 distance_measurement_callbacks_ = callbacks;
319 if (com::android::bluetooth::flags::channel_sounding_in_stack() && ranging_hal_->IsBound()) {
320 auto vendor_specific_data = ranging_hal_->GetVendorSpecificCharacteristics();
321 if (!vendor_specific_data.empty()) {
322 distance_measurement_callbacks_->OnVendorSpecificCharacteristics(vendor_specific_data);
323 }
324 }
325 }
326
start_distance_measurementbluetooth::hci::DistanceMeasurementManager::impl327 void start_distance_measurement(const Address address, uint16_t connection_handle,
328 hci::Role local_hci_role, uint16_t interval,
329 DistanceMeasurementMethod method) {
330 log::info("Address:{}, method:{}", address, method);
331
332 // Remove this check if we support any connection less method
333 if (connection_handle == kIllegalConnectionHandle) {
334 log::warn("Can't find any LE connection for {}", address);
335 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
336 address, REASON_NO_LE_CONNECTION, method);
337 return;
338 }
339
340 switch (method) {
341 case METHOD_AUTO:
342 case METHOD_RSSI: {
343 if (rssi_trackers.find(address) == rssi_trackers.end()) {
344 rssi_trackers[address].handle = connection_handle;
345 rssi_trackers[address].interval_ms = interval;
346 rssi_trackers[address].remote_tx_power = kTxPowerNotAvailable;
347 rssi_trackers[address].started = false;
348 rssi_trackers[address].repeating_alarm = std::make_unique<os::RepeatingAlarm>(handler_);
349 hci_layer_->EnqueueCommand(
350 LeReadRemoteTransmitPowerLevelBuilder::Create(connection_handle, 0x01),
351 handler_->BindOnceOn(this, &impl::on_read_remote_transmit_power_level_status,
352 address));
353 } else {
354 rssi_trackers[address].interval_ms = interval;
355 }
356 } break;
357 case METHOD_CS: {
358 init_cs_requester_tracker(address, connection_handle, local_hci_role, interval);
359 start_distance_measurement_with_cs(address, connection_handle);
360 } break;
361 }
362 }
363
init_cs_requester_trackerbluetooth::hci::DistanceMeasurementManager::impl364 void init_cs_requester_tracker(const Address& cs_remote_address, uint16_t connection_handle,
365 hci::Role local_hci_role, uint16_t interval) {
366 auto it = cs_requester_trackers_.find(connection_handle);
367 if (it != cs_requester_trackers_.end()) {
368 if (it->second.address != cs_remote_address) {
369 log::debug("replace old tracker as {}", cs_remote_address);
370 it->second = CsTracker();
371 }
372 } else {
373 cs_requester_trackers_[connection_handle] = CsTracker();
374 it = cs_requester_trackers_.find(connection_handle);
375 }
376 it->second.address = cs_remote_address;
377 if (it->second.used_config_id == kInvalidConfigId) {
378 uint8_t config_id;
379 if (get_free_config_id(connection_handle, config_id)) {
380 it->second.requesting_config_id = config_id;
381 } else {
382 log::error("No config id available, stop");
383 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
384 cs_remote_address, REASON_INTERNAL_ERROR, METHOD_CS);
385 return;
386 }
387 }
388 // make sure the repeating_alarm is initialized.
389 if (it->second.repeating_alarm == nullptr) {
390 it->second.repeating_alarm = std::make_unique<os::RepeatingAlarm>(handler_);
391 }
392
393 it->second.state = CsTrackerState::INIT;
394 // If the interval is less than 1 second, update it to 1 second and increase the
395 // max_procedure_count
396 if (interval < 1000) {
397 it->second.max_procedure_count = 1000 / interval;
398 interval = 1000;
399 log::info("Update interval to 1s and max_procedure_count to {}",
400 it->second.max_procedure_count);
401 }
402 it->second.interval_ms = interval;
403 it->second.local_start = true;
404 it->second.measurement_ongoing = true;
405 it->second.waiting_for_start_callback = true;
406 it->second.local_hci_role = local_hci_role;
407 }
408
start_distance_measurement_with_csbluetooth::hci::DistanceMeasurementManager::impl409 void start_distance_measurement_with_cs(const Address& cs_remote_address,
410 uint16_t connection_handle) {
411 log::info("connection_handle: {}, address: {}", connection_handle, cs_remote_address);
412 if (!com::android::bluetooth::flags::channel_sounding_in_stack() && !is_local_cs_ready_) {
413 log::error("Channel Sounding is not enabled");
414 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
415 cs_remote_address, REASON_INTERNAL_ERROR, METHOD_CS);
416 return;
417 }
418
419 if (!cs_requester_trackers_[connection_handle].ras_connected) {
420 log::info("Waiting for RAS connected");
421 return;
422 }
423
424 if (!cs_requester_trackers_[connection_handle].setup_complete) {
425 send_le_cs_read_remote_supported_capabilities(connection_handle);
426 return;
427 }
428 if (cs_requester_trackers_[connection_handle].used_config_id == kInvalidConfigId) {
429 send_le_cs_create_config(connection_handle,
430 cs_requester_trackers_[connection_handle].requesting_config_id);
431 return;
432 }
433 log::info("enable cs procedure regularly with interval: {} ms",
434 cs_requester_trackers_[connection_handle].interval_ms);
435 cs_requester_trackers_[connection_handle].repeating_alarm->Cancel();
436 send_le_cs_procedure_enable(connection_handle, Enable::ENABLED);
437 cs_requester_trackers_[connection_handle].repeating_alarm->Schedule(
438 common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this),
439 connection_handle, Enable::ENABLED),
440 std::chrono::milliseconds(cs_requester_trackers_[connection_handle].interval_ms));
441 }
442
stop_distance_measurementbluetooth::hci::DistanceMeasurementManager::impl443 void stop_distance_measurement(const Address address, uint16_t connection_handle,
444 DistanceMeasurementMethod method) {
445 log::info("Address:{}, method:{}", address, method);
446 switch (method) {
447 case METHOD_AUTO:
448 case METHOD_RSSI: {
449 auto it = rssi_trackers.find(address);
450 if (it == rssi_trackers.end()) {
451 log::warn("Can't find rssi tracker for {}", address);
452 } else {
453 hci_layer_->EnqueueCommand(
454 LeSetTransmitPowerReportingEnableBuilder::Create(it->second.handle, 0x00, 0x00),
455 handler_->BindOnce(
456 check_complete<LeSetTransmitPowerReportingEnableCompleteView>));
457 it->second.repeating_alarm->Cancel();
458 it->second.repeating_alarm.reset();
459 rssi_trackers.erase(address);
460 }
461 } break;
462 case METHOD_CS: {
463 auto it = cs_requester_trackers_.find(connection_handle);
464 if (it == cs_requester_trackers_.end()) {
465 log::warn("Can't find CS tracker for {}", address);
466 } else if (it->second.measurement_ongoing) {
467 it->second.repeating_alarm->Cancel();
468 send_le_cs_procedure_enable(connection_handle, Enable::DISABLED);
469 // does not depend on the 'disable' command result.
470 reset_tracker_on_stopped(it->second);
471 }
472 } break;
473 }
474 }
475
handle_ras_client_connected_eventbluetooth::hci::DistanceMeasurementManager::impl476 void handle_ras_client_connected_event(
477 const Address address, uint16_t connection_handle, uint16_t att_handle,
478 const std::vector<hal::VendorSpecificCharacteristic> vendor_specific_data,
479 uint16_t conn_interval) {
480 log::info(
481 "address:{}, connection_handle 0x{:04x}, att_handle 0x{:04x}, size of "
482 "vendor_specific_data {}, conn_interval {}",
483 address, connection_handle, att_handle, vendor_specific_data.size(), conn_interval);
484
485 auto it = cs_requester_trackers_.find(connection_handle);
486 if (it == cs_requester_trackers_.end()) {
487 log::warn("can't find tracker for 0x{:04x}", connection_handle);
488 return;
489 }
490 if (it->second.ras_connected) {
491 log::debug("Already connected");
492 return;
493 }
494 it->second.conn_interval_ = conn_interval;
495 it->second.ras_connected = true;
496 it->second.state = CsTrackerState::RAS_CONNECTED;
497
498 if (ranging_hal_->IsBound()) {
499 ranging_hal_->OpenSession(connection_handle, att_handle, vendor_specific_data);
500 return;
501 }
502 start_distance_measurement_with_cs(it->second.address, connection_handle);
503 }
504
handle_conn_interval_updatedbluetooth::hci::DistanceMeasurementManager::impl505 void handle_conn_interval_updated(const Address& address, uint16_t connection_handle,
506 uint16_t conn_interval) {
507 if (com::android::bluetooth::flags::channel_sounding_25q2_apis()) {
508 log::debug("connection interval is not required.");
509 return;
510 }
511 auto it = cs_requester_trackers_.find(connection_handle);
512 if (it == cs_requester_trackers_.end()) {
513 log::warn("can't find tracker for 0x{:04x}, address - {} ", connection_handle, address);
514 return;
515 }
516 log::info("interval updated as {}", conn_interval);
517 it->second.conn_interval_ = conn_interval;
518 if (is_hal_v2() && it->second.state >= CsTrackerState::WAIT_FOR_CONFIG_COMPLETE) {
519 log::info("send conn interval {} to HAL", conn_interval);
520 ranging_hal_->UpdateConnInterval(connection_handle, conn_interval);
521 // should the measurement be started over?
522 }
523 }
524
handle_ras_client_disconnected_eventbluetooth::hci::DistanceMeasurementManager::impl525 void handle_ras_client_disconnected_event(const Address address) {
526 log::info("address:{}", address);
527 for (auto it = cs_requester_trackers_.begin(); it != cs_requester_trackers_.end();) {
528 if (it->second.address == address) {
529 if (it->second.repeating_alarm != nullptr) {
530 it->second.repeating_alarm->Cancel();
531 it->second.repeating_alarm.reset();
532 }
533 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
534 address, REASON_NO_LE_CONNECTION, METHOD_CS);
535 it = cs_requester_trackers_.erase(it); // erase and get the next iterator
536 } else {
537 ++it;
538 }
539 }
540 }
541
handle_ras_server_vendor_specific_replybluetooth::hci::DistanceMeasurementManager::impl542 void handle_ras_server_vendor_specific_reply(
543 const Address& address, uint16_t connection_handle,
544 const std::vector<hal::VendorSpecificCharacteristic> vendor_specific_reply) {
545 auto it = cs_responder_trackers_.find(connection_handle);
546 if (it == cs_responder_trackers_.end()) {
547 log::info("no cs tracker found for {}", connection_handle);
548 return;
549 }
550 if (it->second.address != address) {
551 log::info("the cs tracker address was changed as {}, not {}.", it->second.address, address);
552 return;
553 }
554 if (ranging_hal_->IsBound()) {
555 ranging_hal_->HandleVendorSpecificReply(connection_handle, vendor_specific_reply);
556 return;
557 }
558 }
559
handle_ras_server_connectedbluetooth::hci::DistanceMeasurementManager::impl560 void handle_ras_server_connected(const Address& identity_address, uint16_t connection_handle,
561 hci::Role local_hci_role) {
562 log::info("initialize the responder tracker for {} with {}", connection_handle,
563 identity_address);
564 // create CS tracker to serve the ras_server
565 auto it = cs_responder_trackers_.find(connection_handle);
566 if (it != cs_responder_trackers_.end()) {
567 if (it->second.address != identity_address) {
568 log::debug("Remove old tracker for {}", identity_address);
569 it->second = CsTracker();
570 }
571 } else {
572 cs_responder_trackers_[connection_handle] = CsTracker();
573 it = cs_responder_trackers_.find(connection_handle);
574 }
575 it->second.state = CsTrackerState::RAS_CONNECTED;
576 it->second.address = identity_address;
577 it->second.local_start = false;
578 it->second.local_hci_role = local_hci_role;
579 }
580
handle_ras_server_disconnectedbluetooth::hci::DistanceMeasurementManager::impl581 void handle_ras_server_disconnected(const Address& identity_address, uint16_t connection_handle) {
582 auto it = cs_responder_trackers_.find(connection_handle);
583 if (it == cs_responder_trackers_.end()) {
584 log::info("no CS tracker available.");
585 return;
586 }
587 if (it->second.address != identity_address) {
588 log::info("cs tracker connection is associated with device {}, not device {}",
589 it->second.address, identity_address);
590 return;
591 }
592 cs_responder_trackers_.erase(connection_handle);
593 }
594
handle_vendor_specific_reply_completebluetooth::hci::DistanceMeasurementManager::impl595 void handle_vendor_specific_reply_complete(const Address address, uint16_t connection_handle,
596 bool success) {
597 log::info("address:{}, connection_handle:0x{:04x}, success:{}", address, connection_handle,
598 success);
599 auto it = cs_requester_trackers_.find(connection_handle);
600 if (it == cs_requester_trackers_.end()) {
601 log::warn("can't find tracker for 0x{:04x}", connection_handle);
602 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
603 METHOD_CS);
604 return;
605 }
606
607 if (!success) {
608 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
609 METHOD_CS);
610 return;
611 }
612
613 start_distance_measurement_with_cs(it->second.address, connection_handle);
614 }
615
send_read_rssibluetooth::hci::DistanceMeasurementManager::impl616 void send_read_rssi(const Address& address, uint16_t connection_handle) {
617 if (rssi_trackers.find(address) == rssi_trackers.end()) {
618 log::warn("Can't find rssi tracker for {}", address);
619 return;
620 }
621 Address connection_address = acl_manager_->HACK_GetLeAddress(connection_handle);
622 if (connection_address.IsEmpty()) {
623 log::warn("Can't find connection for {}", address);
624 if (rssi_trackers.find(address) != rssi_trackers.end()) {
625 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
626 address, REASON_NO_LE_CONNECTION, METHOD_RSSI);
627 rssi_trackers[address].repeating_alarm->Cancel();
628 rssi_trackers[address].repeating_alarm.reset();
629 rssi_trackers.erase(address);
630 }
631 return;
632 }
633
634 hci_layer_->EnqueueCommand(ReadRssiBuilder::Create(connection_handle),
635 handler_->BindOnceOn(this, &impl::on_read_rssi_complete, address));
636 }
637
handle_eventbluetooth::hci::DistanceMeasurementManager::impl638 void handle_event(LeMetaEventView event) {
639 if (!event.IsValid()) {
640 log::error("Received invalid LeMetaEventView");
641 return;
642 }
643 switch (event.GetSubeventCode()) {
644 case hci::SubeventCode::LE_CS_TEST_END_COMPLETE:
645 case hci::SubeventCode::LE_CS_READ_REMOTE_FAE_TABLE_COMPLETE: {
646 log::warn("Unhandled subevent {}", hci::SubeventCodeText(event.GetSubeventCode()));
647 } break;
648 case hci::SubeventCode::LE_CS_SUBEVENT_RESULT_CONTINUE:
649 case hci::SubeventCode::LE_CS_SUBEVENT_RESULT: {
650 on_cs_subevent(event);
651 } break;
652 case hci::SubeventCode::LE_CS_PROCEDURE_ENABLE_COMPLETE: {
653 on_cs_procedure_enable_complete(LeCsProcedureEnableCompleteView::Create(event));
654 } break;
655 case hci::SubeventCode::LE_CS_CONFIG_COMPLETE: {
656 on_cs_config_complete(LeCsConfigCompleteView::Create(event));
657 } break;
658 case hci::SubeventCode::LE_CS_SECURITY_ENABLE_COMPLETE: {
659 on_cs_security_enable_complete(LeCsSecurityEnableCompleteView::Create(event));
660 } break;
661 case hci::SubeventCode::LE_CS_READ_REMOTE_SUPPORTED_CAPABILITIES_COMPLETE: {
662 on_cs_read_remote_supported_capabilities_complete(
663 LeCsReadRemoteSupportedCapabilitiesCompleteView::Create(event));
664 } break;
665 default:
666 log::info("Unknown subevent {}", hci::SubeventCodeText(event.GetSubeventCode()));
667 }
668 }
669
send_le_cs_read_remote_supported_capabilitiesbluetooth::hci::DistanceMeasurementManager::impl670 void send_le_cs_read_remote_supported_capabilities(uint16_t connection_handle) {
671 hci_layer_->EnqueueCommand(
672 LeCsReadRemoteSupportedCapabilitiesBuilder::Create(connection_handle),
673 handler_->BindOnceOn(this, &impl::on_cs_setup_command_status_cb, connection_handle));
674 }
675
send_le_cs_security_enablebluetooth::hci::DistanceMeasurementManager::impl676 void send_le_cs_security_enable(uint16_t connection_handle) {
677 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
678 log::warn("no cs tracker found for {}", connection_handle);
679 }
680 cs_requester_trackers_[connection_handle].state = CsTrackerState::WAIT_FOR_SECURITY_ENABLED;
681 hci_layer_->EnqueueCommand(
682 LeCsSecurityEnableBuilder::Create(connection_handle),
683 handler_->BindOnceOn(this, &impl::on_cs_setup_command_status_cb, connection_handle));
684 }
685
send_le_cs_set_default_settingsbluetooth::hci::DistanceMeasurementManager::impl686 void send_le_cs_set_default_settings(uint16_t connection_handle) {
687 uint8_t role_enable = (1 << (uint8_t)CsRole::INITIATOR) | 1 << ((uint8_t)CsRole::REFLECTOR);
688 hci_layer_->EnqueueCommand(
689 LeCsSetDefaultSettingsBuilder::Create(connection_handle, role_enable,
690 kCsSyncAntennaSelection, kCsMaxTxPower),
691 handler_->BindOnceOn(this, &impl::on_cs_set_default_settings_complete));
692 }
693
send_le_cs_create_configbluetooth::hci::DistanceMeasurementManager::impl694 void send_le_cs_create_config(uint16_t connection_handle, uint8_t config_id) {
695 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
696 log::warn("no cs tracker found for {}", connection_handle);
697 }
698 log::debug("send cs create config");
699 cs_requester_trackers_[connection_handle].state = CsTrackerState::WAIT_FOR_CONFIG_COMPLETE;
700 auto channel_vector = common::FromHexString("1FFFFFFFFFFFFC7FFFFC"); // use all 72 Channels
701 // If the interval is less than or equal to 1 second, then use half channels
702 if (cs_requester_trackers_[connection_handle].interval_ms <= 1000) {
703 channel_vector = common::FromHexString("15555555555554555554");
704 }
705 std::array<uint8_t, 10> channel_map;
706 std::copy(channel_vector->begin(), channel_vector->end(), channel_map.begin());
707 std::reverse(channel_map.begin(), channel_map.end());
708 hci_layer_->EnqueueCommand(
709 LeCsCreateConfigBuilder::Create(
710 connection_handle, config_id, CsCreateContext::BOTH_LOCAL_AND_REMOTE_CONTROLLER,
711 CsMainModeType::MODE_2, CsSubModeType::UNUSED, kMinMainModeSteps,
712 kMaxMainModeSteps, kMainModeRepetition, kMode0Steps, CsRole::INITIATOR,
713 CsConfigRttType::RTT_AA_COARSE, CsSyncPhy::LE_1M_PHY, channel_map,
714 kChannelMapRepetition, CsChannelSelectionType::TYPE_3B, CsCh3cShape::HAT_SHAPE,
715 kCh3cJump),
716 handler_->BindOnceOn(this, &impl::on_cs_setup_command_status_cb, connection_handle));
717 }
718
send_le_cs_set_procedure_parametersbluetooth::hci::DistanceMeasurementManager::impl719 void send_le_cs_set_procedure_parameters(uint16_t connection_handle, uint8_t config_id,
720 uint8_t remote_num_antennas_supported) {
721 uint8_t tone_antenna_config_selection =
722 cs_tone_antenna_config_mapping_table_[num_antennas_supported_ - 1]
723 [remote_num_antennas_supported - 1];
724 uint8_t preferred_peer_antenna_value =
725 cs_preferred_peer_antenna_mapping_table_[tone_antenna_config_selection];
726 log::info(
727 "num_antennas_supported:{}, remote_num_antennas_supported:{}, "
728 "tone_antenna_config_selection:{}, preferred_peer_antenna:{}",
729 num_antennas_supported_, remote_num_antennas_supported, tone_antenna_config_selection,
730 preferred_peer_antenna_value);
731 CsPreferredPeerAntenna preferred_peer_antenna;
732 preferred_peer_antenna.use_first_ordered_antenna_element_ = preferred_peer_antenna_value & 0x01;
733 preferred_peer_antenna.use_second_ordered_antenna_element_ =
734 (preferred_peer_antenna_value >> 1) & 0x01;
735 preferred_peer_antenna.use_third_ordered_antenna_element_ =
736 (preferred_peer_antenna_value >> 2) & 0x01;
737 preferred_peer_antenna.use_fourth_ordered_antenna_element_ =
738 (preferred_peer_antenna_value >> 3) & 0x01;
739 hci_layer_->EnqueueCommand(
740 LeCsSetProcedureParametersBuilder::Create(
741 connection_handle, config_id, kMaxProcedureLen, kMinProcedureInterval,
742 kMaxProcedureInterval,
743 cs_requester_trackers_[connection_handle].max_procedure_count, kMinSubeventLen,
744 kMaxSubeventLen, tone_antenna_config_selection, CsPhy::LE_1M_PHY, kTxPwrDelta,
745 preferred_peer_antenna, CsSnrControl::NOT_APPLIED, CsSnrControl::NOT_APPLIED),
746 handler_->BindOnceOn(this, &impl::on_cs_set_procedure_parameters));
747 }
748
reset_tracker_on_stoppedbluetooth::hci::DistanceMeasurementManager::impl749 static void reset_tracker_on_stopped(CsTracker& cs_tracker) {
750 cs_tracker.measurement_ongoing = false;
751 cs_tracker.state = CsTrackerState::STOPPED;
752 }
753
handle_cs_setup_failurebluetooth::hci::DistanceMeasurementManager::impl754 void handle_cs_setup_failure(uint16_t connection_handle, DistanceMeasurementErrorCode errorCode) {
755 // responder is stateless. only requester needs to handle the set up failure.
756 auto it = cs_requester_trackers_.find(connection_handle);
757 if (it == cs_requester_trackers_.end()) {
758 log::info("no requester tracker is found for {}.", connection_handle);
759 return;
760 }
761 if (it->second.measurement_ongoing) {
762 distance_measurement_callbacks_->OnDistanceMeasurementStopped(it->second.address, errorCode,
763 METHOD_CS);
764 it->second.repeating_alarm->Cancel();
765 it->second.repeating_alarm.reset();
766 }
767 reset_tracker_on_stopped(it->second);
768 // the cs_tracker should be kept until the connection is disconnected
769 }
770
send_le_cs_procedure_enablebluetooth::hci::DistanceMeasurementManager::impl771 void send_le_cs_procedure_enable(uint16_t connection_handle, Enable enable) {
772 log::debug("cmd {}", enable);
773 auto it = cs_requester_trackers_.find(connection_handle);
774 if (it == cs_requester_trackers_.end()) {
775 log::warn("Can't find cs tracker for connection {}", connection_handle);
776 return;
777 }
778
779 if (enable == Enable::ENABLED) {
780 if (it->second.state == CsTrackerState::STOPPED) {
781 log::error("safe guard, error state, no local measurement request.");
782 if (it->second.repeating_alarm) {
783 it->second.repeating_alarm->Cancel();
784 }
785 return;
786 }
787 it->second.state = CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED;
788 } else { // Enable::DISABLE
789 if (it->second.state != CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED &&
790 it->second.state != CsTrackerState::STARTED) {
791 log::info("no procedure disable command needed for state {}.", (int)it->second.state);
792 return;
793 }
794 }
795
796 hci_layer_->EnqueueCommand(
797 LeCsProcedureEnableBuilder::Create(connection_handle, it->second.used_config_id,
798 enable),
799 handler_->BindOnceOn(this, &impl::on_cs_procedure_enable_command_status_cb,
800 connection_handle, enable));
801 }
802
on_cs_procedure_enable_command_status_cbbluetooth::hci::DistanceMeasurementManager::impl803 void on_cs_procedure_enable_command_status_cb(uint16_t connection_handle, Enable enable,
804 CommandStatusView status_view) {
805 ErrorCode status = status_view.GetStatus();
806 // controller may send error if the procedure instance has finished all scheduled procedures.
807 if (enable == Enable::DISABLED && status == ErrorCode::COMMAND_DISALLOWED) {
808 log::info("ignored the procedure disable command disallow error.");
809 if (cs_requester_trackers_.find(connection_handle) != cs_requester_trackers_.end()) {
810 reset_tracker_on_stopped(cs_requester_trackers_[connection_handle]);
811 }
812 } else {
813 on_cs_setup_command_status_cb(connection_handle, status_view);
814 }
815 }
816
on_cs_setup_command_status_cbbluetooth::hci::DistanceMeasurementManager::impl817 void on_cs_setup_command_status_cb(uint16_t connection_handle, CommandStatusView status_view) {
818 ErrorCode status = status_view.GetStatus();
819 OpCode op_code = status_view.GetCommandOpCode();
820 if (status != ErrorCode::SUCCESS) {
821 log::error("Error code {}, opcode {} for connection-{}", ErrorCodeText(status),
822 OpCodeText(op_code), connection_handle);
823 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
824 }
825 }
826
on_cs_read_local_supported_capabilitiesbluetooth::hci::DistanceMeasurementManager::impl827 void on_cs_read_local_supported_capabilities(CommandCompleteView view) {
828 auto complete_view = LeCsReadLocalSupportedCapabilitiesCompleteView::Create(view);
829 if (!complete_view.IsValid()) {
830 log::warn("Get invalid LeCsReadLocalSupportedCapabilitiesComplete");
831 return;
832 } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
833 std::string error_code = ErrorCodeText(complete_view.GetStatus());
834 log::warn("Received LeCsReadLocalSupportedCapabilitiesComplete with error code {}",
835 error_code);
836 return;
837 }
838 cs_subfeature_supported_ = complete_view.GetOptionalSubfeaturesSupported();
839 num_antennas_supported_ = complete_view.GetNumAntennasSupported();
840 local_support_phase_based_ranging_ = cs_subfeature_supported_.phase_based_ranging_ == 0x01;
841 local_supported_sw_time_ = complete_view.GetTSwTimeSupported();
842 is_local_cs_ready_ = true;
843 }
844
on_cs_read_remote_supported_capabilities_completebluetooth::hci::DistanceMeasurementManager::impl845 void on_cs_read_remote_supported_capabilities_complete(
846 LeCsReadRemoteSupportedCapabilitiesCompleteView event_view) {
847 if (!event_view.IsValid()) {
848 log::warn("Get invalid LeCsReadRemoteSupportedCapabilitiesCompleteView");
849 return;
850 }
851 uint16_t connection_handle = event_view.GetConnectionHandle();
852 if (event_view.GetStatus() != ErrorCode::SUCCESS) {
853 std::string error_code = ErrorCodeText(event_view.GetStatus());
854 log::warn("Received LeCsReadRemoteSupportedCapabilitiesCompleteView with error code {}",
855 error_code);
856 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
857 return;
858 }
859 auto res_it = cs_responder_trackers_.find(connection_handle);
860 if (res_it != cs_responder_trackers_.end()) {
861 res_it->second.remote_support_phase_based_ranging =
862 event_view.GetOptionalSubfeaturesSupported().phase_based_ranging_ == 0x01;
863 }
864 send_le_cs_set_default_settings(connection_handle);
865
866 auto req_it = cs_requester_trackers_.find(connection_handle);
867 if (req_it != cs_requester_trackers_.end() && req_it->second.measurement_ongoing) {
868 req_it->second.remote_support_phase_based_ranging =
869 event_view.GetOptionalSubfeaturesSupported().phase_based_ranging_ == 0x01;
870 req_it->second.remote_num_antennas_supported_ = event_view.GetNumAntennasSupported();
871 req_it->second.setup_complete = true;
872 log::info("Setup phase complete, connection_handle: {}, address: {}", connection_handle,
873 req_it->second.address);
874 req_it->second.retry_counter_for_create_config = 0;
875 req_it->second.remote_supported_sw_time_ = event_view.GetTSwTimeSupported();
876 send_le_cs_create_config(connection_handle, req_it->second.requesting_config_id);
877 }
878 log::info(
879 "connection_handle:{}, num_antennas_supported:{}, max_antenna_paths_supported:{}, "
880 "roles_supported:{}, phase_based_ranging_supported: {}",
881 event_view.GetConnectionHandle(), event_view.GetNumAntennasSupported(),
882 event_view.GetMaxAntennaPathsSupported(), event_view.GetRolesSupported().ToString(),
883 event_view.GetOptionalSubfeaturesSupported().phase_based_ranging_);
884 }
885
on_cs_set_default_settings_completebluetooth::hci::DistanceMeasurementManager::impl886 void on_cs_set_default_settings_complete(CommandCompleteView view) {
887 auto complete_view = LeCsSetDefaultSettingsCompleteView::Create(view);
888 if (!complete_view.IsValid()) {
889 log::warn("Get invalid LeCsSetDefaultSettingsComplete");
890 return;
891 }
892 if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
893 std::string error_code = ErrorCodeText(complete_view.GetStatus());
894 log::warn("Received LeCsSetDefaultSettingsComplete with error code {}", error_code);
895 uint16_t connection_handle = complete_view.GetConnectionHandle();
896 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
897 return;
898 }
899 }
900
on_cs_security_enable_completebluetooth::hci::DistanceMeasurementManager::impl901 void on_cs_security_enable_complete(LeCsSecurityEnableCompleteView event_view) {
902 if (!event_view.IsValid()) {
903 log::warn("Get invalid LeCsSecurityEnableCompleteView");
904 return;
905 }
906 uint16_t connection_handle = event_view.GetConnectionHandle();
907 if (event_view.GetStatus() != ErrorCode::SUCCESS) {
908 std::string error_code = ErrorCodeText(event_view.GetStatus());
909 log::warn("Received LeCsSecurityEnableCompleteView with error code {}", error_code);
910 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
911 return;
912 }
913 auto req_it = cs_requester_trackers_.find(connection_handle);
914 if (req_it != cs_requester_trackers_.end() && req_it->second.measurement_ongoing) {
915 send_le_cs_set_procedure_parameters(event_view.GetConnectionHandle(),
916 req_it->second.used_config_id,
917 req_it->second.remote_num_antennas_supported_);
918 }
919 auto res_it = cs_responder_trackers_.find(connection_handle);
920 if (res_it != cs_responder_trackers_.end() &&
921 res_it->second.state == CsTrackerState::WAIT_FOR_SECURITY_ENABLED) {
922 res_it->second.state = CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED;
923 }
924 }
925
on_cs_config_completebluetooth::hci::DistanceMeasurementManager::impl926 void on_cs_config_complete(LeCsConfigCompleteView event_view) {
927 if (!event_view.IsValid()) {
928 log::warn("Get invalid LeCsConfigCompleteView");
929 return;
930 }
931 uint16_t connection_handle = event_view.GetConnectionHandle();
932 if (event_view.GetStatus() != ErrorCode::SUCCESS) {
933 std::string error_code = ErrorCodeText(event_view.GetStatus());
934 log::warn("Received LeCsConfigCompleteView with error code {}", error_code);
935 // The Create Config LL packet may arrive before the remote side has finished setting default
936 // settings, which will result in create config failure. Retry to ensure the remote side has
937 // completed its setup.
938 if (cs_requester_trackers_.find(connection_handle) != cs_requester_trackers_.end() &&
939 cs_requester_trackers_[connection_handle].retry_counter_for_create_config <
940 kMaxRetryCounterForCreateConfig) {
941 cs_requester_trackers_[connection_handle].retry_counter_for_create_config++;
942 log::info("send_le_cs_create_config, retry counter {}",
943 cs_requester_trackers_[connection_handle].retry_counter_for_create_config);
944 send_le_cs_create_config(connection_handle,
945 cs_requester_trackers_[connection_handle].requesting_config_id);
946 } else {
947 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
948 }
949 return;
950 }
951 uint8_t config_id = event_view.GetConfigId();
952 if (event_view.GetAction() == CsAction::CONFIG_REMOVED) {
953 on_cs_config_removed(connection_handle, config_id);
954 return;
955 }
956 check_and_handle_conflict(connection_handle, config_id,
957 CsTrackerState::WAIT_FOR_CONFIG_COMPLETE);
958 auto valid_requester_states = static_cast<uint8_t>(CsTrackerState::WAIT_FOR_CONFIG_COMPLETE);
959 // any state, as the remote can start over at any time.
960 auto valid_responder_states = static_cast<uint8_t>(CsTrackerState::UNSPECIFIED);
961
962 CsTracker* live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states,
963 valid_responder_states);
964 if (live_tracker == nullptr) {
965 log::warn("Can't find cs tracker for connection_handle {}", connection_handle);
966 return;
967 }
968
969 live_tracker->used_config_id = config_id;
970 log::info("Get {}", event_view.ToString());
971 live_tracker->role = event_view.GetRole();
972 live_tracker->main_mode_type = event_view.GetMainModeType();
973 live_tracker->sub_mode_type = event_view.GetSubModeType();
974 live_tracker->rtt_type = event_view.GetRttType();
975 if (live_tracker->local_start && is_hal_v2()) {
976 ranging_hal_->UpdateChannelSoundingConfig(
977 connection_handle, event_view, local_supported_sw_time_,
978 live_tracker->remote_supported_sw_time_, live_tracker->conn_interval_);
979 }
980 if (live_tracker->local_hci_role == hci::Role::CENTRAL) {
981 // send the cmd from the BLE central only.
982 send_le_cs_security_enable(connection_handle);
983 }
984 // TODO: else set a timeout alarm to make sure the remote would trigger the cmd.
985 if (!live_tracker->local_start) {
986 live_tracker->state = CsTrackerState::WAIT_FOR_SECURITY_ENABLED;
987 }
988 }
989
on_cs_config_removedbluetooth::hci::DistanceMeasurementManager::impl990 void on_cs_config_removed(uint16_t connection_handle, uint8_t config_id) {
991 // suppose it only has 1 requester and 1 responder per ACL.
992 auto req_it = cs_requester_trackers_.find(connection_handle);
993 if (req_it != cs_requester_trackers_.end() && req_it->second.used_config_id == config_id) {
994 req_it->second.used_config_id = kInvalidConfigId;
995 return;
996 }
997 auto res_it = cs_responder_trackers_.find(connection_handle);
998 if (res_it != cs_responder_trackers_.end() && res_it->second.used_config_id == config_id) {
999 res_it->second.used_config_id = kInvalidConfigId;
1000 return;
1001 }
1002 log::warn("The removed config was not used, something was wrong.");
1003 }
1004
on_cs_set_procedure_parametersbluetooth::hci::DistanceMeasurementManager::impl1005 void on_cs_set_procedure_parameters(CommandCompleteView view) {
1006 auto complete_view = LeCsSetProcedureParametersCompleteView::Create(view);
1007 if (!complete_view.IsValid()) {
1008 log::warn("Get Invalid LeCsSetProcedureParametersCompleteView");
1009 return;
1010 }
1011 uint16_t connection_handle = complete_view.GetConnectionHandle();
1012 if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
1013 std::string error_code = ErrorCodeText(complete_view.GetStatus());
1014 log::warn("Received LeCsSetProcedureParametersCompleteView with error code {}", error_code);
1015 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
1016 return;
1017 }
1018 auto it = cs_requester_trackers_.find(connection_handle);
1019 if (it == cs_requester_trackers_.end()) {
1020 log::warn("Can't find cs tracker for connection_handle {}", connection_handle);
1021 return;
1022 }
1023
1024 if (it->second.measurement_ongoing) {
1025 log::info("enable cs procedure regularly with interval: {} ms", it->second.interval_ms);
1026 it->second.repeating_alarm->Cancel();
1027 send_le_cs_procedure_enable(connection_handle, Enable::ENABLED);
1028 it->second.repeating_alarm->Schedule(
1029 common::Bind(&impl::send_le_cs_procedure_enable, common::Unretained(this),
1030 connection_handle, Enable::ENABLED),
1031 std::chrono::milliseconds(it->second.interval_ms));
1032 }
1033 }
1034
get_live_trackerbluetooth::hci::DistanceMeasurementManager::impl1035 CsTracker* get_live_tracker(uint16_t connection_handle, uint8_t config_id,
1036 uint8_t valid_requester_states, uint8_t valid_responder_states) {
1037 // CAVEAT: if the remote is sending request with the same config id, the behavior is undefined.
1038 auto req_it = cs_requester_trackers_.find(connection_handle);
1039 if (req_it != cs_requester_trackers_.end() && req_it->second.state != CsTrackerState::STOPPED &&
1040 (valid_requester_states & static_cast<uint8_t>(req_it->second.state)) != 0) {
1041 uint8_t req_config_id = req_it->second.used_config_id;
1042 if (req_it->second.state == CsTrackerState::WAIT_FOR_CONFIG_COMPLETE) {
1043 req_config_id = req_it->second.requesting_config_id;
1044 }
1045 if (req_config_id == config_id) {
1046 return &(req_it->second);
1047 }
1048 }
1049
1050 auto res_it = cs_responder_trackers_.find(connection_handle);
1051 if (res_it != cs_responder_trackers_.end() &&
1052 (res_it->second.used_config_id == kInvalidConfigId ||
1053 res_it->second.used_config_id == config_id) &&
1054 (valid_responder_states == static_cast<uint8_t>(CsTrackerState::UNSPECIFIED) ||
1055 (valid_responder_states & static_cast<uint8_t>(res_it->second.state)) != 0)) {
1056 return &(res_it->second);
1057 }
1058 log::error("no valid tracker to handle the event.");
1059 return nullptr;
1060 }
1061
check_and_handle_conflictbluetooth::hci::DistanceMeasurementManager::impl1062 void check_and_handle_conflict(uint16_t connection_handle, uint8_t event_config_id,
1063 CsTrackerState expected_requester_state) {
1064 // If the local and remote were triggering the event at the same time, and the controller
1065 // allows that happen, the things may still get messed; If the spec can differentiate the
1066 // local event or remote event, that would be clearer.
1067 auto it = cs_requester_trackers_.find(connection_handle);
1068 if (it == cs_requester_trackers_.end()) {
1069 return;
1070 }
1071 if (event_config_id != it->second.used_config_id) {
1072 return;
1073 }
1074 if (it->second.state == expected_requester_state) {
1075 return;
1076 }
1077 log::warn("unexpected request from remote, which is conflict with the local measurement.");
1078 it->second.used_config_id = kInvalidConfigId;
1079 if (it->second.state != CsTrackerState::STOPPED) {
1080 stop_distance_measurement(it->second.address, connection_handle,
1081 DistanceMeasurementMethod::METHOD_CS);
1082 // TODO: clean up the stopped callback, it should be called within stop_distance_measurement.
1083 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
1084 it->second.address, REASON_REMOTE_REQUEST, METHOD_CS);
1085 }
1086 }
1087
on_cs_procedure_enable_completebluetooth::hci::DistanceMeasurementManager::impl1088 void on_cs_procedure_enable_complete(LeCsProcedureEnableCompleteView event_view) {
1089 log::assert_that(event_view.IsValid(), "assert failed: event_view.IsValid()");
1090 uint16_t connection_handle = event_view.GetConnectionHandle();
1091 log::debug("on cs procedure enabled complete");
1092 if (event_view.GetStatus() != ErrorCode::SUCCESS) {
1093 std::string error_code = ErrorCodeText(event_view.GetStatus());
1094 log::warn("Received LeCsProcedureEnableCompleteView with error code {}", error_code);
1095 handle_cs_setup_failure(connection_handle, REASON_INTERNAL_ERROR);
1096 return;
1097 }
1098 uint8_t config_id = event_view.GetConfigId();
1099
1100 CsTracker* live_tracker = nullptr;
1101 if (event_view.GetState() == Enable::ENABLED) {
1102 check_and_handle_conflict(connection_handle, config_id,
1103 CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED);
1104 uint8_t valid_requester_states =
1105 static_cast<uint8_t>(CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED);
1106 uint8_t valid_responder_states =
1107 static_cast<uint8_t>(CsTrackerState::STOPPED) |
1108 static_cast<uint8_t>(CsTrackerState::INIT) |
1109 static_cast<uint8_t>(CsTrackerState::STARTED) |
1110 static_cast<uint8_t>(CsTrackerState::WAIT_FOR_PROCEDURE_ENABLED);
1111 live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states,
1112 valid_responder_states);
1113 if (live_tracker == nullptr) {
1114 log::error("no tracker is available for {}", connection_handle);
1115 return;
1116 }
1117 if (live_tracker->used_config_id != config_id) {
1118 log::warn("config_id {} doesn't match the assigned one {}.", config_id,
1119 live_tracker->used_config_id);
1120 return;
1121 }
1122 log::debug("Procedure enabled, {}", event_view.ToString());
1123 live_tracker->state = CsTrackerState::STARTED;
1124 live_tracker->selected_tx_power = event_view.GetSelectedTxPower();
1125 live_tracker->n_procedure_count = event_view.GetProcedureCount();
1126
1127 if (live_tracker->local_start && live_tracker->waiting_for_start_callback) {
1128 live_tracker->waiting_for_start_callback = false;
1129 distance_measurement_callbacks_->OnDistanceMeasurementStarted(live_tracker->address,
1130 METHOD_CS);
1131 }
1132 if (live_tracker->local_start && is_hal_v2()) {
1133 ranging_hal_->UpdateProcedureEnableConfig(connection_handle, event_view);
1134 }
1135 } else if (event_view.GetState() == Enable::DISABLED) {
1136 uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED);
1137 uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED);
1138 live_tracker = get_live_tracker(connection_handle, config_id, valid_requester_states,
1139 valid_responder_states);
1140 if (live_tracker == nullptr) {
1141 log::error("no tracker is available for {}", connection_handle);
1142 return;
1143 }
1144 reset_tracker_on_stopped(*live_tracker);
1145 }
1146 // reset the procedure data list.
1147 std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list;
1148 while (!data_list.empty()) {
1149 data_list.erase(data_list.begin());
1150 }
1151 }
1152
is_hal_v2bluetooth::hci::DistanceMeasurementManager::impl1153 bool is_hal_v2() const {
1154 return com::android::bluetooth::flags::channel_sounding_25q2_apis() &&
1155 ranging_hal_->GetRangingHalVersion() == hal::V_2;
1156 }
1157
on_cs_subeventbluetooth::hci::DistanceMeasurementManager::impl1158 void on_cs_subevent(LeMetaEventView event) {
1159 if (!event.IsValid()) {
1160 log::error("Received invalid LeMetaEventView");
1161 return;
1162 }
1163
1164 // Common data for LE_CS_SUBEVENT_RESULT and LE_CS_SUBEVENT_RESULT_CONTINUE,
1165 uint16_t connection_handle = 0;
1166 CsProcedureDoneStatus procedure_done_status;
1167 CsSubeventDoneStatus subevent_done_status;
1168 ProcedureAbortReason procedure_abort_reason;
1169 SubeventAbortReason subevent_abort_reason;
1170 std::vector<LeCsResultDataStructure> result_data_structures;
1171 CsTracker* live_tracker = nullptr;
1172 CsProcedureData* procedure_data = nullptr;
1173 uint8_t valid_requester_states = static_cast<uint8_t>(CsTrackerState::STARTED);
1174 uint8_t valid_responder_states = static_cast<uint8_t>(CsTrackerState::STARTED);
1175 if (event.GetSubeventCode() == SubeventCode::LE_CS_SUBEVENT_RESULT) {
1176 auto cs_event_result = LeCsSubeventResultView::Create(event);
1177 if (!cs_event_result.IsValid()) {
1178 log::warn("Get invalid LeCsSubeventResultView");
1179 return;
1180 }
1181 connection_handle = cs_event_result.GetConnectionHandle();
1182 live_tracker = get_live_tracker(connection_handle, cs_event_result.GetConfigId(),
1183 valid_requester_states, valid_responder_states);
1184 if (live_tracker == nullptr) {
1185 log::error("no live tracker is available for {}", connection_handle);
1186 return;
1187 }
1188 procedure_done_status = cs_event_result.GetProcedureDoneStatus();
1189 subevent_done_status = cs_event_result.GetSubeventDoneStatus();
1190 procedure_abort_reason = cs_event_result.GetProcedureAbortReason();
1191 subevent_abort_reason = cs_event_result.GetSubeventAbortReason();
1192 result_data_structures = cs_event_result.GetResultDataStructures();
1193
1194 procedure_data = init_cs_procedure_data(live_tracker, cs_event_result.GetProcedureCounter(),
1195 cs_event_result.GetNumAntennaPaths());
1196 if (live_tracker->role == CsRole::INITIATOR) {
1197 procedure_data->frequency_compensation.push_back(
1198 cs_event_result.GetFrequencyCompensation());
1199 }
1200 // RAS
1201 log::debug("RAS Update subevent_header counter:{}", procedure_data->ras_subevent_counter_++);
1202 auto& ras_subevent_header = procedure_data->ras_subevent_header_;
1203 ras_subevent_header.start_acl_conn_event_ = cs_event_result.GetStartAclConnEvent();
1204 ras_subevent_header.frequency_compensation_ = cs_event_result.GetFrequencyCompensation();
1205 ras_subevent_header.reference_power_level_ = cs_event_result.GetReferencePowerLevel();
1206 ras_subevent_header.num_steps_reported_ = 0;
1207 if (live_tracker->local_start && is_hal_v2()) {
1208 // cache all subevent result
1209 auto subevent_result = std::make_shared<hal::SubeventResult>();
1210 subevent_result->start_acl_conn_event_counter_ = cs_event_result.GetStartAclConnEvent();
1211 subevent_result->frequency_compensation_ = cs_event_result.GetFrequencyCompensation();
1212 subevent_result->reference_power_level_ = cs_event_result.GetReferencePowerLevel();
1213 subevent_result->num_antenna_paths_ = cs_event_result.GetNumAntennaPaths();
1214 procedure_data->procedure_data_v2_.local_subevent_data_.emplace_back(subevent_result);
1215 }
1216 } else {
1217 auto cs_event_result = LeCsSubeventResultContinueView::Create(event);
1218 if (!cs_event_result.IsValid()) {
1219 log::warn("Get invalid LeCsSubeventResultContinueView");
1220 return;
1221 }
1222 connection_handle = cs_event_result.GetConnectionHandle();
1223 live_tracker = get_live_tracker(connection_handle, cs_event_result.GetConfigId(),
1224 valid_requester_states, valid_responder_states);
1225 procedure_done_status = cs_event_result.GetProcedureDoneStatus();
1226 subevent_done_status = cs_event_result.GetSubeventDoneStatus();
1227 procedure_abort_reason = cs_event_result.GetProcedureAbortReason();
1228 subevent_abort_reason = cs_event_result.GetSubeventAbortReason();
1229 result_data_structures = cs_event_result.GetResultDataStructures();
1230 if (live_tracker == nullptr) {
1231 log::warn("Can't find any tracker for {}", connection_handle);
1232 return;
1233 }
1234 procedure_data = get_procedure_data(live_tracker, live_tracker->procedure_counter);
1235 if (procedure_data == nullptr) {
1236 log::warn("no procedure data for counter {} of connection {}",
1237 live_tracker->procedure_counter, connection_handle);
1238 return;
1239 }
1240 }
1241 // Update procedure status
1242 procedure_data->local_status = procedure_done_status;
1243 procedure_data->procedure_data_v2_.local_procedure_abort_reason_ = procedure_abort_reason;
1244 post_handle_local_subevent_result(connection_handle, live_tracker, procedure_data,
1245 result_data_structures, subevent_done_status,
1246 subevent_abort_reason);
1247 if (live_tracker->local_start && is_hal_v2()) {
1248 if (procedure_data->procedure_data_v2_.local_subevent_data_.empty()) {
1249 log::error("no subevent result is available for subevent continue event");
1250 } else {
1251 auto last_subevent_result = procedure_data->procedure_data_v2_.local_subevent_data_.back();
1252 last_subevent_result->subevent_abort_reason_ = subevent_abort_reason;
1253 }
1254 }
1255 }
1256
post_handle_local_subevent_resultbluetooth::hci::DistanceMeasurementManager::impl1257 void post_handle_local_subevent_result(
1258 uint16_t connection_handle, CsTracker* live_tracker, CsProcedureData* procedure_data,
1259 const std::vector<LeCsResultDataStructure>& result_data_structures,
1260 const CsSubeventDoneStatus& subevent_done_status,
1261 const SubeventAbortReason& subevent_abort_reason) {
1262 uint16_t counter = live_tracker->procedure_counter;
1263 CsProcedureDoneStatus procedure_done_status = procedure_data->local_status;
1264 ProcedureAbortReason procedure_abort_reason =
1265 procedure_data->procedure_data_v2_.local_procedure_abort_reason_;
1266 log::debug(
1267 "Connection_handle {}, procedure_done_status: {}, subevent_done_status: {}, counter: "
1268 "{}",
1269 connection_handle, CsProcedureDoneStatusText(procedure_done_status),
1270 CsSubeventDoneStatusText(subevent_done_status), counter);
1271
1272 if (procedure_done_status == CsProcedureDoneStatus::ABORTED ||
1273 subevent_done_status == CsSubeventDoneStatus::ABORTED) {
1274 log::warn(
1275 "Received CS Subevent with procedure_abort_reason:{}, subevent_abort_reason:{}, "
1276 "connection_handle:{}, counter:{}",
1277 ProcedureAbortReasonText(procedure_abort_reason),
1278 SubeventAbortReasonText(subevent_abort_reason), connection_handle, counter);
1279 }
1280 procedure_data->ras_subevent_header_.num_steps_reported_ += result_data_structures.size();
1281 if (subevent_done_status == CsSubeventDoneStatus::ALL_RESULTS_COMPLETE) {
1282 procedure_data->contains_complete_subevent_ = true;
1283 }
1284
1285 if (procedure_abort_reason != ProcedureAbortReason::NO_ABORT ||
1286 subevent_abort_reason != SubeventAbortReason::NO_ABORT) {
1287 // Even the procedure is aborted, we should keep following process and
1288 // handle it when all corresponding remote data received.
1289 procedure_data->ras_subevent_header_.ranging_abort_reason_ =
1290 static_cast<RangingAbortReason>(procedure_abort_reason);
1291 procedure_data->ras_subevent_header_.subevent_abort_reason_ =
1292 static_cast<bluetooth::ras::SubeventAbortReason>(subevent_abort_reason);
1293 }
1294 parse_cs_result_data(result_data_structures, *procedure_data, live_tracker->role);
1295 check_cs_procedure_complete(live_tracker, procedure_data, connection_handle);
1296
1297 if (live_tracker->local_start) {
1298 // Skip to send remote
1299 return;
1300 }
1301
1302 // Send data to RAS server
1303 if (subevent_done_status != CsSubeventDoneStatus::PARTIAL_RESULTS) {
1304 procedure_data->ras_subevent_header_.ranging_done_status_ =
1305 static_cast<RangingDoneStatus>(procedure_done_status);
1306 procedure_data->ras_subevent_header_.subevent_done_status_ =
1307 static_cast<SubeventDoneStatus>(subevent_done_status);
1308 auto builder = RasSubeventBuilder::Create(procedure_data->ras_subevent_header_,
1309 procedure_data->ras_subevent_data_);
1310 auto subevent_raw = builder_to_bytes(std::move(builder));
1311 append_vector(procedure_data->ras_raw_data_, subevent_raw);
1312 // erase buffer
1313 procedure_data->ras_subevent_data_.clear();
1314 send_on_demand_data(live_tracker->address, procedure_data);
1315 // remove procedure data sent previously
1316 if (procedure_done_status == CsProcedureDoneStatus::ALL_RESULTS_COMPLETE) {
1317 delete_consumed_procedure_data(live_tracker, live_tracker->procedure_counter);
1318 }
1319 }
1320 }
1321
send_on_demand_databluetooth::hci::DistanceMeasurementManager::impl1322 void send_on_demand_data(Address address, CsProcedureData* procedure_data) {
1323 // Check is last segment or not.
1324 uint16_t unsent_data_size =
1325 procedure_data->ras_raw_data_.size() - procedure_data->ras_raw_data_index_;
1326 if (procedure_data->local_status != CsProcedureDoneStatus::PARTIAL_RESULTS &&
1327 unsent_data_size <= kMtuForRasData) {
1328 procedure_data->segmentation_header_.last_segment_ = 1;
1329 } else if (unsent_data_size < kMtuForRasData) {
1330 log::verbose("waiting for more data, current unsent data size {}", unsent_data_size);
1331 return;
1332 }
1333
1334 // Create raw data for segment_data;
1335 uint16_t copy_size = unsent_data_size < kMtuForRasData ? unsent_data_size : kMtuForRasData;
1336 auto copy_start = procedure_data->ras_raw_data_.begin() + procedure_data->ras_raw_data_index_;
1337 auto copy_end = copy_start + copy_size;
1338 std::vector<uint8_t> subevent_data(copy_start, copy_end);
1339 procedure_data->ras_raw_data_index_ += copy_size;
1340
1341 auto builder =
1342 RangingDataSegmentBuilder::Create(procedure_data->segmentation_header_, subevent_data);
1343 auto segment_data = builder_to_bytes(std::move(builder));
1344
1345 log::debug("counter: {}, size:{}", procedure_data->counter, (uint16_t)segment_data.size());
1346 distance_measurement_callbacks_->OnRasFragmentReady(
1347 address, procedure_data->counter, procedure_data->segmentation_header_.last_segment_,
1348 segment_data);
1349
1350 procedure_data->segmentation_header_.first_segment_ = 0;
1351 procedure_data->segmentation_header_.rolling_segment_counter_++;
1352 procedure_data->segmentation_header_.rolling_segment_counter_ %= 64;
1353 if (procedure_data->segmentation_header_.last_segment_) {
1354 // last segment sent, clear buffer
1355 procedure_data->ras_raw_data_.clear();
1356 } else if (unsent_data_size > kMtuForRasData) {
1357 send_on_demand_data(address, procedure_data);
1358 }
1359 }
1360
handle_remote_databluetooth::hci::DistanceMeasurementManager::impl1361 void handle_remote_data(const Address address, uint16_t connection_handle,
1362 const std::vector<uint8_t> raw_data) {
1363 log::debug("address:{}, connection_handle 0x{:04x}, size:{}", address.ToString(),
1364 connection_handle, raw_data.size());
1365
1366 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
1367 log::warn("can't find tracker for 0x{:04x}", connection_handle);
1368 return;
1369 }
1370 if (cs_requester_trackers_[connection_handle].state != CsTrackerState::STARTED) {
1371 log::warn("The measurement for {} is stopped, ignore the remote data.", connection_handle);
1372 return;
1373 }
1374 auto& tracker = cs_requester_trackers_[connection_handle];
1375
1376 SegmentationHeader segmentation_header;
1377 PacketView<kLittleEndian> packet_bytes_view(std::make_shared<std::vector<uint8_t>>(raw_data));
1378 auto after = SegmentationHeader::Parse(&segmentation_header, packet_bytes_view.begin());
1379 if (after == packet_bytes_view.begin()) {
1380 log::warn("Invalid segment data");
1381 return;
1382 }
1383
1384 log::debug("Receive segment for segment counter {}, size {}",
1385 segmentation_header.rolling_segment_counter_, raw_data.size());
1386
1387 PacketView<kLittleEndian> segment_data(std::make_shared<std::vector<uint8_t>>(raw_data));
1388 if (segmentation_header.first_segment_) {
1389 auto segment = FirstRangingDataSegmentView::Create(segment_data);
1390 if (!segment.IsValid()) {
1391 log::warn("Invalid segment data");
1392 return;
1393 }
1394 tracker.ranging_header_ = segment.GetRangingHeader();
1395
1396 auto begin = segment.GetSegmentationHeader().size() + segment.GetRangingHeader().size();
1397 tracker.segment_data_ =
1398 PacketViewForRecombination(segment.GetLittleEndianSubview(begin, segment.size()));
1399 } else {
1400 auto segment = RangingDataSegmentView::Create(segment_data);
1401 if (!segment.IsValid()) {
1402 log::warn("Invalid segment data");
1403 return;
1404 }
1405 tracker.segment_data_.AppendPacketView(
1406 segment.GetLittleEndianSubview(segmentation_header.size(), segment.size()));
1407 }
1408
1409 if (segmentation_header.last_segment_) {
1410 parse_ras_segments(tracker.ranging_header_, tracker.segment_data_, connection_handle);
1411 }
1412 }
1413
handle_remote_data_timeoutbluetooth::hci::DistanceMeasurementManager::impl1414 void handle_remote_data_timeout(const Address address, uint16_t connection_handle) {
1415 log::warn("address:{}, connection_handle 0x{:04x}", address.ToString(), connection_handle);
1416
1417 if (cs_requester_trackers_.find(connection_handle) == cs_requester_trackers_.end()) {
1418 log::error("Can't find CS tracker for connection_handle {}", connection_handle);
1419 return;
1420 }
1421 auto& tracker = cs_requester_trackers_[connection_handle];
1422 if (tracker.measurement_ongoing && tracker.local_start) {
1423 cs_requester_trackers_[connection_handle].repeating_alarm->Cancel();
1424 send_le_cs_procedure_enable(connection_handle, Enable::DISABLED);
1425 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
1426 tracker.address, REASON_INTERNAL_ERROR, METHOD_CS);
1427 }
1428 reset_tracker_on_stopped(tracker);
1429 }
1430
parse_ras_segmentsbluetooth::hci::DistanceMeasurementManager::impl1431 void parse_ras_segments(RangingHeader ranging_header, PacketViewForRecombination& segment_data,
1432 uint16_t connection_handle) {
1433 log::debug("Data size {}, Ranging_header {}", segment_data.size(), ranging_header.ToString());
1434 auto procedure_data =
1435 get_procedure_data_for_ras(connection_handle, ranging_header.ranging_counter_);
1436 if (procedure_data == nullptr) {
1437 return;
1438 }
1439
1440 uint8_t num_antenna_paths = 0;
1441 for (uint8_t i = 0; i < 4; i++) {
1442 if ((ranging_header.antenna_paths_mask_ & (1 << i)) != 0) {
1443 num_antenna_paths++;
1444 }
1445 }
1446
1447 // Get role of the remote device
1448 CsRole remote_role = cs_requester_trackers_[connection_handle].role == CsRole::INITIATOR
1449 ? CsRole::REFLECTOR
1450 : CsRole::INITIATOR;
1451
1452 auto parse_index = segment_data.begin();
1453 uint16_t remaining_data_size = std::distance(parse_index, segment_data.end());
1454 int subevent_sequence = -1;
1455 procedure_data->procedure_data_v2_.remote_selected_tx_power_ =
1456 static_cast<int8_t>(ranging_header.selected_tx_power_);
1457 // Parse subevents
1458 while (remaining_data_size > 0) {
1459 RasSubeventHeader subevent_header;
1460 // Parse header
1461 auto after = RasSubeventHeader::Parse(&subevent_header, parse_index);
1462 if (after == parse_index) {
1463 log::warn("Received invalid subevent_header data");
1464 return;
1465 }
1466 parse_index = after;
1467 log::debug("subevent_header: {}", subevent_header.ToString());
1468
1469 subevent_sequence++;
1470 auto remote_subevent_result = std::make_shared<hal::SubeventResult>();
1471 std::shared_ptr<hal::SubeventResult> local_subevent_result = nullptr;
1472 if (is_hal_v2()) {
1473 if (subevent_sequence <
1474 static_cast<int>(procedure_data->procedure_data_v2_.local_subevent_data_.size())) {
1475 local_subevent_result =
1476 procedure_data->procedure_data_v2_.local_subevent_data_[subevent_sequence];
1477 } else {
1478 log::error("there is no local subevent result.");
1479 return;
1480 }
1481 remote_subevent_result->start_acl_conn_event_counter_ =
1482 subevent_header.start_acl_conn_event_;
1483 remote_subevent_result->reference_power_level_ =
1484 static_cast<int8_t>(subevent_header.reference_power_level_);
1485 remote_subevent_result->num_antenna_paths_ = num_antenna_paths;
1486 remote_subevent_result->subevent_abort_reason_ =
1487 static_cast<SubeventAbortReason>(subevent_header.subevent_abort_reason_);
1488 remote_subevent_result->frequency_compensation_ = subevent_header.frequency_compensation_;
1489 // get data from local
1490 remote_subevent_result->timestamp_nanos_ = local_subevent_result->timestamp_nanos_;
1491 procedure_data->procedure_data_v2_.remote_subevent_data_.emplace_back(
1492 remote_subevent_result);
1493 procedure_data->procedure_data_v2_.remote_procedure_abort_reason_ =
1494 static_cast<ProcedureAbortReason>(subevent_header.ranging_abort_reason_);
1495 }
1496
1497 // Parse step data
1498 for (uint8_t i = 0; i < subevent_header.num_steps_reported_; i++) {
1499 uint8_t step_channel = 0;
1500 if (is_hal_v2() && local_subevent_result) {
1501 if (i < local_subevent_result->step_data_.size()) {
1502 step_channel = local_subevent_result->step_data_[i].step_channel_;
1503 } else {
1504 log::warn("The local subevent has less steps then the remote one.");
1505 }
1506 }
1507 StepMode step_mode;
1508 after = StepMode::Parse(&step_mode, parse_index);
1509 if (after == parse_index) {
1510 log::warn("Received invalid step_mode data");
1511 return;
1512 }
1513 parse_index = after;
1514 log::verbose("step:{}, {}", (uint16_t)i, step_mode.ToString());
1515 if (step_mode.aborted_) {
1516 continue;
1517 }
1518 uint8_t mode = step_mode.mode_type_;
1519 switch (mode) {
1520 case 0: {
1521 if (remote_role == CsRole::INITIATOR) {
1522 LeCsMode0InitatorData tone_data;
1523 after = LeCsMode0InitatorData::Parse(&tone_data, parse_index);
1524 if (after == parse_index) {
1525 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1526 CsRoleText(remote_role));
1527 return;
1528 }
1529 if (is_hal_v2()) {
1530 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1531 hal::Mode0Data(tone_data));
1532 }
1533 parse_index = after;
1534 } else {
1535 LeCsMode0ReflectorData tone_data;
1536 after = LeCsMode0ReflectorData::Parse(&tone_data, parse_index);
1537 if (after == parse_index) {
1538 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1539 CsRoleText(remote_role));
1540 return;
1541 }
1542 if (is_hal_v2()) {
1543 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1544 hal::Mode0Data(tone_data));
1545 }
1546 }
1547 parse_index = after;
1548 } break;
1549 case 1: {
1550 if (remote_role == CsRole::INITIATOR) {
1551 if (procedure_data->contains_sounding_sequence_remote_) {
1552 LeCsMode1InitatorDataWithPacketPct tone_data;
1553 after = LeCsMode1InitatorDataWithPacketPct::Parse(&tone_data, parse_index);
1554 if (after == parse_index) {
1555 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1556 CsRoleText(remote_role));
1557 return;
1558 }
1559 parse_index = after;
1560 procedure_data->toa_tod_initiators.emplace_back(tone_data.toa_tod_initiator_);
1561 procedure_data->packet_quality_initiator.emplace_back(tone_data.packet_quality_);
1562 if (is_hal_v2()) {
1563 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1564 hal::Mode1Data(tone_data));
1565 }
1566 } else {
1567 LeCsMode1InitatorData tone_data;
1568 after = LeCsMode1InitatorData::Parse(&tone_data, parse_index);
1569 if (after == parse_index) {
1570 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1571 CsRoleText(remote_role));
1572 return;
1573 }
1574 parse_index = after;
1575 procedure_data->toa_tod_initiators.emplace_back(tone_data.toa_tod_initiator_);
1576 procedure_data->packet_quality_initiator.emplace_back(tone_data.packet_quality_);
1577 if (is_hal_v2()) {
1578 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1579 hal::Mode1Data(tone_data));
1580 }
1581 }
1582 } else {
1583 if (procedure_data->contains_sounding_sequence_remote_) {
1584 LeCsMode1ReflectorDataWithPacketPct tone_data;
1585 after = LeCsMode1ReflectorDataWithPacketPct::Parse(&tone_data, parse_index);
1586 if (after == parse_index) {
1587 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1588 CsRoleText(remote_role));
1589 return;
1590 }
1591 parse_index = after;
1592 procedure_data->tod_toa_reflectors.emplace_back(tone_data.tod_toa_reflector_);
1593 procedure_data->packet_quality_reflector.emplace_back(tone_data.packet_quality_);
1594 if (is_hal_v2()) {
1595 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1596 hal::Mode1Data(tone_data));
1597 }
1598 } else {
1599 LeCsMode1ReflectorData tone_data;
1600 after = LeCsMode1ReflectorData::Parse(&tone_data, parse_index);
1601 if (after == parse_index) {
1602 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1603 CsRoleText(remote_role));
1604 return;
1605 }
1606 parse_index = after;
1607 procedure_data->tod_toa_reflectors.emplace_back(tone_data.tod_toa_reflector_);
1608 procedure_data->packet_quality_reflector.emplace_back(tone_data.packet_quality_);
1609 if (is_hal_v2()) {
1610 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1611 hal::Mode1Data(tone_data));
1612 }
1613 }
1614 }
1615 } break;
1616 case 2: {
1617 uint8_t num_tone_data = num_antenna_paths + 1;
1618 uint8_t data_len = 1 + (4 * num_tone_data);
1619 remaining_data_size = std::distance(parse_index, segment_data.end());
1620 if (remaining_data_size < data_len) {
1621 log::warn(
1622 "insufficient length for LeCsMode2Data, num_tone_data {}, "
1623 "remaining_data_size {}",
1624 num_tone_data, remaining_data_size);
1625 return;
1626 }
1627 std::vector<uint8_t> vector_for_num_tone_data = {num_tone_data};
1628 PacketView<kLittleEndian> packet_view_for_num_tone_data(
1629 std::make_shared<std::vector<uint8_t>>(vector_for_num_tone_data));
1630 PacketViewForRecombination packet_bytes_view =
1631 PacketViewForRecombination(packet_view_for_num_tone_data);
1632 auto subview_begin = std::distance(segment_data.begin(), parse_index);
1633 packet_bytes_view.AppendPacketView(
1634 segment_data.GetLittleEndianSubview(subview_begin, subview_begin + data_len));
1635 LeCsMode2Data tone_data;
1636 after = LeCsMode2Data::Parse(&tone_data, packet_bytes_view.begin());
1637 if (after == packet_bytes_view.begin()) {
1638 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1639 CsRoleText(remote_role));
1640 return;
1641 }
1642 parse_index += data_len;
1643 uint8_t permutation_index = tone_data.antenna_permutation_index_;
1644 if (is_hal_v2()) {
1645 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1646 hal::Mode2Data(tone_data));
1647 }
1648 // Parse in ascending order of antenna position with tone extension data at the end
1649 for (uint8_t k = 0; k < num_tone_data; k++) {
1650 uint8_t antenna_path =
1651 k == num_antenna_paths
1652 ? num_antenna_paths
1653 : cs_antenna_permutation_array_[permutation_index][k] - 1;
1654 double i_value = get_iq_value(tone_data.tone_data_[k].i_sample_);
1655 double q_value = get_iq_value(tone_data.tone_data_[k].q_sample_);
1656 uint8_t tone_quality_indicator = tone_data.tone_data_[k].tone_quality_indicator_;
1657 log::verbose("antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value,
1658 q_value);
1659 if (remote_role == CsRole::INITIATOR) {
1660 procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value);
1661 procedure_data->tone_quality_indicator_initiator[antenna_path].emplace_back(
1662 tone_quality_indicator);
1663 } else {
1664 procedure_data->tone_pct_reflector[antenna_path].emplace_back(i_value, q_value);
1665 procedure_data->tone_quality_indicator_reflector[antenna_path].emplace_back(
1666 tone_quality_indicator);
1667 }
1668 }
1669 } break;
1670 case 3: {
1671 uint8_t num_tone_data = num_antenna_paths + 1;
1672 uint8_t data_len = 7 + (4 * num_tone_data);
1673 if (procedure_data->contains_sounding_sequence_local_) {
1674 data_len += 3; // 3 bytes for packet_pct1, packet_pct2
1675 }
1676 remaining_data_size = std::distance(parse_index, segment_data.end());
1677 if (remaining_data_size < data_len) {
1678 log::warn(
1679 "insufficient length for LeCsMode2Data, num_tone_data {}, "
1680 "remaining_data_size {}",
1681 num_tone_data, remaining_data_size);
1682 return;
1683 }
1684 std::vector<uint8_t> vector_for_num_tone_data = {num_tone_data};
1685 PacketView<kLittleEndian> packet_view_for_num_tone_data(
1686 std::make_shared<std::vector<uint8_t>>(vector_for_num_tone_data));
1687 PacketViewForRecombination packet_bytes_view =
1688 PacketViewForRecombination(packet_view_for_num_tone_data);
1689 auto subview_begin = std::distance(segment_data.begin(), parse_index);
1690 packet_bytes_view.AppendPacketView(
1691 segment_data.GetLittleEndianSubview(subview_begin, subview_begin + data_len));
1692 uint8_t permutation_index = 0;
1693 std::vector<LeCsToneDataWithQuality> view_tone_data = {};
1694 if (remote_role == CsRole::INITIATOR) {
1695 if (procedure_data->contains_sounding_sequence_local_) {
1696 LeCsMode3InitatorDataWithPacketPct tone_data_view;
1697 after = LeCsMode3InitatorDataWithPacketPct::Parse(&tone_data_view,
1698 packet_bytes_view.begin());
1699 if (after == packet_bytes_view.begin()) {
1700 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1701 CsRoleText(remote_role));
1702 return;
1703 }
1704 parse_index += data_len;
1705 log::verbose("step_data: {}", tone_data_view.ToString());
1706 permutation_index = tone_data_view.antenna_permutation_index_;
1707 procedure_data->rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
1708 procedure_data->toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
1709 procedure_data->packet_quality_initiator.emplace_back(
1710 tone_data_view.packet_quality_);
1711 auto tone_data = tone_data_view.tone_data_;
1712 view_tone_data.reserve(tone_data.size());
1713 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
1714 if (is_hal_v2()) {
1715 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1716 hal::Mode3Data(tone_data_view));
1717 }
1718 } else {
1719 LeCsMode3InitatorData tone_data_view;
1720 after = LeCsMode3InitatorData::Parse(&tone_data_view, packet_bytes_view.begin());
1721 if (after == packet_bytes_view.begin()) {
1722 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1723 CsRoleText(remote_role));
1724 return;
1725 }
1726 parse_index += data_len;
1727 log::verbose("step_data: {}", tone_data_view.ToString());
1728 permutation_index = tone_data_view.antenna_permutation_index_;
1729 procedure_data->rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
1730 procedure_data->toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
1731 procedure_data->packet_quality_initiator.emplace_back(
1732 tone_data_view.packet_quality_);
1733 auto tone_data = tone_data_view.tone_data_;
1734 view_tone_data.reserve(tone_data.size());
1735 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
1736 if (is_hal_v2()) {
1737 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1738 hal::Mode3Data(tone_data_view));
1739 }
1740 }
1741 } else {
1742 if (procedure_data->contains_sounding_sequence_local_) {
1743 LeCsMode3ReflectorDataWithPacketPct tone_data_view;
1744 after = LeCsMode3ReflectorDataWithPacketPct::Parse(&tone_data_view,
1745 packet_bytes_view.begin());
1746 if (after == packet_bytes_view.begin()) {
1747 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1748 CsRoleText(remote_role));
1749 return;
1750 }
1751 parse_index += data_len;
1752 log::verbose("step_data: {}", tone_data_view.ToString());
1753 permutation_index = tone_data_view.antenna_permutation_index_;
1754 procedure_data->rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
1755 procedure_data->tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
1756 procedure_data->packet_quality_reflector.emplace_back(
1757 tone_data_view.packet_quality_);
1758 auto tone_data = tone_data_view.tone_data_;
1759 view_tone_data.reserve(tone_data.size());
1760 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
1761 if (is_hal_v2()) {
1762 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1763 hal::Mode3Data(tone_data_view));
1764 }
1765 } else {
1766 LeCsMode3ReflectorData tone_data_view;
1767 after = LeCsMode3ReflectorData::Parse(&tone_data_view, packet_bytes_view.begin());
1768 if (after == packet_bytes_view.begin()) {
1769 log::warn("Error invalid mode {} data, role:{}", step_mode.mode_type_,
1770 CsRoleText(remote_role));
1771 return;
1772 }
1773 parse_index += data_len;
1774 log::verbose("step_data: {}", tone_data_view.ToString());
1775 permutation_index = tone_data_view.antenna_permutation_index_;
1776 procedure_data->rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
1777 procedure_data->tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
1778 procedure_data->packet_quality_reflector.emplace_back(
1779 tone_data_view.packet_quality_);
1780 auto tone_data = tone_data_view.tone_data_;
1781 view_tone_data.reserve(tone_data.size());
1782 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
1783 if (is_hal_v2()) {
1784 remote_subevent_result->step_data_.emplace_back(step_channel, mode,
1785 hal::Mode3Data(tone_data_view));
1786 }
1787 }
1788 }
1789 // Parse in ascending order of antenna position with tone extension data at the end
1790 for (uint16_t k = 0; k < num_tone_data; k++) {
1791 uint8_t antenna_path =
1792 k == num_antenna_paths
1793 ? num_antenna_paths
1794 : cs_antenna_permutation_array_[permutation_index][k] - 1;
1795 double i_value = get_iq_value(view_tone_data[k].i_sample_);
1796 double q_value = get_iq_value(view_tone_data[k].q_sample_);
1797 uint8_t tone_quality_indicator = view_tone_data[k].tone_quality_indicator_;
1798 log::verbose("antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value,
1799 q_value);
1800 if (remote_role == CsRole::INITIATOR) {
1801 procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value);
1802 procedure_data->tone_quality_indicator_initiator[antenna_path].emplace_back(
1803 tone_quality_indicator);
1804 } else {
1805 procedure_data->tone_pct_reflector[antenna_path].emplace_back(i_value, q_value);
1806 procedure_data->tone_quality_indicator_reflector[antenna_path].emplace_back(
1807 tone_quality_indicator);
1808 }
1809 }
1810 } break;
1811 default:
1812 log::error("Unexpect mode: {}", step_mode.mode_type_);
1813 return;
1814 }
1815 }
1816 remaining_data_size = std::distance(parse_index, segment_data.end());
1817 log::debug("Parse subevent done with remaining data size {}", remaining_data_size);
1818 procedure_data->remote_status = (CsProcedureDoneStatus)subevent_header.ranging_done_status_;
1819 }
1820 check_cs_procedure_complete(&cs_requester_trackers_[connection_handle], procedure_data,
1821 connection_handle);
1822 }
1823
init_cs_procedure_databluetooth::hci::DistanceMeasurementManager::impl1824 CsProcedureData* init_cs_procedure_data(CsTracker* live_tracker, uint16_t procedure_counter,
1825 uint8_t num_antenna_paths) {
1826 // Update procedure count
1827 live_tracker->procedure_counter = procedure_counter;
1828
1829 std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list;
1830 for (auto& data : data_list) {
1831 if (data.counter == procedure_counter) {
1832 // Data already exists, return
1833 log::warn("duplicated procedure counter - {}.", procedure_counter);
1834 return &data;
1835 }
1836 }
1837 log::info("Create data for procedure_counter: {}", procedure_counter);
1838 data_list.emplace_back(procedure_counter, num_antenna_paths, live_tracker->used_config_id,
1839 live_tracker->selected_tx_power);
1840
1841 // Check if sounding phase-based ranging is supported, and RTT type contains a sounding
1842 // sequence
1843 bool rtt_contains_sounding_sequence = false;
1844 if (live_tracker->rtt_type == CsRttType::RTT_WITH_32_BIT_SOUNDING_SEQUENCE ||
1845 live_tracker->rtt_type == CsRttType::RTT_WITH_96_BIT_SOUNDING_SEQUENCE) {
1846 rtt_contains_sounding_sequence = true;
1847 }
1848 data_list.back().contains_sounding_sequence_local_ =
1849 local_support_phase_based_ranging_ && rtt_contains_sounding_sequence;
1850 data_list.back().contains_sounding_sequence_remote_ =
1851 live_tracker->remote_support_phase_based_ranging && rtt_contains_sounding_sequence;
1852
1853 // Append ranging header raw data
1854 std::vector<uint8_t> ranging_header_raw = {};
1855 BitInserter bi(ranging_header_raw);
1856 data_list.back().ranging_header_.Serialize(bi);
1857 append_vector(data_list.back().ras_raw_data_, ranging_header_raw);
1858
1859 if (data_list.size() > kProcedureDataBufferSize) {
1860 log::warn("buffer full, drop procedure data with counter: {}", data_list.front().counter);
1861 data_list.erase(data_list.begin());
1862 }
1863 return &data_list.back();
1864 }
1865
get_procedure_databluetooth::hci::DistanceMeasurementManager::impl1866 CsProcedureData* get_procedure_data(CsTracker* live_tracker, uint16_t counter) {
1867 std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list;
1868 CsProcedureData* procedure_data = nullptr;
1869 for (uint8_t i = 0; i < data_list.size(); i++) {
1870 if (data_list[i].counter == counter) {
1871 procedure_data = &data_list[i];
1872 break;
1873 }
1874 }
1875 if (procedure_data == nullptr) {
1876 log::warn("Can't find data for counter: {}", counter);
1877 }
1878 return procedure_data;
1879 }
1880
get_procedure_data_for_rasbluetooth::hci::DistanceMeasurementManager::impl1881 CsProcedureData* get_procedure_data_for_ras(uint16_t connection_handle,
1882 uint16_t ranging_counter) {
1883 std::vector<CsProcedureData>& data_list =
1884 cs_requester_trackers_[connection_handle].procedure_data_list;
1885 CsProcedureData* procedure_data = nullptr;
1886 for (auto& i : data_list) {
1887 if ((i.counter & kRangingCounterMask) == ranging_counter) {
1888 procedure_data = &i;
1889 break;
1890 }
1891 }
1892 if (procedure_data == nullptr) {
1893 log::warn("Can't find data for connection_handle:{}, ranging_counter: {}", connection_handle,
1894 ranging_counter);
1895 }
1896 return procedure_data;
1897 }
1898
check_cs_procedure_completebluetooth::hci::DistanceMeasurementManager::impl1899 void check_cs_procedure_complete(CsTracker* live_tracker, CsProcedureData* procedure_data,
1900 uint16_t connection_handle) const {
1901 if (live_tracker->local_start &&
1902 procedure_data->local_status == CsProcedureDoneStatus::ALL_RESULTS_COMPLETE &&
1903 procedure_data->remote_status == CsProcedureDoneStatus::ALL_RESULTS_COMPLETE &&
1904 procedure_data->contains_complete_subevent_) {
1905 log::debug("Procedure complete counter:{} data size:{}, main_mode_type:{}, sub_mode_type:{}",
1906 (uint16_t)procedure_data->counter, (uint16_t)procedure_data->step_channel.size(),
1907 (uint16_t)live_tracker->main_mode_type, (uint16_t)live_tracker->sub_mode_type);
1908
1909 if (ranging_hal_->IsBound()) {
1910 if (is_hal_v2()) {
1911 ranging_hal_->WriteProcedureData(connection_handle, live_tracker->role,
1912 procedure_data->procedure_data_v2_,
1913 procedure_data->counter);
1914 } else {
1915 // Use algorithm in the HAL
1916 bluetooth::hal::ChannelSoundingRawData raw_data;
1917 raw_data.num_antenna_paths_ = procedure_data->num_antenna_paths;
1918 raw_data.step_channel_ = procedure_data->step_channel;
1919 raw_data.tone_pct_initiator_ = procedure_data->tone_pct_initiator;
1920 raw_data.tone_quality_indicator_initiator_ =
1921 procedure_data->tone_quality_indicator_initiator;
1922 raw_data.tone_pct_reflector_ = procedure_data->tone_pct_reflector;
1923 raw_data.tone_quality_indicator_reflector_ =
1924 procedure_data->tone_quality_indicator_reflector;
1925 raw_data.toa_tod_initiators_ = procedure_data->toa_tod_initiators;
1926 raw_data.tod_toa_reflectors_ = procedure_data->tod_toa_reflectors;
1927 raw_data.packet_quality_initiator = procedure_data->packet_quality_initiator;
1928 raw_data.packet_quality_reflector = procedure_data->packet_quality_reflector;
1929 ranging_hal_->WriteRawData(connection_handle, raw_data);
1930 }
1931 }
1932 }
1933
1934 // If the procedure is completed or aborted, delete all previous data
1935 if (procedure_data->local_status != CsProcedureDoneStatus::PARTIAL_RESULTS &&
1936 procedure_data->remote_status != CsProcedureDoneStatus::PARTIAL_RESULTS) {
1937 delete_consumed_procedure_data(live_tracker, procedure_data->counter);
1938 }
1939 }
1940
delete_consumed_procedure_databluetooth::hci::DistanceMeasurementManager::impl1941 static void delete_consumed_procedure_data(CsTracker* live_tracker, uint16_t current_counter) {
1942 std::vector<CsProcedureData>& data_list = live_tracker->procedure_data_list;
1943 while (data_list.begin()->counter < current_counter) {
1944 log::debug("Delete obsolete procedure data, counter:{}", data_list.begin()->counter);
1945 data_list.erase(data_list.begin());
1946 }
1947 }
1948
parse_cs_result_databluetooth::hci::DistanceMeasurementManager::impl1949 void parse_cs_result_data(const std::vector<LeCsResultDataStructure>& result_data_structures,
1950 CsProcedureData& procedure_data, CsRole role) {
1951 std::shared_ptr<hal::SubeventResult> local_subevent_data = nullptr;
1952 if (is_hal_v2()) {
1953 if (!procedure_data.procedure_data_v2_.local_subevent_data_.empty()) {
1954 local_subevent_data = procedure_data.procedure_data_v2_.local_subevent_data_.back();
1955 } else {
1956 log::error("no subevent data is available to attach");
1957 }
1958 }
1959 uint8_t num_antenna_paths = procedure_data.num_antenna_paths;
1960 auto& ras_data = procedure_data.ras_subevent_data_;
1961 for (auto& result_data_structure : result_data_structures) {
1962 uint8_t mode = result_data_structure.step_mode_;
1963 uint8_t step_channel = result_data_structure.step_channel_;
1964 uint16_t data_length = result_data_structure.step_data_.size();
1965 log::verbose("mode: {}, channel: {}, data_length: {}", mode, step_channel,
1966 (uint16_t)result_data_structure.step_data_.size());
1967 ras_data.emplace_back(mode);
1968 if (data_length == 0) {
1969 ras_data.back() |= (1 << 7); // set step aborted
1970 continue;
1971 }
1972 append_vector(ras_data, result_data_structure.step_data_);
1973
1974 // Parse data into structs from an iterator
1975 auto bytes = std::make_shared<std::vector<uint8_t>>();
1976 if (mode == 0x02 || mode == 0x03) {
1977 // Add one byte for the length of Tone_PCT[k], Tone_Quality_Indicator[k]
1978 bytes->emplace_back(num_antenna_paths + 1);
1979 }
1980 bytes->reserve(bytes->size() + result_data_structure.step_data_.size());
1981 bytes->insert(bytes->end(), result_data_structure.step_data_.begin(),
1982 result_data_structure.step_data_.end());
1983 Iterator<packet::kLittleEndian> iterator(bytes);
1984 switch (mode) {
1985 case 0: {
1986 if (role == CsRole::INITIATOR) {
1987 LeCsMode0InitatorData tone_data_view;
1988 auto after = LeCsMode0InitatorData::Parse(&tone_data_view, iterator);
1989 if (after == iterator) {
1990 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
1991 print_raw_data(result_data_structure.step_data_);
1992 continue;
1993 }
1994 log::verbose("step_data: {}", tone_data_view.ToString());
1995 procedure_data.measured_freq_offset.push_back(tone_data_view.measured_freq_offset_);
1996 if (is_hal_v2()) {
1997 local_subevent_data->step_data_.emplace_back(step_channel, mode,
1998 hal::Mode0Data(tone_data_view));
1999 }
2000 } else {
2001 LeCsMode0ReflectorData tone_data_view;
2002 auto after = LeCsMode0ReflectorData::Parse(&tone_data_view, iterator);
2003 if (after == iterator) {
2004 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2005 print_raw_data(result_data_structure.step_data_);
2006 continue;
2007 }
2008 log::verbose("step_data: {}", tone_data_view.ToString());
2009 if (is_hal_v2()) {
2010 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2011 hal::Mode0Data(tone_data_view));
2012 }
2013 }
2014 } break;
2015 case 1: {
2016 if (role == CsRole::INITIATOR) {
2017 if (procedure_data.contains_sounding_sequence_local_) {
2018 LeCsMode1InitatorDataWithPacketPct tone_data_view;
2019 auto after = LeCsMode1InitatorDataWithPacketPct::Parse(&tone_data_view, iterator);
2020 if (after == iterator) {
2021 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2022 print_raw_data(result_data_structure.step_data_);
2023 continue;
2024 }
2025 log::verbose("step_data: {}", tone_data_view.ToString());
2026 procedure_data.rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
2027 procedure_data.toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
2028 procedure_data.packet_quality_initiator.emplace_back(tone_data_view.packet_quality_);
2029 if (is_hal_v2() && local_subevent_data) {
2030 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2031 hal::Mode1Data(tone_data_view));
2032 }
2033 } else {
2034 LeCsMode1InitatorData tone_data_view;
2035 auto after = LeCsMode1InitatorData::Parse(&tone_data_view, iterator);
2036 if (after == iterator) {
2037 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2038 print_raw_data(result_data_structure.step_data_);
2039 continue;
2040 }
2041 log::verbose("step_data: {}", tone_data_view.ToString());
2042 procedure_data.rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
2043 procedure_data.toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
2044 procedure_data.packet_quality_initiator.emplace_back(tone_data_view.packet_quality_);
2045 if (is_hal_v2() && local_subevent_data) {
2046 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2047 hal::Mode1Data(tone_data_view));
2048 }
2049 }
2050 procedure_data.step_channel.push_back(step_channel);
2051 } else {
2052 if (procedure_data.contains_sounding_sequence_local_) {
2053 LeCsMode1ReflectorDataWithPacketPct tone_data_view;
2054 auto after = LeCsMode1ReflectorDataWithPacketPct::Parse(&tone_data_view, iterator);
2055 if (after == iterator) {
2056 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2057 print_raw_data(result_data_structure.step_data_);
2058 continue;
2059 }
2060 log::verbose("step_data: {}", tone_data_view.ToString());
2061 procedure_data.rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
2062 procedure_data.tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
2063 procedure_data.packet_quality_reflector.emplace_back(tone_data_view.packet_quality_);
2064 if (is_hal_v2() && local_subevent_data) {
2065 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2066 hal::Mode1Data(tone_data_view));
2067 }
2068 } else {
2069 LeCsMode1ReflectorData tone_data_view;
2070 auto after = LeCsMode1ReflectorData::Parse(&tone_data_view, iterator);
2071 if (after == iterator) {
2072 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2073 print_raw_data(result_data_structure.step_data_);
2074 continue;
2075 }
2076 log::verbose("step_data: {}", tone_data_view.ToString());
2077 procedure_data.rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
2078 procedure_data.tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
2079 procedure_data.packet_quality_reflector.emplace_back(tone_data_view.packet_quality_);
2080 if (is_hal_v2() && local_subevent_data) {
2081 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2082 hal::Mode1Data(tone_data_view));
2083 }
2084 }
2085 }
2086 } break;
2087 case 2: {
2088 LeCsMode2Data tone_data_view;
2089 auto after = LeCsMode2Data::Parse(&tone_data_view, iterator);
2090 if (after == iterator) {
2091 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2092 print_raw_data(result_data_structure.step_data_);
2093 continue;
2094 }
2095 if (is_hal_v2() && local_subevent_data) {
2096 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2097 hal::Mode2Data(tone_data_view));
2098 }
2099 log::verbose("step_data: {}", tone_data_view.ToString());
2100 if (role == CsRole::INITIATOR) {
2101 procedure_data.step_channel.push_back(step_channel);
2102 }
2103 auto tone_data = tone_data_view.tone_data_;
2104 uint8_t permutation_index = tone_data_view.antenna_permutation_index_;
2105 // Parse in ascending order of antenna position with tone extension data at the end
2106 uint16_t num_tone_data = num_antenna_paths + 1;
2107 for (uint16_t k = 0; k < num_tone_data; k++) {
2108 uint8_t antenna_path =
2109 k == num_antenna_paths
2110 ? num_antenna_paths
2111 : cs_antenna_permutation_array_[permutation_index][k] - 1;
2112 double i_value = get_iq_value(tone_data[k].i_sample_);
2113 double q_value = get_iq_value(tone_data[k].q_sample_);
2114 uint8_t tone_quality_indicator = tone_data[k].tone_quality_indicator_;
2115 log::verbose("antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value,
2116 q_value);
2117 if (role == CsRole::INITIATOR) {
2118 procedure_data.tone_pct_initiator[antenna_path].emplace_back(i_value, q_value);
2119 procedure_data.tone_quality_indicator_initiator[antenna_path].emplace_back(
2120 tone_quality_indicator);
2121 } else {
2122 procedure_data.tone_pct_reflector[antenna_path].emplace_back(i_value, q_value);
2123 procedure_data.tone_quality_indicator_reflector[antenna_path].emplace_back(
2124 tone_quality_indicator);
2125 }
2126 }
2127 } break;
2128 case 3: {
2129 uint8_t permutation_index = 0;
2130 std::vector<LeCsToneDataWithQuality> view_tone_data = {};
2131 if (role == CsRole::INITIATOR) {
2132 if (procedure_data.contains_sounding_sequence_local_) {
2133 LeCsMode3InitatorDataWithPacketPct tone_data_view;
2134 auto after = LeCsMode3InitatorDataWithPacketPct::Parse(&tone_data_view, iterator);
2135 if (after == iterator) {
2136 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2137 print_raw_data(result_data_structure.step_data_);
2138 continue;
2139 }
2140 if (is_hal_v2() && local_subevent_data) {
2141 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2142 hal::Mode3Data(tone_data_view));
2143 }
2144 log::verbose("step_data: {}", tone_data_view.ToString());
2145 permutation_index = tone_data_view.antenna_permutation_index_;
2146 procedure_data.rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
2147 procedure_data.toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
2148 procedure_data.packet_quality_initiator.emplace_back(tone_data_view.packet_quality_);
2149 auto tone_data = tone_data_view.tone_data_;
2150 view_tone_data.reserve(tone_data.size());
2151 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
2152 } else {
2153 LeCsMode3InitatorData tone_data_view;
2154 auto after = LeCsMode3InitatorData::Parse(&tone_data_view, iterator);
2155 if (after == iterator) {
2156 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2157 print_raw_data(result_data_structure.step_data_);
2158 continue;
2159 }
2160 if (is_hal_v2() && local_subevent_data) {
2161 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2162 hal::Mode3Data(tone_data_view));
2163 }
2164 log::verbose("step_data: {}", tone_data_view.ToString());
2165 permutation_index = tone_data_view.antenna_permutation_index_;
2166 procedure_data.rssi_initiator.emplace_back(tone_data_view.packet_rssi_);
2167 procedure_data.toa_tod_initiators.emplace_back(tone_data_view.toa_tod_initiator_);
2168 procedure_data.packet_quality_initiator.emplace_back(tone_data_view.packet_quality_);
2169 auto tone_data = tone_data_view.tone_data_;
2170 view_tone_data.reserve(tone_data.size());
2171 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
2172 }
2173 procedure_data.step_channel.push_back(step_channel);
2174 } else {
2175 if (procedure_data.contains_sounding_sequence_local_) {
2176 LeCsMode3ReflectorDataWithPacketPct tone_data_view;
2177 auto after = LeCsMode3ReflectorDataWithPacketPct::Parse(&tone_data_view, iterator);
2178 if (after == iterator) {
2179 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2180 print_raw_data(result_data_structure.step_data_);
2181 continue;
2182 }
2183 if (is_hal_v2() && local_subevent_data) {
2184 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2185 hal::Mode3Data(tone_data_view));
2186 }
2187 log::verbose("step_data: {}", tone_data_view.ToString());
2188 permutation_index = tone_data_view.antenna_permutation_index_;
2189 procedure_data.rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
2190 procedure_data.tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
2191 procedure_data.packet_quality_reflector.emplace_back(tone_data_view.packet_quality_);
2192 auto tone_data = tone_data_view.tone_data_;
2193 view_tone_data.reserve(tone_data.size());
2194 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
2195 } else {
2196 LeCsMode3ReflectorData tone_data_view;
2197 auto after = LeCsMode3ReflectorData::Parse(&tone_data_view, iterator);
2198 if (after == iterator) {
2199 log::warn("Received invalid mode {} data, role:{}", mode, CsRoleText(role));
2200 print_raw_data(result_data_structure.step_data_);
2201 continue;
2202 }
2203 if (is_hal_v2() && local_subevent_data) {
2204 local_subevent_data->step_data_.emplace_back(step_channel, mode,
2205 hal::Mode3Data(tone_data_view));
2206 }
2207 log::verbose("step_data: {}", tone_data_view.ToString());
2208 permutation_index = tone_data_view.antenna_permutation_index_;
2209 procedure_data.rssi_reflector.emplace_back(tone_data_view.packet_rssi_);
2210 procedure_data.tod_toa_reflectors.emplace_back(tone_data_view.tod_toa_reflector_);
2211 procedure_data.packet_quality_reflector.emplace_back(tone_data_view.packet_quality_);
2212 auto tone_data = tone_data_view.tone_data_;
2213 view_tone_data.reserve(tone_data.size());
2214 view_tone_data.insert(view_tone_data.end(), tone_data.begin(), tone_data.end());
2215 }
2216 }
2217 // Parse in ascending order of antenna position with tone extension data at the end
2218 uint16_t num_tone_data = num_antenna_paths + 1;
2219 for (uint16_t k = 0; k < num_tone_data; k++) {
2220 uint8_t antenna_path =
2221 k == num_antenna_paths
2222 ? num_antenna_paths
2223 : cs_antenna_permutation_array_[permutation_index][k] - 1;
2224 double i_value = get_iq_value(view_tone_data[k].i_sample_);
2225 double q_value = get_iq_value(view_tone_data[k].q_sample_);
2226 uint8_t tone_quality_indicator = view_tone_data[k].tone_quality_indicator_;
2227 log::verbose("antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value,
2228 q_value);
2229 if (role == CsRole::INITIATOR) {
2230 procedure_data.tone_pct_initiator[antenna_path].emplace_back(i_value, q_value);
2231 procedure_data.tone_quality_indicator_initiator[antenna_path].emplace_back(
2232 tone_quality_indicator);
2233 } else {
2234 procedure_data.tone_pct_reflector[antenna_path].emplace_back(i_value, q_value);
2235 procedure_data.tone_quality_indicator_reflector[antenna_path].emplace_back(
2236 tone_quality_indicator);
2237 }
2238 }
2239 } break;
2240 default: {
2241 log::warn("Invalid mode {}", mode);
2242 }
2243 }
2244 }
2245 }
2246
get_iq_valuebluetooth::hci::DistanceMeasurementManager::impl2247 double get_iq_value(uint16_t sample) {
2248 int16_t signed_sample = hal::ConvertToSigned<12>(sample);
2249 double value = 1.0 * signed_sample / 2048;
2250 return value;
2251 }
2252
print_raw_databluetooth::hci::DistanceMeasurementManager::impl2253 void print_raw_data(std::vector<uint8_t> raw_data) {
2254 std::string raw_data_str = "";
2255 auto for_end = raw_data.size() - 1;
2256 for (size_t i = 0; i < for_end; i++) {
2257 char buff[10];
2258 snprintf(buff, sizeof(buff), "%02x ", (uint8_t)raw_data[i]);
2259 std::string buffAsStdStr = buff;
2260 raw_data_str.append(buffAsStdStr);
2261 if (i % 100 == 0 && i != 0) {
2262 log::verbose("{}", raw_data_str);
2263 raw_data_str = "";
2264 }
2265 }
2266 char buff[10];
2267 snprintf(buff, sizeof(buff), "%02x", (uint8_t)raw_data[for_end]);
2268 std::string buffAsStdStr = buff;
2269 raw_data_str.append(buffAsStdStr);
2270 log::verbose("{}", raw_data_str);
2271 }
2272
on_read_remote_transmit_power_level_statusbluetooth::hci::DistanceMeasurementManager::impl2273 void on_read_remote_transmit_power_level_status(Address address, CommandStatusView view) {
2274 auto status_view = LeReadRemoteTransmitPowerLevelStatusView::Create(view);
2275 if (!status_view.IsValid()) {
2276 log::warn("Invalid LeReadRemoteTransmitPowerLevelStatus event");
2277 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
2278 METHOD_RSSI);
2279 rssi_trackers.erase(address);
2280 } else if (status_view.GetStatus() != ErrorCode::SUCCESS) {
2281 std::string error_code = ErrorCodeText(status_view.GetStatus());
2282 log::warn("Received LeReadRemoteTransmitPowerLevelStatus with error code {}", error_code);
2283 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
2284 METHOD_RSSI);
2285 rssi_trackers.erase(address);
2286 }
2287 }
2288
on_transmit_power_reportingbluetooth::hci::DistanceMeasurementManager::impl2289 void on_transmit_power_reporting(LeMetaEventView event) {
2290 auto event_view = LeTransmitPowerReportingView::Create(event);
2291 if (!event_view.IsValid()) {
2292 log::warn("Dropping invalid LeTransmitPowerReporting event");
2293 return;
2294 }
2295
2296 if (event_view.GetReason() == ReportingReason::LOCAL_TRANSMIT_POWER_CHANGED) {
2297 log::warn("Dropping local LeTransmitPowerReporting event");
2298 return;
2299 }
2300
2301 Address address = Address::kEmpty;
2302 for (auto& rssi_tracker : rssi_trackers) {
2303 if (rssi_tracker.second.handle == event_view.GetConnectionHandle()) {
2304 address = rssi_tracker.first;
2305 }
2306 }
2307
2308 if (address.IsEmpty()) {
2309 log::warn("Can't find rssi tracker for connection {}", event_view.GetConnectionHandle());
2310 return;
2311 }
2312
2313 auto status = event_view.GetStatus();
2314 if (status != ErrorCode::SUCCESS) {
2315 log::warn("Received LeTransmitPowerReporting with error code {}", ErrorCodeText(status));
2316 } else {
2317 rssi_trackers[address].remote_tx_power = event_view.GetTransmitPowerLevel();
2318 }
2319
2320 if (event_view.GetReason() == ReportingReason::READ_COMMAND_COMPLETE &&
2321 !rssi_trackers[address].started) {
2322 if (status == ErrorCode::SUCCESS) {
2323 hci_layer_->EnqueueCommand(
2324 LeSetTransmitPowerReportingEnableBuilder::Create(event_view.GetConnectionHandle(),
2325 0x00, 0x01),
2326 handler_->BindOnceOn(this, &impl::on_set_transmit_power_reporting_enable_complete,
2327 address, event_view.GetConnectionHandle()));
2328 } else {
2329 log::warn("Read remote transmit power level fail");
2330 distance_measurement_callbacks_->OnDistanceMeasurementStopped(
2331 address, REASON_INTERNAL_ERROR, METHOD_RSSI);
2332 rssi_trackers.erase(address);
2333 }
2334 }
2335 }
2336
on_set_transmit_power_reporting_enable_completebluetooth::hci::DistanceMeasurementManager::impl2337 void on_set_transmit_power_reporting_enable_complete(Address address, uint16_t connection_handle,
2338 CommandCompleteView view) {
2339 auto complete_view = LeSetTransmitPowerReportingEnableCompleteView::Create(view);
2340 if (!complete_view.IsValid()) {
2341 log::warn("Invalid LeSetTransmitPowerReportingEnableComplete event");
2342 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
2343 METHOD_RSSI);
2344 rssi_trackers.erase(address);
2345 return;
2346 } else if (complete_view.GetStatus() != ErrorCode::SUCCESS) {
2347 std::string error_code = ErrorCodeText(complete_view.GetStatus());
2348 log::warn("Received LeSetTransmitPowerReportingEnableComplete with error code {}",
2349 error_code);
2350 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
2351 METHOD_RSSI);
2352 rssi_trackers.erase(address);
2353 return;
2354 }
2355
2356 if (rssi_trackers.find(address) == rssi_trackers.end()) {
2357 log::warn("Can't find rssi tracker for {}", address);
2358 distance_measurement_callbacks_->OnDistanceMeasurementStopped(address, REASON_INTERNAL_ERROR,
2359 METHOD_RSSI);
2360 rssi_trackers.erase(address);
2361 } else {
2362 log::info("Track rssi for address {}", address);
2363 rssi_trackers[address].started = true;
2364 distance_measurement_callbacks_->OnDistanceMeasurementStarted(address, METHOD_RSSI);
2365 rssi_trackers[address].repeating_alarm->Schedule(
2366 common::Bind(&impl::send_read_rssi, common::Unretained(this), address,
2367 connection_handle),
2368 std::chrono::milliseconds(rssi_trackers[address].interval_ms));
2369 }
2370 }
2371
on_read_rssi_completebluetooth::hci::DistanceMeasurementManager::impl2372 void on_read_rssi_complete(Address address, CommandCompleteView view) {
2373 auto complete_view = ReadRssiCompleteView::Create(view);
2374 if (!complete_view.IsValid()) {
2375 log::warn("Dropping invalid read RSSI complete event");
2376 return;
2377 }
2378 if (rssi_trackers.find(address) == rssi_trackers.end()) {
2379 log::warn("Can't find rssi tracker for {}", address);
2380 return;
2381 }
2382 double remote_tx_power = (int8_t)rssi_trackers[address].remote_tx_power;
2383 int8_t rssi = complete_view.GetRssi();
2384 double pow_value = (remote_tx_power - rssi - kRSSIDropOffAt1M) / 20.0;
2385 double distance = pow(10.0, pow_value);
2386
2387 using namespace std::chrono;
2388 uint64_t elapsedRealtimeNanos =
2389 duration_cast<nanoseconds>(steady_clock::now().time_since_epoch()).count();
2390 distance_measurement_callbacks_->OnDistanceMeasurementResult(
2391 address, distance * 100, distance * 100, -1, -1, -1, -1, elapsedRealtimeNanos, -1,
2392 DistanceMeasurementMethod::METHOD_RSSI);
2393 }
2394
builder_to_bytesbluetooth::hci::DistanceMeasurementManager::impl2395 std::vector<uint8_t> builder_to_bytes(std::unique_ptr<PacketBuilder<true>> builder) {
2396 std::shared_ptr<std::vector<uint8_t>> bytes = std::make_shared<std::vector<uint8_t>>();
2397 BitInserter bi(*bytes);
2398 builder->Serialize(bi);
2399 return *bytes;
2400 }
2401
append_vectorbluetooth::hci::DistanceMeasurementManager::impl2402 void append_vector(std::vector<uint8_t>& v1, const std::vector<uint8_t>& v2) {
2403 v1.reserve(v2.size());
2404 v1.insert(v1.end(), v2.begin(), v2.end());
2405 }
2406
2407 os::Handler* handler_;
2408 hal::RangingHal* ranging_hal_;
2409 hci::Controller* controller_;
2410 hci::HciLayer* hci_layer_;
2411 hci::AclManager* acl_manager_;
2412 hci::DistanceMeasurementInterface* distance_measurement_interface_;
2413 std::unordered_map<Address, RSSITracker> rssi_trackers;
2414 std::unordered_map<uint16_t, CsTracker> cs_requester_trackers_;
2415 std::unordered_map<uint16_t, CsTracker> cs_responder_trackers_;
2416 DistanceMeasurementCallbacks* distance_measurement_callbacks_;
2417 CsOptionalSubfeaturesSupported cs_subfeature_supported_;
2418 uint8_t num_antennas_supported_ = 0x01;
2419 bool local_support_phase_based_ranging_ = false;
2420 uint8_t local_supported_sw_time_ = 0;
2421 bool is_local_cs_ready_ = false;
2422 // A table that maps num_antennas_supported and remote_num_antennas_supported to Antenna
2423 // Configuration Index.
2424 uint8_t cs_tone_antenna_config_mapping_table_[4][4] = {
2425 {0, 4, 5, 6}, {1, 7, 7, 7}, {2, 7, 7, 7}, {3, 7, 7, 7}};
2426 // A table that maps Antenna Configuration Index to Preferred Peer Antenna.
2427 uint8_t cs_preferred_peer_antenna_mapping_table_[8] = {1, 1, 1, 1, 3, 7, 15, 3};
2428 // Antenna path permutations. See Channel Sounding CR_PR for the details.
2429 uint8_t cs_antenna_permutation_array_[24][4] = {
2430 {1, 2, 3, 4}, {2, 1, 3, 4}, {1, 3, 2, 4}, {3, 1, 2, 4}, {3, 2, 1, 4}, {2, 3, 1, 4},
2431 {1, 2, 4, 3}, {2, 1, 4, 3}, {1, 4, 2, 3}, {4, 1, 2, 3}, {4, 2, 1, 3}, {2, 4, 1, 3},
2432 {1, 4, 3, 2}, {4, 1, 3, 2}, {1, 3, 4, 2}, {3, 1, 4, 2}, {3, 4, 1, 2}, {4, 3, 1, 2},
2433 {4, 2, 3, 1}, {2, 4, 3, 1}, {4, 3, 2, 1}, {3, 4, 2, 1}, {3, 2, 4, 1}, {2, 3, 4, 1}};
2434 };
2435
DistanceMeasurementManager()2436 DistanceMeasurementManager::DistanceMeasurementManager() { pimpl_ = std::make_unique<impl>(); }
2437
2438 DistanceMeasurementManager::~DistanceMeasurementManager() = default;
2439
ListDependencies(ModuleList * list) const2440 void DistanceMeasurementManager::ListDependencies(ModuleList* list) const {
2441 list->add<hal::RangingHal>();
2442 list->add<hci::Controller>();
2443 list->add<hci::HciLayer>();
2444 list->add<hci::AclManager>();
2445 }
2446
Start()2447 void DistanceMeasurementManager::Start() {
2448 pimpl_->start(GetHandler(), GetDependency<hci::Controller>(), GetDependency<hal::RangingHal>(),
2449 GetDependency<hci::HciLayer>(), GetDependency<AclManager>());
2450 }
2451
Stop()2452 void DistanceMeasurementManager::Stop() { pimpl_->stop(); }
2453
ToString() const2454 std::string DistanceMeasurementManager::ToString() const { return "Distance Measurement Manager"; }
2455
RegisterDistanceMeasurementCallbacks(DistanceMeasurementCallbacks * callbacks)2456 void DistanceMeasurementManager::RegisterDistanceMeasurementCallbacks(
2457 DistanceMeasurementCallbacks* callbacks) {
2458 CallOn(pimpl_.get(), &impl::register_distance_measurement_callbacks, callbacks);
2459 }
2460
StartDistanceMeasurement(const Address & address,uint16_t connection_handle,hci::Role local_hci_role,uint16_t interval,DistanceMeasurementMethod method)2461 void DistanceMeasurementManager::StartDistanceMeasurement(const Address& address,
2462 uint16_t connection_handle,
2463 hci::Role local_hci_role,
2464 uint16_t interval,
2465 DistanceMeasurementMethod method) {
2466 CallOn(pimpl_.get(), &impl::start_distance_measurement, address, connection_handle,
2467 local_hci_role, interval, method);
2468 }
2469
StopDistanceMeasurement(const Address & address,uint16_t connection_handle,DistanceMeasurementMethod method)2470 void DistanceMeasurementManager::StopDistanceMeasurement(const Address& address,
2471 uint16_t connection_handle,
2472 DistanceMeasurementMethod method) {
2473 CallOn(pimpl_.get(), &impl::stop_distance_measurement, address, connection_handle, method);
2474 }
2475
HandleRasClientConnectedEvent(const Address & address,uint16_t connection_handle,uint16_t att_handle,const std::vector<hal::VendorSpecificCharacteristic> & vendor_specific_data,uint16_t conn_interval)2476 void DistanceMeasurementManager::HandleRasClientConnectedEvent(
2477 const Address& address, uint16_t connection_handle, uint16_t att_handle,
2478 const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_data,
2479 uint16_t conn_interval) {
2480 CallOn(pimpl_.get(), &impl::handle_ras_client_connected_event, address, connection_handle,
2481 att_handle, vendor_specific_data, conn_interval);
2482 }
2483
HandleConnIntervalUpdated(const Address & address,uint16_t connection_handle,uint16_t conn_interval)2484 void DistanceMeasurementManager::HandleConnIntervalUpdated(const Address& address,
2485 uint16_t connection_handle,
2486 uint16_t conn_interval) {
2487 CallOn(pimpl_.get(), &impl::handle_conn_interval_updated, address, connection_handle,
2488 conn_interval);
2489 }
2490
HandleRasClientDisconnectedEvent(const Address & address)2491 void DistanceMeasurementManager::HandleRasClientDisconnectedEvent(const Address& address) {
2492 CallOn(pimpl_.get(), &impl::handle_ras_client_disconnected_event, address);
2493 }
2494
HandleVendorSpecificReply(const Address & address,uint16_t connection_handle,const std::vector<hal::VendorSpecificCharacteristic> & vendor_specific_reply)2495 void DistanceMeasurementManager::HandleVendorSpecificReply(
2496 const Address& address, uint16_t connection_handle,
2497 const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply) {
2498 CallOn(pimpl_.get(), &impl::handle_ras_server_vendor_specific_reply, address, connection_handle,
2499 vendor_specific_reply);
2500 }
2501
HandleRasServerConnected(const Address & identity_address,uint16_t connection_handle,hci::Role local_hci_role)2502 void DistanceMeasurementManager::HandleRasServerConnected(const Address& identity_address,
2503 uint16_t connection_handle,
2504 hci::Role local_hci_role) {
2505 CallOn(pimpl_.get(), &impl::handle_ras_server_connected, identity_address, connection_handle,
2506 local_hci_role);
2507 }
2508
HandleRasServerDisconnected(const bluetooth::hci::Address & identity_address,uint16_t connection_handle)2509 void DistanceMeasurementManager::HandleRasServerDisconnected(
2510 const bluetooth::hci::Address& identity_address, uint16_t connection_handle) {
2511 CallOn(pimpl_.get(), &impl::handle_ras_server_disconnected, identity_address, connection_handle);
2512 }
2513
HandleVendorSpecificReplyComplete(const Address & address,uint16_t connection_handle,bool success)2514 void DistanceMeasurementManager::HandleVendorSpecificReplyComplete(const Address& address,
2515 uint16_t connection_handle,
2516 bool success) {
2517 CallOn(pimpl_.get(), &impl::handle_vendor_specific_reply_complete, address, connection_handle,
2518 success);
2519 }
2520
HandleRemoteData(const Address & address,uint16_t connection_handle,const std::vector<uint8_t> & raw_data)2521 void DistanceMeasurementManager::HandleRemoteData(const Address& address,
2522 uint16_t connection_handle,
2523 const std::vector<uint8_t>& raw_data) {
2524 CallOn(pimpl_.get(), &impl::handle_remote_data, address, connection_handle, raw_data);
2525 }
2526
HandleRemoteDataTimeout(const Address & address,uint16_t connection_handle)2527 void DistanceMeasurementManager::HandleRemoteDataTimeout(const Address& address,
2528 uint16_t connection_handle) {
2529 CallOn(pimpl_.get(), &impl::handle_remote_data_timeout, address, connection_handle);
2530 }
2531
2532 } // namespace hci
2533 } // namespace bluetooth
2534