My implementation of VT100 ESC-sequence utility
Dependents: test_vt100 maze_vt100_MMA8451Q funcgen test_MAG3110 ... more
Diff: vt100.cpp
- Revision:
- 0:94253645a02a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vt100.cpp Mon Dec 01 12:48:02 2014 +0000 @@ -0,0 +1,216 @@ +#include "serial_api.h" +#include "vt100.h" +#include "mbed.h" + +#define BLACK 0 +#define RED 1 +#define GREEN 2 +#define YELLOW 3 +#define BLUE 4 +#define PURPLE 5 +#define CIAN 6 +#define WHITE 7 + +char ESC = '\033' ; + +vt100::vt100(int baud) +{ + extern serial_t stdio_uart ; + serial_baud(&stdio_uart, baud) ; +} + +vt100::~vt100() +{ +} + +void vt100::cls(void) +{ + printf("%c[2J", ESC) ; + locate(1,1) ; +} + +void vt100::locate(int x, int y) +{ + printf("%c[%d;%dH",ESC,y,x) ; +} + +void vt100::putChar(int x, int y, char c) +{ + locate(x,y) ; + printf("%c",c) ; +} + +void vt100::putStr(int x, int y, char *str) +{ + locate(x,y) ; + printf("%s", str) ; +} + +void vt100::line(int x1, int y1, int x2, int y2, char c) +{ + int x, y, dx, dy, w, h, step ; + dx = x2 - x1 ; + dy = y2 - y1 ; + w = (dx >= 0)? dx : -dx ; + h = (dy >= 0)? dy : -dy ; + + if (dx == 0) { /* vertical line */ + step = (dy >= 0) ? 1 : -1 ; + for (y = 0 ; y <= h ; y++) { + putChar(x1, y1 + (step * y), c) ; + } + } else if (dy == 0) { /* Horizontal line */ + step = (dx >= 0) ? 1 : -1 ; + for (x = 0 ; x <= w ; x++) { + putChar(x1 + (step * x), y1, c) ; + } + } else { + if (w >= h) { /* use x as step */ + step = (dx >= 0) ? 1 : -1 ; + for (x = 0 ; x <= w ; x++ ) { + putChar( x1 + step*x, y1 + ((2*x+1) * dy)/(2 * w), c) ; + } + } else { /* use y as step */ + step = (dy >= 0) ? 1 : -1 ; + for (y = 0 ; y <= h ; y++ ) { + putChar( x1 + ((2*y+1) * dx)/(2*h), y1 + step*y, c) ; + } + } + } +} + +/**************************************************** + * frame(x1, y1, x2, y2) + * draw textual frame + * (x1,y1) (x2,y1) + * +--------------------------+ + * | | + * +--------------------------+ + * (x1,y2) (x2,y2) + */ +void vt100::frame(int x1, int y1, int x2, int y2) +{ + int tmp ; + if (x1 > x2) { + tmp = x1 ; + x1 = x2 ; + x2 = tmp ; + } + if (y1 > y2) { + tmp = y1 ; + y1 = y2 ; + y2 = tmp ; + } + putChar(x1, y1, '+') ; + line(x1+1,y1,x2-1,y1, '-') ; + putChar(x2, y1, '+') ; + line(x2,y1+1,x2,y2-1, '|') ; + putChar(x2, y2, '+') ; + line(x2-1,y2,x1+1,y2, '-') ; + putChar(x1, y2, '+') ; + line(x1,y2-1,x1,y1+1, '|') ; +} + +/*************************************************** + * circle(x, y, r, c) + * Based on Jack Elton Bresenham's + * Midpoint circle algorithm. + * http://en.wikipedia.org/wiki/Midpoint_circle_algorithm + */ +void vt100::circle(int x0, int y0, int r, char c) +{ + int f = 1 - r ; + int dFx = 1 ; + int dFy = -2 * r ; + int x = 0 ; + int y = r ; + + putChar(x0, y0 + r, c) ; + putChar(x0, y0 - r, c) ; + putChar(x0 + 2*r, y0, c) ; + putChar(x0 - 2*r, y0, c) ; + + while(x < y) { + if (f >= 0) { + y-- ; + dFy += 2 ; + f += dFy ; + } + x++ ; + dFx += 2 ; + f += dFx ; + putChar(x0 + 2*x, y0 + y, c) ; + putChar(x0 - 2*x, y0 + y, c) ; + putChar(x0 + 2*x, y0 - y, c) ; + putChar(x0 - 2*x, y0 - y, c) ; + putChar(x0 + 2*y, y0 + x, c) ; + putChar(x0 - 2*y, y0 + x, c) ; + putChar(x0 + 2*y, y0 - x, c) ; + putChar(x0 - 2*y, y0 - x, c) ; + } +} + +int vt100::setFG(int newFG) +{ + int oldFG = foreground ; + printf("\033[3%dm", newFG) ; + foreground = newFG ; + return( oldFG ) ; +} + +int vt100::getFG() +{ + return( foreground ) ; +} + +int vt100::setBG(int newBG) +{ + int oldBG = background ; + printf("\033[4%dm", newBG) ; + return( oldBG ) ; +} + +int vt100::getBG() +{ + return( background ) ; +} + +void vt100::black() +{ + setFG( BLACK ) ; +} + +void vt100::red() +{ + setFG( RED ) ; +} + +void vt100::green() +{ + setFG( GREEN ) ; +} + +void vt100::yellow() +{ + setFG( YELLOW ) ; +} + +void vt100::blue() +{ + setFG( BLUE ) ; +} + +void vt100::purple() +{ + setFG( PURPLE ) ; +} + +void vt100::cian() +{ + setFG( CIAN ) ; +} + +void vt100::white() +{ + setFG( WHITE ) ; +} \ No newline at end of file