sim7020 2.2.0

driver for sim7020E NB IoT modem
Documentation
use crate::at_command::{AtRequest, AtResponse, BufferType};
use crate::AtError;

#[cfg(feature = "defmt")]
use defmt::warn;

#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct PDPContextReadDynamicsParameters;

impl AtRequest for PDPContextReadDynamicsParameters {
    type Response = Result<(), AtError>;

    fn get_command<'a>(&'a self, buffer: &'a mut BufferType) -> Result<&'a [u8], usize> {
        at_commands::builder::CommandBuilder::create_set(buffer, true)
            .named("+CGCONTRDP")
            .finish()
    }

    fn parse_response(&self, data: &[u8]) -> Result<AtResponse, AtError> {
        if at_commands::parser::CommandParser::parse(data)
            .expect_identifier(b"\r\nOK\r")
            .finish()
            .is_ok()
        {
            #[cfg(feature = "defmt")]
            warn!("return plain ok. No data available, yet");
            return Ok(AtResponse::Ok);
        }

        let (cid, bearer_id, apn, local_address) = at_commands::parser::CommandParser::parse(data)
            .expect_identifier(b"\r\n+CGCONTRDP: ")
            .expect_int_parameter()
            .expect_int_parameter()
            .expect_string_parameter()
            .expect_string_parameter()
            .expect_identifier(b"\r\n\r\nOK\r")
            .finish()?;
        Ok(AtResponse::PDPContextDynamicParameters(
            cid as u8,
            bearer_id as u8,
            apn.as_ptr(),
            local_address.as_ptr(),
        ))
    }
}