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

Commit cfd17817 authored by Zach Johnson's avatar Zach Johnson
Browse files

rusty-gd: A bit more controller

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost SimpleHalTest
Change-Id: I999c43fdbb5bcbcbb005dece73192ec2300138d0
parent 0b98dde2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -358,7 +358,7 @@ void StructDef::GenRustSizeField(std::ostream& s) const {
}

void StructDef::GenRustDeclarations(std::ostream& s) const {
  s << "#[derive(Debug)] ";
  s << "#[derive(Debug, Clone)] ";
  s << "pub struct " << name_ << "{";

  // Generate struct fields
+60 −6
Original line number Diff line number Diff line
@@ -2,7 +2,10 @@

use crate::HciExports;
use bt_packets::hci::{
    Enable, ErrorCode, LeSetEventMaskBuilder, SetEventMaskBuilder, WriteSimplePairingModeBuilder, WriteLeHostSupportBuilder
    Enable, ErrorCode, LeSetEventMaskBuilder, LocalVersionInformation, ReadBufferSizeBuilder,
    ReadLocalExtendedFeaturesBuilder, ReadLocalNameBuilder, ReadLocalSupportedCommandsBuilder,
    ReadLocalVersionInformationBuilder, SetEventMaskBuilder, WriteLeHostSupportBuilder,
    WriteSimplePairingModeBuilder,
};
use gddi::{module, provides, Stoppable};

@@ -14,9 +17,12 @@ module! {
}

macro_rules! assert_success {
    ($hci:ident.send($builder:expr)) => {
        assert!($hci.send($builder).await.get_status() == ErrorCode::Success);
    };
    ($hci:ident.send($builder:expr)) => {{
        let response = $hci.send($builder).await;
        assert!(response.get_status() == ErrorCode::Success);

        response
    }};
}

#[provides]
@@ -34,9 +40,57 @@ async fn provide_controller(mut hci: HciExports) -> ControllerExports {
        le_supported_host: Enable::Enabled
    }));

    ControllerExports {}
    let response = assert_success!(hci.send(ReadLocalNameBuilder {}));
    let name = std::str::from_utf8(response.get_local_name()).unwrap();
    let name = name[0..name.find('\0').unwrap()].to_string();

    let version_info = assert_success!(hci.send(ReadLocalVersionInformationBuilder {}))
        .get_local_version_information()
        .clone();

    let supported_commands = assert_success!(hci.send(ReadLocalSupportedCommandsBuilder {}))
        .get_supported_commands()
        .clone();

    let lmp_features = read_lmp_features(&mut hci).await;

    let buffer_size = assert_success!(hci.send(ReadBufferSizeBuilder {}));

    ControllerExports {
        name,
        version_info,
        supported_commands,
        lmp_features,
        acl_buffer_length: buffer_size.get_acl_data_packet_length(),
        acl_buffers: buffer_size.get_total_num_acl_data_packets(),
        sco_buffer_length: buffer_size.get_synchronous_data_packet_length(),
        sco_buffers: buffer_size.get_total_num_synchronous_data_packets(),
    }
}

async fn read_lmp_features(hci: &mut HciExports) -> Vec<u64> {
    let mut features = Vec::new();
    let mut page_number: u8 = 0;
    let mut max_page_number: u8 = 1;
    while page_number < max_page_number {
        let response = assert_success!(hci.send(ReadLocalExtendedFeaturesBuilder { page_number }));
        max_page_number = response.get_maximum_page_number();
        features.push(response.get_extended_lmp_features());
        page_number += 1;
    }

    features
}

/// Controller interface
#[derive(Clone, Stoppable)]
pub struct ControllerExports {}
pub struct ControllerExports {
    name: String,
    version_info: LocalVersionInformation,
    supported_commands: [u8; 64],
    lmp_features: Vec<u64>,
    acl_buffer_length: u16,
    acl_buffers: u16,
    sco_buffer_length: u8,
    sco_buffers: u16,
}