blob: 027de440c5e4764c17f8cbef8abb4630a48a1b9f [file] [log] [blame]
//! 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!()
}
}