seeed_erpc/
system_rpcs.rs

1use super::{codec, ids, Err};
2use heapless::{consts::U16, String};
3use nom::{number::streaming, InputIter};
4
5/// Returns a string indicating the firmware version on the wifi chip.
6pub 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}