Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b62ca748 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I36e30425,I73550041 into main

* changes:
  Get the BLE conn interval and pass to the HAL.
  handle the CS capabilities
parents 37393587 ce57f156
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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;
+24 −7
Original line number Diff line number Diff line
@@ -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_;
@@ -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) {
@@ -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);
@@ -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));
@@ -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) {
+4 −2
Original line number Diff line number Diff line
@@ -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;
+22 −7
Original line number Diff line number Diff line
@@ -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);
@@ -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 {
+8 −3
Original line number Diff line number Diff line
@@ -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 */,
@@ -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