use std::time::Duration;
use crate::error::Result;
use crate::protocol::FrameType;
use crate::protocol::command::{emit_pace_payload, imperfect_payload, move_ride_payload};
use crate::types::EmitPace;
use super::Device;
pub(crate) fn ride_window_ms(window: Option<Duration>) -> u16 {
match window {
None => 0,
Some(d) => (d.as_millis().min(u16::MAX as u128) as u16).max(1),
}
}
pub(crate) fn emit_pace_wire(pace: EmitPace) -> (u8, u16) {
match pace {
EmitPace::Learned => (0, 0),
EmitPace::Interval => (1, 0),
EmitPace::Fixed(hz) => (2, hz),
}
}
impl Device {
pub fn allow_imperfect_clones(&self, allow: bool) -> Result<()> {
self.link.send(FrameType::Option, &imperfect_payload(allow))
}
pub fn set_movement_riding(&self, window: Option<Duration>) -> Result<()> {
self.link.send(
FrameType::Option,
&move_ride_payload(ride_window_ms(window)),
)
}
pub fn set_emit_pace(&self, pace: EmitPace) -> Result<()> {
let (mode, hz) = emit_pace_wire(pace);
self.link
.send(FrameType::Option, &emit_pace_payload(mode, hz))
}
}