An extremely basic VT100 terminal interface. This will generate the proper escape codes to do things such as moving the cursor and clearing the screen. It takes up practically no resources and is really just a nice short cut to avoid figuring out the escape codes yourself.

Dependents:   JOGO_CORRIDA Snake mbedbreakingout

A super simple way to implement crude terminal user interfaces over Stream/Serial using VT100 escape codes.

Simple example:

Serial pc(USBTX, USBRX); 
int main() {
    TermControl ctrl;
    ctrl.SetTerminal(&pc);
    ctrl.Reset();
    ctrl.Clear();
    ctrl.PrintAt(5,10,"FooBar!");
    int i=0;
    i=0;
    while(1) {
        i++;
        ctrl.SetCursor(5,11);
        pc.printf("%i",i);
        
    }
}

This simple program will continuously count, but instead of scrolling and such, it will print the counted numbers in one place. In this case, row 11, column 5.

I don't break out every escape code for the VT100, but I plan on adding more. Maybe even try to get some sort of support for the notion of "widgets" and such. Lightweight is my overall goal though.

Committer:
earlz
Date:
Tue Aug 28 04:29:33 2012 +0000
Revision:
0:e815b5adc7bc
Child:
1:2263ee1d7353
Initial implementation of super-duper trimmed down curses. All seems to work so far

Who changed what in which revision?

UserRevisionLine numberNew contents of line
earlz 0:e815b5adc7bc 1 #ifndef TERMCONTROL_H
earlz 0:e815b5adc7bc 2 #define TERMCONTROL_H
earlz 0:e815b5adc7bc 3 #include "mbed.h"
earlz 0:e815b5adc7bc 4 #include <string>
earlz 0:e815b5adc7bc 5 //0x1B is escape
earlz 0:e815b5adc7bc 6 #define FLASH_STRING const char * const
earlz 0:e815b5adc7bc 7 class TermControl
earlz 0:e815b5adc7bc 8 {
earlz 0:e815b5adc7bc 9 public:
earlz 0:e815b5adc7bc 10 TermControl()
earlz 0:e815b5adc7bc 11 {
earlz 0:e815b5adc7bc 12
earlz 0:e815b5adc7bc 13 }
earlz 0:e815b5adc7bc 14 TermControl(Stream* term)
earlz 0:e815b5adc7bc 15 {
earlz 0:e815b5adc7bc 16 Term=term;
earlz 0:e815b5adc7bc 17 }
earlz 0:e815b5adc7bc 18 const char Escape='\x1B';
earlz 0:e815b5adc7bc 19 FLASH_STRING ReportVT100="\x1B[?1;0c";
earlz 0:e815b5adc7bc 20 void SetTerminal(Stream* term)
earlz 0:e815b5adc7bc 21 {
earlz 0:e815b5adc7bc 22 Term=term;
earlz 0:e815b5adc7bc 23 }
earlz 0:e815b5adc7bc 24 Stream* GetTerminal()
earlz 0:e815b5adc7bc 25 {
earlz 0:e815b5adc7bc 26 return Term;
earlz 0:e815b5adc7bc 27 }
earlz 0:e815b5adc7bc 28 //terminal control
earlz 0:e815b5adc7bc 29 void Reset()
earlz 0:e815b5adc7bc 30 {
earlz 0:e815b5adc7bc 31 Print("\x1Bc");
earlz 0:e815b5adc7bc 32 }
earlz 0:e815b5adc7bc 33 void Clear()
earlz 0:e815b5adc7bc 34 {
earlz 0:e815b5adc7bc 35 Term->printf("\x1B[2J");
earlz 0:e815b5adc7bc 36 }
earlz 0:e815b5adc7bc 37 void PrintAt(int x, int y, string s)
earlz 0:e815b5adc7bc 38 {
earlz 0:e815b5adc7bc 39 SaveCursor();
earlz 0:e815b5adc7bc 40 ResetCursor();
earlz 0:e815b5adc7bc 41 SetCursor(x,y);
earlz 0:e815b5adc7bc 42 Print(s);
earlz 0:e815b5adc7bc 43 RestoreCursor();
earlz 0:e815b5adc7bc 44 }
earlz 0:e815b5adc7bc 45 //todo void PrintfAt(int x, int y, string f, ...);
earlz 0:e815b5adc7bc 46 /*string GetLine()
earlz 0:e815b5adc7bc 47 {
earlz 0:e815b5adc7bc 48 return new string(Term->gets());
earlz 0:e815b5adc7bc 49 }*/
earlz 0:e815b5adc7bc 50 char GetChar()
earlz 0:e815b5adc7bc 51 {
earlz 0:e815b5adc7bc 52 return Term->getc();
earlz 0:e815b5adc7bc 53 }
earlz 0:e815b5adc7bc 54 void SetCursor(int x, int y)
earlz 0:e815b5adc7bc 55 {
earlz 0:e815b5adc7bc 56 Term->printf("\x1B[%i;%iH",y,x);
earlz 0:e815b5adc7bc 57 }
earlz 0:e815b5adc7bc 58 void ResetCursor()
earlz 0:e815b5adc7bc 59 {
earlz 0:e815b5adc7bc 60 Term->printf("\x1B[H");
earlz 0:e815b5adc7bc 61 }
earlz 0:e815b5adc7bc 62 void SaveCursor()
earlz 0:e815b5adc7bc 63 {
earlz 0:e815b5adc7bc 64 Term->printf("\x1B[s");
earlz 0:e815b5adc7bc 65 }
earlz 0:e815b5adc7bc 66 void RestoreCursor()
earlz 0:e815b5adc7bc 67 {
earlz 0:e815b5adc7bc 68 Term->printf("\x1B[u");
earlz 0:e815b5adc7bc 69 }
earlz 0:e815b5adc7bc 70 void EnableScrolling(int begin, int end) //begin and end are row numbers
earlz 0:e815b5adc7bc 71 {
earlz 0:e815b5adc7bc 72 Term->printf("\x1B[%i;%ir",begin,end);
earlz 0:e815b5adc7bc 73 }
earlz 0:e815b5adc7bc 74 void ScrollDown()
earlz 0:e815b5adc7bc 75 {
earlz 0:e815b5adc7bc 76 Term->printf("\x1BD");
earlz 0:e815b5adc7bc 77 }
earlz 0:e815b5adc7bc 78 void ScrollUp()
earlz 0:e815b5adc7bc 79 {
earlz 0:e815b5adc7bc 80 Term->printf("\x1BM");
earlz 0:e815b5adc7bc 81 }
earlz 0:e815b5adc7bc 82 void EraseLine()
earlz 0:e815b5adc7bc 83 {
earlz 0:e815b5adc7bc 84 Term->printf("\x1B[2K");
earlz 0:e815b5adc7bc 85 }
earlz 0:e815b5adc7bc 86 void Print(string s)
earlz 0:e815b5adc7bc 87 {
earlz 0:e815b5adc7bc 88 Term->puts(s.c_str());
earlz 0:e815b5adc7bc 89 }
earlz 0:e815b5adc7bc 90
earlz 0:e815b5adc7bc 91
earlz 0:e815b5adc7bc 92 private:
earlz 0:e815b5adc7bc 93 Stream *Term;
earlz 0:e815b5adc7bc 94 };
earlz 0:e815b5adc7bc 95
earlz 0:e815b5adc7bc 96
earlz 0:e815b5adc7bc 97
earlz 0:e815b5adc7bc 98
earlz 0:e815b5adc7bc 99 #endif