Loading system/gd/rust/hci/src/facade.rs +32 −24 Original line number Diff line number Diff line Loading @@ -33,31 +33,47 @@ async fn provide_facade( acl: AclHal, rt: Arc<Runtime>, ) -> HciFacadeService { let (from_hci_evt_tx, to_grpc_evt_rx) = channel::<EventPacket>(10); let (from_hci_le_evt_tx, to_grpc_le_evt_rx) = channel::<LeMetaEventPacket>(10); let (evt_tx, evt_rx) = channel::<EventPacket>(10); let (le_evt_tx, le_evt_rx) = channel::<LeMetaEventPacket>(10); HciFacadeService { commands, events, acl, 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)), evt_tx, evt_rx: Arc::new(Mutex::new(evt_rx)), le_evt_tx, le_evt_rx: Arc::new(Mutex::new(le_evt_rx)), } } /// HCI layer facade service #[allow(missing_docs)] #[derive(Clone, Stoppable)] pub struct HciFacadeService { commands: RawCommandSender, pub commands: RawCommandSender, events: EventRegistry, acl: AclHal, pub acl: AclHal, rt: Arc<Runtime>, from_hci_evt_tx: Sender<EventPacket>, to_grpc_evt_rx: Arc<Mutex<Receiver<EventPacket>>>, from_hci_le_evt_tx: Sender<LeMetaEventPacket>, to_grpc_le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, evt_tx: Sender<EventPacket>, pub evt_rx: Arc<Mutex<Receiver<EventPacket>>>, le_evt_tx: Sender<LeMetaEventPacket>, pub le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, } impl HciFacadeService { /// Register for the event & plug in the channel to get them back on pub async fn register_event(&self, code: u32) { self.events.clone().register(EventCode::from_u32(code).unwrap(), self.evt_tx.clone()).await; } /// Register for the le event & plug in the channel to get them back on pub async fn register_le_event(&self, code: u32) { self.events .clone() .register_le(SubeventCode::from_u32(code).unwrap(), self.le_evt_tx.clone()) .await; } } impl GrpcFacade for HciFacadeService { Loading @@ -75,12 +91,7 @@ impl HciFacade for HciFacadeService { } fn request_event(&mut self, _ctx: RpcContext<'_>, req: EventRequest, sink: UnarySink<Empty>) { self.rt.block_on( self.events.register( EventCode::from_u32(req.get_code()).unwrap(), self.from_hci_evt_tx.clone(), ), ); self.rt.block_on(self.register_event(req.get_code())); sink.success(Empty::default()); } Loading @@ -90,10 +101,7 @@ impl HciFacade for HciFacadeService { req: EventRequest, sink: UnarySink<Empty>, ) { self.rt.block_on(self.events.register_le( SubeventCode::from_u32(req.get_code()).unwrap(), self.from_hci_le_evt_tx.clone(), )); self.rt.block_on(self.register_le_event(req.get_code())); sink.success(Empty::default()); } Loading @@ -111,7 +119,7 @@ impl HciFacade for HciFacadeService { _req: Empty, mut resp: ServerStreamingSink<Data>, ) { let evt_rx = self.to_grpc_evt_rx.clone(); let evt_rx = self.evt_rx.clone(); self.rt.spawn(async move { while let Some(event) = evt_rx.lock().await.recv().await { Loading @@ -128,7 +136,7 @@ impl HciFacade for HciFacadeService { _req: Empty, mut resp: ServerStreamingSink<Data>, ) { let evt_rx = self.to_grpc_le_evt_rx.clone(); let evt_rx = self.le_evt_rx.clone(); self.rt.spawn(async move { while let Some(event) = evt_rx.lock().await.recv().await { Loading system/gd/rust/shim/src/hci.rs +12 −39 Original line number Diff line number Diff line //! Hci shim use bt_hal::AclHal; use bt_hci::{EventRegistry, RawCommandSender}; use bt_packets::hci::{ AclPacket, CommandPacket, EventCode, EventPacket, LeMetaEventPacket, SubeventCode, }; use num_traits::FromPrimitive; use bt_hci::facade::HciFacadeService; use bt_packets::hci::{AclPacket, CommandPacket}; use std::sync::Arc; use tokio::runtime::Runtime; use tokio::sync::mpsc::{channel, Receiver, Sender}; use tokio::sync::Mutex; #[cxx::bridge(namespace = bluetooth::shim::rust)] mod ffi { Loading Loading @@ -42,40 +36,21 @@ unsafe impl Send for ffi::u8SliceCallback {} unsafe impl Send for ffi::u8SliceOnceCallback {} pub struct Hci { commands: RawCommandSender, events: EventRegistry, acl: AclHal, internal: HciFacadeService, rt: Arc<Runtime>, acl_callback_set: bool, evt_callback_set: bool, le_evt_callback_set: bool, evt_tx: Sender<EventPacket>, evt_rx: Arc<Mutex<Receiver<EventPacket>>>, le_evt_tx: Sender<LeMetaEventPacket>, le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, } impl Hci { pub fn new( rt: Arc<Runtime>, commands: RawCommandSender, events: EventRegistry, acl: AclHal, ) -> Self { let (evt_tx, evt_rx) = channel::<EventPacket>(10); let (le_evt_tx, le_evt_rx) = channel::<LeMetaEventPacket>(10); pub fn new(rt: Arc<Runtime>, internal: HciFacadeService) -> Self { Self { rt, commands, events, acl, internal, acl_callback_set: false, evt_callback_set: false, le_evt_callback_set: false, evt_tx, evt_rx: Arc::new(Mutex::new(evt_rx)), le_evt_tx, le_evt_rx: Arc::new(Mutex::new(le_evt_rx)), } } } Loading @@ -86,7 +61,7 @@ pub fn hci_send_command( callback: cxx::UniquePtr<ffi::u8SliceOnceCallback>, ) { let packet = CommandPacket::parse(data).unwrap(); let mut commands = hci.commands.clone(); let mut commands = hci.internal.commands.clone(); hci.rt.spawn(async move { let resp = commands.send(packet).await.unwrap(); callback.Run(&resp.to_bytes()); Loading @@ -94,24 +69,22 @@ pub fn hci_send_command( } pub fn hci_send_acl(hci: &mut Hci, data: &[u8]) { hci.rt.block_on(hci.acl.tx.send(AclPacket::parse(data).unwrap())).unwrap(); hci.rt.block_on(hci.internal.acl.tx.send(AclPacket::parse(data).unwrap())).unwrap(); } pub fn hci_register_event(hci: &mut Hci, event: u8) { hci.rt.block_on(hci.events.register(EventCode::from_u8(event).unwrap(), hci.evt_tx.clone())); hci.rt.block_on(hci.internal.register_event(event.into())); } pub fn hci_register_le_event(hci: &mut Hci, subevent: u8) { hci.rt.block_on( hci.events.register_le(SubeventCode::from_u8(subevent).unwrap(), hci.le_evt_tx.clone()), ); hci.rt.block_on(hci.internal.register_le_event(subevent.into())); } pub fn hci_set_acl_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8SliceCallback>) { assert!(!hci.acl_callback_set); hci.acl_callback_set = true; let stream = hci.acl.rx.clone(); let stream = hci.internal.acl.rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading @@ -123,7 +96,7 @@ pub fn hci_set_evt_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8Slice assert!(!hci.evt_callback_set); hci.evt_callback_set = true; let stream = hci.evt_rx.clone(); let stream = hci.internal.evt_rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading @@ -135,7 +108,7 @@ pub fn hci_set_le_evt_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8Sl assert!(!hci.le_evt_callback_set); hci.le_evt_callback_set = true; let stream = hci.le_evt_rx.clone(); let stream = hci.internal.le_evt_rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading system/gd/rust/shim/src/stack.rs +1 −3 Original line number Diff line number Diff line Loading @@ -57,9 +57,7 @@ pub fn get_hci(stack: &mut Stack) -> Box<Hci> { Box::new(Hci::new( stack.get_runtime(), stack.get_blocking::<bt_hci::RawCommandSender>(), stack.get_blocking::<bt_hci::EventRegistry>(), stack.get_blocking::<bt_hal::AclHal>(), stack.get_blocking::<bt_hci::facade::HciFacadeService>(), )) } Loading Loading
system/gd/rust/hci/src/facade.rs +32 −24 Original line number Diff line number Diff line Loading @@ -33,31 +33,47 @@ async fn provide_facade( acl: AclHal, rt: Arc<Runtime>, ) -> HciFacadeService { let (from_hci_evt_tx, to_grpc_evt_rx) = channel::<EventPacket>(10); let (from_hci_le_evt_tx, to_grpc_le_evt_rx) = channel::<LeMetaEventPacket>(10); let (evt_tx, evt_rx) = channel::<EventPacket>(10); let (le_evt_tx, le_evt_rx) = channel::<LeMetaEventPacket>(10); HciFacadeService { commands, events, acl, 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)), evt_tx, evt_rx: Arc::new(Mutex::new(evt_rx)), le_evt_tx, le_evt_rx: Arc::new(Mutex::new(le_evt_rx)), } } /// HCI layer facade service #[allow(missing_docs)] #[derive(Clone, Stoppable)] pub struct HciFacadeService { commands: RawCommandSender, pub commands: RawCommandSender, events: EventRegistry, acl: AclHal, pub acl: AclHal, rt: Arc<Runtime>, from_hci_evt_tx: Sender<EventPacket>, to_grpc_evt_rx: Arc<Mutex<Receiver<EventPacket>>>, from_hci_le_evt_tx: Sender<LeMetaEventPacket>, to_grpc_le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, evt_tx: Sender<EventPacket>, pub evt_rx: Arc<Mutex<Receiver<EventPacket>>>, le_evt_tx: Sender<LeMetaEventPacket>, pub le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, } impl HciFacadeService { /// Register for the event & plug in the channel to get them back on pub async fn register_event(&self, code: u32) { self.events.clone().register(EventCode::from_u32(code).unwrap(), self.evt_tx.clone()).await; } /// Register for the le event & plug in the channel to get them back on pub async fn register_le_event(&self, code: u32) { self.events .clone() .register_le(SubeventCode::from_u32(code).unwrap(), self.le_evt_tx.clone()) .await; } } impl GrpcFacade for HciFacadeService { Loading @@ -75,12 +91,7 @@ impl HciFacade for HciFacadeService { } fn request_event(&mut self, _ctx: RpcContext<'_>, req: EventRequest, sink: UnarySink<Empty>) { self.rt.block_on( self.events.register( EventCode::from_u32(req.get_code()).unwrap(), self.from_hci_evt_tx.clone(), ), ); self.rt.block_on(self.register_event(req.get_code())); sink.success(Empty::default()); } Loading @@ -90,10 +101,7 @@ impl HciFacade for HciFacadeService { req: EventRequest, sink: UnarySink<Empty>, ) { self.rt.block_on(self.events.register_le( SubeventCode::from_u32(req.get_code()).unwrap(), self.from_hci_le_evt_tx.clone(), )); self.rt.block_on(self.register_le_event(req.get_code())); sink.success(Empty::default()); } Loading @@ -111,7 +119,7 @@ impl HciFacade for HciFacadeService { _req: Empty, mut resp: ServerStreamingSink<Data>, ) { let evt_rx = self.to_grpc_evt_rx.clone(); let evt_rx = self.evt_rx.clone(); self.rt.spawn(async move { while let Some(event) = evt_rx.lock().await.recv().await { Loading @@ -128,7 +136,7 @@ impl HciFacade for HciFacadeService { _req: Empty, mut resp: ServerStreamingSink<Data>, ) { let evt_rx = self.to_grpc_le_evt_rx.clone(); let evt_rx = self.le_evt_rx.clone(); self.rt.spawn(async move { while let Some(event) = evt_rx.lock().await.recv().await { Loading
system/gd/rust/shim/src/hci.rs +12 −39 Original line number Diff line number Diff line //! Hci shim use bt_hal::AclHal; use bt_hci::{EventRegistry, RawCommandSender}; use bt_packets::hci::{ AclPacket, CommandPacket, EventCode, EventPacket, LeMetaEventPacket, SubeventCode, }; use num_traits::FromPrimitive; use bt_hci::facade::HciFacadeService; use bt_packets::hci::{AclPacket, CommandPacket}; use std::sync::Arc; use tokio::runtime::Runtime; use tokio::sync::mpsc::{channel, Receiver, Sender}; use tokio::sync::Mutex; #[cxx::bridge(namespace = bluetooth::shim::rust)] mod ffi { Loading Loading @@ -42,40 +36,21 @@ unsafe impl Send for ffi::u8SliceCallback {} unsafe impl Send for ffi::u8SliceOnceCallback {} pub struct Hci { commands: RawCommandSender, events: EventRegistry, acl: AclHal, internal: HciFacadeService, rt: Arc<Runtime>, acl_callback_set: bool, evt_callback_set: bool, le_evt_callback_set: bool, evt_tx: Sender<EventPacket>, evt_rx: Arc<Mutex<Receiver<EventPacket>>>, le_evt_tx: Sender<LeMetaEventPacket>, le_evt_rx: Arc<Mutex<Receiver<LeMetaEventPacket>>>, } impl Hci { pub fn new( rt: Arc<Runtime>, commands: RawCommandSender, events: EventRegistry, acl: AclHal, ) -> Self { let (evt_tx, evt_rx) = channel::<EventPacket>(10); let (le_evt_tx, le_evt_rx) = channel::<LeMetaEventPacket>(10); pub fn new(rt: Arc<Runtime>, internal: HciFacadeService) -> Self { Self { rt, commands, events, acl, internal, acl_callback_set: false, evt_callback_set: false, le_evt_callback_set: false, evt_tx, evt_rx: Arc::new(Mutex::new(evt_rx)), le_evt_tx, le_evt_rx: Arc::new(Mutex::new(le_evt_rx)), } } } Loading @@ -86,7 +61,7 @@ pub fn hci_send_command( callback: cxx::UniquePtr<ffi::u8SliceOnceCallback>, ) { let packet = CommandPacket::parse(data).unwrap(); let mut commands = hci.commands.clone(); let mut commands = hci.internal.commands.clone(); hci.rt.spawn(async move { let resp = commands.send(packet).await.unwrap(); callback.Run(&resp.to_bytes()); Loading @@ -94,24 +69,22 @@ pub fn hci_send_command( } pub fn hci_send_acl(hci: &mut Hci, data: &[u8]) { hci.rt.block_on(hci.acl.tx.send(AclPacket::parse(data).unwrap())).unwrap(); hci.rt.block_on(hci.internal.acl.tx.send(AclPacket::parse(data).unwrap())).unwrap(); } pub fn hci_register_event(hci: &mut Hci, event: u8) { hci.rt.block_on(hci.events.register(EventCode::from_u8(event).unwrap(), hci.evt_tx.clone())); hci.rt.block_on(hci.internal.register_event(event.into())); } pub fn hci_register_le_event(hci: &mut Hci, subevent: u8) { hci.rt.block_on( hci.events.register_le(SubeventCode::from_u8(subevent).unwrap(), hci.le_evt_tx.clone()), ); hci.rt.block_on(hci.internal.register_le_event(subevent.into())); } pub fn hci_set_acl_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8SliceCallback>) { assert!(!hci.acl_callback_set); hci.acl_callback_set = true; let stream = hci.acl.rx.clone(); let stream = hci.internal.acl.rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading @@ -123,7 +96,7 @@ pub fn hci_set_evt_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8Slice assert!(!hci.evt_callback_set); hci.evt_callback_set = true; let stream = hci.evt_rx.clone(); let stream = hci.internal.evt_rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading @@ -135,7 +108,7 @@ pub fn hci_set_le_evt_callback(hci: &mut Hci, callback: cxx::UniquePtr<ffi::u8Sl assert!(!hci.le_evt_callback_set); hci.le_evt_callback_set = true; let stream = hci.le_evt_rx.clone(); let stream = hci.internal.le_evt_rx.clone(); hci.rt.spawn(async move { while let Some(item) = stream.lock().await.recv().await { callback.Run(&item.to_bytes()); Loading
system/gd/rust/shim/src/stack.rs +1 −3 Original line number Diff line number Diff line Loading @@ -57,9 +57,7 @@ pub fn get_hci(stack: &mut Stack) -> Box<Hci> { Box::new(Hci::new( stack.get_runtime(), stack.get_blocking::<bt_hci::RawCommandSender>(), stack.get_blocking::<bt_hci::EventRegistry>(), stack.get_blocking::<bt_hal::AclHal>(), stack.get_blocking::<bt_hci::facade::HciFacadeService>(), )) } Loading