-#include "ultralcd.h"\r
-#ifdef ULTRA_LCD\r
-\r
-//===========================================================================\r
-//=============================imported variables============================\r
-//===========================================================================\r
-\r
-extern volatile int feedmultiply;\r
-extern volatile bool feedmultiplychanged;\r
-\r
-extern long position[4]; \r
-extern CardReader card;\r
-\r
-//===========================================================================\r
-//=============================public variables============================\r
-//===========================================================================\r
-volatile char buttons=0; //the last checked buttons in a bit array.\r
-int encoderpos=0;\r
-short lastenc=0;\r
-\r
-\r
-//===========================================================================\r
-//=============================private variables============================\r
-//===========================================================================\r
-static char messagetext[LCD_WIDTH]="";\r
-\r
-//return for string conversion routines\r
-static char conv[8];\r
-\r
-#include <LiquidCrystal.h>\r
-LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 \r
-\r
-static unsigned long previous_millis_lcd=0;\r
-static long previous_millis_buttons=0;\r
-\r
-\r
-#ifdef NEWPANEL\r
- static long blocking=0;\r
-#else\r
- static long blocking[8]={0,0,0,0,0,0,0,0};\r
-#endif\r
- \r
-static MainMenu menu;\r
-\r
-#include <avr/pgmspace.h>\r
-\r
-void lcdProgMemprint(const char *str)\r
-{\r
- char ch=pgm_read_byte(str);\r
- while(ch)\r
- {\r
- lcd.print(ch);\r
- ch=pgm_read_byte(++str);\r
- }\r
-}\r
-#define lcdprintPGM(x) lcdProgMemprint(MYPGM(x))\r
-\r
-\r
-//===========================================================================\r
-//=============================functions ============================\r
-//===========================================================================\r
-\r
-FORCE_INLINE int intround(const float &x){return int(0.5+x);}\r
-\r
-void lcd_status(const char* message)\r
-{\r
- strncpy(messagetext,message,LCD_WIDTH);\r
- messagetext[strlen(message)]=0;\r
-}\r
-\r
-void lcd_statuspgm(const char* message)\r
-{\r
- char ch=pgm_read_byte(message);\r
- char *target=messagetext;\r
- uint8_t cnt=0;\r
- while(ch &&cnt<LCD_WIDTH)\r
- {\r
- *target=ch;\r
- target++;\r
- cnt++;\r
- ch=pgm_read_byte(++message);\r
- }\r
- *target=0;\r
-}\r
-\r
-FORCE_INLINE void clear()\r
-{\r
- lcd.clear();\r
-}\r
-\r
-\r
-void lcd_init()\r
-{\r
- //beep();\r
- byte Degree[8] =\r
- {\r
- B01100,\r
- B10010,\r
- B10010,\r
- B01100,\r
- B00000,\r
- B00000,\r
- B00000,\r
- B00000\r
- };\r
- byte Thermometer[8] =\r
- {\r
- B00100,\r
- B01010,\r
- B01010,\r
- B01010,\r
- B01010,\r
- B10001,\r
- B10001,\r
- B01110\r
- };\r
- byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris\r
- byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris\r
- byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris\r
- lcd.begin(LCD_WIDTH, LCD_HEIGHT);\r
- lcd.createChar(1,Degree);\r
- lcd.createChar(2,Thermometer);\r
- lcd.createChar(3,uplevel);\r
- lcd.createChar(4,refresh);\r
- lcd.createChar(5,folder);\r
- LCD_MESSAGEPGM("UltiMarlin ready.");\r
-}\r
-\r
-\r
-void beep()\r
-{\r
- //return;\r
- #ifdef ULTIPANEL\r
- pinMode(BEEPER,OUTPUT);\r
- for(int8_t i=0;i<20;i++){\r
- WRITE(BEEPER,HIGH);\r
- delay(5);\r
- WRITE(BEEPER,LOW);\r
- delay(5);\r
- }\r
- #endif\r
-}\r
-\r
-void beepshort()\r
-{\r
- //return;\r
- #ifdef ULTIPANEL\r
- pinMode(BEEPER,OUTPUT);\r
- for(int8_t i=0;i<10;i++){\r
- WRITE(BEEPER,HIGH);\r
- delay(3);\r
- WRITE(BEEPER,LOW);\r
- delay(3);\r
- }\r
- #endif \r
-}\r
-\r
-void lcd_status()\r
-{\r
- #ifdef ULTIPANEL\r
- static uint8_t oldbuttons=0;\r
- //static long previous_millis_buttons=0;\r
- //static long previous_lcdinit=0;\r
- // buttons_check(); // Done in temperature interrupt\r
- //previous_millis_buttons=millis();\r
- \r
- if((buttons==oldbuttons) && ((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )\r
- return;\r
- oldbuttons=buttons;\r
- #else\r
- \r
- if(((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )\r
- return;\r
- #endif\r
- \r
- previous_millis_lcd=millis();\r
- menu.update();\r
-}\r
-#ifdef ULTIPANEL \r
-\r
-\r
-void buttons_init()\r
-{\r
- #ifdef NEWPANEL\r
- pinMode(BTN_EN1,INPUT);\r
- pinMode(BTN_EN2,INPUT); \r
- pinMode(BTN_ENC,INPUT); \r
- pinMode(SDCARDDETECT,INPUT);\r
- WRITE(BTN_EN1,HIGH);\r
- WRITE(BTN_EN2,HIGH);\r
- WRITE(BTN_ENC,HIGH);\r
- WRITE(SDCARDDETECT,HIGH);\r
- #else\r
- pinMode(SHIFT_CLK,OUTPUT);\r
- pinMode(SHIFT_LD,OUTPUT);\r
- pinMode(SHIFT_EN,OUTPUT);\r
- pinMode(SHIFT_OUT,INPUT);\r
- WRITE(SHIFT_OUT,HIGH);\r
- WRITE(SHIFT_LD,HIGH); \r
- WRITE(SHIFT_EN,LOW); \r
- #endif\r
-}\r
-\r
-\r
-void buttons_check()\r
-{\r
- \r
- #ifdef NEWPANEL\r
- uint8_t newbutton=0;\r
- if(READ(BTN_EN1)==0) newbutton|=EN_A;\r
- if(READ(BTN_EN2)==0) newbutton|=EN_B;\r
- if((blocking<millis()) &&(READ(BTN_ENC)==0))\r
- newbutton|=EN_C;\r
- buttons=newbutton;\r
- #else //read it from the shift register\r
- uint8_t newbutton=0;\r
- WRITE(SHIFT_LD,LOW);\r
- WRITE(SHIFT_LD,HIGH);\r
- unsigned char tmp_buttons=0;\r
- for(int8_t i=0;i<8;i++)\r
- { \r
- newbutton = newbutton>>1;\r
- if(READ(SHIFT_OUT))\r
- newbutton|=(1<<7);\r
- WRITE(SHIFT_CLK,HIGH);\r
- WRITE(SHIFT_CLK,LOW);\r
- }\r
- buttons=~newbutton; //invert it, because a pressed switch produces a logical 0\r
- #endif\r
- \r
- //manage encoder rotation\r
- char enc=0;\r
- if(buttons&EN_A)\r
- enc|=(1<<0);\r
- if(buttons&EN_B)\r
- enc|=(1<<1);\r
- if(enc!=lastenc)\r
- {\r
- switch(enc)\r
- {\r
- case encrot0:\r
- if(lastenc==encrot3)\r
- encoderpos++;\r
- else if(lastenc==encrot1)\r
- encoderpos--;\r
- break;\r
- case encrot1:\r
- if(lastenc==encrot0)\r
- encoderpos++;\r
- else if(lastenc==encrot2)\r
- encoderpos--;\r
- break;\r
- case encrot2:\r
- if(lastenc==encrot1)\r
- encoderpos++;\r
- else if(lastenc==encrot3)\r
- encoderpos--;\r
- break;\r
- case encrot3:\r
- if(lastenc==encrot2)\r
- encoderpos++;\r
- else if(lastenc==encrot0)\r
- encoderpos--;\r
- break;\r
- default:\r
- ;\r
- }\r
- }\r
- lastenc=enc;\r
-}\r
-\r
-#endif\r
-\r
-MainMenu::MainMenu()\r
-{\r
- status=Main_Status;\r
- displayStartingRow=0;\r
- activeline=0;\r
- force_lcd_update=true;\r
- #ifdef ULTIPANEL\r
- buttons_init();\r
- #endif\r
- lcd_init();\r
- linechanging=false;\r
- tune=false;\r
-}\r
-\r
-void MainMenu::showStatus()\r
-{ \r
-#if LCD_HEIGHT==4\r
- static int olddegHotEnd0=-1;\r
- static int oldtargetHotEnd0=-1;\r
- //force_lcd_update=true;\r
- if(force_lcd_update||feedmultiplychanged) //initial display of content\r
- {\r
- feedmultiplychanged=false;\r
- encoderpos=feedmultiply;\r
- clear();\r
- lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");\r
- #endif\r
- }\r
- \r
- int tHotEnd0=intround(degHotend0());\r
- if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update) //>1 because otherwise the lcd is refreshed to often.\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tHotEnd0));\r
- olddegHotEnd0=tHotEnd0;\r
- }\r
- int ttHotEnd0=intround(degTargetHotend0());\r
- if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(ttHotEnd0));\r
- oldtargetHotEnd0=ttHotEnd0;\r
- }\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- static int oldtBed=-1;\r
- static int oldtargetBed=-1; \r
- int tBed=intround(degBed());\r
- if((tBed!=oldtBed)||force_lcd_update)\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tBed));\r
- oldtBed=tBed;\r
- }\r
- int targetBed=intround(degTargetBed());\r
- if((targetBed!=oldtargetBed)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(targetBed));\r
- oldtargetBed=targetBed;\r
- }\r
- #endif\r
- //starttime=2;\r
- static uint16_t oldtime=0;\r
- if(starttime!=0)\r
- {\r
- lcd.setCursor(0,1);\r
- uint16_t time=millis()/60000-starttime/60000;\r
- \r
- if(starttime!=oldtime)\r
- {\r
- lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");\r
- oldtime=time;\r
- }\r
- }\r
- static int oldzpos=0;\r
- int currentz=current_position[2]*10;\r
- if((currentz!=oldzpos)||force_lcd_update)\r
- {\r
- lcd.setCursor(10,1);\r
- lcdprintPGM("Z:");lcd.print(itostr31(currentz));\r
- oldzpos=currentz;\r
- }\r
- static int oldfeedmultiply=0;\r
- int curfeedmultiply=feedmultiply;\r
- if(encoderpos!=curfeedmultiply||force_lcd_update)\r
- {\r
- curfeedmultiply=encoderpos;\r
- if(curfeedmultiply<10)\r
- curfeedmultiply=10;\r
- if(curfeedmultiply>999)\r
- curfeedmultiply=999;\r
- feedmultiply=curfeedmultiply;\r
- encoderpos=curfeedmultiply;\r
- }\r
- if((curfeedmultiply!=oldfeedmultiply)||force_lcd_update)\r
- {\r
- oldfeedmultiply=curfeedmultiply;\r
- lcd.setCursor(0,2);\r
- lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");\r
- }\r
- if(messagetext[0]!='\0')\r
- {\r
- lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(messagetext);\r
- uint8_t n=strlen(messagetext);\r
- for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
- lcd.print(" ");\r
- \r
- messagetext[0]='\0';\r
- }\r
- \r
- static uint8_t oldpercent=101;\r
- uint8_t percent=card.percentDone();\r
- if(oldpercent!=percent ||force_lcd_update)\r
- {\r
- lcd.setCursor(7,2);\r
- lcd.print(itostr3((int)percent));\r
- lcdprintPGM("%SD");\r
- \r
- }\r
- \r
-#else //smaller LCDS----------------------------------\r
- static int olddegHotEnd0=-1;\r
- static int oldtargetHotEnd0=-1;\r
- if(force_lcd_update) //initial display of content\r
- {\r
- encoderpos=feedmultiply;\r
- lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");\r
- #if defined BED_USES_THERMISTOR || defined BED_USES_AD595 \r
- lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");\r
- #endif\r
- }\r
- \r
- int tHotEnd0=intround(degHotend0());\r
- int ttHotEnd0=intround(degTargetHotend0());\r
-\r
-\r
- if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update)\r
- {\r
- lcd.setCursor(1,0);\r
- lcd.print(ftostr3(tHotEnd0));\r
- olddegHotEnd0=tHotEnd0;\r
- }\r
- if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)\r
- {\r
- lcd.setCursor(5,0);\r
- lcd.print(ftostr3(ttHotEnd0));\r
- oldtargetHotEnd0=ttHotEnd0;\r
- }\r
-\r
- if(messagetext[0]!='\0')\r
- {\r
- lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(messagetext);\r
- uint8_t n=strlen(messagetext);\r
- for(int8_t i=0;i<LCD_WIDTH-n;i++)\r
- lcd.print(" ");\r
- messagetext[0]='\0';\r
- }\r
-\r
-#endif\r
- force_lcd_update=false;\r
-}\r
-\r
-enum {ItemP_exit, ItemP_autostart,ItemP_disstep,ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude};\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
- 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
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemP_autostart:\r
- MENUITEM( lcdprintPGM(" Autostart") , BLOCK;card.lastnr=0;card.checkautostart(true);beepshort(); ) ;\r
- break;\r
- case ItemP_disstep:\r
- MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;\r
- break;\r
- case ItemP_home:\r
- MENUITEM( lcdprintPGM(" Auto Home") , BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;\r
- break;\r
- case ItemP_origin:\r
- MENUITEM( lcdprintPGM(" Set Origin") , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;\r
- break;\r
- case ItemP_preheat:\r
- MENUITEM( lcdprintPGM(" Preheat") , BLOCK;setTargetHotend0(170);beepshort(); ) ;\r
- break;\r
- case ItemP_extrude:\r
- MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;\r
- break;\r
- \r
- \r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemP_extrude,encoderpos);\r
-}\r
-\r
-enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,ItemT_fan};\r
-\r
-void MainMenu::showTune()\r
-{ \r
- uint8_t line=0;\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 ItemT_exit:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemT_speed:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=feedmultiply;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>400) encoderpos=400;\r
- feedmultiply = encoderpos;\r
- feedmultiplychanged=true;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemT_nozzle:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(degTargetHotend0());\r
- }\r
- else\r
- {\r
- setTargetHotend0(encoderpos);\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- }break;\r
- \r
- case ItemT_fan:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=fanpwm;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>255) encoderpos=255;\r
- fanpwm=encoderpos;\r
- analogWrite(FAN_PIN, fanpwm);\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemT_flow://axis_steps_per_unit[i] = code_value();\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Flow:");\r
- lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)axis_steps_per_unit[3];\r
- }\r
- else\r
- {\r
- float factor=float(encoderpos)/float(axis_steps_per_unit[3]);\r
- position[E_AXIS]=lround(position[E_AXIS]*factor);\r
- //current_position[3]*=factor;\r
- axis_steps_per_unit[E_AXIS]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>9999) encoderpos=9999;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemT_fan,encoderpos);\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
-enum {\r
- ItemCT_exit,ItemCT_nozzle,\r
-#ifdef AUTOTEMP\r
- ItemCT_autotempactive,\r
- ItemCT_autotempmin,ItemCT_autotempmax,ItemCT_autotempfact,\r
-#endif\r
- ItemCT_fan,\r
- ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C\r
-};\r
-\r
-void MainMenu::showControlTemp()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemCT_exit:\r
- MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- case ItemCT_nozzle:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(degTargetHotend0());\r
- }\r
- else\r
- {\r
- setTargetHotend0(encoderpos);\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- #ifdef AUTOTEMP\r
- case ItemCT_autotempmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Min:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_min));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_min);\r
- }\r
- else\r
- {\r
- autotemp_min=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_autotempmax:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Max:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_max));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_max);\r
- }\r
- else\r
- {\r
- autotemp_max=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>260) encoderpos=260;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_autotempfact:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" \002 Fact:");\r
- lcd.setCursor(13,line);lcd.print(ftostr32(autotemp_factor));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=intround(autotemp_factor*100);\r
- }\r
- else\r
- {\r
- autotemp_max=encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>99) encoderpos=99;\r
- lcd.setCursor(13,line);lcd.print(ftostr32(encoderpos/100.));\r
- }\r
- \r
- }break;\r
- case ItemCT_autotempactive:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Autotemp:");\r
- lcd.setCursor(13,line);\r
- if(autotemp_enabled)\r
- lcdprintPGM("On");\r
- else\r
- lcdprintPGM("Off");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- autotemp_enabled=!autotemp_enabled;\r
- lcd.setCursor(13,line);\r
- if(autotemp_enabled)\r
- lcdprintPGM("On ");\r
- else\r
- lcdprintPGM("Off");\r
- BLOCK;\r
- }\r
- \r
- }break; \r
- #endif //autotemp\r
- case ItemCT_fan:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=fanpwm;\r
- }\r
- else\r
- {\r
- encoderpos=activeline*lcdslow;\r
- beepshort();\r
- }\r
- BLOCK;\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>255) encoderpos=255;\r
- fanpwm=encoderpos;\r
- analogWrite(FAN_PIN, fanpwm);\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_P: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");\r
- lcd.setCursor(13,line);lcd.print(itostr4(Kp));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)Kp;\r
- }\r
- else\r
- {\r
- Kp= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_I: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-I: ");\r
- lcd.setCursor(13,line);lcd.print(ftostr51(Ki/PID_dT));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(Ki*10/PID_dT);\r
- }\r
- else\r
- {\r
- Ki= encoderpos/10.*PID_dT;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(ftostr51(encoderpos/10.));\r
- }\r
- \r
- }break;\r
- case ItemCT_PID_D: \r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-D: ");\r
- lcd.setCursor(13,line);lcd.print(itostr4(Kd*PID_dT));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(Kd/5./PID_dT);\r
- }\r
- else\r
- {\r
- Kd= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>9990) encoderpos=9990;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- case ItemCT_PID_C: \r
- #ifdef PID_ADD_EXTRUSION_RATE\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" PID-C: ");\r
- lcd.setCursor(13,line);lcd.print(itostr3(Kc));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)Kc;\r
- }\r
- else\r
- {\r
- Kc= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }\r
- #endif\r
- break;\r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- #ifdef PID_ADD_EXTRUSION_RATE\r
- updateActiveLines(ItemCT_PID_C,encoderpos);\r
- #else\r
- updateActiveLines(ItemCT_PID_D,encoderpos);\r
- #endif\r
-}\r
-\r
-\r
-enum {\r
- ItemCM_exit, \r
- ItemCM_acc, ItemCM_xyjerk, \r
- ItemCM_vmaxx, ItemCM_vmaxy, ItemCM_vmaxz, ItemCM_vmaxe, \r
- ItemCM_vtravmin,ItemCM_vmin, \r
- ItemCM_amaxx, ItemCM_amaxy, ItemCM_amaxz, ItemCM_amaxe, \r
- ItemCM_aret,ItemCM_esteps\r
-};\r
-\r
-\r
-\r
-void MainMenu::showControlMotion()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemCM_exit:\r
- MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- case ItemCM_acc:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Acc:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)acceleration/100;\r
- }\r
- else\r
- {\r
- acceleration= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_xyjerk: //max_xy_jerk\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vxy-jerk: ");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_xy_jerk;\r
- }\r
- else\r
- {\r
- max_xy_jerk= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_vmaxx:\r
- case ItemCM_vmaxy:\r
- case ItemCM_vmaxz:\r
- case ItemCM_vmaxe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vmax ");\r
- if(i==ItemCM_vmaxx)lcdprintPGM("x:");\r
- if(i==ItemCM_vmaxy)lcdprintPGM("y:");\r
- if(i==ItemCM_vmaxz)lcdprintPGM("z:");\r
- if(i==ItemCM_vmaxe)lcdprintPGM("e:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemCM_vmaxx]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_feedrate[i-ItemCM_vmaxx];\r
- }\r
- else\r
- {\r
- max_feedrate[i-ItemCM_vmaxx]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_vmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Vmin:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)(minimumfeedrate);\r
- }\r
- else\r
- {\r
- minimumfeedrate= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- case ItemCM_vtravmin:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" VTrav min:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)mintravelfeedrate;\r
- }\r
- else\r
- {\r
- mintravelfeedrate= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<0) encoderpos=0;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));\r
- }\r
- \r
- }break;\r
- \r
- case ItemCM_amaxx: \r
- case ItemCM_amaxy:\r
- case ItemCM_amaxz:\r
- case ItemCM_amaxe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Amax ");\r
- if(i==ItemCM_amaxx)lcdprintPGM("x:");\r
- if(i==ItemCM_amaxy)lcdprintPGM("y:");\r
- if(i==ItemCM_amaxz)lcdprintPGM("z:");\r
- if(i==ItemCM_amaxe)lcdprintPGM("e:");\r
- lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100;\r
- }\r
- else\r
- {\r
- max_acceleration_units_per_sq_second[i-ItemCM_amaxx]= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<1) encoderpos=1;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_aret://float retract_acceleration = 7000;\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" A-retract:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)retract_acceleration/100;\r
- }\r
- else\r
- {\r
- retract_acceleration= encoderpos*100;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<10) encoderpos=10;\r
- if(encoderpos>990) encoderpos=990;\r
- lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");\r
- }\r
- \r
- }break;\r
- case ItemCM_esteps://axis_steps_per_unit[i] = code_value();\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Esteps/mm:");\r
- lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));\r
- }\r
- \r
- if((activeline!=line) )\r
- break;\r
- \r
- if(CLICKED)\r
- {\r
- linechanging=!linechanging;\r
- if(linechanging)\r
- {\r
- encoderpos=(int)axis_steps_per_unit[3];\r
- }\r
- else\r
- {\r
- float factor=float(encoderpos)/float(axis_steps_per_unit[3]);\r
- position[E_AXIS]=lround(position[E_AXIS]*factor);\r
- //current_position[3]*=factor;\r
- axis_steps_per_unit[E_AXIS]= encoderpos;\r
- encoderpos=activeline*lcdslow;\r
- \r
- }\r
- BLOCK;\r
- beepshort();\r
- }\r
- if(linechanging)\r
- {\r
- if(encoderpos<5) encoderpos=5;\r
- if(encoderpos>9999) encoderpos=9999;\r
- lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));\r
- }\r
- \r
- }break; \r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemCM_esteps,encoderpos);\r
-}\r
-\r
-\r
-enum {\r
- ItemC_exit,ItemC_temp,ItemC_move,\r
- ItemC_store, ItemC_load,ItemC_failsafe\r
-};\r
-\r
-void MainMenu::showControl()\r
-{\r
- uint8_t line=0;\r
- clearIfNecessary();\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case ItemC_exit:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
- case ItemC_temp:\r
- MENUITEM( lcdprintPGM(" Temperature \x7E") , BLOCK;status=Sub_TempControl;beepshort(); ) ;\r
- break;\r
- case ItemC_move:\r
- MENUITEM( lcdprintPGM(" Motion \x7E") , BLOCK;status=Sub_MotionControl;beepshort(); ) ;\r
- break;\r
- case ItemC_store:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Store EPROM");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_StoreSettings();\r
- }\r
- }break;\r
- case ItemC_load:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Load EPROM");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_RetrieveSettings();\r
- }\r
- }break;\r
- case ItemC_failsafe:\r
- {\r
- if(force_lcd_update)\r
- {\r
- lcd.setCursor(0,line);lcdprintPGM(" Restore Failsafe");\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- //enquecommand("M84");\r
- beepshort();\r
- BLOCK;\r
- EEPROM_RetrieveSettings(true);\r
- }\r
- }break;\r
- default: \r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(ItemC_failsafe,encoderpos);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-void MainMenu::showSD()\r
-{\r
-#ifdef SDSUPPORT\r
- uint8_t line=0;\r
-\r
- clearIfNecessary();\r
- static uint8_t nrfiles=0;\r
- if(force_lcd_update)\r
- {\r
- if(card.cardOK)\r
- {\r
- nrfiles=card.getnrfilenames();\r
- }\r
- else\r
- {\r
- nrfiles=0;\r
- lineoffset=0;\r
- }\r
- }\r
- bool enforceupdate=false;\r
- for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)\r
- {\r
- switch(i)\r
- {\r
- case 0:\r
- MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;\r
- break;\r
-// case 1:\r
-// {\r
-// if(force_lcd_update)\r
-// {\r
-// lcd.setCursor(0,line);\r
-// #ifdef CARDINSERTED\r
-// if(CARDINSERTED)\r
-// #else\r
-// if(true)\r
-// #endif\r
-// {\r
-// lcdprintPGM(" \004Refresh");\r
-// }\r
-// else\r
-// {\r
-// lcdprintPGM(" \004Insert Card");\r
-// }\r
-// \r
-// }\r
-// if((activeline==line) && CLICKED)\r
-// {\r
-// BLOCK;\r
-// beepshort();\r
-// card.initsd();\r
-// force_lcd_update=true;\r
-// nrfiles=card.getnrfilenames();\r
-// }\r
-// }break;\r
- case 1:\r
- MENUITEM( lcd.print(" ");card.getWorkDirName();if(card.filename[0]=='/') lcdprintPGM("\004Refresh");else {lcd.print("\005");lcd.print(card.filename);lcd.print("/..");} , BLOCK;card.updir();enforceupdate=true;lineoffset=0;beepshort(); ) ;\r
- \r
- break;\r
- default:\r
- {\r
- #define FIRSTITEM 2\r
- if(i-FIRSTITEM<nrfiles)\r
- {\r
- if(force_lcd_update)\r
- {\r
- card.getfilename(i-FIRSTITEM);\r
- //Serial.print("Filenr:");Serial.println(i-2);\r
- lcd.setCursor(0,line);lcdprintPGM(" ");\r
- if(card.filenameIsDir) lcd.print("\005");\r
- lcd.print(card.filename);\r
- }\r
- if((activeline==line) && CLICKED)\r
- {\r
- BLOCK\r
- card.getfilename(i-FIRSTITEM);\r
- if(card.filenameIsDir)\r
- {\r
- for(int8_t i=0;i<strlen(card.filename);i++)\r
- card.filename[i]=tolower(card.filename[i]);\r
- card.chdir(card.filename);\r
- lineoffset=0;\r
- enforceupdate=true;\r
- }\r
- else\r
- {\r
- char cmd[30];\r
- for(int8_t i=0;i<strlen(card.filename);i++)\r
- card.filename[i]=tolower(card.filename[i]);\r
- sprintf(cmd,"M23 %s",card.filename);\r
- //sprintf(cmd,"M115");\r
- enquecommand(cmd);\r
- enquecommand("M24");\r
- beep(); \r
- status=Main_Status;\r
- lcd_status(card.filename);\r
- }\r
- }\r
- }\r
- \r
- }\r
- break;\r
- }\r
- line++;\r
- }\r
- updateActiveLines(FIRSTITEM+nrfiles-1,encoderpos);\r
- if(enforceupdate)\r
- {\r
- force_lcd_update=true;\r
- enforceupdate=false;\r
- }\r
-#endif\r
-}\r
-\r
-enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };\r
-void MainMenu::showMainMenu()\r
-{\r
-\r
- #ifndef ULTIPANEL\r
- force_lcd_update=false;\r
- #endif\r
- if(tune)\r
- {\r
- if(!(movesplanned() ||card.sdprinting))\r
- {\r
- force_lcd_update=true;\r
- tune=false;\r
- }\r
- }\r
- else \r
- {\r
- if(movesplanned() ||card.sdprinting)\r
- {\r
- force_lcd_update=true;\r
- tune=true;\r
- }\r
- } \r
- clearIfNecessary();\r
- for(int8_t line=0;line<LCD_HEIGHT;line++)\r
- {\r
- switch(line)\r
- { \r
- case ItemM_watch:\r
- MENUITEM( lcdprintPGM(" Watch \003") , BLOCK;status=Main_Status;beepshort(); ) ;\r
- break;\r
- case ItemM_prepare:\r
- MENUITEM( if(!tune) lcdprintPGM(" Prepare \x7E");else lcdprintPGM(" Tune \x7E"); , BLOCK;status=Main_Prepare;beepshort(); ) ;\r
- break;\r
- \r
- case ItemM_control:\r
- MENUITEM( lcdprintPGM(" Control \x7E") , BLOCK;status=Main_Control;beepshort(); ) ;\r
- break;\r
- #ifdef SDSUPPORT\r
- case ItemM_file: \r
- {\r
- if(force_lcd_update) \r
- {\r
- lcd.setCursor(0,line);\r
- #ifdef CARDINSERTED\r
- if(CARDINSERTED)\r
- #else\r
- if(true)\r
- #endif\r
- {\r
- if(card.sdprinting)\r
- lcdprintPGM(" Stop Print \x7E");\r
- else\r
- lcdprintPGM(" Card Menu \x7E");\r
- }\r
- else\r
- {\r
- lcdprintPGM(" No Card"); \r
- }\r
- }\r
- #ifdef CARDINSERTED\r
- if(CARDINSERTED)\r
- #endif\r
- if((activeline==line)&&CLICKED)\r
- {\r
- card.printingHasFinished();\r
- BLOCK;\r
- status=Main_SD;\r
- beepshort();\r
- }\r
- }break;\r
- #else\r
- case ItemM_file:\r
- break;\r
- #endif\r
- default: \r
- SERIAL_ERROR_START;\r
- SERIAL_ERRORLNPGM("Something is wrong in the MenuStructure.");\r
- break;\r
- }\r
- }\r
- updateActiveLines(3,encoderpos);\r
-}\r
-\r
-void MainMenu::update()\r
-{\r
- static MainStatus oldstatus=Main_Menu; //init automatically causes foce_lcd_update=true\r
- static long timeoutToStatus=0;\r
- static bool oldcardstatus=false;\r
- #ifdef CARDINSERTED\r
- if((CARDINSERTED != oldcardstatus))\r
- {\r
- force_lcd_update=true;\r
- oldcardstatus=CARDINSERTED;\r
- //Serial.println("echo: SD CHANGE");\r
- if(CARDINSERTED)\r
- {\r
- card.initsd();\r
- LCD_MESSAGEPGM("Card inserted");\r
- }\r
- else\r
- {\r
- card.release();\r
- LCD_MESSAGEPGM("Card removed");\r
- }\r
- }\r
- #endif\r
- \r
- if(status!=oldstatus)\r
- {\r
- force_lcd_update=true;\r
- encoderpos=0;\r
- lineoffset=0;\r
- \r
- oldstatus=status;\r
- }\r
- if( (encoderpos!=lastencoderpos) || CLICKED)\r
- timeoutToStatus=millis()+STATUSTIMEOUT;\r
-\r
- switch(status)\r
- { \r
- case Main_Status: \r
- { \r
- showStatus();\r
- if(CLICKED)\r
- {\r
- linechanging=false;\r
- BLOCK\r
- status=Main_Menu;\r
- timeoutToStatus=millis()+STATUSTIMEOUT;\r
- }\r
- }break;\r
- case Main_Menu: \r
- {\r
- showMainMenu();\r
- linechanging=false;\r
- }break;\r
- case Main_Prepare: \r
- {\r
- if(tune)\r
- {\r
- showTune();\r
- }\r
- else\r
- {\r
- showPrepare(); \r
- }\r
- }break;\r
- case Main_Control:\r
- {\r
- showControl(); \r
- }break;\r
- case Sub_MotionControl:\r
- {\r
- showControlMotion(); \r
- }break;\r
- case Sub_TempControl:\r
- {\r
- showControlTemp(); \r
- }break;\r
- case Main_SD: \r
- {\r
- showSD();\r
- }break;\r
- }\r
- \r
- if(timeoutToStatus<millis())\r
- status=Main_Status;\r
- //force_lcd_update=false;\r
- lastencoderpos=encoderpos;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-// convert float to string with +123.4 format\r
-char *ftostr3(const float &x)\r
-{\r
- //sprintf(conv,"%5.1f",x);\r
- int xx=x;\r
- conv[0]=(xx/100)%10+'0';\r
- conv[1]=(xx/10)%10+'0';\r
- conv[2]=(xx)%10+'0';\r
- conv[3]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr2(const uint8_t &x)\r
-{\r
- //sprintf(conv,"%5.1f",x);\r
- int xx=x;\r
- conv[0]=(xx/10)%10+'0';\r
- conv[1]=(xx)%10+'0';\r
- conv[2]=0;\r
- return conv;\r
-}\r
-\r
-// convert float to string with +123.4 format\r
-char *ftostr31(const float &x)\r
-{\r
- int xx=x*10;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/1000)%10+'0';\r
- conv[2]=(xx/100)%10+'0';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]='.';\r
- conv[5]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *ftostr32(const float &x)\r
-{\r
- int xx=x*100;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/100)%10+'0';\r
- conv[2]='.';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr31(const int &xx)\r
-{\r
- conv[0]=(xx>=0)?'+':'-';\r
- conv[1]=(xx/1000)%10+'0';\r
- conv[2]=(xx/100)%10+'0';\r
- conv[3]=(xx/10)%10+'0';\r
- conv[4]='.';\r
- conv[5]=(xx)%10+'0';\r
- conv[6]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr3(const int &xx)\r
-{\r
- conv[0]=(xx/100)%10+'0';\r
- conv[1]=(xx/10)%10+'0';\r
- conv[2]=(xx)%10+'0';\r
- conv[3]=0;\r
- return conv;\r
-}\r
-\r
-char *itostr4(const int &xx)\r
-{\r
- conv[0]=(xx/1000)%10+'0';\r
- conv[1]=(xx/100)%10+'0';\r
- conv[2]=(xx/10)%10+'0';\r
- conv[3]=(xx)%10+'0';\r
- conv[4]=0;\r
- return conv;\r
-}\r
-\r
-// convert float to string with +1234.5 format\r
-char *ftostr51(const float &x)\r
-{\r
- int xx=x*10;\r
- conv[0]=(xx>=0)?'+':'-';\r
- xx=abs(xx);\r
- conv[1]=(xx/10000)%10+'0';\r
- conv[2]=(xx/1000)%10+'0';\r
- conv[3]=(xx/100)%10+'0';\r
- conv[4]=(xx/10)%10+'0';\r
- conv[5]='.';\r
- conv[6]=(xx)%10+'0';\r
- conv[7]=0;\r
- return conv;\r
-}\r
-\r
-\r
-#endif //ULTRA_LCD\r
-\r
-\r
+#include "ultralcd.h"
+#ifdef ULTRA_LCD
+
+//===========================================================================
+//=============================imported variables============================
+//===========================================================================
+
+extern volatile int feedmultiply;
+extern volatile bool feedmultiplychanged;
+
+extern long position[4];
+extern CardReader card;
+
+//===========================================================================
+//=============================public variables============================
+//===========================================================================
+volatile char buttons=0; //the last checked buttons in a bit array.
+int encoderpos=0;
+short lastenc=0;
+
+
+//===========================================================================
+//=============================private variables============================
+//===========================================================================
+static char messagetext[LCD_WIDTH]="";
+
+//return for string conversion routines
+static char conv[8];
+
+#include <LiquidCrystal.h>
+LiquidCrystal lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7
+
+static unsigned long previous_millis_lcd=0;
+static long previous_millis_buttons=0;
+
+
+#ifdef NEWPANEL
+ static long blocking=0;
+#else
+ static long blocking[8]={0,0,0,0,0,0,0,0};
+#endif
+
+static MainMenu menu;
+
+#include <avr/pgmspace.h>
+
+void lcdProgMemprint(const char *str)
+{
+ char ch=pgm_read_byte(str);
+ while(ch)
+ {
+ lcd.print(ch);
+ ch=pgm_read_byte(++str);
+ }
+}
+#define lcdprintPGM(x) lcdProgMemprint(MYPGM(x))
+
+
+//===========================================================================
+//=============================functions ============================
+//===========================================================================
+
+FORCE_INLINE int intround(const float &x){return int(0.5+x);}
+
+void lcd_status(const char* message)
+{
+ strncpy(messagetext,message,LCD_WIDTH);
+ messagetext[strlen(message)]=0;
+}
+
+void lcd_statuspgm(const char* message)
+{
+ char ch=pgm_read_byte(message);
+ char *target=messagetext;
+ uint8_t cnt=0;
+ while(ch &&cnt<LCD_WIDTH)
+ {
+ *target=ch;
+ target++;
+ cnt++;
+ ch=pgm_read_byte(++message);
+ }
+ *target=0;
+}
+
+FORCE_INLINE void clear()
+{
+ lcd.clear();
+}
+
+
+void lcd_init()
+{
+ //beep();
+ byte Degree[8] =
+ {
+ B01100,
+ B10010,
+ B10010,
+ B01100,
+ B00000,
+ B00000,
+ B00000,
+ B00000
+ };
+ byte Thermometer[8] =
+ {
+ B00100,
+ B01010,
+ B01010,
+ B01010,
+ B01010,
+ B10001,
+ B10001,
+ B01110
+ };
+ byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris
+ byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris
+ byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris
+ lcd.begin(LCD_WIDTH, LCD_HEIGHT);
+ lcd.createChar(1,Degree);
+ lcd.createChar(2,Thermometer);
+ lcd.createChar(3,uplevel);
+ lcd.createChar(4,refresh);
+ lcd.createChar(5,folder);
+ LCD_MESSAGEPGM("UltiMarlin ready.");
+}
+
+
+void beep()
+{
+ //return;
+ #ifdef ULTIPANEL
+ pinMode(BEEPER,OUTPUT);
+ for(int8_t i=0;i<20;i++){
+ WRITE(BEEPER,HIGH);
+ delay(5);
+ WRITE(BEEPER,LOW);
+ delay(5);
+ }
+ #endif
+}
+
+void beepshort()
+{
+ //return;
+ #ifdef ULTIPANEL
+ pinMode(BEEPER,OUTPUT);
+ for(int8_t i=0;i<10;i++){
+ WRITE(BEEPER,HIGH);
+ delay(3);
+ WRITE(BEEPER,LOW);
+ delay(3);
+ }
+ #endif
+}
+
+void lcd_status()
+{
+ #ifdef ULTIPANEL
+ static uint8_t oldbuttons=0;
+ //static long previous_millis_buttons=0;
+ //static long previous_lcdinit=0;
+ // buttons_check(); // Done in temperature interrupt
+ //previous_millis_buttons=millis();
+ long ms=millis();
+ for(int8_t i=0; i<8; i++) {
+ if((blocking[i]>ms))
+ buttons &= ~(1<<i);
+ }
+ if((buttons==oldbuttons) && ((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
+ return;
+ oldbuttons=buttons;
+ #else
+
+ if(((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
+ return;
+ #endif
+
+ previous_millis_lcd=millis();
+ menu.update();
+}
+#ifdef ULTIPANEL
+
+
+void buttons_init()
+{
+ #ifdef NEWPANEL
+ pinMode(BTN_EN1,INPUT);
+ pinMode(BTN_EN2,INPUT);
+ pinMode(BTN_ENC,INPUT);
+ pinMode(SDCARDDETECT,INPUT);
+ WRITE(BTN_EN1,HIGH);
+ WRITE(BTN_EN2,HIGH);
+ WRITE(BTN_ENC,HIGH);
+ WRITE(SDCARDDETECT,HIGH);
+ #else
+ pinMode(SHIFT_CLK,OUTPUT);
+ pinMode(SHIFT_LD,OUTPUT);
+ pinMode(SHIFT_EN,OUTPUT);
+ pinMode(SHIFT_OUT,INPUT);
+ WRITE(SHIFT_OUT,HIGH);
+ WRITE(SHIFT_LD,HIGH);
+ WRITE(SHIFT_EN,LOW);
+ #endif
+}
+
+
+void buttons_check()
+{
+
+ #ifdef NEWPANEL
+ uint8_t newbutton=0;
+ if(READ(BTN_EN1)==0) newbutton|=EN_A;
+ if(READ(BTN_EN2)==0) newbutton|=EN_B;
+ if((blocking<millis()) &&(READ(BTN_ENC)==0))
+ newbutton|=EN_C;
+ buttons=newbutton;
+ #else //read it from the shift register
+ uint8_t newbutton=0;
+ WRITE(SHIFT_LD,LOW);
+ WRITE(SHIFT_LD,HIGH);
+ unsigned char tmp_buttons=0;
+ for(int8_t i=0;i<8;i++)
+ {
+ newbutton = newbutton>>1;
+ if(READ(SHIFT_OUT))
+ newbutton|=(1<<7);
+ WRITE(SHIFT_CLK,HIGH);
+ WRITE(SHIFT_CLK,LOW);
+ }
+ buttons=~newbutton; //invert it, because a pressed switch produces a logical 0
+ #endif
+
+ //manage encoder rotation
+ char enc=0;
+ if(buttons&EN_A)
+ enc|=(1<<0);
+ if(buttons&EN_B)
+ enc|=(1<<1);
+ if(enc!=lastenc)
+ {
+ switch(enc)
+ {
+ case encrot0:
+ if(lastenc==encrot3)
+ encoderpos++;
+ else if(lastenc==encrot1)
+ encoderpos--;
+ break;
+ case encrot1:
+ if(lastenc==encrot0)
+ encoderpos++;
+ else if(lastenc==encrot2)
+ encoderpos--;
+ break;
+ case encrot2:
+ if(lastenc==encrot1)
+ encoderpos++;
+ else if(lastenc==encrot3)
+ encoderpos--;
+ break;
+ case encrot3:
+ if(lastenc==encrot2)
+ encoderpos++;
+ else if(lastenc==encrot0)
+ encoderpos--;
+ break;
+ default:
+ ;
+ }
+ }
+ lastenc=enc;
+}
+
+#endif
+
+MainMenu::MainMenu()
+{
+ status=Main_Status;
+ displayStartingRow=0;
+ activeline=0;
+ force_lcd_update=true;
+ #ifdef ULTIPANEL
+ buttons_init();
+ #endif
+ lcd_init();
+ linechanging=false;
+ tune=false;
+}
+
+void MainMenu::showStatus()
+{
+#if LCD_HEIGHT==4
+ static int olddegHotEnd0=-1;
+ static int oldtargetHotEnd0=-1;
+ //force_lcd_update=true;
+ if(force_lcd_update||feedmultiplychanged) //initial display of content
+ {
+ feedmultiplychanged=false;
+ encoderpos=feedmultiply;
+ clear();
+ lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
+ #endif
+ }
+
+ int tHotEnd0=intround(degHotend0());
+ if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update) //>1 because otherwise the lcd is refreshed to often.
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tHotEnd0));
+ olddegHotEnd0=tHotEnd0;
+ }
+ int ttHotEnd0=intround(degTargetHotend0());
+ if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(ttHotEnd0));
+ oldtargetHotEnd0=ttHotEnd0;
+ }
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ static int oldtBed=-1;
+ static int oldtargetBed=-1;
+ int tBed=intround(degBed());
+ if((tBed!=oldtBed)||force_lcd_update)
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tBed));
+ oldtBed=tBed;
+ }
+ int targetBed=intround(degTargetBed());
+ if((targetBed!=oldtargetBed)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(targetBed));
+ oldtargetBed=targetBed;
+ }
+ #endif
+ //starttime=2;
+ static uint16_t oldtime=0;
+ if(starttime!=0)
+ {
+ lcd.setCursor(0,1);
+ uint16_t time=millis()/60000-starttime/60000;
+
+ if(starttime!=oldtime)
+ {
+ lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");
+ oldtime=time;
+ }
+ }
+ static int oldzpos=0;
+ int currentz=current_position[2]*10;
+ if((currentz!=oldzpos)||force_lcd_update)
+ {
+ lcd.setCursor(10,1);
+ lcdprintPGM("Z:");lcd.print(itostr31(currentz));
+ oldzpos=currentz;
+ }
+ static int oldfeedmultiply=0;
+ int curfeedmultiply=feedmultiply;
+ if(encoderpos!=curfeedmultiply||force_lcd_update)
+ {
+ curfeedmultiply=encoderpos;
+ if(curfeedmultiply<10)
+ curfeedmultiply=10;
+ if(curfeedmultiply>999)
+ curfeedmultiply=999;
+ feedmultiply=curfeedmultiply;
+ encoderpos=curfeedmultiply;
+ }
+ if((curfeedmultiply!=oldfeedmultiply)||force_lcd_update)
+ {
+ oldfeedmultiply=curfeedmultiply;
+ lcd.setCursor(0,2);
+ lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");
+ }
+ if(messagetext[0]!='\0')
+ {
+ lcd.setCursor(0,LCD_HEIGHT-1);
+ lcd.print(messagetext);
+ uint8_t n=strlen(messagetext);
+ for(int8_t i=0;i<LCD_WIDTH-n;i++)
+ lcd.print(" ");
+
+ messagetext[0]='\0';
+ }
+
+ static uint8_t oldpercent=101;
+ uint8_t percent=card.percentDone();
+ if(oldpercent!=percent ||force_lcd_update)
+ {
+ lcd.setCursor(7,2);
+ lcd.print(itostr3((int)percent));
+ lcdprintPGM("%SD");
+
+ }
+
+#else //smaller LCDS----------------------------------
+ static int olddegHotEnd0=-1;
+ static int oldtargetHotEnd0=-1;
+ if(force_lcd_update) //initial display of content
+ {
+ encoderpos=feedmultiply;
+ lcd.setCursor(0,0);lcdprintPGM("\002123/567\001 ");
+ #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
+ lcd.setCursor(10,0);lcdprintPGM("B123/567\001 ");
+ #endif
+ }
+
+ int tHotEnd0=intround(degHotend0());
+ int ttHotEnd0=intround(degTargetHotend0());
+
+
+ if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update)
+ {
+ lcd.setCursor(1,0);
+ lcd.print(ftostr3(tHotEnd0));
+ olddegHotEnd0=tHotEnd0;
+ }
+ if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
+ {
+ lcd.setCursor(5,0);
+ lcd.print(ftostr3(ttHotEnd0));
+ oldtargetHotEnd0=ttHotEnd0;
+ }
+
+ if(messagetext[0]!='\0')
+ {
+ lcd.setCursor(0,LCD_HEIGHT-1);
+ lcd.print(messagetext);
+ uint8_t n=strlen(messagetext);
+ for(int8_t i=0;i<LCD_WIDTH-n;i++)
+ lcd.print(" ");
+ messagetext[0]='\0';
+ }
+
+#endif
+ force_lcd_update=false;
+}
+
- enum {ItemP_exit, ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude, ItemP_disstep};
++enum {ItemP_exit, ItemP_autostart,ItemP_disstep,ItemP_home, ItemP_origin, ItemP_preheat, ItemP_extrude};
+
+//any action must not contain a ',' character anywhere, or this breaks:
+#define MENUITEM(repaint_action, click_action) \
+ {\
+ if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
+ if((activeline==line) && CLICKED) {click_action} \
+ }
+
+void MainMenu::showPrepare()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ //Serial.println((int)(line-lineoffset));
+ switch(i)
+ {
+ case ItemP_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
++ case ItemP_autostart:
++ MENUITEM( lcdprintPGM(" Autostart") , BLOCK;card.lastnr=0;card.checkautostart(true);beepshort(); ) ;
++ break;
++ case ItemP_disstep:
++ MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;
++ break;
+ case ItemP_home:
+ MENUITEM( lcdprintPGM(" Auto Home") , BLOCK;enquecommand("G28 X-105 Y-105 Z0");beepshort(); ) ;
+ break;
+ case ItemP_origin:
+ MENUITEM( lcdprintPGM(" Set Origin") , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;
+ break;
+ case ItemP_preheat:
+ MENUITEM( lcdprintPGM(" Preheat") , BLOCK;setTargetHotend0(170);beepshort(); ) ;
+ break;
+ case ItemP_extrude:
+ MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;
+ break;
- case ItemP_disstep:
- MENUITEM( lcdprintPGM(" Disable Steppers") , BLOCK;enquecommand("M84");beepshort(); ) ;
- break;
++
++
+ default:
+ break;
+ }
+ line++;
+ }
- updateActiveLines(ItemP_disstep,encoderpos);
++ updateActiveLines(ItemP_extrude,encoderpos);
+}
+
+enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,ItemT_fan};
+
+void MainMenu::showTune()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ //Serial.println((int)(line-lineoffset));
+ switch(i)
+ {
+ case ItemT_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+ case ItemT_speed:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=feedmultiply;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>400) encoderpos=400;
+ feedmultiply = encoderpos;
+ feedmultiplychanged=true;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemT_nozzle:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(degTargetHotend0());
+ }
+ else
+ {
+ setTargetHotend0(encoderpos);
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+ }break;
+
+ case ItemT_fan:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=fanpwm;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>255) encoderpos=255;
+ fanpwm=encoderpos;
+ analogWrite(FAN_PIN, fanpwm);
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemT_flow://axis_steps_per_unit[i] = code_value();
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Flow:");
+ lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)axis_steps_per_unit[3];
+ }
+ else
+ {
+ float factor=float(encoderpos)/float(axis_steps_per_unit[3]);
+ position[E_AXIS]=lround(position[E_AXIS]*factor);
+ //current_position[3]*=factor;
+ axis_steps_per_unit[E_AXIS]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>9999) encoderpos=9999;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemT_fan,encoderpos);
+}
+
+//does not work
+// #define MENUCHANGEITEM(repaint_action, enter_action, accept_action, change_action) \
+// {\
+// if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
+// if(activeline==line) \
+// { \
+// if(CLICKED) \
+// { \
+// linechanging=!linechanging; \
+// if(linechanging) {enter_action;} \
+// else {accept_action;} \
+// } \
+// else \
+// if(linechanging) {change_action};}\
+// }
+//
+
+enum {
+ ItemCT_exit,ItemCT_nozzle,
+#ifdef AUTOTEMP
+ ItemCT_autotempactive,
+ ItemCT_autotempmin,ItemCT_autotempmax,ItemCT_autotempfact,
+#endif
+ ItemCT_fan,
+ ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C
+};
+
+void MainMenu::showControlTemp()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemCT_exit:
+ MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ case ItemCT_nozzle:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(degTargetHotend0());
+ }
+ else
+ {
+ setTargetHotend0(encoderpos);
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ #ifdef AUTOTEMP
+ case ItemCT_autotempmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Min:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_min));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_min);
+ }
+ else
+ {
+ autotemp_min=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_autotempmax:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Max:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_max));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_max);
+ }
+ else
+ {
+ autotemp_max=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>260) encoderpos=260;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_autotempfact:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" \002 Fact:");
+ lcd.setCursor(13,line);lcd.print(ftostr32(autotemp_factor));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=intround(autotemp_factor*100);
+ }
+ else
+ {
+ autotemp_max=encoderpos;
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>99) encoderpos=99;
+ lcd.setCursor(13,line);lcd.print(ftostr32(encoderpos/100.));
+ }
+
+ }break;
+ case ItemCT_autotempactive:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Autotemp:");
+ lcd.setCursor(13,line);
+ if(autotemp_enabled)
+ lcdprintPGM("On");
+ else
+ lcdprintPGM("Off");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ autotemp_enabled=!autotemp_enabled;
+ lcd.setCursor(13,line);
+ if(autotemp_enabled)
+ lcdprintPGM("On ");
+ else
+ lcdprintPGM("Off");
+ BLOCK;
+ }
+
+ }break;
+ #endif //autotemp
+ case ItemCT_fan:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Fan speed:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(fanpwm));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=fanpwm;
+ }
+ else
+ {
+ encoderpos=activeline*lcdslow;
+ beepshort();
+ }
+ BLOCK;
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>255) encoderpos=255;
+ fanpwm=encoderpos;
+ analogWrite(FAN_PIN, fanpwm);
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_P:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");
+ lcd.setCursor(13,line);lcd.print(itostr4(Kp));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)Kp;
+ }
+ else
+ {
+ Kp= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_I:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-I: ");
+ lcd.setCursor(13,line);lcd.print(ftostr51(Ki/PID_dT));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(Ki*10/PID_dT);
+ }
+ else
+ {
+ Ki= encoderpos/10.*PID_dT;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(ftostr51(encoderpos/10.));
+ }
+
+ }break;
+ case ItemCT_PID_D:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-D: ");
+ lcd.setCursor(13,line);lcd.print(itostr4(Kd*PID_dT));
+ }
+
+ if((activeline!=line) )
+ break;
+
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(Kd/5./PID_dT);
+ }
+ else
+ {
+ Kd= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>9990) encoderpos=9990;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ case ItemCT_PID_C:
+ #ifdef PID_ADD_EXTRUSION_RATE
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" PID-C: ");
+ lcd.setCursor(13,line);lcd.print(itostr3(Kc));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)Kc;
+ }
+ else
+ {
+ Kc= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }
+ #endif
+ break;
+ default:
+ break;
+ }
+ line++;
+ }
+ #ifdef PID_ADD_EXTRUSION_RATE
+ updateActiveLines(ItemCT_PID_C,encoderpos);
+ #else
+ updateActiveLines(ItemCT_PID_D,encoderpos);
+ #endif
+}
+
+
+enum {
+ ItemCM_exit,
+ ItemCM_acc, ItemCM_xyjerk,
+ ItemCM_vmaxx, ItemCM_vmaxy, ItemCM_vmaxz, ItemCM_vmaxe,
+ ItemCM_vtravmin,ItemCM_vmin,
+ ItemCM_amaxx, ItemCM_amaxy, ItemCM_amaxz, ItemCM_amaxe,
+ ItemCM_aret,ItemCM_esteps
+};
+
+
+
+void MainMenu::showControlMotion()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemCM_exit:
+ MENUITEM( lcdprintPGM(" Control \003") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ case ItemCM_acc:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Acc:");
+ lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)acceleration/100;
+ }
+ else
+ {
+ acceleration= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_xyjerk: //max_xy_jerk
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vxy-jerk: ");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_xy_jerk;
+ }
+ else
+ {
+ max_xy_jerk= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_vmaxx:
+ case ItemCM_vmaxy:
+ case ItemCM_vmaxz:
+ case ItemCM_vmaxe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vmax ");
+ if(i==ItemCM_vmaxx)lcdprintPGM("x:");
+ if(i==ItemCM_vmaxy)lcdprintPGM("y:");
+ if(i==ItemCM_vmaxz)lcdprintPGM("z:");
+ if(i==ItemCM_vmaxe)lcdprintPGM("e:");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemCM_vmaxx]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_feedrate[i-ItemCM_vmaxx];
+ }
+ else
+ {
+ max_feedrate[i-ItemCM_vmaxx]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_vmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Vmin:");
+ lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)(minimumfeedrate);
+ }
+ else
+ {
+ minimumfeedrate= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+ case ItemCM_vtravmin:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" VTrav min:");
+ lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)mintravelfeedrate;
+ }
+ else
+ {
+ mintravelfeedrate= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<0) encoderpos=0;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
+ }
+
+ }break;
+
+ case ItemCM_amaxx:
+ case ItemCM_amaxy:
+ case ItemCM_amaxz:
+ case ItemCM_amaxe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Amax ");
+ if(i==ItemCM_amaxx)lcdprintPGM("x:");
+ if(i==ItemCM_amaxy)lcdprintPGM("y:");
+ if(i==ItemCM_amaxz)lcdprintPGM("z:");
+ if(i==ItemCM_amaxe)lcdprintPGM("e:");
+ lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100;
+ }
+ else
+ {
+ max_acceleration_units_per_sq_second[i-ItemCM_amaxx]= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<1) encoderpos=1;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_aret://float retract_acceleration = 7000;
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" A-retract:");
+ lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)retract_acceleration/100;
+ }
+ else
+ {
+ retract_acceleration= encoderpos*100;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<10) encoderpos=10;
+ if(encoderpos>990) encoderpos=990;
+ lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
+ }
+
+ }break;
+ case ItemCM_esteps://axis_steps_per_unit[i] = code_value();
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Esteps/mm:");
+ lcd.setCursor(13,line);lcd.print(itostr4(axis_steps_per_unit[3]));
+ }
+
+ if((activeline!=line) )
+ break;
+
+ if(CLICKED)
+ {
+ linechanging=!linechanging;
+ if(linechanging)
+ {
+ encoderpos=(int)axis_steps_per_unit[3];
+ }
+ else
+ {
+ float factor=float(encoderpos)/float(axis_steps_per_unit[3]);
+ position[E_AXIS]=lround(position[E_AXIS]*factor);
+ //current_position[3]*=factor;
+ axis_steps_per_unit[E_AXIS]= encoderpos;
+ encoderpos=activeline*lcdslow;
+
+ }
+ BLOCK;
+ beepshort();
+ }
+ if(linechanging)
+ {
+ if(encoderpos<5) encoderpos=5;
+ if(encoderpos>9999) encoderpos=9999;
+ lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
+ }
+
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemCM_esteps,encoderpos);
+}
+
+
+enum {
+ ItemC_exit,ItemC_temp,ItemC_move,
+ ItemC_store, ItemC_load,ItemC_failsafe
+};
+
+void MainMenu::showControl()
+{
+ uint8_t line=0;
+ clearIfNecessary();
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case ItemC_exit:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+ case ItemC_temp:
+ MENUITEM( lcdprintPGM(" Temperature \x7E") , BLOCK;status=Sub_TempControl;beepshort(); ) ;
+ break;
+ case ItemC_move:
+ MENUITEM( lcdprintPGM(" Motion \x7E") , BLOCK;status=Sub_MotionControl;beepshort(); ) ;
+ break;
+ case ItemC_store:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Store EPROM");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_StoreSettings();
+ }
+ }break;
+ case ItemC_load:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Load EPROM");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_RetrieveSettings();
+ }
+ }break;
+ case ItemC_failsafe:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);lcdprintPGM(" Restore Failsafe");
+ }
+ if((activeline==line) && CLICKED)
+ {
+ //enquecommand("M84");
+ beepshort();
+ BLOCK;
+ EEPROM_RetrieveSettings(true);
+ }
+ }break;
+ default:
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(ItemC_failsafe,encoderpos);
+}
+
+
+
+
+
+void MainMenu::showSD()
+{
+#ifdef SDSUPPORT
+ uint8_t line=0;
+
+ clearIfNecessary();
+ static uint8_t nrfiles=0;
+ if(force_lcd_update)
+ {
+ if(card.cardOK)
+ {
+ nrfiles=card.getnrfilenames();
+ }
+ else
+ {
+ nrfiles=0;
+ lineoffset=0;
+ }
+ }
+ bool enforceupdate=false;
+ for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
+ {
+ switch(i)
+ {
+ case 0:
+ MENUITEM( lcdprintPGM(" Main \003") , BLOCK;status=Main_Menu;beepshort(); ) ;
+ break;
+// case 1:
+// {
+// if(force_lcd_update)
+// {
+// lcd.setCursor(0,line);
+// #ifdef CARDINSERTED
+// if(CARDINSERTED)
+// #else
+// if(true)
+// #endif
+// {
+// lcdprintPGM(" \004Refresh");
+// }
+// else
+// {
+// lcdprintPGM(" \004Insert Card");
+// }
+//
+// }
+// if((activeline==line) && CLICKED)
+// {
+// BLOCK;
+// beepshort();
+// card.initsd();
+// force_lcd_update=true;
+// nrfiles=card.getnrfilenames();
+// }
+// }break;
+ case 1:
+ MENUITEM( lcd.print(" ");card.getWorkDirName();if(card.filename[0]=='/') lcdprintPGM("\004Refresh");else {lcd.print("\005");lcd.print(card.filename);lcd.print("/..");} , BLOCK;card.updir();enforceupdate=true;lineoffset=0;beepshort(); ) ;
+
+ break;
+ default:
+ {
+ #define FIRSTITEM 2
+ if(i-FIRSTITEM<nrfiles)
+ {
+ if(force_lcd_update)
+ {
+ card.getfilename(i-FIRSTITEM);
+ //Serial.print("Filenr:");Serial.println(i-2);
+ lcd.setCursor(0,line);lcdprintPGM(" ");
+ if(card.filenameIsDir) lcd.print("\005");
+ lcd.print(card.filename);
+ }
+ if((activeline==line) && CLICKED)
+ {
+ BLOCK
+ card.getfilename(i-FIRSTITEM);
+ if(card.filenameIsDir)
+ {
+ for(int8_t i=0;i<strlen(card.filename);i++)
+ card.filename[i]=tolower(card.filename[i]);
+ card.chdir(card.filename);
+ lineoffset=0;
+ enforceupdate=true;
+ }
+ else
+ {
+ char cmd[30];
+ for(int8_t i=0;i<strlen(card.filename);i++)
+ card.filename[i]=tolower(card.filename[i]);
+ sprintf(cmd,"M23 %s",card.filename);
+ //sprintf(cmd,"M115");
+ enquecommand(cmd);
+ enquecommand("M24");
+ beep();
+ status=Main_Status;
+ lcd_status(card.filename);
+ }
+ }
+ }
+
+ }
+ break;
+ }
+ line++;
+ }
+ updateActiveLines(FIRSTITEM+nrfiles-1,encoderpos);
+ if(enforceupdate)
+ {
+ force_lcd_update=true;
+ enforceupdate=false;
+ }
+#endif
+}
+
+enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };
+void MainMenu::showMainMenu()
+{
+
+ #ifndef ULTIPANEL
+ force_lcd_update=false;
+ #endif
+ if(tune)
+ {
+ if(!(movesplanned() ||card.sdprinting))
+ {
+ force_lcd_update=true;
+ tune=false;
+ }
+ }
+ else
+ {
+ if(movesplanned() ||card.sdprinting)
+ {
+ force_lcd_update=true;
+ tune=true;
+ }
+ }
+ clearIfNecessary();
+ for(int8_t line=0;line<LCD_HEIGHT;line++)
+ {
+ switch(line)
+ {
+ case ItemM_watch:
+ MENUITEM( lcdprintPGM(" Watch \003") , BLOCK;status=Main_Status;beepshort(); ) ;
+ break;
+ case ItemM_prepare:
+ MENUITEM( if(!tune) lcdprintPGM(" Prepare \x7E");else lcdprintPGM(" Tune \x7E"); , BLOCK;status=Main_Prepare;beepshort(); ) ;
+ break;
+
+ case ItemM_control:
+ MENUITEM( lcdprintPGM(" Control \x7E") , BLOCK;status=Main_Control;beepshort(); ) ;
+ break;
+ #ifdef SDSUPPORT
+ case ItemM_file:
+ {
+ if(force_lcd_update)
+ {
+ lcd.setCursor(0,line);
+ #ifdef CARDINSERTED
+ if(CARDINSERTED)
+ #else
+ if(true)
+ #endif
+ {
+ if(card.sdprinting)
+ lcdprintPGM(" Stop Print \x7E");
+ else
+ lcdprintPGM(" Card Menu \x7E");
+ }
+ else
+ {
+ lcdprintPGM(" No Card");
+ }
+ }
+ #ifdef CARDINSERTED
+ if(CARDINSERTED)
+ #endif
+ if((activeline==line)&&CLICKED)
+ {
+ card.printingHasFinished();
+ BLOCK;
+ status=Main_SD;
+ beepshort();
+ }
+ }break;
+ #else
+ case ItemM_file:
+ break;
+ #endif
+ default:
+ SERIAL_ERROR_START;
+ SERIAL_ERRORLNPGM("Something is wrong in the MenuStructure.");
+ break;
+ }
+ }
+ updateActiveLines(3,encoderpos);
+}
+
+void MainMenu::update()
+{
+ static MainStatus oldstatus=Main_Menu; //init automatically causes foce_lcd_update=true
+ static long timeoutToStatus=0;
+ static bool oldcardstatus=false;
+ #ifdef CARDINSERTED
+ if((CARDINSERTED != oldcardstatus))
+ {
+ force_lcd_update=true;
+ oldcardstatus=CARDINSERTED;
+ //Serial.println("echo: SD CHANGE");
+ if(CARDINSERTED)
+ {
+ card.initsd();
+ LCD_MESSAGEPGM("Card inserted");
+ }
+ else
+ {
+ card.release();
+ LCD_MESSAGEPGM("Card removed");
+ }
+ }
+ #endif
+
+ if(status!=oldstatus)
+ {
+ force_lcd_update=true;
+ encoderpos=0;
+ lineoffset=0;
+
+ oldstatus=status;
+ }
+ if( (encoderpos!=lastencoderpos) || CLICKED)
+ timeoutToStatus=millis()+STATUSTIMEOUT;
+
+ switch(status)
+ {
+ case Main_Status:
+ {
+ showStatus();
+ if(CLICKED)
+ {
+ linechanging=false;
+ BLOCK
+ status=Main_Menu;
+ timeoutToStatus=millis()+STATUSTIMEOUT;
+ }
+ }break;
+ case Main_Menu:
+ {
+ showMainMenu();
+ linechanging=false;
+ }break;
+ case Main_Prepare:
+ {
+ if(tune)
+ {
+ showTune();
+ }
+ else
+ {
+ showPrepare();
+ }
+ }break;
+ case Main_Control:
+ {
+ showControl();
+ }break;
+ case Sub_MotionControl:
+ {
+ showControlMotion();
+ }break;
+ case Sub_TempControl:
+ {
+ showControlTemp();
+ }break;
+ case Main_SD:
+ {
+ showSD();
+ }break;
+ }
+
+ if(timeoutToStatus<millis())
+ status=Main_Status;
+ //force_lcd_update=false;
+ lastencoderpos=encoderpos;
+}
+
+
+
+
+
+
+// convert float to string with +123.4 format
+char *ftostr3(const float &x)
+{
+ //sprintf(conv,"%5.1f",x);
+ int xx=x;
+ conv[0]=(xx/100)%10+'0';
+ conv[1]=(xx/10)%10+'0';
+ conv[2]=(xx)%10+'0';
+ conv[3]=0;
+ return conv;
+}
+
+char *itostr2(const uint8_t &x)
+{
+ //sprintf(conv,"%5.1f",x);
+ int xx=x;
+ conv[0]=(xx/10)%10+'0';
+ conv[1]=(xx)%10+'0';
+ conv[2]=0;
+ return conv;
+}
+
+// convert float to string with +123.4 format
+char *ftostr31(const float &x)
+{
+ int xx=x*10;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/1000)%10+'0';
+ conv[2]=(xx/100)%10+'0';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]='.';
+ conv[5]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *ftostr32(const float &x)
+{
+ int xx=x*100;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/100)%10+'0';
+ conv[2]='.';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *itostr31(const int &xx)
+{
+ conv[0]=(xx>=0)?'+':'-';
+ conv[1]=(xx/1000)%10+'0';
+ conv[2]=(xx/100)%10+'0';
+ conv[3]=(xx/10)%10+'0';
+ conv[4]='.';
+ conv[5]=(xx)%10+'0';
+ conv[6]=0;
+ return conv;
+}
+
+char *itostr3(const int &xx)
+{
+ conv[0]=(xx/100)%10+'0';
+ conv[1]=(xx/10)%10+'0';
+ conv[2]=(xx)%10+'0';
+ conv[3]=0;
+ return conv;
+}
+
+char *itostr4(const int &xx)
+{
+ conv[0]=(xx/1000)%10+'0';
+ conv[1]=(xx/100)%10+'0';
+ conv[2]=(xx/10)%10+'0';
+ conv[3]=(xx)%10+'0';
+ conv[4]=0;
+ return conv;
+}
+
+// convert float to string with +1234.5 format
+char *ftostr51(const float &x)
+{
+ int xx=x*10;
+ conv[0]=(xx>=0)?'+':'-';
+ xx=abs(xx);
+ conv[1]=(xx/10000)%10+'0';
+ conv[2]=(xx/1000)%10+'0';
+ conv[3]=(xx/100)%10+'0';
+ conv[4]=(xx/10)%10+'0';
+ conv[5]='.';
+ conv[6]=(xx)%10+'0';
+ conv[7]=0;
+ return conv;
+}
+
+
+#endif //ULTRA_LCD
+
- \r
++