123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- /**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
- #include "../../inc/MarlinConfig.h"
-
- #if HAS_GRAPHICAL_TFT
-
- #include "tft_string.h"
- #include "../fontutils.h"
- #include "../marlinui.h"
-
- //#define DEBUG_TFT_FONT
- #define DEBUG_OUT ENABLED(DEBUG_TFT_FONT)
- #include "../../core/debug_out.h"
-
- glyph_t *TFT_String::glyphs[256];
- font_t *TFT_String::font_header;
-
- char TFT_String::data[];
- uint16_t TFT_String::span;
- uint8_t TFT_String::length;
-
- void TFT_String::set_font(const uint8_t *font) {
- font_header = (font_t *)font;
- uint32_t glyph;
-
- for (glyph = 0; glyph < 256; glyph++) glyphs[glyph] = nullptr;
-
- DEBUG_ECHOLNPGM("Format: ", font_header->Format);
- DEBUG_ECHOLNPGM("BBXWidth: ", font_header->BBXWidth);
- DEBUG_ECHOLNPGM("BBXHeight: ", font_header->BBXHeight);
- DEBUG_ECHOLNPGM("BBXOffsetX: ", font_header->BBXOffsetX);
- DEBUG_ECHOLNPGM("BBXOffsetY: ", font_header->BBXOffsetY);
- DEBUG_ECHOLNPGM("CapitalAHeight: ", font_header->CapitalAHeight);
- DEBUG_ECHOLNPGM("Encoding65Pos: ", font_header->Encoding65Pos);
- DEBUG_ECHOLNPGM("Encoding97Pos: ", font_header->Encoding97Pos);
- DEBUG_ECHOLNPGM("FontStartEncoding: ", font_header->FontStartEncoding);
- DEBUG_ECHOLNPGM("FontEndEncoding: ", font_header->FontEndEncoding);
- DEBUG_ECHOLNPGM("LowerGDescent: ", font_header->LowerGDescent);
- DEBUG_ECHOLNPGM("FontAscent: ", font_header->FontAscent);
- DEBUG_ECHOLNPGM("FontDescent: ", font_header->FontDescent);
- DEBUG_ECHOLNPGM("FontXAscent: ", font_header->FontXAscent);
- DEBUG_ECHOLNPGM("FontXDescent: ", font_header->FontXDescent);
-
- add_glyphs(font);
- }
-
- void TFT_String::add_glyphs(const uint8_t *font) {
- uint32_t glyph;
- uint8_t *pointer = (uint8_t *)font + sizeof(font_t);
-
- for (glyph = ((font_t *)font)->FontStartEncoding; glyph <= ((font_t *)font)->FontEndEncoding; glyph++) {
- if (*pointer != NO_GLYPH) {
- glyphs[glyph] = (glyph_t *)pointer;
- pointer += sizeof(glyph_t) + ((glyph_t *)pointer)->DataSize;
- }
- else
- pointer++;
- }
- }
-
- void TFT_String::set() {
- *data = 0x00;
- span = 0;
- length = 0;
- }
-
- /**
- * Add a string, applying substitutions for the following characters:
- *
- * $ displays the string given by fstr or cstr
- * = displays '0'....'10' for indexes 0 - 10
- * ~ displays '1'....'11' for indexes 0 - 10
- * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL)
- * @ displays an axis name such as XYZUVW, or E for an extruder
- */
- void TFT_String::add(const char *tpl, const int8_t index, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/) {
- wchar_t wchar;
-
- while (*tpl) {
- tpl = get_utf8_value_cb(tpl, read_byte_ram, &wchar);
- if (wchar > 255) wchar |= 0x0080;
- const uint8_t ch = uint8_t(wchar & 0x00FF);
-
- if (ch == '=' || ch == '~' || ch == '*') {
- if (index >= 0) {
- int8_t inum = index + ((ch == '=') ? 0 : LCD_FIRST_TOOL);
- if (ch == '*') add_character('E');
- if (inum >= 10) { add_character('0' + (inum / 10)); inum %= 10; }
- add_character('0' + inum);
- }
- else
- add(index == -2 ? GET_TEXT_F(MSG_CHAMBER) : GET_TEXT_F(MSG_BED));
- }
- else if (ch == '$' && fstr)
- add(fstr);
- else if (ch == '$' && cstr)
- add(cstr);
- else if (ch == '@')
- add_character(AXIS_CHAR(index));
- else
- add_character(ch);
- }
- eol();
- }
-
- void TFT_String::add(const char *cstr, uint8_t max_len/*=MAX_STRING_LENGTH*/) {
- wchar_t wchar;
- while (*cstr && max_len) {
- cstr = get_utf8_value_cb(cstr, read_byte_ram, &wchar);
- if (wchar > 255) wchar |= 0x0080;
- const uint8_t ch = uint8_t(wchar & 0x00FF);
- add_character(ch);
- max_len--;
- }
- eol();
- }
-
- void TFT_String::add_character(const char character) {
- if (length < MAX_STRING_LENGTH) {
- data[length] = character;
- length++;
- span += glyph(character)->DWidth;
- }
- }
-
- void TFT_String::rtrim(const char character) {
- while (length) {
- if (data[length - 1] == 0x20 || data[length - 1] == character) {
- length--;
- span -= glyph(data[length])->DWidth;
- eol();
- }
- else
- break;
- }
- }
-
- void TFT_String::ltrim(const char character) {
- uint16_t i, j;
- for (i = 0; (i < length) && (data[i] == 0x20 || data[i] == character); i++) {
- span -= glyph(data[i])->DWidth;
- }
- if (i == 0) return;
- for (j = 0; i < length; data[j++] = data[i++]);
- length = j;
- eol();
- }
-
- void TFT_String::trim(const char character) {
- rtrim(character);
- ltrim(character);
- }
-
- TFT_String tft_string;
-
- #endif // HAS_GRAPHICAL_TFT
|