You've already forked M5StickC-Plus
mirror of
https://github.com/m5stack/M5StickC-Plus.git
synced 2026-05-20 10:27:51 -07:00
121 lines
3.5 KiB
C++
121 lines
3.5 KiB
C++
#include "TFTTerminal.h"
|
|
|
|
TFTTerminal::TFTTerminal(TFT_eSprite *dis_buff_ptr) {
|
|
_dis_buff_ptr = dis_buff_ptr;
|
|
memset(discharbuff, 0, 55 * 60);
|
|
}
|
|
|
|
TFTTerminal::~TFTTerminal() {
|
|
}
|
|
|
|
void TFTTerminal::setcolor(uint16_t color, uint16_t bk_color) {
|
|
_color = color;
|
|
_bkcolor = bk_color;
|
|
}
|
|
|
|
void TFTTerminal::setGeometry(uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
|
|
_win_x_pos = x;
|
|
_win_y_pos = y;
|
|
_win_w = w;
|
|
_win_h = h;
|
|
|
|
_line_x_limit = _win_w / _font_x_size;
|
|
_line_y_limit = _win_h / _font_y_size;
|
|
}
|
|
|
|
size_t TFTTerminal::write(uint8_t chardata) {
|
|
bool flush_page_flag = false;
|
|
uint8_t dis_y_pos = 0;
|
|
|
|
if ((chardata == '\r') || (chardata == '\n')) {
|
|
xpos = 0;
|
|
ypos++;
|
|
ypos = ypos % 60;
|
|
memset(discharbuff[ypos % 60], 0, 55);
|
|
return 1;
|
|
} else if (xpos >= _line_x_limit) {
|
|
xpos = 0;
|
|
ypos++;
|
|
ypos = ypos % 60;
|
|
memset(discharbuff[ypos % 60], 0, 55);
|
|
}
|
|
|
|
discharbuff[ypos][xpos] = chardata;
|
|
xpos++;
|
|
|
|
if ((dispos <= ypos) && ((ypos - dispos) > _line_y_limit)) {
|
|
dispos = ypos - _line_y_limit;
|
|
flush_page_flag = true;
|
|
} else if ((dispos <= ypos) && ((ypos - dispos) <= _line_y_limit)) {
|
|
dis_y_pos = ypos - dispos;
|
|
flush_page_flag = false;
|
|
} else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
|
|
dispos = 60 - (_line_y_limit - ypos);
|
|
flush_page_flag = true;
|
|
} else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
|
|
dis_y_pos = 60 - (dispos - ypos);
|
|
flush_page_flag = false;
|
|
}
|
|
|
|
dispos = dispos % 60;
|
|
|
|
_dis_buff_ptr->setTextColor(_color);
|
|
_dis_buff_ptr->setTextSize(0);
|
|
|
|
if (flush_page_flag) {
|
|
_dis_buff_ptr->fillSprite(_bkcolor);
|
|
|
|
for (size_t i = 0; i < _line_y_limit; i++) {
|
|
_dis_buff_ptr->drawString((char *)discharbuff[(dispos + i) % 60], 0,
|
|
i * 8);
|
|
}
|
|
} else {
|
|
_dis_buff_ptr->drawChar(chardata, (xpos - 1) * _font_x_size,
|
|
dis_y_pos * _font_y_size);
|
|
}
|
|
_dis_buff_ptr->pushSprite(_win_x_pos, _win_y_pos);
|
|
|
|
return 1;
|
|
}
|
|
|
|
size_t TFTTerminal::write(const uint8_t *buffer, size_t size) {
|
|
while ((size != 0) && (*buffer != '\0')) {
|
|
if ((*buffer == '\r') || (*buffer == '\n')) {
|
|
xpos = 0;
|
|
ypos++;
|
|
ypos = ypos % 60;
|
|
memset(discharbuff[ypos % 60], 0, 55);
|
|
buffer++;
|
|
size--;
|
|
continue;
|
|
} else if (xpos >= _line_x_limit) {
|
|
xpos = 0;
|
|
ypos++;
|
|
ypos = ypos % 60;
|
|
memset(discharbuff[ypos % 60], 0, 55);
|
|
}
|
|
discharbuff[ypos][xpos] = *buffer;
|
|
xpos++;
|
|
buffer++;
|
|
size--;
|
|
}
|
|
|
|
if ((dispos <= ypos) && ((ypos - dispos) > _line_y_limit)) {
|
|
dispos = ypos - _line_y_limit;
|
|
} else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
|
|
dispos = 60 - (_line_y_limit - ypos);
|
|
}
|
|
|
|
dispos = dispos % 60;
|
|
|
|
_dis_buff_ptr->setTextColor(_color);
|
|
_dis_buff_ptr->setTextSize(0);
|
|
_dis_buff_ptr->fillSprite(_bkcolor);
|
|
//_dis_buff_ptr->fillRect(_win_x_pos, _win_y_pos, _win_w, _win_h, _bkcolor);
|
|
for (size_t i = 0; i < _line_y_limit; i++) {
|
|
_dis_buff_ptr->drawString((char *)discharbuff[(dispos + i) % 60], 0,
|
|
i * 8);
|
|
}
|
|
_dis_buff_ptr->pushSprite(_win_x_pos, _win_y_pos);
|
|
return 1;
|
|
} |