use crate::time::Hertz;
use embedded_hal_02::{
blocking::delay::{DelayMs, DelayUs},
timer::{Cancel, CountDown, Periodic},
};
use fugit::{ExtU32, TimerDurationU32};
use void::Void;
use super::{Counter, CounterHz, Delay, Error, Instance, SysCounter, SysCounterHz, SysDelay};
impl DelayUs<u32> for SysDelay {
fn delay_us(&mut self, us: u32) {
self.delay(us.micros())
}
}
impl DelayMs<u32> for SysDelay {
fn delay_ms(&mut self, ms: u32) {
self.delay_us(ms * 1_000);
}
}
impl DelayUs<u16> for SysDelay {
fn delay_us(&mut self, us: u16) {
self.delay_us(us as u32)
}
}
impl DelayMs<u16> for SysDelay {
fn delay_ms(&mut self, ms: u16) {
self.delay_ms(ms as u32);
}
}
impl DelayUs<u8> for SysDelay {
fn delay_us(&mut self, us: u8) {
self.delay_us(us as u32)
}
}
impl DelayMs<u8> for SysDelay {
fn delay_ms(&mut self, ms: u8) {
self.delay_ms(ms as u32);
}
}
impl<TIM> Periodic for CounterHz<TIM> {}
impl Periodic for SysCounterHz {}
impl<const FREQ: u32> Periodic for SysCounter<FREQ> {}
impl CountDown for SysCounterHz {
type Time = Hertz;
fn start<T>(&mut self, timeout: T)
where
T: Into<Hertz>,
{
self.start(timeout.into()).unwrap()
}
fn wait(&mut self) -> nb::Result<(), Void> {
match self.wait() {
Err(nb::Error::WouldBlock) => Err(nb::Error::WouldBlock),
_ => Ok(()),
}
}
}
impl Cancel for SysCounterHz {
type Error = Error;
fn cancel(&mut self) -> Result<(), Self::Error> {
self.cancel()
}
}
impl<TIM: Instance> CountDown for CounterHz<TIM> {
type Time = Hertz;
fn start<T>(&mut self, timeout: T)
where
T: Into<Hertz>,
{
self.start(timeout.into()).unwrap()
}
fn wait(&mut self) -> nb::Result<(), Void> {
match self.wait() {
Err(nb::Error::WouldBlock) => Err(nb::Error::WouldBlock),
_ => Ok(()),
}
}
}
impl<TIM: Instance> Cancel for CounterHz<TIM> {
type Error = Error;
fn cancel(&mut self) -> Result<(), Self::Error> {
self.cancel()
}
}
impl<const FREQ: u32> CountDown for SysCounter<FREQ> {
type Time = TimerDurationU32<FREQ>;
fn start<T>(&mut self, timeout: T)
where
T: Into<Self::Time>,
{
self.start(timeout.into()).unwrap()
}
fn wait(&mut self) -> nb::Result<(), Void> {
match self.wait() {
Err(nb::Error::WouldBlock) => Err(nb::Error::WouldBlock),
_ => Ok(()),
}
}
}
impl<const FREQ: u32> Cancel for SysCounter<FREQ> {
type Error = Error;
fn cancel(&mut self) -> Result<(), Self::Error> {
self.cancel()
}
}
impl<TIM: Instance, const FREQ: u32> DelayUs<u32> for Delay<TIM, FREQ> {
fn delay_us(&mut self, us: u32) {
self.delay(us.micros())
}
}
impl<TIM: Instance, const FREQ: u32> DelayMs<u32> for Delay<TIM, FREQ> {
fn delay_ms(&mut self, ms: u32) {
self.delay(ms.millis())
}
}
impl<TIM: Instance, const FREQ: u32> DelayUs<u16> for Delay<TIM, FREQ> {
fn delay_us(&mut self, us: u16) {
self.delay((us as u32).micros())
}
}
impl<TIM: Instance, const FREQ: u32> DelayMs<u16> for Delay<TIM, FREQ> {
fn delay_ms(&mut self, ms: u16) {
self.delay((ms as u32).millis())
}
}
impl<TIM: Instance, const FREQ: u32> DelayUs<u8> for Delay<TIM, FREQ> {
fn delay_us(&mut self, us: u8) {
self.delay((us as u32).micros())
}
}
impl<TIM: Instance, const FREQ: u32> DelayMs<u8> for Delay<TIM, FREQ> {
fn delay_ms(&mut self, ms: u8) {
self.delay((ms as u32).millis())
}
}
impl<TIM: Instance, const FREQ: u32> Periodic for Counter<TIM, FREQ> {}
impl<TIM: Instance, const FREQ: u32> CountDown for Counter<TIM, FREQ> {
type Time = TimerDurationU32<FREQ>;
fn start<T>(&mut self, timeout: T)
where
T: Into<Self::Time>,
{
self.start(timeout.into()).unwrap()
}
fn wait(&mut self) -> nb::Result<(), Void> {
match self.wait() {
Err(nb::Error::WouldBlock) => Err(nb::Error::WouldBlock),
_ => Ok(()),
}
}
}
impl<TIM: Instance, const FREQ: u32> Cancel for Counter<TIM, FREQ> {
type Error = Error;
fn cancel(&mut self) -> Result<(), Self::Error> {
self.cancel()
}
}