Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab6c298f authored by Zach Johnson's avatar Zach Johnson
Browse files

rusty-gd: add le events to facade

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost SimpleHalTest
Change-Id: I577c366cbeebb22492eea3bdc5ebcab9ebd27fa9
parent 7c46f7d1
Loading
Loading
Loading
Loading
+37 −18
Original line number Diff line number Diff line
@@ -10,11 +10,11 @@ use bt_packets::hci;
use futures::sink::SinkExt;
use gddi::{module, provides, Stoppable};
use grpcio::*;
use num_traits::FromPrimitive;
use std::sync::Arc;
use tokio::runtime::Runtime;
use tokio::sync::mpsc::{channel, Receiver, Sender};
use tokio::sync::Mutex;
use num_traits::FromPrimitive;

module! {
    facade_module,
@@ -26,11 +26,14 @@ module! {
#[provides]
async fn provide_facade(hci_exports: HciExports, rt: Arc<Runtime>) -> HciLayerFacadeService {
    let (from_hci_evt_tx, to_grpc_evt_rx) = channel::<hci::EventPacket>(10);
    let (from_hci_le_evt_tx, to_grpc_le_evt_rx) = channel::<hci::LeMetaEventPacket>(10);
    HciLayerFacadeService {
        hci_exports,
        rt,
        from_hci_evt_tx,
        to_grpc_evt_rx: Arc::new(Mutex::new(to_grpc_evt_rx)),
        from_hci_le_evt_tx,
        to_grpc_le_evt_rx: Arc::new(Mutex::new(to_grpc_le_evt_rx)),
    }
}

@@ -41,6 +44,8 @@ pub struct HciLayerFacadeService {
    rt: Arc<Runtime>,
    from_hci_evt_tx: Sender<hci::EventPacket>,
    to_grpc_evt_rx: Arc<Mutex<Receiver<hci::EventPacket>>>,
    from_hci_le_evt_tx: Sender<hci::LeMetaEventPacket>,
    to_grpc_le_evt_rx: Arc<Mutex<Receiver<hci::LeMetaEventPacket>>>,
}

impl GrpcFacade for HciLayerFacadeService {
@@ -56,10 +61,11 @@ impl HciLayerFacade for HciLayerFacadeService {
        mut data: Data,
        sink: UnarySink<Empty>,
    ) {
        self.rt.block_on(
            self.hci_exports
                .send_raw(hci::CommandPacket::parse(&data.take_payload()).unwrap()),
        ).unwrap();
        self.rt
            .block_on(
                self.hci_exports.send_raw(hci::CommandPacket::parse(&data.take_payload()).unwrap()),
            )
            .unwrap();
        sink.success(Empty::default());
    }

@@ -69,28 +75,33 @@ impl HciLayerFacade for HciLayerFacadeService {
        mut data: Data,
        sink: UnarySink<Empty>,
    ) {
        self.rt.block_on(
            self.hci_exports
                .send_raw(hci::CommandPacket::parse(&data.take_payload()).unwrap()),
        ).unwrap();
        self.rt
            .block_on(
                self.hci_exports.send_raw(hci::CommandPacket::parse(&data.take_payload()).unwrap()),
            )
            .unwrap();
        sink.success(Empty::default());
    }

    fn request_event(&mut self, _ctx: RpcContext<'_>, code: EventRequest, sink: UnarySink<Empty>) {
        self.rt.block_on(
            self.hci_exports
                .register_event_handler(hci::EventCode::from_u32(code.get_code()).unwrap(), self.from_hci_evt_tx.clone()),
        );
        self.rt.block_on(self.hci_exports.register_event_handler(
            hci::EventCode::from_u32(code.get_code()).unwrap(),
            self.from_hci_evt_tx.clone(),
        ));
        sink.success(Empty::default());
    }

    fn request_le_subevent(
        &mut self,
        _ctx: RpcContext<'_>,
        _code: EventRequest,
        _sink: UnarySink<Empty>,
        code: EventRequest,
        sink: UnarySink<Empty>,
    ) {
        unimplemented!()
        self.rt.block_on(self.hci_exports.register_le_event_handler(
            hci::SubeventCode::from_u32(code.get_code()).unwrap(),
            self.from_hci_le_evt_tx.clone(),
        ));
        sink.success(Empty::default());
    }

    fn send_acl(&mut self, _ctx: RpcContext<'_>, mut packet: Data, sink: UnarySink<Empty>) {
@@ -122,9 +133,17 @@ impl HciLayerFacade for HciLayerFacadeService {
        &mut self,
        _ctx: RpcContext<'_>,
        _req: Empty,
        mut _resp: ServerStreamingSink<Data>,
        mut resp: ServerStreamingSink<Data>,
    ) {
        unimplemented!()
        let evt_rx = self.to_grpc_le_evt_rx.clone();

        self.rt.spawn(async move {
            while let Some(event) = evt_rx.lock().await.recv().await {
                let mut evt = LeSubevent::default();
                evt.set_payload(event.to_vec());
                resp.send((evt, WriteFlags::default())).await.unwrap();
            }
        });
    }

    fn stream_acl(