From a6feb5ebb8fdd9b775fc22073943b6a1ed787ddf Mon Sep 17 00:00:00 2001 From: Zach Johnson Date: Wed, 11 Nov 2020 15:19:48 -0800 Subject: [PATCH] rusty-gd: plumb through commands and events for the hci hal facade Bug: 171749953 Tag: #gd-refactor Test: gd/cert/run --rhost SimpleHalTest Change-Id: If93d4d62e3c4d030fdf94082172c00dcb2ca47e8 --- gd/rust/facade/src/lib.rs | 2 +- gd/rust/hal/src/facade.rs | 38 ++++++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/gd/rust/facade/src/lib.rs b/gd/rust/facade/src/lib.rs index cc0c713a0..f47b82013 100644 --- a/gd/rust/facade/src/lib.rs +++ b/gd/rust/facade/src/lib.rs @@ -152,7 +152,7 @@ impl FacadeServiceManager { let mut services = Vec::new(); match req.get_module_under_test() { BluetoothModule::HAL => { - services.push(HciHalFacadeService::create(Arc::clone(&rt))); + services.push(HciHalFacadeService::create(hal_exports, Arc::clone(&rt))); } BluetoothModule::HCI => { let hci_exports = Hci::start(hal_exports, Arc::clone(&rt)); diff --git a/gd/rust/hal/src/facade.rs b/gd/rust/hal/src/facade.rs index 19134d4e5..3abd38e42 100644 --- a/gd/rust/hal/src/facade.rs +++ b/gd/rust/hal/src/facade.rs @@ -5,27 +5,41 @@ use bt_hal_proto::facade::*; use bt_hal_proto::facade_grpc::{create_hci_hal_facade, HciHalFacade}; use tokio::runtime::Runtime; +use tokio::sync::mpsc; +use tokio::sync::Mutex; +use futures::sink::SinkExt; use grpcio::*; use std::sync::Arc; +use crate::HalExports; + +use bt_packet::{HciCommand, HciEvent}; + /// HCI HAL facade service #[derive(Clone)] pub struct HciHalFacadeService { rt: Arc, + cmd_tx: mpsc::UnboundedSender, + evt_rx: Arc>>, } impl HciHalFacadeService { /// Create a new instance of HCI HAL facade service - pub fn create(rt: Arc) -> grpcio::Service { - create_hci_hal_facade(Self { rt }) + pub fn create(hal_exports: HalExports, rt: Arc) -> grpcio::Service { + create_hci_hal_facade(Self { + rt, + cmd_tx: hal_exports.cmd_tx, + evt_rx: Arc::new(Mutex::new(hal_exports.evt_rx)), + }) } } impl HciHalFacade for HciHalFacadeService { - fn send_command(&mut self, _ctx: RpcContext<'_>, _cmd: Command, _sink: UnarySink) { - unimplemented!() + fn send_command(&mut self, _ctx: RpcContext<'_>, mut cmd: Command, sink: UnarySink) { + self.cmd_tx.send(cmd.take_payload().into()).unwrap(); + sink.success(Empty::default()); } fn send_acl(&mut self, _ctx: RpcContext<'_>, _acl: AclPacket, _sink: UnarySink) { @@ -40,8 +54,20 @@ impl HciHalFacade for HciHalFacadeService { unimplemented!() } - fn stream_events(&mut self, _ctx: RpcContext<'_>, _: Empty, _sink: ServerStreamingSink) { - unimplemented!() + fn stream_events( + &mut self, + _ctx: RpcContext<'_>, + _: Empty, + mut sink: ServerStreamingSink, + ) { + let evt_rx = self.evt_rx.clone(); + self.rt.spawn(async move { + while let Some(event) = evt_rx.lock().await.recv().await { + let mut output = Event::default(); + output.set_payload(event.to_vec()); + sink.send((output, WriteFlags::default())).await.unwrap(); + } + }); } fn stream_acl( -- 2.11.0