Skip to content

Commit 09e4111

Browse files
committed
Updated 'machine.UART' module
Fixed issue where 'linefeed' and 'pattern' arguments were not able to accept character values > \x7f
1 parent 7dd4cba commit 09e4111

22 files changed

+886
-25
lines changed

MicroPython_BUILD/components/micropython/esp32/machine_uart.c

+50-21
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,12 @@ STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
322322
mp_printf(print, "\n data CB: True, on len: %d", self->data_cb_size);
323323
}
324324
if (self->pattern_cb) {
325-
mp_printf(print, "\n pattern CB: True, pattern: [%s]", self->pattern);
325+
char pattern[80] = {'\0'};
326+
for (int i=0; i<self->pattern_len; i++) {
327+
if ((self->pattern[i] >= 0x20) && (self->pattern[i] < 0x7f)) pattern[strlen(pattern)] = self->pattern[i];
328+
else sprintf(pattern+strlen(pattern), "\\x%02x", self->pattern[i]);
329+
}
330+
mp_printf(print, "\n pattern CB: True, pattern: b'%s'", pattern);
326331
}
327332
if (self->error_cb) {
328333
mp_printf(print, "\n error CB: True");
@@ -438,10 +443,16 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
438443
if (args[ARG_timeout].u_int >= 0) self->timeout = args[ARG_timeout].u_int;
439444

440445
// set line end
441-
if (MP_OBJ_IS_STR(args[ARG_lineend].u_obj)) {
442-
size_t lnendlen;
443-
const char *lnend = mp_obj_str_get_data(args[ARG_lineend].u_obj, &lnendlen);
444-
if ((lnend) && (lnendlen > 0) && (lnendlen < 3)) sprintf((char *)self->lineend, "%s", lnend);
446+
mp_buffer_info_t lnend_buff;
447+
mp_obj_type_t *type = mp_obj_get_type(args[ARG_lineend].u_obj);
448+
if (type->buffer_p.get_buffer != NULL) {
449+
int ret = type->buffer_p.get_buffer(args[ARG_lineend].u_obj, &lnend_buff, MP_BUFFER_READ);
450+
if (ret == 0) {
451+
if ((lnend_buff.len > 0) && (lnend_buff.len < sizeof(self->lineend))) {
452+
memset(self->lineend, 0, sizeof(self->lineend));
453+
memcpy(self->lineend, lnend_buff.buf, lnend_buff.len);
454+
}
455+
}
445456
}
446457
}
447458

@@ -684,8 +695,12 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
684695
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
685696
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
686697

698+
int datalen = -1;
699+
mp_buffer_info_t pattern_buff;
687700
int cbtype = args[ARG_type].u_int;
701+
688702
if ((!MP_OBJ_IS_FUN(args[ARG_func].u_obj)) && (!MP_OBJ_IS_METH(args[ARG_func].u_obj))) {
703+
// CB function not given, disable callback
689704
if (uart_mutex) xSemaphoreTake(uart_mutex, 200 / portTICK_PERIOD_MS);
690705
switch(cbtype) {
691706
case UART_CB_TYPE_DATA:
@@ -707,29 +722,43 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
707722
return mp_const_none;
708723
}
709724

725+
// Get callback parameters
726+
switch(cbtype) {
727+
case UART_CB_TYPE_DATA:
728+
if ((args[ARG_datalen].u_int <= 0) || (args[ARG_datalen].u_int >= self->buffer_size)) {
729+
mp_raise_ValueError("invalid data length");
730+
}
731+
datalen = args[ARG_datalen].u_int;
732+
break;
733+
case UART_CB_TYPE_PATTERN:
734+
{
735+
bool has_pattern = false;
736+
mp_obj_type_t *type = mp_obj_get_type(args[ARG_pattern].u_obj);
737+
if (type->buffer_p.get_buffer != NULL) {
738+
int ret = type->buffer_p.get_buffer(args[ARG_pattern].u_obj, &pattern_buff, MP_BUFFER_READ);
739+
if (ret == 0) {
740+
if ((pattern_buff.len > 0) && (pattern_buff.len <= sizeof(self->pattern))) has_pattern = true;
741+
}
742+
}
743+
if (!has_pattern) {
744+
mp_raise_ValueError("invalid pattern");
745+
}
746+
}
747+
break;
748+
default:
749+
break;
750+
}
710751

711-
int datalen = -1;
712-
size_t patternlen = 0;
713-
const char * pattern = NULL;
714-
715-
if (MP_OBJ_IS_STR(args[ARG_pattern].u_obj)) {
716-
pattern = mp_obj_str_get_data(args[ARG_pattern].u_obj, &patternlen);
717-
if (patternlen > sizeof(self->pattern)) patternlen = sizeof(self->pattern);
718-
}
719-
720-
if ((args[ARG_datalen].u_int >= 0) && (args[ARG_datalen].u_int < self->buffer_size)) datalen = args[ARG_datalen].u_int;
721-
752+
// Set the callback
722753
if (uart_mutex) xSemaphoreTake(uart_mutex, 200 / portTICK_PERIOD_MS);
723754
switch(cbtype) {
724755
case UART_CB_TYPE_DATA:
725-
if (datalen >= 0) self->data_cb_size = datalen;
756+
self->data_cb_size = datalen;
726757
self->data_cb = args[ARG_func].u_obj;
727758
break;
728759
case UART_CB_TYPE_PATTERN:
729-
if (pattern) {
730-
memcpy(self->pattern, pattern, patternlen);
731-
self->pattern_len = patternlen;
732-
}
760+
memcpy(self->pattern, pattern_buff.buf, pattern_buff.len);
761+
self->pattern_len = pattern_buff.len;
733762
self->pattern_cb = args[ARG_func].u_obj;
734763
break;
735764
case UART_CB_TYPE_ERROR:

MicroPython_BUILD/components/micropython/esp32/modmachine.c

+16
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,20 @@ STATIC mp_obj_t mod_machine_stdin_disable(mp_obj_t pattern_in) {
848848
}
849849
STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_machine_stdin_disable_obj, mod_machine_stdin_disable);
850850

851+
//---------------------------------------
852+
STATIC mp_obj_t mod_machine_reset_wdt() {
853+
mp_hal_reset_wdt();
854+
return mp_const_none;
855+
}
856+
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_machine_reset_wdt_obj, mod_machine_reset_wdt);
857+
858+
//-------------------------------------
859+
STATIC mp_obj_t mod_machine_set_wdt() {
860+
mp_hal_set_wdt_tmo();
861+
return mp_const_none;
862+
}
863+
STATIC MP_DEFINE_CONST_FUN_OBJ_0(mod_machine_set_wdt_obj, mod_machine_set_wdt);
864+
851865

852866
//===============================================================
853867
STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
@@ -859,6 +873,8 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
859873

860874
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&machine_freq_obj) },
861875
{ MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&machine_reset_obj) },
876+
{ MP_ROM_QSTR(MP_QSTR_resetWDT), MP_ROM_PTR(&mod_machine_reset_wdt_obj) },
877+
{ MP_ROM_QSTR(MP_QSTR_setWDT), MP_ROM_PTR(&mod_machine_set_wdt_obj) },
862878
{ MP_ROM_QSTR(MP_QSTR_unique_id), MP_ROM_PTR(&machine_unique_id_obj) },
863879
{ MP_ROM_QSTR(MP_QSTR_idle), MP_ROM_PTR(&machine_idle_obj) },
864880
{ MP_OBJ_NEW_QSTR(MP_QSTR_deepsleep), MP_ROM_PTR(&machine_deepsleep_obj) },

0 commit comments

Comments
 (0)