1use embedded_hal::{digital::v2::OutputPin, PwmPin};
2
3use crate::ToyError;
4
5pub struct PWMs<CHU, CHV, CHW, P> {
6 pub duty_max: u16,
7 pub u: CHU,
8 pub v: CHV,
9 pub w: CHW,
10 pub en_pin: Option<P>,
11}
12
13pub trait PWMsTrait {
14 fn set_duty(&mut self, duty_u: f32, duty_v: f32, duty_w: f32);
15 fn enable(&mut self) -> nb::Result<(), ToyError>;
16 fn disable(&mut self) -> nb::Result<(), ToyError>;
17}
18
19impl<CHU, CHV, CHW, P, E> PWMsTrait for PWMs<CHU, CHV, CHW, P>
20where
21 CHU: PwmPin<Duty = u16>,
22 CHV: PwmPin<Duty = u16>,
23 CHW: PwmPin<Duty = u16>,
24 P: OutputPin<Error = E>,
25{
26 fn set_duty(&mut self, duty_u: f32, duty_v: f32, duty_w: f32) {
27 self.u.set_duty((duty_u * self.duty_max as f32) as u16);
28 self.v.set_duty((duty_v * self.duty_max as f32) as u16);
29 self.w.set_duty((duty_w * self.duty_max as f32) as u16);
30 }
31
32 fn enable(&mut self) -> nb::Result<(), ToyError> {
33 if let Some(ref mut en_pin) = self.en_pin {
34 en_pin.set_high().map_err(|_| ToyError::PWMEnErr)?;
35 }
36
37 Ok(())
38 }
39
40 fn disable(&mut self) -> nb::Result<(), ToyError> {
41 if let Some(ref mut en_pin) = self.en_pin {
42 en_pin.set_low().map_err(|_| ToyError::PWMDisErr)?;
43 } else {
44 self.u.set_duty(0);
45 self.v.set_duty(0);
46 self.w.set_duty(0);
47 }
48
49 Ok(())
50 }
51}