Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89384b82 authored by Abhishek Pandit-Subedi's avatar Abhishek Pandit-Subedi
Browse files

floss: Refactor GATT apis to use GattStatus

Gatt apis were inconsistent between u8 and i32 for representing status.
To make this easier on clients, serialize all GattStatus as u32 and
convert various status values in Gatt to GattStatus.

Bug: 193686094
Tag: #floss
Test: Build for ChromeOS and Linux
Change-Id: Ie058a4ba6f2e6957cf8a1731533f3773c49b20c9
parent 3c96c809
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -299,8 +299,8 @@ impl ScannerCallback {
}

impl IScannerCallback for ScannerCallback {
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: u8) {
        if status != 0 {
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: GattStatus) {
        if status != GattStatus::Success {
            print_error!("Failed registering scanner, status = {}", status);
            return;
        }
@@ -349,14 +349,14 @@ impl BtGattCallback {
}

impl IBluetoothGattCallback for BtGattCallback {
    fn on_client_registered(&self, status: i32, client_id: i32) {
    fn on_client_registered(&self, status: GattStatus, client_id: i32) {
        print_info!("GATT Client registered status = {}, client_id = {}", status, client_id);
        self.context.lock().unwrap().gatt_client_id = Some(client_id);
    }

    fn on_client_connection_state(
        &self,
        status: i32,
        status: GattStatus,
        client_id: i32,
        connected: bool,
        addr: String,
@@ -390,7 +390,12 @@ impl IBluetoothGattCallback for BtGattCallback {
        );
    }

    fn on_search_complete(&self, addr: String, services: Vec<BluetoothGattService>, status: i32) {
    fn on_search_complete(
        &self,
        addr: String,
        services: Vec<BluetoothGattService>,
        status: GattStatus,
    ) {
        print_info!(
            "GATT DB Search complete: addr = {}, services = {:?}, status = {}",
            addr,
@@ -399,7 +404,13 @@ impl IBluetoothGattCallback for BtGattCallback {
        );
    }

    fn on_characteristic_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {
    fn on_characteristic_read(
        &self,
        addr: String,
        status: GattStatus,
        handle: i32,
        value: Vec<u8>,
    ) {
        print_info!(
            "GATT Characteristic read: addr = {}, status = {}, handle = {}, value = {:?}",
            addr,
@@ -409,7 +420,7 @@ impl IBluetoothGattCallback for BtGattCallback {
        );
    }

    fn on_characteristic_write(&self, addr: String, status: i32, handle: i32) {
    fn on_characteristic_write(&self, addr: String, status: GattStatus, handle: i32) {
        print_info!(
            "GATT Characteristic write: addr = {}, status = {}, handle = {}",
            addr,
@@ -418,11 +429,11 @@ impl IBluetoothGattCallback for BtGattCallback {
        );
    }

    fn on_execute_write(&self, addr: String, status: i32) {
    fn on_execute_write(&self, addr: String, status: GattStatus) {
        print_info!("GATT execute write addr = {}, status = {}", addr, status);
    }

    fn on_descriptor_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {
    fn on_descriptor_read(&self, addr: String, status: GattStatus, handle: i32, value: Vec<u8>) {
        print_info!(
            "GATT Descriptor read: addr = {}, status = {}, handle = {}, value = {:?}",
            addr,
@@ -432,7 +443,7 @@ impl IBluetoothGattCallback for BtGattCallback {
        );
    }

    fn on_descriptor_write(&self, addr: String, status: i32, handle: i32) {
    fn on_descriptor_write(&self, addr: String, status: GattStatus, handle: i32) {
        print_info!(
            "GATT Descriptor write: addr = {}, status = {}, handle = {}",
            addr,
@@ -445,11 +456,11 @@ impl IBluetoothGattCallback for BtGattCallback {
        print_info!("GATT Notification: addr = {}, handle = {}, value = {:?}", addr, handle, value);
    }

    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: i32) {
    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: GattStatus) {
        print_info!("Remote RSSI read: addr = {}, rssi = {}, status = {}", addr, rssi, status);
    }

    fn on_configure_mtu(&self, addr: String, mtu: i32, status: i32) {
    fn on_configure_mtu(&self, addr: String, mtu: i32, status: GattStatus) {
        print_info!("MTU configured: addr = {}, mtu = {}, status = {}", addr, mtu, status);
    }

@@ -459,7 +470,7 @@ impl IBluetoothGattCallback for BtGattCallback {
        interval: i32,
        latency: i32,
        timeout: i32,
        status: i32,
        status: GattStatus,
    ) {
        print_info!(
            "Connection updated: addr = {}, interval = {}, latency = {}, timeout = {}, status = {}",
+25 −12
Original line number Diff line number Diff line
@@ -198,7 +198,7 @@ impl RPCProxy for IScannerCallbackDBus {}
)]
impl IScannerCallback for IScannerCallbackDBus {
    #[dbus_method("OnScannerRegistered")]
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: u8) {}
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: GattStatus) {}
}

// Implements RPC-friendly wrapper methods for calling IBluetooth, generated by
@@ -1018,12 +1018,12 @@ impl RPCProxy for IBluetoothGattCallbackDBus {}
)]
impl IBluetoothGattCallback for IBluetoothGattCallbackDBus {
    #[dbus_method("OnClientRegistered")]
    fn on_client_registered(&self, status: i32, client_id: i32) {}
    fn on_client_registered(&self, status: GattStatus, client_id: i32) {}

    #[dbus_method("OnClientConnectionState")]
    fn on_client_connection_state(
        &self,
        status: i32,
        status: GattStatus,
        client_id: i32,
        connected: bool,
        addr: String,
@@ -1037,31 +1037,44 @@ impl IBluetoothGattCallback for IBluetoothGattCallbackDBus {
    fn on_phy_read(&self, addr: String, tx_phy: LePhy, rx_phy: LePhy, status: GattStatus) {}

    #[dbus_method("OnSearchComplete")]
    fn on_search_complete(&self, addr: String, services: Vec<BluetoothGattService>, status: i32) {}
    fn on_search_complete(
        &self,
        addr: String,
        services: Vec<BluetoothGattService>,
        status: GattStatus,
    ) {
    }

    #[dbus_method("OnCharacteristicRead")]
    fn on_characteristic_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {}
    fn on_characteristic_read(
        &self,
        addr: String,
        status: GattStatus,
        handle: i32,
        value: Vec<u8>,
    ) {
    }

    #[dbus_method("OnCharacteristicWrite")]
    fn on_characteristic_write(&self, addr: String, status: i32, handle: i32) {}
    fn on_characteristic_write(&self, addr: String, status: GattStatus, handle: i32) {}

    #[dbus_method("OnExecuteWrite")]
    fn on_execute_write(&self, addr: String, status: i32) {}
    fn on_execute_write(&self, addr: String, status: GattStatus) {}

    #[dbus_method("OnDescriptorRead")]
    fn on_descriptor_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {}
    fn on_descriptor_read(&self, addr: String, status: GattStatus, handle: i32, value: Vec<u8>) {}

    #[dbus_method("OnDescriptorWrite")]
    fn on_descriptor_write(&self, addr: String, status: i32, handle: i32) {}
    fn on_descriptor_write(&self, addr: String, status: GattStatus, handle: i32) {}

    #[dbus_method("OnNotify")]
    fn on_notify(&self, addr: String, handle: i32, value: Vec<u8>) {}

    #[dbus_method("OnReadRemoteRssi")]
    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: i32) {}
    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: GattStatus) {}

    #[dbus_method("OnConfigureMtu")]
    fn on_configure_mtu(&self, addr: String, mtu: i32, status: i32) {}
    fn on_configure_mtu(&self, addr: String, mtu: i32, status: GattStatus) {}

    #[dbus_method("OnConnectionUpdated")]
    fn on_connection_updated(
@@ -1070,7 +1083,7 @@ impl IBluetoothGattCallback for IBluetoothGattCallbackDBus {
        interval: i32,
        latency: i32,
        timeout: i32,
        status: i32,
        status: GattStatus,
    ) {
    }

+23 −12
Original line number Diff line number Diff line
@@ -30,14 +30,14 @@ struct BluetoothGattCallbackDBus {}
#[dbus_proxy_obj(BluetoothGattCallback, "org.chromium.bluetooth.BluetoothGattCallback")]
impl IBluetoothGattCallback for BluetoothGattCallbackDBus {
    #[dbus_method("OnClientRegistered")]
    fn on_client_registered(&self, status: i32, scanner_id: i32) {
    fn on_client_registered(&self, status: GattStatus, scanner_id: i32) {
        dbus_generated!()
    }

    #[dbus_method("OnClientConnectionState")]
    fn on_client_connection_state(
        &self,
        status: i32,
        status: GattStatus,
        client_id: i32,
        connected: bool,
        addr: String,
@@ -56,32 +56,43 @@ impl IBluetoothGattCallback for BluetoothGattCallbackDBus {
    }

    #[dbus_method("OnSearchComplete")]
    fn on_search_complete(&self, addr: String, services: Vec<BluetoothGattService>, status: i32) {
    fn on_search_complete(
        &self,
        addr: String,
        services: Vec<BluetoothGattService>,
        status: GattStatus,
    ) {
        dbus_generated!()
    }

    #[dbus_method("OnCharacteristicRead")]
    fn on_characteristic_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {
    fn on_characteristic_read(
        &self,
        addr: String,
        status: GattStatus,
        handle: i32,
        value: Vec<u8>,
    ) {
        dbus_generated!()
    }

    #[dbus_method("OnCharacteristicWrite")]
    fn on_characteristic_write(&self, addr: String, status: i32, handle: i32) {
    fn on_characteristic_write(&self, addr: String, status: GattStatus, handle: i32) {
        dbus_generated!()
    }

    #[dbus_method("OnExecuteWrite")]
    fn on_execute_write(&self, addr: String, status: i32) {
    fn on_execute_write(&self, addr: String, status: GattStatus) {
        dbus_generated!()
    }

    #[dbus_method("OnDescriptorRead")]
    fn on_descriptor_read(&self, addr: String, status: i32, handle: i32, value: Vec<u8>) {
    fn on_descriptor_read(&self, addr: String, status: GattStatus, handle: i32, value: Vec<u8>) {
        dbus_generated!()
    }

    #[dbus_method("OnDescriptorWrite")]
    fn on_descriptor_write(&self, addr: String, status: i32, handle: i32) {
    fn on_descriptor_write(&self, addr: String, status: GattStatus, handle: i32) {
        dbus_generated!()
    }

@@ -91,12 +102,12 @@ impl IBluetoothGattCallback for BluetoothGattCallbackDBus {
    }

    #[dbus_method("OnReadRemoteRssi")]
    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: i32) {
    fn on_read_remote_rssi(&self, addr: String, rssi: i32, status: GattStatus) {
        dbus_generated!()
    }

    #[dbus_method("OnConfigureMtu")]
    fn on_configure_mtu(&self, addr: String, mtu: i32, status: i32) {
    fn on_configure_mtu(&self, addr: String, mtu: i32, status: GattStatus) {
        dbus_generated!()
    }

@@ -107,7 +118,7 @@ impl IBluetoothGattCallback for BluetoothGattCallbackDBus {
        interval: i32,
        latency: i32,
        timeout: i32,
        status: i32,
        status: GattStatus,
    ) {
        dbus_generated!()
    }
@@ -142,7 +153,7 @@ struct ScannerCallbackDBus {}
#[dbus_proxy_obj(ScannerCallback, "org.chromium.bluetooth.ScannerCallback")]
impl IScannerCallback for ScannerCallbackDBus {
    #[dbus_method("OnScannerRegistered")]
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: u8) {
    fn on_scanner_registered(&self, uuid: Uuid128Bit, scanner_id: u8, status: GattStatus) {
        dbus_generated!()
    }
}
+107 −72

File changed.

Preview size limit exceeded, changes collapsed.

+62 −34
Original line number Diff line number Diff line
@@ -10,8 +10,9 @@ use crate::profiles::gatt::bindings::{
use crate::topstack::get_dispatchers;
use crate::{cast_to_ffi_address, ccall, deref_ffi_address, mutcxxcall};

use num_traits::cast::FromPrimitive;
use num_traits::cast::{FromPrimitive, ToPrimitive};

use std::fmt::{Display, Formatter, Result};
use std::sync::{Arc, Mutex};

use topshim_macros::cb_variant;
@@ -393,7 +394,7 @@ impl From<Uuid> for ffi::RustUuid {
    }
}

#[derive(Debug, FromPrimitive, ToPrimitive, PartialEq, PartialOrd)]
#[derive(Clone, Copy, Debug, FromPrimitive, ToPrimitive, PartialEq, PartialOrd)]
#[repr(u32)]
pub enum GattStatus {
    Success = 0x00,
@@ -446,27 +447,54 @@ pub enum GattStatus {
    OutOfRange = 0xFF,
}

impl From<u8> for GattStatus {
    fn from(item: u8) -> Self {
        match GattStatus::from_u8(item) {
            Some(s) => s,
            None => GattStatus::InternalError,
        }
    }
}

impl From<i32> for GattStatus {
    fn from(item: i32) -> Self {
        if item > 0xff {
            GattStatus::OutOfRange
        } else if let Some(s) = GattStatus::from_i32(item) {
            s
        } else {
            GattStatus::InternalError
        }
    }
}

impl Display for GattStatus {
    fn fmt(&self, f: &mut Formatter) -> Result {
        write!(f, "{}", self.to_u32().unwrap_or(0))
    }
}

#[derive(Debug)]
pub enum GattClientCallbacks {
    RegisterClient(i32, i32, Uuid),
    Connect(i32, i32, i32, RawAddress),
    Disconnect(i32, i32, i32, RawAddress),
    SearchComplete(i32, i32),
    RegisterForNotification(i32, i32, i32, u16),
    RegisterClient(GattStatus, i32, Uuid),
    Connect(i32, GattStatus, i32, RawAddress),
    Disconnect(i32, GattStatus, i32, RawAddress),
    SearchComplete(i32, GattStatus),
    RegisterForNotification(i32, i32, GattStatus, u16),
    Notify(i32, BtGattNotifyParams),
    ReadCharacteristic(i32, i32, BtGattReadParams),
    WriteCharacteristic(i32, i32, u16, u16, *const u8),
    ReadDescriptor(i32, i32, BtGattReadParams),
    WriteDescriptor(i32, i32, u16, u16, *const u8),
    ExecuteWrite(i32, i32),
    ReadRemoteRssi(i32, RawAddress, i32, i32),
    ConfigureMtu(i32, i32, i32),
    ReadCharacteristic(i32, GattStatus, BtGattReadParams),
    WriteCharacteristic(i32, GattStatus, u16, u16, *const u8),
    ReadDescriptor(i32, GattStatus, BtGattReadParams),
    WriteDescriptor(i32, GattStatus, u16, u16, *const u8),
    ExecuteWrite(i32, GattStatus),
    ReadRemoteRssi(i32, RawAddress, i32, GattStatus),
    ConfigureMtu(i32, GattStatus, i32),
    Congestion(i32, bool),
    GetGattDb(i32, Vec<BtGattDbElement>, i32),
    PhyUpdated(i32, u8, u8, u8),
    ConnUpdated(i32, u16, u16, u16, u8),
    PhyUpdated(i32, u8, u8, GattStatus),
    ConnUpdated(i32, u16, u16, u16, GattStatus),
    ServiceChanged(i32),
    ReadPhy(i32, RawAddress, u8, u8, u8),
    ReadPhy(i32, RawAddress, u8, u8, GattStatus),
}

#[derive(Debug)]
@@ -503,7 +531,7 @@ type GattServerCb = Arc<Mutex<GattServerCallbacksDispatcher>>;
cb_variant!(
    GattClientCb,
    gc_register_client_cb -> GattClientCallbacks::RegisterClient,
    i32, i32, *const Uuid, {
    i32 -> GattStatus, i32, *const Uuid, {
        let _2 = unsafe { *_2.clone() };
    }
);
@@ -511,7 +539,7 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_open_cb -> GattClientCallbacks::Connect,
    i32, i32, i32, *const FfiAddress, {
    i32, i32 -> GattStatus, i32, *const FfiAddress, {
        let _3 = unsafe { deref_ffi_address!(_3) };
    }
);
@@ -519,7 +547,7 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_close_cb -> GattClientCallbacks::Disconnect,
    i32, i32, i32, *const FfiAddress, {
    i32, i32 -> GattStatus, i32, *const FfiAddress, {
        let _3 = unsafe { deref_ffi_address!(_3) };
    }
);
@@ -527,13 +555,13 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_search_complete_cb -> GattClientCallbacks::SearchComplete,
    i32, i32, {}
    i32, i32 -> GattStatus, {}
);

cb_variant!(
    GattClientCb,
    gc_register_for_notification_cb -> GattClientCallbacks::RegisterForNotification,
    i32, i32, i32, u16, {}
    i32, i32, i32 -> GattStatus, u16, {}
);

cb_variant!(
@@ -547,7 +575,7 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_read_characteristic_cb -> GattClientCallbacks::ReadCharacteristic,
    i32, i32, *mut BtGattReadParams, {
    i32, i32 -> GattStatus, *mut BtGattReadParams, {
        let _2 = unsafe { *_2.clone() };
    }
);
@@ -555,13 +583,13 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_write_characteristic_cb -> GattClientCallbacks::WriteCharacteristic,
    i32, i32, u16, u16, *const u8, {}
    i32, i32 -> GattStatus, u16, u16, *const u8, {}
);

cb_variant!(
    GattClientCb,
    gc_read_descriptor_cb -> GattClientCallbacks::ReadDescriptor,
    i32, i32, *const BtGattReadParams, {
    i32, i32 -> GattStatus, *const BtGattReadParams, {
        let _2 = unsafe { *_2.clone() };
    }
);
@@ -569,19 +597,19 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_write_descriptor_cb -> GattClientCallbacks::WriteDescriptor,
    i32, i32, u16, u16, *const u8, {}
    i32, i32 -> GattStatus, u16, u16, *const u8, {}
);

cb_variant!(
    GattClientCb,
    gc_execute_write_cb -> GattClientCallbacks::ExecuteWrite,
    i32, i32, {}
    i32, i32 -> GattStatus, {}
);

cb_variant!(
    GattClientCb,
    gc_read_remote_rssi_cb -> GattClientCallbacks::ReadRemoteRssi,
    i32, *const FfiAddress, i32, i32, {
    i32, *const FfiAddress, i32, i32 -> GattStatus, {
        let _1 = unsafe { deref_ffi_address!(_1) };
    }
);
@@ -589,7 +617,7 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_configure_mtu_cb -> GattClientCallbacks::ConfigureMtu,
    i32, i32, i32, {}
    i32, i32 -> GattStatus, i32, {}
);

cb_variant!(
@@ -609,13 +637,13 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    gc_phy_updated_cb -> GattClientCallbacks::PhyUpdated,
    i32, u8, u8, u8, {}
    i32, u8, u8, u8 -> GattStatus, {}
);

cb_variant!(
    GattClientCb,
    gc_conn_updated_cb -> GattClientCallbacks::ConnUpdated,
    i32, u16, u16, u16, u8, {}
    i32, u16, u16, u16, u8 -> GattStatus, {}
);

cb_variant!(
@@ -627,7 +655,7 @@ cb_variant!(
cb_variant!(
    GattClientCb,
    read_phy_callback -> GattClientCallbacks::ReadPhy,
    i32, ffi::RustRawAddress -> RawAddress, u8, u8, u8, {
    i32, ffi::RustRawAddress -> RawAddress, u8, u8, u8 -> GattStatus, {
        let _1 = RawAddress { val: _1.address };
    }
);
@@ -751,7 +779,7 @@ cb_variant!(
/// `BleScannerInterface`.
#[derive(Debug)]
pub enum GattScannerCallbacks {
    OnScannerRegistered(Uuid, u8, u8),
    OnScannerRegistered(Uuid, u8, GattStatus),
    OnSetScannerParameterComplete(u8, u8),
    OnScanResult(u16, u8, RawAddress, u8, u8, u8, i8, i8, u16, Vec<u8>),
    OnTrackAdvFoundLost(AdvertisingTrackInfo),
@@ -768,7 +796,7 @@ type GDScannerCb = Arc<Mutex<GattScannerCallbacksDispatcher>>;
cb_variant!(
    GDScannerCb,
    gdscan_on_scanner_registered -> GattScannerCallbacks::OnScannerRegistered,
    *const i8, u8, u8, {
    *const i8, u8, u8 -> GattStatus, {
        let _0 = unsafe { *(_0 as *const Uuid).clone() };
    }
);