Loading android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java +27 −7 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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); Loading system/gd/hal/ranging_hal.h +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #pragma once #include <complex> #include "module.h" namespace bluetooth { Loading @@ -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; Loading @@ -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 { Loading @@ -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 Loading system/gd/hal/ranging_hal_android.cc +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading system/gd/hal/ranging_hal_host.cc +4 −1 Original line number Diff line number Diff line Loading @@ -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 {} Loading system/gd/hci/distance_measurement_manager.cc +36 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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()); Loading Loading @@ -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 Loading Loading
android/app/src/com/android/bluetooth/gatt/DistanceMeasurementManager.java +27 −7 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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); Loading
system/gd/hal/ranging_hal.h +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #pragma once #include <complex> #include "module.h" namespace bluetooth { Loading @@ -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; Loading @@ -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 { Loading @@ -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 Loading
system/gd/hal/ranging_hal_android.cc +43 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
system/gd/hal/ranging_hal_host.cc +4 −1 Original line number Diff line number Diff line Loading @@ -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 {} Loading
system/gd/hci/distance_measurement_manager.cc +36 −1 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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()); Loading Loading @@ -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 Loading