Skip to content

Commit 367bfd1

Browse files
committed
clean From impls
1 parent e9a91c5 commit 367bfd1

File tree

2 files changed

+52
-183
lines changed

2 files changed

+52
-183
lines changed

src/gpio.rs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,20 @@ pub struct Analog;
132132

133133
pub type Debugger = Alternate<0, PushPull>;
134134

135+
mod sealed {
136+
/// Marker trait that show if `ExtiPin` can be implemented
137+
pub trait Interruptable {}
138+
/// Marker trait for slew rate configurable pin modes
139+
pub trait OutputSpeed {}
140+
/// Marker trait for active pin modes
141+
pub trait Active {}
142+
/// Marker trait for all pin modes except alternate
143+
pub trait NotAlt {}
144+
}
145+
135146
impl sealed::Active for Input {}
147+
impl<Otype> sealed::OutputSpeed for Output<Otype> {}
148+
impl<const A: u8, Otype> sealed::OutputSpeed for Alternate<A, Otype> {}
136149
impl<Otype> sealed::Active for Output<Otype> {}
137150
impl<const A: u8, Otype> sealed::Active for Alternate<A, Otype> {}
138151
impl sealed::NotAlt for Input {}
@@ -157,14 +170,6 @@ pub enum Edge {
157170
RisingFalling,
158171
}
159172

160-
mod sealed {
161-
/// Marker trait that show if `ExtiPin` can be implemented
162-
pub trait Interruptable {}
163-
/// Marker trait for active pin modes
164-
pub trait Active {}
165-
pub trait NotAlt {}
166-
}
167-
168173
use sealed::Interruptable;
169174
impl<MODE> Interruptable for Output<MODE> {}
170175
impl Interruptable for Input {}
@@ -313,22 +318,10 @@ impl<const P: char, const N: u8, MODE> PinExt for Pin<P, N, MODE> {
313318
}
314319
}
315320

316-
impl<const P: char, const N: u8, MODE> Pin<P, N, Output<MODE>> {
317-
/// Set pin speed
318-
pub fn set_speed(self, speed: Speed) -> Self {
319-
let offset = 2 * { N };
320-
321-
unsafe {
322-
(*Gpio::<P>::ptr())
323-
.ospeedr
324-
.modify(|r, w| w.bits((r.bits() & !(0b11 << offset)) | ((speed as u32) << offset)))
325-
};
326-
327-
self
328-
}
329-
}
330-
331-
impl<const P: char, const N: u8, const A: u8> Pin<P, N, Alternate<A, PushPull>> {
321+
impl<const P: char, const N: u8, MODE> Pin<P, N, MODE>
322+
where
323+
MODE: sealed::OutputSpeed,
324+
{
332325
/// Set pin speed
333326
pub fn set_speed(self, speed: Speed) -> Self {
334327
let offset = 2 * { N };

src/gpio/convert.rs

Lines changed: 35 additions & 159 deletions
Original file line numberDiff line numberDiff line change
@@ -14,70 +14,14 @@ impl<const P: char, const N: u8, const A: u8> Pin<P, N, Alternate<A, PushPull>>
1414
}
1515
}
1616

17-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Input>>
18-
for Pin<P, N, Alternate<A, PushPull>>
19-
{
20-
#[inline(always)]
21-
fn from(f: Pin<P, N, Input>) -> Self {
22-
f.into_alternate::<A>()
23-
}
24-
}
25-
26-
impl<const P: char, const N: u8, const A: u8, MODE> From<Pin<P, N, Output<MODE>>>
27-
for Pin<P, N, Alternate<A, PushPull>>
28-
where
29-
Output<MODE>: PinMode,
30-
{
31-
#[inline(always)]
32-
fn from(f: Pin<P, N, Output<MODE>>) -> Self {
33-
f.into_alternate::<A>()
34-
}
35-
}
36-
37-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Analog>>
38-
for Pin<P, N, Alternate<A, PushPull>>
39-
{
40-
#[inline(always)]
41-
fn from(f: Pin<P, N, Analog>) -> Self {
42-
f.into_alternate::<A>()
43-
}
44-
}
45-
46-
impl<const P: char, const N: u8, const A: u8, const B: u8> From<Pin<P, N, Alternate<B, OpenDrain>>>
47-
for Pin<P, N, Alternate<A, PushPull>>
48-
{
49-
#[inline(always)]
50-
fn from(f: Pin<P, N, Alternate<B, OpenDrain>>) -> Self {
51-
f.into_alternate::<A>()
52-
}
53-
}
54-
55-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Input>>
56-
for Pin<P, N, Alternate<A, OpenDrain>>
57-
{
58-
#[inline(always)]
59-
fn from(f: Pin<P, N, Input>) -> Self {
60-
f.into_alternate_open_drain::<A>()
61-
}
62-
}
63-
64-
impl<const P: char, const N: u8, const A: u8, MODE> From<Pin<P, N, Output<MODE>>>
65-
for Pin<P, N, Alternate<A, OpenDrain>>
17+
impl<const P: char, const N: u8, MODE: PinMode + sealed::NotAlt, const A: u8, Otype>
18+
From<Pin<P, N, MODE>> for Pin<P, N, Alternate<A, Otype>>
6619
where
67-
Output<MODE>: PinMode,
20+
Alternate<A, Otype>: PinMode,
6821
{
6922
#[inline(always)]
70-
fn from(f: Pin<P, N, Output<MODE>>) -> Self {
71-
f.into_alternate_open_drain::<A>()
72-
}
73-
}
74-
75-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Analog>>
76-
for Pin<P, N, Alternate<A, OpenDrain>>
77-
{
78-
#[inline(always)]
79-
fn from(f: Pin<P, N, Analog>) -> Self {
80-
f.into_alternate_open_drain::<A>()
23+
fn from(f: Pin<P, N, MODE>) -> Self {
24+
f.into_mode()
8125
}
8226
}
8327

@@ -86,90 +30,65 @@ impl<const P: char, const N: u8, const A: u8, const B: u8> From<Pin<P, N, Altern
8630
{
8731
#[inline(always)]
8832
fn from(f: Pin<P, N, Alternate<B, PushPull>>) -> Self {
89-
f.into_alternate_open_drain::<A>()
33+
f.into_mode()
9034
}
9135
}
9236

93-
impl<const P: char, const N: u8, MODE> From<Pin<P, N, Output<MODE>>> for Pin<P, N, Input>
37+
impl<const P: char, const N: u8, Otype> From<Pin<P, N, Output<Otype>>> for Pin<P, N, Input>
9438
where
95-
Output<MODE>: PinMode,
39+
Output<Otype>: PinMode,
9640
{
9741
#[inline(always)]
98-
fn from(f: Pin<P, N, Output<MODE>>) -> Self {
99-
f.into_input()
42+
fn from(f: Pin<P, N, Output<Otype>>) -> Self {
43+
f.into_mode()
10044
}
10145
}
10246

10347
impl<const P: char, const N: u8> From<Pin<P, N, Analog>> for Pin<P, N, Input> {
10448
#[inline(always)]
10549
fn from(f: Pin<P, N, Analog>) -> Self {
106-
f.into_input()
50+
f.into_mode()
10751
}
10852
}
10953

110-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, PushPull>>>
111-
for Pin<P, N, Input>
54+
impl<const P: char, const N: u8, const A: u8, Otype, MODE> From<Pin<P, N, Alternate<A, Otype>>>
55+
for Pin<P, N, MODE>
56+
where
57+
Alternate<A, Otype>: PinMode,
58+
MODE: PinMode + sealed::NotAlt,
11259
{
11360
#[inline(always)]
114-
fn from(f: Pin<P, N, Alternate<A, PushPull>>) -> Self {
115-
f.into_input()
61+
fn from(f: Pin<P, N, Alternate<A, Otype>>) -> Self {
62+
f.into_mode()
11663
}
11764
}
11865

119-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, OpenDrain>>>
120-
for Pin<P, N, Input>
66+
impl<const P: char, const N: u8, Otype> From<Pin<P, N, Input>> for Pin<P, N, Output<Otype>>
67+
where
68+
Output<Otype>: PinMode,
12169
{
122-
#[inline(always)]
123-
fn from(f: Pin<P, N, Alternate<A, OpenDrain>>) -> Self {
124-
f.into_input()
125-
}
126-
}
127-
128-
impl<const P: char, const N: u8> From<Pin<P, N, Input>> for Pin<P, N, Output<OpenDrain>> {
12970
#[inline(always)]
13071
fn from(f: Pin<P, N, Input>) -> Self {
131-
f.into_open_drain_output()
72+
f.into_mode()
13273
}
13374
}
13475

135-
impl<const P: char, const N: u8> From<Pin<P, N, Output<PushPull>>>
136-
for Pin<P, N, Output<OpenDrain>>
76+
impl<const P: char, const N: u8, Otype> From<Pin<P, N, Analog>> for Pin<P, N, Output<Otype>>
77+
where
78+
Output<Otype>: PinMode,
13779
{
138-
#[inline(always)]
139-
fn from(f: Pin<P, N, Output<PushPull>>) -> Self {
140-
f.into_open_drain_output()
141-
}
142-
}
143-
144-
impl<const P: char, const N: u8> From<Pin<P, N, Analog>> for Pin<P, N, Output<OpenDrain>> {
14580
#[inline(always)]
14681
fn from(f: Pin<P, N, Analog>) -> Self {
147-
f.into_open_drain_output()
148-
}
149-
}
150-
151-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, PushPull>>>
152-
for Pin<P, N, Output<OpenDrain>>
153-
{
154-
#[inline(always)]
155-
fn from(f: Pin<P, N, Alternate<A, PushPull>>) -> Self {
156-
f.into_open_drain_output()
82+
f.into_mode()
15783
}
15884
}
15985

160-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, OpenDrain>>>
86+
impl<const P: char, const N: u8> From<Pin<P, N, Output<PushPull>>>
16187
for Pin<P, N, Output<OpenDrain>>
16288
{
16389
#[inline(always)]
164-
fn from(f: Pin<P, N, Alternate<A, OpenDrain>>) -> Self {
165-
f.into_open_drain_output()
166-
}
167-
}
168-
169-
impl<const P: char, const N: u8> From<Pin<P, N, Input>> for Pin<P, N, Output<PushPull>> {
170-
#[inline(always)]
171-
fn from(f: Pin<P, N, Input>) -> Self {
172-
f.into_push_pull_output()
90+
fn from(f: Pin<P, N, Output<PushPull>>) -> Self {
91+
f.into_mode()
17392
}
17493
}
17594

@@ -178,67 +97,24 @@ impl<const P: char, const N: u8> From<Pin<P, N, Output<OpenDrain>>>
17897
{
17998
#[inline(always)]
18099
fn from(f: Pin<P, N, Output<OpenDrain>>) -> Self {
181-
f.into_push_pull_output()
182-
}
183-
}
184-
185-
impl<const P: char, const N: u8> From<Pin<P, N, Analog>> for Pin<P, N, Output<PushPull>> {
186-
#[inline(always)]
187-
fn from(f: Pin<P, N, Analog>) -> Self {
188-
f.into_push_pull_output()
189-
}
190-
}
191-
192-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, PushPull>>>
193-
for Pin<P, N, Output<PushPull>>
194-
{
195-
#[inline(always)]
196-
fn from(f: Pin<P, N, Alternate<A, PushPull>>) -> Self {
197-
f.into_push_pull_output()
198-
}
199-
}
200-
201-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, OpenDrain>>>
202-
for Pin<P, N, Output<PushPull>>
203-
{
204-
#[inline(always)]
205-
fn from(f: Pin<P, N, Alternate<A, OpenDrain>>) -> Self {
206-
f.into_push_pull_output()
100+
f.into_mode()
207101
}
208102
}
209103

210104
impl<const P: char, const N: u8> From<Pin<P, N, Input>> for Pin<P, N, Analog> {
211105
#[inline(always)]
212106
fn from(f: Pin<P, N, Input>) -> Self {
213-
f.into_analog()
107+
f.into_mode()
214108
}
215109
}
216110

217-
impl<const P: char, const N: u8, MODE> From<Pin<P, N, Output<MODE>>> for Pin<P, N, Analog>
111+
impl<const P: char, const N: u8, Otype> From<Pin<P, N, Output<Otype>>> for Pin<P, N, Analog>
218112
where
219-
Output<MODE>: PinMode,
220-
{
221-
#[inline(always)]
222-
fn from(f: Pin<P, N, Output<MODE>>) -> Self {
223-
f.into_analog()
224-
}
225-
}
226-
227-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, PushPull>>>
228-
for Pin<P, N, Analog>
229-
{
230-
#[inline(always)]
231-
fn from(f: Pin<P, N, Alternate<A, PushPull>>) -> Self {
232-
f.into_analog()
233-
}
234-
}
235-
236-
impl<const P: char, const N: u8, const A: u8> From<Pin<P, N, Alternate<A, OpenDrain>>>
237-
for Pin<P, N, Analog>
113+
Output<Otype>: PinMode,
238114
{
239115
#[inline(always)]
240-
fn from(f: Pin<P, N, Alternate<A, OpenDrain>>) -> Self {
241-
f.into_analog()
116+
fn from(f: Pin<P, N, Output<Otype>>) -> Self {
117+
f.into_mode()
242118
}
243119
}
244120

0 commit comments

Comments
 (0)