Loading system/bta/include/bta_ras_api.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,8 @@ RasServer* GetRasServer(); class RasClientCallbacks { class RasClientCallbacks { public: public: virtual ~RasClientCallbacks() = default; virtual ~RasClientCallbacks() = default; virtual void OnRemoteData(RawAddress address, std::vector<uint8_t> data) = 0; virtual void OnRemoteData(const RawAddress& address, const std::vector<uint8_t>& data) = 0; }; }; class RasClient { class RasClient { Loading system/bta/ras/ras_client.cc +15 −6 Original line number Original line Diff line number Diff line Loading @@ -187,11 +187,7 @@ class RasClientImpl : public bluetooth::ras::RasClient { }, }, nullptr); nullptr); // Subscribe Characteristics SubscribeCharacteristic(tracker, kRasOnDemandDataCharacteristic); SubscribeCharacteristic(tracker, kRasControlPointCharacteristic); SubscribeCharacteristic(tracker, kRasControlPointCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataReadyCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataOverWrittenCharacteristic); } } void OnGattNotification(const tBTA_GATTC_NOTIFY& evt) { void OnGattNotification(const tBTA_GATTC_NOTIFY& evt) { Loading @@ -211,8 +207,9 @@ class RasClientImpl : public bluetooth::ras::RasClient { getUuidName(characteristic->uuid), evt.len); getUuidName(characteristic->uuid), evt.len); switch (uuid_16bit) { switch (uuid_16bit) { case kRasRealTimeRangingDataCharacteristic16bit: case kRasOnDemandDataCharacteristic16bit: { case kRasOnDemandDataCharacteristic16bit: { OnDemandData(evt, tracker); OnRemoteData(evt, tracker); break; break; } } case kRasControlPointCharacteristic16bit: { case kRasControlPointCharacteristic16bit: { Loading @@ -226,7 +223,7 @@ class RasClientImpl : public bluetooth::ras::RasClient { } } } } void OnDemandData(const tBTA_GATTC_NOTIFY& evt, void OnRemoteData(const tBTA_GATTC_NOTIFY& evt, std::shared_ptr<RasTracker> tracker) { std::shared_ptr<RasTracker> tracker) { std::vector<uint8_t> data; std::vector<uint8_t> data; data.resize(evt.len); data.resize(evt.len); Loading Loading @@ -446,6 +443,18 @@ class RasClientImpl : public bluetooth::ras::RasClient { STREAM_TO_UINT32(tracker->remote_supported_features_, value); STREAM_TO_UINT32(tracker->remote_supported_features_, value); log::info("Remote supported features : {}", log::info("Remote supported features : {}", getFeaturesString(tracker->remote_supported_features_)); getFeaturesString(tracker->remote_supported_features_)); if (tracker->remote_supported_features_ & feature::kRealTimeRangingData) { log::info("Subscribe Real-time Ranging Data"); SubscribeCharacteristic(tracker, kRasRealTimeRangingDataCharacteristic); } else { log::info("Subscribe On-demand Ranging Data"); SubscribeCharacteristic(tracker, kRasOnDemandDataCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataReadyCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataOverWrittenCharacteristic); } } break; } break; default: default: log::warn("Unexpected UUID"); log::warn("Unexpected UUID"); Loading system/bta/ras/ras_server.cc +41 −25 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ namespace { class RasServerImpl; class RasServerImpl; RasServerImpl* instance; RasServerImpl* instance; static constexpr uint32_t kSupportedFeatures = 0; static constexpr uint32_t kSupportedFeatures = feature::kRealTimeRangingData; static constexpr uint16_t kBufferSize = 3; static constexpr uint16_t kBufferSize = 3; class RasServerImpl : public bluetooth::ras::RasServer { class RasServerImpl : public bluetooth::ras::RasServer { Loading Loading @@ -75,7 +75,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { void PushProcedureData(RawAddress address, uint16_t procedure_counter, void PushProcedureData(RawAddress address, uint16_t procedure_counter, bool is_last, std::vector<uint8_t> data) { bool is_last, std::vector<uint8_t> data) { log::info("{}, counter:{}, is_last:{}, with size {}", address, log::debug("{}, counter:{}, is_last:{}, with size {}", address, procedure_counter, is_last, data.size()); procedure_counter, is_last, data.size()); tBLE_BD_ADDR ble_bd_addr; tBLE_BD_ADDR ble_bd_addr; ResolveAddress(ble_bd_addr, address); ResolveAddress(ble_bd_addr, address); Loading @@ -84,21 +84,40 @@ class RasServerImpl : public bluetooth::ras::RasServer { log::warn("Can't find tracker for {}", ble_bd_addr.bda); log::warn("Can't find tracker for {}", ble_bd_addr.bda); return; return; } } std::lock_guard<std::mutex> lock(data_mutex_); ClientTracker& tracker = trackers_[ble_bd_addr.bda]; ClientTracker& tracker = trackers_[ble_bd_addr.bda]; uint16_t ccc_real_time = tracker.ccc_values_[kRasRealTimeRangingDataCharacteristic]; uint16_t ccc_data_ready = tracker.ccc_values_[kRasRangingDataReadyCharacteristic]; uint16_t ccc_data_over_written = tracker.ccc_values_[kRasRangingDataOverWrittenCharacteristic]; if (ccc_real_time != GATT_CLT_CONFIG_NONE) { bool need_confirm = ccc_real_time == GATT_CHAR_CLIENT_CONFIG_INDICTION; uint16_t attr_id = GetCharacteristic(kRasRealTimeRangingDataCharacteristic) ->attribute_handle_; log::debug("Send Real-time Ranging Data"); BTA_GATTS_HandleValueIndication(tracker.conn_id_, attr_id, data, need_confirm); } if (ccc_data_ready == GATT_CLT_CONFIG_NONE && ccc_data_over_written == GATT_CLT_CONFIG_NONE) { return; } std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); DataBuffer& data_buffer = DataBuffer& data_buffer = InitDataBuffer(ble_bd_addr.bda, procedure_counter); InitDataBuffer(ble_bd_addr.bda, procedure_counter); data_buffer.segments_.push_back(data); data_buffer.segments_.push_back(data); // Send data ready // Send data ready if (is_last) { if (is_last) { uint16_t ccc_value = if (ccc_data_ready == GATT_CLT_CONFIG_NONE) { tracker.ccc_values_[kRasRangingDataReadyCharacteristic]; log::debug("Skip Ranging Data Ready"); if (ccc_value == GATT_CLT_CONFIG_NONE) { log::info("Skip Ranging Data Ready"); } else { } else { bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_data_ready & GATT_CLT_CONFIG_INDICATION; log::info("Send data ready, ranging_counter {}", procedure_counter); log::debug("Send data ready, ranging_counter {}", procedure_counter); uint16_t attr_id = GetCharacteristic(kRasRangingDataReadyCharacteristic) uint16_t attr_id = GetCharacteristic(kRasRangingDataReadyCharacteristic) ->attribute_handle_; ->attribute_handle_; std::vector<uint8_t> value(kRingingCounterSize); std::vector<uint8_t> value(kRingingCounterSize); Loading @@ -112,15 +131,13 @@ class RasServerImpl : public bluetooth::ras::RasServer { // Send data overwritten // Send data overwritten if (tracker.buffers_.size() > kBufferSize) { if (tracker.buffers_.size() > kBufferSize) { auto begin = tracker.buffers_.begin(); auto begin = tracker.buffers_.begin(); uint16_t ccc_value = if (ccc_data_over_written == GATT_CLT_CONFIG_NONE) { tracker.ccc_values_[kRasRangingDataOverWrittenCharacteristic]; log::debug("Skip Ranging Data Over Written"); if (ccc_value == GATT_CLT_CONFIG_NONE) { log::info("Skip Ranging Data Over Written"); tracker.buffers_.erase(begin); tracker.buffers_.erase(begin); return; return; } } bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_data_over_written & GATT_CLT_CONFIG_INDICATION; log::info("Send data over written, ranging_counter {}", log::debug("Send data over written, ranging_counter {}", begin->ranging_counter_); begin->ranging_counter_); uint16_t attr_id = uint16_t attr_id = GetCharacteristic(kRasRangingDataOverWrittenCharacteristic) GetCharacteristic(kRasRangingDataOverWrittenCharacteristic) Loading Loading @@ -451,7 +468,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { GetCharacteristic(kRasOnDemandDataCharacteristic)->attribute_handle_; GetCharacteristic(kRasOnDemandDataCharacteristic)->attribute_handle_; bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; std::lock_guard<std::mutex> lock(data_mutex_); std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), [&ranging_counter](const DataBuffer& buffer) { [&ranging_counter](const DataBuffer& buffer) { return buffer.ranging_counter_ == ranging_counter; return buffer.ranging_counter_ == ranging_counter; Loading @@ -470,9 +487,8 @@ class RasServerImpl : public bluetooth::ras::RasServer { ranging_counter); ranging_counter); std::vector<uint8_t> response(8, 0); std::vector<uint8_t> response(8, 0); response[0] = (uint8_t)EventCode::COMPLETE_RANGING_DATA_RESPONSE; response[0] = (uint8_t)EventCode::COMPLETE_RANGING_DATA_RESPONSE; response[1] = 0; // Null response[1] = (ranging_counter & 0xFF); response[2] = (ranging_counter & 0xFF); response[2] = (ranging_counter >> 8) & 0xFF; response[3] = (ranging_counter >> 8) & 0xFF; BTA_GATTS_HandleValueIndication( BTA_GATTS_HandleValueIndication( tracker->conn_id_, tracker->conn_id_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, Loading @@ -491,7 +507,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { STREAM_TO_UINT16(ranging_counter, value); STREAM_TO_UINT16(ranging_counter, value); log::info("ranging_counter:{}", ranging_counter); log::info("ranging_counter:{}", ranging_counter); std::lock_guard<std::mutex> lock(data_mutex_); std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), [&ranging_counter](const DataBuffer& buffer) { [&ranging_counter](const DataBuffer& buffer) { return buffer.ranging_counter_ == ranging_counter; return buffer.ranging_counter_ == ranging_counter; Loading @@ -500,6 +516,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { if (it != tracker->buffers_.end()) { if (it != tracker->buffers_.end()) { tracker->buffers_.erase(it); tracker->buffers_.erase(it); tracker->handling_control_point_command_ = false; tracker->handling_control_point_command_ = false; SendResponseCode(ResponseCodeValue::SUCCESS, tracker); } else { } else { log::warn("No Records Found"); log::warn("No Records Found"); SendResponseCode(ResponseCodeValue::NO_RECORDS_FOUND, tracker); SendResponseCode(ResponseCodeValue::NO_RECORDS_FOUND, tracker); Loading @@ -512,8 +529,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { GetResponseOpcodeValueText(response_code_value)); GetResponseOpcodeValueText(response_code_value)); std::vector<uint8_t> response(8, 0); std::vector<uint8_t> response(8, 0); response[0] = (uint8_t)EventCode::RESPONSE_CODE; response[0] = (uint8_t)EventCode::RESPONSE_CODE; response[1] = 0; // Null response[1] = (uint8_t)response_code_value; response[2] = (uint8_t)response_code_value; BTA_GATTS_HandleValueIndication( BTA_GATTS_HandleValueIndication( tracker->conn_id_, tracker->conn_id_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, Loading Loading @@ -589,7 +605,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { std::unordered_map<uint16_t, RasCharacteristic> characteristics_; std::unordered_map<uint16_t, RasCharacteristic> characteristics_; // A map to client trackers with address // A map to client trackers with address std::unordered_map<RawAddress, ClientTracker> trackers_; std::unordered_map<RawAddress, ClientTracker> trackers_; std::mutex data_mutex_; std::mutex on_demand_ranging_mutex_; }; }; } // namespace } // namespace Loading system/gd/hci/distance_measurement_manager.cc +5 −5 Original line number Original line Diff line number Diff line Loading @@ -56,13 +56,13 @@ static constexpr uint8_t kMode0Steps = 0x03; // Maximum number of mode-0 steps to increase success subevent rate 0x03; // Maximum number of mode-0 steps to increase success subevent rate static constexpr uint8_t kChannelMapRepetition = 0x01; // No repetition static constexpr uint8_t kChannelMapRepetition = 0x01; // No repetition static constexpr uint8_t kCh3cJump = 0x03; // Skip 3 Channels static constexpr uint8_t kCh3cJump = 0x03; // Skip 3 Channels static constexpr uint16_t kMaxProcedureLen = 0xFFFF; // 40.959375s static constexpr uint16_t kMaxProcedureLen = 0x4E20; // 12.5s static constexpr uint16_t kMinProcedureInterval = 0x01; static constexpr uint16_t kMinProcedureInterval = 0x01; static constexpr uint16_t kMaxProcedureInterval = 0xFF; static constexpr uint16_t kMaxProcedureInterval = 0xFF; static constexpr uint16_t kMaxProcedureCount = 0x01; static constexpr uint16_t kMaxProcedureCount = 0x01; static constexpr uint32_t kMinSubeventLen = 0x0004E2; // 1250us static constexpr uint32_t kMinSubeventLen = 0x0004E2; // 1250us static constexpr uint32_t kMaxSubeventLen = 0x3d0900; // 4s static constexpr uint32_t kMaxSubeventLen = 0x3d0900; // 4s static constexpr uint8_t kToneAntennaConfigSelection = 0x07; // 2x2 static constexpr uint8_t kToneAntennaConfigSelection = 0x00; // 1x1 static constexpr uint8_t kTxPwrDelta = 0x00; static constexpr uint8_t kTxPwrDelta = 0x00; static constexpr uint8_t kProcedureDataBufferSize = 0x10; // Buffer size of Procedure data static constexpr uint8_t kProcedureDataBufferSize = 0x10; // Buffer size of Procedure data static constexpr uint16_t kMtuForRasData = 507; // 512 - 5 static constexpr uint16_t kMtuForRasData = 507; // 512 - 5 Loading Loading @@ -774,7 +774,7 @@ struct DistanceMeasurementManager::impl { } } } } void handle_remote_data(const Address& address, const std::vector<uint8_t> raw_data) { void handle_remote_data(const Address address, const std::vector<uint8_t> raw_data) { uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address); uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address); log::debug( log::debug( "address:{}, connection_handle 0x{:04x}, size:{}", "address:{}, connection_handle 0x{:04x}, size:{}", Loading Loading @@ -938,7 +938,7 @@ struct DistanceMeasurementManager::impl { double i_value = get_iq_value(tone_data.tone_data_[k].i_sample_); double i_value = get_iq_value(tone_data.tone_data_[k].i_sample_); double q_value = get_iq_value(tone_data.tone_data_[k].q_sample_); double q_value = get_iq_value(tone_data.tone_data_[k].q_sample_); uint8_t tone_quality_indicator = tone_data.tone_data_[k].tone_quality_indicator_; uint8_t tone_quality_indicator = tone_data.tone_data_[k].tone_quality_indicator_; log::debug( log::verbose( "antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value, q_value); "antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value, q_value); if (role == CsRole::INITIATOR) { if (role == CsRole::INITIATOR) { procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value); procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value); Loading Loading @@ -1427,7 +1427,7 @@ void DistanceMeasurementManager::StopDistanceMeasurement( } } void DistanceMeasurementManager::HandleRemoteData( void DistanceMeasurementManager::HandleRemoteData( const Address& address, const std::vector<uint8_t> raw_data) { const Address& address, const std::vector<uint8_t>& raw_data) { CallOn(pimpl_.get(), &impl::handle_remote_data, address, raw_data); CallOn(pimpl_.get(), &impl::handle_remote_data, address, raw_data); } } Loading system/gd/hci/distance_measurement_manager.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -79,7 +79,7 @@ class DistanceMeasurementManager : public bluetooth::Module { void StartDistanceMeasurement( void StartDistanceMeasurement( const Address&, uint16_t interval, DistanceMeasurementMethod method); const Address&, uint16_t interval, DistanceMeasurementMethod method); void StopDistanceMeasurement(const Address& address, DistanceMeasurementMethod method); void StopDistanceMeasurement(const Address& address, DistanceMeasurementMethod method); void HandleRemoteData(const Address& address, const std::vector<uint8_t> raw_data); void HandleRemoteData(const Address& address, const std::vector<uint8_t>& raw_data); static const ModuleFactory Factory; static const ModuleFactory Factory; Loading Loading
system/bta/include/bta_ras_api.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,8 @@ RasServer* GetRasServer(); class RasClientCallbacks { class RasClientCallbacks { public: public: virtual ~RasClientCallbacks() = default; virtual ~RasClientCallbacks() = default; virtual void OnRemoteData(RawAddress address, std::vector<uint8_t> data) = 0; virtual void OnRemoteData(const RawAddress& address, const std::vector<uint8_t>& data) = 0; }; }; class RasClient { class RasClient { Loading
system/bta/ras/ras_client.cc +15 −6 Original line number Original line Diff line number Diff line Loading @@ -187,11 +187,7 @@ class RasClientImpl : public bluetooth::ras::RasClient { }, }, nullptr); nullptr); // Subscribe Characteristics SubscribeCharacteristic(tracker, kRasOnDemandDataCharacteristic); SubscribeCharacteristic(tracker, kRasControlPointCharacteristic); SubscribeCharacteristic(tracker, kRasControlPointCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataReadyCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataOverWrittenCharacteristic); } } void OnGattNotification(const tBTA_GATTC_NOTIFY& evt) { void OnGattNotification(const tBTA_GATTC_NOTIFY& evt) { Loading @@ -211,8 +207,9 @@ class RasClientImpl : public bluetooth::ras::RasClient { getUuidName(characteristic->uuid), evt.len); getUuidName(characteristic->uuid), evt.len); switch (uuid_16bit) { switch (uuid_16bit) { case kRasRealTimeRangingDataCharacteristic16bit: case kRasOnDemandDataCharacteristic16bit: { case kRasOnDemandDataCharacteristic16bit: { OnDemandData(evt, tracker); OnRemoteData(evt, tracker); break; break; } } case kRasControlPointCharacteristic16bit: { case kRasControlPointCharacteristic16bit: { Loading @@ -226,7 +223,7 @@ class RasClientImpl : public bluetooth::ras::RasClient { } } } } void OnDemandData(const tBTA_GATTC_NOTIFY& evt, void OnRemoteData(const tBTA_GATTC_NOTIFY& evt, std::shared_ptr<RasTracker> tracker) { std::shared_ptr<RasTracker> tracker) { std::vector<uint8_t> data; std::vector<uint8_t> data; data.resize(evt.len); data.resize(evt.len); Loading Loading @@ -446,6 +443,18 @@ class RasClientImpl : public bluetooth::ras::RasClient { STREAM_TO_UINT32(tracker->remote_supported_features_, value); STREAM_TO_UINT32(tracker->remote_supported_features_, value); log::info("Remote supported features : {}", log::info("Remote supported features : {}", getFeaturesString(tracker->remote_supported_features_)); getFeaturesString(tracker->remote_supported_features_)); if (tracker->remote_supported_features_ & feature::kRealTimeRangingData) { log::info("Subscribe Real-time Ranging Data"); SubscribeCharacteristic(tracker, kRasRealTimeRangingDataCharacteristic); } else { log::info("Subscribe On-demand Ranging Data"); SubscribeCharacteristic(tracker, kRasOnDemandDataCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataReadyCharacteristic); SubscribeCharacteristic(tracker, kRasRangingDataOverWrittenCharacteristic); } } break; } break; default: default: log::warn("Unexpected UUID"); log::warn("Unexpected UUID"); Loading
system/bta/ras/ras_server.cc +41 −25 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ namespace { class RasServerImpl; class RasServerImpl; RasServerImpl* instance; RasServerImpl* instance; static constexpr uint32_t kSupportedFeatures = 0; static constexpr uint32_t kSupportedFeatures = feature::kRealTimeRangingData; static constexpr uint16_t kBufferSize = 3; static constexpr uint16_t kBufferSize = 3; class RasServerImpl : public bluetooth::ras::RasServer { class RasServerImpl : public bluetooth::ras::RasServer { Loading Loading @@ -75,7 +75,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { void PushProcedureData(RawAddress address, uint16_t procedure_counter, void PushProcedureData(RawAddress address, uint16_t procedure_counter, bool is_last, std::vector<uint8_t> data) { bool is_last, std::vector<uint8_t> data) { log::info("{}, counter:{}, is_last:{}, with size {}", address, log::debug("{}, counter:{}, is_last:{}, with size {}", address, procedure_counter, is_last, data.size()); procedure_counter, is_last, data.size()); tBLE_BD_ADDR ble_bd_addr; tBLE_BD_ADDR ble_bd_addr; ResolveAddress(ble_bd_addr, address); ResolveAddress(ble_bd_addr, address); Loading @@ -84,21 +84,40 @@ class RasServerImpl : public bluetooth::ras::RasServer { log::warn("Can't find tracker for {}", ble_bd_addr.bda); log::warn("Can't find tracker for {}", ble_bd_addr.bda); return; return; } } std::lock_guard<std::mutex> lock(data_mutex_); ClientTracker& tracker = trackers_[ble_bd_addr.bda]; ClientTracker& tracker = trackers_[ble_bd_addr.bda]; uint16_t ccc_real_time = tracker.ccc_values_[kRasRealTimeRangingDataCharacteristic]; uint16_t ccc_data_ready = tracker.ccc_values_[kRasRangingDataReadyCharacteristic]; uint16_t ccc_data_over_written = tracker.ccc_values_[kRasRangingDataOverWrittenCharacteristic]; if (ccc_real_time != GATT_CLT_CONFIG_NONE) { bool need_confirm = ccc_real_time == GATT_CHAR_CLIENT_CONFIG_INDICTION; uint16_t attr_id = GetCharacteristic(kRasRealTimeRangingDataCharacteristic) ->attribute_handle_; log::debug("Send Real-time Ranging Data"); BTA_GATTS_HandleValueIndication(tracker.conn_id_, attr_id, data, need_confirm); } if (ccc_data_ready == GATT_CLT_CONFIG_NONE && ccc_data_over_written == GATT_CLT_CONFIG_NONE) { return; } std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); DataBuffer& data_buffer = DataBuffer& data_buffer = InitDataBuffer(ble_bd_addr.bda, procedure_counter); InitDataBuffer(ble_bd_addr.bda, procedure_counter); data_buffer.segments_.push_back(data); data_buffer.segments_.push_back(data); // Send data ready // Send data ready if (is_last) { if (is_last) { uint16_t ccc_value = if (ccc_data_ready == GATT_CLT_CONFIG_NONE) { tracker.ccc_values_[kRasRangingDataReadyCharacteristic]; log::debug("Skip Ranging Data Ready"); if (ccc_value == GATT_CLT_CONFIG_NONE) { log::info("Skip Ranging Data Ready"); } else { } else { bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_data_ready & GATT_CLT_CONFIG_INDICATION; log::info("Send data ready, ranging_counter {}", procedure_counter); log::debug("Send data ready, ranging_counter {}", procedure_counter); uint16_t attr_id = GetCharacteristic(kRasRangingDataReadyCharacteristic) uint16_t attr_id = GetCharacteristic(kRasRangingDataReadyCharacteristic) ->attribute_handle_; ->attribute_handle_; std::vector<uint8_t> value(kRingingCounterSize); std::vector<uint8_t> value(kRingingCounterSize); Loading @@ -112,15 +131,13 @@ class RasServerImpl : public bluetooth::ras::RasServer { // Send data overwritten // Send data overwritten if (tracker.buffers_.size() > kBufferSize) { if (tracker.buffers_.size() > kBufferSize) { auto begin = tracker.buffers_.begin(); auto begin = tracker.buffers_.begin(); uint16_t ccc_value = if (ccc_data_over_written == GATT_CLT_CONFIG_NONE) { tracker.ccc_values_[kRasRangingDataOverWrittenCharacteristic]; log::debug("Skip Ranging Data Over Written"); if (ccc_value == GATT_CLT_CONFIG_NONE) { log::info("Skip Ranging Data Over Written"); tracker.buffers_.erase(begin); tracker.buffers_.erase(begin); return; return; } } bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_data_over_written & GATT_CLT_CONFIG_INDICATION; log::info("Send data over written, ranging_counter {}", log::debug("Send data over written, ranging_counter {}", begin->ranging_counter_); begin->ranging_counter_); uint16_t attr_id = uint16_t attr_id = GetCharacteristic(kRasRangingDataOverWrittenCharacteristic) GetCharacteristic(kRasRangingDataOverWrittenCharacteristic) Loading Loading @@ -451,7 +468,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { GetCharacteristic(kRasOnDemandDataCharacteristic)->attribute_handle_; GetCharacteristic(kRasOnDemandDataCharacteristic)->attribute_handle_; bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; bool need_confirm = ccc_value & GATT_CLT_CONFIG_INDICATION; std::lock_guard<std::mutex> lock(data_mutex_); std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), [&ranging_counter](const DataBuffer& buffer) { [&ranging_counter](const DataBuffer& buffer) { return buffer.ranging_counter_ == ranging_counter; return buffer.ranging_counter_ == ranging_counter; Loading @@ -470,9 +487,8 @@ class RasServerImpl : public bluetooth::ras::RasServer { ranging_counter); ranging_counter); std::vector<uint8_t> response(8, 0); std::vector<uint8_t> response(8, 0); response[0] = (uint8_t)EventCode::COMPLETE_RANGING_DATA_RESPONSE; response[0] = (uint8_t)EventCode::COMPLETE_RANGING_DATA_RESPONSE; response[1] = 0; // Null response[1] = (ranging_counter & 0xFF); response[2] = (ranging_counter & 0xFF); response[2] = (ranging_counter >> 8) & 0xFF; response[3] = (ranging_counter >> 8) & 0xFF; BTA_GATTS_HandleValueIndication( BTA_GATTS_HandleValueIndication( tracker->conn_id_, tracker->conn_id_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, Loading @@ -491,7 +507,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { STREAM_TO_UINT16(ranging_counter, value); STREAM_TO_UINT16(ranging_counter, value); log::info("ranging_counter:{}", ranging_counter); log::info("ranging_counter:{}", ranging_counter); std::lock_guard<std::mutex> lock(data_mutex_); std::lock_guard<std::mutex> lock(on_demand_ranging_mutex_); auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), auto it = std::find_if(tracker->buffers_.begin(), tracker->buffers_.end(), [&ranging_counter](const DataBuffer& buffer) { [&ranging_counter](const DataBuffer& buffer) { return buffer.ranging_counter_ == ranging_counter; return buffer.ranging_counter_ == ranging_counter; Loading @@ -500,6 +516,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { if (it != tracker->buffers_.end()) { if (it != tracker->buffers_.end()) { tracker->buffers_.erase(it); tracker->buffers_.erase(it); tracker->handling_control_point_command_ = false; tracker->handling_control_point_command_ = false; SendResponseCode(ResponseCodeValue::SUCCESS, tracker); } else { } else { log::warn("No Records Found"); log::warn("No Records Found"); SendResponseCode(ResponseCodeValue::NO_RECORDS_FOUND, tracker); SendResponseCode(ResponseCodeValue::NO_RECORDS_FOUND, tracker); Loading @@ -512,8 +529,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { GetResponseOpcodeValueText(response_code_value)); GetResponseOpcodeValueText(response_code_value)); std::vector<uint8_t> response(8, 0); std::vector<uint8_t> response(8, 0); response[0] = (uint8_t)EventCode::RESPONSE_CODE; response[0] = (uint8_t)EventCode::RESPONSE_CODE; response[1] = 0; // Null response[1] = (uint8_t)response_code_value; response[2] = (uint8_t)response_code_value; BTA_GATTS_HandleValueIndication( BTA_GATTS_HandleValueIndication( tracker->conn_id_, tracker->conn_id_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, GetCharacteristic(kRasControlPointCharacteristic)->attribute_handle_, Loading Loading @@ -589,7 +605,7 @@ class RasServerImpl : public bluetooth::ras::RasServer { std::unordered_map<uint16_t, RasCharacteristic> characteristics_; std::unordered_map<uint16_t, RasCharacteristic> characteristics_; // A map to client trackers with address // A map to client trackers with address std::unordered_map<RawAddress, ClientTracker> trackers_; std::unordered_map<RawAddress, ClientTracker> trackers_; std::mutex data_mutex_; std::mutex on_demand_ranging_mutex_; }; }; } // namespace } // namespace Loading
system/gd/hci/distance_measurement_manager.cc +5 −5 Original line number Original line Diff line number Diff line Loading @@ -56,13 +56,13 @@ static constexpr uint8_t kMode0Steps = 0x03; // Maximum number of mode-0 steps to increase success subevent rate 0x03; // Maximum number of mode-0 steps to increase success subevent rate static constexpr uint8_t kChannelMapRepetition = 0x01; // No repetition static constexpr uint8_t kChannelMapRepetition = 0x01; // No repetition static constexpr uint8_t kCh3cJump = 0x03; // Skip 3 Channels static constexpr uint8_t kCh3cJump = 0x03; // Skip 3 Channels static constexpr uint16_t kMaxProcedureLen = 0xFFFF; // 40.959375s static constexpr uint16_t kMaxProcedureLen = 0x4E20; // 12.5s static constexpr uint16_t kMinProcedureInterval = 0x01; static constexpr uint16_t kMinProcedureInterval = 0x01; static constexpr uint16_t kMaxProcedureInterval = 0xFF; static constexpr uint16_t kMaxProcedureInterval = 0xFF; static constexpr uint16_t kMaxProcedureCount = 0x01; static constexpr uint16_t kMaxProcedureCount = 0x01; static constexpr uint32_t kMinSubeventLen = 0x0004E2; // 1250us static constexpr uint32_t kMinSubeventLen = 0x0004E2; // 1250us static constexpr uint32_t kMaxSubeventLen = 0x3d0900; // 4s static constexpr uint32_t kMaxSubeventLen = 0x3d0900; // 4s static constexpr uint8_t kToneAntennaConfigSelection = 0x07; // 2x2 static constexpr uint8_t kToneAntennaConfigSelection = 0x00; // 1x1 static constexpr uint8_t kTxPwrDelta = 0x00; static constexpr uint8_t kTxPwrDelta = 0x00; static constexpr uint8_t kProcedureDataBufferSize = 0x10; // Buffer size of Procedure data static constexpr uint8_t kProcedureDataBufferSize = 0x10; // Buffer size of Procedure data static constexpr uint16_t kMtuForRasData = 507; // 512 - 5 static constexpr uint16_t kMtuForRasData = 507; // 512 - 5 Loading Loading @@ -774,7 +774,7 @@ struct DistanceMeasurementManager::impl { } } } } void handle_remote_data(const Address& address, const std::vector<uint8_t> raw_data) { void handle_remote_data(const Address address, const std::vector<uint8_t> raw_data) { uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address); uint16_t connection_handle = acl_manager_->HACK_GetLeHandle(address); log::debug( log::debug( "address:{}, connection_handle 0x{:04x}, size:{}", "address:{}, connection_handle 0x{:04x}, size:{}", Loading Loading @@ -938,7 +938,7 @@ struct DistanceMeasurementManager::impl { double i_value = get_iq_value(tone_data.tone_data_[k].i_sample_); double i_value = get_iq_value(tone_data.tone_data_[k].i_sample_); double q_value = get_iq_value(tone_data.tone_data_[k].q_sample_); double q_value = get_iq_value(tone_data.tone_data_[k].q_sample_); uint8_t tone_quality_indicator = tone_data.tone_data_[k].tone_quality_indicator_; uint8_t tone_quality_indicator = tone_data.tone_data_[k].tone_quality_indicator_; log::debug( log::verbose( "antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value, q_value); "antenna_path {}, {:f}, {:f}", (uint16_t)(antenna_path + 1), i_value, q_value); if (role == CsRole::INITIATOR) { if (role == CsRole::INITIATOR) { procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value); procedure_data->tone_pct_initiator[antenna_path].emplace_back(i_value, q_value); Loading Loading @@ -1427,7 +1427,7 @@ void DistanceMeasurementManager::StopDistanceMeasurement( } } void DistanceMeasurementManager::HandleRemoteData( void DistanceMeasurementManager::HandleRemoteData( const Address& address, const std::vector<uint8_t> raw_data) { const Address& address, const std::vector<uint8_t>& raw_data) { CallOn(pimpl_.get(), &impl::handle_remote_data, address, raw_data); CallOn(pimpl_.get(), &impl::handle_remote_data, address, raw_data); } } Loading
system/gd/hci/distance_measurement_manager.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -79,7 +79,7 @@ class DistanceMeasurementManager : public bluetooth::Module { void StartDistanceMeasurement( void StartDistanceMeasurement( const Address&, uint16_t interval, DistanceMeasurementMethod method); const Address&, uint16_t interval, DistanceMeasurementMethod method); void StopDistanceMeasurement(const Address& address, DistanceMeasurementMethod method); void StopDistanceMeasurement(const Address& address, DistanceMeasurementMethod method); void HandleRemoteData(const Address& address, const std::vector<uint8_t> raw_data); void HandleRemoteData(const Address& address, const std::vector<uint8_t>& raw_data); static const ModuleFactory Factory; static const ModuleFactory Factory; Loading