You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bsb1/device/serialstream.cc

89 lines
1.8 KiB
C++

#include "serialstream.h"
#include "../utils/string.h"
SerialStream::SerialStream(ComPort port, BaudRate baud_rate, DataBits data_bits,
StopBits stop_bits, Parity parity)
:Serial(port, baud_rate, data_bits, stop_bits, parity) {}
void SerialStream::flush() {}
// https://stackoverflow.com/questions/3440726/what-is-the-proper-way-of-implementing-a-good-itoa-function
// Yet, another good itoa implementation
// returns: the length of the number string
int itoa(int value, char *sp, int radix)
{
char tmp[16];// be careful with the length of the buffer
char *tp = tmp;
int i;
unsigned v;
int sign = (radix == 10 && value < 0);
if (sign)
v = -value;
else
v = (unsigned)value;
while (v || tp == tmp)
{
i = v % radix;
v /= radix;
if (i < 10)
*tp++ = i+'0';
else
*tp++ = i + 'a' - 10;
}
int len = tp - tmp;
if (sign)
{
*sp++ = '-';
len++;
}
while (tp > tmp)
*sp++ = *--tp;
return len;
}
void SerialStream::setForeground(Color c) {
write(0x1b);
write('[');
write('3');
write(c + 0x30);
write('m');
}
void SerialStream::setBackground(Color c) {
write(0x1b);
write('[');
write('4');
write(c + 0x30);
write('m');
}
void SerialStream::setAttribute(Attrib a) {
write(0x1b);
write('[');
write(a + 0x30);
write('m');
}
void SerialStream::reset() {
write(0x1b);
write('c');
}
void SerialStream::setPos(int x, int y) {
char out[] = {0x1b, '[', 0, 0, ';', 0, 0, 'H', 0};
itoa(x, &out[2], 10);
itoa(y, &out[5], 10);
print(out, strlen(out));
}
void SerialStream::print(char* str, int length) {
for(int i=0; i < length; i++)
write(str[i]);
}