use crate::bladerf1::board::RfLinkSession;
pub use crate::bladerf1::hardware::lms6002d::loopback::Loopback;
use crate::error::Result;
use crate::usb::BladeRf1UsbInterfaceCommands;
impl RfLinkSession<'_> {
pub fn set_loopback(&mut self, lb: Loopback) -> Result<()> {
self.require_initialized()?;
match lb {
Loopback::Firmware => {
self.lms().set_loopback_mode(Loopback::Lna3)?;
self.nios.usb_set_firmware_loopback(true)
}
_ => {
let fw_lb_enabled: bool = self.nios.usb_get_firmware_loopback()?;
if fw_lb_enabled {
self.nios.usb_set_firmware_loopback(false)?;
}
self.lms().set_loopback_mode(lb)
}
}
}
pub fn set_lms_loopback(&mut self, lb: Loopback) -> Result<()> {
self.require_initialized()?;
self.lms().set_loopback_mode(lb)
}
pub fn get_lms_loopback(&mut self) -> Result<Loopback> {
self.require_initialized()?;
self.lms().get_loopback_mode()
}
pub fn get_loopback(&mut self) -> Result<Loopback> {
self.require_initialized()?;
let mut lb = Loopback::None;
let fw_lb_enabled = self.nios.usb_get_firmware_loopback()?;
if fw_lb_enabled {
lb = Loopback::Firmware;
}
if lb == Loopback::None {
lb = self.lms().get_loopback_mode()?;
}
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)
}
}