use crate::bladerf1::board::RfLinkSession;
pub use crate::bladerf1::hardware::lms6002d::loopback::Loopback;
use crate::error::Result;
use crate::maybe_future::Op;
use crate::usb::BladeRf1UsbInterfaceCommands;
use nusb::MaybeFuture;
impl RfLinkSession<'_> {
pub fn set_loopback(&mut self, lb: Loopback) -> impl MaybeFuture<Output = Result<()>> {
Op::new(async move {
self.require_initialized().await?;
match lb {
Loopback::Firmware => {
self.lms().set_loopback_mode(Loopback::Lna3).await?;
self.nios.usb_set_firmware_loopback(true).await
}
_ => {
let fw_lb_enabled: bool =
self.nios.interface().usb_get_firmware_loopback().await?;
if fw_lb_enabled {
self.nios.usb_set_firmware_loopback(false).await?;
}
self.lms().set_loopback_mode(lb).await
}
}
})
}
pub fn set_lms_loopback(&mut self, lb: Loopback) -> impl MaybeFuture<Output = Result<()>> {
Op::new(async move {
self.require_initialized().await?;
self.lms().set_loopback_mode(lb).await
})
}
pub fn get_lms_loopback(&mut self) -> impl MaybeFuture<Output = Result<Loopback>> {
Op::new(async move {
self.require_initialized().await?;
self.lms().get_loopback_mode().await
})
}
pub fn get_loopback(&mut self) -> impl MaybeFuture<Output = Result<Loopback>> {
Op::new(async move {
self.require_initialized().await?;
let mut lb = Loopback::None;
let fw_lb_enabled = self.nios.interface().usb_get_firmware_loopback().await?;
if fw_lb_enabled {
lb = Loopback::Firmware;
}
if lb == Loopback::None {
lb = self.lms().get_loopback_mode().await?;
}
Ok(lb)
})
}
pub fn is_loopback_mode_supported(&self, lb: Loopback) -> bool {
let supported_modes = [
Loopback::None,
Loopback::BbTxlpfRxvga2,
Loopback::BbTxlpfRxlpf,
Loopback::BbTxvga1Rxlpf,
Loopback::BbTxvga1Rxvga2,
Loopback::Firmware,
Loopback::Lna1,
Loopback::Lna2,
Loopback::Lna3,
];
supported_modes.contains(&lb)
}
}