1 /*
2 * Copyright 2019 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 "hci/facade/le_scanning_manager_facade.h"
18
19 #include <bluetooth/log.h>
20
21 #include <cstdint>
22 #include <unordered_map>
23 #include <utility>
24
25 #include "blueberry/facade/hci/le_scanning_manager_facade.grpc.pb.h"
26 #include "blueberry/facade/hci/le_scanning_manager_facade.pb.h"
27 #include "common/bidi_queue.h"
28 #include "common/bind.h"
29 #include "grpc/grpc_event_queue.h"
30 #include "hci/le_scanning_manager.h"
31 #include "packet/raw_builder.h"
32
33 namespace bluetooth {
34 namespace hci {
35 namespace facade {
36
37 using ::grpc::ServerAsyncResponseWriter;
38 using ::grpc::ServerAsyncWriter;
39 using ::grpc::ServerContext;
40 using ::grpc::ServerWriter;
41 using ::grpc::Status;
42
43 using namespace blueberry::facade::hci;
44
45 class LeScanningManagerFacadeService : public LeScanningManagerFacade::Service, ScanningCallback {
46 public:
LeScanningManagerFacadeService(LeScanningManager * le_scanning_manager,os::Handler * facade_handler)47 LeScanningManagerFacadeService(LeScanningManager* le_scanning_manager,
48 os::Handler* facade_handler)
49 : le_scanning_manager_(le_scanning_manager), facade_handler_(facade_handler) {
50 log::assert_that(le_scanning_manager_ != nullptr,
51 "assert failed: le_scanning_manager_ != nullptr");
52 log::assert_that(facade_handler_ != nullptr, "assert failed: facade_handler_ != nullptr");
53 le_scanning_manager_->RegisterScanningCallback(this);
54 }
55
RegisterScanner(::grpc::ServerContext *,const RegisterScannerRequest * request,::google::protobuf::Empty *)56 ::grpc::Status RegisterScanner(::grpc::ServerContext* /* context */,
57 const RegisterScannerRequest* request,
58 ::google::protobuf::Empty* /* response */) override {
59 uint32_t uuid_raw = request->uuid();
60 bluetooth::hci::Uuid uuid = bluetooth::hci::Uuid::From32Bit(uuid_raw);
61 le_scanning_manager_->RegisterScanner(uuid);
62 return ::grpc::Status::OK;
63 }
64
Unregister(::grpc::ServerContext *,const UnregisterRequest * request,::google::protobuf::Empty *)65 ::grpc::Status Unregister(::grpc::ServerContext* /* context */, const UnregisterRequest* request,
66 ::google::protobuf::Empty* /* response */) override {
67 le_scanning_manager_->Unregister(request->scanner_id());
68 return ::grpc::Status::OK;
69 }
70
Scan(::grpc::ServerContext *,const ScanRequest * request,::google::protobuf::Empty *)71 ::grpc::Status Scan(::grpc::ServerContext* /* context */, const ScanRequest* request,
72 ::google::protobuf::Empty* /* response */) override {
73 le_scanning_manager_->Scan(request->start());
74 return ::grpc::Status::OK;
75 }
76
SetScanParameters(::grpc::ServerContext *,const SetScanParametersRequest * request,::google::protobuf::Empty *)77 ::grpc::Status SetScanParameters(::grpc::ServerContext* /* context */,
78 const SetScanParametersRequest* request,
79 ::google::protobuf::Empty* /* response */) override {
80 auto scan_type = static_cast<hci::LeScanType>(request->scan_type());
81 le_scanning_manager_->SetScanParameters(request->scanner_id(), scan_type,
82 request->scan_interval(), request->scan_window(),
83 request->scan_phy());
84 return ::grpc::Status::OK;
85 }
86
FetchCallbackEvents(::grpc::ServerContext * context,const::google::protobuf::Empty *,::grpc::ServerWriter<ScanningCallbackMsg> * writer)87 ::grpc::Status FetchCallbackEvents(::grpc::ServerContext* context,
88 const ::google::protobuf::Empty* /* request */,
89 ::grpc::ServerWriter<ScanningCallbackMsg>* writer) override {
90 return callback_events_.RunLoop(context, writer);
91 }
92
FetchAdvertisingReports(::grpc::ServerContext * context,const::google::protobuf::Empty *,::grpc::ServerWriter<AdvertisingReportMsg> * writer)93 ::grpc::Status FetchAdvertisingReports(
94 ::grpc::ServerContext* context, const ::google::protobuf::Empty* /* request */,
95 ::grpc::ServerWriter<AdvertisingReportMsg>* writer) override {
96 return advertising_reports_.RunLoop(context, writer);
97 }
98
OnScannerRegistered(const bluetooth::hci::Uuid app_uuid,ScannerId,ScanningStatus status)99 void OnScannerRegistered(const bluetooth::hci::Uuid app_uuid, ScannerId /* scanner_id */,
100 ScanningStatus status) {
101 ScanningCallbackMsg msg;
102 msg.set_message_type(ScanningCallbackMsgType::SCANNER_REGISTERED);
103 msg.set_status(static_cast<facade::ScanningStatus>(status));
104 msg.set_data(app_uuid.As32Bit());
105 callback_events_.OnIncomingEvent(msg);
106 }
107
OnSetScannerParameterComplete(ScannerId scanner_id,ScanningStatus status)108 void OnSetScannerParameterComplete(ScannerId scanner_id, ScanningStatus status) {
109 ScanningCallbackMsg msg;
110 msg.set_message_type(ScanningCallbackMsgType::SET_SCANNER_PARAMETER_COMPLETE);
111 msg.set_status(static_cast<facade::ScanningStatus>(status));
112 msg.set_data(static_cast<uint32_t>(scanner_id));
113 callback_events_.OnIncomingEvent(msg);
114 }
115
OnScanResult(uint16_t,uint8_t address_type,Address address,uint8_t,uint8_t,uint8_t,int8_t,int8_t rssi,uint16_t,std::vector<uint8_t> advertising_data)116 void OnScanResult(uint16_t /* event_type */, uint8_t address_type, Address address,
117 uint8_t /* primary_phy */, uint8_t /* secondary_phy */,
118 uint8_t /* advertising_sid */, int8_t /* tx_power */, int8_t rssi,
119 uint16_t /* periodic_advertising_interval */,
120 std::vector<uint8_t> advertising_data) {
121 AdvertisingReportMsg advertising_report_msg;
122 std::vector<LeExtendedAdvertisingResponseRaw> advertisements;
123 LeExtendedAdvertisingResponseRaw le_extended_advertising_report;
124 le_extended_advertising_report.address_type_ = (DirectAdvertisingAddressType)address_type;
125 le_extended_advertising_report.address_ = address;
126 le_extended_advertising_report.advertising_data_ = advertising_data;
127 le_extended_advertising_report.rssi_ = rssi;
128 advertisements.push_back(le_extended_advertising_report);
129
130 auto builder = LeExtendedAdvertisingReportRawBuilder::Create(advertisements);
131 std::vector<uint8_t> bytes;
132 BitInserter bit_inserter(bytes);
133 builder->Serialize(bit_inserter);
134 advertising_report_msg.set_event(std::string(bytes.begin(), bytes.end()));
135 advertising_reports_.OnIncomingEvent(std::move(advertising_report_msg));
136 }
OnTrackAdvFoundLost(AdvertisingFilterOnFoundOnLostInfo)137 void OnTrackAdvFoundLost(AdvertisingFilterOnFoundOnLostInfo /* on_found_on_lost_info */){};
OnBatchScanReports(int,int,int,int,std::vector<uint8_t>)138 void OnBatchScanReports(int /* client_if */, int /* status */, int /* report_format */,
139 int /* num_records */, std::vector<uint8_t> /* data */) {}
OnBatchScanThresholdCrossed(int)140 void OnBatchScanThresholdCrossed(int /* client_if */) {}
OnTimeout()141 void OnTimeout() {}
OnFilterEnable(Enable,uint8_t)142 void OnFilterEnable(Enable /* enable */, uint8_t /* status */) {}
OnFilterParamSetup(uint8_t,ApcfAction,uint8_t)143 void OnFilterParamSetup(uint8_t /* available_spaces */, ApcfAction /* action */,
144 uint8_t /* status */) {}
OnFilterConfigCallback(ApcfFilterType,uint8_t,ApcfAction,uint8_t)145 void OnFilterConfigCallback(ApcfFilterType /* filter_type */, uint8_t /* available_spaces */,
146 ApcfAction /* action */, uint8_t /* status */) {}
147
OnPeriodicSyncStarted(int,uint8_t,uint16_t,uint8_t,AddressWithType,uint8_t,uint16_t)148 void OnPeriodicSyncStarted(int /* reg_id */, uint8_t /* status */, uint16_t /* sync_handle */,
149 uint8_t /* advertising_sid */, AddressWithType /* address_with_type */,
150 uint8_t /* phy */, uint16_t /* interval */) override {
151 log::info("OnPeriodicSyncStarted in LeScanningManagerFacadeService");
152 }
153
OnPeriodicSyncReport(uint16_t,int8_t,int8_t,uint8_t,std::vector<uint8_t>)154 void OnPeriodicSyncReport(uint16_t /* sync_handle */, int8_t /* tx_power */, int8_t /* rssi */,
155 uint8_t /* status */, std::vector<uint8_t> /* data */) override {
156 log::info("OnPeriodicSyncReport in LeScanningManagerFacadeService");
157 }
158
OnPeriodicSyncLost(uint16_t)159 void OnPeriodicSyncLost(uint16_t /* sync_handle */) override {
160 log::info("OnPeriodicSyncLost in LeScanningManagerFacadeService");
161 }
162
OnPeriodicSyncTransferred(int,uint8_t,Address)163 void OnPeriodicSyncTransferred(int /* pa_source */, uint8_t /* status */,
164 Address /* address */) override {
165 log::info("OnPeriodicSyncTransferred in LeScanningManagerFacadeService");
166 }
167
OnBigInfoReport(uint16_t,bool)168 void OnBigInfoReport(uint16_t /* sync_handle */, bool /* encrypted */) override {
169 log::info("OnBigInfoReport in LeScanningManagerFacadeService");
170 }
171
172 LeScanningManager* le_scanning_manager_;
173 os::Handler* facade_handler_;
174 ::bluetooth::grpc::GrpcEventQueue<AdvertisingReportMsg> advertising_reports_{
175 "advertising reports"};
176 ::bluetooth::grpc::GrpcEventQueue<ScanningCallbackMsg> callback_events_{"callback events"};
177 };
178
ListDependencies(ModuleList * list) const179 void LeScanningManagerFacadeModule::ListDependencies(ModuleList* list) const {
180 ::bluetooth::grpc::GrpcFacadeModule::ListDependencies(list);
181 list->add<hci::LeScanningManager>();
182 }
183
Start()184 void LeScanningManagerFacadeModule::Start() {
185 ::bluetooth::grpc::GrpcFacadeModule::Start();
186 service_ =
187 new LeScanningManagerFacadeService(GetDependency<hci::LeScanningManager>(), GetHandler());
188 }
189
Stop()190 void LeScanningManagerFacadeModule::Stop() {
191 delete service_;
192 ::bluetooth::grpc::GrpcFacadeModule::Stop();
193 }
194
GetService() const195 ::grpc::Service* LeScanningManagerFacadeModule::GetService() const { return service_; }
196
197 const ModuleFactory LeScanningManagerFacadeModule::Factory =
__anona48939060102() 198 ::bluetooth::ModuleFactory([]() { return new LeScanningManagerFacadeModule(); });
199
200 } // namespace facade
201 } // namespace hci
202 } // namespace bluetooth
203