sim7020 2.2.0

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

#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum UnsolicitedResultCodes {
    Disabled,
    Enabled,
    EnabledVerbose,
}

impl From<i32> for UnsolicitedResultCodes {
    fn from(code: i32) -> Self {
        match code {
            0 => UnsolicitedResultCodes::Disabled,
            1 => UnsolicitedResultCodes::Enabled,
            2 => UnsolicitedResultCodes::EnabledVerbose,
            _ => {
                unreachable!()
            }
        }
    }
}

#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum NetworkRegistrationStatus {
    NotRegistered,
    RegisteredHomeNetwork,
    NotRegisteredSearching,
    RegistrationDenied,
    Unknown,
    RegisteredRoaming,
    SMSOnlyHome,
    SMSOnlyRoaming,
}

impl From<i32> for NetworkRegistrationStatus {
    fn from(code: i32) -> Self {
        match code {
            0 => Self::NotRegistered,
            1 => Self::RegisteredHomeNetwork,
            2 => Self::NotRegisteredSearching,
            3 => Self::RegistrationDenied,
            4 => Self::Unknown,
            5 => Self::RegisteredRoaming,
            6 => Self::SMSOnlyHome,
            7 => Self::SMSOnlyRoaming,
            _ => {
                unreachable!()
            }
        }
    }
}

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

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

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

    fn parse_response(&self, data: &[u8]) -> Result<AtResponse, AtError> {
        let (n, stat) = at_commands::parser::CommandParser::parse(data)
            .expect_identifier(b"\r\n+CGREG: ")
            .expect_int_parameter()
            .expect_int_parameter()
            .expect_identifier(b"\r\n\r\nOK\r")
            .finish()?;
        let unsolicited = UnsolicitedResultCodes::from(n);
        let status = NetworkRegistrationStatus::from(stat);
        Ok(AtResponse::NetworkRegistrationStatus(unsolicited, status))
    }
}