1#[cfg(all(feature = "bbb", feature = "scsi"))]
4use crate::subclass::scsi::{Scsi, ScsiCommand};
5#[cfg(all(feature = "bbb", feature = "ufi"))]
6use crate::subclass::ufi::{Ufi, UfiCommand};
7#[cfg(all(any(feature = "scsi", feature = "ufi"), feature = "bbb"))]
8use {
9 crate::transport::bbb::{BulkOnly, BulkOnlyError},
10 crate::transport::{CommandStatus, TransportError},
11 core::borrow::BorrowMut,
12 usb_device::bus::UsbBus,
13};
14
15#[cfg(feature = "scsi")]
16pub mod scsi;
17#[cfg(feature = "ufi")]
18pub mod ufi;
19
20pub struct Command<'a, Kind, Class> {
22 #[allow(dead_code)]
23 class: &'a mut Class,
24 pub kind: Kind,
25 pub lun: u8,
26}
27
28#[cfg(all(feature = "bbb", feature = "ufi"))]
33impl<'a, 'alloc, Bus: UsbBus + 'alloc, Buf: BorrowMut<[u8]>>
34 Command<'a, UfiCommand, Ufi<BulkOnly<'alloc, Bus, Buf>>>
35{
36 pub fn read_data(&mut self, dst: &mut [u8]) -> Result<usize, TransportError<BulkOnlyError>> {
38 self.class.transport.read_data(dst)
39 }
40
41 pub fn write_data(&mut self, src: &[u8]) -> Result<usize, TransportError<BulkOnlyError>> {
43 self.class.transport.write_data(src)
44 }
45
46 pub fn try_write_data_all(&mut self, src: &[u8]) -> Result<(), TransportError<BulkOnlyError>> {
48 self.class.transport.try_write_data_all(src)
49 }
50
51 pub fn pass(self, num_bytes_processed: u32) {
58 self.class
59 .transport
60 .set_status(CommandStatus::Passed, num_bytes_processed);
61 }
62
63 pub fn fail(self, num_bytes_processed: u32) {
70 self.class
71 .transport
72 .set_status(CommandStatus::Failed, num_bytes_processed);
73 }
74
75 pub fn fail_phase(self) {
77 self.class
78 .transport
79 .set_status(CommandStatus::PhaseError, 0);
80 }
81}
82
83#[cfg(all(feature = "bbb", feature = "scsi"))]
88impl<'a, 'alloc, Bus: UsbBus + 'alloc, Buf: BorrowMut<[u8]>>
89 Command<'a, ScsiCommand, Scsi<BulkOnly<'alloc, Bus, Buf>>>
90{
91 pub fn read_data(&mut self, dst: &mut [u8]) -> Result<usize, TransportError<BulkOnlyError>> {
93 self.class.transport.read_data(dst)
94 }
95
96 pub fn write_data(&mut self, src: &[u8]) -> Result<usize, TransportError<BulkOnlyError>> {
98 self.class.transport.write_data(src)
99 }
100
101 pub fn try_write_data_all(&mut self, src: &[u8]) -> Result<(), TransportError<BulkOnlyError>> {
103 self.class.transport.try_write_data_all(src)
104 }
105
106 pub fn pass(self, num_bytes_processed: u32) {
113 self.class
114 .transport
115 .set_status(CommandStatus::Passed, num_bytes_processed);
116 }
117
118 pub fn fail(self, num_bytes_processed: u32) {
125 self.class
126 .transport
127 .set_status(CommandStatus::Failed, num_bytes_processed);
128 }
129
130 pub fn fail_phase(self) {
132 self.class
133 .transport
134 .set_status(CommandStatus::PhaseError, 0);
135 }
136}