Skip to content
This repository was archived by the owner on Aug 23, 2024. It is now read-only.

Commit 9c65cfe

Browse files
committed
Merge branch 'master' into m5stack-dev
2 parents eabe283 + c6aa0c6 commit 9c65cfe

36 files changed

Lines changed: 519 additions & 117 deletions

MicroPython_BUILD/components/micropython/Kconfig.projbuild

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ menu "MicroPython"
100100
bool "Verbose"
101101
endchoice
102102

103+
config MICROPY_USE_THREADED_REPL
104+
bool "Start REPL in separate thread"
105+
default n
106+
help
107+
Start the REPL in its own thread
108+
Running REPL in thread may solve some issues with uasyncio
109+
and long running or infinite loops
110+
103111
config MICROPY_RX_BUFFER_SIZE
104112
int "RX buffer size"
105113
range 256 4096
@@ -121,6 +129,7 @@ menu "MicroPython"
121129
help
122130
Run MicroPython tasks on both cores, if not selected MicroPython tasks are created pinned to one core
123131
WARNING: When enabled, it may introduce some issues with uasyncio and threads
132+
not recommended for now!
124133

125134
config MICROPY_TASK_PRIORITY
126135
int "Main task priority"
@@ -131,9 +140,9 @@ menu "MicroPython"
131140

132141
config MICROPY_STACK_SIZE
133142
int "MicroPython stack size (KB)"
134-
range 8 32 if !SPIRAM_SUPPORT
135-
range 8 64 if SPIRAM_SUPPORT
136-
default 20
143+
range 6 32 if !SPIRAM_SUPPORT
144+
range 6 64 if SPIRAM_SUPPORT
145+
default 16
137146
help
138147
Set the size of the MicroPython stack in Kbytes.
139148

MicroPython_BUILD/components/micropython/esp32/machine_rtc.c

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@
5050
#define RTC_MEM_INT_SIZE 64
5151
#define RTC_MEM_STR_SIZE 2048
5252

53+
char mpy_time_zone[64] = {'\0'};
54+
5355
static int RTC_DATA_ATTR rtc_mem_int[RTC_MEM_INT_SIZE] = { 0 };
5456
static char RTC_DATA_ATTR rtc_mem_str[RTC_MEM_STR_SIZE] = { 0 };
5557
static uint16_t RTC_DATA_ATTR rtc_mem_int_crc;
@@ -268,6 +270,29 @@ void sntp_task (void *pvParameters)
268270
vTaskDelete(NULL);
269271
}
270272

273+
//--------------------------------------------
274+
void tz_fromto_NVS(char *gettzs, char *settzs)
275+
{
276+
size_t len = 0;
277+
char value[64] = {'\0'};
278+
if (gettzs) {
279+
gettzs[0] = '\0';
280+
esp_err_t ret = nvs_get_str(mpy_nvs_handle, "MpyTimeZone", NULL, &len);
281+
if ((ret == ESP_OK ) && (len > 0) && (len < 64)) {
282+
esp_err_t ret = nvs_get_str(mpy_nvs_handle, "MpyTimeZone", value, &len);
283+
if ((ret == ESP_OK ) && (len > 0) && (len < 64)) {
284+
if (gettzs) strcpy(gettzs, value);
285+
}
286+
}
287+
}
288+
if (settzs) {
289+
esp_err_t esp_err = nvs_set_str(mpy_nvs_handle, "MpyTimeZone", settzs);
290+
if (ESP_OK == esp_err) {
291+
nvs_commit(mpy_nvs_handle);
292+
}
293+
}
294+
}
295+
271296
//---------------------------------------------------------------------------------------------
272297
STATIC mp_obj_t mach_rtc_ntp_sync(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
273298
static const mp_arg_t allowed_args[] = {
@@ -291,23 +316,30 @@ STATIC mp_obj_t mach_rtc_ntp_sync(size_t n_args, const mp_obj_t *pos_args, mp_ma
291316
if ((strlen(srvn) > 3) && (strlen(srvn) < 64)) sprintf(srv_name, "%s", srvn);
292317
}
293318

294-
char tz[64];
295-
#ifdef MICROPY_TIMEZONE
296-
// ===== Set time zone ======
297-
sprintf(tz, "%s", MICROPY_TIMEZONE);
319+
if (strlen(mpy_time_zone) == 0) {
320+
// Try to get tz from NVS
321+
tz_fromto_NVS(mpy_time_zone, NULL);
322+
if (strlen(mpy_time_zone) == 0) {
323+
#ifdef MICROPY_TIMEZONE
324+
// ===== Set default time zone ======
325+
snprintf(mpy_time_zone, sizeof(mpy_time_zone)-1, "%s", MICROPY_TIMEZONE);
326+
#endif
327+
}
328+
}
329+
298330
if (args[2].u_obj != mp_const_none) {
331+
// get TZ argument
299332
const char *tzs = mp_obj_str_get_str(args[2].u_obj);
300-
if (strlen(tzs) < 64) {
301-
sprintf(tz, "%s", tzs);
333+
if ((strlen(tzs) < 2) && (strlen(tzs) < 64)) {
334+
sprintf(mpy_time_zone, "%s", tzs);
335+
tz_fromto_NVS(NULL, mpy_time_zone);
336+
}
337+
else {
338+
mp_raise_ValueError("tz string length must be 3 - 64");
302339
}
303340
}
304-
setenv("TZ", tz, 1);
341+
setenv("TZ", mpy_time_zone, 1);
305342
tzset();
306-
// ==========================
307-
#else
308-
tz[0] = '\0';
309-
#endif
310-
311343

312344
if (sntp_mutex == NULL) {
313345
// Create sntp mutex

MicroPython_BUILD/components/micropython/esp32/machine_rtc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
#ifndef MACHRTC_H_
3030
#define MACHRTC_H_
3131

32+
extern char mpy_time_zone[64];
3233
extern const mp_obj_type_t mach_rtc_type;
3334
extern xSemaphoreHandle sntp_mutex;
3435

3536
void rtc_init0(void);
37+
void tz_fromto_NVS(char *gettzs, char *settzs);
3638

3739
#endif // MACHRTC_H_

MicroPython_BUILD/components/micropython/esp32/machine_timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ STATIC const mp_map_elem_t machine_timer_locals_dict_table[] = {
670670
{ MP_ROM_QSTR(MP_QSTR_init), (mp_obj_t)&machine_timer_init_obj },
671671
{ MP_ROM_QSTR(MP_QSTR_value), (mp_obj_t)&machine_timer_value_obj },
672672
{ MP_ROM_QSTR(MP_QSTR_events), (mp_obj_t)&machine_timer_events_obj },
673-
{ MP_ROM_QSTR(MP_QSTR_reshot), (mp_obj_t)&machine_timer_shot_obj },
673+
{ MP_ROM_QSTR(MP_QSTR_reshoot), (mp_obj_t)&machine_timer_shot_obj },
674674
{ MP_ROM_QSTR(MP_QSTR_start), (mp_obj_t)&machine_timer_start_obj },
675675
{ MP_ROM_QSTR(MP_QSTR_stop), (mp_obj_t)&machine_timer_pause_obj },
676676
{ MP_ROM_QSTR(MP_QSTR_pause), (mp_obj_t)&machine_timer_pause_obj },

MicroPython_BUILD/components/micropython/esp32/machine_uart.c

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ typedef struct _machine_uart_obj_t {
6363
uint32_t *data_cb;
6464
uint32_t *pattern_cb;
6565
uint32_t *error_cb;
66+
uint32_t inverted;
6667
uint8_t end_task;
6768
uint8_t lineend[3];
6869
} machine_uart_obj_t;
@@ -149,10 +150,10 @@ static void _sched_callback(mp_obj_t function, int uart, int type, int iarglen,
149150
if (!make_carg_entry(carg, 0, MP_SCHED_ENTRY_TYPE_INT, uart, NULL, NULL)) return;
150151
if (!make_carg_entry(carg, 1, MP_SCHED_ENTRY_TYPE_INT, type, NULL, NULL)) return;
151152
if (sarg) {
152-
if (!make_carg_entry(carg, 2, MP_SCHED_ENTRY_TYPE_INT, iarglen, NULL, NULL)) return;
153+
if (!make_carg_entry(carg, 2, MP_SCHED_ENTRY_TYPE_STR, iarglen, sarg, NULL)) return;
153154
}
154155
else {
155-
if (!make_carg_entry(carg, 2, MP_SCHED_ENTRY_TYPE_STR, iarglen, sarg, NULL)) return;
156+
if (!make_carg_entry(carg, 2, MP_SCHED_ENTRY_TYPE_INT, iarglen, NULL, NULL)) return;
156157
}
157158
mp_sched_schedule(function, mp_const_none, carg);
158159
}
@@ -281,9 +282,10 @@ static const mp_arg_t allowed_args[] = {
281282
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
282283
{ MP_QSTR_buffer_size, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 512} },
283284
{ MP_QSTR_lineend, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
285+
{ MP_QSTR_inverted, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_int = -1} },
284286
};
285287

286-
enum { ARG_baudrate, ARG_bits, ARG_parity, ARG_stop, ARG_tx, ARG_rx, ARG_rts, ARG_cts, ARG_timeout, ARG_buffer_size, ARG_lineend };
288+
enum { ARG_baudrate, ARG_bits, ARG_parity, ARG_stop, ARG_tx, ARG_rx, ARG_rts, ARG_cts, ARG_timeout, ARG_buffer_size, ARG_lineend, ARG_inverted };
287289

288290
//-----------------------------------------------------------------------------------------------
289291
STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
@@ -314,10 +316,28 @@ STATIC void machine_uart_print(const mp_print_t *print, mp_obj_t self_in, mp_pri
314316
lnend_idx++;
315317
}
316318
}
319+
char inverted[24] = {'\0'};
320+
if (self->inverted & (uint32_t)UART_INVERSE_RXD) {
321+
if (inverted[0] != '\0') strcat(inverted, ", ");
322+
strcat(inverted, "RX");
323+
}
324+
if (self->inverted & (uint32_t)UART_INVERSE_TXD) {
325+
if (inverted[0] != '\0') strcat(inverted, ", ");
326+
strcat(inverted, "TX");
327+
}
328+
if (self->inverted & (uint32_t)UART_INVERSE_CTS) {
329+
if (inverted[0] != '\0') strcat(inverted, ", ");
330+
strcat(inverted, "CTS");
331+
}
332+
if (self->inverted & (uint32_t)UART_INVERSE_RTS) {
333+
if (inverted[0] != '\0') strcat(inverted, ", ");
334+
strcat(inverted, "RTS");
335+
}
317336

318-
mp_printf(print, "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%s, tx=%d, rx=%d, rts=%d, cts=%d, timeout=%u, buf_size=%u, lineend=b'%s')",
337+
mp_printf(print, "UART(%u, baudrate=%u, bits=%u, parity=%s, stop=%s, tx=%d, rx=%d, rts=%d, cts=%d, inverted: [%s]\n",
319338
self->uart_num+1, baudrate, self->bits, _parity_name[self->parity], _stopbits_name[self->stop],
320-
self->tx, self->rx, self->rts, self->cts, self->timeout, self->buffer_size, lnend);
339+
self->tx, self->rx, self->rts, self->cts, inverted);
340+
mp_printf(print, " timeout=%u, buf_size=%u, lineend=b'%s')", self->timeout, self->buffer_size, lnend);
321341
if (self->data_cb) {
322342
mp_printf(print, "\n data CB: True, on len: %d", self->data_cb_size);
323343
}
@@ -420,6 +440,12 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
420440
}
421441
}
422442

443+
// set inverted pins
444+
if ((args[ARG_inverted].u_int > -1) && (args[ARG_inverted].u_int != self->inverted)) {
445+
self->inverted = args[ARG_inverted].u_int & (UART_INVERSE_RXD | UART_INVERSE_TXD | UART_INVERSE_RTS | UART_INVERSE_CTS);
446+
uart_set_line_inverse(self->uart_num+1, self->inverted);
447+
}
448+
423449
// set pins
424450
if (((self->tx == -2) && (args[ARG_tx].u_int == UART_PIN_NO_CHANGE)) || ((self->rx == -2) && (args[ARG_rx].u_int == UART_PIN_NO_CHANGE))) {
425451
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Tx&Rx pins must be set: u=machine.UART(uart_num, tx=pin, rx=pin)"));
@@ -435,8 +461,16 @@ STATIC void machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args, co
435461

436462
if (args[ARG_tx].u_int != UART_PIN_NO_CHANGE) self->tx = args[ARG_tx].u_int;
437463
if (args[ARG_rx].u_int != UART_PIN_NO_CHANGE) self->rx = args[ARG_rx].u_int;
438-
if (args[ARG_rts].u_int != UART_PIN_NO_CHANGE) self->rts = args[ARG_rts].u_int;
439-
if (args[ARG_cts].u_int != UART_PIN_NO_CHANGE) self->cts = args[ARG_cts].u_int;
464+
if ((self->rts != args[ARG_rts].u_int) || (self->cts != args[ARG_cts].u_int)) {
465+
if (args[ARG_rts].u_int != UART_PIN_NO_CHANGE) self->rts = args[ARG_rts].u_int;
466+
if (args[ARG_cts].u_int != UART_PIN_NO_CHANGE) self->cts = args[ARG_cts].u_int;
467+
// set flow control
468+
int fwc = 0;
469+
if (self->rts >= 0) fwc |= UART_HW_FLOWCTRL_RTS;
470+
if (self->cts >= 0) fwc |= UART_HW_FLOWCTRL_CTS;
471+
// Only when UART_HW_FLOWCTRL_RTS is set, will the rx_thresh value be set.
472+
uart_set_hw_flow_ctrl(self->uart_num+1, fwc, UART_FIFO_LEN / 4 * 3);
473+
}
440474
}
441475

442476
// set timeout
@@ -496,6 +530,7 @@ STATIC mp_obj_t machine_uart_make_new(const mp_obj_type_t *type, size_t n_args,
496530
self->stop = UART_STOP_BITS_1;
497531
self->rts = UART_PIN_NO_CHANGE;
498532
self->cts = UART_PIN_NO_CHANGE;
533+
self->inverted = UART_INVERSE_DISABLE;
499534
self->timeout = 0;
500535
self->pattern[0] = 0;
501536
self->pattern_len = 0;
@@ -773,6 +808,33 @@ STATIC mp_obj_t machine_uart_callback(size_t n_args, const mp_obj_t *pos_args, m
773808
}
774809
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_uart_callback_obj, 2, machine_uart_callback);
775810

811+
//---------------------------------------------------------------------------
812+
STATIC mp_obj_t machine_uart_write_break(size_t n_args, const mp_obj_t *args)
813+
{
814+
machine_uart_obj_t *self = MP_OBJ_TO_PTR(args[0]);
815+
816+
mp_buffer_info_t bufinfo;
817+
mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_READ);
818+
819+
// break signal length
820+
// unit: one BIT time at current_baudrate
821+
int nbreak = nbreak = mp_obj_get_int_truncated(args[2]);
822+
if ((nbreak < 1) || (nbreak > 255)) {
823+
mp_raise_ValueError("values 1 - 255 are allowed");
824+
}
825+
826+
int len = bufinfo.len;
827+
if (n_args == 4) {
828+
len = mp_obj_get_int_truncated(args[3]);
829+
if ((len < 0) || (len > bufinfo.len)) len = bufinfo.len;;
830+
}
831+
832+
int bytes_written = uart_write_bytes_with_break(self->uart_num+1, (const char*)bufinfo.buf, len, nbreak);
833+
834+
return MP_OBJ_NEW_SMALL_INT(bytes_written);
835+
}
836+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_uart_write_break_obj, 3, 4, machine_uart_write_break);
837+
776838

777839
//=================================================================
778840
STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
@@ -783,6 +845,7 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
783845
{ MP_ROM_QSTR(MP_QSTR_readline), MP_ROM_PTR(&mp_stream_unbuffered_readline_obj) },
784846
{ MP_ROM_QSTR(MP_QSTR_readinto), MP_ROM_PTR(&mp_stream_readinto_obj) },
785847
{ MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mp_stream_write_obj) },
848+
{ MP_ROM_QSTR(MP_QSTR_write_break), MP_ROM_PTR(&machine_uart_write_break_obj) },
786849
{ MP_ROM_QSTR(MP_QSTR_readln), MP_ROM_PTR(&machine_uart_readln_obj) },
787850
{ MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&machine_uart_flush_obj) },
788851
{ MP_ROM_QSTR(MP_QSTR_callback), MP_ROM_PTR(&machine_uart_callback_obj) },
@@ -791,6 +854,12 @@ STATIC const mp_rom_map_elem_t machine_uart_locals_dict_table[] = {
791854
{ MP_ROM_QSTR(MP_QSTR_CBTYPE_DATA), MP_ROM_INT(UART_CB_TYPE_DATA) },
792855
{ MP_ROM_QSTR(MP_QSTR_CBTYPE_PATTERN), MP_ROM_INT(UART_CB_TYPE_PATTERN) },
793856
{ MP_ROM_QSTR(MP_QSTR_CBTYPE_ERROR), MP_ROM_INT(UART_CB_TYPE_ERROR) },
857+
858+
{ MP_ROM_QSTR(MP_QSTR_INV_RX), MP_ROM_INT(UART_INVERSE_RXD >> 1) },
859+
{ MP_ROM_QSTR(MP_QSTR_INV_TX), MP_ROM_INT(UART_INVERSE_TXD >> 1) },
860+
{ MP_ROM_QSTR(MP_QSTR_INV_CTS), MP_ROM_INT(UART_INVERSE_CTS >> 1) },
861+
{ MP_ROM_QSTR(MP_QSTR_INV_RTS), MP_ROM_INT(UART_INVERSE_RTS >> 1) },
862+
{ MP_ROM_QSTR(MP_QSTR_INV_NONE), MP_ROM_INT(0) },
794863
};
795864
STATIC MP_DEFINE_CONST_DICT(machine_uart_locals_dict, machine_uart_locals_dict_table);
796865

0 commit comments

Comments
 (0)