linechanging=false;\r
}\r
\r
-\r
void MainMenu::showStatus()\r
{ \r
#if LCD_HEIGHT==4\r
\r
enum {ItemP_exit, ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude, ItemP_disstep};\r
\r
+//any action must not contain a ',' character anywhere, or this breaks:\r
+#define MENUITEM(repaint_action, click_action) \\r
+ {\\r
+ if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \\r
+ if((activeline==line) && CLICKED) {click_action} \\r
+ }\r
+ \r
void MainMenu::showPrepare()\r
{\r
uint8_t line=0;\r
- if(lastlineoffset!=lineoffset)\r
- {\r
- force_lcd_update=true;\r
- clear(); \r
- }\r
+ clearIfNecessary();\r
for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
{\r
//Serial.println((int)(line-lineoffset));\r
switch(i)\r
{\r
case ItemP_exit:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Prepare");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- status=Main_Menu;\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Prepare") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
+ break;\r
case ItemP_home:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Auto Home");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- enquecommand("G28 X-105 Y-105 Z0");\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Auto Home") , BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;\r
+ break;\r
case ItemP_origin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Set Origin");\r
- \r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- enquecommand("G92 X0 Y0 Z0");\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Set Origin") , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;\r
+ break;\r
case ItemP_preheat:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Preheat"); \r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- setTargetHotend0(170);\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Preheat") , BLOCK;setTargetHotend0(170);beepshort(); ) ;\r
+ break;\r
case ItemP_extrude:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Extrude");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- enquecommand("G92 E0");\r
- enquecommand("G1 F700 E50");\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;\r
+ break;\r
case ItemP_disstep:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Disable Steppers");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- enquecommand("M84");\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;\r
+ break;\r
default: \r
break;\r
}\r
line++;\r
}\r
- lastlineoffset=lineoffset;\r
- if((encoderpos/lcdslow!=lastencoderpos/lcdslow)||force_lcd_update)\r
- {\r
- \r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
- \r
- if(encoderpos<0)\r
- {\r
- lineoffset--;\r
- if(lineoffset<0)\r
- lineoffset=0;\r
- encoderpos=0;\r
- force_lcd_update=true;\r
- }\r
- if(encoderpos/lcdslow>3)\r
- {\r
- lineoffset++;\r
- encoderpos=3*lcdslow;\r
- if(lineoffset>(ItemP_disstep+1-LCD_HEIGHT))\r
- lineoffset=ItemP_disstep+1-LCD_HEIGHT;\r
- force_lcd_update=true;\r
- }\r
- //encoderpos=encoderpos%LCD_HEIGHT;\r
- lastencoderpos=encoderpos;\r
- activeline=encoderpos/lcdslow;\r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003'); \r
- } \r
+ updateActiveLines(ItemP_disstep,encoderpos);\r
}\r
enum {\r
ItemC_exit, ItemC_nozzle, \r
ItemC_aret,ItemC_esteps, ItemC_store, ItemC_load,ItemC_failsafe\r
};\r
\r
+//does not work\r
+// #define MENUCHANGEITEM(repaint_action, enter_action, accept_action, change_action) \\r
+// {\\r
+// if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \\r
+// if(activeline==line) \\r
+// { \\r
+// if(CLICKED) \\r
+// { \\r
+// linechanging=!linechanging; \\r
+// if(linechanging) {enter_action;} \\r
+// else {accept_action;} \\r
+// } \\r
+// else \\r
+// if(linechanging) {change_action};}\\r
+// }\r
+// \r
+\r
+ \r
void MainMenu::showControl()\r
{\r
uint8_t line=0;\r
- if((lastlineoffset!=lineoffset)||force_lcd_update)\r
- {\r
- force_lcd_update=true;\r
- clear();\r
- }\r
+ clearIfNecessary();\r
for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
{\r
switch(i)\r
{\r
case ItemC_exit:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Control");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- status=Main_Menu;\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Control") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
+ break;\r
case ItemC_nozzle:\r
{\r
if(force_lcd_update)\r
}\r
line++;\r
}\r
- lastlineoffset=lineoffset;\r
-\r
- if(!linechanging && ((encoderpos/lcdslow!=lastencoderpos/lcdslow)||force_lcd_update))\r
- {\r
- \r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
- \r
- if(encoderpos<0)\r
- {\r
- lineoffset--;\r
- if(lineoffset<0)\r
- lineoffset=0;\r
- encoderpos=0;\r
- force_lcd_update=true;\r
- }\r
- if(encoderpos/lcdslow>3)\r
- {\r
- lineoffset++;\r
- encoderpos=3*lcdslow;\r
- if(lineoffset>(ItemC_failsafe+1-LCD_HEIGHT))\r
- lineoffset=ItemC_failsafe+1-LCD_HEIGHT;\r
- force_lcd_update=true;\r
- }\r
- //encoderpos=encoderpos%LCD_HEIGHT;\r
- lastencoderpos=encoderpos;\r
- activeline=encoderpos/lcdslow;\r
- if(activeline>3) activeline=3;\r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003'); \r
- } \r
+ updateActiveLines(ItemC_failsafe,encoderpos);\r
}\r
\r
\r
#ifdef SDSUPPORT\r
uint8_t line=0;\r
\r
- if(lastlineoffset!=lineoffset)\r
- {\r
- force_lcd_update=true; \r
- }\r
+ clearIfNecessary();\r
static uint8_t nrfiles=0;\r
if(force_lcd_update)\r
{\r
- clear();\r
+ clear();\r
if(card.cardOK)\r
{\r
nrfiles=card.getnrfilenames();\r
nrfiles=0;\r
lineoffset=0;\r
}\r
- //Serial.print("Nr files:"); Serial.println((int)nrfiles);\r
}\r
\r
for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
switch(i)\r
{\r
case 0:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" File");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- status=Main_Menu;\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" File") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
+ break;\r
case 1:\r
{\r
if(force_lcd_update)\r
}\r
line++;\r
}\r
- lastlineoffset=lineoffset;\r
- if((encoderpos!=lastencoderpos)||force_lcd_update)\r
- {\r
- \r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?' ':' ');\r
- \r
- if(encoderpos<0)\r
- {\r
- lineoffset--;\r
- if(lineoffset<0)\r
- lineoffset=0;\r
- encoderpos=0;\r
- force_lcd_update=true;\r
- }\r
- if(encoderpos/lcdslow>3)\r
- {\r
- lineoffset++;\r
- encoderpos=3*lcdslow;\r
- if(lineoffset>(1+nrfiles+1-LCD_HEIGHT))\r
- lineoffset=1+nrfiles+1-LCD_HEIGHT;\r
- force_lcd_update=true;\r
- \r
- }\r
- lastencoderpos=encoderpos;\r
- activeline=encoderpos;\r
- if(activeline>3) \r
- {\r
- activeline=3;\r
- }\r
- if(activeline<0) \r
- {\r
- activeline=0;\r
- }\r
- if(activeline>1+nrfiles) activeline=1+nrfiles;\r
- if(lineoffset>1+nrfiles) lineoffset=1+nrfiles;\r
- lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003'); \r
- \r
- }\r
+ updateActiveLines(1+nrfiles,encoderpos);\r
#endif\r
}\r
\r
enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };\r
void MainMenu::showMainMenu()\r
{\r
- //if(int(encoderpos/lcdslow)!=int(lastencoderpos/lcdslow))\r
- // force_lcd_update=true;\r
+\r
#ifndef ULTIPANEL\r
force_lcd_update=false;\r
#endif\r
- //Serial.println((int)activeline);\r
- if(force_lcd_update)\r
- clear();\r
+ \r
+ clearIfNecessary();\r
for(int8_t line=0;line<LCD_HEIGHT;line++)\r
{\r
switch(line)\r
{ \r
case ItemM_watch:\r
- {\r
- if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Watch \x7E");}\r
- if((activeline==line)&&CLICKED)\r
- {\r
- BLOCK;\r
- beepshort();\r
- status=Main_Status;\r
- }\r
- } break;\r
+ MENUITEM( lcdprintPGM(" Watch") , BLOCK;status=Main_Status;beepshort(); ) ;\r
+ break;\r
case ItemM_prepare:\r
- {\r
- if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Prepare \x7E");}\r
- if((activeline==line)&&CLICKED)\r
- {\r
- BLOCK;\r
- status=Main_Prepare;\r
- beepshort();\r
- }\r
- } break;\r
+ MENUITEM( lcdprintPGM(" Prepare \x7E") , BLOCK;status=Main_Prepare;beepshort(); ) ;\r
+ break;\r
\r
case ItemM_control:\r
- {\r
- if(force_lcd_update) {lcd.setCursor(0,line);lcdprintPGM(" Control \x7E");}\r
- if((activeline==line)&&CLICKED)\r
- {\r
- BLOCK;\r
- status=Main_Control;\r
- beepshort();\r
- }\r
- }break;\r
+ MENUITEM( lcdprintPGM(" Control \x7E") , BLOCK;status=Main_Control;beepshort(); ) ;\r
+ break;\r
#ifdef SDSUPPORT\r
case ItemM_file: \r
{\r
beepshort();\r
}\r
}break;\r
+ #else\r
+ case ItemM_file:\r
+ break;\r
#endif\r
default: \r
SERIAL_ERROR_START;\r
break;\r
}\r
}\r
- if(activeline<0) \r
- activeline=0;\r
- if(activeline>=LCD_HEIGHT) \r
- activeline=LCD_HEIGHT-1;\r
- if((encoderpos!=lastencoderpos)||force_lcd_update)\r
- {\r
- lcd.setCursor(0,activeline);lcd.print(activeline?' ':' ');\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>3*lcdslow) \r
- encoderpos=3*lcdslow;\r
- activeline=abs(encoderpos/lcdslow)%LCD_HEIGHT;\r
- if(activeline<0) \r
- activeline=0;\r
- if(activeline>=LCD_HEIGHT) \r
- activeline=LCD_HEIGHT-1;\r
- lastencoderpos=encoderpos;\r
- lcd.setCursor(0,activeline);lcd.print(activeline?'>':'\003');\r
- }\r
+ updateActiveLines(3,encoderpos);\r
}\r
\r
void MainMenu::update()\r
if(CARDINSERTED)\r
{\r
card.initsd();\r
- lcd_status("Card inserted");\r
+ LCD_MESSAGEPGM("Card inserted");\r
}\r
else\r
{\r
card.release();\r
- lcd_status("Card removed");\r
+ LCD_MESSAGEPGM("Card removed");\r
}\r
}\r
#endif\r
\r
if(status!=oldstatus)\r
{\r
- //Serial.println(status);\r
- //clear();\r
force_lcd_update=true;\r
encoderpos=0;\r
lineoffset=0;\r