use flipperzero_sys as sys;
use ufmt::derive::uDebug;
use crate::furi;
pub fn is_irq_or_masked() -> bool {
unsafe { sys::furi_kernel_is_irq_or_masked() }
}
pub fn is_running() -> bool {
unsafe { sys::furi_kernel_is_running() }
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, uDebug)]
pub enum LockState {
Unlocked = 0,
Locked = 1,
}
impl From<i32> for LockState {
fn from(value: i32) -> Self {
match value {
0 => LockState::Unlocked,
_ => LockState::Locked,
}
}
}
impl From<LockState> for i32 {
fn from(value: LockState) -> Self {
value as i32
}
}
pub fn lock() -> furi::Result<LockState> {
let status = sys::furi::Status::from(unsafe { sys::furi_kernel_lock() });
status.into_result().map(LockState::from)
}
pub fn unlock() -> furi::Result<LockState> {
let status = sys::furi::Status::from(unsafe { sys::furi_kernel_unlock() });
Ok(status.into_result()?.into())
}
pub fn restore_lock(state: LockState) -> furi::Result<LockState> {
let status = sys::furi::Status::from(unsafe { sys::furi_kernel_restore_lock(state.into()) });
Ok(status.into_result()?.into())
}
#[inline]
pub fn get_tick_frequency() -> u32 {
unsafe { sys::furi_kernel_get_tick_frequency() }
}
#[inline]
pub fn get_tick() -> u32 {
unsafe { sys::furi_get_tick() }
}