blob: ce251034b01ec5ce2553e7b32c995f2c71835edf [file] [log] [blame]
Hansong Zhang29f99002019-04-24 17:25:42 +00001/*
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
Hansong Zhang90ec7402019-04-29 16:04:07 -070017#include "hal/facade.h"
Hansong Zhang29f99002019-04-24 17:25:42 +000018
Hansong Zhang90ec7402019-04-29 16:04:07 -070019#include <condition_variable>
Hansong Zhang29f99002019-04-24 17:25:42 +000020#include <memory>
21#include <mutex>
Hansong Zhang29f99002019-04-24 17:25:42 +000022
Chienyuan4adb0422019-04-25 15:11:54 -070023#include "common/blocking_queue.h"
24#include "grpc/grpc_event_stream.h"
Zach Johnson34703602019-04-29 16:45:21 -070025#include "hal/facade.grpc.pb.h"
Hansong Zhang29f99002019-04-24 17:25:42 +000026#include "hal/hci_hal.h"
Myles Watsonbadfc332019-09-04 15:37:23 -070027#include "hal/serialize_packet.h"
Hansong Zhang29f99002019-04-24 17:25:42 +000028#include "hci/hci_packets.h"
Hansong Zhang29f99002019-04-24 17:25:42 +000029
30using ::grpc::ServerAsyncResponseWriter;
31using ::grpc::ServerAsyncWriter;
Hansong Zhang29f99002019-04-24 17:25:42 +000032using ::grpc::ServerContext;
33
Zach Johnson34703602019-04-29 16:45:21 -070034using ::bluetooth::facade::EventStreamRequest;
35
Hansong Zhang29f99002019-04-24 17:25:42 +000036namespace bluetooth {
37namespace hal {
Hansong Zhang29f99002019-04-24 17:25:42 +000038
Zach Johnson34703602019-04-29 16:45:21 -070039class HciHalFacadeService
40 : public HciHalFacade::Service,
Zach Johnsonb45ecd22019-04-29 12:07:23 -070041 public ::bluetooth::hal::HciHalCallbacks {
Hansong Zhang29f99002019-04-24 17:25:42 +000042 public:
Zach Johnson34703602019-04-29 16:45:21 -070043 HciHalFacadeService(HciHal* hal)
Chienyuan4adb0422019-04-25 15:11:54 -070044 : hal_(hal), hci_event_stream_(&hci_event_stream_callback_), hci_acl_stream_(&hci_acl_stream_callback_),
Zach Johnson34703602019-04-29 16:45:21 -070045 hci_sco_stream_(&hci_sco_stream_callback_) {
46 hal->registerIncomingPacketCallback(this);
47 }
Zach Johnsone0e158c2019-04-26 11:57:05 -070048
Hansong Zhang116cb562019-07-24 15:33:35 -070049 ~HciHalFacadeService() {
50 hal_->unregisterIncomingPacketCallback();
51 }
52
Hansong Zhang90ec7402019-04-29 16:04:07 -070053 ::grpc::Status SendHciResetCommand(::grpc::ServerContext* context, const ::google::protobuf::Empty* request,
54 ::google::protobuf::Empty* response) override {
55 std::unique_lock<std::mutex> lock(mutex_);
56 can_send_hci_command_ = false;
Myles Watsonbadfc332019-09-04 15:37:23 -070057 hal_->sendHciCommand(SerializePacket(hci::ResetBuilder::Create()));
Hansong Zhang90ec7402019-04-29 16:04:07 -070058 while (!can_send_hci_command_) {
59 cv_.wait(lock);
60 }
61 return ::grpc::Status::OK;
62 }
63
Hansong Zhang29f99002019-04-24 17:25:42 +000064 ::grpc::Status SetLoopbackMode(::grpc::ServerContext* context,
Zach Johnson34703602019-04-29 16:45:21 -070065 const ::bluetooth::hal::LoopbackModeSettings* request,
Hansong Zhang29f99002019-04-24 17:25:42 +000066 ::google::protobuf::Empty* response) override {
Hansong Zhang90ec7402019-04-29 16:04:07 -070067 std::unique_lock<std::mutex> lock(mutex_);
68 can_send_hci_command_ = false;
Hansong Zhang29f99002019-04-24 17:25:42 +000069 bool enable = request->enable();
Myles Watsonbadfc332019-09-04 15:37:23 -070070 hal_->sendHciCommand(SerializePacket(hci::WriteLoopbackModeBuilder::Create(
71 enable ? hci::LoopbackMode::ENABLE_LOCAL : hci::LoopbackMode::NO_LOOPBACK)));
Hansong Zhang90ec7402019-04-29 16:04:07 -070072 while (!can_send_hci_command_) {
73 cv_.wait(lock);
74 }
75 return ::grpc::Status::OK;
76 }
77
78 ::grpc::Status SetInquiry(::grpc::ServerContext* context, const ::bluetooth::hal::InquirySettings* request,
79 ::google::protobuf::Empty* response) override {
80 std::unique_lock<std::mutex> lock(mutex_);
81 can_send_hci_command_ = false;
Chris Mantonb3650842019-10-03 17:31:12 -070082 hci::Lap lap;
83 lap.lap_ = 0x33;
84
85 hal_->sendHciCommand(SerializePacket(hci::InquiryBuilder::Create(lap, static_cast<uint8_t>(request->length()),
86 static_cast<uint8_t>(request->num_responses()))));
Hansong Zhang90ec7402019-04-29 16:04:07 -070087 while (!can_send_hci_command_) {
88 cv_.wait(lock);
89 }
Hansong Zhang29f99002019-04-24 17:25:42 +000090 return ::grpc::Status::OK;
91 }
92
Zach Johnson34703602019-04-29 16:45:21 -070093 ::grpc::Status SendHciCommand(::grpc::ServerContext* context, const ::bluetooth::hal::HciCommandPacket* request,
Chienyuan4adb0422019-04-25 15:11:54 -070094 ::google::protobuf::Empty* response) override {
Hansong Zhang90ec7402019-04-29 16:04:07 -070095 std::unique_lock<std::mutex> lock(mutex_);
96 can_send_hci_command_ = false;
Hansong Zhang29f99002019-04-24 17:25:42 +000097 std::string req_string = request->payload();
Zach Johnsone0e158c2019-04-26 11:57:05 -070098 hal_->sendHciCommand(std::vector<uint8_t>(req_string.begin(), req_string.end()));
Hansong Zhang90ec7402019-04-29 16:04:07 -070099 while (!can_send_hci_command_) {
100 cv_.wait(lock);
101 }
Hansong Zhang29f99002019-04-24 17:25:42 +0000102 return ::grpc::Status::OK;
103 }
104
Zach Johnson34703602019-04-29 16:45:21 -0700105 ::grpc::Status SendHciAcl(::grpc::ServerContext* context, const ::bluetooth::hal::HciAclPacket* request,
Hansong Zhang29f99002019-04-24 17:25:42 +0000106 ::google::protobuf::Empty* response) override {
107 std::string req_string = request->payload();
Zach Johnsone0e158c2019-04-26 11:57:05 -0700108 hal_->sendAclData(std::vector<uint8_t>(req_string.begin(), req_string.end()));
Hansong Zhang29f99002019-04-24 17:25:42 +0000109 return ::grpc::Status::OK;
110 }
111
Zach Johnson34703602019-04-29 16:45:21 -0700112 ::grpc::Status SendHciSco(::grpc::ServerContext* context, const ::bluetooth::hal::HciScoPacket* request,
Hansong Zhang29f99002019-04-24 17:25:42 +0000113 ::google::protobuf::Empty* response) override {
114 std::string req_string = request->payload();
Zach Johnsone0e158c2019-04-26 11:57:05 -0700115 hal_->sendScoData(std::vector<uint8_t>(req_string.begin(), req_string.end()));
Hansong Zhang29f99002019-04-24 17:25:42 +0000116 return ::grpc::Status::OK;
117 }
118
Zach Johnson34703602019-04-29 16:45:21 -0700119 ::grpc::Status FetchHciEvent(::grpc::ServerContext* context, const EventStreamRequest* request,
120 ::grpc::ServerWriter<HciEventPacket>* writer) override {
Chienyuan4adb0422019-04-25 15:11:54 -0700121 return hci_event_stream_.HandleRequest(context, request, writer);
122 };
123
Zach Johnson34703602019-04-29 16:45:21 -0700124 ::grpc::Status FetchHciAcl(::grpc::ServerContext* context, const EventStreamRequest* request,
Chienyuan4adb0422019-04-25 15:11:54 -0700125 ::grpc::ServerWriter<HciAclPacket>* writer) override {
126 return hci_acl_stream_.HandleRequest(context, request, writer);
127 };
128
Zach Johnson34703602019-04-29 16:45:21 -0700129 ::grpc::Status FetchHciSco(::grpc::ServerContext* context, const EventStreamRequest* request,
Chienyuan4adb0422019-04-25 15:11:54 -0700130 ::grpc::ServerWriter<HciScoPacket>* writer) override {
131 return hci_sco_stream_.HandleRequest(context, request, writer);
132 };
133
Hansong Zhang29f99002019-04-24 17:25:42 +0000134 void hciEventReceived(bluetooth::hal::HciPacket event) override {
Chienyuan4adb0422019-04-25 15:11:54 -0700135 std::string response_str = std::string(event.begin(), event.end());
136 hci_event_stream_.OnIncomingEvent(event);
Hansong Zhang90ec7402019-04-29 16:04:07 -0700137 can_send_hci_command_ = true;
138 cv_.notify_one();
Hansong Zhang29f99002019-04-24 17:25:42 +0000139 }
140
141 void aclDataReceived(bluetooth::hal::HciPacket data) override {
Chienyuan4adb0422019-04-25 15:11:54 -0700142 hci_acl_stream_.OnIncomingEvent(data);
Hansong Zhang29f99002019-04-24 17:25:42 +0000143 }
144
145 void scoDataReceived(bluetooth::hal::HciPacket data) override {
Chienyuan4adb0422019-04-25 15:11:54 -0700146 hci_sco_stream_.OnIncomingEvent(data);
Hansong Zhang29f99002019-04-24 17:25:42 +0000147 }
Chienyuan4adb0422019-04-25 15:11:54 -0700148
Hansong Zhang29f99002019-04-24 17:25:42 +0000149 private:
Zach Johnsonb45ecd22019-04-29 12:07:23 -0700150 HciHal* hal_;
Hansong Zhang90ec7402019-04-29 16:04:07 -0700151 bool can_send_hci_command_ = true;
152 mutable std::mutex mutex_;
153 std::condition_variable cv_;
Chienyuan4adb0422019-04-25 15:11:54 -0700154
Zach Johnson34703602019-04-29 16:45:21 -0700155 class HciEventStreamCallback : public ::bluetooth::grpc::GrpcEventStreamCallback<HciEventPacket, HciPacket> {
Chienyuan4adb0422019-04-25 15:11:54 -0700156 public:
Zach Johnson34703602019-04-29 16:45:21 -0700157 void OnWriteResponse(HciEventPacket* response, const HciPacket& event) override {
Chienyuan4adb0422019-04-25 15:11:54 -0700158 std::string response_str = std::string(event.begin(), event.end());
159 response->set_payload(std::string(event.begin(), event.end()));
160 }
161 } hci_event_stream_callback_;
Zach Johnson34703602019-04-29 16:45:21 -0700162 ::bluetooth::grpc::GrpcEventStream<HciEventPacket, HciPacket> hci_event_stream_;
Chienyuan4adb0422019-04-25 15:11:54 -0700163
164 class HciAclStreamCallback : public ::bluetooth::grpc::GrpcEventStreamCallback<HciAclPacket, HciPacket> {
165 public:
166 void OnWriteResponse(HciAclPacket* response, const HciPacket& event) override {
167 response->set_payload(std::string(event.begin(), event.end()));
168 }
169 } hci_acl_stream_callback_;
170 ::bluetooth::grpc::GrpcEventStream<HciAclPacket, HciPacket> hci_acl_stream_;
171
172 class HciScoStreamCallback : public ::bluetooth::grpc::GrpcEventStreamCallback<HciScoPacket, HciPacket> {
173 public:
174 void OnWriteResponse(HciScoPacket* response, const HciPacket& event) override {
175 response->set_payload(std::string(event.begin(), event.end()));
176 }
177 } hci_sco_stream_callback_;
178 ::bluetooth::grpc::GrpcEventStream<HciScoPacket, HciPacket> hci_sco_stream_;
Hansong Zhang29f99002019-04-24 17:25:42 +0000179};
180
Zach Johnson34703602019-04-29 16:45:21 -0700181void HciHalFacadeModule::ListDependencies(ModuleList* list) {
Zach Johnsone0e158c2019-04-26 11:57:05 -0700182 ::bluetooth::grpc::GrpcFacadeModule::ListDependencies(list);
Zach Johnsonb45ecd22019-04-29 12:07:23 -0700183 list->add<HciHal>();
Hansong Zhang29f99002019-04-24 17:25:42 +0000184}
185
Zach Johnson34703602019-04-29 16:45:21 -0700186void HciHalFacadeModule::Start() {
Zach Johnson84b448b2019-04-29 15:34:55 -0700187 ::bluetooth::grpc::GrpcFacadeModule::Start();
Zach Johnson34703602019-04-29 16:45:21 -0700188 service_ = new HciHalFacadeService(GetDependency<HciHal>());
Hansong Zhang29f99002019-04-24 17:25:42 +0000189}
190
Zach Johnson34703602019-04-29 16:45:21 -0700191void HciHalFacadeModule::Stop() {
Zach Johnsone0e158c2019-04-26 11:57:05 -0700192 delete service_;
Hansong Zhang90ec7402019-04-29 16:04:07 -0700193 ::bluetooth::grpc::GrpcFacadeModule::Stop();
Hansong Zhang29f99002019-04-24 17:25:42 +0000194}
195
Zach Johnson34703602019-04-29 16:45:21 -0700196::grpc::Service* HciHalFacadeModule::GetService() const {
Zach Johnsone0e158c2019-04-26 11:57:05 -0700197 return service_;
Hansong Zhang29f99002019-04-24 17:25:42 +0000198}
199
Zach Johnson34703602019-04-29 16:45:21 -0700200const ModuleFactory HciHalFacadeModule::Factory = ::bluetooth::ModuleFactory([]() {
201 return new HciHalFacadeModule();
Zach Johnsone0e158c2019-04-26 11:57:05 -0700202});
Hansong Zhang29f99002019-04-24 17:25:42 +0000203
Hansong Zhang29f99002019-04-24 17:25:42 +0000204} // namespace hal
205} // namespace bluetooth