1
0
forked from M-Labs/artiq
artiq/artiq/firmware/runtime/moninj_proto.rs

58 lines
1.8 KiB
Rust

use std::io::{self, Read, Write};
use proto::*;
#[derive(Debug)]
pub enum HostMessage {
Monitor { enable: bool, channel: u32, probe: u8 },
Inject { channel: u32, overrd: u8, value: u8 },
GetInjectionStatus { channel: u32, overrd: u8 }
}
#[derive(Debug)]
pub enum DeviceMessage {
MonitorStatus { channel: u32, probe: u8, value: u32 },
InjectionStatus { channel: u32, overrd: u8, value: u8 }
}
impl HostMessage {
pub fn read_from(reader: &mut Read) -> io::Result<HostMessage> {
Ok(match read_u8(reader)? {
0 => HostMessage::Monitor {
enable: if read_u8(reader)? == 0 { false } else { true },
channel: read_u32(reader)?,
probe: read_u8(reader)?
},
1 => HostMessage::Inject {
channel: read_u32(reader)?,
overrd: read_u8(reader)?,
value: read_u8(reader)?
},
2 => HostMessage::GetInjectionStatus {
channel: read_u32(reader)?,
overrd: read_u8(reader)?
},
_ => return Err(io::Error::new(io::ErrorKind::InvalidData, "unknown packet type"))
})
}
}
impl DeviceMessage {
pub fn write_to(&self, writer: &mut Write) -> io::Result<()> {
match *self {
DeviceMessage::MonitorStatus { channel, probe, value } => {
write_u8(writer, 0)?;
write_u32(writer, channel)?;
write_u8(writer, probe)?;
write_u32(writer, value)?;
},
DeviceMessage::InjectionStatus { channel, overrd, value } => {
write_u8(writer, 1)?;
write_u32(writer, channel)?;
write_u8(writer, overrd)?;
write_u8(writer, value)?;
}
}
Ok(())
}
}