1 /*
2  * Copyright 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 "address.h"
21 #include "hal/ranging_hal.h"
22 #include "hci/hci_packets.h"
23 #include "module.h"
24 
25 namespace bluetooth {
26 namespace hci {
27 
28 enum DistanceMeasurementMethod {
29   METHOD_AUTO,
30   METHOD_RSSI,
31   METHOD_CS,
32 };
33 
34 enum DistanceMeasurementErrorCode {
35   REASON_FEATURE_NOT_SUPPORTED_LOCAL,
36   REASON_FEATURE_NOT_SUPPORTED_REMOTE,
37   REASON_LOCAL_REQUEST,
38   REASON_REMOTE_REQUEST,
39   REASON_DURATION_TIMEOUT,
40   REASON_NO_LE_CONNECTION,
41   REASON_INVALID_PARAMETERS,
42   REASON_INTERNAL_ERROR,
43 };
44 
45 struct DistanceMeasurementResult {
46   Address address;
47   uint32_t centimeter;
48   uint32_t error_centimeter;
49   DistanceMeasurementMethod method;
50 };
51 
52 class DistanceMeasurementCallbacks {
53 public:
54   virtual ~DistanceMeasurementCallbacks() = default;
55   virtual void OnDistanceMeasurementStarted(Address address, DistanceMeasurementMethod method) = 0;
56   virtual void OnDistanceMeasurementStopped(Address address, DistanceMeasurementErrorCode reason,
57                                             DistanceMeasurementMethod method) = 0;
58   virtual void OnDistanceMeasurementResult(Address address, uint32_t centimeter,
59                                            uint32_t error_centimeter, int azimuth_angle,
60                                            int error_azimuth_angle, int altitude_angle,
61                                            int error_altitude_angle, uint64_t elapsedRealtimeNanos,
62                                            int8_t confidence_level,
63                                            DistanceMeasurementMethod method) = 0;
64   virtual void OnRasFragmentReady(Address address, uint16_t procedure_counter, bool is_last,
65                                   std::vector<uint8_t> raw_data) = 0;
66   virtual void OnVendorSpecificCharacteristics(
67           std::vector<hal::VendorSpecificCharacteristic> vendor_specific_characteristics) = 0;
68   virtual void OnVendorSpecificReply(Address address,
69                                      std::vector<bluetooth::hal::VendorSpecificCharacteristic>
70                                              vendor_specific_characteristics) = 0;
71   virtual void OnHandleVendorSpecificReplyComplete(Address address, bool success) = 0;
72 };
73 
74 class DistanceMeasurementManager : public bluetooth::Module {
75 public:
76   DistanceMeasurementManager();
77   ~DistanceMeasurementManager();
78   DistanceMeasurementManager(const DistanceMeasurementManager&) = delete;
79   DistanceMeasurementManager& operator=(const DistanceMeasurementManager&) = delete;
80 
81   void RegisterDistanceMeasurementCallbacks(DistanceMeasurementCallbacks* callbacks);
82   void StartDistanceMeasurement(const Address&, uint16_t connection_handle,
83                                 hci::Role local_hci_role, uint16_t interval,
84                                 DistanceMeasurementMethod method);
85   void StopDistanceMeasurement(const Address& address, uint16_t connection_handle,
86                                DistanceMeasurementMethod method);
87   void HandleRasClientConnectedEvent(
88           const Address& address, uint16_t connection_handle, uint16_t att_handle,
89           const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_data,
90           uint16_t conn_interval);
91   void HandleRasClientDisconnectedEvent(const Address& address);
92   void HandleVendorSpecificReply(
93           const Address& address, uint16_t connection_handle,
94           const std::vector<hal::VendorSpecificCharacteristic>& vendor_specific_reply);
95   void HandleRasServerConnected(const Address& identity_address, uint16_t connection_handle,
96                                 hci::Role local_hci_role);
97   void HandleRasServerDisconnected(const Address& identity_address, uint16_t connection_handle);
98   void HandleVendorSpecificReplyComplete(const Address& address, uint16_t connection_handle,
99                                          bool success);
100   void HandleRemoteData(const Address& address, uint16_t connection_handle,
101                         const std::vector<uint8_t>& raw_data);
102   void HandleRemoteDataTimeout(const Address& address, uint16_t connection_handle);
103   void HandleConnIntervalUpdated(const Address& address, uint16_t connection_handle,
104                                  uint16_t conn_interval);
105 
106   static const ModuleFactory Factory;
107 
108 protected:
109   void ListDependencies(ModuleList* list) const override;
110 
111   void Start() override;
112 
113   void Stop() override;
114 
115   std::string ToString() const override;
116 
117 private:
118   struct impl;
119   std::unique_ptr<impl> pimpl_;
120 };
121 
122 }  // namespace hci
123 }  // namespace bluetooth
124 
125 namespace std {
126 template <>
127 struct formatter<bluetooth::hci::DistanceMeasurementMethod>
128     : enum_formatter<bluetooth::hci::DistanceMeasurementMethod> {};
129 }  // namespace std
130