use libm::round;
#[cfg(feature = "delay-loop")]
mod delay;
#[cfg_attr(feature = "delay-loop", allow(unused_imports))]
#[cfg(feature = "delay-loop")]
pub use delay::*;
#[cfg(feature = "timer-isr")]
mod isr;
#[cfg_attr(feature = "timer-isr", allow(unused_imports))]
#[cfg(feature = "timer-isr")]
pub use isr::*;
#[cfg(feature = "timer-isr")]
mod macros;
#[cfg_attr(feature = "timer-isr", allow(unused_imports))]
#[cfg(feature = "timer-isr")]
pub use macros::*;
pub const BITS_PER_SECOND: u16 = 2_000;
pub const SECONDS_PER_BIT: f32 = 0.0005;
pub const BITS_PER_PICOSECOND: f32 = 2E-12_f32;
pub const PICOSECONDS_PER_BIT: u64 = 500_000_000_000;
pub const PICOSECONDS_PER_MICROSECOND: u32 = 1_000_000;
pub fn compute_ocr_value(f_cpu: u32, prescaler: u32, tick_us: f32) -> (u16, u8) {
let ticks_per_second: f32 = f_cpu as f32 / prescaler as f32;
let ticks_per_bit: u8 = (SECONDS_PER_BIT * ticks_per_second) as u8;
let ticks_per_tick: f32 = ticks_per_second * (tick_us / 1_000_000.0);
(round(ticks_per_tick as f64) as u16, ticks_per_bit)
}
pub const fn const_ocr_value(f_cpu: u32, prescaler: u32, tick_us: f32) -> (u16, u8) {
let tick_ps = ((tick_us as f64) * (PICOSECONDS_PER_MICROSECOND as f64)) as u32; let ticks_per_bit: u8 = (PICOSECONDS_PER_BIT * (tick_ps as u64)) as u8;
let ticks_per_tick =
(f_cpu / prescaler) as u64 * tick_ps as u64 / (PICOSECONDS_PER_MICROSECOND as u64);
(ticks_per_tick as u16, ticks_per_bit)
}
pub fn ticks_per_bit(tick_us: f32) -> u8 {
let tick_ps = ((tick_us as f64) * (PICOSECONDS_PER_MICROSECOND as f64)) as u32;
(PICOSECONDS_PER_BIT * (tick_ps as u64)) as u8
}
pub const fn const_ticks_per_bit(tick_us: f32) -> u8 {
let tick_ps = ((tick_us as f64) * (PICOSECONDS_PER_MICROSECOND as f64)) as u32;
(PICOSECONDS_PER_BIT * (tick_ps as u64)) as u8
}