151 lines
3.5 KiB
C++
151 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;
|
|
} |