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