• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 #include "gd/rust/topshim/gatt/gatt_ble_advertiser_shim.h"
18 
19 #include <base/functional/bind.h>
20 #include <base/functional/callback.h>
21 
22 #include <algorithm>
23 #include <iterator>
24 #include <memory>
25 #include <vector>
26 
27 #include "bind_helpers.h"
28 #include "include/hardware/bt_common_types.h"
29 #include "rust/cxx.h"
30 #include "src/profiles/gatt.rs.h"
31 #include "types/bluetooth/uuid.h"
32 #include "types/raw_address.h"
33 
34 namespace bluetooth {
35 namespace topshim {
36 namespace rust {
37 
38 namespace rusty = ::bluetooth::topshim::rust;
39 
40 namespace internal {
ConvertRustAdvParams(const RustAdvertiseParameters & params)41 AdvertiseParameters ConvertRustAdvParams(const RustAdvertiseParameters& params) {
42   AdvertiseParameters converted = {
43       .advertising_event_properties = params.advertising_event_properties,
44       .min_interval = params.min_interval,
45       .max_interval = params.max_interval,
46       .channel_map = params.channel_map,
47       .tx_power = params.tx_power,
48       .primary_advertising_phy = params.primary_advertising_phy,
49       .secondary_advertising_phy = params.secondary_advertising_phy,
50       .scan_request_notification_enable = params.scan_request_notification_enable,
51       .own_address_type = params.own_address_type,
52   };
53 
54   return converted;
55 }
ConvertRustPeriodicAdvParams(const RustPeriodicAdvertisingParameters & params)56 PeriodicAdvertisingParameters ConvertRustPeriodicAdvParams(const RustPeriodicAdvertisingParameters& params) {
57   PeriodicAdvertisingParameters converted = {
58       .enable = params.enable,
59       .include_adi = params.include_adi,
60       .min_interval = params.min_interval,
61       .max_interval = params.max_interval,
62       .periodic_advertising_properties = params.periodic_advertising_properties,
63   };
64 
65   return converted;
66 }
67 }  // namespace internal
68 
69 // AdvertisingCallbacks implementations
70 
OnAdvertisingSetStarted(int reg_id,uint8_t advertiser_id,int8_t tx_power,uint8_t status)71 void BleAdvertiserIntf::OnAdvertisingSetStarted(int reg_id, uint8_t advertiser_id, int8_t tx_power, uint8_t status) {
72   rusty::gdadv_on_advertising_set_started(reg_id, advertiser_id, tx_power, status);
73 }
OnAdvertisingEnabled(uint8_t advertiser_id,bool enable,uint8_t status)74 void BleAdvertiserIntf::OnAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) {
75   rusty::gdadv_on_advertising_enabled(advertiser_id, enable, status);
76 }
OnAdvertisingDataSet(uint8_t advertiser_id,uint8_t status)77 void BleAdvertiserIntf::OnAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
78   rusty::gdadv_on_advertising_data_set(advertiser_id, status);
79 }
OnScanResponseDataSet(uint8_t advertiser_id,uint8_t status)80 void BleAdvertiserIntf::OnScanResponseDataSet(uint8_t advertiser_id, uint8_t status) {
81   rusty::gdadv_on_scan_response_data_set(advertiser_id, status);
82 }
OnAdvertisingParametersUpdated(uint8_t advertiser_id,int8_t tx_power,uint8_t status)83 void BleAdvertiserIntf::OnAdvertisingParametersUpdated(uint8_t advertiser_id, int8_t tx_power, uint8_t status) {
84   rusty::gdadv_on_advertising_parameters_updated(advertiser_id, tx_power, status);
85 }
OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id,uint8_t status)86 void BleAdvertiserIntf::OnPeriodicAdvertisingParametersUpdated(uint8_t advertiser_id, uint8_t status) {
87   rusty::gdadv_on_periodic_advertising_parameters_updated(advertiser_id, status);
88 }
OnPeriodicAdvertisingDataSet(uint8_t advertiser_id,uint8_t status)89 void BleAdvertiserIntf::OnPeriodicAdvertisingDataSet(uint8_t advertiser_id, uint8_t status) {
90   rusty::gdadv_on_periodic_advertising_data_set(advertiser_id, status);
91 }
OnPeriodicAdvertisingEnabled(uint8_t advertiser_id,bool enable,uint8_t status)92 void BleAdvertiserIntf::OnPeriodicAdvertisingEnabled(uint8_t advertiser_id, bool enable, uint8_t status) {
93   rusty::gdadv_on_periodic_advertising_enabled(advertiser_id, enable, status);
94 }
OnOwnAddressRead(uint8_t advertiser_id,uint8_t address_type,RawAddress addr)95 void BleAdvertiserIntf::OnOwnAddressRead(uint8_t advertiser_id, uint8_t address_type, RawAddress addr) {
96   rusty::gdadv_on_own_address_read(advertiser_id, address_type, &addr);
97 }
98 
99 // BleAdvertiserInterface implementations
100 
RegisterAdvertiser()101 void BleAdvertiserIntf::RegisterAdvertiser() {
102   adv_intf_->RegisterAdvertiser(base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this)));
103 }
104 
Unregister(uint8_t adv_id)105 void BleAdvertiserIntf::Unregister(uint8_t adv_id) {
106   adv_intf_->Unregister(adv_id);
107 }
108 
GetOwnAddress(uint8_t adv_id)109 void BleAdvertiserIntf::GetOwnAddress(uint8_t adv_id) {
110   adv_intf_->GetOwnAddress(
111       adv_id, base::Bind(&BleAdvertiserIntf::OnGetAddressCallback, base::Unretained(this), adv_id));
112 }
113 
SetParameters(uint8_t adv_id,RustAdvertiseParameters params)114 void BleAdvertiserIntf::SetParameters(uint8_t adv_id, RustAdvertiseParameters params) {
115   AdvertiseParameters converted = internal::ConvertRustAdvParams(params);
116   adv_intf_->SetParameters(
117       adv_id, converted, base::Bind(&BleAdvertiserIntf::OnParametersCallback, base::Unretained(this), adv_id));
118 }
119 
SetData(uint8_t adv_id,bool set_scan_rsp,::rust::Vec<uint8_t> data)120 void BleAdvertiserIntf::SetData(uint8_t adv_id, bool set_scan_rsp, ::rust::Vec<uint8_t> data) {
121   std::vector<uint8_t> converted;
122   std::copy(data.begin(), data.end(), std::back_inserter(converted));
123 
124   adv_intf_->SetData(
125       adv_id,
126       set_scan_rsp,
127       converted,
128       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
129 }
130 
Enable(uint8_t adv_id,bool enable,uint16_t duration,uint8_t max_ext_adv_events)131 void BleAdvertiserIntf::Enable(uint8_t adv_id, bool enable, uint16_t duration, uint8_t max_ext_adv_events) {
132   adv_intf_->Enable(
133       adv_id,
134       enable,
135       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id),
136       duration,
137       max_ext_adv_events,
138       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
139 }
140 
StartAdvertising(uint8_t adv_id,RustAdvertiseParameters params,::rust::Vec<uint8_t> advertise_data,::rust::Vec<uint8_t> scan_response_data,int32_t timeout_in_sec)141 void BleAdvertiserIntf::StartAdvertising(
142     uint8_t adv_id,
143     RustAdvertiseParameters params,
144     ::rust::Vec<uint8_t> advertise_data,
145     ::rust::Vec<uint8_t> scan_response_data,
146     int32_t timeout_in_sec) {
147   AdvertiseParameters converted_params = internal::ConvertRustAdvParams(params);
148   std::vector<uint8_t> converted_adv_data, converted_scan_rsp_data;
149   std::copy(advertise_data.begin(), advertise_data.end(), std::back_inserter(converted_adv_data));
150   std::copy(scan_response_data.begin(), scan_response_data.end(), std::back_inserter(converted_scan_rsp_data));
151 
152   adv_intf_->StartAdvertising(
153       adv_id,
154       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id),
155       converted_params,
156       converted_adv_data,
157       converted_scan_rsp_data,
158       timeout_in_sec,
159       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
160 }
161 
StartAdvertisingSet(int32_t reg_id,RustAdvertiseParameters params,::rust::Vec<uint8_t> advertise_data,::rust::Vec<uint8_t> scan_response_data,RustPeriodicAdvertisingParameters periodic_params,::rust::Vec<uint8_t> periodic_data,uint16_t duration,uint8_t max_ext_adv_events)162 void BleAdvertiserIntf::StartAdvertisingSet(
163     int32_t reg_id,
164     RustAdvertiseParameters params,
165     ::rust::Vec<uint8_t> advertise_data,
166     ::rust::Vec<uint8_t> scan_response_data,
167     RustPeriodicAdvertisingParameters periodic_params,
168     ::rust::Vec<uint8_t> periodic_data,
169     uint16_t duration,
170     uint8_t max_ext_adv_events) {
171   AdvertiseParameters converted_params = internal::ConvertRustAdvParams(params);
172   PeriodicAdvertisingParameters converted_periodic_params = internal::ConvertRustPeriodicAdvParams(periodic_params);
173   std::vector<uint8_t> converted_adv_data, converted_scan_rsp_data, converted_periodic_data;
174   std::copy(advertise_data.begin(), advertise_data.end(), std::back_inserter(converted_adv_data));
175   std::copy(scan_response_data.begin(), scan_response_data.end(), std::back_inserter(converted_scan_rsp_data));
176   std::copy(periodic_data.begin(), periodic_data.end(), std::back_inserter(converted_periodic_data));
177 
178   adv_intf_->StartAdvertisingSet(
179       reg_id,
180       base::Bind(&BleAdvertiserIntf::OnIdTxPowerStatusCallback, base::Unretained(this)),
181       converted_params,
182       converted_adv_data,
183       converted_scan_rsp_data,
184       converted_periodic_params,
185       converted_periodic_data,
186       duration,
187       max_ext_adv_events,
188       base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this)));
189 }
190 
SetPeriodicAdvertisingParameters(uint8_t adv_id,RustPeriodicAdvertisingParameters params)191 void BleAdvertiserIntf::SetPeriodicAdvertisingParameters(uint8_t adv_id, RustPeriodicAdvertisingParameters params) {
192   PeriodicAdvertisingParameters converted = internal::ConvertRustPeriodicAdvParams(params);
193 
194   adv_intf_->SetPeriodicAdvertisingParameters(
195       adv_id, converted, base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
196 }
197 
SetPeriodicAdvertisingData(uint8_t adv_id,::rust::Vec<uint8_t> data)198 void BleAdvertiserIntf::SetPeriodicAdvertisingData(uint8_t adv_id, ::rust::Vec<uint8_t> data) {
199   std::vector<uint8_t> converted;
200   std::copy(data.begin(), data.end(), std::back_inserter(converted));
201 
202   adv_intf_->SetPeriodicAdvertisingData(
203       adv_id, converted, base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
204 }
205 
SetPeriodicAdvertisingEnable(uint8_t adv_id,bool enable,bool include_adi)206 void BleAdvertiserIntf::SetPeriodicAdvertisingEnable(uint8_t adv_id, bool enable, bool include_adi) {
207   adv_intf_->SetPeriodicAdvertisingEnable(
208       adv_id, enable, include_adi, base::Bind(&BleAdvertiserIntf::OnIdStatusCallback, base::Unretained(this), adv_id));
209 }
210 
RegisterCallbacks()211 void BleAdvertiserIntf::RegisterCallbacks() {
212   adv_intf_->RegisterCallbacks(this);
213 }
214 
215 // Inband callbacks
216 
OnIdStatusCallback(uint8_t adv_id,uint8_t status)217 void BleAdvertiserIntf::OnIdStatusCallback(uint8_t adv_id, uint8_t status) {
218   gdadv_idstatus_callback(adv_id, status);
219 }
OnIdTxPowerStatusCallback(uint8_t adv_id,int8_t tx_power,uint8_t status)220 void BleAdvertiserIntf::OnIdTxPowerStatusCallback(uint8_t adv_id, int8_t tx_power, uint8_t status) {
221   gdadv_idtxpowerstatus_callback(adv_id, tx_power, status);
222 }
OnParametersCallback(uint8_t adv_id,uint8_t status,int8_t tx_power)223 void BleAdvertiserIntf::OnParametersCallback(uint8_t adv_id, uint8_t status, int8_t tx_power) {
224   gdadv_parameters_callback(adv_id, status, tx_power);
225 }
OnGetAddressCallback(uint8_t adv_id,uint8_t addr_type,RawAddress addr)226 void BleAdvertiserIntf::OnGetAddressCallback(uint8_t adv_id, uint8_t addr_type, RawAddress addr) {
227   gdadv_getaddress_callback(adv_id, addr_type, &addr);
228 }
229 
GetBleAdvertiserIntf(const unsigned char * gatt_intf)230 std::unique_ptr<BleAdvertiserIntf> GetBleAdvertiserIntf(const unsigned char* gatt_intf) {
231   return std::make_unique<BleAdvertiserIntf>(reinterpret_cast<const btgatt_interface_t*>(gatt_intf)->advertiser);
232 }
233 
234 }  // namespace rust
235 }  // namespace topshim
236 }  // namespace bluetooth
237