1
1
use super :: * ;
2
2
3
+ /// Convert tuple or array of pins to output port
3
4
pub trait OutPort {
4
5
type Target ;
5
6
fn outport ( self ) -> Self :: Target ;
6
7
}
7
8
8
9
macro_rules! out_port {
9
- ( $name: ident => $n: literal, ( $( $i: literal) ,+ ) , ( $( $N: ident) ,+ ) , ( $ ( $d : ident ) , * ) ) => {
10
- pub struct $name<const P : char $( , const $N: u8 ) +> {
11
- $ ( pub $d : Pin <P , $N, Output <PushPull >>, ) +
12
- }
10
+ ( $name: ident => $n: literal, ( $( $i: literal) ,+ ) , ( $( $N: ident) ,+ ) ) => {
11
+ pub struct $name<const P : char $( , const $N: u8 ) +> (
12
+ pub ( $ ( Pin <P , $N, Output <PushPull >>, ) +)
13
+ ) ;
13
14
14
15
impl <const P : char $( , const $N: u8 ) +> OutPort for ( $( Pin <P , $N, Output <PushPull >>) ,+) {
15
16
type Target = $name<P $( , $N) +>;
16
17
fn outport( self ) -> Self :: Target {
17
- let ( $( $d) ,+) = self ;
18
- Self :: Target { $( $d) ,+ }
18
+ $name( self )
19
19
}
20
20
}
21
21
22
- # [ allow ( clippy :: too_many_arguments ) ]
22
+ /// Wrapper for tuple of `Pin`s
23
23
impl <const P : char $( , const $N: u8 ) +> $name<P $( , $N) +> {
24
- pub const fn new(
25
- $( $d: Pin <P , $N, Output <PushPull >>, ) +
26
- ) -> Self {
27
- Self { $( $d) ,+ }
28
- }
29
24
const fn mask( ) -> u32 {
30
25
0 $( | ( 1 << { $N } ) ) +
31
26
}
@@ -43,7 +38,7 @@ macro_rules! out_port {
43
38
}
44
39
}
45
40
46
- /// Sets all pins to `PinState::High`
41
+ /// Set all pins to `PinState::High`
47
42
pub fn all_high( & mut self ) {
48
43
unsafe {
49
44
( * Gpio :: <P >:: ptr( ) )
@@ -52,7 +47,7 @@ macro_rules! out_port {
52
47
}
53
48
}
54
49
55
- /// Sets all pins to `PinState::Low`
50
+ /// Reset all pins to `PinState::Low`
56
51
pub fn all_low( & mut self ) {
57
52
unsafe {
58
53
( * Gpio :: <P >:: ptr( ) )
@@ -64,14 +59,15 @@ macro_rules! out_port {
64
59
}
65
60
}
66
61
67
- out_port ! ( OutPort2 => 2 , ( 0 , 1 ) , ( N0 , N1 ) , ( d0 , d1 ) ) ;
68
- out_port ! ( OutPort3 => 3 , ( 0 , 1 , 2 ) , ( N0 , N1 , N2 ) , ( d0 , d1 , d2 ) ) ;
69
- out_port ! ( OutPort4 => 4 , ( 0 , 1 , 2 , 3 ) , ( N0 , N1 , N2 , N3 ) , ( d0 , d1 , d2 , d3 ) ) ;
70
- out_port ! ( OutPort5 => 5 , ( 0 , 1 , 2 , 3 , 4 ) , ( N0 , N1 , N2 , N3 , N4 ) , ( d0 , d1 , d2 , d3 , d4 ) ) ;
71
- out_port ! ( OutPort6 => 6 , ( 0 , 1 , 2 , 3 , 4 , 5 ) , ( N0 , N1 , N2 , N3 , N4 , N5 ) , ( d0 , d1 , d2 , d3 , d4 , d5 ) ) ;
72
- out_port ! ( OutPort7 => 7 , ( 0 , 1 , 2 , 3 , 4 , 5 , 6 ) , ( N0 , N1 , N2 , N3 , N4 , N5 , N6 ) , ( d0 , d1 , d2 , d3 , d4 , d5 , d6 ) ) ;
73
- out_port ! ( OutPort8 => 8 , ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ) , ( N0 , N1 , N2 , N3 , N4 , N5 , N6 , N7 ) , ( d0 , d1 , d2 , d3 , d4 , d5 , d6 , d7 ) ) ;
62
+ out_port ! ( OutPort2 => 2 , ( 0 , 1 ) , ( N0 , N1 ) ) ;
63
+ out_port ! ( OutPort3 => 3 , ( 0 , 1 , 2 ) , ( N0 , N1 , N2 ) ) ;
64
+ out_port ! ( OutPort4 => 4 , ( 0 , 1 , 2 , 3 ) , ( N0 , N1 , N2 , N3 ) ) ;
65
+ out_port ! ( OutPort5 => 5 , ( 0 , 1 , 2 , 3 , 4 ) , ( N0 , N1 , N2 , N3 , N4 ) ) ;
66
+ out_port ! ( OutPort6 => 6 , ( 0 , 1 , 2 , 3 , 4 , 5 ) , ( N0 , N1 , N2 , N3 , N4 , N5 ) ) ;
67
+ out_port ! ( OutPort7 => 7 , ( 0 , 1 , 2 , 3 , 4 , 5 , 6 ) , ( N0 , N1 , N2 , N3 , N4 , N5 , N6 ) ) ;
68
+ out_port ! ( OutPort8 => 8 , ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ) , ( N0 , N1 , N2 , N3 , N4 , N5 , N6 , N7 ) ) ;
74
69
70
+ /// Wrapper for array of `PartiallyErasedPin`s
75
71
pub struct OutPortArray < const P : char , const SIZE : usize > ( pub [ PEPin < P , Output < PushPull > > ; SIZE ] ) ;
76
72
77
73
impl < const P : char , const SIZE : usize > OutPort for [ PEPin < P , Output < PushPull > > ; SIZE ] {
@@ -84,18 +80,16 @@ impl<const P: char, const SIZE: usize> OutPort for [PEPin<P, Output<PushPull>>;
84
80
impl < const P : char , const SIZE : usize > OutPortArray < P , SIZE > {
85
81
fn mask ( & self ) -> u32 {
86
82
let mut msk = 0 ;
87
- let mut iter = self . 0 . iter ( ) ;
88
- while let Some ( pin) = iter. next ( ) {
83
+ for pin in self . 0 . iter ( ) {
89
84
msk |= 1 << pin. i ;
90
85
}
91
86
msk
92
87
}
93
88
fn value_for_write_bsrr ( & self , val : u32 ) -> u32 {
94
89
let mut msk = 0 ;
95
- let mut iter = 0 ..SIZE ;
96
- while let Some ( pin) = iter. next ( ) {
97
- let n = self . 0 [ pin] . i ;
98
- msk |= 1 << ( 1 << ( if val & ( 1 << pin) != 0 { n } else { n + 16 } ) ) ;
90
+ for ( idx, pin) in self . 0 . iter ( ) . enumerate ( ) {
91
+ let n = pin. i ;
92
+ msk |= 1 << ( if val & ( 1 << idx) != 0 { n } else { n + 16 } ) ;
99
93
}
100
94
msk
101
95
}
@@ -110,12 +104,12 @@ impl<const P: char, const SIZE: usize> OutPortArray<P, SIZE> {
110
104
}
111
105
}
112
106
113
- /// Sets all pins to `PinState::High`
107
+ /// Set all pins to `PinState::High`
114
108
pub fn all_high ( & mut self ) {
115
109
unsafe { ( * Gpio :: < P > :: ptr ( ) ) . bsrr . write ( |w| w. bits ( self . mask ( ) ) ) }
116
110
}
117
111
118
- /// Sets all pins to `PinState::Low`
112
+ /// Reset all pins to `PinState::Low`
119
113
pub fn all_low ( & mut self ) {
120
114
unsafe {
121
115
( * Gpio :: < P > :: ptr ( ) )
0 commit comments