#[derive(Debug, Clone, PartialEq)]
pub enum Message {
Login(Login),
Location(Location),
Status(Status),
Alarm(Alarm),
}
impl Message {
pub fn ack_bytes(&self) -> Option<[u8; 10]> {
match self {
Message::Login(login) => Some(crate::response::build_ack(0x01, login.serial_number)),
Message::Status(status) => Some(crate::response::build_ack(0x13, status.serial_number)),
Message::Location(_) | Message::Alarm(_) => None,
}
}
pub fn expects_ack(&self) -> bool {
self.ack_bytes().is_some()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Login {
pub imei: String,
pub serial_number: u16,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Fix {
pub time: i64,
pub satellites: Option<u8>,
pub satellites_active: Option<u8>,
pub latitude: f64,
pub longitude: f64,
pub speed_kmh: u8,
pub course: u16,
pub real_time_gps: bool,
pub gps_positioned: bool,
pub mcc: Option<u16>,
pub mnc: Option<u8>,
pub lac: Option<u16>,
pub cell_id: Option<u32>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Location {
pub imei: Option<String>,
pub fix: Fix,
pub extended: bool,
pub serial_number: u16,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Status {
pub imei: Option<String>,
pub flags: StatusFlags,
pub voltage_level: VoltageLevel,
pub gsm_signal: GsmSignal,
pub serial_number: u16,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Alarm {
pub imei: Option<String>,
pub fix: Fix,
pub terminal_info: AlarmTerminalInfo,
pub voltage_level: VoltageLevel,
pub gsm_signal: GsmSignal,
pub alarm: AlarmEvent,
pub language: Language,
pub serial_number: u16,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StatusFlags {
pub defended: bool,
pub ignition: bool,
pub charging: bool,
pub alarm: TerminalAlarm,
pub gps_tracking: bool,
pub relay_state: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct AlarmTerminalInfo {
pub activated: bool,
pub acc_high: bool,
pub charging: bool,
pub alarm: TerminalAlarm,
pub gps_tracking: bool,
pub oil_electric_disconnected: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TerminalAlarm {
Normal,
Shock,
PowerCut,
LowBattery,
Sos,
}
impl From<u8> for TerminalAlarm {
fn from(bits: u8) -> Self {
match bits {
1 => TerminalAlarm::Shock,
2 => TerminalAlarm::PowerCut,
3 => TerminalAlarm::LowBattery,
4 => TerminalAlarm::Sos,
_ => TerminalAlarm::Normal,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AlarmEvent {
Normal,
Sos,
PowerCutAlarm,
ShockAlarm,
FenceIn,
FenceOut,
Unknown(u8),
}
impl From<u8> for AlarmEvent {
fn from(value: u8) -> Self {
match value {
0x00 => AlarmEvent::Normal,
0x01 => AlarmEvent::Sos,
0x02 => AlarmEvent::PowerCutAlarm,
0x03 => AlarmEvent::ShockAlarm,
0x04 => AlarmEvent::FenceIn,
0x05 => AlarmEvent::FenceOut,
other => AlarmEvent::Unknown(other),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Language {
Chinese,
English,
Unknown(u8),
}
impl From<u8> for Language {
fn from(value: u8) -> Self {
match value {
0x01 => Language::Chinese,
0x02 => Language::English,
other => Language::Unknown(other),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VoltageLevel {
NoPower,
ExtremelyLow,
VeryLow,
Low,
Medium,
High,
VeryHigh,
}
impl From<u8> for VoltageLevel {
fn from(value: u8) -> Self {
match value {
1 => VoltageLevel::ExtremelyLow,
2 => VoltageLevel::VeryLow,
3 => VoltageLevel::Low,
4 => VoltageLevel::Medium,
5 => VoltageLevel::High,
6 => VoltageLevel::VeryHigh,
_ => VoltageLevel::NoPower,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GsmSignal {
NoSignal,
ExtremelyWeak,
VeryWeak,
Good,
Strong,
}
impl From<u8> for GsmSignal {
fn from(value: u8) -> Self {
match value {
1 => GsmSignal::ExtremelyWeak,
2 => GsmSignal::VeryWeak,
3 => GsmSignal::Good,
4 => GsmSignal::Strong,
_ => GsmSignal::NoSignal,
}
}
}