a VT100 library found on the mbed site - w/o any licensing information or restrictions.
VT100.cpp@1:98f12a26a3da, 2020-04-30 (annotated)
- 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?
User | Revision | Line number | New 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 |