Skip to main content

ds/proto/tcp/
inbound.rs

1use crate::ext::BufExt;
2use crate::Result as CResult;
3use bytes::Buf;
4use std::io::{Error, ErrorKind};
5use std::str;
6
7/// Enum containing possible incoming TCP packets from the roboRIO
8#[derive(Debug)]
9pub enum TcpPacket {
10    /// Contains a message from the robot code's standard output
11    Stdout(Stdout),
12    Dummy,
13}
14
15pub(crate) trait IncomingTcpPacket: Sized {
16    fn decode(buf: &mut impl Buf) -> CResult<Self>;
17}
18
19/// Contains data outputted to standard output from robot code. Can be consumed by API users to
20/// display code logs
21#[derive(Debug)]
22pub struct Stdout {
23    pub timestamp: f32,
24    pub message: String,
25    pub seqnum: u16,
26}
27
28impl Stdout {
29    pub fn decode(buf: &mut impl Buf, len: usize) -> CResult<Self> {
30        let timestamp = buf.read_f32_be()?;
31        let seqnum = buf.read_u16_be()?;
32        let mut v = vec![0; len - 6];
33        if buf.remaining() < v.len() {
34            return Err(Error::new(ErrorKind::UnexpectedEof, "Not enough data").into());
35        }
36        buf.copy_to_slice(&mut v[..]);
37        let message = str::from_utf8(&v[..])?;
38        Ok(Stdout {
39            timestamp,
40            message: message.to_string(),
41            seqnum,
42        })
43    }
44}