diff --git a/Marlin/AO_FT810_Constants.h b/Marlin/AO_FT810_Constants.h index 545f5beb9..e7904e630 100644 --- a/Marlin/AO_FT810_Constants.h +++ b/Marlin/AO_FT810_Constants.h @@ -66,6 +66,8 @@ namespace FT800 { const uint32_t RAM_PAL = 0x102000; // Palette RAM const uint32_t RAM_REG = 0x102400; // Registers const uint32_t RAM_CMD = 0x108000; // Command Buffer + + const uint32_t RAM_G_SIZE = 256l*1024l; // 256k } namespace FT810 { @@ -77,6 +79,8 @@ namespace FT810 { const uint32_t RAM_DL = 0x300000; // Display List RAM const uint32_t RAM_REG = 0x302000; // Registers const uint32_t RAM_CMD = 0x308000; // Command Buffer + + const uint32_t RAM_G_SIZE = 1024l*1024l; // 1024k } namespace FT800 { @@ -108,7 +112,7 @@ namespace FT800 { const uint32_t REG_ROTATE = 0x102454; // 3 0x00 r/w Screen 90,180, 270 degree rotate const uint32_t REG_OUTBITS = 0x102458; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits const uint32_t REG_DITHER = 0x10245C; // 1 0x01 r/w Output Dither Enable - const uint32_t REG_SWIZZLE = 0x102460; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing + const uint32_t REG_SWIZZLE = 0x102460; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing const uint32_t REG_CSPREAD = 0x102464; // 1 0x01 r/w Output Clock Spreading Enable const uint32_t REG_PCLK_POL = 0x102468; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge const uint32_t REG_PCLK = 0x10246C; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock @@ -117,11 +121,11 @@ namespace FT800 { const uint32_t REG_TAG = 0x102478; // 8 0x00 r Tag Query Result const uint32_t REG_VOL_PB = 0x10247C; // 8 0xFF r/w Audio Playback Volume const uint32_t REG_VOL_SOUND = 0x102480; // 8 0xFF r/w Audio Synthesizer Volume - const uint32_t REG_SOUND = 0x102484; // 16 0x0000 r/w Audio Sound Effect Select - const uint32_t REG_PLAY = 0x102488; // 1 0x00 r/w Audio Start Effect Playback + const uint32_t REG_SOUND = 0x102484; // 16 0x0000 r/w Audio Sound Effect Select + const uint32_t REG_PLAY = 0x102488; // 1 0x00 r/w Audio Start Effect Playback const uint32_t REG_GPIO_DIR = 0x10248C; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output const uint32_t REG_GPIO = 0x102490; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 - const uint32_t REG_INT_FLAGS = 0x102498; // 8 0x00 r Interrupt Flags, Clear by Reading + const uint32_t REG_INT_FLAGS = 0x102498; // 8 0x00 r Interrupt Flags, Clear by Reading const uint32_t REG_INT_EN = 0x10249C; // 1 0x00 r/w Global Interrupt Enable const uint32_t REG_INT_MASK = 0x1024A0; // 8 0xFF r/w Interrupt Enable Mask const uint32_t REG_PLAYBACK_START = 0x1024A4; // 20 0x00000 r/w Audio Playback RAM Start Address @@ -130,14 +134,14 @@ namespace FT800 { const uint32_t REG_PLAYBACK_FREQ = 0x1024B0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) const uint32_t REG_PLAYBACK_FORMAT = 0x1024B4; // 2 0x00 r/w Audio Playback Format const uint32_t REG_PLAYBACK_LOOP = 0x1024B8; // 1 0x00 r/w Audio Playback Loop Enable - const uint32_t REG_PLAYBACK_PLAY = 0x1024BC; // 1 0x00 r Audio Start Playback + const uint32_t REG_PLAYBACK_PLAY = 0x1024BC; // 1 0x00 r Audio Start Playback const uint32_t REG_PWM_HZ = 0x1024C0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) - const uint32_t REG_PWM_DUTY = 0x1024C4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% + const uint32_t REG_PWM_DUTY = 0x1024C4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% const uint32_t REG_MACRO_0 = 0x1024C8; // 32 0x00000000 r/w Display List Macro Command 0 const uint32_t REG_MACRO_1 = 0x1024CC; // 32 0x00000000 r/w Display List Macro Command 1 const uint32_t REG_CMD_READ = 0x1024E4; // 12 0x000 r/w Command Buffer Read Pointer const uint32_t REG_CMD_WRITE = 0x1024E8; // 12 0x000 r/w Command Buffer Write Pointer - const uint32_t REG_CMD_DL = 0x1024EC; // 13 0x0000 r/w Command Display List Offset + const uint32_t REG_CMD_DL = 0x1024EC; // 13 0x0000 r/w Command Display List Offset const uint32_t REG_TOUCH_MODE = 0x1024F0; // 2 0x03 r/w Touch-Screen Sampling Mode const uint32_t REG_TOUCH_ADC_MODE = 0x1024F4; // 1 0x01 r/w Select Single Ended or Differential Sampling const uint32_t REG_TOUCH_CHARGE = 0x1024F8; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks @@ -191,7 +195,7 @@ namespace FT810 { const uint32_t REG_ROTATE = 0x302058; // 3 0x00 r/w Screen 90,180, 270 degree rotate const uint32_t REG_OUTBITS = 0x30205C; // 9 0x1B6 r/w Output Resolution, 3x3x3 Bits const uint32_t REG_DITHER = 0x302060; // 1 0x01 r/w Output Dither Enable - const uint32_t REG_SWIZZLE = 0x302064; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing + const uint32_t REG_SWIZZLE = 0x302064; // 4 0x00 r/w Output RGB Swizzle, Pin Change for PCB Routing const uint32_t REG_CSPREAD = 0x302068; // 1 0x01 r/w Output Clock Spreading Enable const uint32_t REG_PCLK_POL = 0x30206C; // 1 0x00 r/w PCLK Polarity: 0 = Rising Edge, 1 = Falling Edge const uint32_t REG_PCLK = 0x302070; // 8 0x00 r/w PCLK Frequency Divider, 0 = Disable Clock @@ -200,15 +204,15 @@ namespace FT810 { const uint32_t REG_TAG = 0x30207C; // 8 0x00 r Tag Query Result const uint32_t REG_VOL_PB = 0x302080; // 8 0xFF r/w Audio Playback Volume const uint32_t REG_VOL_SOUND = 0x302084; // 8 0xFF r/w Audio Synthesizer Volume - const uint32_t REG_SOUND = 0x302088; // 16 0x0000 r/w Audio Sound Effect Select - const uint32_t REG_PLAY = 0x30208C; // 1 0x00 r/w Audio Start Effect Playback + const uint32_t REG_SOUND = 0x302088; // 16 0x0000 r/w Audio Sound Effect Select + const uint32_t REG_PLAY = 0x30208C; // 1 0x00 r/w Audio Start Effect Playback const uint32_t REG_GPIO_DIR = 0x302090; // 8 0x80 r/w GPIO Pin Direction: 0 = Input , 1 = Output const uint32_t REG_GPIO = 0x302094; // 8 0x00 r/w GPIO Pin Values for 0, 1, 7 Drive Strength 2, 3, 4, 5, 6 const uint32_t REG_GPIOX_DIR = 0x302098; // 16 0x8000 r/w Extended GPIO Pin Direction const uint32_t REG_GPIOX = 0x30209C; // 16 0x0080 r/w Extended GPIO Pin Values // Reserved Addr 0x3020A0 // Reserved Addr 0x3020A4 - const uint32_t REG_INT_FLAGS = 0x3020A8; // 8 0x00 r Interrupt Flags, Clear by Reading + const uint32_t REG_INT_FLAGS = 0x3020A8; // 8 0x00 r Interrupt Flags, Clear by Reading const uint32_t REG_INT_EN = 0x3020AC; // 1 0x00 r/w Global Interrupt Enable const uint32_t REG_INT_MASK = 0x3020B0; // 8 0xFF r/w Interrupt Enable Mask const uint32_t REG_PLAYBACK_START = 0x3020B4; // 20 0x00000 r/w Audio Playback RAM Start Address @@ -217,9 +221,9 @@ namespace FT810 { const uint32_t REG_PLAYBACK_FREQ = 0x3020C0; // 16 0x1F40 r/w Audio Playback Frequency (Hz) const uint32_t REG_PLAYBACK_FORMAT = 0x3020C4; // 2 0x00 r/w Audio Playback Format const uint32_t REG_PLAYBACK_LOOP = 0x3020C8; // 1 0x00 r/w Audio Playback Loop Enable - const uint32_t REG_PLAYBACK_PLAY = 0x3020CC; // 1 0x00 r Audio Start Playback + const uint32_t REG_PLAYBACK_PLAY = 0x3020CC; // 1 0x00 r Audio Start Playback const uint32_t REG_PWM_HZ = 0x3020D0; // 14 0x00FA r/w Backlight PWM Frequency (Hz) - const uint32_t REG_PWM_DUTY = 0x3020D4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% + const uint32_t REG_PWM_DUTY = 0x3020D4; // 8 0x80 r/w Backlight PWM Duty Cycle: 0 = 0%, 128 = 100% const uint32_t REG_MACRO_0 = 0x3020D8; // 32 0x00000000 r/w Display List Macro Command 0 const uint32_t REG_MACRO_1 = 0x3020DC; // 32 0x00000000 r/w Display List Macro Command 1 // Reserved Addr 0x3020E0 @@ -230,7 +234,7 @@ namespace FT810 { // Reserved Addr 0x3020F4 const uint32_t REG_CMD_READ = 0x3020F8; // 12 0x000 r/w Command Buffer Read Pointer const uint32_t REG_CMD_WRITE = 0x3020FC; // 12 0x000 r/w Command Buffer Write Pointer - const uint32_t REG_CMD_DL = 0x302100; // 13 0x0000 r/w Command Display List Offset + const uint32_t REG_CMD_DL = 0x302100; // 13 0x0000 r/w Command Display List Offset const uint32_t REG_TOUCH_MODE = 0x302104; // 2 0x03 r/w Touch-Screen Sampling Mode const uint32_t REG_TOUCH_ADC_MODE = 0x302108; // 1 0x01 r/w Select Single Ended or Differential Sampling const uint32_t REG_TOUCH_CHARGE = 0x30210C; // 16 0x1770 r/w Touch Screen Charge Time, n x 6 Clocks @@ -296,18 +300,18 @@ namespace FTDI { // GLOBAL LCD REGISTER SET VALUES FOR WQVGA 480x272 DISPLAY -/* +/* * Settings for the Aleph Objects Color LCD User Interface 4.3" (Prototype) 480x272, SPI, FT810 (HDA430T-6S-WV) * Haoyu Electronics, 4.3" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY43B) * Haoyu Electronics, 5" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY50B) * 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) - * + * * http://www.hotmcu.com/43-graphical-lcd-touchscreen-480x272-spi-ft800-p-111.html?cPath=6_16 * http://www.hotmcu.com/5-graphical-lcd-touchscreen-480x272-spi-ft800-p-124.html?cPath=6_16 * http://www.4dsystems.com.au/product/4DLCD_FT843/ - * + * * Datasheet: - * + * * http://www.hantronix.com/files/data/1278363262430-3.pdf * http://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf * http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf @@ -340,13 +344,13 @@ namespace FTDI_LCD_480x272 { // GLOBAL LCD REGISTER SET VALUES FOR 800x480 DISPLAY -/* +/* * Settings for the Haoyu Electronics, 5" Graphical LCD Touchscreen, 800x480, SPI, FT810 - * + * * http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html - * + * * Datasheet: - * + * * http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf * */ diff --git a/Marlin/AO_FT810_Functions.h b/Marlin/AO_FT810_Functions.h index afe2eb32d..480fdb854 100644 --- a/Marlin/AO_FT810_Functions.h +++ b/Marlin/AO_FT810_Functions.h @@ -98,19 +98,22 @@ * 8100 Bed Heat Bitmap * * 8200 Fan Bitmap * * 8300 Thumb Drive Symbol Bitmap * - * 3E000 Static DL Space (FT800) * - * FE000 Static DL Space (FT810) * + * 35000 Static DL Space (FT800) * + * F5000 Static DL Space (FT810) * **************************************************/ #ifndef _AO_FT810_FUNC_H #define _AO_FT810_FUNC_H #if defined(IS_FT800) - #define DL_CACHE_START 0x03E000 + #define DL_CACHE_START 0x035000 #else - #define DL_CACHE_START 0x0FE000 + #define DL_CACHE_START 0x0F5000 #endif +// Uncomment the following to disable the DL caching mechanism +//#define DL_CACHE_DISABLED + #if defined(LCD_800x480) using namespace FTDI_LCD_800x480; #else @@ -163,21 +166,23 @@ class CLCD { static uint32_t getRegCmdRead(); #if defined(IS_FT800) - uint32_t command_write_ptr; + static uint32_t command_write_ptr; template void _write_unaligned(T data, uint16_t len); #else uint32_t getRegCmdBSpace(); #endif - public: + void Cmd_Start(void); + public: template void write(T data, uint16_t len); public: - static void Reset (void); - static bool Is_Idle(); - static void Wait_Until_Idle(); + CommandFifo() {Cmd_Start();} + + static void Cmd_Reset (void); + static bool Cmd_Is_Idle(); + static void Cmd_Wait_Until_Idle(); - void Cmd_Start(void); void Cmd_Execute(void); void Cmd (uint32_t cmd32); @@ -365,7 +370,7 @@ void CLCD::Init (void) { Serial.println(Device_ID, HEX); #endif } else { - #if defined (SERIAL_PROTOCOLLNPAIR) + #if defined (SERIAL_PROTOCOLLNPGM) SERIAL_PROTOCOLLNPGM("Device is correct "); #else Serial.println(F("Device is correct ")); @@ -427,7 +432,7 @@ void CLCD::Init (void) { Enable(); // Turns on Clock by setting PCLK Register to 5 delay(50); - CommandFifo::Reset(); + CommandFifo::Cmd_Reset(); delay(50); // Set Initial Values for Touch Transform Registers @@ -442,6 +447,10 @@ void CLCD::Init (void) { /******************* FT800/810 Graphic Commands *********************************/ +#if defined(IS_FT800) +uint32_t CLCD::CommandFifo::command_write_ptr = 0xFFFFFFFFul; +#endif + inline uint32_t CLCD::pack_rgb(uint8_t r, uint8_t g, uint8_t b) { return (uint32_t(r) << 16) | (uint32_t(g) << 8) | uint32_t(b); } @@ -700,35 +709,75 @@ void CLCD::CommandFifo::Cmd_Append (uint32_t ptr, uint32_t size) * } */ -uint16_t CLCD::DLCache::dl_free = DL_CACHE_START; +uint16_t CLCD::DLCache::dl_free = 0; bool CLCD::DLCache::hasData() { - return dl_addr != 0; + return dl_size != 0; } void CLCD::DLCache::store() { - while(!CommandFifo::Is_Idle()); + #if !defined(DL_CACHE_DISABLED) + CLCD::CommandFifo cmd; - dl_size = Mem_Read32(REG_CMD_DL) & 0x07FF; + // Execute any commands already in the FIFO + cmd.Cmd_Execute(); + cmd.Cmd_Wait_Until_Idle(); + + // Figure out how long the display list is + dl_size = Mem_Read32(REG_CMD_DL) & 0x1FFF; dl_addr = dl_free; - if((dl_addr + dl_size) > (1024*1024)) { + if((dl_addr + dl_size) > RAM_G_SIZE) { // Not enough memory to cache the display list. dl_addr = 0; + dl_size = 0; + #if defined(UI_FRAMEWORK_DEBUG) + #if defined (SERIAL_PROTOCOLLNPAIR) + SERIAL_PROTOCOLLNPAIR("Not enough space in GRAM to cache display list, free space: ", RAM_G_SIZE - dl_free); + #else + Serial.print(F("Not enough space in GRAM to cache display list, free space:")); + Serial.println(RAM_G_SIZE - dl_free); + #endif + #endif } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd_Mem_Cpy(RAM_G + dl_addr, RAM_DL, dl_size); + #if defined(UI_FRAMEWORK_DEBUG) + #if defined (SERIAL_PROTOCOLLNPAIR) + SERIAL_PROTOCOLPAIR("Saving DL to RAMG cache, bytes: ", dl_size); + SERIAL_PROTOCOLPAIR(" (Free space: ", RAM_G_SIZE - dl_free); + SERIAL_PROTOCOLLNPGM(")"); + #else + Serial.print(F("Saving DL to RAMG cache, bytes: ")); + Serial.println(dl_size); + Serial.print(F(" (Free space: ")); + Serial.println(RAM_G_SIZE - dl_free); + Serial.print(F(")")); + #endif + #endif + cmd.Cmd_Mem_Cpy(DL_CACHE_START + dl_addr, RAM_DL, dl_size); cmd.Cmd_Execute(); dl_free += dl_size; } + #endif } void CLCD::DLCache::append() { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd_Append(RAM_G + dl_addr, dl_size); - cmd.Cmd_Execute(); + cmd.Cmd_Append(DL_CACHE_START + dl_addr, dl_size); + #if defined(UI_FRAMEWORK_DEBUG) + cmd.Cmd_Execute(); + cmd.Cmd_Wait_Until_Idle(); + #if defined (SERIAL_PROTOCOLLNPAIR) + SERIAL_PROTOCOLPAIR("Appending to DL from RAMG cache, bytes: ", dl_size); + SERIAL_PROTOCOLPAIR(" (REG_CMD_DL: ", Mem_Read32(REG_CMD_DL)); + SERIAL_PROTOCOLLNPGM(")"); + #else + Serial.print(F("Appending to DL from RAMG cache, bytes: ")); + Serial.print(dl_size); + Serial.print(" (REG_CMD_DL: "); + Serial.print(Mem_Read32(REG_CMD_DL)); + Serial.println(")"); + #endif + #endif } #endif // _AO_FT810_FUNC_H diff --git a/Marlin/AO_FT810_SPI.h b/Marlin/AO_FT810_SPI.h index b2c67adfe..20a0ea267 100644 --- a/Marlin/AO_FT810_SPI.h +++ b/Marlin/AO_FT810_SPI.h @@ -256,28 +256,45 @@ uint32_t CLCD::CommandFifo::getRegCmdRead() { return Mem_Read32(REG_CMD_READ) & 0x0FFF; } -bool CLCD::CommandFifo::Is_Idle() { +bool CLCD::CommandFifo::Cmd_Is_Idle() { return getRegCmdRead() == getRegCmdWrite(); } -void CLCD::CommandFifo::Wait_Until_Idle() { +void CLCD::CommandFifo::Cmd_Wait_Until_Idle() { + #if defined(UI_FRAMEWORK_DEBUG) + const uint32_t startTime = millis(); + #endif do { - } while(!Is_Idle()); + #if defined(UI_FRAMEWORK_DEBUG) + if(millis() - startTime > 3) { + #if defined (SERIAL_PROTOCOLLNPGM) + SERIAL_PROTOCOLLNPGM("Timeout on CommandFifo::Wait_Until_Idle()"); + #else + Serial.println(F("Timeout on CommandFifo::Wait_Until_Idle()")); + #endif + break; + } + #endif + } while(!Cmd_Is_Idle()); } #if defined(IS_FT800) -void CLCD::CommandFifo::Start() { - command_write_ptr = getRegCmdWrite(); +void CLCD::CommandFifo::Cmd_Start() { + if(command_write_ptr == 0xFFFFFFFFul) { + command_write_ptr = getRegCmdWrite(); + } } -void CLCD::CommandFifo::Execute() { - Mem_Write32(REG_CMD_WRITE, command_write_ptr); +void CLCD::CommandFifo::Cmd_Execute() { + if(command_write_ptr != 0xFFFFFFFFul) { + Mem_Write32(REG_CMD_WRITE, command_write_ptr); + } } -void CLCD::CommandFifo::Reset() { +void CLCD::CommandFifo::Cmd_Reset() { Mem_Write32(REG_CMD_WRITE, 0x00000000); Mem_Write32(REG_CMD_READ, 0x00000000); - command_write_ptr = 0; + command_write_ptr = 0xFFFFFFFFul; }; template void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) { @@ -285,6 +302,16 @@ template void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len uint32_t bytes_tail, bytes_head; uint32_t command_read_ptr; + #if defined(UI_FRAMEWORK_DEBUG) + if(command_write_ptr == 0xFFFFFFFFul) { + #if defined (SERIAL_PROTOCOLLNPGM) + SERIAL_PROTOCOLLNPGM("Attempt to write to FIFO before CommandFifo::Cmd_Start()."); + #else + Serial.println(F("Attempt to write to FIFO before CommandFifo::Cmd_Start().")); + #endif + } + #endif + /* Wait until there is enough space in the circular buffer for the transfer */ do { command_read_ptr = getRegCmdRead(); @@ -337,7 +364,7 @@ void CLCD::CommandFifo::Cmd_Start() { void CLCD::CommandFifo::Cmd_Execute() { } -void CLCD::CommandFifo::Reset() { +void CLCD::CommandFifo::Cmd_Reset() { Mem_Write32(REG_CMD_WRITE, 0x00000000); Mem_Write32(REG_CMD_READ, 0x00000000); }; diff --git a/Marlin/AO_FT810_UI_Bitmaps.h b/Marlin/AO_FT810_UI_Bitmaps.h index 11aab1532..98766675f 100644 --- a/Marlin/AO_FT810_UI_Bitmaps.h +++ b/Marlin/AO_FT810_UI_Bitmaps.h @@ -19,14 +19,6 @@ * location: . * ****************************************************************************/ - -// Colors RGB332 - -#define COLOR0 0x00 // Black -#define COLOR1 0x49 // Gray -#define COLOR2 0x7C // Yellow Green -#define COLOR3 0xFF // White - // L1 Font Data for Widgets const PROGMEM CLCD::bitmap_info_t Extruder_Icon_Info = { diff --git a/Marlin/AO_FT810_UI_Screens.h b/Marlin/AO_FT810_UI_Screens.h index 291b961d5..e73559953 100644 --- a/Marlin/AO_FT810_UI_Screens.h +++ b/Marlin/AO_FT810_UI_Screens.h @@ -46,10 +46,17 @@ static float marlin_z_offset = 0.150; // Margin defines the margin (in pixels) on each side of a button in // the layout +#if defined(LCD_800x480) #define MARGIN_L 5 #define MARGIN_R 5 #define MARGIN_T 5 #define MARGIN_B 5 +#else +#define MARGIN_L 3 +#define MARGIN_R 3 +#define MARGIN_T 3 +#define MARGIN_B 3 +#endif // EDGE_R adds some black space on the right edge of the display // This shifts some of the screens left to visually center them. @@ -82,8 +89,8 @@ static float marlin_z_offset = 0.150; #define BTX cmd.Cmd_Draw_Button_Text #define BTI cmd.Cmd_Draw_Button_Icon #define BTN_TAG(t) cmd.Cmd_Set_Tag(t); -#define RGB(rgb) cmd.Cmd_Set_Foreground_Color(Theme::rgb); -#define TOGGLE(val) cmd.Cmd_Set_Foreground_Color(val ? Theme::toggle_on : Theme::toggle_off); +#define RGB(rgb) cmd.Cmd_Set_Foreground_Color(rgb); +#define THEME(color) cmd.Cmd_Set_Foreground_Color(Theme::color); #define FONT_SML Theme::font_small #define FONT_MED Theme::font_medium @@ -110,6 +117,17 @@ class AboutScreen : public UIScreen { }; class StatusScreen : public UIScreen { + private: + static void static_axis_position(); + static void static_temperature(); + static void static_progress(); + static void static_interaction_buttons(); + + static void dynamic_axis_position(); + static void dynamic_temperature(); + static void dynamic_progress(); + static void dynamic_status_message(); + public: static void onRefresh(); static void onStartup(); @@ -143,11 +161,30 @@ class AdvancedSettingsScreen : public UIScreen { }; class ValueAdjusters : public UIScreen { + private: + static uint8_t increment; + static void draw_increment_btn(const uint8_t tag, uint8_t decimals); protected: - static float increment; - static void static_heading(progmem_str heading); - static void static_value(int line, progmem_str value); - static void dynamic_value(int line, float value, progmem_str units); + struct heading_t { + const char *label; + uint8_t decimals; + + void static_parts() const; + void dynamic_parts() const; + }; + + struct adjuster_t { + uint8_t line; + const char *label; + const char *units; + uint32_t color; + uint8_t decimals; + + void static_parts() const; + void dynamic_parts(float value) const; + }; + + static float getIncrement(); public: static void onTouchStart(uint8_t tag); }; @@ -256,12 +293,13 @@ namespace Theme { const int16_t font_small = 27; const int16_t font_medium = 28; const int16_t font_large = 28; + const float icon_scale = 0.7; #else - const int16_t font_small = 28; - const int16_t font_medium = 29; + const int16_t font_small = 27; + const int16_t font_medium = 28; const int16_t font_large = 30; + const float icon_scale = 0.6; #endif - const float icon_scale = 0.7; #endif }; @@ -269,15 +307,13 @@ namespace Theme { void BootScreen::onRefresh() { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(CMD_DLSTART); cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear(1,1,1); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); cmd.Cmd_Execute(); - - cmd.Wait_Until_Idle(); + cmd.Cmd_Wait_Until_Idle(); CLCD::Turn_On_Backlight(); } @@ -288,7 +324,6 @@ void BootScreen::onIdle() { /******************************** ABOUT SCREEN ****************************/ - void AboutScreen::onEntry() { draw(false); playChime(); @@ -301,7 +336,6 @@ void AboutScreen::onRefresh() { void AboutScreen::draw(bool showOkay) { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(CMD_DLSTART); cmd.Cmd_Clear_Color(Theme::about_bg); cmd.Cmd_Clear(1,1,1); @@ -309,11 +343,12 @@ void AboutScreen::draw(bool showOkay) { #define GRID_COLS 4 #define GRID_ROWS 6 - BTX( BTN_POS(1,2), BTN_SIZE(4,1), F("Color LCD Interface"), FONT_LRG); - BTN_TAG(2) BTX( BTN_POS(1,3), BTN_SIZE(4,1), F("(c) 2018 Aleph Objects, Inc."), FONT_LRG); + BTX( BTN_POS(1,2), BTN_SIZE(4,1), F("Color LCD Interface"), FONT_LRG); + BTN_TAG(2) + BTX( BTN_POS(1,3), BTN_SIZE(4,1), F("(c) 2018 Aleph Objects, Inc."), FONT_LRG); if(showOkay) { - BTN_TAG(1) RGB(about_btn) BTN( BTN_POS(2,5), BTN_SIZE(2,1), F("Okay"), MENU_BTN_STYLE); + BTN_TAG(1) THEME(about_btn) BTN( BTN_POS(2,5), BTN_SIZE(2,1), F("Okay"), MENU_BTN_STYLE); } cmd.Cmd(DL_DISPLAY); @@ -350,229 +385,287 @@ void AboutScreen::playChime() { } /*********************************** STATUS SCREEN ******************************/ +#if defined(LCD_PORTRAIT) + #define GRID_ROWS 9 + #define GRID_COLS 3 +#else + #define GRID_ROWS 8 + #define GRID_COLS 3 +#endif -void StatusScreen::onStartup() { - // Load USB Thumb Drive Bitmap - CLCD::Flash_Write_RGB332_Bitmap(TD_Icon_Info.RAMG_addr, TD_Icon, sizeof(TD_Icon)); +void StatusScreen::static_axis_position() { + CLCD::CommandFifo cmd; - // Load Extruder Bitmap - CLCD::Flash_Write_RGB332_Bitmap(Extruder_Icon_Info.RAMG_addr, Extruder_Icon, sizeof(Extruder_Icon)); + #if defined(LCD_PORTRAIT) + THEME(axis_label) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); + THEME(axis_label) BTN( BTN_POS(1,6), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); + THEME(axis_label) BTN( BTN_POS(1,7), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); + BTX( BTN_POS(1,5), BTN_SIZE(1,1), F("X"), FONT_SML); + BTX( BTN_POS(1,6), BTN_SIZE(1,1), F("Y"), FONT_SML); + BTX( BTN_POS(1,7), BTN_SIZE(1,1), F("Z"), FONT_SML); + THEME(x_axis) BTN( BTN_POS(2,5), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); + THEME(y_axis) BTN( BTN_POS(2,6), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); + THEME(z_axis) BTN( BTN_POS(2,7), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); + #else + THEME(axis_label) BTN( BTN_POS(1,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); + THEME(axis_label) BTN( BTN_POS(2,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); + THEME(axis_label) BTN( BTN_POS(3,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); + BTX( BTN_POS(1,5), BTN_SIZE(1,1), F("X"), FONT_SML); + BTX( BTN_POS(2,5), BTN_SIZE(1,1), F("Y"), FONT_SML); + BTX( BTN_POS(3,5), BTN_SIZE(1,1), F("Z"), FONT_SML); + THEME(x_axis) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); + THEME(y_axis) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); + THEME(z_axis) BTN( BTN_POS(3,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); + #endif +} - // Load Bed Heat Bitmap - CLCD::Flash_Write_RGB332_Bitmap(Bed_Heat_Icon_Info.RAMG_addr, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); +void StatusScreen::dynamic_axis_position() { + CLCD::CommandFifo cmd; - // Load Fan Percent Bitmap - CLCD::Flash_Write_RGB332_Bitmap(Fan_Icon_Info.RAMG_addr, Fan_Icon, sizeof(Fan_Icon)); -} + char x_str[15]; + char y_str[15]; + char z_str[15]; -void StatusScreen::onRefresh() { - static CLCD::DLCache dlcache; + dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::X), 5, 1, x_str); + dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Y), 5, 1, y_str); + dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Z), 5, 1, z_str); - if(dlcache.hasData()) { - dlcache.append(); - } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - cmd.Cmd_Clear_Color(Theme::background); - cmd.Cmd_Clear(1,1,1); + strcat_P(x_str, PSTR(" mm")); + strcat_P(y_str, PSTR(" mm")); + strcat_P(z_str, PSTR(" mm")); - #if defined(LCD_PORTRAIT) - #define GRID_ROWS 9 - #else - #define GRID_ROWS 8 - #endif + #if defined(LCD_PORTRAIT) + BTX( BTN_POS(2,5), BTN_SIZE(2,1), x_str, FONT_MED); + BTX( BTN_POS(2,6), BTN_SIZE(2,1), y_str, FONT_MED); + BTX( BTN_POS(2,7), BTN_SIZE(2,1), z_str, FONT_MED); + #else + BTX( BTN_POS(1,6), BTN_SIZE(1,1), x_str, FONT_MED); + BTX( BTN_POS(2,6), BTN_SIZE(1,1), y_str, FONT_MED); + BTX( BTN_POS(3,6), BTN_SIZE(1,1), z_str, FONT_MED); + #endif - BTN_TAG(0) - #if defined(LCD_PORTRAIT) - #define GRID_COLS 8 - RGB(temp) BTN( BTN_POS(1,1), BTN_SIZE(4,2), F(""), FONT_SML, OPT_FLAT); - RGB(temp) BTN( BTN_POS(1,1), BTN_SIZE(8,1), F(""), FONT_SML, OPT_FLAT); - RGB(fan_speed) BTN( BTN_POS(5,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - RGB(progress) BTN( BTN_POS(1,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - RGB(progress) BTN( BTN_POS(5,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - #else - #define GRID_COLS 12 - RGB(temp) BTN( BTN_POS(1,1), BTN_SIZE(4,2), F(""), FONT_SML, OPT_FLAT); - RGB(temp) BTN( BTN_POS(1,1), BTN_SIZE(8,1), F(""), FONT_SML, OPT_FLAT); - RGB(fan_speed) BTN( BTN_POS(5,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - RGB(progress) BTN( BTN_POS(9,1), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - RGB(progress) BTN( BTN_POS(9,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); - #endif + //#define MARGIN_T 5 +} - #if defined(LCD_PORTRAIT) - #define GRID_COLS 3 - RGB(axis_label) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); - RGB(axis_label) BTN( BTN_POS(1,6), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); - RGB(axis_label) BTN( BTN_POS(1,7), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); - BTX( BTN_POS(1,5), BTN_SIZE(1,1), F("X"), FONT_SML); - BTX( BTN_POS(1,6), BTN_SIZE(1,1), F("Y"), FONT_SML); - BTX( BTN_POS(1,7), BTN_SIZE(1,1), F("Z"), FONT_SML); - RGB(x_axis) BTN( BTN_POS(2,5), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); - RGB(y_axis) BTN( BTN_POS(2,6), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); - RGB(z_axis) BTN( BTN_POS(2,7), BTN_SIZE(2,1), F(""), FONT_MED, OPT_FLAT); - #else - #define GRID_COLS 3 - #define MARGIN_T 10 - RGB(axis_label) BTN( BTN_POS(1,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); - RGB(axis_label) BTN( BTN_POS(2,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); - RGB(axis_label) BTN( BTN_POS(3,5), BTN_SIZE(1,2), F(""), FONT_LRG, OPT_FLAT); - BTX( BTN_POS(1,5), BTN_SIZE(1,1), F("X"), FONT_SML); - BTX( BTN_POS(2,5), BTN_SIZE(1,1), F("Y"), FONT_SML); - BTX( BTN_POS(3,5), BTN_SIZE(1,1), F("Z"), FONT_SML); - #define MARGIN_T 0 - RGB(x_axis) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); - RGB(y_axis) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); - RGB(z_axis) BTN( BTN_POS(3,6), BTN_SIZE(1,1), F(""), FONT_MED, OPT_FLAT); - #define MARGIN_T 5 - #endif +#if defined(LCD_PORTRAIT) + #define GRID_COLS 8 +#else + #define GRID_COLS 12 +#endif - #define GRID_COLS 4 - #if defined(LCD_PORTRAIT) - BTN_TAG(1) RGB(stop_btn) BTN( BTN_POS(1,8), BTN_SIZE(4,1), F("STOP"), MENU_BTN_STYLE); - BTN_TAG(3) RGB(navi_btn) BTN( BTN_POS(1,9), BTN_SIZE(2,1), F(""), MENU_BTN_STYLE); - BTN_TAG(4) RGB(navi_btn) BTN( BTN_POS(3,9), BTN_SIZE(2,1), F("MENU"), MENU_BTN_STYLE); - #else - BTN_TAG(1) RGB(stop_btn) BTN( BTN_POS(1,7), BTN_SIZE(2,2), F("STOP"), MENU_BTN_STYLE); - BTN_TAG(3) RGB(navi_btn) BTN( BTN_POS(3,7), BTN_SIZE(1,2), F(""), MENU_BTN_STYLE); - BTN_TAG(4) RGB(navi_btn) BTN( BTN_POS(4,7), BTN_SIZE(1,2), F("MENU"), MENU_BTN_STYLE); - #endif +void StatusScreen::static_temperature() { + CLCD::CommandFifo cmd; - // Draw Thumb Drive Bitmap on USB Button + BTN_TAG(0) + #if defined(LCD_PORTRAIT) + THEME(temp) BTN( BTN_POS(1,1), BTN_SIZE(4,2), F(""), FONT_SML, OPT_FLAT); + THEME(temp) BTN( BTN_POS(1,1), BTN_SIZE(8,1), F(""), FONT_SML, OPT_FLAT); + THEME(fan_speed) BTN( BTN_POS(5,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(1,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(5,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + #else + THEME(temp) BTN( BTN_POS(1,1), BTN_SIZE(4,2), F(""), FONT_SML, OPT_FLAT); + THEME(temp) BTN( BTN_POS(1,1), BTN_SIZE(8,1), F(""), FONT_SML, OPT_FLAT); + THEME(fan_speed) BTN( BTN_POS(5,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(9,1), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(9,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + #endif - cmd.Cmd_Bitmap_Source(TD_Icon_Info); - cmd.Cmd_Bitmap_Layout(TD_Icon_Info); - cmd.Cmd_Bitmap_Size (TD_Icon_Info); + // Draw Extruder Bitmap on Extruder Temperature Button - BTN_TAG(3) - #if defined(LCD_PORTRAIT) - BTI(BTN_POS(1,9), BTN_SIZE(2,1), TD_Icon_Info, Theme::icon_scale); - #else - BTI(BTN_POS(3,7), BTN_SIZE(1,2), TD_Icon_Info, Theme::icon_scale); - #endif + cmd.Cmd_Bitmap_Source(Extruder_Icon_Info); + cmd.Cmd_Bitmap_Layout(Extruder_Icon_Info); + cmd.Cmd_Bitmap_Size (Extruder_Icon_Info); - #if defined(LCD_PORTRAIT) - #define GRID_COLS 8 - #else - #define GRID_COLS 12 - #endif + BTN_TAG(0) + BTI(BTN_POS(1,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale); + BTI(BTN_POS(5,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale); - // Draw Extruder Bitmap on Extruder Temperature Button + // Draw Bed Heat Bitmap on Bed Heat Button + cmd.Cmd_Bitmap_Source(Bed_Heat_Icon_Info); + cmd.Cmd_Bitmap_Layout(Bed_Heat_Icon_Info); + cmd.Cmd_Bitmap_Size (Bed_Heat_Icon_Info); - cmd.Cmd_Bitmap_Source(Extruder_Icon_Info); - cmd.Cmd_Bitmap_Layout(Extruder_Icon_Info); - cmd.Cmd_Bitmap_Size (Extruder_Icon_Info); + BTN_TAG(0) + BTI(BTN_POS(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, Theme::icon_scale); - BTN_TAG(0) - BTI(BTN_POS(1,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale); - BTI(BTN_POS(5,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale); + // Draw Fan Percent Bitmap on Bed Heat Button - #if EXTRUDERS == 1 - BTX( BTN_POS(6,1), BTN_SIZE(2,1), F("-"), FONT_MED); - #endif + cmd.Cmd_Bitmap_Source(Fan_Icon_Info); + cmd.Cmd_Bitmap_Layout(Fan_Icon_Info); + cmd.Cmd_Bitmap_Size (Fan_Icon_Info); - // Draw Bed Heat Bitmap on Bed Heat Button - cmd.Cmd_Bitmap_Source(Bed_Heat_Icon_Info); - cmd.Cmd_Bitmap_Layout(Bed_Heat_Icon_Info); - cmd.Cmd_Bitmap_Size (Bed_Heat_Icon_Info); + BTN_TAG(0) + BTI(BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, Theme::icon_scale); +} - BTN_TAG(0) - BTI(BTN_POS(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, Theme::icon_scale); +#define ROUND(val) uint16_t((val)+0.5) - // Draw Fan Percent Bitmap on Bed Heat Button +void StatusScreen::dynamic_temperature() { + CLCD::CommandFifo cmd; - cmd.Cmd_Bitmap_Source(Fan_Icon_Info); - cmd.Cmd_Bitmap_Layout(Fan_Icon_Info); - cmd.Cmd_Bitmap_Size (Fan_Icon_Info); + char e0_str[15]; + char e1_str[15]; + char bed_str[15]; + char fan_str[15]; + + sprintf_P( + fan_str, + PSTR("%-3d %%"), + Marlin_LCD_API::getFan_percent(0) + ); + + sprintf_P( + bed_str, + PSTR("%-3d / %-3d " ), + ROUND(Marlin_LCD_API::getActualTemp_celsius(0)), + ROUND(Marlin_LCD_API::getTargetTemp_celsius(0)) + ); + + sprintf_P( + e0_str, + PSTR("%-3d / %-3d C"), + ROUND(Marlin_LCD_API::getActualTemp_celsius(1)), + ROUND(Marlin_LCD_API::getTargetTemp_celsius(1)) + ); - BTN_TAG(0) - BTI(BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, Theme::icon_scale); + #if EXTRUDERS == 2 + sprintf_P( + e1_str, + PSTR("%-3d / %-3d C"), + ROUND(Marlin_LCD_API::getActualTemp_celsius(2)), + ROUND(Marlin_LCD_API::getTargetTemp_celsius(2)) + ); + #else + strcpy_P( + e1_str, + PSTR("-") + ); + #endif - cmd.Cmd_Execute(); - dlcache.store(); - } + BTX( BTN_POS(2,1), BTN_SIZE(3,1), e0_str, FONT_MED); + BTX( BTN_POS(6,1), BTN_SIZE(3,1), e1_str, FONT_MED); + BTX( BTN_POS(2,2), BTN_SIZE(3,1), bed_str, FONT_MED); + BTX( BTN_POS(6,2), BTN_SIZE(3,1), fan_str, FONT_MED); +} +void StatusScreen::static_progress() { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - /* Dynamic content, non-cached data follows */ #if defined(LCD_PORTRAIT) - #define GRID_ROWS 9 + THEME(progress) BTN( BTN_POS(1,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(5,3), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); #else - #define GRID_ROWS 8 + THEME(progress) BTN( BTN_POS(9,1), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); + THEME(progress) BTN( BTN_POS(9,2), BTN_SIZE(4,1), F(""), FONT_SML, OPT_FLAT); #endif +} - BTN_TAG(0) +void StatusScreen::dynamic_progress() { + CLCD::CommandFifo cmd; const uint32_t elapsed = Marlin_LCD_API::getProgress_seconds_elapsed(); const uint8_t hrs = elapsed/3600; const uint8_t min = (elapsed/60)%60; - char b[255]; - #if defined(LCD_PORTRAIT) - #define GRID_COLS 8 - sprintf_P(b, PSTR(" %02d : %02d"), hrs, min); - BTX( BTN_POS(1,3), BTN_SIZE(4,1), b, FONT_MED); - - sprintf_P(b, PSTR("%-3d %%"), Marlin_LCD_API::getProgress_percent() ); - BTX( BTN_POS(5,3), BTN_SIZE(4,1), b, FONT_MED); - #else - #define GRID_COLS 12 - sprintf_P(b, PSTR(" %02d : %02d"), hrs, min); - BTX( BTN_POS(9,1), BTN_SIZE(4,1), b, FONT_MED); - sprintf_P(b, PSTR("%-3d %%"), Marlin_LCD_API::getProgress_percent() ); - BTX( BTN_POS(9,2), BTN_SIZE(4,1), b, FONT_MED); - #endif + char time_str[10]; + char progress_str[10]; - sprintf_P(b, PSTR("%-3d / %-3d C"), Marlin_LCD_API::getActualTemp_celsius(1), Marlin_LCD_API::getActualTemp_celsius(1) ); - BTX( BTN_POS(2,1), BTN_SIZE(3,1), b, FONT_MED); + sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min); + sprintf_P(progress_str, PSTR("%-3d %%"), Marlin_LCD_API::getProgress_percent() ); - #if EXTRUDERS == 2 - sprintf_P(b, PSTR("%-3d / %-3d C"), Marlin_LCD_API::getActualTemp_celsius(2), Marlin_LCD_API::getTargetTemp_celsius(2) ); - BTX( BTN_POS(6,1), BTN_SIZE(3,1), b, FONT_MED); + #if defined(LCD_PORTRAIT) + BTN_TAG(0) + BTX( BTN_POS(1,3), BTN_SIZE(4,1), time_str, FONT_MED); + BTX( BTN_POS(5,3), BTN_SIZE(4,1), progress_str, FONT_MED); + #else + BTN_TAG(0) + BTX( BTN_POS(9,1), BTN_SIZE(4,1), time_str, FONT_MED); + BTX( BTN_POS(9,2), BTN_SIZE(4,1), progress_str, FONT_MED); #endif +} - sprintf_P(b, PSTR("%-3d / %-3d " ), Marlin_LCD_API::getActualTemp_celsius(0), Marlin_LCD_API::getActualTemp_celsius(0) ); - BTX( BTN_POS(2,2), BTN_SIZE(3,1), b, FONT_MED); +#define GRID_COLS 4 - sprintf_P(b, PSTR("%-3d %%"), Marlin_LCD_API::getFan_percent(0) ); - BTX( BTN_POS(6,2), BTN_SIZE(3,1), b, FONT_MED); +void StatusScreen::static_interaction_buttons() { + CLCD::CommandFifo cmd; - #define GRID_COLS 1 #if defined(LCD_PORTRAIT) - RGB(status_msg) BTN( BTN_POS(1,4), BTN_SIZE(1,1), lcd_status_message, FONT_LRG, OPT_FLAT); - #else - RGB(status_msg) BTN( BTN_POS(1,3), BTN_SIZE(1,2), lcd_status_message, FONT_LRG, OPT_FLAT); + BTN_TAG(1) THEME(stop_btn) BTN( BTN_POS(1,8), BTN_SIZE(4,1), F("STOP"), MENU_BTN_STYLE); + BTN_TAG(3) THEME(navi_btn) BTN( BTN_POS(1,9), BTN_SIZE(2,1), F(""), MENU_BTN_STYLE); + BTN_TAG(4) THEME(navi_btn) BTN( BTN_POS(3,9), BTN_SIZE(2,1), F("MENU"), MENU_BTN_STYLE); + #else + BTN_TAG(1) THEME(stop_btn) BTN( BTN_POS(1,7), BTN_SIZE(2,2), F("STOP"), MENU_BTN_STYLE); + BTN_TAG(3) THEME(navi_btn) BTN( BTN_POS(3,7), BTN_SIZE(1,2), F(""), MENU_BTN_STYLE); + BTN_TAG(4) THEME(navi_btn) BTN( BTN_POS(4,7), BTN_SIZE(1,2), F("MENU"), MENU_BTN_STYLE); #endif - #define GRID_COLS 3 + // Draw Thumb Drive Bitmap on USB Button - dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::X), 5, 1, b); - strcat_P(b, PSTR(" mm")); + cmd.Cmd_Bitmap_Source(TD_Icon_Info); + cmd.Cmd_Bitmap_Layout(TD_Icon_Info); + cmd.Cmd_Bitmap_Size (TD_Icon_Info); + + BTN_TAG(3) #if defined(LCD_PORTRAIT) - BTX( BTN_POS(2,5), BTN_SIZE(2,1), b, FONT_MED); + BTI(BTN_POS(1,9), BTN_SIZE(2,1), TD_Icon_Info, Theme::icon_scale); #else - BTX( BTN_POS(1,6), BTN_SIZE(1,1), b, FONT_MED); + BTI(BTN_POS(3,7), BTN_SIZE(1,2), TD_Icon_Info, Theme::icon_scale); #endif +} +#define GRID_COLS 1 - dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Y), 5, 1, b); - strcat_P(b, PSTR(" mm")); - #if defined(LCD_PORTRAIT) - BTX( BTN_POS(2,6), BTN_SIZE(2,1), b, FONT_MED); - #else - BTX( BTN_POS(2,6), BTN_SIZE(1,1), b, FONT_MED); - #endif +void StatusScreen::dynamic_status_message() { + CLCD::CommandFifo cmd; - dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Z), 5, 1, b); - strcat_P(b, PSTR(" mm")); #if defined(LCD_PORTRAIT) - BTX( BTN_POS(2,7), BTN_SIZE(2,1), b, FONT_MED); + THEME(status_msg) BTN( BTN_POS(1,4), BTN_SIZE(1,1), lcd_status_message, FONT_LRG, OPT_FLAT); #else - BTX( BTN_POS(3,6), BTN_SIZE(1,1), b, FONT_MED); + THEME(status_msg) BTN( BTN_POS(1,3), BTN_SIZE(1,2), lcd_status_message, FONT_LRG, OPT_FLAT); #endif +} + +#if defined(LCD_PORTRAIT) + #define GRID_COLS 8 +#else + #define GRID_COLS 12 +#endif + +void StatusScreen::onStartup() { + // Load the bitmaps for the status screen + + CLCD::Flash_Write_RGB332_Bitmap(TD_Icon_Info.RAMG_addr, TD_Icon, sizeof(TD_Icon)); + CLCD::Flash_Write_RGB332_Bitmap(Extruder_Icon_Info.RAMG_addr, Extruder_Icon, sizeof(Extruder_Icon)); + CLCD::Flash_Write_RGB332_Bitmap(Bed_Heat_Icon_Info.RAMG_addr, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); + CLCD::Flash_Write_RGB332_Bitmap(Fan_Icon_Info.RAMG_addr, Fan_Icon, sizeof(Fan_Icon)); +} + +void StatusScreen::onRefresh() { + static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); + + if(dlcache.hasData()) { + dlcache.append(); + } else { + cmd.Cmd_Clear_Color(Theme::background); + cmd.Cmd_Clear(1,1,1); + + static_temperature(); + static_progress(); + static_axis_position(); + static_interaction_buttons(); + + dlcache.store(); + } - #define MARGIN_T 5 + /* Dynamic content, non-cached data follows */ + + dynamic_temperature(); + dynamic_progress(); + dynamic_status_message(); + dynamic_axis_position(); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); @@ -595,57 +688,60 @@ void StatusScreen::onTouchStart(uint8_t tag) { /************************************ MENU SCREEN *******************************/ +#if defined(LCD_PORTRAIT) + #define GRID_ROWS 7 + #define GRID_COLS 2 +#else + #define GRID_ROWS 4 + #define GRID_COLS 2 +#endif + void MenuScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear(1,1,1); #if defined(LCD_PORTRAIT) - #define GRID_ROWS 7 - #define GRID_COLS 2 - BTN_TAG(2) RGB(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), MENU_BTN_STYLE); - BTN_TAG(3) RGB(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE); - - #define GRID_COLS 1 - BTN_TAG(4) RGB(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Disable Steppers"), MENU_BTN_STYLE); - - BTN_TAG(5) RGB(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Temperature"), MENU_BTN_STYLE); - BTN_TAG(6) RGB(menu_btn) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("Advanced Settings"), MENU_BTN_STYLE); - BTN_TAG(8) RGB(menu_btn) BTN( BTN_POS(1,5), BTN_SIZE(1,1), F("Recalibrate Screen"), MENU_BTN_STYLE); - BTN_TAG(7) RGB(menu_btn) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("About Firmware"), MENU_BTN_STYLE); - - #define MARGIN_T 15 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,7), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); - #define MARGIN_T 5 + BTN_TAG(2) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), MENU_BTN_STYLE); + BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE); + BTN_TAG(4) THEME(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(2,1), F("Disable Steppers"), MENU_BTN_STYLE); + + BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(2,1), F("Temperature"), MENU_BTN_STYLE); + BTN_TAG(6) THEME(menu_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Advanced Settings"), MENU_BTN_STYLE); + BTN_TAG(8) THEME(menu_btn) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F("Recalibrate Screen"), MENU_BTN_STYLE); + BTN_TAG(7) THEME(menu_btn) BTN( BTN_POS(1,6), BTN_SIZE(2,1), F("About Firmware"), MENU_BTN_STYLE); + #else + BTN_TAG(2) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), MENU_BTN_STYLE); + BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE); + BTN_TAG(4) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Disable Steppers"), MENU_BTN_STYLE); + + BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Temperature"), MENU_BTN_STYLE); + BTN_TAG(6) THEME(menu_btn) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Configuration"), MENU_BTN_STYLE); + BTN_TAG(7) THEME(menu_btn) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("About Firmware"), MENU_BTN_STYLE); + #endif + + #define MARGIN_T 15 + + #if defined(LCD_PORTRAIT) + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,7), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE); #else - #define GRID_ROWS 4 - #define GRID_COLS 2 - BTN_TAG(2) RGB(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), MENU_BTN_STYLE); - BTN_TAG(3) RGB(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE); - BTN_TAG(4) RGB(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Disable Steppers"), MENU_BTN_STYLE); - - BTN_TAG(5) RGB(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Temperature"), MENU_BTN_STYLE); - BTN_TAG(6) RGB(menu_btn) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Configuration"), MENU_BTN_STYLE); - BTN_TAG(7) RGB(menu_btn) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("About Firmware"), MENU_BTN_STYLE); - - #define MARGIN_T 15 - #define GRID_COLS 1 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); - #define MARGIN_T 5 + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE); #endif - cmd.Cmd(DL_DISPLAY); - cmd.Cmd(CMD_SWAP); - cmd.Cmd_Execute(); + + #define MARGIN_T 5 + dlcache.store(); } + + cmd.Cmd(DL_DISPLAY); + cmd.Cmd(CMD_SWAP); + cmd.Cmd_Execute(); } void MenuScreen::onTouchStart(uint8_t tag) { @@ -661,57 +757,54 @@ void MenuScreen::onTouchStart(uint8_t tag) { /******************************* CONFIGURATION SCREEN ****************************/ +#if defined(LCD_PORTRAIT) + #define GRID_ROWS 6 + #define GRID_COLS 2 +#else + #define GRID_ROWS 4 + #define GRID_COLS 2 +#endif + void AdvancedSettingsScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear(1,1,1); #if defined(LCD_PORTRAIT) - #define GRID_ROWS 6 + BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,2), F("Z Offset "), MENU_BTN_STYLE); + BTN_TAG(4) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,2), F("Steps/mm"), MENU_BTN_STYLE); + + BTN_TAG(6) THEME(disabled) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Velocity "), MENU_BTN_STYLE); + BTN_TAG(7) THEME(disabled) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Acceleration"), MENU_BTN_STYLE); + BTN_TAG(8) THEME(disabled) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("Jerk"), MENU_BTN_STYLE); + BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F("Restore Failsafe"), MENU_BTN_STYLE); + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("Save"), MENU_BTN_STYLE); + BTN_TAG(2) THEME(navi_btn) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); #else - #define GRID_ROWS 4 - #endif + BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Z Offset "), MENU_BTN_STYLE); + BTN_TAG(4) THEME(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Steps/mm"), MENU_BTN_STYLE); - #define GRID_COLS 2 + BTN_TAG(6) THEME(disabled) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Velocity "), MENU_BTN_STYLE); + BTN_TAG(7) THEME(disabled) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Acceleration"), MENU_BTN_STYLE); + BTN_TAG(8) THEME(disabled) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("Jerk"), MENU_BTN_STYLE); + BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Restore Failsafe"), MENU_BTN_STYLE); - #define MARGIN_T 15 - #if defined(LCD_PORTRAIT) - BTN_TAG(3) RGB(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,2), F("Z Offset "), MENU_BTN_STYLE); - BTN_TAG(4) RGB(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,2), F("Steps/mm"), MENU_BTN_STYLE); - - BTN_TAG(6) RGB(disabled) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Velocity "), MENU_BTN_STYLE); - BTN_TAG(7) RGB(disabled) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Acceleration"), MENU_BTN_STYLE); - BTN_TAG(8) RGB(disabled) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("Jerk"), MENU_BTN_STYLE); - BTN_TAG(5) RGB(menu_btn) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F("Restore Failsafe"), MENU_BTN_STYLE); - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("Save"), MENU_BTN_STYLE); - BTN_TAG(2) RGB(navi_btn) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); - #else - BTN_TAG(3) RGB(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Z Offset "), MENU_BTN_STYLE); - BTN_TAG(4) RGB(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Steps/mm"), MENU_BTN_STYLE); - - BTN_TAG(6) RGB(disabled) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Velocity "), MENU_BTN_STYLE); - BTN_TAG(7) RGB(disabled) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Acceleration"), MENU_BTN_STYLE); - BTN_TAG(8) RGB(disabled) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F("Jerk"), MENU_BTN_STYLE); - BTN_TAG(5) RGB(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Restore Failsafe"), MENU_BTN_STYLE); - #define GRID_COLS 4 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Save"), MENU_BTN_STYLE); - BTN_TAG(2) RGB(navi_btn) BTN( BTN_POS(3,4), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE); + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("Save"), MENU_BTN_STYLE); + BTN_TAG(2) THEME(navi_btn) BTN( BTN_POS(2,4), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); #endif - cmd.Cmd(DL_DISPLAY); - cmd.Cmd(CMD_SWAP); - - cmd.Cmd_Execute(); dlcache.store(); } + + cmd.Cmd(DL_DISPLAY); + cmd.Cmd(CMD_SWAP); + cmd.Cmd_Execute(); } void AdvancedSettingsScreen::onTouchStart(uint8_t tag) { @@ -725,20 +818,25 @@ void AdvancedSettingsScreen::onTouchStart(uint8_t tag) { /******************************** CALIBRATION SCREEN ****************************/ +#define GRID_COLS 4 +#define GRID_ROWS 16 + void CalibrationScreen::onRefresh() { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(CMD_DLSTART); cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear(1,1,1); - #define GRID_COLS 4 - #define GRID_ROWS 16 + #if defined(LCD_PORTRAIT) BTX( BTN_POS(1,8), BTN_SIZE(4,1), F("Touch the dots"), FONT_LRG); BTX( BTN_POS(1,9), BTN_SIZE(4,1), F("to calibrate"), FONT_LRG); #else - BTX( BTN_POS(1,1), BTN_SIZE(4,16), F("Touch the dots to calibrate"), FONT_LRG); + #if defined(LCD_800x480) + BTX( BTN_POS(1,1), BTN_SIZE(4,16), F("Touch the dots to calibrate"), FONT_LRG); + #else + BTX( BTN_POS(1,1), BTN_SIZE(4,16), F("Touch the dots to calibrate"), FONT_MED); + #endif #endif cmd.Cmd(CMD_CALIBRATE); @@ -748,13 +846,17 @@ void CalibrationScreen::onRefresh() { } void CalibrationScreen::onIdle() { - if(CLCD::CommandFifo::Is_Idle()) { + if(CLCD::CommandFifo::Cmd_Is_Idle()) { GOTO_SCREEN(StatusScreen); } } /***************************** CALIBRATION REGISTERS SCREEN ****************************/ +#define MARGIN_T 5 +#define GRID_ROWS 7 +#define GRID_COLS 2 + void CalibrationRegistersScreen::onRefresh() { const uint32_t T_Transform_A = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_A); const uint32_t T_Transform_B = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_B); @@ -765,28 +867,24 @@ void CalibrationRegistersScreen::onRefresh() { char b[20]; CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(CMD_DLSTART); cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear(1,1,1); - #define MARGIN_T 5 - #define GRID_ROWS 7 - #define GRID_COLS 2 BTN_TAG(0) - RGB(transformA) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH TRANSFORM_A"), 28, OPT_3D); - RGB(transformB) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH TRANSFORM_B"), 28, OPT_3D); - RGB(transformC) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH TRANSFORM_C"), 28, OPT_3D); - RGB(transformD) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH TRANSFORM_D"), 28, OPT_3D); - RGB(transformE) BTN( BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH TRANSFORM_E"), 28, OPT_3D); - RGB(transformF) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH TRANSFORM_F"), 28, OPT_3D); - - RGB(transformVal) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); - RGB(transformVal) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); - RGB(transformVal) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); - RGB(transformVal) BTN( BTN_POS(2,4), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); - RGB(transformVal) BTN( BTN_POS(2,5), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); - RGB(transformVal) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformA) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH TRANSFORM_A"), 28, OPT_3D); + THEME(transformB) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("TOUCH TRANSFORM_B"), 28, OPT_3D); + THEME(transformC) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("TOUCH TRANSFORM_C"), 28, OPT_3D); + THEME(transformD) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("TOUCH TRANSFORM_D"), 28, OPT_3D); + THEME(transformE) BTN( BTN_POS(1,5), BTN_SIZE(1,1), F("TOUCH TRANSFORM_E"), 28, OPT_3D); + THEME(transformF) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("TOUCH TRANSFORM_F"), 28, OPT_3D); + + THEME(transformVal) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformVal) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformVal) BTN( BTN_POS(2,3), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformVal) BTN( BTN_POS(2,4), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformVal) BTN( BTN_POS(2,5), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); + THEME(transformVal) BTN( BTN_POS(2,6), BTN_SIZE(1,1), F(""), 28, OPT_FLAT); sprintf(b, "0x%08lX", T_Transform_A); BTX( BTN_POS(2,1), BTN_SIZE(1,1), b, 28); sprintf(b, "0x%08lX", T_Transform_B); BTX( BTN_POS(2,2), BTN_SIZE(1,1), b, 28); @@ -797,7 +895,7 @@ void CalibrationRegistersScreen::onRefresh() { #define GRID_COLS 3 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(3,7), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(3,7), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); @@ -812,147 +910,162 @@ void CalibrationRegistersScreen::onTouchStart(uint8_t tag) { /*************************** GENERIC VALUE ADJUSTMENT SCREEN ******************************/ -void ValueAdjusters::static_heading(progmem_str heading) { +#if defined(LCD_PORTRAIT) + #define GRID_COLS 6 + #define GRID_ROWS 10 +#else + #define GRID_COLS 9 + #define GRID_ROWS 6 +#endif + +void ValueAdjusters::draw_increment_btn(const uint8_t tag, uint8_t decimals) { + CLCD::CommandFifo cmd; + const char *label = PSTR("?"); + uint8_t pos; + + switch(tag) { + case 20: label = PSTR("0.001"); pos = decimals - 3; break; + case 21: label = PSTR( "0.01"); pos = decimals - 2; break; + case 22: label = PSTR( "0.1"); pos = decimals - 1; break; + case 23: label = PSTR( "1" ); pos = decimals + 0; break; + case 24: label = PSTR( "10" ); pos = decimals + 1; break; + case 25: label = PSTR("100" ); pos = decimals + 2; break; + } + + BTN_TAG(tag) + switch(pos) { + #if defined(LCD_PORTRAIT) + case 0: BTN( BTN_POS(2,8), BTN_SIZE(1,1), progmem_str(label), FONT_MED, OPT_3D); break; + case 1: BTN( BTN_POS(3,8), BTN_SIZE(1,1), progmem_str(label), FONT_MED, OPT_3D); break; + case 2: BTN( BTN_POS(4,8), BTN_SIZE(1,1), progmem_str(label), FONT_MED, OPT_3D); break; + #else + case 0: BTN( BTN_POS(8,2), BTN_SIZE(2,1), progmem_str(label), FONT_MED, OPT_3D); break; + case 1: BTN( BTN_POS(8,3), BTN_SIZE(2,1), progmem_str(label), FONT_MED, OPT_3D); break; + case 2: BTN( BTN_POS(8,4), BTN_SIZE(2,1), progmem_str(label), FONT_MED, OPT_3D); break; + #endif + } +} + +void ValueAdjusters::heading_t::static_parts() const { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd_Clear_Color(Theme::adjust_bg); cmd.Cmd_Clear(1,1,1); - #if defined(LCD_PORTRAIT) - #define GRID_COLS 6 - #define GRID_ROWS 9 - #define EDGE_R 20 - #else - #define GRID_COLS 9 - #define GRID_ROWS 6 - #define EDGE_R 40 - #endif + // Draw all the buttons in the off state. + THEME(toggle_off); + draw_increment_btn(23 - decimals, decimals); + draw_increment_btn(24 - decimals, decimals); + draw_increment_btn(25 - decimals, decimals); + draw_increment_btn(26 - decimals, decimals); #if defined(LCD_PORTRAIT) - BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(1,1), BTN_SIZE(6,1), heading, FONT_MED, OPT_FLAT); - BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(1,7), BTN_SIZE(2,1), F("Increment:"), FONT_SML, OPT_FLAT); - - BTN_TAG(20) TOGGLE(increment == 0.1 ) BTN( BTN_POS(3,7), BTN_SIZE(1,1), F("0.1"), FONT_MED, OPT_3D); - BTN_TAG(21) TOGGLE(increment == 1. ) BTN( BTN_POS(4,7), BTN_SIZE(1,1), F("1"), FONT_MED, OPT_3D); - BTN_TAG(22) TOGGLE(increment == 10. ) BTN( BTN_POS(5,7), BTN_SIZE(1,1), F("10"), FONT_MED, OPT_3D); - BTN_TAG(23) TOGGLE(increment == 100.) BTN( BTN_POS(6,7), BTN_SIZE(1,1), F("100"), FONT_MED, OPT_3D); - - #define EDGE_R 0 - #define GRID_COLS 4 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,9), BTN_SIZE(4,1), F("Back"), MENU_BTN_STYLE); + BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(1,1), BTN_SIZE(6,1), heading, FONT_MED, OPT_FLAT); + BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(1,7), BTN_SIZE(6,1), F("Increment:"), FONT_SML, OPT_FLAT); + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,10), BTN_SIZE(6,1), F("Back"), MENU_BTN_STYLE); #else - BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(3,1), BTN_SIZE(4,1), heading, FONT_MED, OPT_FLAT); - - BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(8,1), BTN_SIZE(2,1), F("Increment"), FONT_MED, OPT_FLAT); - - BTN_TAG(20) TOGGLE(increment == 0.1 ) BTN( BTN_POS(8,2), BTN_SIZE(1,1), F("0.1"), FONT_MED, OPT_3D); - BTN_TAG(21) TOGGLE(increment == 1. ) BTN( BTN_POS(9,2), BTN_SIZE(1,1), F("1"), FONT_MED, OPT_3D); - BTN_TAG(22) TOGGLE(increment == 10. ) BTN( BTN_POS(8,3), BTN_SIZE(2,1), F("10"), FONT_MED, OPT_3D); - BTN_TAG(23) TOGGLE(increment == 100.) BTN( BTN_POS(8,4), BTN_SIZE(2,1), F("100"), FONT_MED, OPT_3D); - - #define EDGE_R 0 - - #define MARGIN_T 15 - #define GRID_COLS 4 - BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,6), BTN_SIZE(4,1), F("Back"), MENU_BTN_STYLE); - #define MARGIN_T 5 + BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(3,1), BTN_SIZE(4,1), (progmem_str) label, FONT_MED, OPT_FLAT); + BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(8,1), BTN_SIZE(2,1), F("Increment"), FONT_MED, OPT_FLAT); + BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(7,6), BTN_SIZE(3,1), F("Back"), MENU_BTN_STYLE); #endif - - cmd.Cmd_Execute(); } -void ValueAdjusters::static_value(int line, progmem_str label) { +void ValueAdjusters::heading_t::dynamic_parts() const { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - #if defined(LCD_PORTRAIT) - #define GRID_COLS 6 - #define GRID_ROWS 9 - #define EDGE_R 20 + THEME(toggle_on); + draw_increment_btn(increment, decimals); +} + +#if defined(LCD_PORTRAIT) + #if defined(LCD_800x480) + #define EDGE_R 20 + #else + #define EDGE_R 10 + #endif +#else + #if defined(LCD_800x480) + #define EDGE_R 40 #else - #define GRID_COLS 9 - #define GRID_ROWS 6 - #define EDGE_R 40 + #define EDGE_R 20 #endif +#endif - BTN_TAG( 0) BTN( BTN_POS(3,line+1), BTN_SIZE(2,1), F(""), FONT_SML, OPT_FLAT); - BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(1,line+1), BTN_SIZE(2,1), label, FONT_SML, OPT_FLAT); - BTN_TAG(2*line ) RGB(incr_btn) BTN( BTN_POS(5,line+1), BTN_SIZE(1,1), F("-"), FONT_MED, OPT_3D); - BTN_TAG(2*line + 1) RGB(incr_btn) BTN( BTN_POS(6,line+1), BTN_SIZE(1,1), F("+"), FONT_MED, OPT_3D); +void ValueAdjusters::adjuster_t::static_parts() const { + CLCD::CommandFifo cmd; + progmem_str str = (progmem_str) label; + const uint8_t tag = line * 2; - #define EDGE_R 0 + BTN_TAG( 0 ) RGB(color) BTN( BTN_POS(3,line+1), BTN_SIZE(2,1), F(""), FONT_SML, OPT_FLAT); + BTN_TAG( 0 ) THEME(adjust_bg) BTN( BTN_POS(1,line+1), BTN_SIZE(2,1), str, FONT_SML, OPT_FLAT); + BTN_TAG(tag ) THEME(incr_btn) BTN( BTN_POS(5,line+1), BTN_SIZE(1,1), F("-"), FONT_MED, OPT_3D); + BTN_TAG(tag + 1) THEME(incr_btn) BTN( BTN_POS(6,line+1), BTN_SIZE(1,1), F("+"), FONT_MED, OPT_3D); - cmd.Cmd_Execute(); + increment = 23 - decimals; } -void ValueAdjusters::dynamic_value(int line, float value, progmem_str units) { +void ValueAdjusters::adjuster_t::dynamic_parts(float value) const { CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - #define MARGIN_T 5 - - #if defined(LCD_PORTRAIT) - #define GRID_COLS 6 - #define GRID_ROWS 9 - #define EDGE_R 20 - #else - #define GRID_COLS 9 - #define GRID_ROWS 6 - #define EDGE_R 40 - #endif - - BTN_TAG( 0) + char b[32]; - char b[255]; - dtostrf(value, 5, 1, b); + dtostrf(value, 5, decimals, b); strcat_P(b, PSTR(" ")); strcat_P(b, (const char*) units); - BTX( BTN_POS(3,line+1), BTN_SIZE(2,1), b, FONT_SML); - - #define EDGE_R 0 - cmd.Cmd_Execute(); + BTN_TAG(0) + BTX( BTN_POS(3,line+1), BTN_SIZE(2,1), b, FONT_SML); } void ValueAdjusters::onTouchStart(uint8_t tag) { switch(tag) { - case 1: GOTO_PREVIOUS(); return; - case 2 ... 9: current_screen.onTouchHeld(tag); return; - case 20: increment = 0.1; break; - case 21: increment = 1; break; - case 22: increment = 10; break; - case 23: increment = 100; break; + case 1: GOTO_PREVIOUS(); return; + case 2 ... 9: current_screen.onTouchHeld(tag); return; + case 20 ... 25: increment = tag; break; } current_screen.onRefresh(); } -float ValueAdjusters::increment = 1; +float ValueAdjusters::getIncrement() { + switch(increment) { + case 20: return 0.001; + case 21: return 0.01; + case 22: return 0.1; + case 23: return 1.0; + case 24: return 10.0; + case 25: return 100.0; + } +} + +uint8_t ValueAdjusters::increment = 20; + +#define EDGE_R 0 /******************************** MOVE AXIS SCREEN ******************************/ void MoveAxisScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); + + /* # Label: Units: Color: Precision: */ + const heading_t a = { PSTR("Move Axis"), 1 }; + const adjuster_t b = {1, PSTR("X:"), PSTR("mm"), Theme::x_axis, 1 }; + const adjuster_t c = {2, PSTR("Y:"), PSTR("mm"), Theme::y_axis, 1 }; + const adjuster_t d = {3, PSTR("Z:"), PSTR("mm"), Theme::z_axis, 1 }; if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - cmd.Cmd_Execute(); - - ValueAdjusters::static_heading(F("Move Axis")); - RGB(x_axis) ValueAdjusters::static_value(1, F("X:")); - RGB(y_axis) ValueAdjusters::static_value(2, F("Y:")); - RGB(z_axis) ValueAdjusters::static_value(3, F("Z:")); + a.static_parts(); + b.static_parts(); + c.static_parts(); + d.static_parts(); dlcache.store(); } + a.dynamic_parts(); + b.dynamic_parts(marlin_x_axis); + c.dynamic_parts(marlin_y_axis); + d.dynamic_parts(marlin_z_axis); - ValueAdjusters::dynamic_value(1, marlin_x_axis, F("mm")); - ValueAdjusters::dynamic_value(2, marlin_y_axis, F("mm")); - ValueAdjusters::dynamic_value(3, marlin_z_axis, F("mm")); - - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); cmd.Cmd_Execute(); @@ -960,12 +1073,12 @@ void MoveAxisScreen::onRefresh() { void MoveAxisScreen::onTouchHeld(uint8_t tag) { switch(tag) { - case 2: marlin_x_axis -= increment; break; - case 3: marlin_x_axis += increment; break; - case 4: marlin_y_axis -= increment; break; - case 5: marlin_y_axis += increment; break; - case 6: marlin_z_axis -= increment; break; - case 7: marlin_z_axis += increment; break; + case 2: marlin_x_axis -= getIncrement(); break; + case 3: marlin_x_axis += getIncrement(); break; + case 4: marlin_y_axis -= getIncrement(); break; + case 5: marlin_y_axis += getIncrement(); break; + case 6: marlin_z_axis -= getIncrement(); break; + case 7: marlin_z_axis += getIncrement(); break; } onRefresh(); } @@ -974,29 +1087,29 @@ void MoveAxisScreen::onTouchHeld(uint8_t tag) { void TemperatureScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); + + /* # Label: Units: Color: Precision: */ + const heading_t a = { PSTR("Nozzle:"), 0 }; + const adjuster_t b = {1, PSTR("Nozzle:"), PSTR("C"), Theme::temp, 0 }; + const adjuster_t c = {2, PSTR("Bed:"), PSTR("C"), Theme::temp, 0 }; + const adjuster_t d = {3, PSTR("Fan Speed:"), PSTR("%"), Theme::fan_speed, 0 }; if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - - ValueAdjusters::static_heading(F("Temperature")); - RGB(x_axis) ValueAdjusters::static_value(1, F("Nozzle:")); - RGB(y_axis) ValueAdjusters::static_value(2, F("Bed:")); - RGB(z_axis) ValueAdjusters::static_value(3, F("Fan Speed:")); - - cmd.Cmd_Execute(); + a.static_parts(); + b.static_parts(); + c.static_parts(); + d.static_parts(); dlcache.store(); } + a.dynamic_parts(); + b.dynamic_parts(marlin_e0_temp); + c.dynamic_parts(marlin_bed_temp); + d.dynamic_parts(marlin_fan_speed); - ValueAdjusters::dynamic_value(1, marlin_e0_temp, F("C")); - ValueAdjusters::dynamic_value(2, marlin_bed_temp, F("C")); - ValueAdjusters::dynamic_value(3, marlin_fan_speed, F("%")); - - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); cmd.Cmd_Execute(); @@ -1004,12 +1117,12 @@ void TemperatureScreen::onRefresh() { void TemperatureScreen::onTouchHeld(uint8_t tag) { switch(tag) { - case 2: marlin_e0_temp -= increment; break; - case 3: marlin_e0_temp += increment; break; - case 4: marlin_bed_temp -= increment; break; - case 5: marlin_bed_temp += increment; break; - case 6: marlin_fan_speed -= increment; break; - case 7: marlin_fan_speed += increment; break; + case 2: marlin_e0_temp -= getIncrement(); break; + case 3: marlin_e0_temp += getIncrement(); break; + case 4: marlin_bed_temp -= getIncrement(); break; + case 5: marlin_bed_temp += getIncrement(); break; + case 6: marlin_fan_speed -= getIncrement(); break; + case 7: marlin_fan_speed += getIncrement(); break; } onRefresh(); } @@ -1018,31 +1131,32 @@ void TemperatureScreen::onTouchHeld(uint8_t tag) { void StepsScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); + + /* # Label: Units: Color: Precision: */ + const heading_t a = { PSTR("Steps/mm"), 0}; + const adjuster_t b = {1, PSTR("X:"), PSTR(""), Theme::x_axis, 0}; + const adjuster_t c = {2, PSTR("Y:"), PSTR(""), Theme::y_axis, 0}; + const adjuster_t d = {3, PSTR("Z:"), PSTR(""), Theme::z_axis, 0}; + const adjuster_t e = {4, PSTR("E:"), PSTR(""), Theme::z_axis, 0}; if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - - ValueAdjusters::static_heading(F("Steps/mm")); - RGB(x_axis) ValueAdjusters::static_value(1, F("X:")); - RGB(y_axis) ValueAdjusters::static_value(2, F("Y:")); - RGB(z_axis) ValueAdjusters::static_value(3, F("Z:")); - RGB(e_axis) ValueAdjusters::static_value(4, F("E:")); - - cmd.Cmd_Execute(); + a.static_parts(); + b.static_parts(); + c.static_parts(); + d.static_parts(); + e.static_parts(); dlcache.store(); } + a.dynamic_parts(); + b.dynamic_parts(marlin_x_steps ); + c.dynamic_parts(marlin_y_steps ); + d.dynamic_parts(marlin_z_steps ); + e.dynamic_parts(marlin_e0_steps); - ValueAdjusters::dynamic_value(1, marlin_x_steps, F("")); - ValueAdjusters::dynamic_value(2, marlin_y_steps, F("")); - ValueAdjusters::dynamic_value(3, marlin_z_steps, F("")); - ValueAdjusters::dynamic_value(4, marlin_e0_steps, F("")); - - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); cmd.Cmd_Execute(); @@ -1050,14 +1164,14 @@ void StepsScreen::onRefresh() { void StepsScreen::onTouchHeld(uint8_t tag) { switch(tag) { - case 2: marlin_x_steps -= increment; break; - case 3: marlin_x_steps += increment; break; - case 4: marlin_y_steps -= increment; break; - case 5: marlin_y_steps += increment; break; - case 6: marlin_z_steps -= increment; break; - case 7: marlin_z_steps += increment; break; - case 8: marlin_e0_steps -= increment; break; - case 9: marlin_e0_steps += increment; break; + case 2: marlin_x_steps -= getIncrement(); break; + case 3: marlin_x_steps += getIncrement(); break; + case 4: marlin_y_steps -= getIncrement(); break; + case 5: marlin_y_steps += getIncrement(); break; + case 6: marlin_z_steps -= getIncrement(); break; + case 7: marlin_z_steps += getIncrement(); break; + case 8: marlin_e0_steps -= getIncrement(); break; + case 9: marlin_e0_steps += getIncrement(); break; } onRefresh(); } @@ -1066,25 +1180,23 @@ void StepsScreen::onTouchHeld(uint8_t tag) { void ZOffsetScreen::onRefresh() { static CLCD::DLCache dlcache; + CLCD::CommandFifo cmd; + cmd.Cmd(CMD_DLSTART); + + /* # Label: Units: Color: Precision: */ + const heading_t a = { PSTR("Z Offset"), 3 }; + const adjuster_t b = {2, PSTR("Z Offset:"), PSTR("mm"), Theme::z_axis, 3 }; if(dlcache.hasData()) { dlcache.append(); } else { - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); - cmd.Cmd(CMD_DLSTART); - - ValueAdjusters::static_heading(F("Z Offset")); - RGB(z_axis) ValueAdjusters::static_value(2, F("Z Offset:")); - - cmd.Cmd_Execute(); + a.static_parts(); + b.static_parts(); dlcache.store(); } + a.dynamic_parts(); + b.dynamic_parts(marlin_z_offset); - ValueAdjusters::dynamic_value(2, marlin_z_offset, F("mm")); - - CLCD::CommandFifo cmd; - cmd.Cmd_Start(); cmd.Cmd(DL_DISPLAY); cmd.Cmd(CMD_SWAP); cmd.Cmd_Execute(); @@ -1092,8 +1204,8 @@ void ZOffsetScreen::onRefresh() { void ZOffsetScreen::onTouchHeld(uint8_t tag) { switch(tag) { - case 4: marlin_z_offset -= increment; break; - case 5: marlin_z_offset += increment; break; + case 4: marlin_z_offset -= getIncrement(); break; + case 5: marlin_z_offset += getIncrement(); break; } onRefresh(); } @@ -1122,7 +1234,7 @@ void lcd_update() { // If the LCD is processing commands, don't check // for tags since they may be changing and could // cause spurious events. - if(!CLCD::CommandFifo::Is_Idle()) { + if(!CLCD::CommandFifo::Cmd_Is_Idle()) { return; } @@ -1139,6 +1251,14 @@ void lcd_update() { else if(pressed != NONE) { current_screen.onTouchEnd(pressed); pressed = NONE; + #if defined(UI_FRAMEWORK_DEBUG) + #if defined (SERIAL_PROTOCOLLNPAIR) + SERIAL_PROTOCOLLNPAIR("Touch end: ", tag); + #else + Serial.print("Touch end: "); + Serial.println(tag); + #endif + #endif } } else if(pressed == NONE) { @@ -1148,8 +1268,12 @@ void lcd_update() { last_repeat = millis(); #if defined(UI_FRAMEWORK_DEBUG) - Serial.print("Touch start: "); - Serial.println(tag); + #if defined (SERIAL_PROTOCOLLNPAIR) + SERIAL_PROTOCOLLNPAIR("Touch start: ", tag); + #else + Serial.print("Touch start: "); + Serial.println(tag); + #endif #endif if(lastScreen != current_screen.getScreen()) { diff --git a/Marlin/AO_UI_Framework.h b/Marlin/AO_UI_Framework.h index e4d3becf7..cc4e8844a 100644 --- a/Marlin/AO_UI_Framework.h +++ b/Marlin/AO_UI_Framework.h @@ -117,11 +117,11 @@ class ScreenRef { /********************** SCREEN STACK ******************************/ // To conserve dynamic memory, the screen stack is hard-coded to -// have three values, allowing a menu of up to three levels. +// have four values, allowing a menu of up to four levels. class ScreenStack : public ScreenRef { private: - uint8_t stack[3]; + uint8_t stack[4]; public: void start() { @@ -130,6 +130,7 @@ class ScreenStack : public ScreenRef { } void push() { + stack[3] = stack[2]; stack[2] = stack[1]; stack[1] = stack[0]; stack[0] = getType(); @@ -139,7 +140,8 @@ class ScreenStack : public ScreenRef { setType(stack[0]); stack[0] = stack[1]; stack[1] = stack[2]; - stack[2] = 0; + stack[2] = stack[3]; + stack[3] = 0; } void goTo(onEntry_func_t s) { diff --git a/Marlin/AO_UI_Marlin_LCD_API.h b/Marlin/AO_UI_Marlin_LCD_API.h index 2399e9a39..c93bf01c0 100644 --- a/Marlin/AO_UI_Marlin_LCD_API.h +++ b/Marlin/AO_UI_Marlin_LCD_API.h @@ -49,17 +49,17 @@ const uint8_t Marlin_LCD_API::fanCount = 1; const float Marlin_LCD_API::getActualTemp_celsius(const uint8_t extruder) { if(extruder) { - thermalManager.degHotend(extruder-1); + return thermalManager.degHotend(extruder-1); } else { - thermalManager.degBed(); + return thermalManager.degBed(); } } const float Marlin_LCD_API::getTargetTemp_celsius(const uint8_t extruder) { if(extruder) { - thermalManager.degTargetHotend(extruder-1); + return thermalManager.degTargetHotend(extruder-1); } else { - thermalManager.degTargetBed(); + return thermalManager.degTargetBed(); } } @@ -84,7 +84,7 @@ const float Marlin_LCD_API::getAxisSteps_per_mm(const Marlin_LCD_API::axis_t axi const uint8_t Marlin_LCD_API::getProgress_percent() { #if ENABLED(SDSUPPORT) return card.percentDone(); - #endif + #endif } const uint32_t Marlin_LCD_API::getProgress_seconds_elapsed() { diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index f2f137f2c..0c89e60ad 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -349,10 +349,12 @@ #endif #if defined(LULZBOT_USE_TOUCH_UI) -#define IS_FT810 -#define LCD_PORTRAIT -#define LCD_UPSIDE_DOWN -//#define UI_FRAMEWORK_DEBUG +#define IS_FT800 +//#define IS_FT810 +//#define LCD_PORTRAIT +//#define LCD_UPSIDE_DOWN +//#define LCD_800x480 +#define UI_FRAMEWORK_DEBUG #include "AO_UI_Marlin_LCD_API.h" #include "AO_UI_Framework.h" #include "AO_FT810_Constants.h"