blob: d7aac8f9bf691747bdeeae97c12fe906d18f4975 [file]
use crate::result::TockResult;
use crate::syscalls::command;
const DRIVER_NUMBER: usize = 0x00002;
mod command_nr {
pub const COUNT: usize = 0;
pub const ON: usize = 1;
pub const OFF: usize = 2;
pub const TOGGLE: usize = 3;
}
pub struct Led {
led_num: usize,
}
pub fn count() -> TockResult<usize> {
command(DRIVER_NUMBER, command_nr::COUNT, 0, 0).map_err(Into::into)
}
pub fn get(led_num: usize) -> Option<Led> {
if led_num < count().ok().unwrap() {
Some(Led { led_num })
} else {
None
}
}
/// Returns an iterator over all available LEDs. If the LED driver is not
/// present, the iterator will be empty.
pub fn all() -> LedIter {
LedIter {
curr_led: 0,
led_count: count().unwrap_or(0),
}
}
impl Led {
pub fn set_state(&self, state: bool) -> TockResult<()> {
if state {
self.on()
} else {
self.off()
}
}
pub fn on(&self) -> TockResult<()> {
command(DRIVER_NUMBER, command_nr::ON, self.led_num, 0)?;
Ok(())
}
pub fn off(&self) -> TockResult<()> {
command(DRIVER_NUMBER, command_nr::OFF, self.led_num, 0)?;
Ok(())
}
pub fn toggle(&self) -> TockResult<()> {
command(DRIVER_NUMBER, command_nr::TOGGLE, self.led_num, 0)?;
Ok(())
}
}
#[derive(Copy, Clone)]
pub struct LedIter {
curr_led: usize,
led_count: usize,
}
impl Iterator for LedIter {
type Item = Led;
fn next(&mut self) -> Option<Self::Item> {
if self.curr_led < self.led_count {
let item = Led {
led_num: self.curr_led,
};
self.curr_led += 1;
Some(item)
} else {
None
}
}
}