TFTTerminal.cpp 3.8 KB

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