138 lines
3.1 KiB
C++
138 lines
3.1 KiB
C++
|
/*
|
||
|
* BasicTerm.cpp
|
||
|
* Provides basic ANSI/VT220 terminal control over a serial interface
|
||
|
* Copyright 2011 Trannie Carter <borys@nottwo.org>
|
||
|
* Licensed for use under the terms of the GNU Lesser General Public License v3
|
||
|
*/
|
||
|
|
||
|
#include "BasicTerm.h"
|
||
|
|
||
|
BasicTerm::BasicTerm(Stream *ser) {
|
||
|
serial = ser;
|
||
|
}
|
||
|
|
||
|
int BasicTerm::available(void) {
|
||
|
return serial->available();
|
||
|
}
|
||
|
|
||
|
int BasicTerm::peek(void) {
|
||
|
return serial->peek();
|
||
|
}
|
||
|
|
||
|
int BasicTerm::read(void) {
|
||
|
return serial->read();
|
||
|
}
|
||
|
|
||
|
void BasicTerm::flush(void) {
|
||
|
serial->flush();
|
||
|
}
|
||
|
|
||
|
size_t BasicTerm::write(uint8_t c) {
|
||
|
return serial->write(c);
|
||
|
}
|
||
|
|
||
|
void BasicTerm::init(void) {
|
||
|
serial->print(F("\x1b\x63"));
|
||
|
}
|
||
|
|
||
|
void BasicTerm::cls(void) {
|
||
|
serial->print(F("\x1b[2J"));
|
||
|
}
|
||
|
|
||
|
void BasicTerm::position(uint8_t row, uint8_t col) {
|
||
|
serial->print(F("\x1b["));
|
||
|
serial->print((uint8_t)row + 1);
|
||
|
serial->print(F(";"));
|
||
|
serial->print((uint8_t)col + 1);
|
||
|
serial->print(F("H"));
|
||
|
}
|
||
|
|
||
|
void BasicTerm::show_cursor(boolean show) {
|
||
|
if(show) {
|
||
|
serial->print(F("\x1b[?25h"));
|
||
|
} else {
|
||
|
serial->print(F("\x1b[?25l"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int16_t BasicTerm::get_key(void) {
|
||
|
int16_t key;
|
||
|
uint16_t when;
|
||
|
|
||
|
key = serial->read();
|
||
|
|
||
|
if(key == 0x1b) { /* escape sequence */
|
||
|
when = millis();
|
||
|
while(serial->available() < 2) {
|
||
|
if(((uint16_t) millis() - when) > 1000) {
|
||
|
return key;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
key = serial->read();
|
||
|
|
||
|
switch(key) {
|
||
|
case '[':
|
||
|
key = serial->read();
|
||
|
switch(key) {
|
||
|
case 'A':
|
||
|
return BT_KEY_UP;
|
||
|
case 'B':
|
||
|
return BT_KEY_DOWN;
|
||
|
case 'C':
|
||
|
return BT_KEY_RIGHT;
|
||
|
case 'D':
|
||
|
return BT_KEY_LEFT;
|
||
|
default:
|
||
|
return key;
|
||
|
}
|
||
|
break;
|
||
|
case 'O':
|
||
|
key = serial->read();
|
||
|
switch(key) {
|
||
|
case 'P':
|
||
|
return BT_KEY_F(1);
|
||
|
case 'Q':
|
||
|
return BT_KEY_F(2);
|
||
|
case 'R':
|
||
|
return BT_KEY_F(3);
|
||
|
case 'S':
|
||
|
return BT_KEY_F(4);
|
||
|
default:
|
||
|
return key;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
return key;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return key;
|
||
|
}
|
||
|
|
||
|
void BasicTerm::set_attribute(uint8_t attr) {
|
||
|
if(attr & BT_REVERSE) {
|
||
|
serial->print(F("\x1b[7m"));
|
||
|
}
|
||
|
if(attr & BT_UNDERLINE) {
|
||
|
serial->print(F("\x1b[4m"));
|
||
|
}
|
||
|
if(attr & BT_BOLD) {
|
||
|
serial->print(F("\x1b[1m"));
|
||
|
}
|
||
|
if(attr & BT_BLINK) {
|
||
|
serial->print(F("\x1b[5m"));
|
||
|
}
|
||
|
if(attr == BT_NORMAL) {
|
||
|
serial->print(F("\x1b[0m"));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void BasicTerm::set_color(uint8_t fg, uint8_t bg) {
|
||
|
serial->print(F("\x1b["));
|
||
|
serial->print(30 + fg);
|
||
|
serial->print(";");
|
||
|
serial->print(40 + bg);
|
||
|
serial->print("m");
|
||
|
}
|