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

Commit 50bca727 authored by Chienyuan Huang's avatar Chienyuan Huang
Browse files

CS: Set CS Role via CS config.

Bug: 324185011
Bug: 304295768
Test: m com.android.btservice
Change-Id: Icd5493c590de80ddfbb2ca03a41cfa918c5726ad
parent 49328469
Loading
Loading
Loading
Loading
+29 −29
Original line number Original line Diff line number Diff line
@@ -152,7 +152,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
      return;
      return;
    }
    }


    start_distance_measurement_with_cs(tracker.address, connection_handle, tracker.interval_ms);
    start_distance_measurement_with_cs(tracker.address, connection_handle);
  }
  }


  void OnOpenFailed(uint16_t connection_handle) {
  void OnOpenFailed(uint16_t connection_handle) {
@@ -250,37 +250,38 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
        }
        }
      } break;
      } break;
      case METHOD_CS: {
      case METHOD_CS: {
        start_distance_measurement_with_cs(address, connection_handle, interval);
        init_cs_tracker(address, connection_handle, interval);
        start_distance_measurement_with_cs(address, connection_handle);
      } break;
      } break;
    }
    }
  }
  }


  void start_distance_measurement_with_cs(const Address& cs_remote_address,
  void init_cs_tracker(const Address& cs_remote_address, uint16_t connection_handle,
                                          uint16_t connection_handle, uint16_t interval) {
                       uint16_t interval) {
    log::info("connection_handle: {}, address: {}", connection_handle, cs_remote_address);
    if (!com::android::bluetooth::flags::channel_sounding_in_stack()) {
      log::error("Channel Sounding is not enabled");
      distance_measurement_callbacks_->OnDistanceMeasurementStartFail(
              cs_remote_address, REASON_INTERNAL_ERROR, METHOD_CS);
      return;
    }

    if (cs_trackers_.find(connection_handle) != cs_trackers_.end() &&
    if (cs_trackers_.find(connection_handle) != cs_trackers_.end() &&
        cs_trackers_[connection_handle].address != cs_remote_address) {
        cs_trackers_[connection_handle].address != cs_remote_address) {
      log::warn("Remove old tracker for {}", cs_remote_address);
      log::debug("Remove old tracker for {}", cs_remote_address);
      cs_trackers_.erase(connection_handle);
      cs_trackers_.erase(connection_handle);
    }
    }

    if (cs_trackers_.find(connection_handle) == cs_trackers_.end()) {
    if (cs_trackers_.find(connection_handle) == cs_trackers_.end()) {
      // Create a cs tracker with role initiator
      cs_trackers_[connection_handle].address = cs_remote_address;
      cs_trackers_[connection_handle].address = cs_remote_address;
      // TODO: Check ROLE via CS config. (b/304295768)
      cs_trackers_[connection_handle].role = CsRole::INITIATOR;
      cs_trackers_[connection_handle].repeating_alarm =
      cs_trackers_[connection_handle].repeating_alarm =
              std::make_unique<os::RepeatingAlarm>(handler_);
              std::make_unique<os::RepeatingAlarm>(handler_);
    }
    }
    cs_trackers_[connection_handle].interval_ms = interval;
    cs_trackers_[connection_handle].interval_ms = interval;
    cs_trackers_[connection_handle].local_start = true;
    cs_trackers_[connection_handle].waiting_for_start_callback = true;
    cs_trackers_[connection_handle].waiting_for_start_callback = true;
  }

  void start_distance_measurement_with_cs(const Address& cs_remote_address,
                                          uint16_t connection_handle) {
    log::info("connection_handle: {}, address: {}", connection_handle, cs_remote_address);
    if (!com::android::bluetooth::flags::channel_sounding_in_stack()) {
      log::error("Channel Sounding is not enabled");
      distance_measurement_callbacks_->OnDistanceMeasurementStartFail(
              cs_remote_address, REASON_INTERNAL_ERROR, METHOD_CS);
      return;
    }


    if (!cs_trackers_[connection_handle].ras_connected) {
    if (!cs_trackers_[connection_handle].ras_connected) {
      log::info("Waiting for RAS connected");
      log::info("Waiting for RAS connected");
@@ -360,7 +361,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
      ranging_hal_->OpenSession(connection_handle, att_handle, vendor_specific_data);
      ranging_hal_->OpenSession(connection_handle, att_handle, vendor_specific_data);
      return;
      return;
    }
    }
    start_distance_measurement_with_cs(tracker.address, connection_handle, tracker.interval_ms);
    start_distance_measurement_with_cs(tracker.address, connection_handle);
  }
  }


  void handle_vendor_specific_reply(
  void handle_vendor_specific_reply(
@@ -391,7 +392,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    }
    }


    auto& tracker = cs_trackers_[connection_handle];
    auto& tracker = cs_trackers_[connection_handle];
    start_distance_measurement_with_cs(tracker.address, connection_handle, tracker.interval_ms);
    start_distance_measurement_with_cs(tracker.address, connection_handle);
  }
  }


  void send_read_rssi(const Address& address, uint16_t connection_handle) {
  void send_read_rssi(const Address& address, uint16_t connection_handle) {
@@ -542,14 +543,12 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    }
    }
    uint16_t connection_handle = event_view.GetConnectionHandle();
    uint16_t connection_handle = event_view.GetConnectionHandle();
    send_le_cs_set_default_settings(event_view.GetConnectionHandle());
    send_le_cs_set_default_settings(event_view.GetConnectionHandle());
    if (cs_trackers_.find(connection_handle) == cs_trackers_.end()) {
    if (cs_trackers_.find(connection_handle) != cs_trackers_.end() &&
      // Create a cs tracker with role reflector
        cs_trackers_[connection_handle].local_start) {
      // TODO: Check ROLE via CS config. (b/304295768)
      send_le_cs_security_enable(connection_handle);
      cs_trackers_[connection_handle].role = CsRole::REFLECTOR;
    } else {
      // TODO(b/361567359): problematic? HACK_ may not get the identity address for sure.
      // TODO(b/361567359): problematic? HACK_ may not get the identity address for sure.
      cs_trackers_[connection_handle].address = acl_manager_->HACK_GetLeAddress(connection_handle);
      cs_trackers_[connection_handle].address = acl_manager_->HACK_GetLeAddress(connection_handle);
    } else {
      send_le_cs_security_enable(connection_handle);
    }
    }


    if (event_view.GetOptionalSubfeaturesSupported().phase_based_ranging_ == 0x01) {
    if (event_view.GetOptionalSubfeaturesSupported().phase_based_ranging_ == 0x01) {
@@ -592,7 +591,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    cs_trackers_[connection_handle].setup_complete = true;
    cs_trackers_[connection_handle].setup_complete = true;
    log::info("Setup phase complete, connection_handle: {}, address: {}", connection_handle,
    log::info("Setup phase complete, connection_handle: {}, address: {}", connection_handle,
              cs_trackers_[connection_handle].address);
              cs_trackers_[connection_handle].address);
    if (cs_trackers_[connection_handle].role == CsRole::INITIATOR) {
    if (cs_trackers_[connection_handle].local_start) {
      send_le_cs_create_config(connection_handle);
      send_le_cs_create_config(connection_handle);
    }
    }
  }
  }
@@ -621,7 +620,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    cs_trackers_[connection_handle].sub_mode_type = event_view.GetSubModeType();
    cs_trackers_[connection_handle].sub_mode_type = event_view.GetSubModeType();
    cs_trackers_[connection_handle].rtt_type = event_view.GetRttType();
    cs_trackers_[connection_handle].rtt_type = event_view.GetRttType();


    if (cs_trackers_[connection_handle].role == CsRole::INITIATOR) {
    if (cs_trackers_[connection_handle].local_start) {
      send_le_cs_set_procedure_parameters(event_view.GetConnectionHandle());
      send_le_cs_set_procedure_parameters(event_view.GetConnectionHandle());
    }
    }
  }
  }
@@ -642,7 +641,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
      return;
      return;
    }
    }


    if (cs_trackers_[connection_handle].role == CsRole::INITIATOR) {
    if (cs_trackers_[connection_handle].local_start) {
      log::info("enable cs procedure regularly with interval: {} ms",
      log::info("enable cs procedure regularly with interval: {} ms",
                cs_trackers_[connection_handle].interval_ms);
                cs_trackers_[connection_handle].interval_ms);
      cs_trackers_[connection_handle].repeating_alarm->Cancel();
      cs_trackers_[connection_handle].repeating_alarm->Cancel();
@@ -785,7 +784,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    procedure_data->local_status = procedure_done_status;
    procedure_data->local_status = procedure_done_status;
    check_cs_procedure_complete(procedure_data, connection_handle);
    check_cs_procedure_complete(procedure_data, connection_handle);


    if (cs_trackers_[connection_handle].role == CsRole::INITIATOR) {
    if (cs_trackers_[connection_handle].local_start) {
      // Skip to send remote
      // Skip to send remote
      return;
      return;
    }
    }
@@ -1415,6 +1414,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    uint16_t local_counter;
    uint16_t local_counter;
    uint16_t remote_counter;
    uint16_t remote_counter;
    CsRole role;
    CsRole role;
    bool local_start = false;  // If the CS was started by the local device.
    bool ras_connected = false;
    bool ras_connected = false;
    bool setup_complete = false;
    bool setup_complete = false;
    bool config_set = false;
    bool config_set = false;