- Status screen works and you can navigate the menus, but the menus are non-functional.master
parent
e9ed3e78b6
commit
0e03d1ac3f
@ -0,0 +1,863 @@
|
||||
/*********************
|
||||
* FT810_Functions.h *
|
||||
*********************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* FUNCTION MAP *
|
||||
* *
|
||||
* SPI and FT800/810 Commands *
|
||||
* *
|
||||
* CLCD::spiSelect() Set CS line to 0 *
|
||||
* CLCD::spiDeselect() Set CS Line to 1 *
|
||||
* CLCD::Reset() Toggle FT800/810 Power Down Line 50 ms *
|
||||
* CLCD::spiInit() Configure I/O Lines for SPI *
|
||||
* CLCD::spiTransfer() Send/Receive 1 SPI Byte *
|
||||
* CLCD::Init() Set FT800/810 Registers *
|
||||
* CLCD::Enable() Turn On FT800/810 PCLK *
|
||||
* CLCD::Disable() Turn Off FT8880/810 PCLK *
|
||||
* CLCD::Set_Backlight() Set LCD Backlight Level *
|
||||
* *
|
||||
* MEMORY READ FUNCTIONS *
|
||||
* *
|
||||
* CLCD::Mem_ReadAddr() Send 32-Bit Address *
|
||||
* CLCD::Mem_Read8() Read 1 Byte *
|
||||
* CLCD::Mem_Read16() Read 2 Bytes *
|
||||
* CLCD::Mem_Read32() Read 4 Bytes *
|
||||
* *
|
||||
* MEMORY WRITE FUNCTIONS *
|
||||
* *
|
||||
* CLCD::Mem_WriteAddr() Send 24-Bit Address *
|
||||
* CLCD::Mem_Write8() Write 1 Byte *
|
||||
* CLCD::Mem_Write16() Write 2 Bytes *
|
||||
* CLCD::Mem_Write32() Write 4 Bytes *
|
||||
* *
|
||||
* HOST COMMAND FUNCTION *
|
||||
* *
|
||||
* CLCD::Host_Cmd() Send 24-Bit Host Command *
|
||||
* *
|
||||
* COMMAND BUFFER FUNCTIONS *
|
||||
* *
|
||||
* CLCD::Cmd() Send 32-Bit Value(4 Bytes)CMD Buffer *
|
||||
* CLCD::Cmd() Send Data Structure with 32-Bit Cmd *
|
||||
* CLCD::Cmd_Str() Send Text String in 32-Bit Multiples *
|
||||
|
||||
* *
|
||||
* FT800/810 GRAPHIC COMMANDS *
|
||||
* *
|
||||
* class CLCD:CommandFifo {} Class to control Cmd FIFO *
|
||||
|
||||
* Fifo::Start() Wait for CP finish - Set FIFO Ptr *
|
||||
* Fifo::Execute() Set REG_CMD_WRITE and start CP *
|
||||
* Fifo::Reset() Set Cmd Buffer Pointers to 0 *
|
||||
*
|
||||
* Fifo::Cmd_Clear_Color() Set Clear Screen Color *
|
||||
* Fifo::Cmd_Clear() Clear Color-Stencil-Tag Buffer(s) *
|
||||
* Fifo::Cmd_Color() Set Current Color *
|
||||
* Fifo::Cmd_Set_Foreground_Color Set Graphic Item Foreground Color *
|
||||
* Fifo::Cmd_Set_Background_Color Set Graphic Item Background Color *
|
||||
* Fifo::Cmd_Bitmap_Source() Set RAM Address of Bitmap Data *
|
||||
* Fifo::Cmd_Bitmap_Layout() Configure Bitmap Format and Layout *
|
||||
* Fifo::Cmd_Bitmap_Size() Set Bitmap Dimensions *
|
||||
* Fifo::Cmd_Bitmap_Handle() Assign Handle ID to a Bitmap *
|
||||
* Fifo::Cmd_Begin() Begin Drawing a Primative *
|
||||
* Fifo::Cmd_Mem_Copy() Copy a Block of Memory *
|
||||
* Fifo::Cmd_Append() Append Commands to Current DL *
|
||||
* Fifo::Cmd_Gradient_Color() Set 3D Button Highlight Color *
|
||||
* Fifo::Cmd_Vertex_2II() Set Coordinates of Graphics Primative *
|
||||
* Fifo::Cmd_Draw_Button() Draw Button with Bulk Write *
|
||||
* Fifo::Cmd_Draw_Text() Draw Text with Bulk Write *
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**************************************************
|
||||
* RAM_G Graphics RAM Allocation *
|
||||
* *
|
||||
* Address Use *
|
||||
* *
|
||||
* 8000 Extruder Bitmap *
|
||||
* 8100 Bed Heat Bitmap *
|
||||
* 8200 Fan Bitmap *
|
||||
* 8300 Thumb Drive Symbol Bitmap *
|
||||
* 35000 Static DL Space (FT800) *
|
||||
* F5000 Static DL Space (FT810) *
|
||||
**************************************************/
|
||||
|
||||
#ifndef _AO_FT810_FUNC_H
|
||||
#define _AO_FT810_FUNC_H
|
||||
|
||||
#if defined(LCD_IS_FT800)
|
||||
#define DL_CACHE_START 0x035000
|
||||
#else
|
||||
#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;
|
||||
#elif defined(LCD_480x272)
|
||||
using namespace FTDI_LCD_480x272;
|
||||
#endif
|
||||
|
||||
using namespace FTDI;
|
||||
|
||||
typedef const __FlashStringHelper *progmem_str;
|
||||
|
||||
#define FORCEDINLINE __attribute__((always_inline))
|
||||
|
||||
class CLCD {
|
||||
private:
|
||||
static void spiInit (void);
|
||||
static void spiSelect (void);
|
||||
static void spiDeselect (void);
|
||||
static uint8_t spiTransfer (uint8_t spiOutByte);
|
||||
static void Mem_ReadAddr (uint32_t Reg_Address);
|
||||
static void Mem_WriteAddr (uint32_t Reg_Address);
|
||||
static void Mem_Read_Bulk (uint32_t Reg_Address, uint8_t *Data, uint16_t Len);
|
||||
static void Mem_Write_Bulk (uint32_t Reg_Address, const void *Data, uint16_t Len, uint8_t Padding = 0);
|
||||
static void Mem_Write_Bulk (uint32_t Reg_Address, progmem_str Str, uint16_t Len, uint8_t Padding = 0);
|
||||
|
||||
public:
|
||||
static uint8_t Mem_Read8 (uint32_t Reg_Address);
|
||||
static uint16_t Mem_Read16 (uint32_t Reg_Address);
|
||||
static uint32_t Mem_Read32 (uint32_t Reg_Address);
|
||||
static void Mem_Write8 (uint32_t Reg_Address, uint8_t W_Data);
|
||||
static void Mem_Write16 (uint32_t Reg_Address, uint16_t W_Data);
|
||||
static void Mem_Write32 (uint32_t Reg_Address, uint32_t W_Data);
|
||||
|
||||
static inline uint32_t pack_rgb(uint8_t r, uint8_t g, uint8_t b);
|
||||
|
||||
public:
|
||||
typedef struct {
|
||||
const uint8_t format;
|
||||
const uint16_t linestride;
|
||||
const uint8_t filter;
|
||||
const uint8_t wrapx;
|
||||
const uint8_t wrapy;
|
||||
const uint32_t RAMG_addr;
|
||||
const uint16_t width;
|
||||
const uint16_t height;
|
||||
} bitmap_info_t;
|
||||
|
||||
class CommandFifo;
|
||||
class SoundPlayer;
|
||||
class DLCache;
|
||||
|
||||
public:
|
||||
static void Init (void);
|
||||
static void Turn_On_Backlight (void);
|
||||
static void Reset (void);
|
||||
static void Test_Pulse(void);
|
||||
static void Enable (void);
|
||||
static void Disable (void);
|
||||
static void Set_Backlight (uint16_t Freq, uint8_t Duty);
|
||||
static void Host_Cmd (unsigned char Host_Command, unsigned char Byte2);
|
||||
|
||||
static void Get_Font_Metrics(uint8_t font, struct FontMetrics &fm);
|
||||
static void Flash_Write_RGB332_Bitmap(uint32_t Mem_Address, const unsigned char* pRGB332_Array, uint16_t Num_Bytes);
|
||||
|
||||
static uint8_t Get_Tag() {return Mem_Read8(REG_TOUCH_TAG);}
|
||||
};
|
||||
|
||||
/********************************* FT800/810 Commands *********************************/
|
||||
|
||||
#define MULTIPLE_OF_4(val) ((((val)+3)>>2)<<2)
|
||||
|
||||
void CLCD::Enable (void) {
|
||||
Mem_Write8(REG_PCLK, Pclk);
|
||||
}
|
||||
|
||||
void CLCD::Disable (void) {
|
||||
Mem_Write8(REG_PCLK, 0x00);
|
||||
}
|
||||
|
||||
void CLCD::Set_Backlight (uint16_t Freq, uint8_t Duty) {
|
||||
Mem_Write16(REG_PWM_HZ, Freq);
|
||||
Mem_Write8(REG_PWM_DUTY, Duty);
|
||||
}
|
||||
|
||||
void CLCD::Turn_On_Backlight (void) {
|
||||
Set_Backlight(0x00FA, 128);
|
||||
}
|
||||
|
||||
struct FontMetrics {
|
||||
uint8_t char_widths[128];
|
||||
uint32_t font_format;
|
||||
uint32_t font_stride;
|
||||
uint32_t font_width;
|
||||
uint32_t font_height;
|
||||
uint32_t font_ptr;
|
||||
};
|
||||
|
||||
void CLCD::Get_Font_Metrics(uint8_t font, struct FontMetrics &fm) {
|
||||
Mem_Read_Bulk(ROM_FONT_ADDR + 148 * (font - 16), (uint8_t*) &fm, 148);
|
||||
}
|
||||
|
||||
// HOST COMMAND FUNCTION
|
||||
|
||||
void CLCD::Host_Cmd (unsigned char Host_Command, unsigned char Byte2) { // Sends 24-Bit Host Command to LCD
|
||||
if(Host_Command != ACTIVE) {
|
||||
Host_Command |= 0x40;
|
||||
}
|
||||
|
||||
spiSelect();
|
||||
|
||||
spiTransfer(Host_Command); // Write Byte 1
|
||||
|
||||
spiTransfer(Byte2); // Write Byte 2
|
||||
|
||||
spiTransfer(0x00); // Write Byte 3
|
||||
|
||||
spiDeselect();
|
||||
}
|
||||
|
||||
void CLCD::Flash_Write_RGB332_Bitmap(uint32_t Mem_Address, const unsigned char* pRGB332_Array, uint16_t Num_Bytes)
|
||||
{
|
||||
unsigned char Flash_Byte;
|
||||
|
||||
for(unsigned int i = 0; i < Num_Bytes; i++) {
|
||||
Flash_Byte = pgm_read_byte_near(pRGB332_Array + i);
|
||||
|
||||
Mem_Write8((Mem_Address + i), Flash_Byte);
|
||||
}
|
||||
}
|
||||
|
||||
/******************* FT800/810 Graphic Commands *********************************/
|
||||
|
||||
class CLCD::CommandFifo {
|
||||
protected:
|
||||
static uint32_t getRegCmdWrite();
|
||||
static uint32_t getRegCmdRead();
|
||||
|
||||
#if defined(LCD_IS_FT800)
|
||||
static uint32_t command_write_ptr;
|
||||
template <class T> void _write_unaligned(T data, uint16_t len);
|
||||
#else
|
||||
uint32_t getRegCmdBSpace();
|
||||
#endif
|
||||
void Cmd_Start(void);
|
||||
|
||||
public:
|
||||
template <class T> void write(T data, uint16_t len);
|
||||
|
||||
public:
|
||||
CommandFifo() {Cmd_Start();}
|
||||
|
||||
static void Cmd_Reset (void);
|
||||
static bool Cmd_Is_Idle();
|
||||
static void Cmd_Wait_Until_Idle();
|
||||
|
||||
void Cmd_Execute(void);
|
||||
|
||||
void Cmd (uint32_t cmd32);
|
||||
void Cmd (void* data, uint16_t len);
|
||||
void Cmd_Str (char* data);
|
||||
void Cmd_Str (progmem_str data);
|
||||
void Cmd_Clear_Color (uint32_t rgb);
|
||||
void Cmd_Clear (bool Clr, bool Stl, bool Tag);
|
||||
void Cmd_Color (uint32_t rgb);
|
||||
void Cmd_Set_Foreground_Color (uint32_t rgb);
|
||||
void Cmd_Set_Background_Color (uint32_t rgb);
|
||||
void Cmd_Set_Tag (uint8_t Tag);
|
||||
void Cmd_Bitmap_Source (uint32_t RAM_G_Addr);
|
||||
|
||||
// The following functions *must* be inlined since we are relying on the compiler to do
|
||||
// substitution of the constants from the data structure rather than actually storing
|
||||
// it in PROGMEM (which would fail, since we are not using pgm_read_near to read them).
|
||||
// Plus, by inlining, all the equations are evaluated at compile-time as everything
|
||||
// should be a constant.
|
||||
|
||||
FORCEDINLINE void Cmd_Bitmap_Source (const bitmap_info_t& info) {Cmd_Bitmap_Source (info.RAMG_addr);};
|
||||
FORCEDINLINE void Cmd_Bitmap_Layout (const bitmap_info_t& info) {Cmd_Bitmap_Layout (info.format, info.linestride, info.height);};
|
||||
FORCEDINLINE void Cmd_Bitmap_Size(const bitmap_info_t& info) {Cmd_Bitmap_Size (info.filter, info.wrapx, info.wrapy, info.width, info.height);}
|
||||
FORCEDINLINE void Cmd_Draw_Button_Icon(int16_t x, int16_t y, int16_t w, int16_t h, const bitmap_info_t& info, const float scale = 1) {
|
||||
Cmd_Begin(BEGIN_BITMAPS);
|
||||
if(scale != 1) {
|
||||
Cmd(BITMAP_TRANSFORM_A | uint32_t(float(256)/scale) & 0xFFFF);
|
||||
Cmd(BITMAP_TRANSFORM_E | uint32_t(float(256)/scale) & 0xFFFF);
|
||||
}
|
||||
Cmd_Bitmap_Size(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale);
|
||||
Cmd_Vertex_2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16);
|
||||
if(scale != 1) {
|
||||
Cmd(BITMAP_TRANSFORM_A | 256);
|
||||
Cmd(BITMAP_TRANSFORM_E | 256);
|
||||
}
|
||||
}
|
||||
template<typename T> FORCEDINLINE void Cmd_Draw_Button_Text(int16_t x, int16_t y, int16_t w, int16_t h, T text, int16_t font) {
|
||||
Cmd_Draw_Text(x + w/2, y + h/2, text, font, OPT_CENTER);
|
||||
}
|
||||
|
||||
void Cmd_Bitmap_Layout (uint8_t format, uint16_t linestride, uint16_t height);
|
||||
void Cmd_Bitmap_Size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height);
|
||||
void Cmd_Bitmap_Handle (uint16_t Handle);
|
||||
void Cmd_Begin (uint32_t Primitive);
|
||||
void Cmd_Vertex_2F (uint16_t X_Coord, uint16_t Y_Coord);
|
||||
void Cmd_Vertex_2II (uint16_t X_Coord, uint16_t Y_Coord, uint8_t B_Handle, uint8_t Cell);
|
||||
|
||||
template<typename T> void Cmd_Draw_Button(int16_t x, int16_t y, int16_t w, int16_t h, T text, int16_t font, uint16_t option);
|
||||
template<typename T> void Cmd_Draw_Text(int16_t x, int16_t y, T text, int16_t font, uint16_t options);
|
||||
|
||||
void Cmd_Draw_Clock (int16_t x, int16_t y, int16_t r, uint16_t option, int16_t h, int16_t m, int16_t s, int16_t ms);
|
||||
void Cmd_Draw_Progress_Bar (int16_t x, int16_t y, int16_t w, int16_t h, int16_t val, int16_t range);
|
||||
void Cmd_Draw_Slider (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range);
|
||||
void Cmd_Mem_Cpy (uint32_t dst, uint32_t src, uint32_t size);
|
||||
void Cmd_Append (uint32_t ptr, uint32_t size);
|
||||
};
|
||||
|
||||
#if defined(LCD_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);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Clear_Color (uint32_t rgb) // DL Command - Set Clear Screen Color
|
||||
{
|
||||
Cmd(CLEAR_COLOR_RGB | rgb);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Clear (bool Clr, bool Stl, bool Tag) // DL Command - Clear Color-Stencil-Tag Buffer(s)
|
||||
{
|
||||
Cmd( CLEAR |
|
||||
(Clr ? 0b00000001 : 0) |
|
||||
(Stl ? 0b00000010 : 0) |
|
||||
(Tag ? 0b00000100 : 0)
|
||||
);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Color (uint32_t rgb) // DL Command - Set Current Color
|
||||
{
|
||||
Cmd(COLOR_RGB | rgb);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Set_Foreground_Color (uint32_t rgb) // Co-Processor Command - Set Foreground Color for Widgets
|
||||
{
|
||||
Cmd(CMD_FGCOLOR);
|
||||
Cmd(rgb);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Set_Background_Color (uint32_t rgb) // Co-Processor Command - Set Background Color for Widgets
|
||||
{
|
||||
Cmd(CMD_BGCOLOR);
|
||||
Cmd(rgb);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Set_Tag (uint8_t Tag)
|
||||
{
|
||||
Cmd(TAG | Tag);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Bitmap_Source (uint32_t RAM_G_Addr)
|
||||
{
|
||||
Cmd(BITMAP_SOURCE | (RAM_G_Addr & 0x000FFFFF));
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Bitmap_Layout (uint8_t format, uint16_t linestride, uint16_t height)
|
||||
{
|
||||
Cmd( BITMAP_LAYOUT |
|
||||
(uint32_t(height) << 0) |
|
||||
(uint32_t(linestride) << 9) |
|
||||
(uint32_t(format) << 19)
|
||||
);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Bitmap_Size(uint8_t filter, uint8_t wrapx, uint8_t wrapy, uint16_t width, uint16_t height)
|
||||
{
|
||||
Cmd( BITMAP_SIZE |
|
||||
(uint32_t(height) << 0) |
|
||||
(uint32_t(width) << 9) |
|
||||
(uint32_t(wrapy) << 18) |
|
||||
(uint32_t(wrapx) << 19) |
|
||||
(uint32_t(filter) << 20)
|
||||
);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Bitmap_Handle (uint16_t Handle)
|
||||
{
|
||||
Cmd( BITMAP_HANDLE | Handle);
|
||||
}
|
||||
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Begin (uint32_t Primitive)
|
||||
{
|
||||
Cmd(BEGIN + Primitive);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Vertex_2II (uint16_t X_Coord, uint16_t Y_Coord, uint8_t B_Handle, uint8_t Cell)
|
||||
{
|
||||
Cmd( VERTEX2II |
|
||||
(uint32_t(Cell) << 0) |
|
||||
(uint32_t(B_Handle) << 7) |
|
||||
(uint32_t(Y_Coord) << 12) |
|
||||
(uint32_t(X_Coord) << 21)
|
||||
);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Vertex_2F (uint16_t X_Coord, uint16_t Y_Coord)
|
||||
{
|
||||
Cmd( VERTEX2F |
|
||||
(uint32_t(Y_Coord) << 0) |
|
||||
(uint32_t(X_Coord) << 15)
|
||||
);
|
||||
}
|
||||
|
||||
template<typename T> void CLCD::CommandFifo::Cmd_Draw_Button(int16_t x, int16_t y, int16_t w, int16_t h, T text, int16_t font, uint16_t option)
|
||||
{
|
||||
struct {
|
||||
int32_t type = CMD_BUTTON;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t w;
|
||||
int16_t h;
|
||||
int16_t font;
|
||||
uint16_t option;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.x = x;
|
||||
cmd_data.y = y;
|
||||
cmd_data.w = w;
|
||||
cmd_data.h = h;
|
||||
cmd_data.font = font;
|
||||
cmd_data.option = option;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
Cmd_Str(text);
|
||||
}
|
||||
|
||||
template<typename T> void CLCD::CommandFifo::Cmd_Draw_Text(int16_t x, int16_t y, T text, int16_t font, uint16_t options)
|
||||
{
|
||||
struct {
|
||||
int32_t type = CMD_TEXT;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t font;
|
||||
uint16_t options;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.x = x;
|
||||
cmd_data.y = y;
|
||||
cmd_data.font = font;
|
||||
cmd_data.options = options;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
Cmd_Str(text);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Draw_Clock (int16_t x, int16_t y, int16_t r, uint16_t option, int16_t h, int16_t m, int16_t s, int16_t ms)
|
||||
{
|
||||
struct {
|
||||
int32_t type = CMD_CLOCK;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t r;
|
||||
uint16_t option;
|
||||
int16_t h;
|
||||
int16_t m;
|
||||
int16_t s;
|
||||
int16_t ms;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.x = x;
|
||||
cmd_data.y = y;
|
||||
cmd_data.r = r;
|
||||
cmd_data.option = option;
|
||||
cmd_data.h = h;
|
||||
cmd_data.m = m;
|
||||
cmd_data.s = s;
|
||||
cmd_data.ms = ms;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Draw_Progress_Bar (int16_t x, int16_t y, int16_t w, int16_t h, int16_t val, int16_t range)
|
||||
{
|
||||
struct {
|
||||
int32_t type = CMD_PROGRESS;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t w;
|
||||
uint16_t h;
|
||||
uint16_t val;
|
||||
uint16_t range;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.x = x;
|
||||
cmd_data.y = y;
|
||||
cmd_data.w = w;
|
||||
cmd_data.h = h;
|
||||
cmd_data.val = val;
|
||||
cmd_data.range = range;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Draw_Slider (int16_t x, int16_t y, int16_t w, int16_t h, uint16_t options, uint16_t val, uint16_t range)
|
||||
{
|
||||
struct {
|
||||
int32_t type = CMD_SLIDER;
|
||||
int16_t x;
|
||||
int16_t y;
|
||||
int16_t w;
|
||||
int16_t h;
|
||||
uint16_t options;
|
||||
uint16_t val;
|
||||
uint16_t range;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.x = x;
|
||||
cmd_data.y = y;
|
||||
cmd_data.w = w;
|
||||
cmd_data.h = h;
|
||||
cmd_data.options = options;
|
||||
cmd_data.val = val;
|
||||
cmd_data.range = range;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Mem_Cpy (uint32_t dst, uint32_t src, uint32_t size)
|
||||
{
|
||||
struct {
|
||||
uint32_t type = CMD_MEMCPY;
|
||||
uint32_t dst;
|
||||
uint32_t src;
|
||||
uint32_t size;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.dst = dst;
|
||||
cmd_data.src = src;
|
||||
cmd_data.size = size;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Append (uint32_t ptr, uint32_t size)
|
||||
{
|
||||
struct {
|
||||
uint32_t type = CMD_APPEND;
|
||||
uint32_t ptr;
|
||||
uint32_t size;
|
||||
} cmd_data;
|
||||
|
||||
cmd_data.ptr = ptr;
|
||||
cmd_data.size = size;
|
||||
|
||||
Cmd( &cmd_data, sizeof(cmd_data) );
|
||||
}
|
||||
|
||||
/******************* DISPLAY LIST CACHE MANAGEMENT ************************/
|
||||
|
||||
/* The Display List Cache mechanism stores the display list corresponding
|
||||
* to a menu into RAM_G so that on subsequent calls drawing the menu does
|
||||
* not require as much SPI traffic. Dynamic content, such as indicators,
|
||||
* should not be cached.
|
||||
*
|
||||
* The DLCache can be used like so:
|
||||
*
|
||||
* void some_function() {
|
||||
* static CLCD::DLCache dlcache;
|
||||
*
|
||||
* if(dlcache.hasData()) {
|
||||
* dlcache.append();
|
||||
* } else {
|
||||
* // Add stuff to the DL
|
||||
* dlcache.store();
|
||||
* }
|
||||
*/
|
||||
|
||||
class CLCD::DLCache {
|
||||
private:
|
||||
static uint16_t dl_free;
|
||||
uint16_t dl_addr = 0;
|
||||
uint16_t dl_size = 0;
|
||||
public:
|
||||
bool hasData();
|
||||
void store();
|
||||
void append();
|
||||
};
|
||||
|
||||
uint16_t CLCD::DLCache::dl_free = 0;
|
||||
|
||||
bool CLCD::DLCache::hasData() {
|
||||
return dl_size != 0;
|
||||
}
|
||||
|
||||
void CLCD::DLCache::store() {
|
||||
#if !defined(DL_CACHE_DISABLED)
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
// 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) > 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 {
|
||||
#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_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
|
||||
}
|
||||
|
||||
/******************* LCD INITIALIZATION ************************/
|
||||
|
||||
void CLCD::Init (void) {
|
||||
spiInit(); // Set Up I/O Lines for SPI and FT800/810 Control
|
||||
delay(50);
|
||||
|
||||
Reset(); // Power Down the FT800/810 for 50 ms
|
||||
delay(50);
|
||||
|
||||
/*
|
||||
* If driving the 4D Systems 4DLCD-FT843 Board, the following Init sequence is needed for its FT800 Driver
|
||||
*/
|
||||
|
||||
#ifdef LCD_IS_FT800 // Use External Crystal and 48 MHz System Clock
|
||||
Host_Cmd(CLKEXT, 0);
|
||||
|
||||
delay(20);
|
||||
Host_Cmd(CLK48M, 0);
|
||||
#else
|
||||
Host_Cmd(CLKINT, 0);
|
||||
delay(20);
|
||||
Host_Cmd(CLKSEL, Clksel); // Use Internal RC Oscillator and 48 MHz System Clock
|
||||
#endif
|
||||
|
||||
delay(20);
|
||||
|
||||
Host_Cmd(ACTIVE, 0); // Activate the System Clock
|
||||
delay(50);
|
||||
|
||||
delay(400);
|
||||
uint8_t Device_ID = Mem_Read8(REG_ID); // Read Device ID, Should Be 0x7C;
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
if(Device_ID != 0x7C) {
|
||||
#if defined (SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLLNPAIR("Incorrect device ID, should be 7C, got ", Device_ID);
|
||||
#else
|
||||
Serial.print(F("Incorrect device ID, should be 7C, got "));
|
||||
Serial.println(Device_ID, HEX);
|
||||
#endif
|
||||
} else {
|
||||
#if defined (SERIAL_PROTOCOLLNPGM)
|
||||
SERIAL_PROTOCOLLNPGM("Device is correct ");
|
||||
#else
|
||||
Serial.println(F("Device is correct "));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
delay(400);
|
||||
|
||||
Mem_Write8(REG_GPIO, 0x00); // Turn OFF Display Enable (GPIO Bit 7);
|
||||
Mem_Write8(REG_PCLK, 0x00); // Turn OFF LCD PCLK
|
||||
Set_Backlight(0x00FA, 0);
|
||||
|
||||
/*
|
||||
* Configure the FT800/810 Registers
|
||||
*/
|
||||
|
||||
Mem_Write16(REG_HCYCLE, Hcycle);
|
||||
Mem_Write16(REG_HOFFSET, Hoffset);
|
||||
Mem_Write16(REG_HSYNC0, Hsync0);
|
||||
Mem_Write16(REG_HSYNC1, Hsync1);
|
||||
Mem_Write16(REG_VCYCLE, Vcycle);
|
||||
Mem_Write16(REG_VOFFSET, Voffset);
|
||||
Mem_Write16(REG_VSYNC0, Vsync0);
|
||||
Mem_Write16(REG_VSYNC1, Vsync1);
|
||||
Mem_Write16(REG_HSIZE, Hsize);
|
||||
Mem_Write16(REG_VSIZE, Vsize);
|
||||
Mem_Write8(REG_SWIZZLE, Swizzle);
|
||||
Mem_Write8(REG_PCLK_POL, Pclkpol);
|
||||
Mem_Write8(REG_CSPREAD, 1);
|
||||
|
||||
#if defined(LCD_PORTRAIT) && defined(LCD_UPSIDE_DOWN)
|
||||
Mem_Write8(REG_ROTATE, 3);
|
||||
#elif defined(LCD_PORTRAIT) && !defined(LCD_UPSIDE_DOWN)
|
||||
Mem_Write8(REG_ROTATE, 2);
|
||||
#elif !defined(LCD_PORTRAIT) && defined(LCD_UPSIDE_DOWN)
|
||||
Mem_Write8(REG_ROTATE, 1);
|
||||
#else !defined(LCD_PORTRAIT) && !defined(LCD_UPSIDE_DOWN)
|
||||
Mem_Write8(REG_ROTATE, 0);
|
||||
#endif
|
||||
|
||||
Mem_Write8(REG_TOUCH_MODE, 0x03); // Configure the Touch Screen
|
||||
Mem_Write8(REG_TOUCH_ADC_MODE, 0x01);
|
||||
Mem_Write8(REG_TOUCH_OVERSAMPLE, 0x0F);
|
||||
Mem_Write16(REG_TOUCH_RZTHRESH, 5000);
|
||||
Mem_Write8(REG_VOL_SOUND, 0x00); // Turn Synthesizer Volume Off
|
||||
Mem_Write8(REG_DLSWAP, 0x02); // Swap on New Frame
|
||||
|
||||
/*
|
||||
* Turn On the Display
|
||||
*/
|
||||
#if defined(LCD_IS_FT800)
|
||||
Mem_Write8(REG_GPIO_DIR, 0x80); // Turn ON Display Enable
|
||||
Mem_Write8(REG_GPIO, 0x80);
|
||||
#else
|
||||
Mem_Write16(REG_GPIOX_DIR, 1 << 15); // Turn ON Display Enable
|
||||
Mem_Write16(REG_GPIOX, 1 << 15);
|
||||
#endif
|
||||
|
||||
Enable(); // Turns on Clock by setting PCLK Register to 5
|
||||
delay(50);
|
||||
|
||||
CommandFifo::Cmd_Reset();
|
||||
delay(50);
|
||||
|
||||
// Set Initial Values for Touch Transform Registers
|
||||
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_A, default_transform_a);
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_B, default_transform_b);
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_C, default_transform_c);
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_D, default_transform_d);
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_E, default_transform_e);
|
||||
CLCD::Mem_Write32(REG_TOUCH_TRANSFORM_F, default_transform_f);
|
||||
}
|
||||
|
||||
/******************* SOUND HELPER CLASS ************************/
|
||||
|
||||
class CLCD::SoundPlayer {
|
||||
public:
|
||||
struct sound_t {
|
||||
effect_t effect; // The sound effect number
|
||||
uint8_t note; // The MIDI note value
|
||||
uint8_t sixteenths; // Duration of note, in sixteeths of a second, or zero to play to completion
|
||||
};
|
||||
|
||||
private:
|
||||
const sound_t *sequence;
|
||||
uint32_t next;
|
||||
|
||||
public:
|
||||
static const uint8_t MIDDLE_C = 60; // C4
|
||||
|
||||
static void setVolume(uint8_t volume);
|
||||
static void play(effect_t effect, uint8_t note = MIDDLE_C);
|
||||
static bool soundPlaying();
|
||||
|
||||
void play(const sound_t* seq);
|
||||
|
||||
void onIdle();
|
||||
};
|
||||
|
||||
void CLCD::SoundPlayer::setVolume(uint8_t vol) {
|
||||
CLCD::Mem_Write8(REG_VOL_SOUND, vol);
|
||||
}
|
||||
|
||||
void CLCD::SoundPlayer::play(effect_t effect, uint8_t note) {
|
||||
CLCD::Mem_Write16(REG_SOUND, (note << 8) | effect);
|
||||
CLCD::Mem_Write8( REG_PLAY, 1);
|
||||
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
#if defined (SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLPAIR("Playing note ", note);
|
||||
SERIAL_PROTOCOLLNPAIR(", instrument ", effect);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void CLCD::SoundPlayer::play(const sound_t* seq) {
|
||||
sequence = seq;
|
||||
next = 0;
|
||||
}
|
||||
|
||||
bool CLCD::SoundPlayer::soundPlaying() {
|
||||
return CLCD::Mem_Read8( REG_PLAY ) & 0x1;
|
||||
}
|
||||
|
||||
void CLCD::SoundPlayer::onIdle() {
|
||||
if(!sequence) return;
|
||||
|
||||
const bool readyForNextNote = next != 0 ? (millis() > next) : !soundPlaying();
|
||||
|
||||
if(readyForNextNote) {
|
||||
const effect_t fx = effect_t(pgm_read_byte_near(&sequence->effect));
|
||||
const uint8_t nt = pgm_read_byte_near(&sequence->note);
|
||||
const uint16_t ms = uint32_t(pgm_read_byte_near(&sequence->sixteenths)) * 1000 / 16;
|
||||
|
||||
if(ms == 0 && fx == SILENCE && nt == 0) {
|
||||
sequence = 0;
|
||||
} else {
|
||||
next = ms ? (millis() + ms) : 0;
|
||||
play(fx, nt != 0 ? nt : MIDDLE_C);
|
||||
sequence++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif // _AO_FT810_FUNC_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Pins for the Aleph Objects Color LCD Touchscreen.
|
||||
*
|
||||
* Marlin 3D Printer Firmware
|
||||
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
||||
*
|
||||
* Based on Sprinter and grbl.
|
||||
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(LULZBOT_Quiver_TAZ7_CLCD) // ARCHIM J20 HEADER +3.3V Pin-24 GND Pin-23
|
||||
#define CLCD_BB_SPI_CS 99 // PB6 J20 Pin-9
|
||||
#define CLCD_BB_SPI_SCLK 95 // PB0 J20 Pin-6
|
||||
#define CLCD_BB_SPI_MOSI 94 // PB1 J20 Pin-5
|
||||
#define CLCD_BB_SPI_MISO 101 // PB5 J20 Pin-10
|
||||
#define CLCD_MOD_RESET 93 // PB2 J20 Pin-8
|
||||
#endif
|
||||
|
||||
#if defined(LULZBOT_Gladiola_Mini_CLCD) // MINI RAMBO P1 HEADER +5V Pin-10 GND Pin-9
|
||||
#define CLCD_BB_SPI_SCLK 71 // PG3 P1 Pin-8
|
||||
#define CLCD_BB_SPI_MOSI 85 // PH7 P1 Pin-7
|
||||
#define CLCD_BB_SPI_CS 70 // PG4 P1 Pin-6
|
||||
#define CLCD_MOD_RESET 19 // PD2 P1 Pin-5
|
||||
#define CLCD_BB_SPI_MISO 82 // PD5 P1 Pin-4
|
||||
#define CLCD_AUX_0 18 // PD3 P1 Pin-3
|
||||
#define CLCD_AUX_1 9 // PH6 P1 Pin-2
|
||||
#define CLCD_AUX_2 84 // PH2 P1 Pin-1
|
||||
#endif
|
||||
|
||||
#if defined(LULZBOT_Hibiscus_Mini2_CLCD) // EINSY P1 HEADER +5V Pin-1 GND Pin-2
|
||||
#define CLCD_BB_SPI_SCLK 71 // PG3 P1 Pin-3
|
||||
#define CLCD_BB_SPI_MOSI 85 // PH7 P1 Pin-4
|
||||
#define CLCD_BB_SPI_CS 70 // PG4 P1 Pin-5
|
||||
#define CLCD_MOD_RESET 19 // PD2 P1 Pin-6
|
||||
#define CLCD_BB_SPI_MISO 82 // PD5 P1 Pin-7
|
||||
#define CLCD_AUX_0 18 // PD3 P1 Pin-8
|
||||
#define CLCD_AUX_1 9 // PH6 P1 Pin-9
|
||||
#define CLCD_AUX_2 84 // PH2 P1 Pin-10
|
||||
#endif
|
@ -0,0 +1,414 @@
|
||||
/*********************
|
||||
* FT810_SPI.h *
|
||||
*********************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
#ifndef _AO_FT810_SPI_H
|
||||
#define _AO_FT810_SPI_H
|
||||
|
||||
#if defined(PIN_DIR_OUT)
|
||||
// If SET_OUTPUT is defined, then map Marlin routines to those
|
||||
#define SET_OUTPUT PIN_DIR_OUT
|
||||
#define SET_INPUT_PULLUP(a) _PIN_DIR_IN(a); _PIN_HIGH(a);
|
||||
#define SET_INPUT PIN_DIR_IN
|
||||
#define WRITE SET_PIN
|
||||
#define READ GET_PIN
|
||||
#endif
|
||||
|
||||
/********************************* SPI Functions *********************************/
|
||||
|
||||
void CLCD::spiInit (void) {
|
||||
#if defined(USE_ARDUINO_HW_SPI)
|
||||
SPI.begin();
|
||||
SPI.beginTransaction(LCDsettings);
|
||||
#else
|
||||
SET_OUTPUT(CLCD_MOD_RESET); // CLCD_MOD_RST - Module Reset, not SPI
|
||||
WRITE(CLCD_MOD_RESET, 1);
|
||||
|
||||
SET_OUTPUT(CLCD_BB_SPI_MOSI); // CLCD_MOSI
|
||||
WRITE(CLCD_BB_SPI_MOSI, 1);
|
||||
|
||||
SET_OUTPUT(CLCD_BB_SPI_SCLK); // CLCD_SCLK
|
||||
WRITE(CLCD_BB_SPI_SCLK, 0);
|
||||
|
||||
SET_OUTPUT(CLCD_BB_SPI_CS); // CLCD_CS
|
||||
WRITE(CLCD_BB_SPI_CS, 1);
|
||||
|
||||
SET_INPUT_PULLUP(CLCD_BB_SPI_MISO); // CLCD_MISO
|
||||
|
||||
delay(50);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CLCD::spiSelect (void) { // CLCD Bitbanged SPI - Chip Select
|
||||
WRITE(CLCD_BB_SPI_CS, 0);
|
||||
}
|
||||
|
||||
|
||||
void CLCD::spiDeselect (void) { // CLCD Bitbanged SPI - Chip Deselect
|
||||
WRITE(CLCD_BB_SPI_CS, 1);
|
||||
}
|
||||
|
||||
void CLCD::Reset (void) {
|
||||
WRITE(CLCD_MOD_RESET, 0);
|
||||
delay(100);
|
||||
WRITE(CLCD_MOD_RESET, 1);
|
||||
}
|
||||
|
||||
void CLCD::Test_Pulse(void)
|
||||
{
|
||||
WRITE(CLCD_AUX_0, 1);
|
||||
delayMicroseconds(10);
|
||||
WRITE(CLCD_AUX_0, 0);
|
||||
}
|
||||
|
||||
uint8_t CLCD::spiTransfer (uint8_t spiOutByte) {
|
||||
#ifdef IS_ARDUINO
|
||||
SPI.transfer(spiOutByte);
|
||||
#else
|
||||
|
||||
uint8_t spiIndex = 0x80;
|
||||
uint8_t spiInByte = 0;
|
||||
uint8_t k;
|
||||
|
||||
for(k = 0; k <8; k++) { // Output and Read each bit of spiOutByte and spiInByte
|
||||
if(spiOutByte & spiIndex) { // Output MOSI Bit
|
||||
WRITE(CLCD_BB_SPI_MOSI, 1);
|
||||
}
|
||||
else {
|
||||
WRITE(CLCD_BB_SPI_MOSI, 0);
|
||||
}
|
||||
WRITE(CLCD_BB_SPI_SCLK, 1); // Pulse Clock
|
||||
WRITE(CLCD_BB_SPI_SCLK, 0);
|
||||
|
||||
if(READ(CLCD_BB_SPI_MISO)) {
|
||||
spiInByte |= spiIndex;
|
||||
}
|
||||
|
||||
spiIndex >>= 1;
|
||||
}
|
||||
return spiInByte;
|
||||
#endif
|
||||
}
|
||||
|
||||
// MEMORY READ FUNCTIONS
|
||||
|
||||
void CLCD::Mem_ReadAddr (uint32_t Reg_Address) { // Write 4-Byte Address
|
||||
CLCD::spiTransfer((Reg_Address >> 16) & 0x3F); // Address [21:16]
|
||||
CLCD::spiTransfer((Reg_Address >> 8 ) & 0xFF); // Address [15:8]
|
||||
CLCD::spiTransfer((Reg_Address >> 0) & 0xFF); // Address [7:0]
|
||||
CLCD::spiTransfer(0x00); // Dummy Byte
|
||||
}
|
||||
|
||||
void CLCD::Mem_Read_Bulk (uint32_t Reg_Address, uint8_t *Data, uint16_t Len) { // Write 4-Byte Address, Read Multiple Bytes
|
||||
CLCD::spiSelect();
|
||||
CLCD::Mem_ReadAddr(Reg_Address);
|
||||
|
||||
while(Len--) {
|
||||
*Data = CLCD::spiTransfer(0x00); // Read 1 Byte
|
||||
*Data++;
|
||||
}
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
uint8_t CLCD::Mem_Read8 (uint32_t Reg_Address) { // Write 4-Byte Address, Read 1-Byte Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_ReadAddr(Reg_Address);
|
||||
|
||||
uint8_t R_Data = CLCD::spiTransfer(0x00); // Read 1 Byte
|
||||
|
||||
CLCD::spiDeselect();
|
||||
|
||||
return(R_Data);
|
||||
}
|
||||
|
||||
|
||||
uint16_t CLCD::Mem_Read16 (uint32_t Reg_Address) { // Write 4-Byte Address, Read 2-Bytes Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_ReadAddr(Reg_Address);
|
||||
|
||||
uint16_t R_Data = (((uint16_t) CLCD::spiTransfer(0x00)) << 0) | // Read Byte 1
|
||||
(((uint16_t) CLCD::spiTransfer(0x00)) << 8); // Read Byte 2
|
||||
|
||||
CLCD::spiDeselect();
|
||||
|
||||
return(R_Data);
|
||||
}
|
||||
|
||||
uint32_t CLCD::Mem_Read32 (uint32_t Reg_Address) { // Write 4-Byte Address, Read 4-Bytes Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_ReadAddr(Reg_Address);
|
||||
|
||||
uint32_t R_Data = (((uint32_t) CLCD::spiTransfer(0x00)) << 0) | // Read Byte 1
|
||||
(((uint32_t) CLCD::spiTransfer(0x00)) << 8) | // Read Byte 2
|
||||
(((uint32_t) CLCD::spiTransfer(0x00)) << 16) | // Read Byte 3
|
||||
(((uint32_t) CLCD::spiTransfer(0x00)) << 24); // Read Byte 4
|
||||
|
||||
CLCD::spiDeselect();
|
||||
|
||||
return(R_Data);
|
||||
}
|
||||
|
||||
|
||||
// MEMORY WRITE FUNCTIONS
|
||||
|
||||
void CLCD::Mem_WriteAddr (uint32_t Reg_Address) { // Write 3-Byte Address
|
||||
CLCD::spiTransfer((Reg_Address >> 16) | 0x80); // Address [21:16]
|
||||
CLCD::spiTransfer((Reg_Address >> 8 ) & 0xFF); // Address [15:8]
|
||||
CLCD::spiTransfer((Reg_Address >> 0) & 0xFF); // Address [7:0]
|
||||
}
|
||||
|
||||
void CLCD::Mem_Write_Bulk (uint32_t Reg_Address, const void *Data, uint16_t Len, uint8_t Padding) { // Write 3-Byte Address, Multiple Bytes, plus padding bytes
|
||||
const uint8_t* p = (const uint8_t *)Data;
|
||||
CLCD::spiSelect();
|
||||
CLCD::Mem_WriteAddr(Reg_Address);
|
||||
|
||||
while(Len--) {
|
||||
CLCD::spiTransfer(*p++); // Write 1 Byte
|
||||
}
|
||||
|
||||
while(Padding--) {
|
||||
CLCD::spiTransfer(0); // Padding Bytes
|
||||
}
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
void CLCD::Mem_Write_Bulk (uint32_t Reg_Address, progmem_str Str, uint16_t Len, uint8_t Padding) { // Write 3-Byte Address, Multiple Bytes, plus padding bytes
|
||||
const uint8_t* p = (const uint8_t *)Str;
|
||||
CLCD::spiSelect();
|
||||
CLCD::Mem_WriteAddr(Reg_Address);
|
||||
|
||||
while(Len--) {
|
||||
CLCD::spiTransfer(pgm_read_byte_near(p++)); // Write 1 Byte
|
||||
}
|
||||
|
||||
while(Padding--) {
|
||||
CLCD::spiTransfer(0); // Padding Bytes
|
||||
}
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
void CLCD::Mem_Write8 (uint32_t Reg_Address, uint8_t W_Data) { // Write 3-Byte Address, Write 1-Byte Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_WriteAddr(Reg_Address);
|
||||
|
||||
CLCD::spiTransfer(W_Data); // Write 1 Byte
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
|
||||
void CLCD::Mem_Write16 (uint32_t Reg_Address, uint16_t W_Data) { // Write 3-Byte Address, Write 2-Bytes Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_WriteAddr(Reg_Address);
|
||||
|
||||
CLCD::spiTransfer((uint8_t) ((W_Data >> 0) & 0x00FF)); // Write Byte 0
|
||||
CLCD::spiTransfer((uint8_t) ((W_Data >> 8) & 0x00FF)); // Write Byte 1
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
|
||||
void CLCD::Mem_Write32 (uint32_t Reg_Address, uint32_t W_Data) { // Write 3-Byte Address, Write 4-Bytes Data
|
||||
CLCD::spiSelect();
|
||||
|
||||
CLCD::Mem_WriteAddr(Reg_Address);
|
||||
|
||||
CLCD::spiTransfer(W_Data >> 0); // Write Byte 0
|
||||
CLCD::spiTransfer(W_Data >> 8); // Write Byte 1
|
||||
CLCD::spiTransfer(W_Data >> 16); // Write Byte 2
|
||||
CLCD::spiTransfer(W_Data >> 24); // Write Byte 3
|
||||
|
||||
CLCD::spiDeselect();
|
||||
}
|
||||
|
||||
/**************************** FT800/810 Co-Processor Command FIFO ****************************/
|
||||
|
||||
uint32_t CLCD::CommandFifo::getRegCmdWrite() {
|
||||
return Mem_Read32(REG_CMD_WRITE) & 0x0FFF;
|
||||
}
|
||||
|
||||
uint32_t CLCD::CommandFifo::getRegCmdRead() {
|
||||
return Mem_Read32(REG_CMD_READ) & 0x0FFF;
|
||||
}
|
||||
|
||||
bool CLCD::CommandFifo::Cmd_Is_Idle() {
|
||||
return getRegCmdRead() == getRegCmdWrite();
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Wait_Until_Idle() {
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
const uint32_t startTime = millis();
|
||||
#endif
|
||||
do {
|
||||
#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(LCD_IS_FT800)
|
||||
void CLCD::CommandFifo::Cmd_Start() {
|
||||
if(command_write_ptr == 0xFFFFFFFFul) {
|
||||
command_write_ptr = getRegCmdWrite();
|
||||
}
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Execute() {
|
||||
if(command_write_ptr != 0xFFFFFFFFul) {
|
||||
Mem_Write32(REG_CMD_WRITE, command_write_ptr);
|
||||
}
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Reset() {
|
||||
Mem_Write32(REG_CMD_WRITE, 0x00000000);
|
||||
Mem_Write32(REG_CMD_READ, 0x00000000);
|
||||
command_write_ptr = 0xFFFFFFFFul;
|
||||
};
|
||||
|
||||
template <class T> void CLCD::CommandFifo::_write_unaligned(T data, uint16_t len) {
|
||||
const char *ptr = (const char*)data;
|
||||
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();
|
||||
if (command_read_ptr <= command_write_ptr) {
|
||||
bytes_tail = 4096U - command_write_ptr;
|
||||
bytes_head = command_read_ptr;
|
||||
} else {
|
||||
bytes_tail = command_read_ptr - command_write_ptr;
|
||||
bytes_head = 0;
|
||||
}
|
||||
} while((bytes_tail + bytes_head) < len);
|
||||
|
||||
/* Write as many bytes as possible following REG_CMD_WRITE */
|
||||
uint16_t bytes_to_write = min(len, bytes_tail);
|
||||
Mem_Write_Bulk (RAM_CMD + command_write_ptr, T(ptr), bytes_to_write);
|
||||
command_write_ptr += bytes_to_write;
|
||||
ptr += bytes_to_write;
|
||||
len -= bytes_to_write;
|
||||
|
||||
if(len > 0) {
|
||||
/* Write remaining bytes at start of circular buffer */
|
||||
Mem_Write_Bulk (RAM_CMD, T(ptr), len);
|
||||
command_write_ptr = len;
|
||||
}
|
||||
|
||||
if(command_write_ptr == 4096U) {
|
||||
command_write_ptr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Writes len bytes into the FIFO, if len is not
|
||||
// divisible by four, zero bytes will be written
|
||||
// to align to the boundary.
|
||||
|
||||
template <class T> void CLCD::CommandFifo::write(T data, uint16_t len) {
|
||||
const uint8_t padding = MULTIPLE_OF_4(len) - len;
|
||||
|
||||
uint8_t pad_bytes[] = {0, 0, 0, 0};
|
||||
_write_unaligned(data, len);
|
||||
_write_unaligned(pad_bytes, padding);
|
||||
}
|
||||
#else
|
||||
uint32_t CLCD::CommandFifo::getRegCmdBSpace() {
|
||||
return Mem_Read32(REG_CMDB_SPACE) & 0x0FFF;
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Start() {
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Execute() {
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Reset() {
|
||||
Mem_Write32(REG_CMD_WRITE, 0x00000000);
|
||||
Mem_Write32(REG_CMD_READ, 0x00000000);
|
||||
};
|
||||
|
||||
// Writes len bytes into the FIFO, if len is not
|
||||
// divisible by four, zero bytes will be written
|
||||
// to align to the boundary.
|
||||
|
||||
template <class T> void CLCD::CommandFifo::write(T data, uint16_t len) {
|
||||
const uint8_t padding = MULTIPLE_OF_4(len) - len;
|
||||
|
||||
// The FT810 provides a special register that can be used
|
||||
// for writing data without us having to do our own FIFO
|
||||
// management.
|
||||
uint32_t Command_Space = getRegCmdBSpace();
|
||||
while(Command_Space < len + padding) {
|
||||
Command_Space = getRegCmdBSpace();
|
||||
}
|
||||
Mem_Write_Bulk(REG_CMDB_WRITE, data, len, padding);
|
||||
}
|
||||
#endif
|
||||
|
||||
// CO_PROCESSOR COMMANDS
|
||||
|
||||
void CLCD::CommandFifo::Cmd (uint32_t cmd32) { // Writes a 32-bit (4 Bytes) Value to the Co-processor Command Buffer FIFO
|
||||
write(&cmd32, sizeof(uint32_t));
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd (void* data, uint16_t len) { // Writes a data structure - always a multiple of 32 bits - to the Co_Processor FIFO. // Data structure includes the 32-bit Co_Processor command.
|
||||
write(data, len);
|
||||
}
|
||||
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Str (char* data) {
|
||||
write(data, strlen(data)+1);
|
||||
}
|
||||
|
||||
void CLCD::CommandFifo::Cmd_Str (progmem_str data) {
|
||||
write(data, strlen_P((const char*)data)+1);
|
||||
}
|
||||
|
||||
#endif // _AO_FT810_SPI_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,169 @@
|
||||
/***************************
|
||||
* AO_FT810_Menu_Bitmaps.h *
|
||||
***************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2017 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
// L1 Font Data for Widgets
|
||||
|
||||
const PROGMEM CLCD::bitmap_info_t Extruder_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 3,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_addr = RAM_G + 8000,
|
||||
.width = 24,
|
||||
.height = 23,
|
||||
};
|
||||
|
||||
const PROGMEM unsigned char Extruder_Icon[] = {0x3F, 0xFF, 0xFC,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0x3F, 0xFF, 0xFC,
|
||||
0x3F, 0xFF, 0xFC,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0xC0, 0x00, 0x03,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0x7F, 0xFF, 0xFE,
|
||||
0x07, 0xFF, 0xE0,
|
||||
0x03, 0xFF, 0xC0,
|
||||
0x01, 0x81, 0x80,
|
||||
0x00, 0xC3, 0x00,
|
||||
0x00, 0x66, 0x00,
|
||||
0x00, 0x3C, 0x00,
|
||||
0x00, 0x3C, 0x00};
|
||||
|
||||
const PROGMEM CLCD::bitmap_info_t Bed_Heat_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 4,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_addr = RAM_G + 8100,
|
||||
.width = 32,
|
||||
.height = 23,
|
||||
};
|
||||
|
||||
const PROGMEM unsigned char Bed_Heat_Icon[] = {0x01, 0x81, 0x81, 0x80,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x00, 0xC0, 0xC0, 0xC0,
|
||||
0x00, 0xC0, 0xC0, 0xC0,
|
||||
0x00, 0x60, 0x60, 0x60,
|
||||
0x00, 0x60, 0x60, 0x60,
|
||||
0x00, 0xC0, 0xC0, 0xC0,
|
||||
0x00, 0xC0, 0xC0, 0xC0,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x03, 0x03, 0x03, 0x00,
|
||||
0x03, 0x03, 0x03, 0x00,
|
||||
0x06, 0x06, 0x06, 0x00,
|
||||
0x06, 0x06, 0x06, 0x00,
|
||||
0x03, 0x03, 0x03, 0x00,
|
||||
0x03, 0x03, 0x03, 0x00,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x01, 0x81, 0x81, 0x80,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xC0, 0x00, 0x00, 0x03,
|
||||
0xFF, 0xFF, 0xFF, 0xFF};
|
||||
|
||||
const PROGMEM CLCD::bitmap_info_t Fan_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 4,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_addr = RAM_G + 8300,
|
||||
.width = 32,
|
||||
.height = 32,
|
||||
};
|
||||
|
||||
const PROGMEM unsigned char Fan_Icon[] = {0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xF8, 0x00, 0x00, 0x1F,
|
||||
0xF0, 0x03, 0xF8, 0x0F,
|
||||
0xE0, 0x07, 0xF0, 0x07,
|
||||
0xC0, 0x0F, 0xE0, 0x03,
|
||||
0xC0, 0x1F, 0xE0, 0x03,
|
||||
0xC0, 0x1F, 0xE0, 0x03,
|
||||
0xC0, 0x0F, 0xE0, 0x03,
|
||||
0xC0, 0x07, 0xE0, 0x03,
|
||||
0xC0, 0x03, 0xC0, 0x03,
|
||||
0xD0, 0x00, 0x00, 0xC3,
|
||||
0xD8, 0x03, 0xC1, 0xE3,
|
||||
0xDF, 0xC7, 0xE3, 0xF3,
|
||||
0xDF, 0xEF, 0xF7, 0xFB,
|
||||
0xDF, 0xEF, 0xF7, 0xFB,
|
||||
0xDF, 0xEF, 0xF7, 0xFB,
|
||||
0xDF, 0xEF, 0xF7, 0xFB,
|
||||
0xCF, 0xC7, 0xE3, 0xFB,
|
||||
0xC7, 0x83, 0xC0, 0x1B,
|
||||
0xC3, 0x00, 0x00, 0x0B,
|
||||
0xC0, 0x03, 0xC0, 0x03,
|
||||
0xC0, 0x07, 0xE0, 0x03,
|
||||
0xC0, 0x07, 0xF0, 0x03,
|
||||
0xC0, 0x07, 0xF8, 0x03,
|
||||
0xC0, 0x07, 0xF8, 0x03,
|
||||
0xC0, 0x07, 0xF0, 0x03,
|
||||
0xE0, 0x0F, 0xE0, 0x07,
|
||||
0xF0, 0x1F, 0xC0, 0x0F,
|
||||
0xF8, 0x00, 0x00, 0x1F,
|
||||
0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0xFF, 0xFF};
|
||||
|
||||
|
||||
const PROGMEM CLCD::bitmap_info_t TD_Icon_Info = {
|
||||
.format = L1,
|
||||
.linestride = 7,
|
||||
.filter = BILINEAR,
|
||||
.wrapx = BORDER,
|
||||
.wrapy = BORDER,
|
||||
.RAMG_addr = RAM_G + 9000,
|
||||
.width = 50,
|
||||
.height = 20,
|
||||
};
|
||||
|
||||
const PROGMEM unsigned char TD_Icon[] = {0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, // Thumb Drive Widget
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0xC0,
|
||||
0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x80,
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
|
||||
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00};
|
@ -0,0 +1,1350 @@
|
||||
/****************************************************************************
|
||||
* Written By Mark Pelletier 2018 - Aleph Objects, Inc. *
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
#define STATUS_MESSAGE_BUFFER_LENGTH 32
|
||||
char lcd_status_message[STATUS_MESSAGE_BUFFER_LENGTH] = WELCOME_MSG;
|
||||
|
||||
static float marlin_x_axis = 100;
|
||||
static float marlin_y_axis = 50;
|
||||
static float marlin_z_axis = 170;
|
||||
static int marlin_e0_temp = 25;
|
||||
static int marlin_e1_temp = 25;
|
||||
static int marlin_bed_temp = 25;
|
||||
static int marlin_fan_speed = 25;
|
||||
static float marlin_x_steps = 100;
|
||||
static float marlin_y_steps = 100;
|
||||
static float marlin_z_steps = 100;
|
||||
static float marlin_e0_steps = 100;
|
||||
static float marlin_z_offset = 0.150;
|
||||
|
||||
/**************************** GRID LAYOUT MACROS **************************/
|
||||
|
||||
/* The grid layout macros allow buttons to be arranged on a grid so
|
||||
* that their locations become independent of the display size. The
|
||||
* layout model is similar to that of HTML TABLEs.
|
||||
*
|
||||
* These macros are meant to be evaluated into constants at compile
|
||||
* time, so resolution independence can be as efficient as using
|
||||
* hard-coded coordinates.
|
||||
*/
|
||||
|
||||
// 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.
|
||||
|
||||
#define EDGE_R 0
|
||||
|
||||
// GRID_X and GRID_Y computes the positions of the divisions on
|
||||
// the layout grid.
|
||||
#if defined(LCD_PORTRAIT)
|
||||
#define GRID_X(x) ((x)*(Vsize-EDGE_R)/GRID_COLS)
|
||||
#define GRID_Y(y) ((y)*Hsize/GRID_ROWS)
|
||||
#else
|
||||
#define GRID_X(x) ((x)*(Hsize-EDGE_R)/GRID_COLS)
|
||||
#define GRID_Y(y) ((y)*Vsize/GRID_ROWS)
|
||||
#endif
|
||||
|
||||
// BTN_X, BTN_Y, BTN_W and BTN_X returns the top-left and width
|
||||
// and height of a button, taking into account the button margins.
|
||||
|
||||
#define BTN_X(x) (GRID_X(x-1) + MARGIN_L)
|
||||
#define BTN_Y(y) (GRID_Y(y-1) + MARGIN_T)
|
||||
#define BTN_W(w) (GRID_X(w) - MARGIN_L - MARGIN_R)
|
||||
#define BTN_H(h) (GRID_Y(h) - MARGIN_T - MARGIN_B)
|
||||
|
||||
// Abbreviations for common phrases, to allow a button to be
|
||||
// defined in one line of source.
|
||||
#define BTN_POS(x,y) BTN_X(x), BTN_Y(y)
|
||||
#define BTN_SIZE(w,h) BTN_W(w), BTN_H(h)
|
||||
#define BTN cmd.Cmd_Draw_Button
|
||||
#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(rgb);
|
||||
#define THEME(color) cmd.Cmd_Set_Foreground_Color(Theme::color);
|
||||
|
||||
#define FONT_SML Theme::font_small
|
||||
#define FONT_MED Theme::font_medium
|
||||
#define FONT_LRG Theme::font_large
|
||||
|
||||
#define MENU_BTN_STYLE Theme::font_medium, OPT_3D
|
||||
|
||||
/************************* MENU SCREEN DECLARATIONS *************************/
|
||||
|
||||
class BootScreen : public UIScreen {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onIdle();
|
||||
};
|
||||
|
||||
class AboutScreen : public UIScreen {
|
||||
public:
|
||||
static void onEntry();
|
||||
static void onRefresh();
|
||||
static void onTouchStart(uint8_t tag);
|
||||
static void onIdle();
|
||||
};
|
||||
|
||||
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();
|
||||
static void onEntry();
|
||||
static void onIdle();
|
||||
static void onTouchStart(uint8_t tag);
|
||||
};
|
||||
|
||||
class MenuScreen : public UIScreen {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchStart(uint8_t tag);
|
||||
};
|
||||
|
||||
class CalibrationScreen : public UIScreen {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onIdle();
|
||||
};
|
||||
|
||||
class CalibrationRegistersScreen : public UIScreen {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchStart(uint8_t tag);
|
||||
};
|
||||
|
||||
class AdvancedSettingsScreen : public UIScreen {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchStart(uint8_t tag);
|
||||
};
|
||||
|
||||
class ValueAdjusters : public UIScreen {
|
||||
private:
|
||||
static uint8_t increment;
|
||||
static void draw_increment_btn(const uint8_t tag, uint8_t decimals);
|
||||
protected:
|
||||
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);
|
||||
};
|
||||
|
||||
class MoveAxisScreen : public ValueAdjusters {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
class StepsScreen : public ValueAdjusters {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
class ZOffsetScreen : public ValueAdjusters {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
class TemperatureScreen : public ValueAdjusters {
|
||||
public:
|
||||
static void onRefresh();
|
||||
static void onTouchHeld(uint8_t tag);
|
||||
};
|
||||
|
||||
/******************************* MENU SCREEN TABLE ******************************/
|
||||
|
||||
SCREEN_TABLE {
|
||||
DECL_SCREEN(BootScreen),
|
||||
DECL_SCREEN(AboutScreen),
|
||||
DECL_SCREEN(CalibrationScreen),
|
||||
DECL_SCREEN(StatusScreen),
|
||||
DECL_SCREEN(MenuScreen),
|
||||
DECL_SCREEN(MoveAxisScreen),
|
||||
DECL_SCREEN(AdvancedSettingsScreen),
|
||||
DECL_SCREEN(StepsScreen),
|
||||
DECL_SCREEN(ZOffsetScreen),
|
||||
DECL_SCREEN(TemperatureScreen),
|
||||
DECL_SCREEN(CalibrationRegistersScreen)
|
||||
};
|
||||
|
||||
SCREEN_TABLE_POST
|
||||
|
||||
/************************************ MENU THEME ********************************/
|
||||
|
||||
namespace Theme {
|
||||
const uint32_t olive_darkest = 0x2A2F0A;
|
||||
const uint32_t olive_dark = 0x495212;
|
||||
const uint32_t olive_light = 0x8C9D22;
|
||||
|
||||
const uint32_t background = 0x707070;
|
||||
const uint32_t x_axis = 0x500000;
|
||||
const uint32_t y_axis = 0x005000;
|
||||
const uint32_t z_axis = 0x000050;
|
||||
const uint32_t e_axis = 0x000000;
|
||||
const uint32_t menu_btn = olive_dark;
|
||||
const uint32_t navi_btn = olive_light;
|
||||
|
||||
const uint32_t toggle_on = olive_light;
|
||||
const uint32_t toggle_off = olive_darkest;
|
||||
const uint32_t disabled = background;
|
||||
|
||||
// About screen
|
||||
const uint32_t about_bg = olive_dark;
|
||||
const uint32_t about_btn = olive_darkest;
|
||||
|
||||
// Adjustment Screens
|
||||
|
||||
const uint32_t adjust_bg = olive_dark;
|
||||
const uint32_t incr_btn = olive_darkest;
|
||||
|
||||
// Status screen
|
||||
const uint32_t stop_btn = 0xF02020;
|
||||
const uint32_t prnt_btn = 0x20D020;
|
||||
const uint32_t progress = 0x404040;
|
||||
const uint32_t status_msg = 0x404040;
|
||||
const uint32_t fan_speed = 0x6060D0;
|
||||
const uint32_t temp = 0xD04000;
|
||||
const uint32_t axis_label = 0x404040;
|
||||
|
||||
// Calibration Registers Screen
|
||||
const uint32_t transformA = 0x3010D0;
|
||||
const uint32_t transformB = 0x4010D0;
|
||||
const uint32_t transformC = 0x5010D0;
|
||||
const uint32_t transformD = 0x6010D0;
|
||||
const uint32_t transformE = 0x7010D0;
|
||||
const uint32_t transformF = 0x8010D0;
|
||||
const uint32_t transformVal = 0x104010;
|
||||
|
||||
#if defined(LCD_800x480)
|
||||
#if defined(LCD_PORTRAIT)
|
||||
const int16_t font_small = 29;
|
||||
const int16_t font_medium = 30;
|
||||
const int16_t font_large = 30;
|
||||
#else
|
||||
const int16_t font_small = 30;
|
||||
const int16_t font_medium = 30;
|
||||
const int16_t font_large = 31;
|
||||
#endif
|
||||
const float icon_scale = 1.0;
|
||||
#else
|
||||
#if defined(LCD_PORTRAIT)
|
||||
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 = 27;
|
||||
const int16_t font_medium = 28;
|
||||
const int16_t font_large = 30;
|
||||
const float icon_scale = 0.6;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const effect_t press_sound = CHACK;
|
||||
const effect_t repeat_sound = CHACK;
|
||||
const effect_t unpress_sound = POP;
|
||||
};
|
||||
|
||||
/******************************** BOOT SCREEN ****************************/
|
||||
|
||||
void BootScreen::onRefresh() {
|
||||
CLCD::CommandFifo cmd;
|
||||
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.Cmd_Wait_Until_Idle();
|
||||
|
||||
CLCD::Turn_On_Backlight();
|
||||
CLCD::SoundPlayer::setVolume(255);
|
||||
}
|
||||
|
||||
void BootScreen::onIdle() {
|
||||
GOTO_SCREEN(CalibrationScreen);
|
||||
}
|
||||
|
||||
/******************************** ABOUT SCREEN ****************************/
|
||||
|
||||
CLCD::SoundPlayer sound;
|
||||
|
||||
const PROGMEM CLCD::SoundPlayer::sound_t chimes[] = {
|
||||
{CHIMES, 55, 13},
|
||||
{CHIMES, 64, 13},
|
||||
{CHIMES, 60, 19}
|
||||
};
|
||||
|
||||
const PROGMEM CLCD::SoundPlayer::sound_t samples[] = {
|
||||
{HARP},
|
||||
{XYLOPHONE},
|
||||
{TUBA},
|
||||
{GLOCKENSPIEL},
|
||||
{ORGAN},
|
||||
{TRUMPET},
|
||||
{PIANO},
|
||||
{CHIMES},
|
||||
{MUSIC_BOX},
|
||||
{BELL},
|
||||
{CLICK},
|
||||
{SWITCH},
|
||||
{COWBELL},
|
||||
{NOTCH},
|
||||
{HIHAT},
|
||||
{KICKDRUM},
|
||||
{SWITCH},
|
||||
{POP},
|
||||
{CLACK},
|
||||
{CHACK},
|
||||
{SILENCE}
|
||||
};
|
||||
|
||||
void AboutScreen::onEntry() {
|
||||
UIScreen::onEntry();
|
||||
|
||||
CLCD::Mem_Write8(REG_VOL_SOUND, 0xFF);
|
||||
sound.play(chimes);
|
||||
}
|
||||
|
||||
void AboutScreen::onRefresh() {
|
||||
CLCD::CommandFifo cmd;
|
||||
cmd.Cmd(CMD_DLSTART);
|
||||
cmd.Cmd_Clear_Color(Theme::about_bg);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
#define GRID_COLS 4
|
||||
#define GRID_ROWS 8
|
||||
|
||||
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,5), BTN_SIZE(4,1), Marlin_LCD_API::getFirmwareName(), FONT_LRG);
|
||||
|
||||
BTN_TAG(1) THEME(about_btn) BTN( BTN_POS(2,7), BTN_SIZE(2,1), F("Okay"), MENU_BTN_STYLE);
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void AboutScreen::onTouchStart(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 1: GOTO_PREVIOUS(); return;
|
||||
case 2: GOTO_SCREEN(CalibrationRegistersScreen); return;
|
||||
}
|
||||
}
|
||||
|
||||
void AboutScreen::onIdle() {
|
||||
sound.onIdle();
|
||||
}
|
||||
|
||||
/*********************************** 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::static_axis_position() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
void StatusScreen::dynamic_axis_position() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
char x_str[15];
|
||||
char y_str[15];
|
||||
char z_str[15];
|
||||
|
||||
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);
|
||||
|
||||
strcat_P(x_str, PSTR(" mm"));
|
||||
strcat_P(y_str, PSTR(" mm"));
|
||||
strcat_P(z_str, PSTR(" mm"));
|
||||
|
||||
#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
|
||||
|
||||
//#define MARGIN_T 5
|
||||
}
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
#define GRID_COLS 8
|
||||
#else
|
||||
#define GRID_COLS 12
|
||||
#endif
|
||||
|
||||
void StatusScreen::static_temperature() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
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
|
||||
|
||||
// Draw Extruder Bitmap on Extruder Temperature Button
|
||||
|
||||
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,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 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(1,2), BTN_SIZE(1,1), Bed_Heat_Icon_Info, Theme::icon_scale);
|
||||
|
||||
// Draw Fan Percent Bitmap on Bed Heat Button
|
||||
|
||||
cmd.Cmd_Bitmap_Source(Fan_Icon_Info);
|
||||
cmd.Cmd_Bitmap_Layout(Fan_Icon_Info);
|
||||
cmd.Cmd_Bitmap_Size (Fan_Icon_Info);
|
||||
|
||||
BTN_TAG(0)
|
||||
BTI(BTN_POS(5,2), BTN_SIZE(1,1), Fan_Icon_Info, Theme::icon_scale);
|
||||
}
|
||||
|
||||
#define ROUND(val) uint16_t((val)+0.5)
|
||||
|
||||
void StatusScreen::dynamic_temperature() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
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))
|
||||
);
|
||||
|
||||
#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
|
||||
|
||||
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;
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
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(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
|
||||
}
|
||||
|
||||
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 time_str[10];
|
||||
char progress_str[10];
|
||||
|
||||
sprintf_P(time_str, PSTR(" %02d : %02d"), hrs, min);
|
||||
sprintf_P(progress_str, PSTR("%-3d %%"), Marlin_LCD_API::getProgress_percent() );
|
||||
|
||||
#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
|
||||
}
|
||||
|
||||
#define GRID_COLS 4
|
||||
|
||||
void StatusScreen::static_interaction_buttons() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
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
|
||||
|
||||
// Draw Thumb Drive Bitmap on USB Button
|
||||
|
||||
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)
|
||||
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
|
||||
}
|
||||
|
||||
#define GRID_COLS 1
|
||||
|
||||
void StatusScreen::dynamic_status_message() {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
THEME(status_msg) BTN( BTN_POS(1,4), BTN_SIZE(1,1), lcd_status_message, FONT_LRG, OPT_FLAT);
|
||||
#else
|
||||
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();
|
||||
}
|
||||
|
||||
/* Dynamic content, non-cached data follows */
|
||||
|
||||
dynamic_temperature();
|
||||
dynamic_progress();
|
||||
dynamic_status_message();
|
||||
dynamic_axis_position();
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void StatusScreen::onEntry() {
|
||||
onRefresh();
|
||||
}
|
||||
|
||||
void StatusScreen::onIdle() {
|
||||
onRefresh();
|
||||
}
|
||||
|
||||
void StatusScreen::onTouchStart(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 4: GOTO_SCREEN(MenuScreen); break;
|
||||
}
|
||||
}
|
||||
|
||||
/************************************ 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 {
|
||||
cmd.Cmd_Clear_Color(Theme::background);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
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
|
||||
BTN_TAG(1) THEME(navi_btn) BTN( BTN_POS(1,4), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE);
|
||||
#endif
|
||||
|
||||
#define MARGIN_T 5
|
||||
|
||||
dlcache.store();
|
||||
}
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void MenuScreen::onTouchStart(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
case 3: GOTO_SCREEN(MoveAxisScreen); break;
|
||||
case 5: GOTO_SCREEN(TemperatureScreen); break;
|
||||
case 6: GOTO_SCREEN(AdvancedSettingsScreen); break;
|
||||
case 7: GOTO_SCREEN(AboutScreen); break;
|
||||
case 8: GOTO_SCREEN(CalibrationScreen); break;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************* 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 {
|
||||
cmd.Cmd_Clear_Color(Theme::background);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
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
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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
|
||||
|
||||
dlcache.store();
|
||||
}
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void AdvancedSettingsScreen::onTouchStart(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 1: GOTO_PREVIOUS(); break;
|
||||
case 2: GOTO_PREVIOUS(); break;
|
||||
case 3: GOTO_SCREEN(ZOffsetScreen); break;
|
||||
case 4: GOTO_SCREEN(StepsScreen); break;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************** CALIBRATION SCREEN ****************************/
|
||||
|
||||
#define GRID_COLS 4
|
||||
#define GRID_ROWS 16
|
||||
|
||||
void CalibrationScreen::onRefresh() {
|
||||
CLCD::CommandFifo cmd;
|
||||
cmd.Cmd(CMD_DLSTART);
|
||||
cmd.Cmd_Clear_Color(Theme::background);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
|
||||
#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
|
||||
#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);
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void CalibrationScreen::onIdle() {
|
||||
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);
|
||||
const uint32_t T_Transform_C = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_C);
|
||||
const uint32_t T_Transform_D = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_D);
|
||||
const uint32_t T_Transform_E = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_E);
|
||||
const uint32_t T_Transform_F = CLCD::Mem_Read32(REG_TOUCH_TRANSFORM_F);
|
||||
char b[20];
|
||||
|
||||
CLCD::CommandFifo cmd;
|
||||
cmd.Cmd(CMD_DLSTART);
|
||||
cmd.Cmd_Clear_Color(Theme::background);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
BTN_TAG(0)
|
||||
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);
|
||||
sprintf(b, "0x%08lX", T_Transform_C); BTX( BTN_POS(2,3), BTN_SIZE(1,1), b, 28);
|
||||
sprintf(b, "0x%08lX", T_Transform_D); BTX( BTN_POS(2,4), BTN_SIZE(1,1), b, 28);
|
||||
sprintf(b, "0x%08lX", T_Transform_E); BTX( BTN_POS(2,5), BTN_SIZE(1,1), b, 28);
|
||||
sprintf(b, "0x%08lX", T_Transform_F); BTX( BTN_POS(2,6), BTN_SIZE(1,1), b, 28);
|
||||
|
||||
#define GRID_COLS 3
|
||||
|
||||
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);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void CalibrationRegistersScreen::onTouchStart(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 1: GOTO_PREVIOUS(); return;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************** GENERIC VALUE ADJUSTMENT SCREEN ******************************/
|
||||
|
||||
#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( ".001"); pos = decimals - 3; break;
|
||||
case 21: label = PSTR( ".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;
|
||||
default:
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
#if defined(SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLLNPAIR("Unknown tag for increment btn: ", tag);
|
||||
#else
|
||||
Serial.print(F("Unknown tag for increment btn:"));
|
||||
Serial.println(tag);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
BTN_TAG(tag)
|
||||
switch(pos) {
|
||||
#if defined(LCD_PORTRAIT)
|
||||
case 0: BTN( BTN_POS(3,8), BTN_SIZE(1,1), progmem_str(label), FONT_SML, OPT_3D); break;
|
||||
case 1: BTN( BTN_POS(4,8), BTN_SIZE(1,1), progmem_str(label), FONT_SML, OPT_3D); break;
|
||||
case 2: BTN( BTN_POS(5,8), BTN_SIZE(1,1), progmem_str(label), FONT_SML, 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_Clear_Color(Theme::adjust_bg);
|
||||
cmd.Cmd_Clear(1,1,1);
|
||||
|
||||
// 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);
|
||||
|
||||
#if defined(LCD_PORTRAIT)
|
||||
BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(1,1), BTN_SIZE(6,1), (progmem_str) label, FONT_MED, OPT_FLAT);
|
||||
BTN_TAG(0) THEME(adjust_bg) BTN( BTN_POS(1,7), BTN_SIZE(6,1), F("Increment:"), FONT_MED, 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) 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(8,6), BTN_SIZE(2,1), F("Back"), MENU_BTN_STYLE);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ValueAdjusters::heading_t::dynamic_parts() const {
|
||||
CLCD::CommandFifo cmd;
|
||||
|
||||
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 EDGE_R 20
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void ValueAdjusters::adjuster_t::static_parts() const {
|
||||
CLCD::CommandFifo cmd;
|
||||
progmem_str str = (progmem_str) label;
|
||||
const uint8_t tag = line * 2;
|
||||
|
||||
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);
|
||||
|
||||
increment = 23 - decimals;
|
||||
}
|
||||
|
||||
void ValueAdjusters::adjuster_t::dynamic_parts(float value) const {
|
||||
CLCD::CommandFifo cmd;
|
||||
char b[32];
|
||||
|
||||
dtostrf(value, 5, decimals, b);
|
||||
strcat_P(b, PSTR(" "));
|
||||
strcat_P(b, (const char*) units);
|
||||
|
||||
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 ... 25: increment = tag; break;
|
||||
}
|
||||
current_screen.onRefresh();
|
||||
}
|
||||
|
||||
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 {
|
||||
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);
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void MoveAxisScreen::onTouchHeld(uint8_t tag) {
|
||||
switch(tag) {
|
||||
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();
|
||||
}
|
||||
|
||||
/******************************* TEMPERATURE SCREEN ******************************/
|
||||
|
||||
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 {
|
||||
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);
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void TemperatureScreen::onTouchHeld(uint8_t tag) {
|
||||
switch(tag) {
|
||||
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();
|
||||
}
|
||||
|
||||
/******************************* STEPS SCREEN ******************************/
|
||||
|
||||
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::e_axis, 0};
|
||||
|
||||
if(dlcache.hasData()) {
|
||||
dlcache.append();
|
||||
} else {
|
||||
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);
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void StepsScreen::onTouchHeld(uint8_t tag) {
|
||||
switch(tag) {
|
||||
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();
|
||||
}
|
||||
|
||||
/***************************** Z-OFFSET SCREEN ***************************/
|
||||
|
||||
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 {
|
||||
a.static_parts();
|
||||
b.static_parts();
|
||||
dlcache.store();
|
||||
}
|
||||
a.dynamic_parts();
|
||||
b.dynamic_parts(marlin_z_offset);
|
||||
|
||||
cmd.Cmd(DL_DISPLAY);
|
||||
cmd.Cmd(CMD_SWAP);
|
||||
cmd.Cmd_Execute();
|
||||
}
|
||||
|
||||
void ZOffsetScreen::onTouchHeld(uint8_t tag) {
|
||||
switch(tag) {
|
||||
case 4: marlin_z_offset -= getIncrement(); break;
|
||||
case 5: marlin_z_offset += getIncrement(); break;
|
||||
}
|
||||
onRefresh();
|
||||
}
|
||||
|
||||
/******************************** MAIN EVENT HANDLER *******************************/
|
||||
|
||||
#define DISPLAY_UPDATE_INTERVAL 1000
|
||||
|
||||
void lcd_init() {
|
||||
CLCD::Init();
|
||||
current_screen.start();
|
||||
}
|
||||
|
||||
void lcd_update() {
|
||||
const uint8_t NONE = 0xFF;
|
||||
const uint8_t IGNORE = 0xFE;
|
||||
static uint8_t pressed = NONE;
|
||||
static uint32_t last_repeat = 0;
|
||||
static uint32_t last_update = 0;
|
||||
|
||||
if(millis() - last_update > DISPLAY_UPDATE_INTERVAL) {
|
||||
current_screen.onIdle();
|
||||
last_update = millis();
|
||||
}
|
||||
|
||||
// If the LCD is processing commands, don't check
|
||||
// for tags since they may be changing and could
|
||||
// cause spurious events.
|
||||
if(!CLCD::CommandFifo::Cmd_Is_Idle()) {
|
||||
return;
|
||||
}
|
||||
|
||||
CLCD::Test_Pulse();
|
||||
|
||||
const uint8_t tag = CLCD::Get_Tag();
|
||||
|
||||
if(tag == 0) {
|
||||
// When the user lifts their finger, activate the onTouchEnd handler,
|
||||
// except when pressed is IGNORE.
|
||||
if(pressed == IGNORE) {
|
||||
pressed = NONE;
|
||||
sound.play(Theme::unpress_sound);
|
||||
}
|
||||
else if(pressed != NONE) {
|
||||
sound.play(Theme::unpress_sound);
|
||||
|
||||
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) {
|
||||
// When the user taps on a button, activate the onTouchStart handler
|
||||
const uint8_t lastScreen = current_screen.getScreen();
|
||||
current_screen.onTouchStart(tag);
|
||||
last_repeat = millis();
|
||||
|
||||
sound.play(Theme::press_sound);
|
||||
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
#if defined (SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLLNPAIR("Touch start: ", tag);
|
||||
#else
|
||||
Serial.print("Touch start: ");
|
||||
Serial.println(tag);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if(lastScreen != current_screen.getScreen()) {
|
||||
// In the case in which a touch event triggered a new screen to be
|
||||
// drawn, we don't issue a touchEnd since it would be sent to the
|
||||
// wrong screen.
|
||||
pressed = IGNORE;
|
||||
} else {
|
||||
pressed = tag;
|
||||
}
|
||||
} else if(tag == pressed) {
|
||||
// The user is holding down a button.
|
||||
if((millis() - last_repeat) > 250) {
|
||||
current_screen.onTouchHeld(tag);
|
||||
sound.play(Theme::repeat_sound);
|
||||
last_repeat = millis();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline bool lcd_hasstatus() { return true; }
|
||||
|
||||
void lcd_setstatus(const char * const message, const bool persist = false) {
|
||||
strncpy(lcd_status_message, message, STATUS_MESSAGE_BUFFER_LENGTH);
|
||||
}
|
||||
|
||||
void lcd_setstatusPGM(const char * const message, int8_t level = 0) {
|
||||
strncpy_P(lcd_status_message, message, STATUS_MESSAGE_BUFFER_LENGTH);
|
||||
}
|
||||
|
||||
void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vsnprintf_P(lcd_status_message, STATUS_MESSAGE_BUFFER_LENGTH, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void lcd_setalertstatusPGM(const char * const message) {
|
||||
lcd_setstatusPGM(message, 1);
|
||||
GOTO_SCREEN(StatusScreen);
|
||||
}
|
||||
|
||||
void lcd_buttons_update() {}
|
||||
inline void lcd_reset_alert_level() {}
|
||||
inline bool lcd_detected() { return true; }
|
||||
inline void lcd_refresh() {current_screen.onIdle();}
|
@ -0,0 +1,180 @@
|
||||
/****************************************************************************
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
/********************** VIRTUAL DISPATCH DATA TYPE ******************************/
|
||||
|
||||
// True virtual classes are extremely expensive on the Arduino
|
||||
// as the compiler stores the virtual function tables in RAM.
|
||||
// We invent a data type called ScreenRef that gives us
|
||||
// polymorphism by mapping an ID to virtual methods on various
|
||||
// classes. This works by keeping a table in PROGMEM of pointers
|
||||
// to static methods.
|
||||
|
||||
#define DECL_SCREEN(className) { \
|
||||
className::onStartup, \
|
||||
className::onEntry, \
|
||||
className::onExit, \
|
||||
className::onIdle, \
|
||||
className::onRefresh, \
|
||||
className::onTouchStart, \
|
||||
className::onTouchHeld, \
|
||||
className::onTouchEnd \
|
||||
}
|
||||
|
||||
#define GET_METHOD(type, method) reinterpret_cast<method##_func_t*>(pgm_read_word_near(&functionTable[type].method##_ptr))
|
||||
#define SCREEN_TABLE PROGMEM const ScreenRef::table_t ScreenRef::functionTable[] =
|
||||
#define SCREEN_TABLE_POST const uint8_t ScreenRef::functionTableSize = sizeof(ScreenRef::functionTable)/sizeof(ScreenRef::functionTable[0]);
|
||||
|
||||
class ScreenRef {
|
||||
protected:
|
||||
typedef void onStartup_func_t(void);
|
||||
typedef void onEntry_func_t(void);
|
||||
typedef void onExit_func_t(void);
|
||||
typedef void onIdle_func_t(void);
|
||||
typedef void onRefresh_func_t(void);
|
||||
typedef void onTouchStart_func_t(uint8_t);
|
||||
typedef void onTouchHeld_func_t(uint8_t);
|
||||
typedef void onTouchEnd_func_t(uint8_t);
|
||||
|
||||
private:
|
||||
typedef struct {
|
||||
onStartup_func_t *onStartup_ptr;
|
||||
onEntry_func_t *onEntry_ptr;
|
||||
onExit_func_t *onExit_ptr;
|
||||
onIdle_func_t *onIdle_ptr;
|
||||
onRefresh_func_t *onRefresh_ptr;
|
||||
onTouchStart_func_t *onTouchStart_ptr;
|
||||
onTouchHeld_func_t *onTouchHeld_ptr;
|
||||
onTouchEnd_func_t *onTouchEnd_ptr;
|
||||
} table_t;
|
||||
|
||||
uint8_t type = 0;
|
||||
static PROGMEM const table_t functionTable[];
|
||||
static const uint8_t functionTableSize;
|
||||
|
||||
public:
|
||||
uint8_t getType() {return type;}
|
||||
|
||||
void setType(uint8_t t) {
|
||||
type = t;
|
||||
}
|
||||
|
||||
void setScreen(onEntry_func_t onRefresh_ptr) {
|
||||
for(uint8_t type = 0; type < functionTableSize; type++) {
|
||||
if(GET_METHOD(type, onRefresh) == onRefresh_ptr) {
|
||||
setType(type);
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
#if defined(SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLLNPAIR("New screen: ",type);
|
||||
#else
|
||||
Serial.print("New screen: ");
|
||||
Serial.println(type);
|
||||
#endif
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
}
|
||||
#if defined(UI_FRAMEWORK_DEBUG)
|
||||
#if defined(SERIAL_PROTOCOLLNPAIR)
|
||||
SERIAL_PROTOCOLLNPAIR("Screen not found: ", (uint16_t) onRefresh_ptr);
|
||||
#else
|
||||
Serial.print("Screen not found: ");
|
||||
Serial.println((uint16_t) onRefresh_ptr, HEX);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void onStartup() {GET_METHOD(type, onStartup)();}
|
||||
void onEntry() {GET_METHOD(type, onEntry)();}
|
||||
void onExit() {GET_METHOD(type, onExit)();}
|
||||
void onIdle() {GET_METHOD(type, onIdle)();}
|
||||
void onRefresh() {GET_METHOD(type, onRefresh)();}
|
||||
void onTouchStart(uint8_t tag) {GET_METHOD(type, onTouchStart)(tag);}
|
||||
void onTouchHeld(uint8_t tag) {GET_METHOD(type, onTouchHeld)(tag);}
|
||||
void onTouchEnd(uint8_t tag) {GET_METHOD(type, onTouchEnd)(tag);}
|
||||
|
||||
void initializeAll() {
|
||||
for(uint8_t type = 0; type < functionTableSize; type++) {
|
||||
GET_METHOD(type, onStartup)();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/********************** SCREEN STACK ******************************/
|
||||
|
||||
// To conserve dynamic memory, the screen stack is hard-coded to
|
||||
// have four values, allowing a menu of up to four levels.
|
||||
|
||||
class ScreenStack : public ScreenRef {
|
||||
private:
|
||||
uint8_t stack[4];
|
||||
|
||||
public:
|
||||
void start() {
|
||||
initializeAll();
|
||||
onEntry();
|
||||
}
|
||||
|
||||
void push() {
|
||||
stack[3] = stack[2];
|
||||
stack[2] = stack[1];
|
||||
stack[1] = stack[0];
|
||||
stack[0] = getType();
|
||||
}
|
||||
|
||||
void pop() {
|
||||
setType(stack[0]);
|
||||
stack[0] = stack[1];
|
||||
stack[1] = stack[2];
|
||||
stack[2] = stack[3];
|
||||
stack[3] = 0;
|
||||
}
|
||||
|
||||
void goTo(onEntry_func_t s) {
|
||||
push();
|
||||
onExit();
|
||||
setScreen(s);
|
||||
onEntry();
|
||||
}
|
||||
|
||||
void goBack() {
|
||||
pop();
|
||||
onEntry();
|
||||
}
|
||||
|
||||
uint8_t getScreen() {
|
||||
return getType();
|
||||
}
|
||||
} current_screen;
|
||||
|
||||
/********************** BASE SCREEN CLASSS ******************************/
|
||||
|
||||
/* UIScreen is the base class for all user interface screens.
|
||||
*/
|
||||
class UIScreen {
|
||||
public:
|
||||
static void onStartup() {}
|
||||
static void onEntry() {current_screen.onRefresh();}
|
||||
static void onExit() {}
|
||||
static void onIdle() {}
|
||||
static void onTouchStart(uint8_t) {}
|
||||
static void onTouchHeld(uint8_t) {}
|
||||
static void onTouchEnd(uint8_t) {}
|
||||
};
|
||||
|
||||
#define GOTO_SCREEN(screen) current_screen.goTo(screen::onRefresh);
|
||||
#define GOTO_PREVIOUS() current_screen.goBack();
|
@ -0,0 +1,112 @@
|
||||
/****************************************************************************
|
||||
* Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation, either version 3 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* To view a copy of the GNU General Public License, go to the following *
|
||||
* location: <http://www.gnu.org/licenses/>. *
|
||||
****************************************************************************/
|
||||
|
||||
class Marlin_LCD_API {
|
||||
public:
|
||||
typedef const __FlashStringHelper *progmem_str;
|
||||
|
||||
enum axis_t {
|
||||
X,
|
||||
Y,
|
||||
Z,
|
||||
E0,
|
||||
E1
|
||||
};
|
||||
|
||||
static const uint8_t extruderCount;
|
||||
static const uint8_t fanCount;
|
||||
|
||||
static const float getActualTemp_celsius(const uint8_t extruder);
|
||||
static const float getTargetTemp_celsius(const uint8_t extruder);
|
||||
static const float getFan_percent(const uint8_t fan);
|
||||
|
||||
static const float getAxisPosition_mm(const axis_t axis);
|
||||
static const float getAxisSteps_per_mm(const axis_t axis);
|
||||
static const uint8_t getProgress_percent();
|
||||
static const uint32_t getProgress_seconds_elapsed();
|
||||
static const uint8_t getFeedRate_percent();
|
||||
static const float getZOffset_mm();
|
||||
static const bool isAxisPositionKnown(const axis_t axis);
|
||||
|
||||
static const progmem_str getFirmwareName();
|
||||
};
|
||||
|
||||
#if defined(MSG_MARLIN)
|
||||
const uint8_t Marlin_LCD_API::extruderCount = EXTRUDERS;
|
||||
const uint8_t Marlin_LCD_API::fanCount = 1;
|
||||
|
||||
const float Marlin_LCD_API::getActualTemp_celsius(const uint8_t extruder) {
|
||||
if(extruder) {
|
||||
return thermalManager.degHotend(extruder-1);
|
||||
} else {
|
||||
return thermalManager.degBed();
|
||||
}
|
||||
}
|
||||
|
||||
const float Marlin_LCD_API::getTargetTemp_celsius(const uint8_t extruder) {
|
||||
if(extruder) {
|
||||
return thermalManager.degTargetHotend(extruder-1);
|
||||
} else {
|
||||
return thermalManager.degTargetBed();
|
||||
}
|
||||
}
|
||||
|
||||
const float Marlin_LCD_API::getFan_percent(const uint8_t fan) {
|
||||
return ((fanSpeeds[fan] + 1) * 100) / 256;
|
||||
}
|
||||
|
||||
const float Marlin_LCD_API::getAxisPosition_mm(const Marlin_LCD_API::axis_t axis) {
|
||||
switch(axis) {
|
||||
case X: return current_position[X_AXIS]; break;
|
||||
case Y: return current_position[Y_AXIS]; break;
|
||||
case Z: return current_position[Z_AXIS]; break;
|
||||
case E0: return current_position[E_AXIS]; break;
|
||||
case E1: return current_position[E_AXIS+1]; break;
|
||||
}
|
||||
}
|
||||
|
||||
const float Marlin_LCD_API::getAxisSteps_per_mm(const Marlin_LCD_API::axis_t axis) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const uint8_t Marlin_LCD_API::getProgress_percent() {
|
||||
#if ENABLED(SDSUPPORT)
|
||||
return card.percentDone();
|
||||
#endif
|
||||
}
|
||||
|
||||
const uint32_t Marlin_LCD_API::getProgress_seconds_elapsed() {
|
||||
const duration_t elapsed = print_job_timer.duration();
|
||||
return elapsed.value;
|
||||
}
|
||||
|
||||
const uint8_t Marlin_LCD_API::getFeedRate_percent() {
|
||||
return feedrate_percentage;
|
||||
}
|
||||
|
||||
const bool Marlin_LCD_API::isAxisPositionKnown(const axis_t axis) {
|
||||
switch(axis) {
|
||||
case X: return axis_known_position[X_AXIS]; break;
|
||||
case Y: return axis_known_position[Y_AXIS]; break;
|
||||
case Z: return axis_known_position[Z_AXIS]; break;
|
||||
}
|
||||
}
|
||||
|
||||
const Marlin_LCD_API::progmem_str Marlin_LCD_API::getFirmwareName() {
|
||||
return F("Marlin " SHORT_BUILD_VERSION LULZBOT_FW_VERSION);
|
||||
}
|
||||
#endif
|
Loading…
Reference in new issue