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 <stdint.h>
21 #include <vector>
22 #include "bt_common_types.h"
23 #include "bt_gatt_client.h"
24 #include "bt_gatt_types.h"
25 
26 /** Callback invoked when batchscan reports are obtained */
27 typedef void (*batchscan_reports_callback)(int client_if, int status,
28                                            int report_format, int num_records,
29                                            std::vector<uint8_t> data);
30 
31 /** Callback invoked when batchscan storage threshold limit is crossed */
32 typedef void (*batchscan_threshold_callback)(int client_if);
33 
34 /** Track ADV VSE callback invoked when tracked device is found or lost */
35 typedef void (*track_adv_event_callback)(
36     btgatt_track_adv_info_t* p_track_adv_info);
37 
38 /** Callback for scan results */
39 typedef void (*scan_result_callback)(uint16_t event_type, uint8_t addr_type,
40                                      RawAddress* bda, uint8_t primary_phy,
41                                      uint8_t secondary_phy,
42                                      uint8_t advertising_sid, int8_t tx_power,
43                                      int8_t rssi, uint16_t periodic_adv_int,
44                                      std::vector<uint8_t> adv_data);
45 
46 typedef struct {
47   scan_result_callback scan_result_cb;
48   batchscan_reports_callback batchscan_reports_cb;
49   batchscan_threshold_callback batchscan_threshold_cb;
50   track_adv_event_callback track_adv_event_cb;
51 } btgatt_scanner_callbacks_t;
52 
53 class BleScannerInterface {
54  public:
55   virtual ~BleScannerInterface() = default;
56 
57   using RegisterCallback =
58       base::Callback<void(uint8_t /* scanner_id */, uint8_t /* status */)>;
59 
60   using Callback = base::Callback<void(uint8_t /* status */)>;
61 
62   using EnableCallback =
63       base::Callback<void(uint8_t /* action */, uint8_t /* status */)>;
64 
65   using FilterParamSetupCallback =
66       base::Callback<void(uint8_t /* avbl_space */, uint8_t /* action_type */,
67                           uint8_t /* status */)>;
68 
69   using FilterConfigCallback =
70       base::Callback<void(uint8_t /* filt_type */, uint8_t /* avbl_space */,
71                           uint8_t /* action */, uint8_t /* status */)>;
72 
73   /** Registers a scanner with the stack */
74   virtual void RegisterScanner(RegisterCallback) = 0;
75 
76   /** Unregister a scanner from the stack */
77   virtual void Unregister(int scanner_id) = 0;
78 
79   /** Start or stop LE device scanning */
80   virtual void Scan(bool start) = 0;
81 
82   /** Setup scan filter params */
83   virtual void ScanFilterParamSetup(
84       uint8_t client_if, uint8_t action, uint8_t filt_index,
85       std::unique_ptr<btgatt_filt_param_setup_t> filt_param,
86       FilterParamSetupCallback cb) = 0;
87 
88   /** Configure a scan filter condition  */
89   virtual void ScanFilterAdd(int filter_index, std::vector<ApcfCommand> filters,
90                              FilterConfigCallback cb) = 0;
91 
92   /** Clear all scan filter conditions for specific filter index*/
93   virtual void ScanFilterClear(int filt_index, FilterConfigCallback cb) = 0;
94 
95   /** Enable / disable scan filter feature*/
96   virtual void ScanFilterEnable(bool enable, EnableCallback cb) = 0;
97 
98   /** Sets the LE scan interval and window in units of N*0.625 msec */
99   virtual void SetScanParameters(int scan_interval, int scan_window,
100                                  Callback cb) = 0;
101 
102   /* Configure the batchscan storage */
103   virtual void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
104                                       int batch_scan_trunc_max,
105                                       int batch_scan_notify_threshold,
106                                       Callback cb) = 0;
107 
108   /* Enable batchscan */
109   virtual void BatchscanEnable(int scan_mode, int scan_interval,
110                                int scan_window, int addr_type, int discard_rule,
111                                Callback cb) = 0;
112 
113   /* Disable batchscan */
114   virtual void BatchscanDisable(Callback cb) = 0;
115 
116   /* Read out batchscan reports */
117   virtual void BatchscanReadReports(int client_if, int scan_mode) = 0;
118 
119   using StartSyncCb =
120       base::Callback<void(uint8_t status, uint16_t sync_handle,
121                           uint8_t advertising_sid, uint8_t address_type,
122                           RawAddress address, uint8_t phy, uint16_t interval)>;
123   using SyncReportCb =
124       base::Callback<void(uint16_t sync_handle, int8_t tx_power, int8_t rssi,
125                           uint8_t status, std::vector<uint8_t> data)>;
126   using SyncLostCb = base::Callback<void(uint16_t sync_handle)>;
127   virtual void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
128                          uint16_t timeout, StartSyncCb start_cb,
129                          SyncReportCb report_cb, SyncLostCb lost_cb) = 0;
130   virtual void StopSync(uint16_t handle) = 0;
131 };
132 
133 #endif /* ANDROID_INCLUDE_BLE_SCANNER_H */