TFTTerminal.cpp 3.8 KB

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