oxy_linux_pwm/
pwm_channel.rs

1use 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
57// TODO: Implement Drop for PwmChannel(Bug)
58impl 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}