Loading system/bta/include/bta_ras_api.h +3 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,9 @@ public: virtual ~RasClientCallbacks() = default; virtual void OnConnected( const RawAddress& address, uint16_t att_handle, const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) = 0; const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics, uint16_t conn_interval) = 0; virtual void OnConnIntervalUpdated(const RawAddress& address, uint16_t conn_interval) = 0; virtual void OnDisconnected(const RawAddress& address) = 0; virtual void OnWriteVendorSpecificReplyComplete(const RawAddress& address, bool success) = 0; virtual void OnRemoteData(const RawAddress& address, const std::vector<uint8_t>& data) = 0; Loading system/bta/ras/ras_client.cc +24 −7 Original line number Diff line number Diff line Loading @@ -60,13 +60,15 @@ RasClientImpl* instance; enum CallbackDataType { VENDOR_SPECIFIC_REPLY }; enum TimeoutType { TIMEOUT_NONE, FIRST_SEGMENT, FOLLOWING_SEGMENT, RANGING_DATA_READY }; enum RangingType { RANGING_TYPE_NONE, REAL_TIME, ON_DEMAND }; class RasClientImpl : public bluetooth::ras::RasClient { static constexpr uint16_t kCachedDataSize = 10; static constexpr uint16_t kInvalidGattHandle = 0x0000; static constexpr uint16_t kFirstSegmentRangingDataTimeoutMs = 5000; static constexpr uint16_t kFollowingSegmentTimeoutMs = 1000; static constexpr uint16_t kRangingDataReadyTimeoutMs = 5000; static constexpr uint16_t kInvalidConnInterval = 0; // valid value is from 0x0006 to 0x0C0 class RasClientImpl : public bluetooth::ras::RasClient { public: struct GattReadCallbackData { const bool is_last_; Loading Loading @@ -105,6 +107,7 @@ public: alarm_t* ranging_data_timeout_timer_ = nullptr; RangingType ranging_type_ = RANGING_TYPE_NONE; TimeoutType timeout_type_ = TIMEOUT_NONE; uint16_t conn_interval_ = kInvalidConnInterval; const gatt::Characteristic* FindCharacteristicByUuid(Uuid uuid) { for (auto& characteristic : service_->characteristics) { Loading Loading @@ -183,7 +186,7 @@ public: SetTimeOutAlarm(tracker, kFirstSegmentRangingDataTimeoutMs, TimeoutType::FIRST_SEGMENT); } callbacks_->OnConnected(address, real_time_att_handle, tracker->vendor_specific_characteristics_); tracker->vendor_specific_characteristics_, tracker->conn_interval_); return; } BTA_GATTC_Open(gatt_if_, ble_bd_addr.bda, BTM_BLE_DIRECT_CONNECTION, true); Loading Loading @@ -230,11 +233,25 @@ public: case BTA_GATTC_NOTIF_EVT: { OnGattNotification(p_data->notify); } break; case BTA_GATTC_CONN_UPDATE_EVT: { OnConnUpdated(p_data->conn_update); } break; default: log::warn("Unhandled event: {}", gatt_client_event_text(event)); } } void OnConnUpdated(const tBTA_GATTC_CONN_UPDATE& evt) const { auto tracker = FindTrackerByHandle(evt.conn_id); if (tracker == nullptr) { log::debug("no ongoing measurement, skip"); return; } tracker->conn_interval_ = evt.interval; log::info("conn interval is updated as {}", evt.interval); callbacks_->OnConnIntervalUpdated(tracker->address_for_cs_, tracker->conn_interval_); } void OnGattConnected(const tBTA_GATTC_OPEN& evt) { log::info("{}, conn_id=0x{:04x}, transport:{}, status:{}", evt.remote_bda, evt.conn_id, bt_transport_text(evt.transport), gatt_status_text(evt.status)); Loading Loading @@ -751,7 +768,7 @@ public: uint16_t real_time_att_handle = characteristic == nullptr ? kInvalidGattHandle : characteristic->value_handle; callbacks_->OnConnected(tracker->address_for_cs_, real_time_att_handle, tracker->vendor_specific_characteristics_); tracker->vendor_specific_characteristics_, tracker->conn_interval_); } void StoreCachedData(std::shared_ptr<RasTracker> tracker) { Loading system/gd/hal/ranging_hal.h +4 −2 Original line number Diff line number Diff line Loading @@ -313,8 +313,10 @@ public: const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply) = 0; virtual void WriteRawData(uint16_t connection_handle, const ChannelSoundingRawData& raw_data) = 0; virtual void UpdateChannelSoundingConfig( uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView) = 0; uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView, uint8_t local_supported_sw_time, uint8_t remote_supported_sw_time, uint16_t conn_interval) = 0; virtual void UpdateConnInterval(uint16_t connection_handle, uint16_t conn_interval) = 0; virtual void UpdateProcedureEnableConfig( uint16_t connection_handle, const hci::LeCsProcedureEnableCompleteView& leCsProcedureEnableCompleteView) = 0; Loading system/gd/hal/ranging_hal_android.cc +22 −7 Original line number Diff line number Diff line Loading @@ -262,9 +262,11 @@ public: session_trackers_[connection_handle]->GetSession()->writeRawData(hal_raw_data); } void UpdateChannelSoundingConfig( uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView) override { void UpdateChannelSoundingConfig(uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView, uint8_t local_supported_sw_time, uint8_t remote_supported_sw_time, uint16_t conn_interval) override { auto it = session_trackers_.find(connection_handle); if (it == session_trackers_.end()) { log::error("Can't find session for connection_handle:0x{:04x}", connection_handle); Loading Loading @@ -299,14 +301,27 @@ public: .tIp2TimeUs = leCsConfigCompleteView.GetTIp2Time(), .tFcsTimeUs = leCsConfigCompleteView.GetTFcsTime(), .tPmTimeUs = static_cast<int8_t>(leCsConfigCompleteView.GetTPmTime()), // TODO(b/378942784): specify the following values. .tSwTimeUsSupportedByLocal = 0, .tSwTimeUsSupportedByRemote = 0, .bleConnInterval = 0, .tSwTimeUsSupportedByLocal = static_cast<int8_t>(local_supported_sw_time), .tSwTimeUsSupportedByRemote = static_cast<int8_t>(remote_supported_sw_time), .bleConnInterval = conn_interval, }; it->second->GetSession()->updateChannelSoundingConfig(csConfig); } void UpdateConnInterval(uint16_t connection_handle, uint16_t conn_interval) override { auto it = session_trackers_.find(connection_handle); if (it == session_trackers_.end()) { log::error("Can't find session for connection_handle:0x{:04x}", connection_handle); return; } else if (it->second->GetSession() == nullptr) { log::error("Session not opened"); return; } it->second->GetSession()->updateBleConnInterval(conn_interval); } void UpdateProcedureEnableConfig( uint16_t connection_handle, const hci::LeCsProcedureEnableCompleteView& leCsProcedureEnableCompleteView) override { Loading system/gd/hal/ranging_hal_host.cc +8 −3 Original line number Diff line number Diff line Loading @@ -45,9 +45,11 @@ public: void WriteRawData(uint16_t /* connection_handle */, const ChannelSoundingRawData& /* raw_data */) override {} void UpdateChannelSoundingConfig( uint16_t /* connection_handle */, const hci::LeCsConfigCompleteView& /* leCsConfigCompleteView */) override {} void UpdateChannelSoundingConfig(uint16_t /* connection_handle */, const hci::LeCsConfigCompleteView& /* leCsConfigCompleteView */, uint8_t /* local_supported_sw_time */, uint8_t /* remote_supported_sw_time */, uint16_t /* conn_interval */) override {} void UpdateProcedureEnableConfig( uint16_t /* connection_handle */, Loading @@ -58,6 +60,9 @@ public: const ProcedureDataV2& /* procedure_data */, uint16_t /* procedure_counter */) {} void UpdateConnInterval(uint16_t /* connection_handle */, uint16_t /* conn_interval */) override { } protected: void ListDependencies(ModuleList* /*list*/) const {} Loading Loading
system/bta/include/bta_ras_api.h +3 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,9 @@ public: virtual ~RasClientCallbacks() = default; virtual void OnConnected( const RawAddress& address, uint16_t att_handle, const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics) = 0; const std::vector<VendorSpecificCharacteristic>& vendor_specific_characteristics, uint16_t conn_interval) = 0; virtual void OnConnIntervalUpdated(const RawAddress& address, uint16_t conn_interval) = 0; virtual void OnDisconnected(const RawAddress& address) = 0; virtual void OnWriteVendorSpecificReplyComplete(const RawAddress& address, bool success) = 0; virtual void OnRemoteData(const RawAddress& address, const std::vector<uint8_t>& data) = 0; Loading
system/bta/ras/ras_client.cc +24 −7 Original line number Diff line number Diff line Loading @@ -60,13 +60,15 @@ RasClientImpl* instance; enum CallbackDataType { VENDOR_SPECIFIC_REPLY }; enum TimeoutType { TIMEOUT_NONE, FIRST_SEGMENT, FOLLOWING_SEGMENT, RANGING_DATA_READY }; enum RangingType { RANGING_TYPE_NONE, REAL_TIME, ON_DEMAND }; class RasClientImpl : public bluetooth::ras::RasClient { static constexpr uint16_t kCachedDataSize = 10; static constexpr uint16_t kInvalidGattHandle = 0x0000; static constexpr uint16_t kFirstSegmentRangingDataTimeoutMs = 5000; static constexpr uint16_t kFollowingSegmentTimeoutMs = 1000; static constexpr uint16_t kRangingDataReadyTimeoutMs = 5000; static constexpr uint16_t kInvalidConnInterval = 0; // valid value is from 0x0006 to 0x0C0 class RasClientImpl : public bluetooth::ras::RasClient { public: struct GattReadCallbackData { const bool is_last_; Loading Loading @@ -105,6 +107,7 @@ public: alarm_t* ranging_data_timeout_timer_ = nullptr; RangingType ranging_type_ = RANGING_TYPE_NONE; TimeoutType timeout_type_ = TIMEOUT_NONE; uint16_t conn_interval_ = kInvalidConnInterval; const gatt::Characteristic* FindCharacteristicByUuid(Uuid uuid) { for (auto& characteristic : service_->characteristics) { Loading Loading @@ -183,7 +186,7 @@ public: SetTimeOutAlarm(tracker, kFirstSegmentRangingDataTimeoutMs, TimeoutType::FIRST_SEGMENT); } callbacks_->OnConnected(address, real_time_att_handle, tracker->vendor_specific_characteristics_); tracker->vendor_specific_characteristics_, tracker->conn_interval_); return; } BTA_GATTC_Open(gatt_if_, ble_bd_addr.bda, BTM_BLE_DIRECT_CONNECTION, true); Loading Loading @@ -230,11 +233,25 @@ public: case BTA_GATTC_NOTIF_EVT: { OnGattNotification(p_data->notify); } break; case BTA_GATTC_CONN_UPDATE_EVT: { OnConnUpdated(p_data->conn_update); } break; default: log::warn("Unhandled event: {}", gatt_client_event_text(event)); } } void OnConnUpdated(const tBTA_GATTC_CONN_UPDATE& evt) const { auto tracker = FindTrackerByHandle(evt.conn_id); if (tracker == nullptr) { log::debug("no ongoing measurement, skip"); return; } tracker->conn_interval_ = evt.interval; log::info("conn interval is updated as {}", evt.interval); callbacks_->OnConnIntervalUpdated(tracker->address_for_cs_, tracker->conn_interval_); } void OnGattConnected(const tBTA_GATTC_OPEN& evt) { log::info("{}, conn_id=0x{:04x}, transport:{}, status:{}", evt.remote_bda, evt.conn_id, bt_transport_text(evt.transport), gatt_status_text(evt.status)); Loading Loading @@ -751,7 +768,7 @@ public: uint16_t real_time_att_handle = characteristic == nullptr ? kInvalidGattHandle : characteristic->value_handle; callbacks_->OnConnected(tracker->address_for_cs_, real_time_att_handle, tracker->vendor_specific_characteristics_); tracker->vendor_specific_characteristics_, tracker->conn_interval_); } void StoreCachedData(std::shared_ptr<RasTracker> tracker) { Loading
system/gd/hal/ranging_hal.h +4 −2 Original line number Diff line number Diff line Loading @@ -313,8 +313,10 @@ public: const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply) = 0; virtual void WriteRawData(uint16_t connection_handle, const ChannelSoundingRawData& raw_data) = 0; virtual void UpdateChannelSoundingConfig( uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView) = 0; uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView, uint8_t local_supported_sw_time, uint8_t remote_supported_sw_time, uint16_t conn_interval) = 0; virtual void UpdateConnInterval(uint16_t connection_handle, uint16_t conn_interval) = 0; virtual void UpdateProcedureEnableConfig( uint16_t connection_handle, const hci::LeCsProcedureEnableCompleteView& leCsProcedureEnableCompleteView) = 0; Loading
system/gd/hal/ranging_hal_android.cc +22 −7 Original line number Diff line number Diff line Loading @@ -262,9 +262,11 @@ public: session_trackers_[connection_handle]->GetSession()->writeRawData(hal_raw_data); } void UpdateChannelSoundingConfig( uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView) override { void UpdateChannelSoundingConfig(uint16_t connection_handle, const hci::LeCsConfigCompleteView& leCsConfigCompleteView, uint8_t local_supported_sw_time, uint8_t remote_supported_sw_time, uint16_t conn_interval) override { auto it = session_trackers_.find(connection_handle); if (it == session_trackers_.end()) { log::error("Can't find session for connection_handle:0x{:04x}", connection_handle); Loading Loading @@ -299,14 +301,27 @@ public: .tIp2TimeUs = leCsConfigCompleteView.GetTIp2Time(), .tFcsTimeUs = leCsConfigCompleteView.GetTFcsTime(), .tPmTimeUs = static_cast<int8_t>(leCsConfigCompleteView.GetTPmTime()), // TODO(b/378942784): specify the following values. .tSwTimeUsSupportedByLocal = 0, .tSwTimeUsSupportedByRemote = 0, .bleConnInterval = 0, .tSwTimeUsSupportedByLocal = static_cast<int8_t>(local_supported_sw_time), .tSwTimeUsSupportedByRemote = static_cast<int8_t>(remote_supported_sw_time), .bleConnInterval = conn_interval, }; it->second->GetSession()->updateChannelSoundingConfig(csConfig); } void UpdateConnInterval(uint16_t connection_handle, uint16_t conn_interval) override { auto it = session_trackers_.find(connection_handle); if (it == session_trackers_.end()) { log::error("Can't find session for connection_handle:0x{:04x}", connection_handle); return; } else if (it->second->GetSession() == nullptr) { log::error("Session not opened"); return; } it->second->GetSession()->updateBleConnInterval(conn_interval); } void UpdateProcedureEnableConfig( uint16_t connection_handle, const hci::LeCsProcedureEnableCompleteView& leCsProcedureEnableCompleteView) override { Loading
system/gd/hal/ranging_hal_host.cc +8 −3 Original line number Diff line number Diff line Loading @@ -45,9 +45,11 @@ public: void WriteRawData(uint16_t /* connection_handle */, const ChannelSoundingRawData& /* raw_data */) override {} void UpdateChannelSoundingConfig( uint16_t /* connection_handle */, const hci::LeCsConfigCompleteView& /* leCsConfigCompleteView */) override {} void UpdateChannelSoundingConfig(uint16_t /* connection_handle */, const hci::LeCsConfigCompleteView& /* leCsConfigCompleteView */, uint8_t /* local_supported_sw_time */, uint8_t /* remote_supported_sw_time */, uint16_t /* conn_interval */) override {} void UpdateProcedureEnableConfig( uint16_t /* connection_handle */, Loading @@ -58,6 +60,9 @@ public: const ProcedureDataV2& /* procedure_data */, uint16_t /* procedure_counter */) {} void UpdateConnInterval(uint16_t /* connection_handle */, uint16_t /* conn_interval */) override { } protected: void ListDependencies(ModuleList* /*list*/) const {} Loading