huawei_modem/cmd/
network.rs1use crate::{HuaweiModem};
3use crate::at::*;
4use crate::errors::*;
5use futures::Future;
6use crate::util::HuaweiFromPrimitive;
7
8#[repr(u8)]
14#[derive(Fail, Debug, FromPrimitive, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
15pub enum RegistrationState {
16 #[fail(display = "Not registered; not searching for a new operator")]
18 NotRegisteredAndDisabled = 0,
19 #[fail(display = "Registered; on home network")]
21 RegisteredHome = 1,
22 #[fail(display = "Not registered; searching for a new operator")]
24 NotRegisteredSearching = 2,
25 #[fail(display = "Registration denied")]
27 RegistrationDenied = 3,
28 #[fail(display = "Unknown registration state")]
30 Unknown = 4,
31 #[fail(display = "Registered; roaming")]
33 RegisteredRoaming = 5
34}
35impl RegistrationState {
36 pub fn is_registered(&self) -> bool {
39 use self::RegistrationState::*;
40
41 match *self {
42 RegisteredHome => true,
43 RegisteredRoaming => true,
44 _ => false
45 }
46 }
47}
48#[repr(u8)]
55#[derive(Fail, Debug, FromPrimitive, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
56pub enum ModemOperationMode {
57 #[fail(display = "Minimum functionality; disable RF but keep SIM power")]
61 MinimumFunctionality = 0,
62 #[fail(display = "Online mode")]
64 OnlineMode = 1,
65 #[fail(display = "Offline mode")]
67 OfflineMode = 4,
68 #[fail(display = "FTM mode")]
72 FtmMode = 5,
73 #[fail(display = "Restart modem")]
75 Restart = 6,
76 #[fail(display = "Disable RF")]
78 DisableRf = 7
79}
80#[repr(u8)]
84#[derive(Fail, Debug, Copy, Clone, PartialEq, Eq)]
85pub enum PinState {
86 #[fail(display = "Ready; no passwords required")]
88 Ready,
89 #[fail(display = "SIM PIN required")]
91 SimPin,
92 #[fail(display = "SIM PUK required")]
94 SimPuk,
95 #[fail(display = "SIM PIN2 required")]
97 SimPin2,
98 #[fail(display = "SIM PUK2 required")]
100 SimPuk2
101}
102impl PinState {
103 pub(crate) fn from_string(st: &str) -> HuaweiResult<Self> {
105 let r = match st {
106 "READY" => PinState::Ready,
107 "SIM PIN" => PinState::SimPin,
108 "SIM PUK" => PinState::SimPuk,
109 "SIM PIN2" => PinState::SimPin2,
110 "SIM PUK2" => PinState::SimPuk2,
111 oth => return Err(HuaweiError::ValueOutOfRange(
112 AtValue::Unknown(oth.into())
113 ))
114 };
115 Ok(r)
116 }
117}
118pub fn get_registration(modem: &mut HuaweiModem) -> impl Future<Item = RegistrationState, Error = HuaweiError> {
120 modem.send_raw(AtCommand::Read { param: "+CREG".into() })
121 .and_then(|pkt| {
122 let reg = pkt.extract_named_response("+CREG")?
123 .get_array()?
124 .get(1)
125 .ok_or(HuaweiError::TypeMismatch)?
126 .get_integer()?;
127 let regst = RegistrationState::from_integer(*reg)?;
128 Ok(regst)
129 })
130}
131pub fn get_operation_mode(modem: &mut HuaweiModem) -> impl Future<Item = ModemOperationMode, Error = HuaweiError> {
133 modem.send_raw(AtCommand::Read { param: "+CFUN".into() })
134 .and_then(|pkt| {
135 let rpl = pkt.extract_named_response("+CFUN")?
136 .get_integer()?;
137 Ok(ModemOperationMode::from_integer(*rpl)?)
138 })
139}
140pub fn get_pin_state(modem: &mut HuaweiModem) -> impl Future<Item = PinState, Error = HuaweiError> {
142 modem.send_raw(AtCommand::Read { param: "+CPIN".into() })
143 .and_then(|pkt| {
144 let rpl = pkt.extract_named_response("+CPIN")?
145 .get_unknown()?;
146 Ok(PinState::from_string(rpl)?)
147 })
148}
149pub fn input_pin(modem: &mut HuaweiModem, pin: String) -> impl Future<Item = (), Error = HuaweiError> {
151 modem.send_raw(AtCommand::Equals {
152 param: "+CPIN".into(),
153 value: AtValue::String(pin)
154 }).and_then(|pkt| {
155 pkt.assert_ok()?;
156 Ok(())
157 })
158}
159#[derive(Debug, Copy, Clone, PartialEq, Eq)]
164pub struct SignalQuality {
165 pub rssi: u32,
175 pub ber: u32
179}
180pub fn get_signal_quality(modem: &mut HuaweiModem) -> impl Future<Item = SignalQuality, Error = HuaweiError> {
182 modem.send_raw(AtCommand::Execute { command: "+CSQ".into() })
183 .and_then(|pkt| {
184 let rpl = pkt.extract_named_response("+CSQ")?
185 .get_array()?;
186 let rssi = rpl.get(0)
187 .ok_or(HuaweiError::TypeMismatch)?
188 .get_integer()?;
189 let ber = rpl.get(1)
190 .ok_or(HuaweiError::TypeMismatch)?
191 .get_integer()?;
192 Ok(SignalQuality { rssi: *rssi, ber: *ber })
193 })
194}