Skip to content

Commit 6bb6fca

Browse files
committed
Add PWM SetDuty trait.
1 parent 812471b commit 6bb6fca

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

embedded-hal/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
pub mod delay;
8181
pub mod digital;
8282
pub mod i2c;
83+
pub mod pwm;
8384
pub mod serial;
8485
pub mod spi;
8586

embedded-hal/src/pwm.rs

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
//! Pulse Width Modulation (PWM) traits
2+
3+
/// Error
4+
pub trait Error: core::fmt::Debug {
5+
/// Convert error to a generic error kind
6+
///
7+
/// By using this method, errors freely defined by HAL implementations
8+
/// can be converted to a set of generic errors upon which generic
9+
/// code can act.
10+
fn kind(&self) -> ErrorKind;
11+
}
12+
13+
impl Error for core::convert::Infallible {
14+
fn kind(&self) -> ErrorKind {
15+
match *self {}
16+
}
17+
}
18+
19+
/// Error kind
20+
///
21+
/// This represents a common set of operation errors. HAL implementations are
22+
/// free to define more specific or additional error types. However, by providing
23+
/// a mapping to these common errors, generic code can still react to them.
24+
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
25+
#[non_exhaustive]
26+
pub enum ErrorKind {
27+
/// A different error occurred. The original error may contain more information.
28+
Other,
29+
}
30+
31+
impl Error for ErrorKind {
32+
fn kind(&self) -> ErrorKind {
33+
*self
34+
}
35+
}
36+
37+
impl core::fmt::Display for ErrorKind {
38+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
39+
match self {
40+
Self::Other => write!(
41+
f,
42+
"A different error occurred. The original error may contain more information"
43+
),
44+
}
45+
}
46+
}
47+
48+
/// Error type trait
49+
///
50+
/// This just defines the error type, to be used by the other traits.
51+
pub trait ErrorType {
52+
/// Error type
53+
type Error: Error;
54+
}
55+
56+
impl<T: ErrorType> ErrorType for &mut T {
57+
type Error = T::Error;
58+
}
59+
60+
/// Single PWM channel / pin
61+
pub trait SetDuty: ErrorType {
62+
/// Set the duty cycle.
63+
///
64+
/// `duty` is the duty cycle. Valid values span the entire `u16` range:
65+
///
66+
/// - `duty = 0` is considered 0% duty, which makes the pin permanently low.
67+
/// - `duty = u16::MAX` is considered 1000% duty, which makes the pin permanently high.
68+
///
69+
/// Implementations must scale the duty value linearly to the range required by the hardware.
70+
fn set_duty(&mut self, duty: u16) -> Self::Error;
71+
}

0 commit comments

Comments
 (0)