Skip to content

Commit b0d2dfa

Browse files
committed
Clean up, fix some todos, might be testable now/soon!
1 parent 1944065 commit b0d2dfa

File tree

6 files changed

+168
-189
lines changed

6 files changed

+168
-189
lines changed

src/mcpwm/comparator.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,10 @@ pub struct ComparatorConfig {
7575
impl Default for ComparatorConfig {
7676
fn default() -> Self {
7777
let mut flags: mcpwm_comparator_config_t__bindgen_ty_1 = Default::default();
78-
flags.set_update_cmp_on_tep(todo!());
79-
flags.set_update_cmp_on_tez(todo!());
80-
flags.set_update_cmp_on_sync(todo!());
78+
// TODO: What should be set here?
79+
flags.set_update_cmp_on_tep(1);
80+
flags.set_update_cmp_on_tez(1);
81+
flags.set_update_cmp_on_sync(1);
8182
Self { flags }
8283
}
8384
}

src/mcpwm/generator.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use esp_idf_sys::{
88
mcpwm_generator_set_actions_on_timer_event,
99
mcpwm_new_generator, mcpwm_oper_handle_t, mcpwm_timer_direction_t_MCPWM_TIMER_DIRECTION_DOWN,
1010
mcpwm_timer_direction_t_MCPWM_TIMER_DIRECTION_UP, mcpwm_timer_event_t_MCPWM_TIMER_EVENT_EMPTY,
11-
mcpwm_timer_event_t_MCPWM_TIMER_EVENT_FULL,
11+
mcpwm_timer_event_t_MCPWM_TIMER_EVENT_FULL, mcpwm_generator_config_t__bindgen_ty_1,
1212
};
1313

1414
use crate::gpio::OutputPin;
@@ -24,11 +24,11 @@ impl OptionalGen for NoGen {
2424
pub trait OptionalGen {
2525
}
2626

27-
impl<G, CMP_X, CMP_Y, P> OptionalGen for Generator<G, CMP_X, CMP_Y, P>
27+
impl<G, CMPX, CMPY, P> OptionalGen for Generator<G, CMPX, CMPY, P>
2828
where
2929
G: GeneratorChannel,
30-
CMP_X: OnMatchCfg,
31-
CMP_Y: OnMatchCfg,
30+
CMPX: OnMatchCfg,
31+
CMPY: OnMatchCfg,
3232
P: OutputPin,
3333
{
3434
}
@@ -48,19 +48,19 @@ impl GeneratorChannel for GenB {
4848
}
4949

5050
// TODO: Allow OptionalOutputPin?
51-
pub struct Generator<G, CMP_X, CMP_Y, P: OutputPin> {
51+
pub struct Generator<G, CMPX, CMPY, P: OutputPin> {
5252
channel: PhantomData<G>,
53-
cmp_x: PhantomData<CMP_X>,
54-
cmp_y: PhantomData<CMP_Y>,
55-
pub(crate) handle: mcpwm_gen_handle_t,
56-
pub(crate) pin: P,
53+
cmp_x: PhantomData<CMPX>,
54+
cmp_y: PhantomData<CMPY>,
55+
pub(crate) _handle: mcpwm_gen_handle_t,
56+
pub(crate) _pin: P,
5757
}
5858

59-
pub struct GeneratorConfig<G: GeneratorChannel, CMP_X, CMP_Y, P> {
59+
pub struct GeneratorConfig<G: GeneratorChannel, CMPX, CMPY, P> {
6060
_channel: PhantomData<G>,
61-
pub(crate) invert: bool,
62-
pub(crate) on_matches_cmp_x: CMP_X,
63-
pub(crate) on_matches_cmp_y: CMP_Y,
61+
pub(crate) flags: mcpwm_generator_config_t__bindgen_ty_1,
62+
pub(crate) on_matches_cmp_x: CMPX,
63+
pub(crate) on_matches_cmp_y: CMPY,
6464
pub(crate) on_is_empty: CountingDirection,
6565
pub(crate) on_is_full: CountingDirection,
6666
pub(crate) pin: P,
@@ -93,10 +93,10 @@ impl OptionalGenCfg for NoGenCfg {
9393
}
9494
}
9595

96-
impl<G: GeneratorChannel, CMP_X: OnMatchCfg, CMP_Y: OnMatchCfg, P: OutputPin> OptionalGenCfg
97-
for GeneratorConfig<G, CMP_X, CMP_Y, P>
96+
impl<G: GeneratorChannel, CMPX: OnMatchCfg, CMPY: OnMatchCfg, P: OutputPin> OptionalGenCfg
97+
for GeneratorConfig<G, CMPX, CMPY, P>
9898
{
99-
type Gen = Generator<G, CMP_X, CMP_Y, P>;
99+
type Gen = Generator<G, CMPX, CMPY, P>;
100100

101101
unsafe fn init(
102102
self,
@@ -106,7 +106,7 @@ impl<G: GeneratorChannel, CMP_X: OnMatchCfg, CMP_Y: OnMatchCfg, P: OutputPin> Op
106106
) -> Self::Gen {
107107
let cfg = mcpwm_generator_config_t {
108108
gen_gpio_num: self.pin.pin(),
109-
flags: todo!(), //generator_config.flags,
109+
flags: self.flags,
110110
};
111111
let mut gen = ptr::null_mut();
112112
unsafe {
@@ -163,8 +163,8 @@ impl<G: GeneratorChannel, CMP_X: OnMatchCfg, CMP_Y: OnMatchCfg, P: OutputPin> Op
163163
channel: PhantomData,
164164
cmp_x: PhantomData,
165165
cmp_y: PhantomData,
166-
handle: gen,
167-
pin: self.pin,
166+
_handle: gen,
167+
_pin: self.pin,
168168
}
169169
}
170170
}
@@ -176,14 +176,14 @@ pub trait GenInit {
176176
unsafe fn init(self, operator_handle: mcpwm_oper_handle_t) -> Self::Gen;
177177
}
178178

179-
impl<CMP_X, CMP_Y> GenInit for (&mut CMP_X, &mut CMP_Y, NoGenCfg)
179+
impl<CMPX, CMPY> GenInit for (&mut CMPX, &mut CMPY, NoGenCfg)
180180
where
181-
CMP_X: OptionalCmp,
182-
CMP_Y: OptionalCmp,
181+
CMPX: OptionalCmp,
182+
CMPY: OptionalCmp,
183183
{
184184
type Gen = NoGen;
185185

186-
unsafe fn init(self, operator_handle: mcpwm_oper_handle_t) -> Self::Gen {
186+
unsafe fn init(self, _operator_handle: mcpwm_oper_handle_t) -> Self::Gen {
187187
NoGen
188188
}
189189
}
@@ -214,16 +214,20 @@ impl<G: GeneratorChannel, P> GeneratorConfig<G, CountingDirection, CountingDirec
214214
}
215215

216216
// TODO: Do we have any use for this?
217-
impl<G, CMP_X, CMP_Y, P> GeneratorConfig<G, CMP_X, CMP_Y, P>
217+
impl<G, CMPX, CMPY, P> GeneratorConfig<G, CMPX, CMPY, P>
218218
where
219219
G: GeneratorChannel,
220-
CMP_X: OnMatchCfg,
221-
CMP_Y: OnMatchCfg,
220+
CMPX: OnMatchCfg,
221+
CMPY: OnMatchCfg,
222222
{
223223
fn empty(pin: P) -> Self {
224+
let mut flags: mcpwm_generator_config_t__bindgen_ty_1 = Default::default();
225+
flags.set_invert_pwm(0);
226+
flags.set_io_loop_back(0);
227+
224228
GeneratorConfig {
225229
_channel: PhantomData,
226-
invert: false,
230+
flags,
227231
on_matches_cmp_x: OnMatchCfg::empty(),
228232
on_matches_cmp_y: OnMatchCfg::empty(),
229233
on_is_empty: CountingDirection {

src/mcpwm/operator.rs

Lines changed: 43 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,14 @@
11
use esp_idf_sys::{
2-
esp, mcpwm_comparator_config_t, mcpwm_comparator_config_t__bindgen_ty_1,
3-
mcpwm_comparator_set_compare_value, mcpwm_gen_timer_event_action_t, mcpwm_generator_config_t,
4-
mcpwm_generator_config_t__bindgen_ty_1, mcpwm_generator_set_actions_on_compare_event,
5-
mcpwm_generator_set_actions_on_timer_event, mcpwm_new_comparator, mcpwm_new_generator,
6-
mcpwm_oper_handle_t, mcpwm_operator_config_t, mcpwm_operator_config_t__bindgen_ty_1,
7-
mcpwm_operator_connect_timer, mcpwm_timer_direction_t_MCPWM_TIMER_DIRECTION_DOWN,
8-
mcpwm_timer_direction_t_MCPWM_TIMER_DIRECTION_UP, mcpwm_timer_event_t_MCPWM_TIMER_EVENT_EMPTY,
9-
mcpwm_timer_event_t_MCPWM_TIMER_EVENT_FULL, mcpwm_timer_handle_t, EspError,
2+
esp, mcpwm_comparator_set_compare_value, mcpwm_oper_handle_t, mcpwm_operator_config_t,
3+
mcpwm_operator_config_t__bindgen_ty_1, mcpwm_operator_connect_timer, mcpwm_timer_handle_t,
4+
EspError,
105
};
116

127
use crate::mcpwm::Group;
138

149
use super::{
15-
comparator::{Comparator, ComparatorConfig, NoCmp, OptionalCmp, OptionalCmpCfg},
16-
generator::{GenA, GenB, GenInit, NoGen, OptionalGen, OptionalGenCfg},
10+
comparator::{Comparator, OptionalCmp, OptionalCmpCfg},
11+
generator::{OptionalGen, OptionalGenCfg},
1712
OperatorConfig,
1813
};
1914

@@ -61,45 +56,46 @@ impl<const N: u8, G: Group> crate::peripheral::Peripheral for OPERATOR<N, G> {
6156
pub struct Operator<
6257
const N: u8,
6358
G: Group,
64-
CMP_X: OptionalCmp,
65-
CMP_Y: OptionalCmp,
66-
GEN_A: OptionalGen,
67-
GEN_B: OptionalGen,
59+
CMPX: OptionalCmp,
60+
CMPY: OptionalCmp,
61+
GENA: OptionalGen,
62+
GENB: OptionalGen,
6863
> {
6964
_instance: OPERATOR<N, G>,
7065
_handle: mcpwm_oper_handle_t,
7166

72-
comparator_x: CMP_X, // SOC_MCPWM_COMPARATORS_PER_OPERATOR is 2 for ESP32 and ESP32-S3
73-
comparator_y: CMP_Y,
67+
comparator_x: CMPX, // SOC_MCPWM_COMPARATORS_PER_OPERATOR is 2 for ESP32 and ESP32-S3
68+
comparator_y: CMPY,
7469

75-
_generator_a: GEN_A, // One generator per pin, with a maximum of two generators per Operator
76-
_generator_b: GEN_B,
70+
_generator_a: GENA, // One generator per pin, with a maximum of two generators per Operator
71+
_generator_b: GENB,
7772
//deadtime: D
7873
}
7974

80-
pub unsafe fn new<const N: u8, G, CMP_X, CMP_Y, GEN_A, GEN_B>(
75+
pub unsafe fn new<const N: u8, G, CMPX, CMPY, GENA, GENB>(
8176
instance: OPERATOR<N, G>,
8277
timer_handle: mcpwm_timer_handle_t,
83-
cfg: OperatorConfig<CMP_X, CMP_Y, GEN_A, GEN_B>,
84-
) -> Operator<N, G, CMP_X::Cmp, CMP_Y::Cmp, GEN_A::Gen, GEN_B::Gen>
78+
cfg: OperatorConfig<CMPX, CMPY, GENA, GENB>,
79+
) -> Operator<N, G, CMPX::Cmp, CMPY::Cmp, GENA::Gen, GENB::Gen>
8580
where
8681
G: Group,
87-
CMP_X: OptionalCmpCfg,
88-
CMP_Y: OptionalCmpCfg,
82+
CMPX: OptionalCmpCfg,
83+
CMPY: OptionalCmpCfg,
8984

90-
GEN_A: OptionalGenCfg,
91-
GEN_B: OptionalGenCfg,
85+
GENA: OptionalGenCfg,
86+
GENB: OptionalGenCfg,
9287
{
9388
let mut handle = ptr::null_mut();
9489
let mut flags: mcpwm_operator_config_t__bindgen_ty_1 = Default::default();
9590

96-
flags.set_update_gen_action_on_tez(todo!());
97-
flags.set_update_gen_action_on_tep(todo!());
98-
flags.set_update_gen_action_on_sync(todo!());
91+
// TODO: What should these be set to?
92+
flags.set_update_gen_action_on_tez(1);
93+
flags.set_update_gen_action_on_tep(1);
94+
flags.set_update_gen_action_on_sync(1);
9995

100-
flags.set_update_dead_time_on_tez(todo!());
101-
flags.set_update_dead_time_on_tep(todo!());
102-
flags.set_update_dead_time_on_sync(todo!());
96+
flags.set_update_dead_time_on_tez(1);
97+
flags.set_update_dead_time_on_tep(1);
98+
flags.set_update_dead_time_on_sync(1);
10399

104100
let config = mcpwm_operator_config_t {
105101
group_id: G::ID,
@@ -110,8 +106,8 @@ where
110106
esp!(esp_idf_sys::mcpwm_new_operator(&config, &mut handle,)).unwrap();
111107
}
112108

113-
let comparator_x = unsafe { cfg.comparator_x.init(handle) };
114-
let comparator_y = unsafe { cfg.comparator_y.init(handle) };
109+
let mut comparator_x = unsafe { cfg.comparator_x.init(handle) };
110+
let mut comparator_y = unsafe { cfg.comparator_y.init(handle) };
115111

116112
let generator_a = unsafe {
117113
cfg.generator_a.init(
@@ -144,38 +140,12 @@ where
144140
}
145141
}
146142

147-
impl<const N: u8, CMP_Y: OptionalCmp, G: Group> Operator<N, G, NoCmp, CMP_Y, NoGen, NoGen> {
148-
fn cmp_x(self, config: ComparatorConfig) -> Operator<N, G, Comparator, CMP_Y, NoGen, NoGen> {
149-
let mut flags: mcpwm_comparator_config_t__bindgen_ty_1 = Default::default();
150-
flags.set_update_cmp_on_tep(todo!());
151-
flags.set_update_cmp_on_tez(todo!());
152-
flags.set_update_cmp_on_sync(todo!());
153-
154-
let cfg = mcpwm_comparator_config_t { flags };
155-
let mut cmp = ptr::null_mut();
156-
unsafe {
157-
esp!(mcpwm_new_comparator(self._handle, &cfg, &mut cmp)).unwrap();
158-
}
159-
let comparator_x = Comparator(cmp);
160-
161-
Operator {
162-
_instance: self._instance,
163-
_handle: self._handle,
164-
comparator_x,
165-
comparator_y: self.comparator_y,
166-
167-
_generator_a: self._generator_a,
168-
_generator_b: self._generator_b,
169-
}
170-
}
171-
}
172-
173-
impl<const N: u8, G, GEN_A, GEN_B, CMP_Y> Operator<N, G, Comparator, CMP_Y, GEN_A, GEN_B>
143+
impl<const N: u8, G, GENA, GENB, CMPY> Operator<N, G, Comparator, CMPY, GENA, GENB>
174144
where
175145
G: Group,
176-
CMP_Y: OptionalCmp,
177-
GEN_A: OptionalGen,
178-
GEN_B: OptionalGen,
146+
CMPY: OptionalCmp,
147+
GENA: OptionalGen,
148+
GENB: OptionalGen,
179149
{
180150
// TODO: Note that this is the comparator we are affecting, not the generator. Generator A may not necessarily have
181151
// anything to do with comparator A. How do we best convay that? Should we call them Generator X/Y and Comparator A/B?
@@ -213,12 +183,12 @@ where
213183
}
214184
}
215185

216-
impl<const N: u8, G, GEN_A, GEN_B, CMP_X> Operator<N, G, CMP_X, Comparator, GEN_A, GEN_B>
186+
impl<const N: u8, G, GENA, GENB, CMPX> Operator<N, G, CMPX, Comparator, GENA, GENB>
217187
where
218188
G: Group,
219-
CMP_X: OptionalCmp,
220-
GEN_A: OptionalGen,
221-
GEN_B: OptionalGen,
189+
CMPX: OptionalCmp,
190+
GENA: OptionalGen,
191+
GENB: OptionalGen,
222192
{
223193
/// Get compare value, often times same as the duty for output B.
224194
///
@@ -247,14 +217,14 @@ where
247217
}
248218

249219
pub trait OptionalOperator<const N: u8, G: Group> {}
250-
impl<const N: u8, G, CMP_X, CMP_Y, GEN_A, GEN_B> OptionalOperator<N, G>
251-
for Operator<N, G, CMP_X, CMP_Y, GEN_A, GEN_B>
220+
impl<const N: u8, G, CMPX, CMPY, GENA, GENB> OptionalOperator<N, G>
221+
for Operator<N, G, CMPX, CMPY, GENA, GENB>
252222
where
253223
G: Group,
254-
CMP_X: OptionalCmp,
255-
CMP_Y: OptionalCmp,
256-
GEN_A: OptionalGen,
257-
GEN_B: OptionalGen,
224+
CMPX: OptionalCmp,
225+
CMPY: OptionalCmp,
226+
GENA: OptionalGen,
227+
GENB: OptionalGen,
258228
{
259229
}
260230

0 commit comments

Comments
 (0)