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

Commit cdb71885 authored by Chienyuan Huang's avatar Chienyuan Huang
Browse files

CS: Write raw data to HAL

Bug: 338259287
Bug: 324185011
Test: m com.android.btservices
Change-Id: I372e91db1122893d1f9a84f7aa7591b8c4b9f9d6
parent f81b9877
Loading
Loading
Loading
Loading
+27 −7
Original line number Diff line number Diff line
@@ -469,14 +469,16 @@ public class DistanceMeasurementManager {
                        + BluetoothUtils.toAnonymizedAddress(address)
                        + ", centimeter "
                        + centimeter);
        switch (method) {
            case DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_RSSI:
        DistanceMeasurementResult result =
                        new DistanceMeasurementResult.Builder(
                                        centimeter / 100.0, errorCentimeter / 100.0)
                new DistanceMeasurementResult.Builder(centimeter / 100.0, errorCentimeter / 100.0)
                        .build();
        switch (method) {
            case DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_RSSI:
                handleRssiResult(address, result);
                break;
            case DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_CHANNEL_SOUNDING:
                handleCsResult(address, result);
                break;
            default:
                Log.w(TAG, "onDistanceMeasurementResult: invalid method " + method);
        }
@@ -489,10 +491,28 @@ public class DistanceMeasurementManager {
            return;
        }
        for (DistanceMeasurementTracker tracker : set) {
            if (!tracker.mStarted) {
                    continue;
            }
            try {
                tracker.mCallback.onResult(tracker.mDevice, result);
            } catch (RemoteException e) {
                Log.e(TAG, "Exception: " + e);
            }
        }
    }

    void handleCsResult(String address, DistanceMeasurementResult result) {
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mCsTrackers.get(address);
        if (set == null) {
            Log.w(TAG, "Can't find cs tracker");
            return;
        }
        for (DistanceMeasurementTracker tracker : set) {
            if (!tracker.mStarted) {
                continue;
            }
            try {
                tracker.mCallback.onResult(tracker.mDevice, result);
            } catch (RemoteException e) {
                Log.e(TAG, "Exception: " + e);
+17 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

#pragma once

#include <complex>

#include "module.h"

namespace bluetooth {
@@ -26,6 +28,19 @@ struct VendorSpecificCharacteristic {
  std::vector<uint8_t> value_;
};

struct ChannelSoundingRawData {
  uint8_t num_antenna_paths_;
  std::vector<uint8_t> step_channel_;
  std::vector<std::vector<std::complex<double>>> tone_pct_initiator_;
  std::vector<std::vector<std::complex<double>>> tone_pct_reflector_;
  std::vector<std::vector<uint8_t>> tone_quality_indicator_initiator_;
  std::vector<std::vector<uint8_t>> tone_quality_indicator_reflector_;
};

struct RangingResult {
  double result_meters_;
};

class RangingHalCallback {
 public:
  virtual ~RangingHalCallback() = default;
@@ -34,6 +49,7 @@ class RangingHalCallback {
      const std::vector<VendorSpecificCharacteristic>& vendor_specific_reply) = 0;
  virtual void OnOpenFailed(uint16_t connection_handle) = 0;
  virtual void OnHandleVendorSpecificReplyComplete(uint16_t connection_handle, bool success) = 0;
  virtual void OnResult(uint16_t connection_handle, const RangingResult& ranging_result) = 0;
};

class RangingHal : public ::bluetooth::Module {
@@ -51,6 +67,7 @@ class RangingHal : public ::bluetooth::Module {
  virtual void HandleVendorSpecificReply(
      uint16_t connection_handle,
      const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply) = 0;
  virtual void WriteRawData(uint16_t connection_handle, const ChannelSoundingRawData& raw_data) = 0;
};

}  // namespace hal
+43 −0
Original line number Diff line number Diff line
@@ -76,8 +76,12 @@ class BluetoothChannelSoundingSessionTracker : public BnBluetoothChannelSounding
  ::ndk::ScopedAStatus onResult(
      const ::aidl::android::hardware::bluetooth::ranging::RangingResult& in_result) {
    log::verbose("resultMeters {}", in_result.resultMeters);
    hal::RangingResult ranging_result;
    ranging_result.result_meters_ = in_result.resultMeters;
    ranging_hal_callback_->OnResult(connection_handle_, ranging_result);
    return ::ndk::ScopedAStatus::ok();
  };

  ::ndk::ScopedAStatus onClose(::aidl::android::hardware::bluetooth::ranging::Reason in_reason) {
    log::info("reason {}", (uint16_t)in_reason);
    bluetooth_channel_sounding_session_ = nullptr;
@@ -185,6 +189,45 @@ class RangingHalAndroid : public RangingHal {
    bluetooth_channel_sounding_->openSession(parameters, tracker, &tracker->GetSession());
  }

  void WriteRawData(uint16_t connection_handle, const ChannelSoundingRawData& raw_data) {
    if (session_trackers_.find(connection_handle) == session_trackers_.end()) {
      log::error("Can't find session for connection_handle:0x{:04x}", connection_handle);
      return;
    } else if (session_trackers_[connection_handle]->GetSession() == nullptr) {
      log::error("Session not opened");
      return;
    }

    ChannelSoudingRawData hal_raw_data;
    hal_raw_data.numAntennaPaths = raw_data.num_antenna_paths_;
    hal_raw_data.stepChannels = raw_data.step_channel_;
    hal_raw_data.initiatorData.stepTonePcts.emplace(std::vector<std::optional<StepTonePct>>{});
    hal_raw_data.reflectorData.stepTonePcts.emplace(std::vector<std::optional<StepTonePct>>{});
    for (uint8_t i = 0; i < raw_data.tone_pct_initiator_.size(); i++) {
      StepTonePct step_tone_pct;
      for (uint8_t j = 0; j < raw_data.tone_pct_initiator_[i].size(); j++) {
        ComplexNumber complex_number;
        complex_number.imaginary = raw_data.tone_pct_initiator_[i][j].imag();
        complex_number.real = raw_data.tone_pct_initiator_[i][j].real();
        step_tone_pct.tonePcts.emplace_back(complex_number);
      }
      step_tone_pct.toneQualityIndicator = raw_data.tone_quality_indicator_initiator_[i];
      hal_raw_data.initiatorData.stepTonePcts.value().emplace_back(step_tone_pct);
    }
    for (uint8_t i = 0; i < raw_data.tone_pct_reflector_.size(); i++) {
      StepTonePct step_tone_pct;
      for (uint8_t j = 0; j < raw_data.tone_pct_reflector_[i].size(); j++) {
        ComplexNumber complex_number;
        complex_number.imaginary = raw_data.tone_pct_reflector_[i][j].imag();
        complex_number.real = raw_data.tone_pct_reflector_[i][j].real();
        step_tone_pct.tonePcts.emplace_back(complex_number);
      }
      step_tone_pct.toneQualityIndicator = raw_data.tone_quality_indicator_reflector_[i];
      hal_raw_data.reflectorData.stepTonePcts.value().emplace_back(step_tone_pct);
    }
    session_trackers_[connection_handle]->GetSession()->writeRawData(hal_raw_data);
  };

  void CopyVendorSpecificData(
      const std::vector<hal::VendorSpecificCharacteristic>& source,
      std::optional<std::vector<std::optional<VendorSpecificData>>>& dist) {
+4 −1
Original line number Diff line number Diff line
@@ -39,10 +39,13 @@ class RangingHalHost : public RangingHal {
      uint16_t /* att_handle */,
      const std::vector<hal::VendorSpecificCharacteristic>& /* vendor_specific_data */) override{};

  virtual void HandleVendorSpecificReply(
  void HandleVendorSpecificReply(
      uint16_t /* connection_handle */,
      const std::vector<hal::VendorSpecificCharacteristic>& /* vendor_specific_reply */) override{};

  void WriteRawData(
      uint16_t /* connection_handle */, const ChannelSoundingRawData& /* raw_data */) override{};

 protected:
  void ListDependencies(ModuleList* /*list*/) const {}

+36 −1
Original line number Diff line number Diff line
@@ -178,6 +178,26 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
        cs_trackers_[connection_handle].address, success);
  }

  void OnResult(uint16_t connection_handle, const bluetooth::hal::RangingResult& ranging_result) {
    if (cs_trackers_.find(connection_handle) == cs_trackers_.end()) {
      log::warn("Can't find CS tracker for connection_handle {}", connection_handle);
      return;
    }
    log::debug(
        "address {}, resultMeters {}",
        cs_trackers_[connection_handle].address,
        ranging_result.result_meters_);
    distance_measurement_callbacks_->OnDistanceMeasurementResult(
        cs_trackers_[connection_handle].address,
        ranging_result.result_meters_ * 100,
        0.0,
        -1,
        -1,
        -1,
        -1,
        DistanceMeasurementMethod::METHOD_CS);
  }

  ~impl() {}
  void start(
      os::Handler* handler,
@@ -347,7 +367,7 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
    log::info(
        "address:{}, connection_handle 0x{:04x}, att_handle 0x{:04x}, size of "
        "vendor_specific_data {}",
        address.ToString().c_str(),
        address,
        connection_handle,
        att_handle,
        vendor_specific_data.size());
@@ -1178,6 +1198,21 @@ struct DistanceMeasurementManager::impl : bluetooth::hal::RangingHalCallback {
          (uint16_t)procedure_data->step_channel.size(),
          (uint16_t)cs_trackers_[connection_handle].main_mode_type,
          (uint16_t)cs_trackers_[connection_handle].sub_mode_type);

      if (ranging_hal_->IsBound()) {
        // Use algorithm in the HAL
        bluetooth::hal::ChannelSoundingRawData raw_data;
        raw_data.num_antenna_paths_ = procedure_data->num_antenna_paths;
        raw_data.step_channel_ = procedure_data->step_channel;
        raw_data.tone_pct_initiator_ = procedure_data->tone_pct_initiator;
        raw_data.tone_quality_indicator_initiator_ =
            procedure_data->tone_quality_indicator_initiator;
        raw_data.tone_pct_reflector_ = procedure_data->tone_pct_reflector;
        raw_data.tone_quality_indicator_reflector_ =
            procedure_data->tone_quality_indicator_reflector;
        ranging_hal_->WriteRawData(connection_handle, raw_data);
        return;
      }
    }

    // If the procedure is completed or aborted, delete all previous data