seeed_erpc/
system_rpcs.rs1use super::{codec, ids, Err};
2use heapless::{consts::U16, String};
3use nom::{number::streaming, InputIter};
4
5pub struct GetVersion {}
7
8impl super::RPC for GetVersion {
9 type ReturnValue = String<U16>;
10 type Error = ();
11
12 fn header(&self, seq: u32) -> codec::Header {
13 codec::Header {
14 sequence: seq,
15 msg_type: ids::MsgType::Invocation,
16 service: ids::Service::System,
17 request: ids::SystemRequest::VersionID.into(),
18 }
19 }
20
21 fn parse(&mut self, data: &[u8]) -> Result<String<U16>, Err<()>> {
22 let (data, hdr) = codec::Header::parse(data)?;
23 if hdr.msg_type != ids::MsgType::Reply
24 || hdr.service != ids::Service::System
25 || hdr.request != ids::SystemRequest::VersionID.into()
26 {
27 return Err(Err::NotOurs);
28 }
29
30 let (data, length) = streaming::le_u32(data)?;
31 if length > 16 {
32 return Err(Err::ResponseOverrun);
33 }
34
35 let mut out: Self::ReturnValue = String::new();
36 for b in data.iter_elements() {
37 out.push(b as char).map_err(|_| Err::ResponseOverrun)?;
38 }
39 Ok(out)
40 }
41}