You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.5 KiB
150 lines
3.5 KiB
//! Controller shim
|
|
|
|
use bt_hci::ControllerExports;
|
|
use bt_packets::hci::OpCode;
|
|
use paste::paste;
|
|
use std::ops::Deref;
|
|
use std::sync::Arc;
|
|
|
|
#[derive(Clone)]
|
|
pub struct Controller(pub Arc<ControllerExports>);
|
|
impl Deref for Controller {
|
|
type Target = Arc<ControllerExports>;
|
|
fn deref(&self) -> &Self::Target {
|
|
&self.0
|
|
}
|
|
}
|
|
|
|
macro_rules! feature_getters {
|
|
($($id:ident),*) => {
|
|
paste! {
|
|
$(
|
|
pub fn [<controller_supports_ $id>](c: &Controller) -> bool {
|
|
c.features.$id
|
|
}
|
|
)*
|
|
}
|
|
}
|
|
}
|
|
|
|
feature_getters! {
|
|
simple_pairing,
|
|
secure_connections,
|
|
simultaneous_le_bredr,
|
|
interlaced_inquiry_scan,
|
|
rssi_with_inquiry_results,
|
|
extended_inquiry_response,
|
|
role_switch,
|
|
three_slot_packets,
|
|
five_slot_packets,
|
|
classic_2m_phy,
|
|
classic_3m_phy,
|
|
three_slot_edr_packets,
|
|
five_slot_edr_packets,
|
|
sco,
|
|
hv2_packets,
|
|
hv3_packets,
|
|
ev3_packets,
|
|
ev4_packets,
|
|
ev5_packets,
|
|
esco_2m_phy,
|
|
esco_3m_phy,
|
|
three_slot_esco_edr_packets,
|
|
hold_mode,
|
|
sniff_mode,
|
|
park_mode,
|
|
non_flushable_pb,
|
|
sniff_subrating,
|
|
encryption_pause,
|
|
ble
|
|
}
|
|
|
|
macro_rules! le_feature_getters {
|
|
($($id:ident),*) => {
|
|
paste! {
|
|
$(
|
|
pub fn [<controller_supports_ $id>](c: &Controller) -> bool {
|
|
c.le_features.$id
|
|
}
|
|
)*
|
|
}
|
|
}
|
|
}
|
|
|
|
le_feature_getters! {
|
|
privacy,
|
|
packet_extension,
|
|
connection_parameters_request,
|
|
ble_2m_phy,
|
|
ble_coded_phy,
|
|
extended_advertising,
|
|
periodic_advertising,
|
|
peripheral_initiated_feature_exchange,
|
|
connection_parameter_request,
|
|
periodic_advertising_sync_transfer_sender,
|
|
periodic_advertising_sync_transfer_recipient,
|
|
connected_iso_stream_central,
|
|
connected_iso_stream_peripheral,
|
|
iso_broadcaster,
|
|
synchronized_receiver
|
|
}
|
|
|
|
macro_rules! opcode_getters {
|
|
($($id:ident => $opcode:path),*) => {
|
|
paste! {
|
|
$(
|
|
pub fn [<controller_supports_ $id>](c: &Controller) -> bool {
|
|
c.commands.is_supported($opcode)
|
|
}
|
|
)*
|
|
}
|
|
}
|
|
}
|
|
|
|
opcode_getters! {
|
|
reading_remote_extended_features => OpCode::ReadRemoteSupportedFeatures,
|
|
enhanced_setup_synchronous_connection => OpCode::EnhancedSetupSynchronousConnection,
|
|
enhanced_accept_synchronous_connection => OpCode::EnhancedAcceptSynchronousConnection,
|
|
ble_set_privacy_mode => OpCode::LeSetPrivacyMode
|
|
}
|
|
|
|
macro_rules! field_getters {
|
|
($($id:ident : $type:ty),*) => {
|
|
paste! {
|
|
$(
|
|
pub fn [<controller_get_ $id>](c: &Controller) -> $type {
|
|
c.$id
|
|
}
|
|
)*
|
|
}
|
|
}
|
|
}
|
|
|
|
field_getters! {
|
|
acl_buffer_length: u16,
|
|
le_buffer_length: u16,
|
|
iso_buffer_length: u16,
|
|
le_suggested_default_data_length: u16,
|
|
le_max_advertising_data_length: u16,
|
|
le_supported_advertising_sets: u8,
|
|
le_periodic_advertiser_list_size: u8,
|
|
acl_buffers: u16,
|
|
le_buffers: u8,
|
|
iso_buffers: u8,
|
|
le_connect_list_size: u8,
|
|
le_resolving_list_size: u8,
|
|
le_supported_states: u64
|
|
}
|
|
|
|
pub fn controller_get_le_maximum_tx_data_length(c: &Controller) -> u16 {
|
|
c.le_max_data_length.supported_max_tx_octets
|
|
}
|
|
|
|
pub fn controller_get_le_maximum_tx_time(c: &Controller) -> u16 {
|
|
c.le_max_data_length.supported_max_tx_time
|
|
}
|
|
|
|
pub fn controller_get_address(c: &Controller) -> String {
|
|
c.address.to_string()
|
|
}
|