a VT100 library found on the mbed site - w/o any licensing information or restrictions.

Committer:
WiredHome
Date:
Thu Apr 30 13:21:08 2020 +0000
Revision:
1:98f12a26a3da
Parent:
0:8f2947c0686e
General clean up of the interface APIs (not backward compatible, but better).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WiredHome 0:8f2947c0686e 1 #include "mbed.h"
WiredHome 0:8f2947c0686e 2 #include "VT100.h"
WiredHome 0:8f2947c0686e 3
WiredHome 1:98f12a26a3da 4 static const char ESC = '\033' ;
WiredHome 0:8f2947c0686e 5
WiredHome 1:98f12a26a3da 6 vt100::vt100(Serial * _pc, const char * name) : Stream(name)
WiredHome 0:8f2947c0686e 7 {
WiredHome 1:98f12a26a3da 8 pc = _pc;
WiredHome 0:8f2947c0686e 9 }
WiredHome 0:8f2947c0686e 10
WiredHome 0:8f2947c0686e 11 vt100::~vt100()
WiredHome 0:8f2947c0686e 12 {
WiredHome 0:8f2947c0686e 13 }
WiredHome 0:8f2947c0686e 14
WiredHome 0:8f2947c0686e 15 void vt100::cls(void)
WiredHome 0:8f2947c0686e 16 {
WiredHome 1:98f12a26a3da 17 pc->printf("%c[2J", ESC) ;
WiredHome 0:8f2947c0686e 18 locate(1,1) ;
WiredHome 0:8f2947c0686e 19 }
WiredHome 0:8f2947c0686e 20
WiredHome 0:8f2947c0686e 21 void vt100::locate(int x, int y)
WiredHome 0:8f2947c0686e 22 {
WiredHome 1:98f12a26a3da 23 pc->printf("%c[%d;%dH",ESC,y,x) ;
WiredHome 0:8f2947c0686e 24 }
WiredHome 0:8f2947c0686e 25
WiredHome 0:8f2947c0686e 26 void vt100::putChar(int x, int y, char c)
WiredHome 0:8f2947c0686e 27 {
WiredHome 0:8f2947c0686e 28 locate(x,y) ;
WiredHome 1:98f12a26a3da 29 pc->printf("%c",c) ;
WiredHome 0:8f2947c0686e 30 }
WiredHome 0:8f2947c0686e 31
WiredHome 1:98f12a26a3da 32 void vt100::putStr(int x, int y, const char *str)
WiredHome 0:8f2947c0686e 33 {
WiredHome 0:8f2947c0686e 34 locate(x,y) ;
WiredHome 1:98f12a26a3da 35 pc->puts(str) ;
WiredHome 0:8f2947c0686e 36 }
WiredHome 0:8f2947c0686e 37
WiredHome 0:8f2947c0686e 38 void vt100::line(int x1, int y1, int x2, int y2, char c)
WiredHome 0:8f2947c0686e 39 {
WiredHome 0:8f2947c0686e 40 int x, y, dx, dy, w, h, step ;
WiredHome 0:8f2947c0686e 41 dx = x2 - x1 ;
WiredHome 0:8f2947c0686e 42 dy = y2 - y1 ;
WiredHome 0:8f2947c0686e 43 w = (dx >= 0)? dx : -dx ;
WiredHome 0:8f2947c0686e 44 h = (dy >= 0)? dy : -dy ;
WiredHome 0:8f2947c0686e 45
WiredHome 0:8f2947c0686e 46 if (dx == 0) { /* vertical line */
WiredHome 0:8f2947c0686e 47 step = (dy >= 0) ? 1 : -1 ;
WiredHome 0:8f2947c0686e 48 for (y = 0 ; y <= h ; y++) {
WiredHome 0:8f2947c0686e 49 putChar(x1, y1 + (step * y), c) ;
WiredHome 0:8f2947c0686e 50 }
WiredHome 0:8f2947c0686e 51 } else if (dy == 0) { /* Horizontal line */
WiredHome 0:8f2947c0686e 52 step = (dx >= 0) ? 1 : -1 ;
WiredHome 0:8f2947c0686e 53 for (x = 0 ; x <= w ; x++) {
WiredHome 0:8f2947c0686e 54 putChar(x1 + (step * x), y1, c) ;
WiredHome 0:8f2947c0686e 55 }
WiredHome 0:8f2947c0686e 56 } else {
WiredHome 0:8f2947c0686e 57 if (w >= h) { /* use x as step */
WiredHome 0:8f2947c0686e 58 step = (dx >= 0) ? 1 : -1 ;
WiredHome 0:8f2947c0686e 59 for (x = 0 ; x <= w ; x++ ) {
WiredHome 0:8f2947c0686e 60 putChar( x1 + step*x, y1 + ((2*x+1) * dy)/(2 * w), c) ;
WiredHome 0:8f2947c0686e 61 }
WiredHome 0:8f2947c0686e 62 } else { /* use y as step */
WiredHome 0:8f2947c0686e 63 step = (dy >= 0) ? 1 : -1 ;
WiredHome 0:8f2947c0686e 64 for (y = 0 ; y <= h ; y++ ) {
WiredHome 0:8f2947c0686e 65 putChar( x1 + ((2*y+1) * dx)/(2*h), y1 + step*y, c) ;
WiredHome 0:8f2947c0686e 66 }
WiredHome 0:8f2947c0686e 67 }
WiredHome 0:8f2947c0686e 68 }
WiredHome 0:8f2947c0686e 69 }
WiredHome 1:98f12a26a3da 70
WiredHome 1:98f12a26a3da 71 int vt100::_putc(int value) {
WiredHome 1:98f12a26a3da 72 return pc->putc(value);
WiredHome 1:98f12a26a3da 73 }
WiredHome 1:98f12a26a3da 74
WiredHome 1:98f12a26a3da 75 int vt100::_getc() {
WiredHome 1:98f12a26a3da 76 return pc->getc();
WiredHome 1:98f12a26a3da 77 }
WiredHome 1:98f12a26a3da 78
WiredHome 1:98f12a26a3da 79 int vt100::readable() {
WiredHome 1:98f12a26a3da 80 return pc->readable();
WiredHome 1:98f12a26a3da 81 }
WiredHome 1:98f12a26a3da 82
WiredHome 1:98f12a26a3da 83
WiredHome 0:8f2947c0686e 84 /****************************************************
WiredHome 0:8f2947c0686e 85 * frame(x1, y1, x2, y2)
WiredHome 0:8f2947c0686e 86 * draw textual frame
WiredHome 0:8f2947c0686e 87 * (x1,y1) (x2,y1)
WiredHome 0:8f2947c0686e 88 * +--------------------------+
WiredHome 0:8f2947c0686e 89 * | |
WiredHome 0:8f2947c0686e 90 * +--------------------------+
WiredHome 0:8f2947c0686e 91 * (x1,y2) (x2,y2)
WiredHome 0:8f2947c0686e 92 */
WiredHome 0:8f2947c0686e 93 void vt100::frame(int x1, int y1, int x2, int y2)
WiredHome 0:8f2947c0686e 94 {
WiredHome 0:8f2947c0686e 95 int tmp ;
WiredHome 0:8f2947c0686e 96 if (x1 > x2) {
WiredHome 0:8f2947c0686e 97 tmp = x1 ;
WiredHome 0:8f2947c0686e 98 x1 = x2 ;
WiredHome 0:8f2947c0686e 99 x2 = tmp ;
WiredHome 0:8f2947c0686e 100 }
WiredHome 0:8f2947c0686e 101 if (y1 > y2) {
WiredHome 0:8f2947c0686e 102 tmp = y1 ;
WiredHome 0:8f2947c0686e 103 y1 = y2 ;
WiredHome 0:8f2947c0686e 104 y2 = tmp ;
WiredHome 0:8f2947c0686e 105 }
WiredHome 0:8f2947c0686e 106 putChar(x1, y1, '+') ;
WiredHome 0:8f2947c0686e 107 line(x1+1,y1,x2-1,y1, '-') ;
WiredHome 0:8f2947c0686e 108 putChar(x2, y1, '+') ;
WiredHome 0:8f2947c0686e 109 line(x2,y1+1,x2,y2-1, '|') ;
WiredHome 0:8f2947c0686e 110 putChar(x2, y2, '+') ;
WiredHome 0:8f2947c0686e 111 line(x2-1,y2,x1+1,y2, '-') ;
WiredHome 0:8f2947c0686e 112 putChar(x1, y2, '+') ;
WiredHome 0:8f2947c0686e 113 line(x1,y2-1,x1,y1+1, '|') ;
WiredHome 0:8f2947c0686e 114 }
WiredHome 0:8f2947c0686e 115
WiredHome 0:8f2947c0686e 116 /***************************************************
WiredHome 0:8f2947c0686e 117 * circle(x, y, r, c)
WiredHome 0:8f2947c0686e 118 * Based on Jack Elton Bresenham's
WiredHome 0:8f2947c0686e 119 * Midpoint circle algorithm.
WiredHome 0:8f2947c0686e 120 * http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
WiredHome 0:8f2947c0686e 121 */
WiredHome 0:8f2947c0686e 122 void vt100::circle(int x0, int y0, int r, char c)
WiredHome 0:8f2947c0686e 123 {
WiredHome 0:8f2947c0686e 124 int f = 1 - r ;
WiredHome 0:8f2947c0686e 125 int dFx = 1 ;
WiredHome 0:8f2947c0686e 126 int dFy = -2 * r ;
WiredHome 0:8f2947c0686e 127 int x = 0 ;
WiredHome 0:8f2947c0686e 128 int y = r ;
WiredHome 0:8f2947c0686e 129
WiredHome 0:8f2947c0686e 130 putChar(x0, y0 + r, c) ;
WiredHome 0:8f2947c0686e 131 putChar(x0, y0 - r, c) ;
WiredHome 0:8f2947c0686e 132 putChar(x0 + 2*r, y0, c) ;
WiredHome 0:8f2947c0686e 133 putChar(x0 - 2*r, y0, c) ;
WiredHome 0:8f2947c0686e 134
WiredHome 0:8f2947c0686e 135 while(x < y) {
WiredHome 0:8f2947c0686e 136 if (f >= 0) {
WiredHome 0:8f2947c0686e 137 y-- ;
WiredHome 0:8f2947c0686e 138 dFy += 2 ;
WiredHome 0:8f2947c0686e 139 f += dFy ;
WiredHome 0:8f2947c0686e 140 }
WiredHome 0:8f2947c0686e 141 x++ ;
WiredHome 0:8f2947c0686e 142 dFx += 2 ;
WiredHome 0:8f2947c0686e 143 f += dFx ;
WiredHome 0:8f2947c0686e 144 putChar(x0 + 2*x, y0 + y, c) ;
WiredHome 0:8f2947c0686e 145 putChar(x0 - 2*x, y0 + y, c) ;
WiredHome 0:8f2947c0686e 146 putChar(x0 + 2*x, y0 - y, c) ;
WiredHome 0:8f2947c0686e 147 putChar(x0 - 2*x, y0 - y, c) ;
WiredHome 0:8f2947c0686e 148 putChar(x0 + 2*y, y0 + x, c) ;
WiredHome 0:8f2947c0686e 149 putChar(x0 - 2*y, y0 + x, c) ;
WiredHome 0:8f2947c0686e 150 putChar(x0 + 2*y, y0 - x, c) ;
WiredHome 0:8f2947c0686e 151 putChar(x0 - 2*y, y0 - x, c) ;
WiredHome 0:8f2947c0686e 152 }
WiredHome 0:8f2947c0686e 153 }
WiredHome 0:8f2947c0686e 154
WiredHome 1:98f12a26a3da 155 vt100::VT_COLOR vt100::setFG(VT_COLOR newFG)
WiredHome 0:8f2947c0686e 156 {
WiredHome 1:98f12a26a3da 157 VT_COLOR oldFG = foreground;
WiredHome 1:98f12a26a3da 158 pc->printf("\033[3%dm", newFG) ;
WiredHome 0:8f2947c0686e 159 foreground = newFG ;
WiredHome 0:8f2947c0686e 160 return( oldFG ) ;
WiredHome 0:8f2947c0686e 161 }
WiredHome 0:8f2947c0686e 162
WiredHome 1:98f12a26a3da 163 vt100::VT_COLOR vt100::getFG()
WiredHome 0:8f2947c0686e 164 {
WiredHome 0:8f2947c0686e 165 return( foreground ) ;
WiredHome 0:8f2947c0686e 166 }
WiredHome 0:8f2947c0686e 167
WiredHome 1:98f12a26a3da 168 vt100::VT_COLOR vt100::setBG(VT_COLOR newBG)
WiredHome 0:8f2947c0686e 169 {
WiredHome 1:98f12a26a3da 170 VT_COLOR oldBG = background ;
WiredHome 1:98f12a26a3da 171 pc->printf("\033[4%dm", newBG) ;
WiredHome 0:8f2947c0686e 172 return( oldBG ) ;
WiredHome 0:8f2947c0686e 173 }
WiredHome 0:8f2947c0686e 174
WiredHome 1:98f12a26a3da 175 vt100::VT_COLOR vt100::getBG()
WiredHome 0:8f2947c0686e 176 {
WiredHome 0:8f2947c0686e 177 return( background ) ;
WiredHome 0:8f2947c0686e 178 }
WiredHome 1:98f12a26a3da 179