| //! Controller facade |
| |
| use crate::hci::controller::{null_terminated_to_string, ControllerExports}; |
| use crate::hci::Hci; |
| use bt_common::GrpcFacade; |
| use bt_facade_proto::controller_facade::{ |
| AddressMsg, NameMsg, OpCodeMsg, SingleValueMsg, SupportedMsg, |
| }; |
| use bt_facade_proto::controller_facade_grpc::{create_controller_facade, ControllerFacade}; |
| use bt_facade_proto::empty::Empty; |
| use bt_packets::hci::{ReadLocalNameBuilder, WriteLocalNameBuilder}; |
| use gddi::{module, provides, Stoppable}; |
| use grpcio::*; |
| use std::sync::Arc; |
| |
| module! { |
| controller_facade_module, |
| providers { |
| ControllerFacadeService => provide_facade, |
| } |
| } |
| |
| #[provides] |
| async fn provide_facade(exports: Arc<ControllerExports>, hci: Hci) -> ControllerFacadeService { |
| ControllerFacadeService { exports, hci } |
| } |
| |
| /// Controller facade service |
| #[allow(missing_docs)] |
| #[derive(Clone, Stoppable)] |
| pub struct ControllerFacadeService { |
| pub exports: Arc<ControllerExports>, |
| hci: Hci, |
| } |
| |
| impl GrpcFacade for ControllerFacadeService { |
| fn into_grpc(self) -> grpcio::Service { |
| create_controller_facade(self) |
| } |
| } |
| |
| impl ControllerFacade for ControllerFacadeService { |
| fn get_mac_address(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<AddressMsg>) { |
| let clone = self.clone(); |
| ctx.spawn(async move { |
| let mut address = AddressMsg::new(); |
| address.set_address(clone.exports.address.bytes.to_vec()); |
| sink.success(address).await.unwrap(); |
| }); |
| } |
| |
| fn write_local_name(&mut self, ctx: RpcContext<'_>, req: NameMsg, sink: UnarySink<Empty>) { |
| let mut clone = self.clone(); |
| let mut builder = WriteLocalNameBuilder { local_name: [0; 248] }; |
| builder.local_name[0..req.get_name().len()].copy_from_slice(req.get_name()); |
| ctx.spawn(async move { |
| clone.hci.commands.send(builder.build()).await; |
| sink.success(Empty::default()).await.unwrap(); |
| }); |
| } |
| |
| fn get_local_name(&mut self, ctx: RpcContext<'_>, _req: Empty, sink: UnarySink<NameMsg>) { |
| let mut clone = self.clone(); |
| ctx.spawn(async move { |
| let local_name = null_terminated_to_string( |
| clone.hci.commands.send(ReadLocalNameBuilder {}).await.get_local_name(), |
| ) |
| .into_bytes(); |
| let mut msg = NameMsg::new(); |
| msg.set_name(local_name); |
| sink.success(msg).await.unwrap(); |
| }); |
| } |
| |
| fn is_supported_command( |
| &mut self, |
| _: RpcContext<'_>, |
| _: OpCodeMsg, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn get_le_number_of_supported_advertising_sets( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SingleValueMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_simple_pairing(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports_secure_connections( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_simultaneous_le_br_edr( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_interlaced_inquiry_scan( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_rssi_with_inquiry_results( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_extended_inquiry_response( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_role_switch(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports3_slot_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports5_slot_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports_classic2m_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports_classic3m_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports3_slot_edr_packets( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports5_slot_edr_packets( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| |
| fn supports_sco(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports_hv2_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_hv3_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ev3_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ev4_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| |
| fn supports_ev5_packets(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_esco2m_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_esco3m_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports3_slot_esco_edr_packets( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_hold_mode(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_sniff_mode(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_park_mode(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_non_flushable_pb( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_sniff_subrating( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_encryption_pause( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_encryption(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_connection_parameters_request( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_extended_reject( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_peripheral_initiated_features_exchange( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_ping(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_data_packet_length_extension( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_privacy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_extended_scanner_filter_policies( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble2m_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_stable_modulation_index_tx( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_stable_modulation_index_rx( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_coded_phy(&mut self, _: RpcContext<'_>, _: Empty, _: UnarySink<SupportedMsg>) { |
| todo!() |
| } |
| fn supports_ble_extended_advertising( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_periodic_advertising( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_channel_selection_algorithm2( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_power_class1( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_minimum_used_channels( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connection_cte_request( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connection_cte_response( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connectionless_cte_transmitter( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connectionless_cte_receiver( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_antenna_switching_during_cte_tx( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_antenna_switching_during_cte_rx( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_receiving_constant_tone_extensions( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_periodic_advertising_sync_transfer_sender( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_periodic_advertising_sync_transfer_recipient( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_sleep_clock_accuracy_updates( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_remote_public_key_validation( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connected_isochronous_stream_central( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_connected_isochronous_stream_peripheral( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_isochronous_broadcaster( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_synchronized_receiver( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_isochronous_channels_host_support( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_power_control_request( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_power_change_indication( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| fn supports_ble_path_loss_monitoring( |
| &mut self, |
| _: RpcContext<'_>, |
| _: Empty, |
| _: UnarySink<SupportedMsg>, |
| ) { |
| todo!() |
| } |
| } |