oxy_linux_pwm/
pwm_channel.rs1use std::{io, time::Duration};
2
3use crate::{pwm_chip::PwmChip, sysfs};
4
5#[derive(Clone)]
6pub struct PwmChannel {
7 chip: PwmChip,
8 channel: u8,
9}
10
11impl PwmChannel {
12 pub fn new(chip: PwmChip, channel: u8) -> Self {
13 let ele = PwmChannel {
14 chip,
15 channel,
16 };
17 let _ = ele.export();
18 ele
19 }
20
21 pub fn set_period(&self, period_ns: Duration) -> Result<(), io::Error> {
22 let p = period_ns.as_nanos() as u64;
23 sysfs::set_period(self.chip.0, self.channel, p)
24 }
25
26 pub fn set_duty_cycle(&self, duty_cycle_ns: Duration) -> Result<(), io::Error> {
27 let d = duty_cycle_ns.as_nanos() as u64;
28 sysfs::set_duty_cycle(self.chip.0, self.channel, d)
29 }
30
31 pub fn set_polarity(&self, polarity: sysfs::Polarity) {
32 sysfs::set_polarity(self.chip.0, self.channel, polarity).unwrap();
33 }
34
35 fn export(&self) -> Result<(), io::Error> {
36 sysfs::export(self.chip.0, self.channel)?;
37 Ok(())
38 }
39
40 fn unexport(&self) -> Result<(), io::Error> {
41 sysfs::unexport(self.chip.0, self.channel)?;
42 Ok(())
43 }
44
45 pub fn enable(&self) -> Result<(), io::Error> {
46 sysfs::enable(self.chip.0, self.channel)?;
47 Ok(())
48 }
49
50 pub fn disable(&self) -> Result<(), io::Error> {
51 sysfs::disable(self.chip.0, self.channel)?;
52 Ok(())
53 }
54
55}
56
57impl Drop for PwmChannel{
59 fn drop(&mut self) {
60 let _ = self.set_duty_cycle(Duration::from_nanos(0));
61 let _ = self.set_period(Duration::from_nanos(10000));
62 self.set_polarity(sysfs::Polarity::Normal);
63 let _ = self.disable();
64 let _ = self.unexport();
65 }
66
67}