extern crate core;
use core::ffi::*;
use core::ptr;
use core::cmp::{PartialOrd, Ordering};
use crate::types::*;
extern "C" {
fn xwrustffi_pm_set_cb(resume: PmCallback,
suspend: PmCallback,
wakeup: PmCallback,
sleep: PmCallback,
arg: *mut c_void);
fn xwrustffi_pm_suspend();
fn xwrustffi_pm_resume();
fn xwrustffi_pm_get_stage() -> XwSq;
}
pub type PmCallback = extern "C" fn(*mut c_void);
pub fn set_cb(resume: PmCallback, suspend: PmCallback,
wakeup: PmCallback, sleep: PmCallback) {
unsafe {
xwrustffi_pm_set_cb(resume, suspend, wakeup, sleep, ptr::null_mut());
}
}
pub fn suspend() {
unsafe {
xwrustffi_pm_suspend();
}
}
pub fn resume() {
unsafe {
xwrustffi_pm_resume();
}
}
pub struct PmStage(XwSq);
impl PmStage {
pub const SUSPENDED: PmStage = PmStage(0);
pub const SUSPENDING: PmStage = PmStage(1);
pub const RESUMING: PmStage = PmStage(1);
pub const FREEZING: PmStage = PmStage(3);
pub const THAWING: PmStage = PmStage(3);
pub const RUNNING: PmStage = PmStage(4);
}
pub fn get_stage() -> PmStage {
unsafe {
PmStage(xwrustffi_pm_get_stage())
}
}
impl PartialEq for PmStage {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}
impl PartialOrd for PmStage {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
if self.0 < other.0 {
Some(Ordering::Less)
} else if self.0 > other.0 {
Some(Ordering::Greater)
} else {
Some(Ordering::Equal)
}
}
}