void showStatus();
void showMainMenu();
void showPrepare();
+ void showTune();
void showControl();
void showControlMotion();
void showControlTemp();
bool linechanging;
+ bool tune;
+
private:
inline void updateActiveLines(const uint8_t &maxlines,volatile int &encoderpos)
{
{
lineoffset--;
if(lineoffset<0) lineoffset=0;
- curencoderpos=lcdslow-1;
- force_lcd_update=true;
+ curencoderpos=lcdslow-1;
}
if(curencoderpos>(LCD_HEIGHT-1+1)*lcdslow)
{
lineoffset=maxlines+1-LCD_HEIGHT;
if(curencoderpos>maxlines*lcdslow)
curencoderpos=maxlines*lcdslow;
- force_lcd_update=true;
}
- lastencoderpos=encoderpos=curencoderpos;
+ lastencoderpos=encoderpos=curencoderpos;
+ int lastactiveline=activeline;
activeline=curencoderpos/lcdslow;
if(activeline<0) activeline=0;
if(activeline>LCD_HEIGHT-1) activeline=LCD_HEIGHT-1;
activeline=maxlines;
curencoderpos=maxlines*lcdslow;
}
+ if(lastactiveline!=activeline ||lastlineoffset!=lineoffset)
+ force_lcd_update=true;
lcd.setCursor(0,activeline);lcd.print((activeline+lineoffset)?'>':'\003');
}
}
};
//conversion routines, could need some overworking
- char *fillto(int8_t n,char *c);
char *ftostr51(const float &x);
char *ftostr31(const float &x);
char *ftostr3(const float &x);
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
cnt++;\r
ch=pgm_read_byte(++message);\r
}\r
+ *target=0;\r
}\r
\r
inline void clear()\r
#endif\r
lcd_init();\r
linechanging=false;\r
+ tune=false;\r
}\r
\r
void MainMenu::showStatus()\r
if(messagetext[0]!='\0')\r
{\r
lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(fillto(LCD_WIDTH,messagetext));\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
if(messagetext[0]!='\0')\r
{\r
lcd.setCursor(0,LCD_HEIGHT-1);\r
- lcd.print(fillto(LCD_WIDTH,messagetext));\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
updateActiveLines(ItemP_disstep,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(" Tune") , 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
+ {\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
+ {\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
+ \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
+ {\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
+ {\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
if(force_lcd_update)\r
{\r
lcd.setCursor(0,line);lcdprintPGM(" \002Nozzle:");\r
- lcd.setCursor(13,line);lcd.print(ftostr3(intround(degHotend0())));\r
+ lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));\r
}\r
\r
if((activeline==line) )\r
linechanging=!linechanging;\r
if(linechanging)\r
{\r
- encoderpos=intround(degHotend0());\r
+ encoderpos=intround(degTargetHotend0());\r
}\r
else\r
{\r
}\r
else\r
{\r
- fanpwm = constrain(encoderpos,0,255);\r
- encoderpos=fanpwm;\r
- analogWrite(FAN_PIN, fanpwm);\r
-\r
+ encoderpos=activeline*lcdslow;\r
beepshort();\r
}\r
BLOCK;\r
#ifndef ULTIPANEL\r
force_lcd_update=false;\r
#endif\r
- \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
MENUITEM( lcdprintPGM(" Watch") , BLOCK;status=Main_Status;beepshort(); ) ;\r
break;\r
case ItemM_prepare:\r
- MENUITEM( lcdprintPGM(" Prepare \x7E") , BLOCK;status=Main_Prepare;beepshort(); ) ;\r
+ MENUITEM( if(!tune) lcdprintPGM(" Prepare \x7E");else lcdprintPGM(" Tune \x7E"); , BLOCK;status=Main_Prepare;beepshort(); ) ;\r
break;\r
\r
case ItemM_control:\r
}break;\r
case Main_Prepare: \r
{\r
- showPrepare(); \r
+ if(tune)\r
+ {\r
+ showTune();\r
+ }\r
+ else\r
+ {\r
+ showPrepare(); \r
+ }\r
}break;\r
case Main_Control:\r
{\r
return conv;\r
}\r
\r
-char *fillto(int8_t n,char *c)\r
-{\r
- static char ret[25];\r
- bool endfound=false;\r
- for(int8_t i=0;i<n;i++)\r
- {\r
- ret[i]=c[i];\r
- if(c[i]==0)\r
- {\r
- endfound=true;\r
- }\r
- if(endfound)\r
- {\r
- ret[i]=' ';\r
- }\r
- }\r
- ret[n]=0;\r
- return ret;\r
-}\r
-\r
\r
#endif //ULTRA_LCD\r
\r