My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dwin_string.cpp 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 <https://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "../../../inc/MarlinConfig.h"
  23. #if IS_DWIN_MARLINUI
  24. #include "dwin_string.h"
  25. //#include "../../fontutils.h"
  26. uint8_t DWIN_String::data[];
  27. uint16_t DWIN_String::span;
  28. uint8_t DWIN_String::len;
  29. void DWIN_String::set() {
  30. //*data = 0x00;
  31. memset(data, 0x00, sizeof(data));
  32. span = 0;
  33. len = 0;
  34. }
  35. uint8_t read_byte(uint8_t *byte) { return *byte; }
  36. /**
  37. * Add a string, applying substitutions for the following characters:
  38. *
  39. * $ displays the clipped C-string given by the itemString argument
  40. * = displays '0'....'10' for indexes 0 - 10
  41. * ~ displays '1'....'11' for indexes 0 - 10
  42. * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
  43. * @ displays an axis name such as XYZUVW, or E for an extruder
  44. */
  45. void DWIN_String::add(uint8_t *string, const int8_t index, uint8_t *itemString/*=nullptr*/) {
  46. wchar_t wchar;
  47. while (*string) {
  48. string = get_utf8_value_cb(string, read_byte, &wchar);
  49. if (wchar > 255) wchar |= 0x0080;
  50. uint8_t ch = uint8_t(wchar & 0x00FF);
  51. if (ch == '=' || ch == '~' || ch == '*') {
  52. if (index >= 0) {
  53. int8_t inum = index + ((ch == '=') ? 0 : LCD_FIRST_TOOL);
  54. if (ch == '*') add_character('E');
  55. if (inum >= 10) { add_character('0' + (inum / 10)); inum %= 10; }
  56. add_character('0' + inum);
  57. }
  58. else
  59. add(index == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED));
  60. }
  61. else if (ch == '$' && itemString)
  62. add(itemString);
  63. else if (ch == '@')
  64. add_character(AXIS_CHAR(index));
  65. else
  66. add_character(ch);
  67. }
  68. eol();
  69. }
  70. void DWIN_String::add(uint8_t *string, uint8_t max_len) {
  71. wchar_t wchar;
  72. while (*string && max_len) {
  73. string = get_utf8_value_cb(string, read_byte, &wchar);
  74. /*
  75. if (wchar > 255) wchar |= 0x0080;
  76. uint8_t ch = uint8_t(wchar & 0x00FF);
  77. add_character(ch);
  78. */
  79. add(wchar);
  80. max_len--;
  81. }
  82. eol();
  83. }
  84. void DWIN_String::add(wchar_t character) {
  85. int ret;
  86. size_t idx = 0;
  87. dwin_charmap_t pinval;
  88. dwin_charmap_t *copy_address = nullptr;
  89. pinval.uchar = character;
  90. pinval.idx = -1;
  91. // For 8-bit ASCII just print the single character
  92. char str[] = { '?', 0 };
  93. if (character < 255) {
  94. str[0] = (char)character;
  95. }
  96. else {
  97. copy_address = nullptr;
  98. ret = pf_bsearch_r((void *)g_dwin_charmap_device, COUNT(g_dwin_charmap_device), pf_bsearch_cb_comp_dwinmap_pgm, (void *)&pinval, &idx);
  99. if (ret >= 0) {
  100. copy_address = (dwin_charmap_t*)(g_dwin_charmap_device + idx);
  101. }
  102. else {
  103. ret = pf_bsearch_r((void *)g_dwin_charmap_common, COUNT(g_dwin_charmap_common), pf_bsearch_cb_comp_dwinmap_pgm, (void *)&pinval, &idx);
  104. if (ret >= 0)
  105. copy_address = (dwin_charmap_t*)(g_dwin_charmap_common + idx);
  106. }
  107. if (ret >= 0) {
  108. dwin_charmap_t localval;
  109. memcpy_P(&localval, copy_address, sizeof(localval));
  110. str[0] = localval.idx;
  111. str[1] = localval.idx2;
  112. }
  113. }
  114. if (str[0]) add_character(str[0]);
  115. if (str[1]) add_character(str[1]);
  116. }
  117. void DWIN_String::add_character(const uint8_t character) {
  118. if (len < MAX_STRING_LENGTH) {
  119. data[len] = character;
  120. len++;
  121. //span += glyph(character)->DWidth;
  122. }
  123. }
  124. void DWIN_String::rtrim(const uint8_t character) {
  125. while (len) {
  126. if (data[len - 1] == 0x20 || data[len - 1] == character) {
  127. len--;
  128. //span -= glyph(data[length])->DWidth;
  129. eol();
  130. }
  131. else
  132. break;
  133. }
  134. }
  135. void DWIN_String::ltrim(const uint8_t character) {
  136. uint16_t i, j;
  137. for (i = 0; (i < len) && (data[i] == 0x20 || data[i] == character); i++) {
  138. //span -= glyph(data[i])->DWidth;
  139. }
  140. if (i == 0) return;
  141. for (j = 0; i < len; data[j++] = data[i++]);
  142. len = j;
  143. eol();
  144. }
  145. void DWIN_String::trim(const uint8_t character) {
  146. rtrim(character);
  147. ltrim(character);
  148. }
  149. /* return v1 - v2 */
  150. int dwin_charmap_compare(dwin_charmap_t *v1, dwin_charmap_t *v2) {
  151. return (v1->uchar < v2->uchar) ? -1 : (v1->uchar > v2->uchar) ? 1 : 0;
  152. }
  153. int pf_bsearch_cb_comp_dwinmap_pgm(void *userdata, size_t idx, void * data_pin) {
  154. dwin_charmap_t localval;
  155. dwin_charmap_t *p_dwin_charmap = (dwin_charmap_t *)userdata;
  156. memcpy_P(&localval, p_dwin_charmap + idx, sizeof(localval));
  157. return dwin_charmap_compare(&localval, (dwin_charmap_t *)data_pin);
  158. }
  159. DWIN_String dwin_string;
  160. #endif // IS_DWIN_MARLINUI