Continuing work on the Touch UI.

master
Marcio Teixeira 7 years ago
parent 2d879f746f
commit e9469ce9b4

@ -66,6 +66,8 @@ namespace FT800 {
const uint32_t RAM_PAL = 0x102000; // Palette RAM const uint32_t RAM_PAL = 0x102000; // Palette RAM
const uint32_t RAM_REG = 0x102400; // Registers const uint32_t RAM_REG = 0x102400; // Registers
const uint32_t RAM_CMD = 0x108000; // Command Buffer const uint32_t RAM_CMD = 0x108000; // Command Buffer
const uint32_t RAM_G_SIZE = 256l*1024l; // 256k
} }
namespace FT810 { namespace FT810 {
@ -77,6 +79,8 @@ namespace FT810 {
const uint32_t RAM_DL = 0x300000; // Display List RAM const uint32_t RAM_DL = 0x300000; // Display List RAM
const uint32_t RAM_REG = 0x302000; // Registers const uint32_t RAM_REG = 0x302000; // Registers
const uint32_t RAM_CMD = 0x308000; // Command Buffer const uint32_t RAM_CMD = 0x308000; // Command Buffer
const uint32_t RAM_G_SIZE = 1024l*1024l; // 1024k
} }
namespace FT800 { 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_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_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_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_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_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 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_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_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_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_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_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_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_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_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_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 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_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_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_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_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_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_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_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_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_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_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 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_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_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_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_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_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 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_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_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_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_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_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_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_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_DIR = 0x302098; // 16 0x8000 r/w Extended GPIO Pin Direction
const uint32_t REG_GPIOX = 0x30209C; // 16 0x0080 r/w Extended GPIO Pin Values const uint32_t REG_GPIOX = 0x30209C; // 16 0x0080 r/w Extended GPIO Pin Values
// Reserved Addr 0x3020A0 // Reserved Addr 0x3020A0
// Reserved Addr 0x3020A4 // 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_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_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 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_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_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_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_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_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 const uint32_t REG_MACRO_1 = 0x3020DC; // 32 0x00000000 r/w Display List Macro Command 1
// Reserved Addr 0x3020E0 // Reserved Addr 0x3020E0
@ -230,7 +234,7 @@ namespace FT810 {
// Reserved Addr 0x3020F4 // Reserved Addr 0x3020F4
const uint32_t REG_CMD_READ = 0x3020F8; // 12 0x000 r/w Command Buffer Read Pointer 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_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_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_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 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 // 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) * 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, 4.3" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY43B)
* Haoyu Electronics, 5" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY50B) * Haoyu Electronics, 5" Graphical LCD Touchscreen, 480x272, SPI, FT800 (FT800CB-HY50B)
* 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) * 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/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.hotmcu.com/5-graphical-lcd-touchscreen-480x272-spi-ft800-p-124.html?cPath=6_16
* http://www.4dsystems.com.au/product/4DLCD_FT843/ * http://www.4dsystems.com.au/product/4DLCD_FT843/
* *
* Datasheet: * Datasheet:
* *
* http://www.hantronix.com/files/data/1278363262430-3.pdf * http://www.hantronix.com/files/data/1278363262430-3.pdf
* http://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf * http://www.haoyuelectronics.com/Attachment/HY43-LCD/LCD%20DataSheet.pdf
* http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.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 // GLOBAL LCD REGISTER SET VALUES FOR 800x480 DISPLAY
/* /*
* Settings for the Haoyu Electronics, 5" Graphical LCD Touchscreen, 800x480, SPI, FT810 * 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 * http://www.hotmcu.com/5-graphical-lcd-touchscreen-800x480-spi-ft810-p-286.html
* *
* Datasheet: * Datasheet:
* *
* http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf * http://www.haoyuelectronics.com/Attachment/HY5-LCD-HD/KD50G21-40NT-A1.pdf
* *
*/ */

@ -98,19 +98,22 @@
* 8100 Bed Heat Bitmap * * 8100 Bed Heat Bitmap *
* 8200 Fan Bitmap * * 8200 Fan Bitmap *
* 8300 Thumb Drive Symbol Bitmap * * 8300 Thumb Drive Symbol Bitmap *
* 3E000 Static DL Space (FT800) * * 35000 Static DL Space (FT800) *
* FE000 Static DL Space (FT810) * * F5000 Static DL Space (FT810) *
**************************************************/ **************************************************/
#ifndef _AO_FT810_FUNC_H #ifndef _AO_FT810_FUNC_H
#define _AO_FT810_FUNC_H #define _AO_FT810_FUNC_H
#if defined(IS_FT800) #if defined(IS_FT800)
#define DL_CACHE_START 0x03E000 #define DL_CACHE_START 0x035000
#else #else
#define DL_CACHE_START 0x0FE000 #define DL_CACHE_START 0x0F5000
#endif #endif
// Uncomment the following to disable the DL caching mechanism
//#define DL_CACHE_DISABLED
#if defined(LCD_800x480) #if defined(LCD_800x480)
using namespace FTDI_LCD_800x480; using namespace FTDI_LCD_800x480;
#else #else
@ -163,21 +166,23 @@ class CLCD {
static uint32_t getRegCmdRead(); static uint32_t getRegCmdRead();
#if defined(IS_FT800) #if defined(IS_FT800)
uint32_t command_write_ptr; static uint32_t command_write_ptr;
template <class T> void _write_unaligned(T data, uint16_t len); template <class T> void _write_unaligned(T data, uint16_t len);
#else #else
uint32_t getRegCmdBSpace(); uint32_t getRegCmdBSpace();
#endif #endif
public: void Cmd_Start(void);
public:
template <class T> void write(T data, uint16_t len); template <class T> void write(T data, uint16_t len);
public: public:
static void Reset (void); CommandFifo() {Cmd_Start();}
static bool Is_Idle();
static void Wait_Until_Idle(); 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_Execute(void);
void Cmd (uint32_t cmd32); void Cmd (uint32_t cmd32);
@ -365,7 +370,7 @@ void CLCD::Init (void) {
Serial.println(Device_ID, HEX); Serial.println(Device_ID, HEX);
#endif #endif
} else { } else {
#if defined (SERIAL_PROTOCOLLNPAIR) #if defined (SERIAL_PROTOCOLLNPGM)
SERIAL_PROTOCOLLNPGM("Device is correct "); SERIAL_PROTOCOLLNPGM("Device is correct ");
#else #else
Serial.println(F("Device is correct ")); Serial.println(F("Device is correct "));
@ -427,7 +432,7 @@ void CLCD::Init (void) {
Enable(); // Turns on Clock by setting PCLK Register to 5 Enable(); // Turns on Clock by setting PCLK Register to 5
delay(50); delay(50);
CommandFifo::Reset(); CommandFifo::Cmd_Reset();
delay(50); delay(50);
// Set Initial Values for Touch Transform Registers // Set Initial Values for Touch Transform Registers
@ -442,6 +447,10 @@ void CLCD::Init (void) {
/******************* FT800/810 Graphic Commands *********************************/ /******************* 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) { 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); 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() { bool CLCD::DLCache::hasData() {
return dl_addr != 0; return dl_size != 0;
} }
void CLCD::DLCache::store() { 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; 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. // Not enough memory to cache the display list.
dl_addr = 0; 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 { } else {
CLCD::CommandFifo cmd; #if defined(UI_FRAMEWORK_DEBUG)
cmd.Cmd_Start(); #if defined (SERIAL_PROTOCOLLNPAIR)
cmd.Cmd_Mem_Cpy(RAM_G + dl_addr, RAM_DL, dl_size); 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(); cmd.Cmd_Execute();
dl_free += dl_size; dl_free += dl_size;
} }
#endif
} }
void CLCD::DLCache::append() { void CLCD::DLCache::append() {
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start(); cmd.Cmd_Append(DL_CACHE_START + dl_addr, dl_size);
cmd.Cmd_Append(RAM_G + dl_addr, dl_size); #if defined(UI_FRAMEWORK_DEBUG)
cmd.Cmd_Execute(); 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 #endif // _AO_FT810_FUNC_H

@ -256,28 +256,45 @@ uint32_t CLCD::CommandFifo::getRegCmdRead() {
return Mem_Read32(REG_CMD_READ) & 0x0FFF; return Mem_Read32(REG_CMD_READ) & 0x0FFF;
} }
bool CLCD::CommandFifo::Is_Idle() { bool CLCD::CommandFifo::Cmd_Is_Idle() {
return getRegCmdRead() == getRegCmdWrite(); 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 { 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) #if defined(IS_FT800)
void CLCD::CommandFifo::Start() { void CLCD::CommandFifo::Cmd_Start() {
command_write_ptr = getRegCmdWrite(); if(command_write_ptr == 0xFFFFFFFFul) {
command_write_ptr = getRegCmdWrite();
}
} }
void CLCD::CommandFifo::Execute() { void CLCD::CommandFifo::Cmd_Execute() {
Mem_Write32(REG_CMD_WRITE, command_write_ptr); 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_WRITE, 0x00000000);
Mem_Write32(REG_CMD_READ, 0x00000000); Mem_Write32(REG_CMD_READ, 0x00000000);
command_write_ptr = 0; command_write_ptr = 0xFFFFFFFFul;
}; };
template <class T> void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) { template <class T> void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) {
@ -285,6 +302,16 @@ template <class T> void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len
uint32_t bytes_tail, bytes_head; uint32_t bytes_tail, bytes_head;
uint32_t command_read_ptr; 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 */ /* Wait until there is enough space in the circular buffer for the transfer */
do { do {
command_read_ptr = getRegCmdRead(); command_read_ptr = getRegCmdRead();
@ -337,7 +364,7 @@ void CLCD::CommandFifo::Cmd_Start() {
void CLCD::CommandFifo::Cmd_Execute() { void CLCD::CommandFifo::Cmd_Execute() {
} }
void CLCD::CommandFifo::Reset() { void CLCD::CommandFifo::Cmd_Reset() {
Mem_Write32(REG_CMD_WRITE, 0x00000000); Mem_Write32(REG_CMD_WRITE, 0x00000000);
Mem_Write32(REG_CMD_READ, 0x00000000); Mem_Write32(REG_CMD_READ, 0x00000000);
}; };

@ -19,14 +19,6 @@
* location: <http://www.gnu.org/licenses/>. * * location: <http://www.gnu.org/licenses/>. *
****************************************************************************/ ****************************************************************************/
// Colors RGB332
#define COLOR0 0x00 // Black
#define COLOR1 0x49 // Gray
#define COLOR2 0x7C // Yellow Green
#define COLOR3 0xFF // White
// L1 Font Data for Widgets // L1 Font Data for Widgets
const PROGMEM CLCD::bitmap_info_t Extruder_Icon_Info = { const PROGMEM CLCD::bitmap_info_t Extruder_Icon_Info = {

@ -46,10 +46,17 @@ static float marlin_z_offset = 0.150;
// Margin defines the margin (in pixels) on each side of a button in // Margin defines the margin (in pixels) on each side of a button in
// the layout // the layout
#if defined(LCD_800x480)
#define MARGIN_L 5 #define MARGIN_L 5
#define MARGIN_R 5 #define MARGIN_R 5
#define MARGIN_T 5 #define MARGIN_T 5
#define MARGIN_B 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 // EDGE_R adds some black space on the right edge of the display
// This shifts some of the screens left to visually center them. // 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 BTX cmd.Cmd_Draw_Button_Text
#define BTI cmd.Cmd_Draw_Button_Icon #define BTI cmd.Cmd_Draw_Button_Icon
#define BTN_TAG(t) cmd.Cmd_Set_Tag(t); #define BTN_TAG(t) cmd.Cmd_Set_Tag(t);
#define RGB(rgb) cmd.Cmd_Set_Foreground_Color(Theme::rgb); #define RGB(rgb) cmd.Cmd_Set_Foreground_Color(rgb);
#define TOGGLE(val) cmd.Cmd_Set_Foreground_Color(val ? Theme::toggle_on : Theme::toggle_off); #define THEME(color) cmd.Cmd_Set_Foreground_Color(Theme::color);
#define FONT_SML Theme::font_small #define FONT_SML Theme::font_small
#define FONT_MED Theme::font_medium #define FONT_MED Theme::font_medium
@ -110,6 +117,17 @@ class AboutScreen : public UIScreen {
}; };
class StatusScreen : 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: public:
static void onRefresh(); static void onRefresh();
static void onStartup(); static void onStartup();
@ -143,11 +161,30 @@ class AdvancedSettingsScreen : public UIScreen {
}; };
class ValueAdjusters : public UIScreen { class ValueAdjusters : public UIScreen {
private:
static uint8_t increment;
static void draw_increment_btn(const uint8_t tag, uint8_t decimals);
protected: protected:
static float increment; struct heading_t {
static void static_heading(progmem_str heading); const char *label;
static void static_value(int line, progmem_str value); uint8_t decimals;
static void dynamic_value(int line, float value, progmem_str units);
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: public:
static void onTouchStart(uint8_t tag); static void onTouchStart(uint8_t tag);
}; };
@ -256,12 +293,13 @@ namespace Theme {
const int16_t font_small = 27; const int16_t font_small = 27;
const int16_t font_medium = 28; const int16_t font_medium = 28;
const int16_t font_large = 28; const int16_t font_large = 28;
const float icon_scale = 0.7;
#else #else
const int16_t font_small = 28; const int16_t font_small = 27;
const int16_t font_medium = 29; const int16_t font_medium = 28;
const int16_t font_large = 30; const int16_t font_large = 30;
const float icon_scale = 0.6;
#endif #endif
const float icon_scale = 0.7;
#endif #endif
}; };
@ -269,15 +307,13 @@ namespace Theme {
void BootScreen::onRefresh() { void BootScreen::onRefresh() {
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART); cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear_Color(Theme::background);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
cmd.Cmd(DL_DISPLAY); cmd.Cmd(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute(); cmd.Cmd_Execute();
cmd.Cmd_Wait_Until_Idle();
cmd.Wait_Until_Idle();
CLCD::Turn_On_Backlight(); CLCD::Turn_On_Backlight();
} }
@ -288,7 +324,6 @@ void BootScreen::onIdle() {
/******************************** ABOUT SCREEN ****************************/ /******************************** ABOUT SCREEN ****************************/
void AboutScreen::onEntry() { void AboutScreen::onEntry() {
draw(false); draw(false);
playChime(); playChime();
@ -301,7 +336,6 @@ void AboutScreen::onRefresh() {
void AboutScreen::draw(bool showOkay) { void AboutScreen::draw(bool showOkay) {
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART); cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::about_bg); cmd.Cmd_Clear_Color(Theme::about_bg);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
@ -309,11 +343,12 @@ void AboutScreen::draw(bool showOkay) {
#define GRID_COLS 4 #define GRID_COLS 4
#define GRID_ROWS 6 #define GRID_ROWS 6
BTX( BTN_POS(1,2), BTN_SIZE(4,1), F("Color LCD Interface"), 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); BTN_TAG(2)
BTX( BTN_POS(1,3), BTN_SIZE(4,1), F("(c) 2018 Aleph Objects, Inc."), FONT_LRG);
if(showOkay) { 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); cmd.Cmd(DL_DISPLAY);
@ -350,229 +385,287 @@ void AboutScreen::playChime() {
} }
/*********************************** STATUS SCREEN ******************************/ /*********************************** 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() { void StatusScreen::static_axis_position() {
// Load USB Thumb Drive Bitmap CLCD::CommandFifo cmd;
CLCD::Flash_Write_RGB332_Bitmap(TD_Icon_Info.RAMG_addr, TD_Icon, sizeof(TD_Icon));
// Load Extruder Bitmap #if defined(LCD_PORTRAIT)
CLCD::Flash_Write_RGB332_Bitmap(Extruder_Icon_Info.RAMG_addr, Extruder_Icon, sizeof(Extruder_Icon)); 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 void StatusScreen::dynamic_axis_position() {
CLCD::Flash_Write_RGB332_Bitmap(Bed_Heat_Icon_Info.RAMG_addr, Bed_Heat_Icon, sizeof(Bed_Heat_Icon)); CLCD::CommandFifo cmd;
// Load Fan Percent Bitmap char x_str[15];
CLCD::Flash_Write_RGB332_Bitmap(Fan_Icon_Info.RAMG_addr, Fan_Icon, sizeof(Fan_Icon)); char y_str[15];
} char z_str[15];
void StatusScreen::onRefresh() { dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::X), 5, 1, x_str);
static CLCD::DLCache dlcache; 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()) { strcat_P(x_str, PSTR(" mm"));
dlcache.append(); strcat_P(y_str, PSTR(" mm"));
} else { strcat_P(z_str, PSTR(" mm"));
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) #if defined(LCD_PORTRAIT)
#define GRID_ROWS 9 BTX( BTN_POS(2,5), BTN_SIZE(2,1), x_str, FONT_MED);
#else BTX( BTN_POS(2,6), BTN_SIZE(2,1), y_str, FONT_MED);
#define GRID_ROWS 8 BTX( BTN_POS(2,7), BTN_SIZE(2,1), z_str, FONT_MED);
#endif #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) //#define MARGIN_T 5
#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
#if defined(LCD_PORTRAIT) #if defined(LCD_PORTRAIT)
#define GRID_COLS 3 #define GRID_COLS 8
RGB(axis_label) BTN( BTN_POS(1,5), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); #else
RGB(axis_label) BTN( BTN_POS(1,6), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); #define GRID_COLS 12
RGB(axis_label) BTN( BTN_POS(1,7), BTN_SIZE(2,1), F(""), FONT_LRG, OPT_FLAT); #endif
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
#define GRID_COLS 4 void StatusScreen::static_temperature() {
#if defined(LCD_PORTRAIT) CLCD::CommandFifo cmd;
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
// 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); // Draw Extruder Bitmap on Extruder Temperature Button
cmd.Cmd_Bitmap_Layout(TD_Icon_Info);
cmd.Cmd_Bitmap_Size (TD_Icon_Info);
BTN_TAG(3) cmd.Cmd_Bitmap_Source(Extruder_Icon_Info);
#if defined(LCD_PORTRAIT) cmd.Cmd_Bitmap_Layout(Extruder_Icon_Info);
BTI(BTN_POS(1,9), BTN_SIZE(2,1), TD_Icon_Info, Theme::icon_scale); cmd.Cmd_Bitmap_Size (Extruder_Icon_Info);
#else
BTI(BTN_POS(3,7), BTN_SIZE(1,2), TD_Icon_Info, Theme::icon_scale);
#endif
#if defined(LCD_PORTRAIT) BTN_TAG(0)
#define GRID_COLS 8 BTI(BTN_POS(1,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale);
#else BTI(BTN_POS(5,1), BTN_SIZE(1,1), Extruder_Icon_Info, Theme::icon_scale);
#define GRID_COLS 12
#endif
// 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); BTN_TAG(0)
cmd.Cmd_Bitmap_Layout(Extruder_Icon_Info); BTI(BTN_POS(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, Theme::icon_scale);
cmd.Cmd_Bitmap_Size (Extruder_Icon_Info);
BTN_TAG(0) // Draw Fan Percent Bitmap on Bed Heat Button
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);
#if EXTRUDERS == 1 cmd.Cmd_Bitmap_Source(Fan_Icon_Info);
BTX( BTN_POS(6,1), BTN_SIZE(2,1), F("-"), FONT_MED); cmd.Cmd_Bitmap_Layout(Fan_Icon_Info);
#endif cmd.Cmd_Bitmap_Size (Fan_Icon_Info);
// Draw Bed Heat Bitmap on Bed Heat Button BTN_TAG(0)
cmd.Cmd_Bitmap_Source(Bed_Heat_Icon_Info); BTI(BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, Theme::icon_scale);
cmd.Cmd_Bitmap_Layout(Bed_Heat_Icon_Info); }
cmd.Cmd_Bitmap_Size (Bed_Heat_Icon_Info);
BTN_TAG(0) #define ROUND(val) uint16_t((val)+0.5)
BTI(BTN_POS(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, Theme::icon_scale);
// Draw Fan Percent Bitmap on Bed Heat Button void StatusScreen::dynamic_temperature() {
CLCD::CommandFifo cmd;
cmd.Cmd_Bitmap_Source(Fan_Icon_Info); char e0_str[15];
cmd.Cmd_Bitmap_Layout(Fan_Icon_Info); char e1_str[15];
cmd.Cmd_Bitmap_Size (Fan_Icon_Info); 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) #if EXTRUDERS == 2
BTI(BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, Theme::icon_scale); 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(); BTX( BTN_POS(2,1), BTN_SIZE(3,1), e0_str, FONT_MED);
dlcache.store(); 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; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
/* Dynamic content, non-cached data follows */
#if defined(LCD_PORTRAIT) #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 #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 #endif
}
BTN_TAG(0) void StatusScreen::dynamic_progress() {
CLCD::CommandFifo cmd;
const uint32_t elapsed = Marlin_LCD_API::getProgress_seconds_elapsed(); const uint32_t elapsed = Marlin_LCD_API::getProgress_seconds_elapsed();
const uint8_t hrs = elapsed/3600; const uint8_t hrs = elapsed/3600;
const uint8_t min = (elapsed/60)%60; 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() ); char time_str[10];
BTX( BTN_POS(9,2), BTN_SIZE(4,1), b, FONT_MED); char progress_str[10];
#endif
sprintf_P(b, PSTR("%-3d / %-3d C"), Marlin_LCD_API::getActualTemp_celsius(1), Marlin_LCD_API::getActualTemp_celsius(1) ); sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min);
BTX( BTN_POS(2,1), BTN_SIZE(3,1), b, FONT_MED); sprintf_P(progress_str, PSTR("%-3d %%"), Marlin_LCD_API::getProgress_percent() );
#if EXTRUDERS == 2 #if defined(LCD_PORTRAIT)
sprintf_P(b, PSTR("%-3d / %-3d C"), Marlin_LCD_API::getActualTemp_celsius(2), Marlin_LCD_API::getTargetTemp_celsius(2) ); BTN_TAG(0)
BTX( BTN_POS(6,1), BTN_SIZE(3,1), b, FONT_MED); 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 #endif
}
sprintf_P(b, PSTR("%-3d / %-3d " ), Marlin_LCD_API::getActualTemp_celsius(0), Marlin_LCD_API::getActualTemp_celsius(0) ); #define GRID_COLS 4
BTX( BTN_POS(2,2), BTN_SIZE(3,1), b, FONT_MED);
sprintf_P(b, PSTR("%-3d %%"), Marlin_LCD_API::getFan_percent(0) ); void StatusScreen::static_interaction_buttons() {
BTX( BTN_POS(6,2), BTN_SIZE(3,1), b, FONT_MED); CLCD::CommandFifo cmd;
#define GRID_COLS 1
#if defined(LCD_PORTRAIT) #if defined(LCD_PORTRAIT)
RGB(status_msg) BTN( BTN_POS(1,4), BTN_SIZE(1,1), 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);
#else BTN_TAG(3) THEME(navi_btn) BTN( BTN_POS(1,9), BTN_SIZE(2,1), F(""), MENU_BTN_STYLE);
RGB(status_msg) BTN( BTN_POS(1,3), BTN_SIZE(1,2), lcd_status_message, FONT_LRG, OPT_FLAT); 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 #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); cmd.Cmd_Bitmap_Source(TD_Icon_Info);
strcat_P(b, PSTR(" mm")); cmd.Cmd_Bitmap_Layout(TD_Icon_Info);
cmd.Cmd_Bitmap_Size (TD_Icon_Info);
BTN_TAG(3)
#if defined(LCD_PORTRAIT) #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 #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 #endif
}
#define GRID_COLS 1
dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Y), 5, 1, b); void StatusScreen::dynamic_status_message() {
strcat_P(b, PSTR(" mm")); CLCD::CommandFifo cmd;
#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
dtostrf(Marlin_LCD_API::getAxisPosition_mm(Marlin_LCD_API::Z), 5, 1, b);
strcat_P(b, PSTR(" mm"));
#if defined(LCD_PORTRAIT) #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 #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 #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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
@ -595,57 +688,60 @@ void StatusScreen::onTouchStart(uint8_t tag) {
/************************************ MENU SCREEN *******************************/ /************************************ 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() { void MenuScreen::onRefresh() {
static CLCD::DLCache dlcache; static CLCD::DLCache dlcache;
CLCD::CommandFifo cmd;
cmd.Cmd(CMD_DLSTART);
if(dlcache.hasData()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear_Color(Theme::background);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
#if defined(LCD_PORTRAIT) #if defined(LCD_PORTRAIT)
#define GRID_ROWS 7 BTN_TAG(2) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), MENU_BTN_STYLE);
#define GRID_COLS 2 BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE);
BTN_TAG(2) RGB(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), 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(3) RGB(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE);
BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(2,1), F("Temperature"), MENU_BTN_STYLE);
#define GRID_COLS 1 BTN_TAG(6) THEME(menu_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Advanced Settings"), MENU_BTN_STYLE);
BTN_TAG(4) RGB(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Disable Steppers"), 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);
BTN_TAG(5) RGB(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Temperature"), MENU_BTN_STYLE); #else
BTN_TAG(6) RGB(menu_btn) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("Advanced Settings"), MENU_BTN_STYLE); BTN_TAG(2) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Auto Home"), 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(3) THEME(menu_btn) BTN( BTN_POS(1,2), BTN_SIZE(1,1), F("Move Axis"), MENU_BTN_STYLE);
BTN_TAG(7) RGB(menu_btn) BTN( BTN_POS(1,6), BTN_SIZE(1,1), F("About Firmware"), MENU_BTN_STYLE); BTN_TAG(4) THEME(menu_btn) BTN( BTN_POS(1,3), BTN_SIZE(1,1), F("Disable Steppers"), MENU_BTN_STYLE);
#define MARGIN_T 15 BTN_TAG(5) THEME(menu_btn) BTN( BTN_POS(2,1), BTN_SIZE(1,1), F("Temperature"), MENU_BTN_STYLE);
BTN_TAG(1) RGB(navi_btn) BTN( BTN_POS(1,7), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE); BTN_TAG(6) THEME(menu_btn) BTN( BTN_POS(2,2), BTN_SIZE(1,1), F("Configuration"), MENU_BTN_STYLE);
#define MARGIN_T 5 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 #else
#define GRID_ROWS 4 BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE);
#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
#endif #endif
cmd.Cmd(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); #define MARGIN_T 5
cmd.Cmd_Execute();
dlcache.store(); dlcache.store();
} }
cmd.Cmd(DL_DISPLAY);
cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute();
} }
void MenuScreen::onTouchStart(uint8_t tag) { void MenuScreen::onTouchStart(uint8_t tag) {
@ -661,57 +757,54 @@ void MenuScreen::onTouchStart(uint8_t tag) {
/******************************* CONFIGURATION SCREEN ****************************/ /******************************* 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() { void AdvancedSettingsScreen::onRefresh() {
static CLCD::DLCache dlcache; static CLCD::DLCache dlcache;
CLCD::CommandFifo cmd;
cmd.Cmd(CMD_DLSTART);
if(dlcache.hasData()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear_Color(Theme::background);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
#if defined(LCD_PORTRAIT) #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 #else
#define GRID_ROWS 4 BTN_TAG(3) THEME(menu_btn) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("Z Offset "), MENU_BTN_STYLE);
#endif 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 BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(1,1), F("Save"), MENU_BTN_STYLE);
#if defined(LCD_PORTRAIT) BTN_TAG(2) THEME(navi_btn) BTN( BTN_POS(2,4), BTN_SIZE(1,1), F("Back"), MENU_BTN_STYLE);
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);
#endif #endif
cmd.Cmd(DL_DISPLAY);
cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute();
dlcache.store(); dlcache.store();
} }
cmd.Cmd(DL_DISPLAY);
cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute();
} }
void AdvancedSettingsScreen::onTouchStart(uint8_t tag) { void AdvancedSettingsScreen::onTouchStart(uint8_t tag) {
@ -725,20 +818,25 @@ void AdvancedSettingsScreen::onTouchStart(uint8_t tag) {
/******************************** CALIBRATION SCREEN ****************************/ /******************************** CALIBRATION SCREEN ****************************/
#define GRID_COLS 4
#define GRID_ROWS 16
void CalibrationScreen::onRefresh() { void CalibrationScreen::onRefresh() {
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART); cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear_Color(Theme::background);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
#define GRID_COLS 4
#define GRID_ROWS 16
#if defined(LCD_PORTRAIT) #if defined(LCD_PORTRAIT)
BTX( BTN_POS(1,8), BTN_SIZE(4,1), F("Touch the dots"), FONT_LRG); 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); BTX( BTN_POS(1,9), BTN_SIZE(4,1), F("to calibrate"), FONT_LRG);
#else #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 #endif
cmd.Cmd(CMD_CALIBRATE); cmd.Cmd(CMD_CALIBRATE);
@ -748,13 +846,17 @@ void CalibrationScreen::onRefresh() {
} }
void CalibrationScreen::onIdle() { void CalibrationScreen::onIdle() {
if(CLCD::CommandFifo::Is_Idle()) { if(CLCD::CommandFifo::Cmd_Is_Idle()) {
GOTO_SCREEN(StatusScreen); GOTO_SCREEN(StatusScreen);
} }
} }
/***************************** CALIBRATION REGISTERS SCREEN ****************************/ /***************************** CALIBRATION REGISTERS SCREEN ****************************/
#define MARGIN_T 5
#define GRID_ROWS 7
#define GRID_COLS 2
void CalibrationRegistersScreen::onRefresh() { void CalibrationRegistersScreen::onRefresh() {
const uint32_t T_Transform_A = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_A); 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); const uint32_t T_Transform_B = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_B);
@ -765,28 +867,24 @@ void CalibrationRegistersScreen::onRefresh() {
char b[20]; char b[20];
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd(CMD_DLSTART); cmd.Cmd(CMD_DLSTART);
cmd.Cmd_Clear_Color(Theme::background); cmd.Cmd_Clear_Color(Theme::background);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
#define MARGIN_T 5
#define GRID_ROWS 7
#define GRID_COLS 2
BTN_TAG(0) BTN_TAG(0)
RGB(transformA) BTN( BTN_POS(1,1), BTN_SIZE(1,1), F("TOUCH TRANSFORM_A"), 28, OPT_3D); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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); THEME(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(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_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); 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 #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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
@ -812,147 +910,162 @@ void CalibrationRegistersScreen::onTouchStart(uint8_t tag) {
/*************************** GENERIC VALUE ADJUSTMENT SCREEN ******************************/ /*************************** 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; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
cmd.Cmd_Clear_Color(Theme::adjust_bg); cmd.Cmd_Clear_Color(Theme::adjust_bg);
cmd.Cmd_Clear(1,1,1); cmd.Cmd_Clear(1,1,1);
#if defined(LCD_PORTRAIT) // Draw all the buttons in the off state.
#define GRID_COLS 6 THEME(toggle_off);
#define GRID_ROWS 9 draw_increment_btn(23 - decimals, decimals);
#define EDGE_R 20 draw_increment_btn(24 - decimals, decimals);
#else draw_increment_btn(25 - decimals, decimals);
#define GRID_COLS 9 draw_increment_btn(26 - decimals, decimals);
#define GRID_ROWS 6
#define EDGE_R 40
#endif
#if defined(LCD_PORTRAIT) #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) THEME(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(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);
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);
#else #else
BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(3,1), BTN_SIZE(4,1), heading, FONT_MED, OPT_FLAT); 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( 0) RGB(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);
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
#endif #endif
cmd.Cmd_Execute();
} }
void ValueAdjusters::static_value(int line, progmem_str label) { void ValueAdjusters::heading_t::dynamic_parts() const {
CLCD::CommandFifo cmd; CLCD::CommandFifo cmd;
cmd.Cmd_Start();
#if defined(LCD_PORTRAIT) THEME(toggle_on);
#define GRID_COLS 6 draw_increment_btn(increment, decimals);
#define GRID_ROWS 9 }
#define EDGE_R 20
#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 #else
#define GRID_COLS 9 #define EDGE_R 20
#define GRID_ROWS 6
#define EDGE_R 40
#endif #endif
#endif
BTN_TAG( 0) BTN( BTN_POS(3,line+1), BTN_SIZE(2,1), F(""), FONT_SML, OPT_FLAT); void ValueAdjusters::adjuster_t::static_parts() const {
BTN_TAG( 0) RGB(adjust_bg) BTN( BTN_POS(1,line+1), BTN_SIZE(2,1), label, FONT_SML, OPT_FLAT); CLCD::CommandFifo cmd;
BTN_TAG(2*line ) RGB(incr_btn) BTN( BTN_POS(5,line+1), BTN_SIZE(1,1), F("-"), FONT_MED, OPT_3D); progmem_str str = (progmem_str) label;
BTN_TAG(2*line + 1) RGB(incr_btn) BTN( BTN_POS(6,line+1), BTN_SIZE(1,1), F("+"), FONT_MED, OPT_3D); 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; CLCD::CommandFifo cmd;
cmd.Cmd_Start(); char b[32];
#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[255]; dtostrf(value, 5, decimals, b);
dtostrf(value, 5, 1, b);
strcat_P(b, PSTR(" ")); strcat_P(b, PSTR(" "));
strcat_P(b, (const char*) units); 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) { void ValueAdjusters::onTouchStart(uint8_t tag) {
switch(tag) { switch(tag) {
case 1: GOTO_PREVIOUS(); return; case 1: GOTO_PREVIOUS(); return;
case 2 ... 9: current_screen.onTouchHeld(tag); return; case 2 ... 9: current_screen.onTouchHeld(tag); return;
case 20: increment = 0.1; break; case 20 ... 25: increment = tag; break;
case 21: increment = 1; break;
case 22: increment = 10; break;
case 23: increment = 100; break;
} }
current_screen.onRefresh(); 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 ******************************/ /******************************** MOVE AXIS SCREEN ******************************/
void MoveAxisScreen::onRefresh() { void MoveAxisScreen::onRefresh() {
static CLCD::DLCache dlcache; 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()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd; a.static_parts();
cmd.Cmd_Start(); b.static_parts();
cmd.Cmd(CMD_DLSTART); c.static_parts();
cmd.Cmd_Execute(); d.static_parts();
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:"));
dlcache.store(); 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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute(); cmd.Cmd_Execute();
@ -960,12 +1073,12 @@ void MoveAxisScreen::onRefresh() {
void MoveAxisScreen::onTouchHeld(uint8_t tag) { void MoveAxisScreen::onTouchHeld(uint8_t tag) {
switch(tag) { switch(tag) {
case 2: marlin_x_axis -= increment; break; case 2: marlin_x_axis -= getIncrement(); break;
case 3: marlin_x_axis += increment; break; case 3: marlin_x_axis += getIncrement(); break;
case 4: marlin_y_axis -= increment; break; case 4: marlin_y_axis -= getIncrement(); break;
case 5: marlin_y_axis += increment; break; case 5: marlin_y_axis += getIncrement(); break;
case 6: marlin_z_axis -= increment; break; case 6: marlin_z_axis -= getIncrement(); break;
case 7: marlin_z_axis += increment; break; case 7: marlin_z_axis += getIncrement(); break;
} }
onRefresh(); onRefresh();
} }
@ -974,29 +1087,29 @@ void MoveAxisScreen::onTouchHeld(uint8_t tag) {
void TemperatureScreen::onRefresh() { void TemperatureScreen::onRefresh() {
static CLCD::DLCache dlcache; 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()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd; a.static_parts();
cmd.Cmd_Start(); b.static_parts();
cmd.Cmd(CMD_DLSTART); c.static_parts();
d.static_parts();
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();
dlcache.store(); 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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute(); cmd.Cmd_Execute();
@ -1004,12 +1117,12 @@ void TemperatureScreen::onRefresh() {
void TemperatureScreen::onTouchHeld(uint8_t tag) { void TemperatureScreen::onTouchHeld(uint8_t tag) {
switch(tag) { switch(tag) {
case 2: marlin_e0_temp -= increment; break; case 2: marlin_e0_temp -= getIncrement(); break;
case 3: marlin_e0_temp += increment; break; case 3: marlin_e0_temp += getIncrement(); break;
case 4: marlin_bed_temp -= increment; break; case 4: marlin_bed_temp -= getIncrement(); break;
case 5: marlin_bed_temp += increment; break; case 5: marlin_bed_temp += getIncrement(); break;
case 6: marlin_fan_speed -= increment; break; case 6: marlin_fan_speed -= getIncrement(); break;
case 7: marlin_fan_speed += increment; break; case 7: marlin_fan_speed += getIncrement(); break;
} }
onRefresh(); onRefresh();
} }
@ -1018,31 +1131,32 @@ void TemperatureScreen::onTouchHeld(uint8_t tag) {
void StepsScreen::onRefresh() { void StepsScreen::onRefresh() {
static CLCD::DLCache dlcache; 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()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd; a.static_parts();
cmd.Cmd_Start(); b.static_parts();
cmd.Cmd(CMD_DLSTART); c.static_parts();
d.static_parts();
ValueAdjusters::static_heading(F("Steps/mm")); e.static_parts();
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();
dlcache.store(); 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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute(); cmd.Cmd_Execute();
@ -1050,14 +1164,14 @@ void StepsScreen::onRefresh() {
void StepsScreen::onTouchHeld(uint8_t tag) { void StepsScreen::onTouchHeld(uint8_t tag) {
switch(tag) { switch(tag) {
case 2: marlin_x_steps -= increment; break; case 2: marlin_x_steps -= getIncrement(); break;
case 3: marlin_x_steps += increment; break; case 3: marlin_x_steps += getIncrement(); break;
case 4: marlin_y_steps -= increment; break; case 4: marlin_y_steps -= getIncrement(); break;
case 5: marlin_y_steps += increment; break; case 5: marlin_y_steps += getIncrement(); break;
case 6: marlin_z_steps -= increment; break; case 6: marlin_z_steps -= getIncrement(); break;
case 7: marlin_z_steps += increment; break; case 7: marlin_z_steps += getIncrement(); break;
case 8: marlin_e0_steps -= increment; break; case 8: marlin_e0_steps -= getIncrement(); break;
case 9: marlin_e0_steps += increment; break; case 9: marlin_e0_steps += getIncrement(); break;
} }
onRefresh(); onRefresh();
} }
@ -1066,25 +1180,23 @@ void StepsScreen::onTouchHeld(uint8_t tag) {
void ZOffsetScreen::onRefresh() { void ZOffsetScreen::onRefresh() {
static CLCD::DLCache dlcache; 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()) { if(dlcache.hasData()) {
dlcache.append(); dlcache.append();
} else { } else {
CLCD::CommandFifo cmd; a.static_parts();
cmd.Cmd_Start(); b.static_parts();
cmd.Cmd(CMD_DLSTART);
ValueAdjusters::static_heading(F("Z Offset"));
RGB(z_axis) ValueAdjusters::static_value(2, F("Z Offset:"));
cmd.Cmd_Execute();
dlcache.store(); 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(DL_DISPLAY);
cmd.Cmd(CMD_SWAP); cmd.Cmd(CMD_SWAP);
cmd.Cmd_Execute(); cmd.Cmd_Execute();
@ -1092,8 +1204,8 @@ void ZOffsetScreen::onRefresh() {
void ZOffsetScreen::onTouchHeld(uint8_t tag) { void ZOffsetScreen::onTouchHeld(uint8_t tag) {
switch(tag) { switch(tag) {
case 4: marlin_z_offset -= increment; break; case 4: marlin_z_offset -= getIncrement(); break;
case 5: marlin_z_offset += increment; break; case 5: marlin_z_offset += getIncrement(); break;
} }
onRefresh(); onRefresh();
} }
@ -1122,7 +1234,7 @@ void lcd_update() {
// If the LCD is processing commands, don't check // If the LCD is processing commands, don't check
// for tags since they may be changing and could // for tags since they may be changing and could
// cause spurious events. // cause spurious events.
if(!CLCD::CommandFifo::Is_Idle()) { if(!CLCD::CommandFifo::Cmd_Is_Idle()) {
return; return;
} }
@ -1139,6 +1251,14 @@ void lcd_update() {
else if(pressed != NONE) { else if(pressed != NONE) {
current_screen.onTouchEnd(pressed); current_screen.onTouchEnd(pressed);
pressed = NONE; 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) { else if(pressed == NONE) {
@ -1148,8 +1268,12 @@ void lcd_update() {
last_repeat = millis(); last_repeat = millis();
#if defined(UI_FRAMEWORK_DEBUG) #if defined(UI_FRAMEWORK_DEBUG)
Serial.print("Touch start: "); #if defined (SERIAL_PROTOCOLLNPAIR)
Serial.println(tag); SERIAL_PROTOCOLLNPAIR("Touch start: ", tag);
#else
Serial.print("Touch start: ");
Serial.println(tag);
#endif
#endif #endif
if(lastScreen != current_screen.getScreen()) { if(lastScreen != current_screen.getScreen()) {

@ -117,11 +117,11 @@ class ScreenRef {
/********************** SCREEN STACK ******************************/ /********************** SCREEN STACK ******************************/
// To conserve dynamic memory, the screen stack is hard-coded to // 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 { class ScreenStack : public ScreenRef {
private: private:
uint8_t stack[3]; uint8_t stack[4];
public: public:
void start() { void start() {
@ -130,6 +130,7 @@ class ScreenStack : public ScreenRef {
} }
void push() { void push() {
stack[3] = stack[2];
stack[2] = stack[1]; stack[2] = stack[1];
stack[1] = stack[0]; stack[1] = stack[0];
stack[0] = getType(); stack[0] = getType();
@ -139,7 +140,8 @@ class ScreenStack : public ScreenRef {
setType(stack[0]); setType(stack[0]);
stack[0] = stack[1]; stack[0] = stack[1];
stack[1] = stack[2]; stack[1] = stack[2];
stack[2] = 0; stack[2] = stack[3];
stack[3] = 0;
} }
void goTo(onEntry_func_t s) { void goTo(onEntry_func_t s) {

@ -49,17 +49,17 @@ const uint8_t Marlin_LCD_API::fanCount = 1;
const float Marlin_LCD_API::getActualTemp_celsius(const uint8_t extruder) { const float Marlin_LCD_API::getActualTemp_celsius(const uint8_t extruder) {
if(extruder) { if(extruder) {
thermalManager.degHotend(extruder-1); return thermalManager.degHotend(extruder-1);
} else { } else {
thermalManager.degBed(); return thermalManager.degBed();
} }
} }
const float Marlin_LCD_API::getTargetTemp_celsius(const uint8_t extruder) { const float Marlin_LCD_API::getTargetTemp_celsius(const uint8_t extruder) {
if(extruder) { if(extruder) {
thermalManager.degTargetHotend(extruder-1); return thermalManager.degTargetHotend(extruder-1);
} else { } 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() { const uint8_t Marlin_LCD_API::getProgress_percent() {
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
return card.percentDone(); return card.percentDone();
#endif #endif
} }
const uint32_t Marlin_LCD_API::getProgress_seconds_elapsed() { const uint32_t Marlin_LCD_API::getProgress_seconds_elapsed() {

@ -349,10 +349,12 @@
#endif #endif
#if defined(LULZBOT_USE_TOUCH_UI) #if defined(LULZBOT_USE_TOUCH_UI)
#define IS_FT810 #define IS_FT800
#define LCD_PORTRAIT //#define IS_FT810
#define LCD_UPSIDE_DOWN //#define LCD_PORTRAIT
//#define UI_FRAMEWORK_DEBUG //#define LCD_UPSIDE_DOWN
//#define LCD_800x480
#define UI_FRAMEWORK_DEBUG
#include "AO_UI_Marlin_LCD_API.h" #include "AO_UI_Marlin_LCD_API.h"
#include "AO_UI_Framework.h" #include "AO_UI_Framework.h"
#include "AO_FT810_Constants.h" #include "AO_FT810_Constants.h"

Loading…
Cancel
Save