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_ADVERTISER_H
18 #define ANDROID_INCLUDE_BLE_ADVERTISER_H
19 
20 #include <base/functional/callback_forward.h>
21 #include <stdint.h>
22 
23 #include <vector>
24 
25 #include "bt_common_types.h"
26 #include "bt_gatt_types.h"
27 #include "types/raw_address.h"
28 
29 constexpr uint8_t kAdvertiserClientIdJni = 0xff;
30 constexpr uint8_t kAdvertiserClientIdLeAudio = 0x1;
31 
32 struct AdvertiseParameters {
33   uint16_t advertising_event_properties;
34   uint32_t min_interval;
35   uint32_t max_interval;
36   uint8_t channel_map;
37   int8_t tx_power;
38   uint8_t primary_advertising_phy;
39   uint8_t secondary_advertising_phy;
40   uint8_t scan_request_notification_enable;
41   int8_t own_address_type;
42   RawAddress peer_address;
43   int8_t peer_address_type;
44   bool discoverable;
45 };
46 
47 struct PeriodicAdvertisingParameters {
48   bool enable;
49   bool include_adi;
50   uint16_t min_interval;
51   uint16_t max_interval;
52   uint16_t periodic_advertising_properties;
53 };
54 
55 /**
56  * LE Advertising related callbacks invoked from from the Bluetooth native stack
57  * All callbacks are invoked on the JNI thread
58  */
59 class AdvertisingCallbacks {
60 public:
61   virtual ~AdvertisingCallbacks() = default;
62   virtual void OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id, int8_t tx_power,
63                                        uint8_t status) = 0;
64   virtual void OnAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) = 0;
65   virtual void OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) = 0;
66   virtual void OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) = 0;
67   virtual void OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power,
68                                               uint8_t status) = 0;
69   virtual void OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id, uint8_t status) = 0;
70   virtual void OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) = 0;
71   virtual void OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) = 0;
72   virtual void OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type,
73                                 RawAddress address) = 0;
74 };
75 
76 class BleAdvertiserInterface {
77 public:
78   virtual ~BleAdvertiserInterface() = default;
79 
80   /** Callback invoked when multi-adv operation has completed */
81   using StatusCallback = base::Callback<void(uint8_t /* status */)>;
82   using IdStatusCallback = base::Callback<void(uint8_t /* advertiser_id */, uint8_t /* status */)>;
83   using IdTxPowerStatusCallback = base::Callback<void(uint8_t /* advertiser_id */,
84                                                       int8_t /* tx_power */, uint8_t /* status */)>;
85   using ParametersCallback = base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
86 
87   /** Registers an advertiser with the stack */
88   virtual void RegisterAdvertiser(IdStatusCallback) = 0;
89 
90   using GetAddressCallback =
91           base::Callback<void(uint8_t /* address_type*/, RawAddress /*address*/)>;
92   virtual void GetOwnAddress(uint8_t advertiser_id, GetAddressCallback cb) = 0;
93 
94   /* Set the parameters as per spec, user manual specified values */
95   virtual void SetParameters(uint8_t advertiser_id, AdvertiseParameters params,
96                              ParametersCallback cb) = 0;
97 
98   /* Setup the data */
99   virtual void SetData(int advertiser_id, bool set_scan_rsp, std::vector<uint8_t> data,
100                        StatusCallback cb) = 0;
101 
102   /* Enable the advertising instance */
103   virtual void Enable(uint8_t advertiser_id, bool enable, StatusCallback cb, uint16_t duration,
104                       uint8_t maxExtAdvEvents, StatusCallback timeout_cb) = 0;
105 
106   /*  Unregisters an advertiser */
107   virtual void Unregister(uint8_t advertiser_id) = 0;
108 
109   virtual void StartAdvertising(uint8_t advertiser_id, StatusCallback cb,
110                                 AdvertiseParameters params, std::vector<uint8_t> advertise_data,
111                                 std::vector<uint8_t> scan_response_data, int timeout_s,
112                                 StatusCallback timeout_cb) = 0;
113 
114   /** Start the advertising set. This include registering, setting all
115    * parameters and data, and enabling it. |register_cb| is called when the set
116    * is advertising. |timeout_cb| is called when the timeout_s have passed.
117    * |reg_id| is the callback id assigned from upper or native layer.
118    * |client_id| is the callbacks client id for jni or native layer.
119    */
120   virtual void StartAdvertisingSet(uint8_t client_id, int reg_id,
121                                    IdTxPowerStatusCallback register_cb, AdvertiseParameters params,
122                                    std::vector<uint8_t> advertise_data,
123                                    std::vector<uint8_t> scan_response_data,
124                                    PeriodicAdvertisingParameters periodic_params,
125                                    std::vector<uint8_t> periodic_data, uint16_t duration,
126                                    uint8_t maxExtAdvEvents, IdStatusCallback timeout_cb) = 0;
127 
128   virtual void SetPeriodicAdvertisingParameters(int advertiser_id,
129                                                 PeriodicAdvertisingParameters parameters,
130                                                 StatusCallback cb) = 0;
131 
132   virtual void SetPeriodicAdvertisingData(int advertiser_id, std::vector<uint8_t> data,
133                                           StatusCallback cb) = 0;
134 
135   virtual void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable, bool include_adi,
136                                             StatusCallback cb) = 0;
137   virtual void RegisterCallbacks(AdvertisingCallbacks* callbacks) = 0;
138   virtual void RegisterCallbacksNative(AdvertisingCallbacks* callbacks, uint8_t client_id) = 0;
139 };
140 
141 #endif /* ANDROID_INCLUDE_BLE_ADVERTISER_H */
142