• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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 
17 #ifndef ANDROID_INCLUDE_BLE_SCANNER_H
18 #define ANDROID_INCLUDE_BLE_SCANNER_H
19 
20 #include <bluetooth/uuid.h>
21 #include <raw_address.h>
22 #include <stdint.h>
23 
24 #include <memory>
25 #include <vector>
26 
27 #include "bt_common_types.h"
28 #include "bt_gatt_client.h"
29 #include "bt_gatt_types.h"
30 
31 /** Callback invoked when batchscan reports are obtained */
32 typedef void (*batchscan_reports_callback)(int client_if, int status,
33                                            int report_format, int num_records,
34                                            std::vector<uint8_t> data);
35 
36 /** Callback invoked when batchscan storage threshold limit is crossed */
37 typedef void (*batchscan_threshold_callback)(int client_if);
38 
39 /** Track ADV VSE callback invoked when tracked device is found or lost */
40 typedef void (*track_adv_event_callback)(
41     btgatt_track_adv_info_t* p_track_adv_info);
42 
43 /** Callback for scan results */
44 typedef void (*scan_result_callback)(uint16_t event_type, uint8_t addr_type,
45                                      RawAddress* bda, uint8_t primary_phy,
46                                      uint8_t secondary_phy,
47                                      uint8_t advertising_sid, int8_t tx_power,
48                                      int8_t rssi, uint16_t periodic_adv_int,
49                                      std::vector<uint8_t> adv_data,
50                                      RawAddress* original_bda);
51 
52 typedef struct {
53   scan_result_callback scan_result_cb;
54   batchscan_reports_callback batchscan_reports_cb;
55   batchscan_threshold_callback batchscan_threshold_cb;
56   track_adv_event_callback track_adv_event_cb;
57 } btgatt_scanner_callbacks_t;
58 
59 class AdvertisingTrackInfo {
60  public:
61   uint8_t scanner_id;
62   uint8_t filter_index;
63   uint8_t advertiser_state;
64   uint8_t advertiser_info_present;
65   RawAddress advertiser_address;
66   uint8_t advertiser_address_type;
67   uint8_t tx_power;
68   int8_t rssi;
69   uint16_t time_stamp;
70   uint8_t adv_packet_len;
71   std::vector<uint8_t> adv_packet;
72   uint8_t scan_response_len;
73   std::vector<uint8_t> scan_response;
74 };
75 
76 /**
77  * LE Scanning related callbacks invoked from from the Bluetooth native stack
78  * All callbacks are invoked on the JNI thread
79  */
80 class ScanningCallbacks {
81  public:
82   virtual ~ScanningCallbacks() = default;
83   virtual void OnScannerRegistered(const bluetooth::Uuid app_uuid,
84                                    uint8_t scannerId, uint8_t status) = 0;
85   virtual void OnSetScannerParameterComplete(uint8_t scannerId,
86                                              uint8_t status) = 0;
87   virtual void OnScanResult(uint16_t event_type, uint8_t addr_type,
88                             RawAddress bda, uint8_t primary_phy,
89                             uint8_t secondary_phy, uint8_t advertising_sid,
90                             int8_t tx_power, int8_t rssi,
91                             uint16_t periodic_adv_int,
92                             std::vector<uint8_t> adv_data) = 0;
93   virtual void OnTrackAdvFoundLost(
94       AdvertisingTrackInfo advertising_track_info) = 0;
95   virtual void OnBatchScanReports(int client_if, int status, int report_format,
96                                   int num_records,
97                                   std::vector<uint8_t> data) = 0;
98   virtual void OnBatchScanThresholdCrossed(int client_if) = 0;
99   virtual void OnPeriodicSyncStarted(int reg_id, uint8_t status,
100                                      uint16_t sync_handle,
101                                      uint8_t advertising_sid,
102                                      uint8_t address_type, RawAddress address,
103                                      uint8_t phy, uint16_t interval) = 0;
104   virtual void OnPeriodicSyncReport(uint16_t sync_handle, int8_t tx_power,
105                                     int8_t rssi, uint8_t status,
106                                     std::vector<uint8_t> data) = 0;
107   virtual void OnPeriodicSyncLost(uint16_t sync_handle) = 0;
108   virtual void OnPeriodicSyncTransferred(int pa_source, uint8_t status,
109                                          RawAddress address) = 0;
110 };
111 
112 class BleScannerInterface {
113  public:
114   virtual ~BleScannerInterface() = default;
115 
116   using RegisterCallback =
117       base::Callback<void(uint8_t /* scanner_id */, uint8_t /* btm_status */)>;
118 
119   using Callback = base::Callback<void(uint8_t /* btm_status */)>;
120 
121   using EnableCallback =
122       base::Callback<void(uint8_t /* action */, uint8_t /* btm_status */)>;
123 
124   using FilterParamSetupCallback =
125       base::Callback<void(uint8_t /* avbl_space */, uint8_t /* action_type */,
126                           uint8_t /* btm_status */)>;
127 
128   using FilterConfigCallback =
129       base::Callback<void(uint8_t /* filt_type */, uint8_t /* avbl_space */,
130                           uint8_t /* action */, uint8_t /* btm_status */)>;
131 
132   /** Registers a scanner with the stack */
133   virtual void RegisterScanner(const bluetooth::Uuid& app_uuid,
134                                RegisterCallback) = 0;
135 
136   /** Unregister a scanner from the stack */
137   virtual void Unregister(int scanner_id) = 0;
138 
139   /** Start or stop LE device scanning */
140   virtual void Scan(bool start) = 0;
141 
142   /** Setup scan filter params */
143   virtual void ScanFilterParamSetup(
144       uint8_t client_if, uint8_t action, uint8_t filt_index,
145       std::unique_ptr<btgatt_filt_param_setup_t> filt_param,
146       FilterParamSetupCallback cb) = 0;
147 
148   /** Configure a scan filter condition  */
149   virtual void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
150                              FilterConfigCallback cb) = 0;
151 
152   /** Clear all scan filter conditions for specific filter index*/
153   virtual void ScanFilterClear(int filt_index, FilterConfigCallback cb) = 0;
154 
155   /** Enable / disable scan filter feature*/
156   virtual void ScanFilterEnable(bool enable, EnableCallback cb) = 0;
157 
158   /** Sets the LE scan interval and window in units of N*0.625 msec */
159   virtual void SetScanParameters(int scanner_id, int scan_interval,
160                                  int scan_window, Callback cb) = 0;
161 
162   /* Configure the batchscan storage */
163   virtual void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
164                                       int batch_scan_trunc_max,
165                                       int batch_scan_notify_threshold,
166                                       Callback cb) = 0;
167 
168   /* Enable batchscan */
169   virtual void BatchscanEnable(int scan_mode, int scan_interval,
170                                int scan_window, int addr_type, int discard_rule,
171                                Callback cb) = 0;
172 
173   /* Disable batchscan */
174   virtual void BatchscanDisable(Callback cb) = 0;
175 
176   /* Read out batchscan reports */
177   virtual void BatchscanReadReports(int client_if, int scan_mode) = 0;
178 
179   virtual void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
180                          uint16_t timeout, int reg_id) = 0;
181   virtual void StopSync(uint16_t handle) = 0;
182 
183   virtual void RegisterCallbacks(ScanningCallbacks* callbacks) = 0;
184 
185   virtual void CancelCreateSync(uint8_t sid, RawAddress address) = 0;
186 
187   virtual void TransferSync(RawAddress address, uint16_t service_data,
188                             uint16_t sync_handle, int pa_source) = 0;
189   virtual void TransferSetInfo(RawAddress address, uint16_t service_data,
190                                uint8_t adv_handle, int pa_source) = 0;
191   virtual void SyncTxParameters(RawAddress addr, uint8_t mode, uint16_t skip,
192                                 uint16_t timeout, int reg_id) = 0;
193 };
194 
195 #endif /* ANDROID_INCLUDE_BLE_SCANNER_H */
196