libbladerf-rs 0.5.0

Fully Rust native BladeRF driver
//! XB-100 LED expansion board GPIO control.
//!
//! The XB-100 provides 8 user LEDs (D1–D8) and one tri-color LED (TLED
//! with red, green, blue components), all accessible through the
//! expansion GPIO.

use crate::bladerf1::board::RfLinkSession;
use crate::error::Result;
use crate::maybe_future::Op;
use nusb::MaybeFuture;

macro_rules! bladerf_xb_gpio {
    ($n:expr) => {
        (1 << ($n - 1)) as u8
    };
}

const BLADERF_XB_GPIO_20: u8 = bladerf_xb_gpio!(20);
const BLADERF_XB_GPIO_21: u8 = bladerf_xb_gpio!(21);
const BLADERF_XB_GPIO_22: u8 = bladerf_xb_gpio!(22);
const BLADERF_XB_GPIO_23: u8 = bladerf_xb_gpio!(23);
const BLADERF_XB_GPIO_24: u8 = bladerf_xb_gpio!(24);
const BLADERF_XB_GPIO_25: u8 = bladerf_xb_gpio!(25);
const BLADERF_XB_GPIO_28: u8 = bladerf_xb_gpio!(28);
const BLADERF_XB_GPIO_29: u8 = bladerf_xb_gpio!(29);
const BLADERF_XB_GPIO_30: u8 = bladerf_xb_gpio!(30);
const BLADERF_XB_GPIO_31: u8 = bladerf_xb_gpio!(31);
const BLADERF_XB_GPIO_32: u8 = bladerf_xb_gpio!(32);

const BLADERF_XB100_LED_D1: u8 = BLADERF_XB_GPIO_24;
const BLADERF_XB100_LED_D2: u8 = BLADERF_XB_GPIO_32;
const BLADERF_XB100_LED_D3: u8 = BLADERF_XB_GPIO_30;
const BLADERF_XB100_LED_D4: u8 = BLADERF_XB_GPIO_28;
const BLADERF_XB100_LED_D5: u8 = BLADERF_XB_GPIO_23;
const BLADERF_XB100_LED_D6: u8 = BLADERF_XB_GPIO_25;
const BLADERF_XB100_LED_D7: u8 = BLADERF_XB_GPIO_31;
const BLADERF_XB100_LED_D8: u8 = BLADERF_XB_GPIO_29;
const BLADERF_XB100_TLED_RED: u8 = BLADERF_XB_GPIO_22;
const BLADERF_XB100_TLED_GREEN: u8 = BLADERF_XB_GPIO_21;
const BLADERF_XB100_TLED_BLUE: u8 = BLADERF_XB_GPIO_20;

/// Bitmask for all XB-100 GPIO pins, used for board detection.
pub(crate) const XB100_DETECT_MASK: u32 = (BLADERF_XB100_LED_D1
    | BLADERF_XB100_LED_D2
    | BLADERF_XB100_LED_D3
    | BLADERF_XB100_LED_D4
    | BLADERF_XB100_LED_D5
    | BLADERF_XB100_LED_D6
    | BLADERF_XB100_LED_D7
    | BLADERF_XB100_LED_D8
    | BLADERF_XB100_TLED_RED
    | BLADERF_XB100_TLED_GREEN
    | BLADERF_XB100_TLED_BLUE) as u32;

const XB100_LED_MASK: u32 = XB100_DETECT_MASK;

impl RfLinkSession<'_> {
    /// Prepares the XB-100 board. Currently a no-op placeholder.
    pub fn xb100_attach(&mut self) -> impl MaybeFuture<Output = Result<()>> {
        Op::new(async move {
            self.require_initialized().await?;
            Ok(())
        })
    }
    /// Enables the XB-100 board. When enabled, configures all LED GPIO pins
    /// as outputs and turns the LEDs on. Requires the board to be initialized.
    pub fn xb100_enable(&mut self, enable: bool) -> impl MaybeFuture<Output = Result<()>> {
        Op::new(async move {
            self.require_initialized().await?;
            if enable {
                self.nios
                    .nios_expansion_gpio_dir_write(XB100_LED_MASK, XB100_LED_MASK)
                    .await?;
                self.nios
                    .nios_expansion_gpio_write(XB100_LED_MASK, XB100_LED_MASK)
                    .await?;
            }
            Ok(())
        })
    }
    /// Initializes the XB-100 board. Currently a no-op placeholder.
    pub fn xb100_init(&mut self) -> impl MaybeFuture<Output = Result<()>> {
        Op::new(async move {
            self.require_initialized().await?;
            Ok(())
        })
    }
}