kaptan-actuator: improve config abstractions
Signed-off-by: Onur Özkan <work@onurozkan.dev>
This commit is contained in:
1 parent
117e1abe97
commit
07a8038857
7 files changed
+136
-146
No files matched your search
@@ -1,7 +1,56 @@
|
||||
//! Conventional PWM framing and arming policy.
|
||||
|
||||
use crate::ArmingDuration;
|
||||
use core::sync::atomic::{AtomicBool, AtomicU16, Ordering};
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub struct Config {
|
||||
frame_rate: Rate,
|
||||
minimum_pulse: PulseWidth,
|
||||
armed_idle_pulse: PulseWidth,
|
||||
arming_duration: ArmingDuration,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub const fn new(
|
||||
frame_rate: Rate,
|
||||
minimum_pulse: PulseWidth,
|
||||
armed_idle_pulse: PulseWidth,
|
||||
arming_duration: ArmingDuration,
|
||||
) -> Option<Self> {
|
||||
match frame_rate.period_microseconds() {
|
||||
Some(period)
|
||||
if minimum_pulse.microseconds() <= armed_idle_pulse.microseconds()
|
||||
&& armed_idle_pulse.microseconds() <= period =>
|
||||
{
|
||||
Some(Self {
|
||||
frame_rate,
|
||||
minimum_pulse,
|
||||
armed_idle_pulse,
|
||||
arming_duration,
|
||||
})
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub const fn frame_rate(self) -> Rate {
|
||||
self.frame_rate
|
||||
}
|
||||
|
||||
pub const fn minimum_pulse(self) -> PulseWidth {
|
||||
self.minimum_pulse
|
||||
}
|
||||
|
||||
pub const fn armed_idle_pulse(self) -> PulseWidth {
|
||||
self.armed_idle_pulse
|
||||
}
|
||||
|
||||
pub const fn arming_duration(self) -> ArmingDuration {
|
||||
self.arming_duration
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub struct Rate(u16);
|
||||
|
||||
@@ -114,7 +163,8 @@ impl ArmSequence {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::{ArmSequence, FrameValue, PulseWidth, Rate};
|
||||
use super::{ArmSequence, Config, FrameValue, PulseWidth, Rate};
|
||||
use crate::ArmingDuration;
|
||||
|
||||
#[test]
|
||||
fn rate_describes_an_exact_400_hertz_frame() {
|
||||
@@ -134,4 +184,15 @@ mod tests {
|
||||
sequence.disarm();
|
||||
assert_eq!(sequence.next_frame(), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn requires_an_exact_frame_and_ordered_pulses() {
|
||||
let duration = ArmingDuration::from_millis(2_000).unwrap();
|
||||
let rate = Rate::new(400).unwrap();
|
||||
let minimum = PulseWidth::new(1_000).unwrap();
|
||||
let idle = PulseWidth::new(1_100).unwrap();
|
||||
assert!(Config::new(rate, minimum, idle, duration).is_some());
|
||||
assert!(Config::new(Rate::new(333).unwrap(), minimum, idle, duration).is_none());
|
||||
assert!(Config::new(rate, idle, minimum, duration).is_none());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user