1+ #include " TFTTerminal.h"
2+
3+ TFTTerminal::TFTTerminal (TFT_eSprite *dis_buff_ptr) {
4+ _dis_buff_ptr = dis_buff_ptr;
5+ memset (discharbuff, 0 , 55 * 60 );
6+ }
7+
8+ TFTTerminal::~TFTTerminal () {
9+ }
10+
11+ void TFTTerminal::setcolor (uint16_t color, uint16_t bk_color) {
12+ _color = color;
13+ _bkcolor = bk_color;
14+ }
15+
16+ void TFTTerminal::setGeometry (uint16_t x, uint16_t y, uint16_t w, uint16_t h) {
17+ _win_x_pos = x;
18+ _win_y_pos = y;
19+ _win_w = w;
20+ _win_h = h;
21+
22+ _line_x_limit = _win_w / _font_x_size;
23+ _line_y_limit = _win_h / _font_y_size;
24+ }
25+
26+ void TFTTerminal::setFontsize (uint8_t size) {
27+ size = (size == 0 ) ? 1 : size;
28+ _font_x_size = 5 * size;
29+ _font_y_size = 6 * size;
30+ _fontSize = size;
31+
32+ _line_x_limit = _win_w / _font_x_size;
33+ _line_y_limit = _win_h / _font_y_size;
34+ }
35+
36+ size_t TFTTerminal::write (uint8_t chardata) {
37+ bool flush_page_flag = false ;
38+ uint8_t dis_y_pos = 0 ;
39+
40+ if ((chardata == ' \r ' ) || (chardata == ' \n ' )) {
41+ xpos = 0 ;
42+ ypos++;
43+ ypos = ypos % 60 ;
44+ memset (discharbuff[ypos % 60 ], 0 , 55 );
45+ return 1 ;
46+ } else if (xpos >= _line_x_limit) {
47+ xpos = 0 ;
48+ ypos++;
49+ ypos = ypos % 60 ;
50+ memset (discharbuff[ypos % 60 ], 0 , 55 );
51+ }
52+
53+ discharbuff[ypos][xpos] = chardata;
54+ xpos++;
55+
56+ if ((dispos <= ypos) && ((ypos - dispos) > _line_y_limit)) {
57+ dispos = ypos - _line_y_limit;
58+ flush_page_flag = true ;
59+ } else if ((dispos <= ypos) && ((ypos - dispos) <= _line_y_limit)) {
60+ dis_y_pos = ypos - dispos;
61+ flush_page_flag = false ;
62+ } else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
63+ dispos = 60 - (_line_y_limit - ypos);
64+ flush_page_flag = true ;
65+ } else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
66+ dis_y_pos = 60 - (dispos - ypos);
67+ flush_page_flag = false ;
68+ }
69+
70+ dispos = dispos % 60 ;
71+
72+ _dis_buff_ptr->setTextColor (_color);
73+ _dis_buff_ptr->setTextSize (_fontSize);
74+
75+ if (flush_page_flag) {
76+ _dis_buff_ptr->fillSprite (_bkcolor);
77+
78+ for (size_t i = 0 ; i < _line_y_limit; i++) {
79+ _dis_buff_ptr->drawString ((char *)discharbuff[(dispos + i) % 60 ], 0 ,
80+ i * _font_y_size);
81+ }
82+ } else {
83+ _dis_buff_ptr->drawChar (chardata, (xpos - 1 ) * _font_x_size,
84+ dis_y_pos * _font_y_size);
85+ }
86+ _dis_buff_ptr->pushSprite (_win_x_pos, _win_y_pos);
87+
88+ return 1 ;
89+ }
90+
91+ size_t TFTTerminal::write (const uint8_t *buffer, size_t size) {
92+ while ((size != 0 ) && (*buffer != ' \0 ' )) {
93+ if ((*buffer == ' \r ' ) || (*buffer == ' \n ' )) {
94+ xpos = 0 ;
95+ ypos++;
96+ ypos = ypos % 60 ;
97+ memset (discharbuff[ypos % 60 ], 0 , 55 );
98+ buffer++;
99+ size--;
100+ continue ;
101+ } else if (xpos >= _line_x_limit) {
102+ xpos = 0 ;
103+ ypos++;
104+ ypos = ypos % 60 ;
105+ memset (discharbuff[ypos % 60 ], 0 , 55 );
106+ }
107+ discharbuff[ypos][xpos] = *buffer;
108+ xpos++;
109+ buffer++;
110+ size--;
111+ }
112+
113+ if ((dispos <= ypos) && ((ypos - dispos) > _line_y_limit)) {
114+ dispos = ypos - _line_y_limit;
115+ } else if ((dispos > ypos) && ((60 - (dispos - ypos)) > _line_y_limit)) {
116+ dispos = 60 - (_line_y_limit - ypos);
117+ }
118+
119+ dispos = dispos % 60 ;
120+
121+ _dis_buff_ptr->setTextColor (_color);
122+ _dis_buff_ptr->setTextSize (_fontSize);
123+ _dis_buff_ptr->fillSprite (_bkcolor);
124+ // _dis_buff_ptr->fillRect(_win_x_pos, _win_y_pos, _win_w, _win_h, _bkcolor);
125+ for (size_t i = 0 ; i < _line_y_limit; i++) {
126+ _dis_buff_ptr->drawString ((char *)discharbuff[(dispos + i) % 60 ], 0 ,
127+ i * _font_y_size);
128+ }
129+ _dis_buff_ptr->pushSprite (_win_x_pos, _win_y_pos);
130+ return 1 ;
131+ }
0 commit comments