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

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

rusty-gd: some tidying up in rootcanal_hal

Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost SimpleHalTest
Change-Id: I560edb20f8a79d766417ebee7972bc6e43be4718
parent 5ccd0321
Loading
Loading
Loading
Loading
+72 −95
Original line number Diff line number Diff line
@@ -2,24 +2,19 @@
//! This connects to "rootcanal" which provides a simulated
//! Bluetooth chip as well as a simulated environment.

use crate::{Hal, HalExports, Result, H4_HEADER_SIZE};
use bt_packet::{HciCommand, HciEvent, HciPacketHeaderSize, HciPacketType, RawPacket};
use bytes::{BufMut, Bytes, BytesMut};
use gddi::{module, provides};
use std::net::{IpAddr, SocketAddr};
use std::str::FromStr;

use std::sync::Arc;
use tokio::io::{AsyncReadExt, AsyncWriteExt, BufReader};
use tokio::net::TcpStream;
use tokio::select;

use gddi::{module, provides};
use tokio::runtime::Runtime;
use tokio::select;
use tokio::sync::mpsc;

use bt_packet::{HciCommand, HciEvent, HciPacketHeaderSize, HciPacketType, RawPacket};

use std::sync::Arc;

use crate::{Hal, HalExports, Result, H4_HEADER_SIZE};

module! {
    rootcanal_hal_module,
    providers {
@@ -29,9 +24,16 @@ module! {

#[provides]
async fn provide_rootcanal_hal(config: RootcanalConfig, rt: Arc<Runtime>) -> HalExports {
    // Temporarily unwrap, until GDDI supports returning Result types
    println!("starting rootcanal");
    RootcanalHal::start(config, rt).await.unwrap()
    let (hal_exports, hal) = Hal::new();
    let ipaddr = IpAddr::from_str(&config.server_address).unwrap();
    let socket_addr = SocketAddr::new(ipaddr, config.port);
    let stream = TcpStream::connect(&socket_addr).await.unwrap();
    let (reader, writer) = stream.into_split();

    rt.spawn(dispatch_incoming(hal.evt_tx, hal.acl_tx, reader));
    rt.spawn(dispatch_outgoing(hal.cmd_rx, hal.acl_rx, writer));

    hal_exports
}

/// Rootcanal configuration
@@ -51,11 +53,6 @@ impl RootcanalConfig {
    }
}

/// Rootcanal HAL
#[derive(Default)]
pub struct RootcanalHal;

impl RootcanalHal {
/// Send HCI events received from the HAL to the HCI layer
async fn dispatch_incoming<R>(
    evt_tx: mpsc::UnboundedSender<HciEvent>,
@@ -103,15 +100,9 @@ impl RootcanalHal {
{
    loop {
        select! {
                Some(cmd) = cmd_rx.recv() => {
                    Self::write_with_type(&mut writer, HciPacketType::Command, cmd).await?;
                }
                Some(acl) = acl_rx.recv() => {
                    Self::write_with_type(&mut writer, HciPacketType::Acl, acl).await?;
                }
                else => {
                    break;
                }
            Some(cmd) = cmd_rx.recv() => write_with_type(&mut writer, HciPacketType::Command, cmd).await?,
            Some(acl) = acl_rx.recv() => write_with_type(&mut writer, HciPacketType::Acl, acl).await?,
            else => break,
        }
    }

@@ -129,17 +120,3 @@ impl RootcanalHal {

    Ok(())
}

    /// Connect to rootcanal and spawn tasks that handle incoming and outgoing packets
    pub async fn start(config: RootcanalConfig, rt: Arc<Runtime>) -> Result<HalExports> {
        let (hal_exports, hal) = Hal::new();
        let ipaddr = IpAddr::from_str(&config.server_address)?;
        let socket_addr = SocketAddr::new(ipaddr, config.port);
        let stream = TcpStream::connect(&socket_addr).await?;
        let (reader, writer) = stream.into_split();

        rt.spawn(Self::dispatch_incoming(hal.evt_tx, hal.acl_tx, reader));
        rt.spawn(Self::dispatch_outgoing(hal.cmd_rx, hal.acl_rx, writer));
        Ok(hal_exports)
    }
}