usbd_midi/packet/
reader.rs

1//! Reader for received packets.
2
3use crate::class::{MAX_PACKET_SIZE, MIDI_PACKET_SIZE};
4use crate::packet::{UsbMidiEventPacket, UsbMidiEventPacketError};
5
6/// Packet reader with internal buffer for received message.
7pub struct UsbMidiPacketReader<'a> {
8    buffer: &'a [u8; MAX_PACKET_SIZE],
9    position: usize,
10    raw_bytes_received: usize,
11}
12
13impl<'a> UsbMidiPacketReader<'a> {
14    /// Creates a new reader.
15    pub fn new(buffer: &'a [u8; MAX_PACKET_SIZE], raw_bytes_received: usize) -> Self {
16        UsbMidiPacketReader {
17            buffer,
18            position: 0,
19            raw_bytes_received,
20        }
21    }
22}
23
24impl Iterator for UsbMidiPacketReader<'_> {
25    type Item = Result<UsbMidiEventPacket, UsbMidiEventPacketError>;
26
27    fn next(&mut self) -> Option<Self::Item> {
28        if self.position <= MAX_PACKET_SIZE && self.position < self.raw_bytes_received {
29            let packet = self
30                .buffer
31                .get(self.position..(self.position + MIDI_PACKET_SIZE))
32                .map(UsbMidiEventPacket::try_from);
33
34            self.position += MIDI_PACKET_SIZE;
35            return packet;
36        }
37        None
38    }
39}