summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTsutomu IKEGAMI <t-ikegami@aist.go.jp>2021-04-01 17:33:57 +0900
committerTsutomu IKEGAMI <t-ikegami@aist.go.jp>2021-04-01 17:33:57 +0900
commit7810cb275c60ea73f496096ad462ad507ed3df2a (patch)
tree24a1f57a12570fa60f607058c8521e0420b56214
parentd0ba75e6dc7e88bf9242ec433a38aba8c085482e (diff)
Add two escape sequences to terminalio.Termial:
- ESC[yy;xxH : move cursor to (xx, yy) - ESC[2J : clear screen
-rw-r--r--shared-module/terminalio/Terminal.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c
index 4589c9149..eb8b27208 100644
--- a/shared-module/terminalio/Terminal.c
+++ b/shared-module/terminalio/Terminal.c
@@ -93,6 +93,39 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con
self->cursor_x -= n;
}
}
+ if (c == 'J') {
+ if (n == 2) {
+ common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, 0);
+ self->cursor_x = self->cursor_y = start_y = 0;
+ n = 0;
+ for (uint16_t x = 0; x < self->tilegrid->width_in_tiles; x++) {
+ for (uint16_t y = 0; y < self->tilegrid->height_in_tiles; y++) {
+ common_hal_displayio_tilegrid_set_tile(self->tilegrid, x, y, 0);
+ }
+ }
+ }
+ }
+ if (c == ';') {
+ int16_t 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 (c == 'H') {
+ if (n >= self->tilegrid->height_in_tiles)
+ n = self->tilegrid->height_in_tiles - 1;
+ if (m >= self->tilegrid->width_in_tiles)
+ m = self->tilegrid->width_in_tiles - 1;
+ n = (n + self->tilegrid->top_left_y) % self->tilegrid->height_in_tiles;
+ self->cursor_x = m;
+ self->cursor_y = n;
+ start_y = self->cursor_y;
+ }
+ }
i += j + 1;
continue;
}
@@ -114,12 +147,14 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con
self->cursor_y %= self->tilegrid->height_in_tiles;
}
if (self->cursor_y != start_y) {
- // clear the new row
+ // clear the new row in case of scroll up
+ if (self->cursor_y == self->tilegrid->top_left_y) {
for (uint16_t j = 0; j < self->tilegrid->width_in_tiles; j++) {
common_hal_displayio_tilegrid_set_tile(self->tilegrid, j, self->cursor_y, 0);
- start_y = self->cursor_y;
}
- common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, (start_y + self->tilegrid->height_in_tiles + 1) % self->tilegrid->height_in_tiles);
+ common_hal_displayio_tilegrid_set_top_left(self->tilegrid, 0, (self->cursor_y + self->tilegrid->height_in_tiles + 1) % self->tilegrid->height_in_tiles);
+ }
+ start_y = self->cursor_y;
}
}
return i - data;