📺 Assorted small FTDI Eve Touch UI fixes (#22273)
This commit is contained in:
		| @@ -32,9 +32,7 @@ | |||||||
| class MediaFileReader { | class MediaFileReader { | ||||||
|   private: |   private: | ||||||
|     #if ENABLED(SDSUPPORT) |     #if ENABLED(SDSUPPORT) | ||||||
|       DiskIODriver_SPI_SD card; |       SdFile root, file; | ||||||
|       SdVolume volume; |  | ||||||
|       SdFile   root, file; |  | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|   public: |   public: | ||||||
|   | |||||||
| @@ -118,7 +118,6 @@ enum { | |||||||
| #include "../generic/files_screen.h" | #include "../generic/files_screen.h" | ||||||
| #include "../generic/move_axis_screen.h" | #include "../generic/move_axis_screen.h" | ||||||
| #include "../generic/flow_percent_screen.h" | #include "../generic/flow_percent_screen.h" | ||||||
| #include "../generic/tune_menu.h" |  | ||||||
| #if HAS_JUNCTION_DEVIATION | #if HAS_JUNCTION_DEVIATION | ||||||
|   #include "../generic/junction_deviation_screen.h" |   #include "../generic/junction_deviation_screen.h" | ||||||
| #else | #else | ||||||
|   | |||||||
| @@ -294,4 +294,14 @@ void StatusScreen::onIdle() { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void StatusScreen::onMediaInserted() { | ||||||
|  |   if (AT_SCREEN(StatusScreen)) | ||||||
|  |     setStatusMessage(GET_TEXT_F(MSG_MEDIA_INSERTED)); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void StatusScreen::onMediaRemoved() { | ||||||
|  |   if (AT_SCREEN(StatusScreen) || ExtUI::isPrintingFromMedia()) | ||||||
|  |     setStatusMessage(GET_TEXT_F(MSG_MEDIA_REMOVED)); | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif // COCOA_STATUS_SCREEN | #endif // COCOA_STATUS_SCREEN | ||||||
|   | |||||||
| @@ -52,4 +52,6 @@ class StatusScreen : public BaseScreen, public CachedScreen<STATUS_SCREEN_CACHE> | |||||||
|     static bool onTouchHeld(uint8_t tag); |     static bool onTouchHeld(uint8_t tag); | ||||||
|     static bool onTouchEnd(uint8_t tag); |     static bool onTouchEnd(uint8_t tag); | ||||||
|     static void onIdle(); |     static void onIdle(); | ||||||
|  |     static void onMediaInserted(); | ||||||
|  |     static void onMediaRemoved(); | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -239,9 +239,11 @@ class DeduplicatedPolyReader : public POLY_READER { | |||||||
|  */ |  */ | ||||||
| template<class POLY_READER=DeduplicatedPolyReader<TransformedPolyReader>> | template<class POLY_READER=DeduplicatedPolyReader<TransformedPolyReader>> | ||||||
| class GenericPolyUI { | class GenericPolyUI { | ||||||
|   private: |   protected: | ||||||
|     CommandProcessor &cmd; |     CommandProcessor &cmd; | ||||||
|  |     draw_mode_t mode; | ||||||
|  |  | ||||||
|  |   private: | ||||||
|     // Attributes used to paint buttons |     // Attributes used to paint buttons | ||||||
|  |  | ||||||
|     uint32_t btn_fill_color   = 0x000000; |     uint32_t btn_fill_color   = 0x000000; | ||||||
| @@ -250,8 +252,6 @@ class GenericPolyUI { | |||||||
|     uint32_t btn_stroke_color = 0x000000; |     uint32_t btn_stroke_color = 0x000000; | ||||||
|     uint8_t  btn_stroke_width = 28; |     uint8_t  btn_stroke_width = 28; | ||||||
|  |  | ||||||
|     draw_mode_t mode; |  | ||||||
|  |  | ||||||
|   public: |   public: | ||||||
|     enum ButtonStyle : uint8_t { |     enum ButtonStyle : uint8_t { | ||||||
|       FILL    = 1, |       FILL    = 1, | ||||||
|   | |||||||
							
								
								
									
										47
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/file2cpp.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										47
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/file2cpp.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | # Written By Marcio Teixeira 2021 - SynDaver Labs, 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 | ||||||
|  | import argparse | ||||||
|  | import textwrap | ||||||
|  | import os | ||||||
|  | import zlib | ||||||
|  |  | ||||||
|  | def deflate(data): | ||||||
|  |   return zlib.compress(data) | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |   parser = argparse.ArgumentParser(description='Converts a file into a packed C array for use as data') | ||||||
|  |   parser.add_argument("input") | ||||||
|  |   parser.add_argument("-d", "--deflate", action="store_true", help="Packs the data using the deflate algorithm") | ||||||
|  |   args = parser.parse_args() | ||||||
|  |  | ||||||
|  |   varname = os.path.splitext(os.path.basename(args.input))[0]; | ||||||
|  |    | ||||||
|  |   with open(args.input, "rb") as in_file: | ||||||
|  |     data = in_file.read() | ||||||
|  |   if args.deflate: | ||||||
|  |     data = deflate(data) | ||||||
|  |   data = bytearray(data) | ||||||
|  |   data = list(map(lambda a: "0x" + format(a, '02x'), data)) | ||||||
|  |   nElements = len(data) | ||||||
|  |   data = ', '.join(data) | ||||||
|  |   data = textwrap.fill(data, 75, initial_indent = '  ', subsequent_indent = '  ') | ||||||
|  |  | ||||||
|  |   print("const unsigned char " + varname + "[" + format(nElements) + "] PROGMEM = {") | ||||||
|  |   print(data) | ||||||
|  |   print("};") | ||||||
							
								
								
									
										108
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										108
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/font2cpp.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | #!/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() | ||||||
							
								
								
									
										113
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/img2cpp.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										113
									
								
								Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/img2cpp.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,113 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | # Written By Marcio Teixeira 2021 - SynDaver Labs, 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 | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import zlib | ||||||
|  |  | ||||||
|  | class WriteSource: | ||||||
|  |   def __init__(self, mode): | ||||||
|  |     self.values      = [] | ||||||
|  |     self.mode        = mode | ||||||
|  |     self.offset      = 8 | ||||||
|  |     self.byte        = 0 | ||||||
|  |      | ||||||
|  |   def finish_byte(self): | ||||||
|  |     if self.offset != 8: | ||||||
|  |       self.values.append(self.byte) | ||||||
|  |       self.offset = 8 | ||||||
|  |       self.byte   = 0 | ||||||
|  |        | ||||||
|  |   def add_bits_to_byte(self, value, size = 1): | ||||||
|  |     self.offset -= size | ||||||
|  |     self.byte = self.byte | value << self.offset | ||||||
|  |     if self.offset == 0: | ||||||
|  |       self.finish_byte() | ||||||
|  |  | ||||||
|  |   def append_rgb565(self, color): | ||||||
|  |     value = ((color[0] & 0xF8) << 8) + ((color[1] & 0xFC) << 3) + ((color[2] & 0xF8) >> 3) | ||||||
|  |     self.values.append((value & 0x00FF) >> 0); | ||||||
|  |     self.values.append((value & 0xFF00) >> 8); | ||||||
|  |  | ||||||
|  |   def append_rgb332(self, color): | ||||||
|  |     value = (color[0] & 0xE0) + ((color[1] & 0xE0) >> 3) + ((color[2] & 0xC0) >> 6) | ||||||
|  |     self.values.append(value); | ||||||
|  |  | ||||||
|  |   def append_grayscale(self, color, bits): | ||||||
|  |     luminance = int(0.2126 * color[0] + 0.7152 * color[1] + 0.0722 * color[2]) | ||||||
|  |     self.add_bits_to_byte(luminance >> (8 - bits), bits) | ||||||
|  |  | ||||||
|  |   def deflate(self, data): | ||||||
|  |      return zlib.compress(data) | ||||||
|  |  | ||||||
|  |   def add_pixel(self, color): | ||||||
|  |     if self.mode == "l1": | ||||||
|  |       self.append_grayscale(color, 1) | ||||||
|  |     elif self.mode == "l2": | ||||||
|  |       self.append_grayscale(color, 2) | ||||||
|  |     elif self.mode == "l4": | ||||||
|  |       self.append_grayscale(color, 4) | ||||||
|  |     elif self.mode == "l8": | ||||||
|  |       self.append_grayscale(color, 8) | ||||||
|  |     elif self.mode == "rgb565": | ||||||
|  |       self.append_rgb565(color) | ||||||
|  |     elif self.mode == "rgb332": | ||||||
|  |       self.append_rgb332(color) | ||||||
|  |  | ||||||
|  |   def end_row(self, y): | ||||||
|  |     if self.mode in ["l1", "l2", "l3"]: | ||||||
|  |        self.finish_byte() | ||||||
|  |  | ||||||
|  |   def write(self, varname, deflate): | ||||||
|  |     print("Length of uncompressed data: ", len(self.values), file=sys.stderr) | ||||||
|  |     data = bytes(bytearray(self.values)) | ||||||
|  |     if deflate: | ||||||
|  |       data = self.deflate(data) | ||||||
|  |       print("Length of data after compression: ", len(data), file=sys.stderr) | ||||||
|  |     data = bytearray(data) | ||||||
|  |     data = list(map(lambda a: "0x" + format(a, '02x'), data)) | ||||||
|  |     nElements = len(data) | ||||||
|  |     data = ', '.join(data) | ||||||
|  |     data = textwrap.fill(data, 75, initial_indent = '  ', subsequent_indent = '  ') | ||||||
|  |  | ||||||
|  |     print("const unsigned char " + varname + "[" + format(nElements) + "] PROGMEM = {") | ||||||
|  |     print(data) | ||||||
|  |     print("};") | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |   parser = argparse.ArgumentParser(description='Converts a bitmap into a C array') | ||||||
|  |   parser.add_argument("input") | ||||||
|  |   parser.add_argument("-d", "--deflate", action="store_true", help="Packs the data using the deflate algorithm") | ||||||
|  |   parser.add_argument("-m", "--mode", default="l1", help="Mode, can be l1, l2, l4, l8, rgb332 or rgb565") | ||||||
|  |   args = parser.parse_args() | ||||||
|  |  | ||||||
|  |   varname = os.path.splitext(os.path.basename(args.input))[0]; | ||||||
|  |  | ||||||
|  |   writer = WriteSource(args.mode) | ||||||
|  |  | ||||||
|  |   img = Image.open(args.input) | ||||||
|  |   print("Image height: ", img.height, file=sys.stderr) | ||||||
|  |   print("Image width:  ", img.width,  file=sys.stderr) | ||||||
|  |   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(varname, args.deflate) | ||||||
| @@ -190,17 +190,11 @@ bool BedMeshEditScreen::onTouchEnd(uint8_t tag) { | |||||||
| } | } | ||||||
|  |  | ||||||
| void BedMeshEditScreen::show() { | void BedMeshEditScreen::show() { | ||||||
|   // On entry, home if needed and save current mesh |   // On entry, always home (to account for possible Z offset changes) and save current mesh | ||||||
|   if (!ExtUI::isMachineHomed()) { |   SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1")); | ||||||
|     SpinnerDialogBox::enqueueAndWait_P(F("G28\nG29 S1")); |   // 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 { |  | ||||||
|     injectCommands_P(PSTR("G29 S1")); |  | ||||||
|     GOTO_SCREEN(BedMeshEditScreen); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| #endif // FTDI_BED_MESH_EDIT_SCREEN | #endif // FTDI_BED_MESH_EDIT_SCREEN | ||||||
|   | |||||||
| @@ -132,7 +132,6 @@ void BedMeshViewScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI | |||||||
|       mydata.count = GRID_MAX_POINTS; |       mydata.count = GRID_MAX_POINTS; | ||||||
|       break; |       break; | ||||||
|     case ExtUI::G26_START: |     case ExtUI::G26_START: | ||||||
|       GOTO_SCREEN(BedMeshViewScreen); |  | ||||||
|       mydata.message = nullptr; |       mydata.message = nullptr; | ||||||
|       mydata.count = 0; |       mydata.count = 0; | ||||||
|       break; |       break; | ||||||
| @@ -161,7 +160,7 @@ void BedMeshViewScreen::doProbe() { | |||||||
| void BedMeshViewScreen::doMeshValidation() { | void BedMeshViewScreen::doMeshValidation() { | ||||||
|   mydata.count = 0; |   mydata.count = 0; | ||||||
|   GOTO_SCREEN(StatusScreen); |   GOTO_SCREEN(StatusScreen); | ||||||
|   injectCommands_P(PSTR("M75\nG28 O\nM117 Heating...\nG26 R X0 Y0\nG27\nM77")); |   injectCommands_P(PSTR("G28\nM117 Heating...\nG26 R X0 Y0\nG27")); | ||||||
| } | } | ||||||
|  |  | ||||||
| void BedMeshViewScreen::show() { | void BedMeshViewScreen::show() { | ||||||
|   | |||||||
| @@ -83,8 +83,10 @@ void BootScreen::onIdle() { | |||||||
|       if (UIData::animations_enabled()) { |       if (UIData::animations_enabled()) { | ||||||
|         // If there is a startup video in the flash SPI, play |         // If there is a startup video in the flash SPI, play | ||||||
|         // that, otherwise show a static splash screen. |         // that, otherwise show a static splash screen. | ||||||
|         if (!MediaPlayerScreen::playBootMedia()) |         #ifdef FTDI_MEDIA_PLAYER_SCREEN | ||||||
|           showSplashScreen(); |           if (!MediaPlayerScreen::playBootMedia()) | ||||||
|  |         #endif | ||||||
|  |             showSplashScreen(); | ||||||
|       } |       } | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -35,12 +35,15 @@ void ConfirmUserRequestAlertBox::onRedraw(draw_mode_t mode) { | |||||||
| bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { | bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { | ||||||
|   switch (tag) { |   switch (tag) { | ||||||
|     case 1: |     case 1: | ||||||
|       if (ExtUI::isPrintingPaused()) { |       #ifdef FTDI_TUNE_MENU | ||||||
|         // The TuneMenu will call ExtUI::setUserConfirmed() |         if (ExtUI::isPrintingPaused()) { | ||||||
|         GOTO_SCREEN(TuneMenu); |           // The TuneMenu will call ExtUI::setUserConfirmed() | ||||||
|         current_screen.forget(); |           GOTO_SCREEN(TuneMenu); | ||||||
|       } |           current_screen.forget(); | ||||||
|       else { |         } | ||||||
|  |         else | ||||||
|  |       #endif | ||||||
|  |       { | ||||||
|         ExtUI::setUserConfirmed(); |         ExtUI::setUserConfirmed(); | ||||||
|         GOTO_PREVIOUS(); |         GOTO_PREVIOUS(); | ||||||
|       } |       } | ||||||
|   | |||||||
| @@ -83,6 +83,7 @@ void LevelingMenu::onRedraw(draw_mode_t what) { | |||||||
|        .font(font_medium).colors(normal_btn) |        .font(font_medium).colors(normal_btn) | ||||||
|        .enabled(EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)) |        .enabled(EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION)) | ||||||
|        .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS)) |        .tag(2).button(LEVEL_AXIS_POS, GET_TEXT_F(MSG_LEVEL_X_AXIS)) | ||||||
|  |        .enabled(ENABLED(HAS_BED_PROBE)) | ||||||
|        .tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED)) |        .tag(3).button(PROBE_BED_POS, GET_TEXT_F(MSG_PROBE_BED)) | ||||||
|        .enabled(ENABLED(HAS_MESH)) |        .enabled(ENABLED(HAS_MESH)) | ||||||
|        .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)) |        .tag(4).button(SHOW_MESH_POS, GET_TEXT_F(MSG_SHOW_MESH)) | ||||||
| @@ -101,30 +102,32 @@ void LevelingMenu::onRedraw(draw_mode_t what) { | |||||||
|  |  | ||||||
| bool LevelingMenu::onTouchEnd(uint8_t tag) { | bool LevelingMenu::onTouchEnd(uint8_t tag) { | ||||||
|   switch (tag) { |   switch (tag) { | ||||||
|     case 1: GOTO_PREVIOUS();                   break; |     case 1: GOTO_PREVIOUS(); break; | ||||||
|     #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) |     #if EITHER(Z_STEPPER_AUTO_ALIGN,MECHANICAL_GANTRY_CALIBRATION) | ||||||
|     case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; |       case 2: SpinnerDialogBox::enqueueAndWait_P(F("G34")); break; | ||||||
|     #endif |     #endif | ||||||
|     case 3: |     #if ENABLED(HAS_BED_PROBE) | ||||||
|     #ifndef BED_LEVELING_COMMANDS |       case 3: | ||||||
|       #define BED_LEVELING_COMMANDS "G29" |         #ifndef BED_LEVELING_COMMANDS | ||||||
|  |           #define BED_LEVELING_COMMANDS "G29" | ||||||
|  |         #endif | ||||||
|  |         #if ENABLED(AUTO_BED_LEVELING_UBL) | ||||||
|  |           BedMeshViewScreen::doProbe(); | ||||||
|  |         #else | ||||||
|  |           SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); | ||||||
|  |         #endif | ||||||
|  |         break; | ||||||
|     #endif |     #endif | ||||||
|     #if ENABLED(AUTO_BED_LEVELING_UBL) |     #if ENABLED(AUTO_BED_LEVELING_UBL) | ||||||
|       BedMeshViewScreen::doProbe(); |       case 4: BedMeshViewScreen::show(); break; | ||||||
|     #else |       case 5: BedMeshEditScreen::show(); break; | ||||||
|       SpinnerDialogBox::enqueueAndWait_P(F(BED_LEVELING_COMMANDS)); |  | ||||||
|     #endif |  | ||||||
|     break; |  | ||||||
|     #if ENABLED(AUTO_BED_LEVELING_UBL) |  | ||||||
|     case 4: BedMeshViewScreen::show(); break; |  | ||||||
|     case 5: BedMeshEditScreen::show(); break; |  | ||||||
|     #endif |     #endif | ||||||
|     #if ENABLED(G26_MESH_VALIDATION) |     #if ENABLED(G26_MESH_VALIDATION) | ||||||
|     case 6: BedMeshViewScreen::doMeshValidation(); break; |       case 6: BedMeshViewScreen::doMeshValidation(); break; | ||||||
|     #endif |     #endif | ||||||
|     #if ENABLED(BLTOUCH) |     #if ENABLED(BLTOUCH) | ||||||
|     case 7: injectCommands_P(PSTR("M280 P0 S60")); break; |       case 7: injectCommands_P(PSTR("M280 P0 S60")); break; | ||||||
|     case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; |       case 8: SpinnerDialogBox::enqueueAndWait_P(F("M280 P0 S90\nG4 P100\nM280 P0 S120")); break; | ||||||
|     #endif |     #endif | ||||||
|     default: return false; |     default: return false; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -77,8 +77,11 @@ void TuneMenu::onRedraw(draw_mode_t what) { | |||||||
|        .tag(3).button(FIL_CHANGE_POS,  GET_TEXT_F(MSG_FILAMENTCHANGE)) |        .tag(3).button(FIL_CHANGE_POS,  GET_TEXT_F(MSG_FILAMENTCHANGE)) | ||||||
|        .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) |        .enabled(EITHER(LIN_ADVANCE, FILAMENT_RUNOUT_SENSOR)) | ||||||
|        .tag(9).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) |        .tag(9).button(FILAMENT_POS, GET_TEXT_F(MSG_FILAMENT)) | ||||||
|        .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE) || ENABLED(BABYSTEPPING)) |        #if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND | ||||||
|        .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(TERN(BABYSTEPPING, MSG_NUDGE_NOZZLE, MSG_ZPROBE_ZOFFSET))) |          .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_NUDGE_NOZZLE)) | ||||||
|  |        #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) | ||||||
|  |          .tag(4).button(NUDGE_NOZ_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) | ||||||
|  |        #endif | ||||||
|        .tag(5).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) |        .tag(5).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) | ||||||
|        .enabled(sdOrHostPrinting) |        .enabled(sdOrHostPrinting) | ||||||
|        .tag(sdOrHostPaused ? 7 : 6) |        .tag(sdOrHostPaused ? 7 : 6) | ||||||
| @@ -99,11 +102,11 @@ bool TuneMenu::onTouchEnd(uint8_t tag) { | |||||||
|   using namespace Theme; |   using namespace Theme; | ||||||
|   using namespace ExtUI; |   using namespace ExtUI; | ||||||
|   switch (tag) { |   switch (tag) { | ||||||
|     case  1: GOTO_PREVIOUS();                    break; |     case  1: SaveSettingsDialogBox::promptToSaveSettings(); break; | ||||||
|     case  2: GOTO_SCREEN(TemperatureScreen);     break; |     case  2: GOTO_SCREEN(TemperatureScreen);     break; | ||||||
|     case  3: GOTO_SCREEN(ChangeFilamentScreen);  break; |     case  3: GOTO_SCREEN(ChangeFilamentScreen);  break; | ||||||
|     case  4: |     case  4: | ||||||
|       #if ENABLED(BABYSTEPPING) |       #if ENABLED(BABYSTEPPING) && HAS_MULTI_HOTEND | ||||||
|         GOTO_SCREEN(NudgeNozzleScreen); |         GOTO_SCREEN(NudgeNozzleScreen); | ||||||
|       #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) |       #elif BOTH(HAS_LEVELING, HAS_BED_PROBE) | ||||||
|         GOTO_SCREEN(ZOffsetScreen); |         GOTO_SCREEN(ZOffsetScreen); | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ void ZOffsetScreen::onRedraw(draw_mode_t what) { | |||||||
|   w.heading(                  GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); |   w.heading(                  GET_TEXT_F(MSG_ZPROBE_ZOFFSET)); | ||||||
|   w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm()); |   w.color(z_axis).adjuster(4, GET_TEXT_F(MSG_ZPROBE_ZOFFSET), getZOffset_mm()); | ||||||
|   w.increments(); |   w.increments(); | ||||||
|   w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting()); |   w.button(2, GET_TEXT_F(MSG_PROBE_WIZARD), !isPrinting() && !wizardRunning()); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ZOffsetScreen::move(float mm, int16_t steps) { | void ZOffsetScreen::move(float mm, int16_t steps) { | ||||||
|   | |||||||
| @@ -130,7 +130,7 @@ namespace Language_en { | |||||||
|   PROGMEM Language_Str MSG_EEPROM_RESTORED          = u8"Settings restored from backup"; |   PROGMEM Language_Str MSG_EEPROM_RESTORED          = u8"Settings restored from backup"; | ||||||
|   PROGMEM Language_Str MSG_EEPROM_RESET             = u8"Settings restored to default"; |   PROGMEM Language_Str MSG_EEPROM_RESET             = u8"Settings restored to default"; | ||||||
|   PROGMEM Language_Str MSG_EEPROM_SAVED             = u8"Settings saved!"; |   PROGMEM Language_Str MSG_EEPROM_SAVED             = u8"Settings saved!"; | ||||||
|   PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT       = u8"Do you wish to save these settings for next power-on?"; |   PROGMEM Language_Str MSG_EEPROM_SAVE_PROMPT       = u8"Settings applied. Save these settings for next power-on?"; | ||||||
|   PROGMEM Language_Str MSG_EEPROM_RESET_WARNING     = u8"Are you sure? Customizations will be lost."; |   PROGMEM Language_Str MSG_EEPROM_RESET_WARNING     = u8"Are you sure? Customizations will be lost."; | ||||||
|  |  | ||||||
|   PROGMEM Language_Str MSG_PASSCODE_REJECTED        = u8"Wrong passcode!"; |   PROGMEM Language_Str MSG_PASSCODE_REJECTED        = u8"Wrong passcode!"; | ||||||
| @@ -146,7 +146,7 @@ namespace Language_en { | |||||||
|   PROGMEM Language_Str MSG_AXIS_LEVELING            = u8"Axis Leveling"; |   PROGMEM Language_Str MSG_AXIS_LEVELING            = u8"Axis Leveling"; | ||||||
|   PROGMEM Language_Str MSG_PROBE_BED                = u8"Probe Mesh"; |   PROGMEM Language_Str MSG_PROBE_BED                = u8"Probe Mesh"; | ||||||
|   PROGMEM Language_Str MSG_SHOW_MESH                = u8"View Mesh"; |   PROGMEM Language_Str MSG_SHOW_MESH                = u8"View Mesh"; | ||||||
|   PROGMEM Language_Str MSG_PRINT_TEST               = u8"Print Test"; |   PROGMEM Language_Str MSG_PRINT_TEST               = u8"Print Test (PLA)"; | ||||||
|   PROGMEM Language_Str MSG_MOVE_Z_TO_TOP            = u8"Raise Z to Top"; |   PROGMEM Language_Str MSG_MOVE_Z_TO_TOP            = u8"Raise Z to Top"; | ||||||
|  |  | ||||||
|   #if ENABLED(TOUCH_UI_LULZBOT_BIO) |   #if ENABLED(TOUCH_UI_LULZBOT_BIO) | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ extern tiny_timer_t refresh_timer; | |||||||
| #if ENABLED(TOUCH_UI_LULZBOT_BIO) | #if ENABLED(TOUCH_UI_LULZBOT_BIO) | ||||||
|   #include "bioprinter/screens.h" |   #include "bioprinter/screens.h" | ||||||
| #elif ENABLED(TOUCH_UI_COCOA_PRESS) | #elif ENABLED(TOUCH_UI_COCOA_PRESS) | ||||||
|   #include "cocoapress/screens.h" |   #include "cocoa_press/screens.h" | ||||||
| #elif ENABLED(TOUCH_UI_SYNDAVER_LEVEL) | #elif ENABLED(TOUCH_UI_SYNDAVER_LEVEL) | ||||||
|   #include "syndaver_level/screens.h" |   #include "syndaver_level/screens.h" | ||||||
| #else | #else | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ namespace Theme { | |||||||
|     .height       = 23, |     .height       = 23, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   constexpr PROGMEM unsigned char Extruder_Icon[] = { |   constexpr PROGMEM unsigned char Extruder_Icon[69] = { | ||||||
|     0x3F, 0xFF, 0xFC, |     0x3F, 0xFF, 0xFC, | ||||||
|     0x7F, 0xFF, 0xFE, |     0x7F, 0xFF, 0xFE, | ||||||
|     0xC0, 0x00, 0x03, |     0xC0, 0x00, 0x03, | ||||||
| @@ -68,12 +68,12 @@ namespace Theme { | |||||||
|     .filter       = BILINEAR, |     .filter       = BILINEAR, | ||||||
|     .wrapx        = BORDER, |     .wrapx        = BORDER, | ||||||
|     .wrapy        = BORDER, |     .wrapy        = BORDER, | ||||||
|     .RAMG_offset  = 8100, |     .RAMG_offset  = 8069, | ||||||
|     .width        = 32, |     .width        = 32, | ||||||
|     .height       = 23, |     .height       = 23, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   constexpr PROGMEM unsigned char Bed_Heat_Icon[] = { |   constexpr PROGMEM unsigned char Bed_Heat_Icon[92] = { | ||||||
|     0x01, 0x81, 0x81, 0x80, |     0x01, 0x81, 0x81, 0x80, | ||||||
|     0x01, 0x81, 0x81, 0x80, |     0x01, 0x81, 0x81, 0x80, | ||||||
|     0x00, 0xC0, 0xC0, 0xC0, |     0x00, 0xC0, 0xC0, 0xC0, | ||||||
| @@ -105,12 +105,12 @@ namespace Theme { | |||||||
|     .filter       = BILINEAR, |     .filter       = BILINEAR, | ||||||
|     .wrapx        = BORDER, |     .wrapx        = BORDER, | ||||||
|     .wrapy        = BORDER, |     .wrapy        = BORDER, | ||||||
|     .RAMG_offset  = 8300, |     .RAMG_offset  = 8161, | ||||||
|     .width        = 32, |     .width        = 32, | ||||||
|     .height       = 32, |     .height       = 32, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   constexpr PROGMEM unsigned char Fan_Icon[] = { |   constexpr PROGMEM unsigned char Fan_Icon[128] = { | ||||||
|     0xFF, 0xFF, 0xFF, 0xFF, |     0xFF, 0xFF, 0xFF, 0xFF, | ||||||
|     0xFF, 0xFF, 0xFF, 0xFF, |     0xFF, 0xFF, 0xFF, 0xFF, | ||||||
|     0xF8, 0x00, 0x00, 0x1F, |     0xF8, 0x00, 0x00, 0x1F, | ||||||
| @@ -151,12 +151,12 @@ namespace Theme { | |||||||
|     .filter       = BILINEAR, |     .filter       = BILINEAR, | ||||||
|     .wrapx        = BORDER, |     .wrapx        = BORDER, | ||||||
|     .wrapy        = BORDER, |     .wrapy        = BORDER, | ||||||
|     .RAMG_offset  = 9000, |     .RAMG_offset  = 8289, | ||||||
|     .width        = 50, |     .width        = 50, | ||||||
|     .height       = 20, |     .height       = 20, | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   constexpr PROGMEM unsigned char TD_Icon[] = { |   constexpr PROGMEM unsigned char TD_Icon[140] = { | ||||||
|     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,                    // Thumb Drive Widget |     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00,                    // Thumb Drive Widget | ||||||
|     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, |     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, | ||||||
|     0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, |     0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80, | ||||||
| @@ -179,5 +179,55 @@ namespace Theme { | |||||||
|     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00 |     0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00 | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000; |   constexpr PROGMEM bitmap_info_t File_Icon_Info = { | ||||||
|  |     .format       = L1, | ||||||
|  |     .linestride   = 4, | ||||||
|  |     .filter       = BILINEAR, | ||||||
|  |     .wrapx        = BORDER, | ||||||
|  |     .wrapy        = BORDER, | ||||||
|  |     .RAMG_offset  = 8429, | ||||||
|  |     .width        = 25, | ||||||
|  |     .height       = 32, | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   const unsigned char File_Icon[128] PROGMEM = { | ||||||
|  |     0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, | ||||||
|  |     0x40, 0x02, 0x80, 0x00, 0x40, 0x02, 0x40, 0x00, 0x40, 0x02, 0x20, 0x00, | ||||||
|  |     0x40, 0x02, 0x10, 0x00, 0x40, 0x02, 0x08, 0x00, 0x40, 0x02, 0x04, 0x00, | ||||||
|  |     0x40, 0x02, 0x02, 0x00, 0x40, 0x03, 0xFF, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, 0x40, 0x00, 0x01, 0x00, | ||||||
|  |     0x7F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   constexpr PROGMEM bitmap_info_t Clock_Icon_Info = { | ||||||
|  |     .format       = L1, | ||||||
|  |     .linestride   = 4, | ||||||
|  |     .filter       = BILINEAR, | ||||||
|  |     .wrapx        = BORDER, | ||||||
|  |     .wrapy        = BORDER, | ||||||
|  |     .RAMG_offset  = 8557, | ||||||
|  |     .width        = 32, | ||||||
|  |     .height       = 32, | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   const unsigned char Clock_Icon[128] PROGMEM = { | ||||||
|  |     0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x7E, 0x7E, 0x00, | ||||||
|  |     0x00, 0xE0, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x07, 0x01, 0x00, 0xE0, | ||||||
|  |     0x0C, 0x01, 0x80, 0x70, 0x0C, 0x01, 0x80, 0x30, 0x18, 0x01, 0x80, 0x18, | ||||||
|  |     0x30, 0x01, 0x80, 0x08, 0x30, 0x01, 0x80, 0x0C, 0x20, 0x01, 0x80, 0x0C, | ||||||
|  |     0x60, 0x01, 0x80, 0x04, 0x60, 0x01, 0x80, 0x06, 0x60, 0x01, 0x80, 0x06, | ||||||
|  |     0x60, 0x01, 0xFF, 0x06, 0x60, 0x01, 0xFF, 0x06, 0x60, 0x00, 0x00, 0x06, | ||||||
|  |     0x60, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x0C, | ||||||
|  |     0x30, 0x00, 0x00, 0x0C, 0x30, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00, 0x18, | ||||||
|  |     0x0C, 0x00, 0x00, 0x30, 0x0E, 0x00, 0x00, 0x70, 0x07, 0x00, 0x00, 0xE0, | ||||||
|  |     0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x7F, 0xFE, 0x00, | ||||||
|  |     0x00, 0x0F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   constexpr PROGMEM uint32_t UTF8_FONT_OFFSET  = 10000; | ||||||
| }; // namespace Theme | }; // namespace Theme | ||||||
|   | |||||||
| @@ -190,7 +190,11 @@ namespace ExtUI { | |||||||
|     void setHostResponse(const uint8_t); |     void setHostResponse(const uint8_t); | ||||||
|   #endif |   #endif | ||||||
|  |  | ||||||
|   inline void simulateUserClick() { ui.lcd_clicked = true; } |   inline void simulateUserClick() { | ||||||
|  |     #if EITHER(HAS_LCD_MENU, EXTENSIBLE_UI) | ||||||
|  |       ui.lcd_clicked = true; | ||||||
|  |     #endif | ||||||
|  |   } | ||||||
|  |  | ||||||
|   #if ENABLED(PRINTCOUNTER) |   #if ENABLED(PRINTCOUNTER) | ||||||
|     char* getFailedPrints_str(char buffer[21]); |     char* getFailedPrints_str(char buffer[21]); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user