📺 Fix and enhance FTDI EVE Touch UI (#22047)
This commit is contained in:
		| @@ -95,6 +95,7 @@ namespace FTDI_FT810 { | |||||||
| namespace FTDI { | namespace FTDI { | ||||||
|   constexpr uint8_t ARGB1555                           = 0; |   constexpr uint8_t ARGB1555                           = 0; | ||||||
|   constexpr uint8_t L1                                 = 1; |   constexpr uint8_t L1                                 = 1; | ||||||
|  |   constexpr uint8_t L2                                 = 17; | ||||||
|   constexpr uint8_t L4                                 = 2; |   constexpr uint8_t L4                                 = 2; | ||||||
|   constexpr uint8_t L8                                 = 3; |   constexpr uint8_t L8                                 = 3; | ||||||
|   constexpr uint8_t RGB332                             = 4; |   constexpr uint8_t RGB332                             = 4; | ||||||
|   | |||||||
| @@ -64,14 +64,14 @@ namespace FTDI { | |||||||
|   inline uint32_t CLEAR_COLOR_A(uint8_t alpha)                 {return DL::CLEAR_COLOR_A|(alpha&255UL);} |   inline uint32_t CLEAR_COLOR_A(uint8_t alpha)                 {return DL::CLEAR_COLOR_A|(alpha&255UL);} | ||||||
|   inline uint32_t CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) |   inline uint32_t CLEAR_COLOR_RGB(uint8_t red, uint8_t green, uint8_t blue) | ||||||
|                                                                {return DL::CLEAR_COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} |                                                                {return DL::CLEAR_COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} | ||||||
|   inline uint32_t CLEAR_COLOR_RGB(uint32_t rgb)                {return DL::CLEAR_COLOR_RGB|rgb;} |   inline uint32_t CLEAR_COLOR_RGB(uint32_t rgb)                {return DL::CLEAR_COLOR_RGB|(rgb&0xFFFFFF);} | ||||||
|   inline uint32_t CLEAR_STENCIL(uint8_t s)                     {return DL::CLEAR_STENCIL|(s&255UL);} |   inline uint32_t CLEAR_STENCIL(uint8_t s)                     {return DL::CLEAR_STENCIL|(s&255UL);} | ||||||
|   inline uint32_t CLEAR_TAG(uint8_t s)                         {return DL::CLEAR_TAG|(s&255UL);} |   inline uint32_t CLEAR_TAG(uint8_t s)                         {return DL::CLEAR_TAG|(s&255UL);} | ||||||
|   inline uint32_t COLOR_A(uint8_t alpha)                       {return DL::COLOR_A|(alpha&255UL);} |   inline uint32_t COLOR_A(uint8_t alpha)                       {return DL::COLOR_A|(alpha&255UL);} | ||||||
|   inline uint32_t COLOR_MASK(bool r, bool g, bool b, bool a)   {return DL::COLOR_MASK|((r?1UL:0UL)<<3)|((g?1UL:0UL)<<2)|((b?1UL:0UL)<<1)|(a?1UL:0UL);} |   inline uint32_t COLOR_MASK(bool r, bool g, bool b, bool a)   {return DL::COLOR_MASK|((r?1UL:0UL)<<3)|((g?1UL:0UL)<<2)|((b?1UL:0UL)<<1)|(a?1UL:0UL);} | ||||||
|   inline uint32_t COLOR_RGB(uint8_t red,uint8_t green,uint8_t blue) |   inline uint32_t COLOR_RGB(uint8_t red,uint8_t green,uint8_t blue) | ||||||
|                                                                {return DL::COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} |                                                                {return DL::COLOR_RGB|((red&255UL)<<16)|((green&255UL)<<8)|(blue&255UL);} | ||||||
|   inline uint32_t COLOR_RGB(uint32_t rgb)                      {return DL::COLOR_RGB|rgb;} |   inline uint32_t COLOR_RGB(uint32_t rgb)                      {return DL::COLOR_RGB|(rgb&0xFFFFFF);} | ||||||
|   /* inline uint32_t DISPLAY()                                 {return (0UL<<24)) */ |   /* inline uint32_t DISPLAY()                                 {return (0UL<<24)) */ | ||||||
|   inline uint32_t END()                                        {return DL::END;} |   inline uint32_t END()                                        {return DL::END;} | ||||||
|   inline uint32_t JUMP(uint16_t dest)                          {return DL::JUMP|(dest&65535UL);} |   inline uint32_t JUMP(uint16_t dest)                          {return DL::JUMP|(dest&65535UL);} | ||||||
|   | |||||||
| @@ -195,11 +195,31 @@ | |||||||
|   #define pgm_read_ptr_far pgm_read_ptr |   #define pgm_read_ptr_far pgm_read_ptr | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|  |   // Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments | ||||||
|  |   #define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT | ||||||
|  |   #define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) | ||||||
|  |  | ||||||
|  |   // SERIAL_ECHOPAIR / SERIAL_ECHOPAIR_P is used to output a key value pair. The key must be a string and the value can be anything | ||||||
|  |   // Print up to 12 pairs of values. Odd elements auto-wrapped in PSTR(). | ||||||
|  |   #define __SEP_N(N,V...)   _SEP_##N(V) | ||||||
|  |   #define _SEP_N(N,V...)    __SEP_N(N,V) | ||||||
|  |   #define _SEP_1(PRE)       SERIAL_ECHOPGM(PRE) | ||||||
|  |   #define _SEP_2(PRE,V)     do{ Serial.print(F(PRE)); Serial.print(V); }while(0) | ||||||
|  |   #define _SEP_3(a,b,c)     do{ _SEP_2(a,b); SERIAL_ECHOPGM(c); }while(0) | ||||||
|  |   #define _SEP_4(a,b,V...)  do{ _SEP_2(a,b); _SEP_2(V); }while(0) | ||||||
|  |  | ||||||
|  |   // Print up to 1 pairs of values followed by newline | ||||||
|  |   #define __SELP_N(N,V...)            _SELP_##N(V) | ||||||
|  |   #define _SELP_N(N,V...)             __SELP_N(N,V) | ||||||
|  |   #define _SELP_1(PRE)                SERIAL_ECHOLNPGM(PRE) | ||||||
|  |   #define _SELP_2(PRE,V)              do{ Serial.print(F(PRE)); Serial.println(V); }while(0) | ||||||
|  |   #define _SELP_3(a,b,c)              do{ _SEP_2(a,b); SERIAL_ECHOLNPGM(c); }while(0) | ||||||
|  |   #define _SELP_4(a,b,V...)           do{ _SEP_2(a,b); _SELP_2(V); }while(0) | ||||||
|   #define SERIAL_ECHO_START() |   #define SERIAL_ECHO_START() | ||||||
|   #define SERIAL_ECHOLNPGM(str)       Serial.println(F(str)) |   #define SERIAL_ECHOLNPGM(str)       Serial.println(F(str)) | ||||||
|   #define SERIAL_ECHOPGM(str)         Serial.print(F(str)) |   #define SERIAL_ECHOPGM(str)         Serial.print(F(str)) | ||||||
|   #define SERIAL_ECHO_MSG(str)        Serial.println(str) |   #define SERIAL_ECHO_MSG(V...)       SERIAL_ECHOLNPAIR(V) | ||||||
|   #define SERIAL_ECHOLNPAIR(str, val) do{ Serial.print(F(str)); Serial.println(val); }while(0) |   #define SERIAL_ECHOLNPAIR(V...)     _SELP_N(NUM_ARGS(V),V) | ||||||
|   #define SERIAL_ECHOPAIR(str, val)   do{ Serial.print(F(str)); Serial.print(val); }while(0) |   #define SERIAL_ECHOPAIR(str, val)   do{ Serial.print(F(str)); Serial.print(val); }while(0) | ||||||
|  |  | ||||||
|   #define safe_delay delay |   #define safe_delay delay | ||||||
|   | |||||||
| @@ -26,4 +26,16 @@ | |||||||
| CommandProcessor::btn_style_func_t  *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func; | CommandProcessor::btn_style_func_t  *CommandProcessor::_btn_style_callback = CommandProcessor::default_button_style_func; | ||||||
| bool CommandProcessor::is_tracking = false; | bool CommandProcessor::is_tracking = false; | ||||||
|  |  | ||||||
|  | uint32_t CommandProcessor::memcrc(uint32_t ptr, uint32_t num) { | ||||||
|  |   const uint16_t x = CLCD::mem_read_16(CLCD::REG::CMD_WRITE); | ||||||
|  |   memcrc(ptr, num, 0); | ||||||
|  |   wait(); | ||||||
|  |   return CLCD::mem_read_32(CLCD::MAP::RAM_CMD + x + 12); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool CommandProcessor::wait() { | ||||||
|  |   while (is_processing() && !has_fault()) { /* nada */ } | ||||||
|  |   return !has_fault(); | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif // FTDI_EXTENDED | #endif // FTDI_EXTENDED | ||||||
|   | |||||||
| @@ -146,6 +146,9 @@ class CommandProcessor : public CLCD::CommandFifo { | |||||||
|       return *this; |       return *this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     bool wait(); | ||||||
|  |     uint32_t memcrc(uint32_t ptr, uint32_t num); | ||||||
|  |  | ||||||
|     // Wrap all the CommandFifo routines to allow method chaining |     // Wrap all the CommandFifo routines to allow method chaining | ||||||
|  |  | ||||||
|     inline CommandProcessor& cmd      (uint32_t cmd32)            {CLCD::CommandFifo::cmd(cmd32); return *this;} |     inline CommandProcessor& cmd      (uint32_t cmd32)            {CLCD::CommandFifo::cmd(cmd32); return *this;} | ||||||
|   | |||||||
| @@ -47,23 +47,25 @@ | |||||||
|   #define MARGIN_DEFAULT   3 |   #define MARGIN_DEFAULT   3 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| // EDGE_R adds some black space on the right edge of the display | // The EDGE variables adds some space on the edges of the display | ||||||
| // This shifts some of the screens left to visually center them. |  | ||||||
|  |  | ||||||
|  | #define EDGE_T           0 | ||||||
|  | #define EDGE_B           0 | ||||||
|  | #define EDGE_L           0 | ||||||
| #define EDGE_R           0 | #define EDGE_R           0 | ||||||
|  |  | ||||||
| // GRID_X and GRID_Y computes the positions of the divisions on | // GRID_X and GRID_Y computes the positions of the divisions on | ||||||
| // the layout grid. | // the layout grid. | ||||||
| #define GRID_X(x)        ((x)*(FTDI::display_width-EDGE_R)/GRID_COLS) | #define GRID_X(x)        ((x)*(FTDI::display_width-EDGE_R-EDGE_L)/GRID_COLS+EDGE_L) | ||||||
| #define GRID_Y(y)        ((y)*FTDI::display_height/GRID_ROWS) | #define GRID_Y(y)        ((y)*(FTDI::display_height-EDGE_B-EDGE_T)/GRID_ROWS+EDGE_T) | ||||||
|  |  | ||||||
| // BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width | // BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width | ||||||
| // and height of a button, taking into account the button margins. | // and height of a button, taking into account the button margins. | ||||||
|  |  | ||||||
| #define BTN_X(x)         (GRID_X((x)-1) + MARGIN_L) | #define BTN_X(x)         (GRID_X((x)-1) + MARGIN_L) | ||||||
| #define BTN_Y(y)         (GRID_Y((y)-1) + MARGIN_T) | #define BTN_Y(y)         (GRID_Y((y)-1) + MARGIN_T) | ||||||
| #define BTN_W(w)         (GRID_X(w)   - MARGIN_L - MARGIN_R) | #define BTN_W(w)         (GRID_X(w) - GRID_X(0) - MARGIN_L - MARGIN_R) | ||||||
| #define BTN_H(h)         (GRID_Y(h)   - MARGIN_T - MARGIN_B) | #define BTN_H(h)         (GRID_Y(h) - GRID_Y(0) - MARGIN_T - MARGIN_B) | ||||||
|  |  | ||||||
| // Abbreviations for common phrases, to allow a button to be | // Abbreviations for common phrases, to allow a button to be | ||||||
| // defined in one line of source. | // defined in one line of source. | ||||||
|   | |||||||
| @@ -86,8 +86,10 @@ namespace FTDI { | |||||||
|       if (font == 26) break; |       if (font == 26) break; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const uint16_t dx = (options & OPT_RIGHTX) ? w : (options & OPT_CENTERX) ? w/2 : 0; |     const uint16_t dx = (options & OPT_RIGHTX) ? w : | ||||||
|     const uint16_t dy = (options & OPT_CENTERY) ? (h - box_height)/2 : 0; |                         (options & OPT_CENTERX) ? w/2 : 0; | ||||||
|  |     const uint16_t dy = (options & OPT_BOTTOMY) ? (h - box_height) : | ||||||
|  |                         (options & OPT_CENTERY) ? (h - box_height)/2 : 0; | ||||||
|  |  | ||||||
|     const char *line_start = str; |     const char *line_start = str; | ||||||
|     const char *line_end; |     const char *line_end; | ||||||
| @@ -105,11 +107,11 @@ namespace FTDI { | |||||||
|  |  | ||||||
|         #if ENABLED(TOUCH_UI_USE_UTF8) |         #if ENABLED(TOUCH_UI_USE_UTF8) | ||||||
|           if (has_utf8_chars(line)) { |           if (has_utf8_chars(line)) { | ||||||
|             draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY); |             draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~(OPT_CENTERY | OPT_BOTTOMY)); | ||||||
|           } else |           } else | ||||||
|         #endif |         #endif | ||||||
|           { |           { | ||||||
|             cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY); |             cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~(OPT_CENTERY | OPT_BOTTOMY)); | ||||||
|             cmd.CLCD::CommandFifo::str(line); |             cmd.CLCD::CommandFifo::str(line); | ||||||
|           } |           } | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -25,6 +25,8 @@ | |||||||
|  * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. |  * This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit. | ||||||
|  */ |  */ | ||||||
| namespace FTDI { | namespace FTDI { | ||||||
|  |   constexpr uint16_t OPT_BOTTOMY      = 0x1000; // Non-standard | ||||||
|  |  | ||||||
|   void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); |   void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, progmem_str str, uint16_t options = 0, uint8_t font = 31); | ||||||
|   void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); |   void draw_text_box(class CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options = 0, uint8_t font = 31); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -138,6 +138,7 @@ | |||||||
|    */ |    */ | ||||||
|  |  | ||||||
|   void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { |   void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) { | ||||||
|  |     cmd.cmd(SAVE_CONTEXT()); | ||||||
|     #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET |     #ifdef TOUCH_UI_UTF8_CYRILLIC_CHARSET | ||||||
|       CyrillicCharSet::load_bitmaps(cmd); |       CyrillicCharSet::load_bitmaps(cmd); | ||||||
|     #endif |     #endif | ||||||
| @@ -145,6 +146,7 @@ | |||||||
|       WesternCharSet::load_bitmaps(cmd); |       WesternCharSet::load_bitmaps(cmd); | ||||||
|     #endif |     #endif | ||||||
|     StandardCharSet::load_bitmaps(cmd); |     StandardCharSet::load_bitmaps(cmd); | ||||||
|  |     cmd.cmd(RESTORE_CONTEXT()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|    /** |    /** | ||||||
|   | |||||||
| @@ -1,108 +0,0 @@ | |||||||
| #!/usr/bin/python |  | ||||||
|  |  | ||||||
| # Written By Marcio Teixeira 2019 - Aleph Objects, Inc. |  | ||||||
| # |  | ||||||
| # 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. |  | ||||||
| # |  | ||||||
| # To view a copy of the GNU General Public License, go to the following |  | ||||||
| # location: <https://www.gnu.org/licenses/>. |  | ||||||
|  |  | ||||||
| from __future__ import print_function |  | ||||||
| from PIL import Image |  | ||||||
| import argparse |  | ||||||
| import textwrap |  | ||||||
|  |  | ||||||
| def pack_rle(data): |  | ||||||
|   """Use run-length encoding to pack the bytes""" |  | ||||||
|   rle = [] |  | ||||||
|   value = data[0] |  | ||||||
|   count = 0 |  | ||||||
|   for i in data: |  | ||||||
|     if i != value or count == 255: |  | ||||||
|       rle.append(count) |  | ||||||
|       rle.append(value) |  | ||||||
|       value = i |  | ||||||
|       count = 1 |  | ||||||
|     else: |  | ||||||
|       count += 1 |  | ||||||
|   rle.append(count) |  | ||||||
|   rle.append(value) |  | ||||||
|   return rle |  | ||||||
|  |  | ||||||
| class WriteSource: |  | ||||||
|   def __init__(self, lines_in_blocks): |  | ||||||
|     self.blocks      = [] |  | ||||||
|     self.values      = [] |  | ||||||
|     self.block_size  = lines_in_blocks |  | ||||||
|     self.rows        = 0 |  | ||||||
|  |  | ||||||
|   def add_pixel(self, value): |  | ||||||
|     self.values.append(value) |  | ||||||
|  |  | ||||||
|   def convert_to_4bpp(self, data, chunk_size = 0): |  | ||||||
|     # Invert the image |  | ||||||
|     data = list(map(lambda i: 255 - i, data)) |  | ||||||
|     # Quanitize 8-bit values into 4-bits |  | ||||||
|     data = list(map(lambda i: i >> 4, data)) |  | ||||||
|     # Make sure there is an even number of elements |  | ||||||
|     if (len(data) & 1) == 1: |  | ||||||
|       data.append(0) |  | ||||||
|     # Combine each two adjacent values into one |  | ||||||
|     i = iter(data) |  | ||||||
|     data = list(map(lambda a, b: a << 4 | b, i ,i)) |  | ||||||
|     # Pack the data |  | ||||||
|     data = pack_rle(data) |  | ||||||
|     # Convert values into hex strings |  | ||||||
|     return list(map(lambda a: "0x" + format(a, '02x'), data)) |  | ||||||
|  |  | ||||||
|   def end_row(self, y): |  | ||||||
|     # Pad each row into even number of values |  | ||||||
|     if len(self.values) & 1: |  | ||||||
|       self.values.append(0) |  | ||||||
|  |  | ||||||
|     self.rows += 1 |  | ||||||
|     if self.block_size and (self.rows % self.block_size) == 0: |  | ||||||
|       self.blocks.append(self.values) |  | ||||||
|       self.values = [] |  | ||||||
|  |  | ||||||
|   def write(self): |  | ||||||
|     if len(self.values): |  | ||||||
|       self.blocks.append(self.values) |  | ||||||
|  |  | ||||||
|     block_strs = []; |  | ||||||
|     for b in self.blocks: |  | ||||||
|       data = self.convert_to_4bpp(b) |  | ||||||
|       data = ', '.join(data) |  | ||||||
|       data = textwrap.fill(data, 75, initial_indent = '  ', subsequent_indent = '  ') |  | ||||||
|       block_strs.append(data) |  | ||||||
|  |  | ||||||
|     print("const unsigned char font[] PROGMEM = {") |  | ||||||
|     for i, b in enumerate(block_strs): |  | ||||||
|       if i: |  | ||||||
|         print(',') |  | ||||||
|       print('\n  /* {} */'.format(i)) |  | ||||||
|       print(b, end='') |  | ||||||
|     print("\n};") |  | ||||||
|  |  | ||||||
| if __name__ == "__main__": |  | ||||||
|   parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data') |  | ||||||
|   parser.add_argument("input") |  | ||||||
|   parser.add_argument('--char_height', help='Adds a separator every so many lines', type=int) |  | ||||||
|   args = parser.parse_args() |  | ||||||
|  |  | ||||||
|   writer = WriteSource(args.char_height) |  | ||||||
|  |  | ||||||
|   img = Image.open(args.input).convert('L') |  | ||||||
|   for y in range(img.height): |  | ||||||
|     for x in range(img.width): |  | ||||||
|       writer.add_pixel(img.getpixel((x,y))) |  | ||||||
|     writer.end_row(y) |  | ||||||
|   writer.write() |  | ||||||
| @@ -51,6 +51,8 @@ BaseNumericAdjustmentScreen::widgets_t::widgets_t(draw_mode_t what) : _what(what | |||||||
|        .cmd(COLOR_RGB(bg_text_enabled)) |        .cmd(COLOR_RGB(bg_text_enabled)) | ||||||
|        .tag(0); |        .tag(0); | ||||||
|   } |   } | ||||||
|  |   else | ||||||
|  |     cmd.colors(normal_btn); | ||||||
|  |  | ||||||
|   cmd.font(font_medium); |   cmd.font(font_medium); | ||||||
|   _button(cmd, 1, |   _button(cmd, 1, | ||||||
| @@ -319,7 +321,7 @@ void BaseNumericAdjustmentScreen::widgets_t::toggle(uint8_t tag, progmem_str lab | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (_what & FOREGROUND) { |   if (_what & FOREGROUND) { | ||||||
|     _button_style(cmd, BTN_TOGGLE); |     _button_style(cmd, is_enabled ? BTN_TOGGLE : BTN_DISABLED); | ||||||
|     cmd.tag(is_enabled ? tag   : 0) |     cmd.tag(is_enabled ? tag   : 0) | ||||||
|        .enabled(is_enabled) |        .enabled(is_enabled) | ||||||
|        .font(font_small) |        .font(font_small) | ||||||
|   | |||||||
| @@ -141,13 +141,18 @@ void BedMeshBase::_drawMesh(CommandProcessor &cmd, int16_t x, int16_t y, int16_t | |||||||
|         if (ISVAL(x,y)) { |         if (ISVAL(x,y)) { | ||||||
|           if (opts & USE_COLORS) { |           if (opts & USE_COLORS) { | ||||||
|             const float val_dev = sq(VALUE(x, y) - val_mean); |             const float val_dev = sq(VALUE(x, y) - val_mean); | ||||||
|             uint8_t r = 0, b = 0; |             float r = 0, b = 0; | ||||||
|             //*(VALUE(x, y) < 0 ? &r : &b) = val_dev / sq_min * 0xFF; |             if (sq_min != sq_max) { | ||||||
|               if (VALUE(x, y) < 0) |               if (VALUE(x, y) < 0) | ||||||
|               r = val_dev / sq_min * 0xFF; |                 r = val_dev / sq_min; | ||||||
|               else |               else | ||||||
|               b = val_dev / sq_max * 0xFF; |                 b = val_dev / sq_max; | ||||||
|             cmd.cmd(COLOR_RGB(0xFF - b, 0xFF - b - r, 0xFF - r)); |             } | ||||||
|  |             #ifdef BED_MESH_POINTS_GRAY | ||||||
|  |               cmd.cmd(COLOR_RGB((1.0f - b + r) * 0x7F, (1.0f - b - r) * 0x7F, (1.0f - r + b) * 0x7F)); | ||||||
|  |             #else | ||||||
|  |               cmd.cmd(COLOR_RGB((1.0f - b) * 0xFF, (1.0f - b - r) * 0xFF, (1.0f - r) * 0xFF)); | ||||||
|  |             #endif | ||||||
|           } |           } | ||||||
|           cmd.cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); |           cmd.cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -69,9 +69,17 @@ void BedMeshEditScreen::onEntry() { | |||||||
|   mydata.zAdjustment = 0; |   mydata.zAdjustment = 0; | ||||||
|   mydata.savedMeshLevelingState = ExtUI::getLevelingActive(); |   mydata.savedMeshLevelingState = ExtUI::getLevelingActive(); | ||||||
|   mydata.savedEndstopState = ExtUI::getSoftEndstopState(); |   mydata.savedEndstopState = ExtUI::getSoftEndstopState(); | ||||||
|  |   makeMeshValid(); | ||||||
|   BaseScreen::onEntry(); |   BaseScreen::onEntry(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void BedMeshEditScreen::makeMeshValid() { | ||||||
|  |   bed_mesh_t &mesh = ExtUI::getMeshArray(); | ||||||
|  |   GRID_LOOP(x, y) { | ||||||
|  |     if (isnan(mesh[x][y])) mesh[x][y] = 0; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| void BedMeshEditScreen::onExit() { | void BedMeshEditScreen::onExit() { | ||||||
|   ExtUI::setLevelingActive(mydata.savedMeshLevelingState); |   ExtUI::setLevelingActive(mydata.savedMeshLevelingState); | ||||||
|   ExtUI::setSoftEndstopState(mydata.savedEndstopState); |   ExtUI::setSoftEndstopState(mydata.savedEndstopState); | ||||||
| @@ -121,8 +129,9 @@ bool BedMeshEditScreen::changeHighlightedValue(uint8_t tag) { | |||||||
| void BedMeshEditScreen::drawHighlightedPointValue() { | void BedMeshEditScreen::drawHighlightedPointValue() { | ||||||
|   CommandProcessor cmd; |   CommandProcessor cmd; | ||||||
|   cmd.font(Theme::font_medium) |   cmd.font(Theme::font_medium) | ||||||
|      .colors(normal_btn) |      .cmd(COLOR_RGB(bg_text_enabled)) | ||||||
|      .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) |      .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) | ||||||
|  |      .colors(normal_btn) | ||||||
|      .font(font_small); |      .font(font_small); | ||||||
|   if (mydata.highlight.x != NONE) |   if (mydata.highlight.x != NONE) | ||||||
|     draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3); |     draw_adjuster(cmd, Z_VALUE_POS, 3, getHighlightedValue(), GET_TEXT_F(MSG_UNITS_MM), 4, 3); | ||||||
| @@ -187,7 +196,8 @@ void BedMeshEditScreen::show() { | |||||||
|     // After the spinner, go to this screen. |     // After the spinner, go to this screen. | ||||||
|     current_screen.forget(); |     current_screen.forget(); | ||||||
|     PUSH_SCREEN(BedMeshEditScreen); |     PUSH_SCREEN(BedMeshEditScreen); | ||||||
|   } else { |   } | ||||||
|  |   else { | ||||||
|     injectCommands_P(PSTR("G29 S1")); |     injectCommands_P(PSTR("G29 S1")); | ||||||
|     GOTO_SCREEN(BedMeshEditScreen); |     GOTO_SCREEN(BedMeshEditScreen); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -32,6 +32,7 @@ struct BedMeshEditScreenData { | |||||||
|  |  | ||||||
| class BedMeshEditScreen : public BedMeshBase, public CachedScreen<BED_MESH_EDIT_SCREEN_CACHE> { | class BedMeshEditScreen : public BedMeshBase, public CachedScreen<BED_MESH_EDIT_SCREEN_CACHE> { | ||||||
|   private: |   private: | ||||||
|  |     static void makeMeshValid(); | ||||||
|     static float getHighlightedValue(); |     static float getHighlightedValue(); | ||||||
|     static void setHighlightedValue(float value); |     static void setHighlightedValue(float value); | ||||||
|     static void moveToHighlightedValue(); |     static void moveToHighlightedValue(); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user