#![no_implicit_prelude]
extern crate core;
use core::marker::PhantomData;
use core::option::Option::{self, None, Some};
use crate::asm::{nop, sev, wfe};
use crate::pac::SIO;
pub struct Fifo {
s: SIO,
_p: PhantomData<*const ()>,
}
impl Fifo {
#[inline]
pub fn get() -> Fifo {
Fifo {
s: unsafe { SIO::steal() },
_p: PhantomData,
}
}
#[inline]
pub fn drain(&mut self) {
while self.s.fifo_st().read().vld().bit_is_set() {
let _ = self.s.fifo_rd().read().bits();
}
}
#[inline]
pub fn status(&mut self) -> u32 {
self.s.fifo_st().read().bits()
}
pub fn read_block(&mut self) -> u32 {
while self.s.fifo_st().read().vld().bit_is_clear() {
wfe();
}
self.s.fifo_rd().read().bits()
}
#[inline]
pub fn is_read_ready(&self) -> bool {
self.s.fifo_st().read().vld().bit_is_set()
}
#[inline]
pub fn is_write_ready(&self) -> bool {
self.s.fifo_st().read().rdy().bit_is_set()
}
#[inline]
pub fn read(&mut self) -> Option<u32> {
if self.s.fifo_st().read().vld().bit_is_set() { Some(self.s.fifo_rd().read().bits()) } else { None }
}
pub fn write_block(&mut self, v: u32) {
while self.s.fifo_st().read().rdy().bit_is_clear() {
nop();
}
self.s.fifo_wr().write(|r| unsafe { r.bits(v) });
sev()
}
#[inline]
pub fn write(&mut self, v: u32) -> bool {
if self.s.fifo_st().read().rdy().bit_is_clear() {
return false;
}
self.s.fifo_wr().write(|r| unsafe { r.bits(v) });
sev();
true
}
}