1 //! Controller facade
2
3 use crate::controller::{null_terminated_to_string, ControllerExports};
4 use crate::Hci;
5 use bt_common::GrpcFacade;
6 use bt_facade_proto::controller_facade::{AddressMsg, NameMsg};
7 use bt_facade_proto::controller_facade_grpc::{create_controller_facade, ControllerFacade};
8 use bt_facade_proto::empty::Empty;
9 use bt_packets::hci::{ReadLocalNameBuilder, WriteLocalNameBuilder};
10 use gddi::{module, provides, Stoppable};
11 use grpcio::*;
12 use std::sync::Arc;
13
14 module! {
15 controller_facade_module,
16 providers {
17 ControllerFacadeService => provide_facade,
18 }
19 }
20
21 #[provides]
provide_facade(exports: Arc<ControllerExports>, hci: Hci) -> ControllerFacadeService22 async fn provide_facade(exports: Arc<ControllerExports>, hci: Hci) -> ControllerFacadeService {
23 ControllerFacadeService { exports, hci }
24 }
25
26 /// Controller facade service
27 #[allow(missing_docs)]
28 #[derive(Clone, Stoppable)]
29 pub struct ControllerFacadeService {
30 pub exports: Arc<ControllerExports>,
31 hci: Hci,
32 }
33
34 impl GrpcFacade for ControllerFacadeService {
into_grpc(self) -> grpcio::Service35 fn into_grpc(self) -> grpcio::Service {
36 create_controller_facade(self)
37 }
38 }
39
40 impl ControllerFacade for ControllerFacadeService {
get_mac_address(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<AddressMsg>)41 fn get_mac_address(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<AddressMsg>) {
42 let clone = self.clone();
43 ctx.spawn(async move {
44 let mut address = AddressMsg::new();
45 address.set_address(clone.exports.address.bytes.to_vec());
46 sink.success(address).await.unwrap();
47 });
48 }
49
write_local_name(&mut self, ctx: RpcContext<'_>, req: NameMsg, sink: UnarySink<Empty>)50 fn write_local_name(&mut self, ctx: RpcContext<'_>, req: NameMsg, sink: UnarySink<Empty>) {
51 let mut clone = self.clone();
52 let mut builder = WriteLocalNameBuilder { local_name: [0; 248] };
53 builder.local_name[0..req.get_name().len()].copy_from_slice(req.get_name());
54 ctx.spawn(async move {
55 clone.hci.commands.send(builder.build()).await;
56 sink.success(Empty::default()).await.unwrap();
57 });
58 }
59
get_local_name(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<NameMsg>)60 fn get_local_name(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<NameMsg>) {
61 let mut clone = self.clone();
62 ctx.spawn(async move {
63 let local_name = null_terminated_to_string(
64 clone.hci.commands.send(ReadLocalNameBuilder {}).await.get_local_name(),
65 )
66 .into_bytes();
67 let mut msg = NameMsg::new();
68 msg.set_name(local_name);
69 sink.success(msg).await.unwrap();
70 });
71 }
72 }
73