From bc96ce831b20c258fd39d0734085f1700a3fff89 Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Sat, 1 Mar 2025 15:50:02 -0500 Subject: [PATCH 1/8] Add basic VT100 scrolling --- shared-bindings/terminalio/Terminal.c | 8 +++- shared-module/terminalio/Terminal.c | 69 ++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/shared-bindings/terminalio/Terminal.c b/shared-bindings/terminalio/Terminal.c index d2e5485dcf347..12cb355d4f7a2 100644 --- a/shared-bindings/terminalio/Terminal.c +++ b/shared-bindings/terminalio/Terminal.c @@ -33,8 +33,12 @@ //| * ``ESC [ #### D`` - Move the cursor to the left by #### //| * ``ESC [ 2 J`` - Erase the entire display //| * ``ESC [ nnnn ; mmmm H`` - Move the cursor to mmmm, nnnn. -//| * ``ESC [ nn m`` - Set the terminal display attributes. -//| * ``ESC [ nn ; nn m`` - Set the terminal display attributes. +//| * ``ESC [ H`` - Move the cursor to 0,0. +//| * ``ESC M`` - Move the cursor up one line, scrolling if necessary. +//| * ``ESC D`` - Move the cursor down one line, scrolling if necessary. +//| * ``ESC [ ## m`` - Set the terminal display attributes. +//| * ``ESC [ ## ; ## m`` - Set the terminal display attributes. +//| * ``ESC [ ## ; ## ; ## m`` - Set the terminal display attributes. //| //| Supported Display attributes: //| 0 - Reset all attributes diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 6b6fb5402178b..7d75d042b6638 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -113,6 +113,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con // Handle commands of the form [ESC]. where . is not yet known. uint16_t n = 0; uint8_t j = 1; + uint8_t j2 = 0; for (; j < 6; j++) { if ('0' <= i[j] && i[j] <= '9') { n = n * 10 + (i[j] - '0'); @@ -128,6 +129,18 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); } i += 2; + } else if (i[1] == '?') { + if (i[2] == '2' && i[3] == '5') { + // cursor visibility commands + if (i[4] == 'h') { + // make cursor visible + // not implemented yet + } else if (i[4] == 'l') { + // make cursor invisible + // not implemented yet + } + } + i += 5; } else { if (c == 'D') { if (n > self->cursor_x) { @@ -153,8 +166,12 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); } } + if (c == 'H') { + self->cursor_x = self->cursor_y = start_y = 0; + } if (c == ';') { uint16_t m = 0; + uint8_t m2 = 0; for (++j; j < 9; j++) { if ('0' <= i[j] && i[j] <= '9') { m = m * 10 + (i[j] - '0'); @@ -163,6 +180,16 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con break; } } + if (c == ';') { + for (++j2; j2 < 9; j2++) { + if ('0' <= i[j2] && i[j2] <= '9') { + m2 = m2 * 10 + (i[j2] - '0'); + } else { + c = i[j2]; + break; + } + } + } if (c == 'H') { if (n > 0) { n--; @@ -196,11 +223,51 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); } + if ((m2 >= 40 && m2 <= 47) || (m2 >= 30 && m2 <= 37)) { + common_hal_displayio_palette_set_color(terminal_palette, 1 - (m2 / 40), _select_color(m2 % 10)); + } + if (m2 == 0) { + common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); + common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); + } } } - i += j + 1; + i += j + j2 + 1; continue; } + } else if (i[0] == 'M') { + if (self->cursor_y != self->scroll_area->top_left_y) { + if (self->cursor_y > 0) { + self->cursor_y = self->cursor_y - 1; + } else { + self->cursor_y = self->scroll_area->height_in_tiles - 1; + } + } else { + if (self->cursor_y > 0) { + common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, self->cursor_y - 1); + } else { + common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, self->scroll_area->height_in_tiles - 1); + } + for (uint8_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, self->scroll_area->top_left_y, 0); + } + + self->cursor_x = 0; + self->cursor_y = self->scroll_area->top_left_y; + } + start_y = self->cursor_y; + i++; + } else if (i[0] == 'D') { + self->cursor_y = (self->cursor_y + 1) % self->scroll_area->height_in_tiles; + if (self->cursor_y == self->scroll_area->top_left_y) { + common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, (self->cursor_y + 1) % self->scroll_area->height_in_tiles); + for (uint8_t icol = 0; icol < self->scroll_area->width_in_tiles; icol++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, icol, self->cursor_y, 0); + } + self->cursor_x = 0; + } + start_y = self->cursor_y; + i++; } else if (i[0] == ']' && c == ';') { self->in_osc_command = true; self->osc_command = n; From 0501a8e78f6fbc31f483b0865b17dcff551fc570 Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 12:00:46 -0500 Subject: [PATCH 2/8] fix for sequence params and compile flag (not enabled yet) --- ports/atmel-samd/mpconfigport.mk | 2 + py/circuitpy_mpconfig.mk | 3 + shared-bindings/terminalio/Terminal.c | 3 + shared-module/terminalio/Terminal.c | 165 ++++++++++++++------------ 4 files changed, 96 insertions(+), 77 deletions(-) diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index 3dde2885d1f68..c2961e4165f23 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -59,6 +59,8 @@ CIRCUITPY_ZLIB = 0 # Turn off a few more things that don't fit in 192kB +CIRCUITPY_TERMINALIO_VT100 = 0 + ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) CIRCUITPY_ONEWIREIO ?= 0 CIRCUITPY_SAFEMODE_PY ?= 0 diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index 3a240ba1e1db7..69ebd03e8b295 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -552,6 +552,9 @@ CFLAGS += -DCIRCUITPY_SYS=$(CIRCUITPY_SYS) CIRCUITPY_TERMINALIO ?= $(CIRCUITPY_DISPLAYIO) CFLAGS += -DCIRCUITPY_TERMINALIO=$(CIRCUITPY_TERMINALIO) +CIRCUITPY_TERMINALIO_VT100 ?= $(CIRCUITPY_TERMINALIO) +CFLAGS += -DCIRCUITPY_TERMINALIO_VT100=$(CIRCUITPY_TERMINALIO_VT100) + CIRCUITPY_FONTIO ?= $(call enable-if-all,$(CIRCUITPY_DISPLAYIO) $(CIRCUITPY_TERMINALIO)) CFLAGS += -DCIRCUITPY_FONTIO=$(CIRCUITPY_FONTIO) diff --git a/shared-bindings/terminalio/Terminal.c b/shared-bindings/terminalio/Terminal.c index 12cb355d4f7a2..5d79c88c60839 100644 --- a/shared-bindings/terminalio/Terminal.c +++ b/shared-bindings/terminalio/Terminal.c @@ -30,6 +30,9 @@ //| //| VT100 control sequences: //| * ``ESC [ K`` - Clear the remainder of the line +//| * ``ESC [ 0 K`` - Clear the remainder of the line +//| * ``ESC [ 1 K`` - Clear start of the line to cursor +//| * ``ESC [ 2 K`` - Clear the entire line //| * ``ESC [ #### D`` - Move the cursor to the left by #### //| * ``ESC [ 2 J`` - Erase the entire display //| * ``ESC [ nnnn ; mmmm H`` - Move the cursor to mmmm, nnnn. diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 7d75d042b6638..1ba37d86db22e 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -47,6 +47,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con return len; } + #if CIRCUITPY_TERMINALIO_VT100 uint32_t _select_color(uint16_t ascii_color) { uint32_t color_value = 0; if ((ascii_color & 1) > 0) { @@ -63,6 +64,8 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } displayio_palette_t *terminal_palette = self->scroll_area->pixel_shader; + #endif + const byte *i = data; uint16_t start_y = self->cursor_y; while (i < data + len) { @@ -113,7 +116,6 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con // Handle commands of the form [ESC]. where . is not yet known. uint16_t n = 0; uint8_t j = 1; - uint8_t j2 = 0; for (; j < 6; j++) { if ('0' <= i[j] && i[j] <= '9') { n = n * 10 + (i[j] - '0'); @@ -123,13 +125,34 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } if (i[0] == '[') { - if (i[1] == 'K') { - // Clear the rest of the line. - for (uint16_t k = self->cursor_x; k < self->scroll_area->width_in_tiles; k++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); + uint16_t m = -1; + if (c == ';') { + m = 0; + for (++j; j < 9; j++) { + if ('0' <= i[j] && i[j] <= '9') { + m = m * 10 + (i[j] - '0'); + } else { + c = i[j]; + break; + } + } + } + #if CIRCUITPY_TERMINALIO_VT100 + uint8_t m2 = -1; + if (c == ';') { + m2 = 0; + for (++j; j < 12; j++) { + if ('0' <= i[j] && i[j] <= '9') { + m2 = m2 * 10 + (i[j] - '0'); + } else { + c = i[j]; + break; + } } - i += 2; - } else if (i[1] == '?') { + } + #endif + if (c == '?') { + #if CIRCUITPY_TERMINALIO_VT100 if (i[2] == '2' && i[3] == '5') { // cursor visibility commands if (i[4] == 'h') { @@ -141,23 +164,61 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } i += 5; + #endif } else { - if (c == 'D') { + if (c == 'K') { + if (n == 0) { + // Clear the rest of the line. + for (uint16_t k = self->cursor_x; k < self->scroll_area->width_in_tiles; k++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); + } + #if CIRCUITPY_TERMINALIO_VT100 + } else if (n == 1) { + // Clear start to cursor + for (uint16_t k = 0; k < self->cursor_x; k++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); + } + } else if (n == 2) { + // Clear entire line + for (uint16_t k = 0; k < self->scroll_area->width_in_tiles; k++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); + } + #endif + } + } else if (c == 'D') { if (n > self->cursor_x) { self->cursor_x = 0; } else { self->cursor_x -= n; } - } - if (c == 'J') { + } else if (c == 'J') { if (n == 2) { common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, 0); self->cursor_x = self->cursor_y = start_y = 0; - n = 0; common_hal_displayio_tilegrid_set_all_tiles(self->scroll_area, 0); } - } - if (c == 'm') { + } else if (c == 'H') { + if (n > 0) { + n--; + } + if (m == -1) { + m = 0; + } + if (m > 0) { + m--; + } + if (n >= self->scroll_area->height_in_tiles) { + n = self->scroll_area->height_in_tiles - 1; + } + if (m >= self->scroll_area->width_in_tiles) { + m = self->scroll_area->width_in_tiles - 1; + } + n = (n + self->scroll_area->top_left_y) % self->scroll_area->height_in_tiles; + self->cursor_x = m; + self->cursor_y = n; + start_y = self->cursor_y; + #if CIRCUITPY_TERMINALIO_VT100 + } else if (c == 'm') { if ((n >= 40 && n <= 47) || (n >= 30 && n <= 37)) { common_hal_displayio_palette_set_color(terminal_palette, 1 - (n / 40), _select_color(n % 10)); } @@ -165,76 +226,25 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); } - } - if (c == 'H') { - self->cursor_x = self->cursor_y = start_y = 0; - } - if (c == ';') { - uint16_t m = 0; - uint8_t m2 = 0; - for (++j; j < 9; j++) { - if ('0' <= i[j] && i[j] <= '9') { - m = m * 10 + (i[j] - '0'); - } else { - c = i[j]; - break; - } + if ((m >= 40 && m <= 47) || (m >= 30 && m <= 37)) { + common_hal_displayio_palette_set_color(terminal_palette, 1 - (m / 40), _select_color(m % 10)); } - if (c == ';') { - for (++j2; j2 < 9; j2++) { - if ('0' <= i[j2] && i[j2] <= '9') { - m2 = m2 * 10 + (i[j2] - '0'); - } else { - c = i[j2]; - break; - } - } + if (m == 0) { + common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); + common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); } - if (c == 'H') { - if (n > 0) { - n--; - } - if (m > 0) { - m--; - } - if (n >= self->scroll_area->height_in_tiles) { - n = self->scroll_area->height_in_tiles - 1; - } - if (m >= self->scroll_area->width_in_tiles) { - m = self->scroll_area->width_in_tiles - 1; - } - n = (n + self->scroll_area->top_left_y) % self->scroll_area->height_in_tiles; - self->cursor_x = m; - self->cursor_y = n; - start_y = self->cursor_y; + if ((m2 >= 40 && m2 <= 47) || (m2 >= 30 && m2 <= 37)) { + common_hal_displayio_palette_set_color(terminal_palette, 1 - (m2 / 40), _select_color(m2 % 10)); } - if (c == 'm') { - if ((n >= 40 && n <= 47) || (n >= 30 && n <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (n / 40), _select_color(n % 10)); - } - if (n == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); - } - if ((m >= 40 && m <= 47) || (m >= 30 && m <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (m / 40), _select_color(m % 10)); - } - if (m == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); - } - if ((m2 >= 40 && m2 <= 47) || (m2 >= 30 && m2 <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (m2 / 40), _select_color(m2 % 10)); - } - if (m2 == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); - } + if (m2 == 0) { + common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); + common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); } + #endif } - i += j + j2 + 1; - continue; + i += j + 1; } + #if CIRCUITPY_TERMINALIO_VT100 } else if (i[0] == 'M') { if (self->cursor_y != self->scroll_area->top_left_y) { if (self->cursor_y > 0) { @@ -268,6 +278,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } start_y = self->cursor_y; i++; + #endif } else if (i[0] == ']' && c == ';') { self->in_osc_command = true; self->osc_command = n; From 3515a38f6aa8799cb3bb63d2dfffe4d21347df89 Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 12:02:28 -0500 Subject: [PATCH 3/8] Don't use new compile flag --- ports/atmel-samd/mpconfigport.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index c2961e4165f23..0f7ca375e33b8 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -59,7 +59,7 @@ CIRCUITPY_ZLIB = 0 # Turn off a few more things that don't fit in 192kB -CIRCUITPY_TERMINALIO_VT100 = 0 +CIRCUITPY_TERMINALIO_VT100 = 1 ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) CIRCUITPY_ONEWIREIO ?= 0 From 88133081335e17cbb2139265344bf1b78f56bedf Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 13:23:15 -0500 Subject: [PATCH 4/8] small (170 bytes) code size optimization --- shared-module/terminalio/Terminal.c | 115 +++++++++++----------------- 1 file changed, 43 insertions(+), 72 deletions(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 1ba37d86db22e..e8b581ac3a0bc 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -114,43 +114,30 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } else if (c == 0x1b) { // Handle commands of the form [ESC]. where . is not yet known. - uint16_t n = 0; + uint8_t vt_args[3] = {0,-1,-1}; + uint8_t n_args = 1; uint8_t j = 1; for (; j < 6; j++) { if ('0' <= i[j] && i[j] <= '9') { - n = n * 10 + (i[j] - '0'); + vt_args[0] = vt_args[0] * 10 + (i[j] - '0'); } else { c = i[j]; break; } } if (i[0] == '[') { - uint16_t m = -1; - if (c == ';') { - m = 0; + for (uint8_t i_args = 1; i_args < 3 && c == ';'; i_args++) { + vt_args[i_args] = 0; for (++j; j < 9; j++) { if ('0' <= i[j] && i[j] <= '9') { - m = m * 10 + (i[j] - '0'); + vt_args[i_args] = vt_args[i_args] * 10 + (i[j] - '0'); + n_args = i_args + 1; } else { c = i[j]; break; } } } - #if CIRCUITPY_TERMINALIO_VT100 - uint8_t m2 = -1; - if (c == ';') { - m2 = 0; - for (++j; j < 12; j++) { - if ('0' <= i[j] && i[j] <= '9') { - m2 = m2 * 10 + (i[j] - '0'); - } else { - c = i[j]; - break; - } - } - } - #endif if (c == '?') { #if CIRCUITPY_TERMINALIO_VT100 if (i[2] == '2' && i[3] == '5') { @@ -167,78 +154,62 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con #endif } else { if (c == 'K') { - if (n == 0) { - // Clear the rest of the line. - for (uint16_t k = self->cursor_x; k < self->scroll_area->width_in_tiles; k++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); - } + uint8_t clr_start = self->cursor_x; + uint8_t clr_end = self->scroll_area->width_in_tiles; #if CIRCUITPY_TERMINALIO_VT100 - } else if (n == 1) { - // Clear start to cursor - for (uint16_t k = 0; k < self->cursor_x; k++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); - } - } else if (n == 2) { - // Clear entire line - for (uint16_t k = 0; k < self->scroll_area->width_in_tiles; k++) { - common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); - } + if (vt_args[0] == 1) { + clr_start = 0; + clr_end = self->cursor_x; + } else if (vt_args[0] == 2) { + clr_start = 0; + } #endif + // Clear the (start/rest/all) of the line. + for (uint16_t k = clr_start; k < clr_end; k++) { + common_hal_displayio_tilegrid_set_tile(self->scroll_area, k, self->cursor_y, 0); } } else if (c == 'D') { - if (n > self->cursor_x) { + if (vt_args[0] > self->cursor_x) { self->cursor_x = 0; } else { - self->cursor_x -= n; + self->cursor_x -= vt_args[0]; } } else if (c == 'J') { - if (n == 2) { + if (vt_args[0] == 2) { common_hal_displayio_tilegrid_set_top_left(self->scroll_area, 0, 0); self->cursor_x = self->cursor_y = start_y = 0; common_hal_displayio_tilegrid_set_all_tiles(self->scroll_area, 0); } } else if (c == 'H') { - if (n > 0) { - n--; + if (vt_args[0] > 0) { + vt_args[0]--; } - if (m == -1) { - m = 0; + if (vt_args[1] == -1) { + vt_args[1] = 0; } - if (m > 0) { - m--; + if (vt_args[1] > 0) { + vt_args[1]--; } - if (n >= self->scroll_area->height_in_tiles) { - n = self->scroll_area->height_in_tiles - 1; + if (vt_args[0] >= self->scroll_area->height_in_tiles) { + vt_args[0] = self->scroll_area->height_in_tiles - 1; } - if (m >= self->scroll_area->width_in_tiles) { - m = self->scroll_area->width_in_tiles - 1; + if (vt_args[1] >= self->scroll_area->width_in_tiles) { + vt_args[1] = self->scroll_area->width_in_tiles - 1; } - n = (n + self->scroll_area->top_left_y) % self->scroll_area->height_in_tiles; - self->cursor_x = m; - self->cursor_y = n; + vt_args[0] = (vt_args[0] + self->scroll_area->top_left_y) % self->scroll_area->height_in_tiles; + self->cursor_x = vt_args[1]; + self->cursor_y = vt_args[0]; start_y = self->cursor_y; #if CIRCUITPY_TERMINALIO_VT100 } else if (c == 'm') { - if ((n >= 40 && n <= 47) || (n >= 30 && n <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (n / 40), _select_color(n % 10)); - } - if (n == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); - } - if ((m >= 40 && m <= 47) || (m >= 30 && m <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (m / 40), _select_color(m % 10)); - } - if (m == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); - } - if ((m2 >= 40 && m2 <= 47) || (m2 >= 30 && m2 <= 37)) { - common_hal_displayio_palette_set_color(terminal_palette, 1 - (m2 / 40), _select_color(m2 % 10)); - } - if (m2 == 0) { - common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); - common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); + for (uint8_t i_args = 0; i_args < n_args; i_args++) { + if ((vt_args[i_args] >= 40 && vt_args[i_args] <= 47) || (vt_args[i_args] >= 30 && vt_args[i_args] <= 37)) { + common_hal_displayio_palette_set_color(terminal_palette, 1 - (vt_args[i_args] / 40), _select_color(vt_args[i_args] % 10)); + } + if (vt_args[i_args] == 0) { + common_hal_displayio_palette_set_color(terminal_palette, 0, 0x000000); + common_hal_displayio_palette_set_color(terminal_palette, 1, 0xffffff); + } } #endif } @@ -281,7 +252,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con #endif } else if (i[0] == ']' && c == ';') { self->in_osc_command = true; - self->osc_command = n; + self->osc_command = vt_args[0]; i += j + 1; } } From 8f66fedfe7ca6cc59ab52dc4344eb75b6b466d52 Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 13:27:21 -0500 Subject: [PATCH 5/8] forgot local pre-commit :/ --- shared-module/terminalio/Terminal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index e8b581ac3a0bc..36cafdb48fd17 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -114,7 +114,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } } else if (c == 0x1b) { // Handle commands of the form [ESC]. where . is not yet known. - uint8_t vt_args[3] = {0,-1,-1}; + uint8_t vt_args[3] = {0, -1, -1}; uint8_t n_args = 1; uint8_t j = 1; for (; j < 6; j++) { From bfa39b011526900e347a758b4ef7ebc2ae4629ba Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 13:32:49 -0500 Subject: [PATCH 6/8] Disable new VT100 features on samd21 boards --- ports/atmel-samd/mpconfigport.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/atmel-samd/mpconfigport.mk b/ports/atmel-samd/mpconfigport.mk index 0f7ca375e33b8..c2961e4165f23 100644 --- a/ports/atmel-samd/mpconfigport.mk +++ b/ports/atmel-samd/mpconfigport.mk @@ -59,7 +59,7 @@ CIRCUITPY_ZLIB = 0 # Turn off a few more things that don't fit in 192kB -CIRCUITPY_TERMINALIO_VT100 = 1 +CIRCUITPY_TERMINALIO_VT100 = 0 ifeq ($(INTERNAL_FLASH_FILESYSTEM),1) CIRCUITPY_ONEWIREIO ?= 0 From 9820c854d5ccbaabfb3a55e14f1a9f6c544efc7e Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 13:41:19 -0500 Subject: [PATCH 7/8] increase possible length of portion of sequence --- shared-module/terminalio/Terminal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 36cafdb48fd17..1c2efcbcf2aaa 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -128,7 +128,7 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con if (i[0] == '[') { for (uint8_t i_args = 1; i_args < 3 && c == ';'; i_args++) { vt_args[i_args] = 0; - for (++j; j < 9; j++) { + for (++j; j < 12; j++) { if ('0' <= i[j] && i[j] <= '9') { vt_args[i_args] = vt_args[i_args] * 10 + (i[j] - '0'); n_args = i_args + 1; From 7cbe3b550a21772b7ea4d9b984216918f2054d7b Mon Sep 17 00:00:00 2001 From: RetiredWizard Date: Mon, 3 Mar 2025 14:36:53 -0500 Subject: [PATCH 8/8] Guard n_args variable with CIRCUITPY_TERMINALIO_VT100 flag --- shared-module/terminalio/Terminal.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 1c2efcbcf2aaa..d2cedf0661874 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -115,8 +115,10 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con } else if (c == 0x1b) { // Handle commands of the form [ESC]. where . is not yet known. uint8_t vt_args[3] = {0, -1, -1}; - uint8_t n_args = 1; uint8_t j = 1; + #if CIRCUITPY_TERMINALIO_VT100 + uint8_t n_args = 1; + #endif for (; j < 6; j++) { if ('0' <= i[j] && i[j] <= '9') { vt_args[0] = vt_args[0] * 10 + (i[j] - '0'); @@ -131,7 +133,9 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con for (++j; j < 12; j++) { if ('0' <= i[j] && i[j] <= '9') { vt_args[i_args] = vt_args[i_args] * 10 + (i[j] - '0'); + #if CIRCUITPY_TERMINALIO_VT100 n_args = i_args + 1; + #endif } else { c = i[j]; break;