mimxrt/machine_timer: Reuse any existing timer objects.

So there is a 1-1 mapping of hardware timer to Python object.
pull/7324/head
robert-hh 2021-06-01 20:49:22 +02:00 zatwierdzone przez Damien George
rodzic 5226d6e1ee
commit cdd95ce737
1 zmienionych plików z 20 dodań i 8 usunięć

Wyświetl plik

@ -31,7 +31,6 @@
#include "fsl_pit.h"
#include "modmachine.h"
#define ALARM_ID_INVALID (-1)
#define TIMER_MODE_ONE_SHOT (0)
#define TIMER_MODE_PERIODIC (1)
#define TIMER_MIN_PERIOD 1
@ -96,8 +95,6 @@ STATIC mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self, size_t n_ar
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
MP_STATE_PORT(timer_table)[self->id] = self; // Insert into the table
self->mode = args[ARG_mode].u_int;
if (args[ARG_freq].u_obj != mp_const_none) {
// Frequency specified in Hz
@ -133,9 +130,7 @@ STATIC mp_obj_t machine_timer_init_helper(machine_timer_obj_t *self, size_t n_ar
}
STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
machine_timer_obj_t *self = m_new_obj_with_finaliser(machine_timer_obj_t);
self->base.type = &machine_timer_type;
self->id = ALARM_ID_INVALID;
machine_timer_obj_t *self;
// Get timer id in the range of 0..2
mp_int_t id = 0;
@ -148,6 +143,16 @@ STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args,
mp_raise_ValueError(MP_ERROR_TEXT("Timer does not exist"));
}
// check, if a timer exists at that channel and stop it first
if (MP_STATE_PORT(timer_table)[id] != NULL) {
PIT_StopTimer(PIT, channel_no[id]);
self = MP_STATE_PORT(timer_table)[id];
} else {
self = m_new_obj_with_finaliser(machine_timer_obj_t);
self->base.type = &machine_timer_type;
MP_STATE_PORT(timer_table)[id] = self;
}
// Set initial values
self->id = id;
self->channel = channel_no[id];
@ -162,6 +167,14 @@ STATIC mp_obj_t machine_timer_make_new(const mp_obj_type_t *type, size_t n_args,
return MP_OBJ_FROM_PTR(self);
}
STATIC mp_obj_t machine_timer___del__(mp_obj_t self_in) {
machine_timer_obj_t *self = MP_OBJ_TO_PTR(self_in);
PIT_StopTimer(PIT, self->channel);
MP_STATE_PORT(timer_table)[self->id] = NULL;
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_timer___del___obj, machine_timer___del__);
STATIC mp_obj_t machine_timer_init(size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
machine_timer_obj_t *self = MP_OBJ_TO_PTR(args[0]);
PIT_StopTimer(PIT, self->channel);
@ -172,7 +185,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_timer_init_obj, 1, machine_timer_init)
STATIC mp_obj_t machine_timer_deinit(mp_obj_t self_in) {
machine_timer_obj_t *self = MP_OBJ_TO_PTR(self_in);
PIT_StopTimer(PIT, self->channel);
MP_STATE_PORT(timer_table)[self->id] = NULL;
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_timer_deinit_obj, machine_timer_deinit);
@ -192,7 +204,7 @@ void machine_timer_init_PIT(void) {
}
STATIC const mp_rom_map_elem_t machine_timer_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_timer_deinit_obj) },
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&machine_timer___del___obj) },
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_timer_init_obj) },
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_timer_deinit_obj) },