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