From 8cb15d5b5c6fbe99d674dadd1a2e453e1b8dea41 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Mon, 13 Jun 2022 18:36:49 +0100 Subject: [PATCH] PCF85063a: Optimise functions, drop print. --- micropython/modules/pcf85063a/pcf85063a.c | 7 +- micropython/modules/pcf85063a/pcf85063a.cpp | 176 ++++++-------------- micropython/modules/pcf85063a/pcf85063a.h | 7 +- 3 files changed, 58 insertions(+), 132 deletions(-) diff --git a/micropython/modules/pcf85063a/pcf85063a.c b/micropython/modules/pcf85063a/pcf85063a.c index d986fa4c..14489f15 100644 --- a/micropython/modules/pcf85063a/pcf85063a.c +++ b/micropython/modules/pcf85063a/pcf85063a.c @@ -6,11 +6,11 @@ /***** Methods *****/ MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_reset_obj, PCF85063A_reset); -MP_DEFINE_CONST_FUN_OBJ_KW(PCF85063A_datetime_obj, 1, PCF85063A_datetime); +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(PCF85063A_datetime_obj, 1, 2, PCF85063A_datetime); MP_DEFINE_CONST_FUN_OBJ_KW(PCF85063A_set_alarm_obj, 1, PCF85063A_set_alarm); MP_DEFINE_CONST_FUN_OBJ_KW(PCF85063A_set_weekday_alarm_obj, 1, PCF85063A_set_weekday_alarm); -MP_DEFINE_CONST_FUN_OBJ_KW(PCF85063A_enable_alarm_interrupt_obj, 2, PCF85063A_enable_alarm_interrupt); +MP_DEFINE_CONST_FUN_OBJ_2(PCF85063A_enable_alarm_interrupt_obj, PCF85063A_enable_alarm_interrupt); MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_read_alarm_flag_obj, PCF85063A_read_alarm_flag); MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_clear_alarm_flag_obj, PCF85063A_clear_alarm_flag); MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_unset_alarm_obj, PCF85063A_unset_alarm); @@ -21,7 +21,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_read_timer_flag_obj, PCF85063A_read_timer_fl MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_clear_timer_flag_obj, PCF85063A_clear_timer_flag); MP_DEFINE_CONST_FUN_OBJ_1(PCF85063A_unset_timer_obj, PCF85063A_unset_timer); -MP_DEFINE_CONST_FUN_OBJ_KW(PCF85063A_set_clock_output_obj, 2, PCF85063A_set_clock_output); +MP_DEFINE_CONST_FUN_OBJ_2(PCF85063A_set_clock_output_obj, PCF85063A_set_clock_output); /***** Binding of Methods *****/ STATIC const mp_rom_map_elem_t PCF85063A_locals_dict_table[] = { @@ -49,7 +49,6 @@ STATIC MP_DEFINE_CONST_DICT(PCF85063A_locals_dict, PCF85063A_locals_dict_table); const mp_obj_type_t pcf85063a_PCF85063A_type = { { &mp_type_type }, .name = MP_QSTR_pcf85063a, - .print = PCF85063A_print, .make_new = PCF85063A_make_new, .locals_dict = (mp_obj_dict_t*)&PCF85063A_locals_dict, }; diff --git a/micropython/modules/pcf85063a/pcf85063a.cpp b/micropython/modules/pcf85063a/pcf85063a.cpp index df40d95f..21526c3b 100644 --- a/micropython/modules/pcf85063a/pcf85063a.cpp +++ b/micropython/modules/pcf85063a/pcf85063a.cpp @@ -18,36 +18,6 @@ typedef struct _pcf85063a_PCF85063A_obj_t { _PimoroniI2C_obj_t *i2c; } pcf85063a_PCF85063A_obj_t; -/***** Print *****/ -void PCF85063A_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - (void)kind; //Unused input parameter - pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(self_in, pcf85063a_PCF85063A_obj_t); - PCF85063A* breakout = self->breakout; - mp_print_str(print, "PCF85063A("); - - mp_print_str(print, "i2c = "); - mp_obj_print_helper(print, mp_obj_new_int((breakout->get_i2c() == i2c0) ? 0 : 1), PRINT_REPR); - - mp_print_str(print, ", address = 0x"); - char buf[3]; - sprintf(buf, "%02X", breakout->get_address()); - mp_print_str(print, buf); - - mp_print_str(print, ", sda = "); - mp_obj_print_helper(print, mp_obj_new_int(breakout->get_sda()), PRINT_REPR); - - mp_print_str(print, ", scl = "); - mp_obj_print_helper(print, mp_obj_new_int(breakout->get_scl()), PRINT_REPR); - - mp_print_str(print, ", int = "); - uint int_pin = breakout->get_int(); - if(int_pin == PIN_UNUSED) - mp_print_str(print, "PIN_UNUSED"); - else - mp_obj_print_helper(print, mp_obj_new_int(breakout->get_int()), PRINT_REPR); - - mp_print_str(print, ")"); -} /***** Constructor *****/ mp_obj_t PCF85063A_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { @@ -81,19 +51,12 @@ mp_obj_t PCF85063A_reset(mp_obj_t self_in) { return mp_const_none; } -mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { +mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *args) { enum { ARG_self, ARG_time }; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_time, MP_ARG_OBJ, { .u_obj = mp_const_none }}, - }; - 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); + pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self], pcf85063a_PCF85063A_obj_t); - pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, pcf85063a_PCF85063A_obj_t); - - if(n_args <= 1) { + if(n_args == 1) { datetime_t t = self->breakout->get_datetime(); // Return the date @@ -109,7 +72,7 @@ mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k } else { // Provide a new date - const mp_obj_t object = args[ARG_time].u_obj; + const mp_obj_t object = args[ARG_time]; size_t length = 0; mp_obj_t *items = nullptr; @@ -124,45 +87,34 @@ mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *pos_args, mp_map_t *k items = tuple->items; } - if(items == nullptr) - mp_raise_TypeError("cannot convert object to a list or tuple of integers"); - else if(length < 7 || length > 8) - mp_raise_TypeError("list or tuple must contain integers in the form (year, month, mday, hour, minute, second, weekday)"); - else { - int year = mp_obj_get_int(items[0]); - int month = mp_obj_get_int(items[1]); - int day = mp_obj_get_int(items[2]); - int hour = mp_obj_get_int(items[3]); - int minute = mp_obj_get_int(items[4]); - int second = mp_obj_get_int(items[5]); - int dotw = mp_obj_get_int(items[6]); + if(items == nullptr) mp_raise_TypeError("cannot convert object to a list or tuple of integers"); + if(length < 7 || length > 8) mp_raise_TypeError("list or tuple must contain integers in the form (year, month, mday, hour, minute, second, weekday)"); - if(year < 2000 || year > 2099) - mp_raise_ValueError("year out of range. Expected 2000 to 2099"); - else if(month < 1 || month > 12) - mp_raise_ValueError("month out of range. Expected 1 to 12"); - else if(day < 1 || day > 31) - mp_raise_ValueError("day out of range. Expected 1 to 31"); - else if(hour < 0 || hour > 23) - mp_raise_ValueError("hour out of range. Expected 0 to 23"); - else if(minute < 0 || minute > 59) - mp_raise_ValueError("minute out of range. Expected 0 to 59"); - else if(second < 0 || second > 59) - mp_raise_ValueError("second out of range. Expected 0 to 59"); - else if(dotw < 0 || dotw > 6) - mp_raise_ValueError("dotw out of range. Expected 0 to 6"); - else { - datetime_t t; - t.year = year; - t.month = month; - t.day = day; - t.hour = hour; - t.min = minute; - t.sec = second; - t.dotw = (dotw + 1) % 7; - self->breakout->set_datetime(&t); - } - } + int year = mp_obj_get_int(items[0]); + int month = mp_obj_get_int(items[1]); + int day = mp_obj_get_int(items[2]); + int hour = mp_obj_get_int(items[3]); + int minute = mp_obj_get_int(items[4]); + int second = mp_obj_get_int(items[5]); + int dotw = mp_obj_get_int(items[6]); + + if(year < 2000 || year > 2099) mp_raise_ValueError("year out of range. Expected 2000 to 2099"); + if(month < 1 || month > 12) mp_raise_ValueError("month out of range. Expected 1 to 12"); + if(day < 1 || day > 31) mp_raise_ValueError("day out of range. Expected 1 to 31"); + if(hour < 0 || hour > 23) mp_raise_ValueError("hour out of range. Expected 0 to 23"); + if(minute < 0 || minute > 59) mp_raise_ValueError("minute out of range. Expected 0 to 59"); + if(second < 0 || second > 59) mp_raise_ValueError("second out of range. Expected 0 to 59"); + if(dotw < 0 || dotw > 6) mp_raise_ValueError("dotw out of range. Expected 0 to 6"); + + datetime_t t; + t.year = year; + t.month = month; + t.day = day; + t.hour = hour; + t.min = minute; + t.sec = second; + t.dotw = (dotw + 1) % 7; + self->breakout->set_datetime(&t); } return mp_const_none; } @@ -189,14 +141,14 @@ mp_obj_t PCF85063A_set_alarm(size_t n_args, const mp_obj_t *pos_args, mp_map_t * if(second != PCF85063A::PARAM_UNUSED && (second < 0 || second > 59)) mp_raise_ValueError("second out of range. Expected 0 to 59"); - else if(minute != PCF85063A::PARAM_UNUSED && (minute < 0 || minute > 59)) + if(minute != PCF85063A::PARAM_UNUSED && (minute < 0 || minute > 59)) mp_raise_ValueError("minute out of range. Expected 0 to 59"); - else if(hour != PCF85063A::PARAM_UNUSED && (hour < 0 || hour > 23)) + if(hour != PCF85063A::PARAM_UNUSED && (hour < 0 || hour > 23)) mp_raise_ValueError("hour out of range. Expected 0 to 23"); - else if(day != PCF85063A::PARAM_UNUSED && (day < 1 || day > 31)) + if(day != PCF85063A::PARAM_UNUSED && (day < 1 || day > 31)) mp_raise_ValueError("date out of range. Expected 1 to 31"); - else - self->breakout->set_alarm(second, minute, hour, day); + + self->breakout->set_alarm(second, minute, hour, day); return mp_const_none; } @@ -223,32 +175,22 @@ mp_obj_t PCF85063A_set_weekday_alarm(size_t n_args, const mp_obj_t *pos_args, mp if(second != PCF85063A::PARAM_UNUSED && (second < 0 || second > 59)) mp_raise_ValueError("second out of range. Expected 0 to 59"); - else if(minute != PCF85063A::PARAM_UNUSED && (minute < 0 || minute > 59)) + if(minute != PCF85063A::PARAM_UNUSED && (minute < 0 || minute > 59)) mp_raise_ValueError("minute out of range. Expected 0 to 59"); - else if(hour != PCF85063A::PARAM_UNUSED && (hour < 0 || hour > 23)) + if(hour != PCF85063A::PARAM_UNUSED && (hour < 0 || hour > 23)) mp_raise_ValueError("hour out of range. Expected 0 to 23"); - else if(dotw != PCF85063A::PARAM_UNUSED && (dotw < 0 || dotw > 6)) + if(dotw != PCF85063A::PARAM_UNUSED && (dotw < 0 || dotw > 6)) mp_raise_ValueError("dotw out of range. Expected 0 to 6"); - else - self->breakout->set_weekday_alarm(second, minute, hour, (PCF85063A::DayOfWeek)dotw); + + self->breakout->set_weekday_alarm(second, minute, hour, (PCF85063A::DayOfWeek)dotw); return mp_const_none; } -mp_obj_t PCF85063A_enable_alarm_interrupt(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_self, ARG_enable}; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_enable, MP_ARG_REQUIRED | MP_ARG_BOOL}, - }; +mp_obj_t PCF85063A_enable_alarm_interrupt(mp_obj_t self_in, mp_obj_t enable_in) { + pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(self_in, pcf85063a_PCF85063A_obj_t); - 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); - - pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, pcf85063a_PCF85063A_obj_t); - - bool enable = args[ARG_enable].u_bool; - self->breakout->enable_alarm_interrupt(enable); + self->breakout->enable_alarm_interrupt(enable_in == mp_const_true); return mp_const_none; } @@ -288,12 +230,10 @@ mp_obj_t PCF85063A_set_timer(size_t n_args, const mp_obj_t *pos_args, mp_map_t * int ticks = args[ARG_ticks].u_int; int ttp = args[ARG_ttp].u_int; - if(ticks < 0 || ticks > 255) - mp_raise_ValueError("ticks out of range. Expected 0 to 255"); - else if(ttp < 0 || ttp > 3) - mp_raise_ValueError("ttp out of range. Expected 0 to 3"); - else - self->breakout->set_timer(ticks, (PCF85063A::TimerTickPeriod)ttp); + if(ticks < 0 || ticks > 255) mp_raise_ValueError("ticks out of range. Expected 0 to 255"); + if(ttp < 0 || ttp > 3) mp_raise_ValueError("ttp out of range. Expected 0 to 3"); + + self->breakout->set_timer(ticks, (PCF85063A::TimerTickPeriod)ttp); return mp_const_none; } @@ -337,24 +277,12 @@ mp_obj_t PCF85063A_unset_timer(mp_obj_t self_in) { return mp_const_none; } -mp_obj_t PCF85063A_set_clock_output(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { - enum { ARG_self, ARG_co}; - static const mp_arg_t allowed_args[] = { - { MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_co, MP_ARG_REQUIRED | MP_ARG_INT}, - }; +mp_obj_t PCF85063A_set_clock_output(mp_obj_t self_in, mp_obj_t co_in) { + pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(self_in, pcf85063a_PCF85063A_obj_t); - 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); + int co = mp_obj_get_int(co_in) & 7; // Clamp to 0-7 - pcf85063a_PCF85063A_obj_t *self = MP_OBJ_TO_PTR2(args[ARG_self].u_obj, pcf85063a_PCF85063A_obj_t); - - int co = args[ARG_co].u_int; - - if(co < 0 || co > 7) - mp_raise_ValueError("co out of range. Expected 0 to 7"); - else - self->breakout->set_clock_output((PCF85063A::ClockOut)co); + self->breakout->set_clock_output((PCF85063A::ClockOut)co); return mp_const_none; } diff --git a/micropython/modules/pcf85063a/pcf85063a.h b/micropython/modules/pcf85063a/pcf85063a.h index 0e34694e..8ccbabf8 100644 --- a/micropython/modules/pcf85063a/pcf85063a.h +++ b/micropython/modules/pcf85063a/pcf85063a.h @@ -5,15 +5,14 @@ extern const mp_obj_type_t pcf85063a_PCF85063A_type; /***** Extern of Class Methods *****/ -extern void PCF85063A_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); extern mp_obj_t PCF85063A_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args); extern mp_obj_t PCF85063A_reset(mp_obj_t self_in); -extern mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +extern mp_obj_t PCF85063A_datetime(size_t n_args, const mp_obj_t *args); extern mp_obj_t PCF85063A_set_alarm(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); extern mp_obj_t PCF85063A_set_weekday_alarm(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); -extern mp_obj_t PCF85063A_enable_alarm_interrupt(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); +extern mp_obj_t PCF85063A_enable_alarm_interrupt(mp_obj_t self_in, mp_obj_t enable_in); extern mp_obj_t PCF85063A_clear_alarm_flag(mp_obj_t self_in); extern mp_obj_t PCF85063A_read_alarm_flag(mp_obj_t self_in); extern mp_obj_t PCF85063A_unset_alarm(mp_obj_t self_in); @@ -24,4 +23,4 @@ extern mp_obj_t PCF85063A_clear_timer_flag(mp_obj_t self_in); extern mp_obj_t PCF85063A_read_timer_flag(mp_obj_t self_in); extern mp_obj_t PCF85063A_unset_timer(mp_obj_t self_in); -extern mp_obj_t PCF85063A_set_clock_output(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args); \ No newline at end of file +extern mp_obj_t PCF85063A_set_clock_output(mp_obj_t self_in, mp_obj_t co_in); \ No newline at end of file