#[cfg(all(feature = "bbb", feature = "scsi"))]
use crate::subclass::scsi::{Scsi, ScsiCommand};
#[cfg(all(feature = "bbb", feature = "ufi"))]
use crate::subclass::ufi::{Ufi, UfiCommand};
#[cfg(all(any(feature = "scsi", feature = "ufi"), feature = "bbb"))]
use {
crate::transport::bbb::{BulkOnly, BulkOnlyError},
crate::transport::{CommandStatus, TransportError},
core::borrow::BorrowMut,
usb_device::bus::UsbBus,
};
#[cfg(feature = "scsi")]
pub mod scsi;
#[cfg(feature = "ufi")]
pub mod ufi;
pub struct Command<'a, Kind, Class> {
#[allow(dead_code)]
class: &'a mut Class,
pub kind: Kind,
pub lun: u8,
}
#[cfg(all(feature = "bbb", feature = "ufi"))]
impl<'a, 'alloc, Bus: UsbBus + 'alloc, Buf: BorrowMut<[u8]>>
Command<'a, UfiCommand, Ufi<BulkOnly<'alloc, Bus, Buf>>>
{
pub fn read_data(&mut self, dst: &mut [u8]) -> Result<usize, TransportError<BulkOnlyError>> {
self.class.transport.read_data(dst)
}
pub fn write_data(&mut self, src: &[u8]) -> Result<usize, TransportError<BulkOnlyError>> {
self.class.transport.write_data(src)
}
pub fn try_write_data_all(&mut self, src: &[u8]) -> Result<(), TransportError<BulkOnlyError>> {
self.class.transport.try_write_data_all(src)
}
pub fn pass(self) {
self.class.transport.set_status(CommandStatus::Passed);
}
pub fn fail(self) {
self.class.transport.set_status(CommandStatus::Failed);
}
pub fn fail_phase(self) {
self.class.transport.set_status(CommandStatus::PhaseError);
}
}
#[cfg(all(feature = "bbb", feature = "scsi"))]
impl<'a, 'alloc, Bus: UsbBus + 'alloc, Buf: BorrowMut<[u8]>>
Command<'a, ScsiCommand, Scsi<BulkOnly<'alloc, Bus, Buf>>>
{
pub fn read_data(&mut self, dst: &mut [u8]) -> Result<usize, TransportError<BulkOnlyError>> {
self.class.transport.read_data(dst)
}
pub fn write_data(&mut self, src: &[u8]) -> Result<usize, TransportError<BulkOnlyError>> {
self.class.transport.write_data(src)
}
pub fn try_write_data_all(&mut self, src: &[u8]) -> Result<(), TransportError<BulkOnlyError>> {
self.class.transport.try_write_data_all(src)
}
pub fn pass(self) {
self.class.transport.set_status(CommandStatus::Passed);
}
pub fn fail(self) {
self.class.transport.set_status(CommandStatus::Failed);
}
pub fn fail_phase(self) {
self.class.transport.set_status(CommandStatus::PhaseError);
}
}