My Marlin configs for Fabrikator Mini and CTC i3 Pro B
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

lcdprint_dwin.cpp 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /**
  2. * Marlin 3D Printer Firmware
  3. * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
  4. *
  5. * Based on Sprinter and grbl.
  6. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
  7. *
  8. * This program is free software: you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation, either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. /**
  23. * lcd/e3v2/marlinui/lcdprint_dwin.cpp
  24. *
  25. * Due to DWIN hardware limitations simplified characters are used
  26. */
  27. #include "../../../inc/MarlinConfigPre.h"
  28. #if IS_DWIN_MARLINUI
  29. #include "lcdprint_dwin.h"
  30. #include "dwin_lcd.h"
  31. #include "dwin_string.h"
  32. #include "../../marlinui.h"
  33. #include "../../../MarlinCore.h"
  34. #include <string.h>
  35. cursor_t cursor;
  36. extern dwin_font_t dwin_font;
  37. void lcd_moveto_xy(const lcd_uint_t x, const lcd_uint_t y) { cursor.x = x; cursor.y = y; }
  38. void lcd_moveto(const lcd_uint_t col, const lcd_uint_t row) {
  39. cursor.x = col * dwin_font.width;
  40. cursor.y = (row * (dwin_font.height + EXTRA_ROW_HEIGHT)) + (EXTRA_ROW_HEIGHT / 2);
  41. }
  42. inline void lcd_advance_cursor() { cursor.x += dwin_font.width; }
  43. void lcd_put_int(const int i) {
  44. // TODO: Draw an int at the cursor position, advance the cursor
  45. }
  46. int lcd_put_dwin_string() {
  47. DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, (char*)dwin_string.string());
  48. cursor.x += dwin_string.length() * dwin_font.width;
  49. return dwin_string.length();
  50. }
  51. // return < 0 on error
  52. // return the advanced cols
  53. int lcd_put_wchar_max(wchar_t c, pixel_len_t max_length) {
  54. dwin_string.set();
  55. dwin_string.add(c);
  56. dwin_string.truncate(max_length);
  57. // Draw the char(s) at the cursor and advance the cursor
  58. DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, (char*)dwin_string.string());
  59. cursor.x += dwin_string.length() * dwin_font.width;
  60. return dwin_string.length();
  61. }
  62. /**
  63. * @brief Draw a UTF-8 string
  64. *
  65. * @param utf8_str : the UTF-8 string
  66. * @param cb_read_byte : the callback function to read one byte from the utf8_str (from RAM or ROM)
  67. * @param max_length : the pixel length of the string allowed (or number of slots in HD44780)
  68. *
  69. * @return the number of pixels advanced
  70. *
  71. * Draw a UTF-8 string
  72. */
  73. static int lcd_put_u8str_max_cb(const char * utf8_str, uint8_t (*cb_read_byte)(uint8_t * str), pixel_len_t max_length) {
  74. uint8_t *p = (uint8_t *)utf8_str;
  75. dwin_string.set();
  76. while (dwin_string.length() < max_length) {
  77. wchar_t ch = 0;
  78. p = get_utf8_value_cb(p, cb_read_byte, &ch);
  79. if (!ch) break;
  80. dwin_string.add(ch);
  81. }
  82. DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, (char*)dwin_string.string());
  83. cursor.x += dwin_string.length() * dwin_font.width;
  84. return dwin_string.length();
  85. }
  86. int lcd_put_u8str_max(const char * utf8_str, pixel_len_t max_length) {
  87. return lcd_put_u8str_max_cb(utf8_str, read_byte_ram, max_length);
  88. }
  89. int lcd_put_u8str_max_P(PGM_P utf8_str_P, pixel_len_t max_length) {
  90. return lcd_put_u8str_max_cb(utf8_str_P, read_byte_rom, max_length);
  91. }
  92. lcd_uint_t lcd_put_u8str_ind_P(PGM_P const pstr, const int8_t ind, PGM_P const inStr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) {
  93. dwin_string.set();
  94. dwin_string.add((uint8_t*)pstr, ind, (uint8_t*)inStr);
  95. dwin_string.truncate(maxlen);
  96. DWIN_Draw_String(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, (char*)dwin_string.string());
  97. cursor.x += dwin_string.length() * dwin_font.width;
  98. return dwin_string.length();
  99. }
  100. #if ENABLED(DEBUG_LCDPRINT)
  101. int test_dwin_charmap(dwin_charmap_t *data, size_t size, char *name, char flg_show_contents) {
  102. int ret;
  103. size_t idx = 0;
  104. dwin_charmap_t preval = { 0, 0, 0 };
  105. dwin_charmap_t pinval = { 0, 0, 0 };
  106. char flg_error = 0;
  107. int i;
  108. TRACE("Test %s\n", name);
  109. for (i = 0; i < size; i ++) {
  110. memcpy_P(&pinval, &(data[i]), sizeof(pinval));
  111. if (flg_show_contents) {
  112. #if 1
  113. TRACE("[% 4d] % 6" PRIu32 "(0x%04" PRIX32 ") --> 0x%02X,0x%02X%s\n", i, pinval.uchar, pinval.uchar, (unsigned int)(pinval.idx), (unsigned int)(pinval.idx2), (preval.uchar < pinval.uchar?"":" <--- ERROR"));
  114. #else
  115. TRACE("[% 4d]", i);
  116. TRACE("% 6" PRIu32 "(0x%04" PRIX32 "),", pinval.uchar, pinval.uchar);
  117. TRACE("0x%02X,", (unsigned int)(pinval.idx));
  118. TRACE("0x%02X,", (unsigned int)(pinval.idx2));
  119. TRACE("%s", (preval.uchar < pinval.uchar?"":" <--- ERROR"));
  120. #endif
  121. }
  122. if (preval.uchar >= pinval.uchar) {
  123. flg_error = 1;
  124. //TRACE("Error: out of order in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  125. //return -1;
  126. }
  127. memcpy(&preval, &pinval, sizeof(pinval));
  128. ret = pf_bsearch_r((void *)data, size, pf_bsearch_cb_comp_dwinmap_pgm, (void *)&pinval, &idx);
  129. if (ret < 0) {
  130. flg_error = 1;
  131. TRACE("Error: not found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  132. //return -1;
  133. }
  134. if (idx != i) {
  135. flg_error = 1;
  136. TRACE("Error: wrong index found item in array %s: idx=%d, val=%d(0x%x)\n", name, i, pinval.uchar, pinval.uchar);
  137. //return -1;
  138. }
  139. }
  140. if (flg_error) {
  141. TRACE("\nError: in array %s\n\n", name);
  142. return -1;
  143. }
  144. TRACE("\nPASS array %s\n\n", name);
  145. return 0;
  146. }
  147. int test_dwin_charmap_all() {
  148. int flg_error = 0;
  149. if (test_dwin_charmap(g_dwin_charmap_device, COUNT(g_dwin_charmap_device), "g_dwin_charmap_device", 0) < 0) {
  150. flg_error = 1;
  151. test_dwin_charmap(g_dwin_charmap_device, COUNT(g_dwin_charmap_device), "g_dwin_charmap_device", 1);
  152. }
  153. if (test_dwin_charmap(g_dwin_charmap_common, COUNT(g_dwin_charmap_common), "g_dwin_charmap_common", 0) < 0) {
  154. flg_error = 1;
  155. test_dwin_charmap(g_dwin_charmap_common, COUNT(g_dwin_charmap_common), "g_dwin_charmap_common", 1);
  156. }
  157. if (flg_error) {
  158. TRACE("\nFAILED in dwin tests!\n");
  159. return -1;
  160. }
  161. TRACE("\nPASS in dwin tests.\n");
  162. return 0;
  163. }
  164. #endif // DEBUG_LCDPRINT
  165. #endif // IS_DWIN_MARLINUI