1
- use super :: { compute_arr_presc, Channel , FTimer , Instance , Ocm , Timer , WithPwm } ;
1
+ use super :: { compute_arr_presc, Channel , FTimer , Instance , Ocm , Timer , WithPwm , NCPin } ;
2
2
use crate :: rcc:: Clocks ;
3
3
use core:: marker:: PhantomData ;
4
4
use core:: ops:: { Deref , DerefMut } ;
@@ -9,6 +9,10 @@ pub trait Pins<TIM, P> {
9
9
const C2 : bool = false ;
10
10
const C3 : bool = false ;
11
11
const C4 : bool = false ;
12
+ const NC1 : bool = false ;
13
+ const NC2 : bool = false ;
14
+ const NC3 : bool = false ;
15
+ const NC4 : bool = false ;
12
16
type Channels ;
13
17
14
18
fn check_used ( c : Channel ) -> Channel {
@@ -27,20 +31,21 @@ pub trait Pins<TIM, P> {
27
31
}
28
32
pub use super :: { CPin , Ch , C1 , C2 , C3 , C4 } ;
29
33
30
- pub struct PwmChannel < TIM , const C : u8 > {
34
+ pub struct PwmChannel < TIM , const C : u8 , const COMP : bool = false > {
31
35
pub ( super ) _tim : PhantomData < TIM > ,
32
36
}
33
37
34
38
macro_rules! pins_impl {
35
- ( $( ( $( $PINX: ident) ,+ ) , ( $( $ENCHX: ident) ,+ ) ; ) + ) => {
39
+ ( $( ( $( $PINX: ident) ,+ ) , ( $( $ENCHX: ident) ,+ ) , ( $ ( $COMP : ident ) ,+ ) ; ) + ) => {
36
40
$(
37
41
#[ allow( unused_parens) ]
38
- impl <TIM , $( $PINX, ) +> Pins <TIM , ( $( Ch <$ENCHX>) ,+) > for ( $( $PINX) ,+)
42
+ impl <TIM , $( $PINX, ) + $ ( const $COMP : bool , ) + > Pins <TIM , ( $( Ch <$ENCHX, $COMP >) ,+) > for ( $( $PINX) ,+)
39
43
where
40
44
TIM : Instance + WithPwm ,
41
- $( $PINX: CPin <TIM , $ENCHX>, ) +
45
+ $( $PINX: PwmPin <TIM , $ENCHX, $COMP >, ) +
42
46
{
43
47
$( const $ENCHX: bool = true ; ) +
48
+ $( const $COMP: bool = true ; ) +
44
49
type Channels = ( $( PwmChannel <TIM , $ENCHX>) ,+) ;
45
50
fn split( ) -> Self :: Channels {
46
51
( $( PwmChannel :: <TIM , $ENCHX>:: new( ) ) ,+)
@@ -51,46 +56,51 @@ macro_rules! pins_impl {
51
56
}
52
57
53
58
pins_impl ! (
54
- ( P1 , P2 , P3 , P4 ) , ( C1 , C2 , C3 , C4 ) ;
55
- ( P2 , P3 , P4 ) , ( C2 , C3 , C4 ) ;
56
- ( P1 , P3 , P4 ) , ( C1 , C3 , C4 ) ;
57
- ( P1 , P2 , P4 ) , ( C1 , C2 , C4 ) ;
58
- ( P1 , P2 , P3 ) , ( C1 , C2 , C3 ) ;
59
- ( P3 , P4 ) , ( C3 , C4 ) ;
60
- ( P2 , P4 ) , ( C2 , C4 ) ;
61
- ( P2 , P3 ) , ( C2 , C3 ) ;
62
- ( P1 , P4 ) , ( C1 , C4 ) ;
63
- ( P1 , P3 ) , ( C1 , C3 ) ;
64
- ( P1 , P2 ) , ( C1 , C2 ) ;
65
- ( P1 ) , ( C1 ) ;
66
- ( P2 ) , ( C2 ) ;
67
- ( P3 ) , ( C3 ) ;
68
- ( P4 ) , ( C4 ) ;
59
+ ( P1 , P2 , P3 , P4 ) , ( C1 , C2 , C3 , C4 ) , ( NC1 , NC2 , NC3 , NC4 ) ;
60
+ ( P2 , P3 , P4 ) , ( C2 , C3 , C4 ) , ( NC2 , NC3 , NC4 ) ;
61
+ ( P1 , P3 , P4 ) , ( C1 , C3 , C4 ) , ( NC1 , NC3 , NC4 ) ;
62
+ ( P1 , P2 , P4 ) , ( C1 , C2 , C4 ) , ( NC1 , NC2 , NC4 ) ;
63
+ ( P1 , P2 , P3 ) , ( C1 , C2 , C3 ) , ( NC1 , NC2 , NC3 ) ;
64
+ ( P3 , P4 ) , ( C3 , C4 ) , ( NC3 , NC4 ) ;
65
+ ( P2 , P4 ) , ( C2 , C4 ) , ( NC2 , NC4 ) ;
66
+ ( P2 , P3 ) , ( C2 , C3 ) , ( NC2 , NC3 ) ;
67
+ ( P1 , P4 ) , ( C1 , C4 ) , ( NC1 , NC4 ) ;
68
+ ( P1 , P3 ) , ( C1 , C3 ) , ( NC1 , NC3 ) ;
69
+ ( P1 , P2 ) , ( C1 , C2 ) , ( NC1 , NC2 ) ;
70
+ ( P1 ) , ( C1 ) , ( NC1 ) ;
71
+ ( P2 ) , ( C2 ) , ( NC2 ) ;
72
+ ( P3 ) , ( C3 ) , ( NC3 ) ;
73
+ ( P4 ) , ( C4 ) , ( NC4 ) ;
69
74
) ;
70
75
71
- impl < TIM , P1 , P2 , const C : u8 > CPin < TIM , C > for ( P1 , P2 )
72
- where
73
- P1 : CPin < TIM , C > ,
74
- P2 : CPin < TIM , C > ,
75
- {
76
- }
77
- impl < TIM , P1 , P2 , P3 , const C : u8 > CPin < TIM , C > for ( P1 , P2 , P3 )
78
- where
79
- P1 : CPin < TIM , C > ,
80
- P2 : CPin < TIM , C > ,
81
- P3 : CPin < TIM , C > ,
82
- {
76
+ macro_rules! tuples {
77
+ ( $( $trait: ident, ( $( $PX: ident) ,+ ) ; ) + ) => {
78
+ $(
79
+ impl <TIM , $( $PX, ) + const C : u8 > $trait<TIM , C > for ( $( $PX) ,+)
80
+ where
81
+ $( $PX: CPin <TIM , C >, ) +
82
+ {
83
+ }
84
+ ) +
85
+ } ;
83
86
}
84
- impl < TIM , P1 , P2 , P3 , P4 , const C : u8 > CPin < TIM , C > for ( P1 , P2 , P3 , P4 )
85
- where
86
- P1 : CPin < TIM , C > ,
87
- P2 : CPin < TIM , C > ,
88
- P3 : CPin < TIM , C > ,
89
- P4 : CPin < TIM , C > ,
90
- {
87
+
88
+ tuples ! {
89
+ CPin , ( P1 , P2 ) ;
90
+ CPin , ( P1 , P2 , P3 ) ;
91
+ CPin , ( P1 , P2 , P3 , P4 ) ;
92
+ NCPin , ( P1 , P2 ) ;
93
+ NCPin , ( P1 , P2 , P3 ) ;
94
+ NCPin , ( P1 , P2 , P3 , P4 ) ;
91
95
}
92
96
93
- pub trait PwmExt
97
+ pub trait PwmPin < TIM , const C : u8 , const COMP : bool = false> { }
98
+
99
+ impl < P , TIM , const C : u8 > PwmPin < TIM , C > for P where P : CPin < TIM , C > { }
100
+ impl < P , NP , TIM , const C : u8 > PwmPin < TIM , C , true > for ( P , NP ) where P : CPin < TIM , C > , NP : NCPin < TIM , C > { }
101
+
102
+
103
+ pub trait PwmExt
94
104
where
95
105
Self : Sized + Instance + WithPwm ,
96
106
{
0 commit comments