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