1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include <bluetooth/log.h> 19 20 #include "bta/include/bta_ras_api.h" 21 #include "hal/ranging_hal.h" 22 #include "hci/address.h" 23 #include "hci/hci_packets.h" 24 #include "module.h" 25 26 namespace bluetooth { 27 namespace hci { 28 29 enum DistanceMeasurementMethod { 30 METHOD_AUTO, 31 METHOD_RSSI, 32 METHOD_CS, 33 }; 34 35 enum DistanceMeasurementErrorCode { 36 REASON_FEATURE_NOT_SUPPORTED_LOCAL, 37 REASON_FEATURE_NOT_SUPPORTED_REMOTE, 38 REASON_LOCAL_REQUEST, 39 REASON_REMOTE_REQUEST, 40 REASON_DURATION_TIMEOUT, 41 REASON_NO_LE_CONNECTION, 42 REASON_INVALID_PARAMETERS, 43 REASON_INTERNAL_ERROR, 44 }; 45 46 enum DistanceMeasurementDetectedAttackLevel { 47 NADM_ATTACK_IS_EXTREMELY_UNLIKELY = 0, 48 NADM_ATTACK_IS_VERY_UNLIKELY = 1, 49 NADM_ATTACK_IS_UNLIKELY = 2, 50 NADM_ATTACK_IS_POSSIBLE = 3, 51 NADM_ATTACK_IS_LIKELY = 4, 52 NADM_ATTACK_IS_VERY_LIKELY = 5, 53 NADM_ATTACK_IS_EXTREMELY_LIKELY = 6, 54 NADM_ATTACK_UNKNOWN = 0xFF, 55 }; 56 57 class DistanceMeasurementCallbacks { 58 public: 59 virtual ~DistanceMeasurementCallbacks() = default; 60 virtual void OnDistanceMeasurementStarted(Address address, DistanceMeasurementMethod method) = 0; 61 virtual void OnDistanceMeasurementStopped(Address address, DistanceMeasurementErrorCode reason, 62 DistanceMeasurementMethod method) = 0; 63 virtual void OnDistanceMeasurementResult( 64 Address address, uint32_t centimeter, uint32_t error_centimeter, int azimuth_angle, 65 int error_azimuth_angle, int altitude_angle, int error_altitude_angle, 66 uint64_t elapsed_realtime_nanos, int8_t confidence_level, double delayed_spread_meters, 67 DistanceMeasurementDetectedAttackLevel detected_attack_level, 68 double velocity_meters_per_second, DistanceMeasurementMethod method) = 0; 69 virtual void OnRasFragmentReady(Address address, uint16_t procedure_counter, bool is_last, 70 std::vector<uint8_t> raw_data) = 0; 71 virtual void OnVendorSpecificCharacteristics( 72 std::vector<hal::VendorSpecificCharacteristic> vendor_specific_characteristics) = 0; 73 virtual void OnVendorSpecificReply(Address address, 74 std::vector<bluetooth::hal::VendorSpecificCharacteristic> 75 vendor_specific_characteristics) = 0; 76 virtual void OnHandleVendorSpecificReplyComplete(Address address, bool success) = 0; 77 }; 78 79 class DistanceMeasurementManager : public bluetooth::Module { 80 public: 81 DistanceMeasurementManager(); 82 ~DistanceMeasurementManager(); 83 DistanceMeasurementManager(const DistanceMeasurementManager&) = delete; 84 DistanceMeasurementManager& operator=(const DistanceMeasurementManager&) = delete; 85 86 void RegisterDistanceMeasurementCallbacks(DistanceMeasurementCallbacks* callbacks); 87 void StartDistanceMeasurement(const Address&, uint16_t connection_handle, 88 hci::Role local_hci_role, uint16_t interval, 89 DistanceMeasurementMethod method); 90 void StopDistanceMeasurement(const Address& address, uint16_t connection_handle, 91 DistanceMeasurementMethod method); 92 void HandleRasClientConnectedEvent( 93 const Address& address, uint16_t connection_handle, uint16_t att_handle, 94 const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_data, 95 uint16_t conn_interval); 96 void HandleRasClientDisconnectedEvent(const Address& address, 97 const ras::RasDisconnectReason& ras_disconnect_reason); 98 void HandleVendorSpecificReply( 99 const Address& address, uint16_t connection_handle, 100 const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply); 101 void HandleRasServerConnected(const Address& identity_address, uint16_t connection_handle, 102 hci::Role local_hci_role); 103 void HandleMtuChanged(uint16_t connection_handle, uint16_t mtu); 104 void HandleRasServerDisconnected(const Address& identity_address, uint16_t connection_handle); 105 void HandleVendorSpecificReplyComplete(const Address& address, uint16_t connection_handle, 106 bool success); 107 void HandleRemoteData(const Address& address, uint16_t connection_handle, 108 const std::vector<uint8_t>& raw_data); 109 void HandleRemoteDataTimeout(const Address& address, uint16_t connection_handle); 110 void HandleConnIntervalUpdated(const Address& address, uint16_t connection_handle, 111 uint16_t conn_interval); 112 113 static const ModuleFactory Factory; 114 115 protected: 116 void ListDependencies(ModuleList* list) const override; 117 118 void Start() override; 119 120 void Stop() override; 121 122 std::string ToString() const override; 123 124 private: 125 struct impl; 126 std::unique_ptr<impl> pimpl_; 127 }; 128 129 } // namespace hci 130 } // namespace bluetooth 131 132 namespace std { 133 template <> 134 struct formatter<bluetooth::hci::DistanceMeasurementMethod> 135 : enum_formatter<bluetooth::hci::DistanceMeasurementMethod> {}; 136 } // namespace std 137