mirror of https://github.com/m-labs/artiq.git
110 lines
2.8 KiB
Rust
110 lines
2.8 KiB
Rust
use alloc::vec::Vec;
|
|
#[cfg(feature = "log")]
|
|
use log;
|
|
|
|
use io::{Read, Write, Error, Result};
|
|
use io::proto::{ProtoRead, ProtoWrite};
|
|
|
|
#[derive(Debug)]
|
|
pub enum Request {
|
|
GetLog,
|
|
ClearLog,
|
|
PullLog,
|
|
#[cfg(feature = "log")]
|
|
SetLogFilter(log::LevelFilter),
|
|
#[cfg(feature = "log")]
|
|
SetUartLogFilter(log::LevelFilter),
|
|
|
|
StartProfiler {
|
|
interval_us: u32,
|
|
hits_size: u32,
|
|
edges_size: u32,
|
|
},
|
|
StopProfiler,
|
|
GetProfile,
|
|
|
|
Hotswap(Vec<u8>),
|
|
Reboot,
|
|
|
|
DebugAllocator,
|
|
}
|
|
|
|
pub enum Reply<'a> {
|
|
Success,
|
|
Unavailable,
|
|
|
|
LogContent(&'a str),
|
|
|
|
Profile,
|
|
|
|
RebootImminent,
|
|
}
|
|
|
|
impl Request {
|
|
pub fn read_from<T: Read>(reader: &mut T) -> Result<Request, T::ReadError> {
|
|
#[cfg(feature = "log")]
|
|
fn read_log_level_filter<T: Read>(reader: &mut T) ->
|
|
Result<log::LevelFilter, T::ReadError> {
|
|
Ok(match reader.read_u8()? {
|
|
0 => log::LevelFilter::Off,
|
|
1 => log::LevelFilter::Error,
|
|
2 => log::LevelFilter::Warn,
|
|
3 => log::LevelFilter::Info,
|
|
4 => log::LevelFilter::Debug,
|
|
5 => log::LevelFilter::Trace,
|
|
_ => return Err(Error::Unrecognized)
|
|
})
|
|
}
|
|
|
|
Ok(match reader.read_u8()? {
|
|
1 => Request::GetLog,
|
|
2 => Request::ClearLog,
|
|
7 => Request::PullLog,
|
|
#[cfg(feature = "log")]
|
|
3 => Request::SetLogFilter(read_log_level_filter(reader)?),
|
|
#[cfg(feature = "log")]
|
|
6 => Request::SetUartLogFilter(read_log_level_filter(reader)?),
|
|
9 => Request::StartProfiler {
|
|
interval_us: reader.read_u32()?,
|
|
hits_size: reader.read_u32()?,
|
|
edges_size: reader.read_u32()?,
|
|
},
|
|
10 => Request::StopProfiler,
|
|
11 => Request::GetProfile,
|
|
4 => Request::Hotswap(reader.read_bytes()?),
|
|
5 => Request::Reboot,
|
|
8 => Request::DebugAllocator,
|
|
_ => return Err(Error::Unrecognized)
|
|
})
|
|
}
|
|
}
|
|
|
|
impl<'a> Reply<'a> {
|
|
pub fn write_to<T: Write>(&self, writer: &mut T) -> Result<(), T::WriteError> {
|
|
match *self {
|
|
Reply::Success => {
|
|
writer.write_u8(1)?;
|
|
}
|
|
|
|
Reply::Unavailable => {
|
|
writer.write_u8(4)?;
|
|
}
|
|
|
|
Reply::LogContent(ref log) => {
|
|
writer.write_u8(2)?;
|
|
writer.write_string(log)?;
|
|
}
|
|
|
|
Reply::Profile => {
|
|
writer.write_u8(5)?;
|
|
// profile data follows
|
|
}
|
|
|
|
Reply::RebootImminent => {
|
|
writer.write_u8(3)?;
|
|
}
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|