summaryrefslogtreecommitdiff
path: root/system/gd/rust/shim/src/bridge.rs
blob: c89a494827a9c58b87e87871b0832c8a74af1f74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//! Merged bridge

pub use crate::controller::*;
pub use crate::hci::*;
pub use crate::stack::*;

#[cxx::bridge(namespace = bluetooth::shim::rust)]
pub mod ffi {
    extern "Rust" {
        type Stack;
        type Hci;
        type Controller;

        // Stack
        fn stack_create() -> Box<Stack>;
        fn stack_start(stack: &mut Stack);
        fn stack_stop(stack: &mut Stack);

        fn get_hci(stack: &mut Stack) -> Box<Hci>;
        fn get_controller(stack: &mut Stack) -> Box<Controller>;

        // HCI
        fn hci_set_acl_callback(hci: &mut Hci, callback: UniquePtr<u8SliceCallback>);
        fn hci_set_sco_callback(hci: &mut Hci, callback: UniquePtr<u8SliceCallback>);
        fn hci_set_iso_callback(hci: &mut Hci, callback: UniquePtr<u8SliceCallback>);
        fn hci_set_evt_callback(hci: &mut Hci, callback: UniquePtr<u8SliceCallback>);
        fn hci_set_le_evt_callback(hci: &mut Hci, callback: UniquePtr<u8SliceCallback>);

        fn hci_send_command(hci: &mut Hci, data: &[u8], callback: UniquePtr<u8SliceOnceCallback>);
        fn hci_send_acl(hci: &mut Hci, data: &[u8]);
        fn hci_send_sco(hci: &mut Hci, data: &[u8]);
        fn hci_send_iso(hci: &mut Hci, data: &[u8]);
        fn hci_register_event(hci: &mut Hci, event: u8);
        fn hci_register_le_event(hci: &mut Hci, subevent: u8);

        // Controller
        fn controller_supports_simple_pairing(c: &Controller) -> bool;
        fn controller_supports_secure_connections(c: &Controller) -> bool;
        fn controller_supports_simultaneous_le_bredr(c: &Controller) -> bool;
        fn controller_supports_interlaced_inquiry_scan(c: &Controller) -> bool;
        fn controller_supports_rssi_with_inquiry_results(c: &Controller) -> bool;
        fn controller_supports_extended_inquiry_response(c: &Controller) -> bool;
        fn controller_supports_role_switch(c: &Controller) -> bool;
        fn controller_supports_three_slot_packets(c: &Controller) -> bool;
        fn controller_supports_five_slot_packets(c: &Controller) -> bool;
        fn controller_supports_classic_2m_phy(c: &Controller) -> bool;
        fn controller_supports_classic_3m_phy(c: &Controller) -> bool;
        fn controller_supports_three_slot_edr_packets(c: &Controller) -> bool;
        fn controller_supports_five_slot_edr_packets(c: &Controller) -> bool;
        fn controller_supports_sco(c: &Controller) -> bool;
        fn controller_supports_hv2_packets(c: &Controller) -> bool;
        fn controller_supports_hv3_packets(c: &Controller) -> bool;
        fn controller_supports_ev3_packets(c: &Controller) -> bool;
        fn controller_supports_ev4_packets(c: &Controller) -> bool;
        fn controller_supports_ev5_packets(c: &Controller) -> bool;
        fn controller_supports_esco_2m_phy(c: &Controller) -> bool;
        fn controller_supports_esco_3m_phy(c: &Controller) -> bool;
        fn controller_supports_three_slot_esco_edr_packets(c: &Controller) -> bool;
        fn controller_supports_hold_mode(c: &Controller) -> bool;
        fn controller_supports_sniff_mode(c: &Controller) -> bool;
        fn controller_supports_park_mode(c: &Controller) -> bool;
        fn controller_supports_non_flushable_pb(c: &Controller) -> bool;
        fn controller_supports_sniff_subrating(c: &Controller) -> bool;
        fn controller_supports_encryption_pause(c: &Controller) -> bool;
        fn controller_supports_ble(c: &Controller) -> bool;

        fn controller_supports_privacy(c: &Controller) -> bool;
        fn controller_supports_packet_extension(c: &Controller) -> bool;
        fn controller_supports_connection_parameters_request(c: &Controller) -> bool;
        fn controller_supports_ble_2m_phy(c: &Controller) -> bool;
        fn controller_supports_ble_coded_phy(c: &Controller) -> bool;
        fn controller_supports_extended_advertising(c: &Controller) -> bool;
        fn controller_supports_periodic_advertising(c: &Controller) -> bool;
        fn controller_supports_peripheral_initiated_feature_exchange(c: &Controller) -> bool;
        fn controller_supports_connection_parameter_request(c: &Controller) -> bool;
        fn controller_supports_periodic_advertising_sync_transfer_sender(c: &Controller) -> bool;
        fn controller_supports_periodic_advertising_sync_transfer_recipient(c: &Controller)
            -> bool;
        fn controller_supports_connected_iso_stream_central(c: &Controller) -> bool;
        fn controller_supports_connected_iso_stream_peripheral(c: &Controller) -> bool;
        fn controller_supports_iso_broadcaster(c: &Controller) -> bool;
        fn controller_supports_synchronized_receiver(c: &Controller) -> bool;
        fn controller_supports_configure_data_path(c: &Controller) -> bool;

        fn controller_supports_reading_remote_extended_features(c: &Controller) -> bool;
        fn controller_supports_enhanced_setup_synchronous_connection(c: &Controller) -> bool;
        fn controller_supports_enhanced_accept_synchronous_connection(c: &Controller) -> bool;
        fn controller_supports_ble_set_privacy_mode(c: &Controller) -> bool;

        fn controller_get_acl_buffer_length(c: &Controller) -> u16;
        fn controller_get_le_buffer_length(c: &Controller) -> u16;
        fn controller_get_iso_buffer_length(c: &Controller) -> u16;
        fn controller_get_le_suggested_default_data_length(c: &Controller) -> u16;
        fn controller_get_le_maximum_tx_data_length(c: &Controller) -> u16;
        fn controller_get_le_maximum_tx_time(c: &Controller) -> u16;
        fn controller_get_le_max_advertising_data_length(c: &Controller) -> u16;
        fn controller_get_le_supported_advertising_sets(c: &Controller) -> u8;
        fn controller_get_le_periodic_advertiser_list_size(c: &Controller) -> u8;
        fn controller_get_acl_buffers(c: &Controller) -> u16;
        fn controller_get_le_buffers(c: &Controller) -> u8;
        fn controller_get_iso_buffers(c: &Controller) -> u8;
        fn controller_get_le_connect_list_size(c: &Controller) -> u8;
        fn controller_get_le_resolving_list_size(c: &Controller) -> u8;
        fn controller_get_le_supported_states(c: &Controller) -> u64;

        fn controller_get_address(c: &Controller) -> String;
    }

    unsafe extern "C++" {
        include!("callbacks/callbacks.h");

        type u8SliceCallback;
        fn Run(self: &u8SliceCallback, data: &[u8]);

        type u8SliceOnceCallback;
        fn Run(self: &u8SliceOnceCallback, data: &[u8]);
    }
}