hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
use core::sync::atomic::{AtomicI16, AtomicU32, Ordering};

#[derive(Clone, Copy, PartialEq)]
pub enum SignalQuality {
    NoSignal,
    Poor,
    Fair,
    Good,
    Excellent,
}

static RSSI_DBM: AtomicI16 = AtomicI16::new(-120);
static CELL_ID: AtomicU32 = AtomicU32::new(0);

pub fn rssi_to_quality(rssi_dbm: i16) -> SignalQuality {
    if rssi_dbm <= -110 {
        SignalQuality::NoSignal
    } else if rssi_dbm <= -100 {
        SignalQuality::Poor
    } else if rssi_dbm <= -85 {
        SignalQuality::Fair
    } else if rssi_dbm <= -70 {
        SignalQuality::Good
    } else {
        SignalQuality::Excellent
    }
}

pub fn rssi_from_raw(raw: u32) -> i16 {
    if raw == 99 || raw == 0 {
        return -120;
    }
    -113 + (raw as i16 * 2)
}

pub fn bars(rssi_dbm: i16) -> u8 {
    match rssi_to_quality(rssi_dbm) {
        SignalQuality::NoSignal => 0,
        SignalQuality::Poor => 1,
        SignalQuality::Fair => 2,
        SignalQuality::Good => 3,
        SignalQuality::Excellent => 4,
    }
}

pub fn update_rssi(dbm: i16) {
    RSSI_DBM.store(dbm, Ordering::Release);
}

pub fn current_rssi() -> i16 {
    RSSI_DBM.load(Ordering::Acquire)
}

pub fn update_cell_id(id: u32) {
    CELL_ID.store(id, Ordering::Release);
}

pub fn current_cell_id() -> u32 {
    CELL_ID.load(Ordering::Acquire)
}

pub fn quality() -> SignalQuality {
    rssi_to_quality(current_rssi())
}