2 #include "temperature.h"
7 #include "temperature.h"
8 #include "EEPROMwrite.h"
9 #include <LiquidCrystal.h>
10 //===========================================================================
11 //=============================imported variables============================
12 //===========================================================================
14 extern volatile int feedmultiply;
15 extern volatile bool feedmultiplychanged;
17 extern volatile int extrudemultiply;
19 extern long position[4];
21 #include "cardreader.h"
22 extern CardReader card;
25 //===========================================================================
26 //=============================public variables============================
27 //===========================================================================
28 volatile char buttons=0; //the last checked buttons in a bit array.
33 //===========================================================================
34 //=============================private variables============================
35 //===========================================================================
36 static char messagetext[LCD_WIDTH]="";
38 //return for string conversion routines
41 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
43 static unsigned long previous_millis_lcd=0;
44 //static long previous_millis_buttons=0;
48 static long blocking=0;
50 static long blocking[8]={0,0,0,0,0,0,0,0};
56 void lcdProgMemprint(const char *str)
58 char ch=pgm_read_byte(str);
62 ch=pgm_read_byte(++str);
65 #define lcdprintPGM(x) lcdProgMemprint(MYPGM(x))
68 //===========================================================================
69 //=============================functions ============================
70 //===========================================================================
72 int intround(const float &x){return int(0.5+x);}
74 void lcd_status(const char* message)
76 strncpy(messagetext,message,LCD_WIDTH);
77 messagetext[strlen(message)]=0;
80 void lcd_statuspgm(const char* message)
82 char ch=pgm_read_byte(message);
83 char *target=messagetext;
85 while(ch &&cnt<LCD_WIDTH)
90 ch=pgm_read_byte(++message);
95 FORCE_INLINE void clear()
119 byte Thermometer[8] =
130 byte uplevel[8]={0x04, 0x0e, 0x1f, 0x04, 0x1c, 0x00, 0x00, 0x00};//thanks joris
131 byte refresh[8]={0x00, 0x06, 0x19, 0x18, 0x03, 0x13, 0x0c, 0x00}; //thanks joris
132 byte folder [8]={0x00, 0x1c, 0x1f, 0x11, 0x11, 0x1f, 0x00, 0x00}; //thanks joris
133 lcd.begin(LCD_WIDTH, LCD_HEIGHT);
134 lcd.createChar(1,Degree);
135 lcd.createChar(2,Thermometer);
136 lcd.createChar(3,uplevel);
137 lcd.createChar(4,refresh);
138 lcd.createChar(5,folder);
139 LCD_MESSAGEPGM(WELCOME_MSG);
149 pinMode(BEEPER,OUTPUT);
150 for(int8_t i=0;i<20;i++){
167 pinMode(BEEPER,OUTPUT);
168 for(int8_t i=0;i<10;i++){
182 static uint8_t oldbuttons=0;
183 //static long previous_millis_buttons=0;
184 //static long previous_lcdinit=0;
185 // buttons_check(); // Done in temperature interrupt
186 //previous_millis_buttons=millis();
188 for(int8_t i=0; i<8; i++) {
197 if((buttons==oldbuttons) && ((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
202 if(((millis() - previous_millis_lcd) < LCD_UPDATE_INTERVAL) )
206 previous_millis_lcd=millis();
215 pinMode(BTN_EN1,INPUT);
216 pinMode(BTN_EN2,INPUT);
217 pinMode(BTN_ENC,INPUT);
218 pinMode(SDCARDDETECT,INPUT);
222 #if (SDCARDDETECT > -1)
224 WRITE(SDCARDDETECT,HIGH);
228 pinMode(SHIFT_CLK,OUTPUT);
229 pinMode(SHIFT_LD,OUTPUT);
230 pinMode(SHIFT_EN,OUTPUT);
231 pinMode(SHIFT_OUT,INPUT);
232 WRITE(SHIFT_OUT,HIGH);
233 WRITE(SHIFT_LD,HIGH);
244 if(READ(BTN_EN1)==0) newbutton|=EN_A;
245 if(READ(BTN_EN2)==0) newbutton|=EN_B;
246 if((blocking<millis()) &&(READ(BTN_ENC)==0))
249 #else //read it from the shift register
252 WRITE(SHIFT_LD,HIGH);
253 unsigned char tmp_buttons=0;
254 for(int8_t i=0;i<8;i++)
256 newbutton = newbutton>>1;
259 WRITE(SHIFT_CLK,HIGH);
260 WRITE(SHIFT_CLK,LOW);
262 buttons=~newbutton; //invert it, because a pressed switch produces a logical 0
265 //manage encoder rotation
278 else if(lastenc==encrot1)
284 else if(lastenc==encrot2)
290 else if(lastenc==encrot3)
296 else if(lastenc==encrot0)
311 displayStartingRow=0;
313 force_lcd_update=true;
318 void MainMenu::showStatus()
321 static int olddegHotEnd0=-1;
322 static int oldtargetHotEnd0=-1;
323 //force_lcd_update=true;
324 if(force_lcd_update) //initial display of content
326 encoderpos=feedmultiply;
328 lcd.setCursor(0,0);lcdprintPGM("\002---/---\001 ");
329 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
330 lcd.setCursor(10,0);lcdprintPGM("B---/---\001 ");
332 lcd.setCursor(10,0);lcdprintPGM("\002---/---\001 ");
336 int tHotEnd0=intround(degHotend0());
337 if((tHotEnd0!=olddegHotEnd0)||force_lcd_update)
340 lcd.print(ftostr3(tHotEnd0));
341 olddegHotEnd0=tHotEnd0;
343 int ttHotEnd0=intround(degTargetHotend0());
344 if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
347 lcd.print(ftostr3(ttHotEnd0));
348 oldtargetHotEnd0=ttHotEnd0;
350 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
351 static int oldtBed=-1;
352 static int oldtargetBed=-1;
353 int tBed=intround(degBed());
354 if((tBed!=oldtBed)||force_lcd_update)
357 lcd.print(ftostr3(tBed));
360 int targetBed=intround(degTargetBed());
361 if((targetBed!=oldtargetBed)||force_lcd_update)
364 lcd.print(ftostr3(targetBed));
365 oldtargetBed=targetBed;
368 static int olddegHotEnd1=-1;
369 static int oldtargetHotEnd1=-1;
370 int tHotEnd1=intround(degHotend1());
371 if((tHotEnd1!=olddegHotEnd1)||force_lcd_update)
374 lcd.print(ftostr3(tHotEnd1));
375 olddegHotEnd1=tHotEnd1;
377 int ttHotEnd1=intround(degTargetHotend1());
378 if((ttHotEnd1!=oldtargetHotEnd1)||force_lcd_update)
381 lcd.print(ftostr3(ttHotEnd1));
382 oldtargetHotEnd1=ttHotEnd1;
386 static uint16_t oldtime=0;
390 uint16_t time=millis()/60000-starttime/60000;
392 if(starttime!=oldtime)
394 lcd.print(itostr2(time/60));lcdprintPGM("h ");lcd.print(itostr2(time%60));lcdprintPGM("m");
398 static int oldzpos=0;
399 int currentz=current_position[2]*100;
400 if((currentz!=oldzpos)||force_lcd_update)
403 lcdprintPGM("Z:");lcd.print(ftostr52(current_position[2]));
407 static int oldfeedmultiply=0;
408 int curfeedmultiply=feedmultiply;
410 if(feedmultiplychanged == true) {
411 feedmultiplychanged = false;
412 encoderpos = curfeedmultiply;
415 if(encoderpos!=curfeedmultiply||force_lcd_update)
417 curfeedmultiply=encoderpos;
418 if(curfeedmultiply<10)
420 if(curfeedmultiply>999)
422 feedmultiply=curfeedmultiply;
423 encoderpos=curfeedmultiply;
426 if((curfeedmultiply!=oldfeedmultiply)||force_lcd_update)
428 oldfeedmultiply=curfeedmultiply;
430 lcd.print(itostr3(curfeedmultiply));lcdprintPGM("% ");
433 if(messagetext[0]!='\0')
435 lcd.setCursor(0,LCD_HEIGHT-1);
436 lcd.print(messagetext);
437 uint8_t n=strlen(messagetext);
438 for(int8_t i=0;i<LCD_WIDTH-n;i++)
443 static uint8_t oldpercent=101;
444 uint8_t percent=card.percentDone();
445 if(oldpercent!=percent ||force_lcd_update)
448 lcd.print(itostr3((int)percent));
452 #else //smaller LCDS----------------------------------
453 static int olddegHotEnd0=-1;
454 static int oldtargetHotEnd0=-1;
455 if(force_lcd_update) //initial display of content
457 encoderpos=feedmultiply;
458 lcd.setCursor(0,0);lcdprintPGM("\002---/---\001 ");
461 int tHotEnd0=intround(degHotend0());
462 int ttHotEnd0=intround(degTargetHotend0());
465 if((abs(tHotEnd0-olddegHotEnd0)>1)||force_lcd_update)
468 lcd.print(ftostr3(tHotEnd0));
469 olddegHotEnd0=tHotEnd0;
471 if((ttHotEnd0!=oldtargetHotEnd0)||force_lcd_update)
474 lcd.print(ftostr3(ttHotEnd0));
475 oldtargetHotEnd0=ttHotEnd0;
478 if(messagetext[0]!='\0')
480 lcd.setCursor(0,LCD_HEIGHT-1);
481 lcd.print(messagetext);
482 uint8_t n=strlen(messagetext);
483 for(int8_t i=0;i<LCD_WIDTH-n;i++)
489 force_lcd_update=false;
492 enum {ItemP_exit, ItemP_autostart,ItemP_disstep,ItemP_home, ItemP_origin, ItemP_preheat_pla, ItemP_preheat_abs, ItemP_cooldown,/*ItemP_extrude,*/ItemP_move};
494 //any action must not contain a ',' character anywhere, or this breaks:
495 #define MENUITEM(repaint_action, click_action) \
497 if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
498 if((activeline==line) && CLICKED) {click_action} \
501 void MainMenu::showPrepare()
506 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
508 //Serial.println((int)(line-lineoffset));
512 MENUITEM( lcdprintPGM(MSG_MAIN) , BLOCK;status=Main_Menu;beepshort(); ) ;
514 case ItemP_autostart:
515 MENUITEM( lcdprintPGM(MSG_AUTOSTART) , BLOCK;
517 card.lastnr=0;card.setroot();card.checkautostart(true);
522 MENUITEM( lcdprintPGM(MSG_DISABLE_STEPPERS) , BLOCK;enquecommand("M84");beepshort(); ) ;
525 MENUITEM( lcdprintPGM(MSG_AUTO_HOME) , BLOCK;enquecommand("G28");beepshort(); ) ;
528 MENUITEM( lcdprintPGM(MSG_SET_ORIGIN) , BLOCK;enquecommand("G92 X0 Y0 Z0");beepshort(); ) ;
530 case ItemP_preheat_pla:
531 MENUITEM( lcdprintPGM(MSG_PREHEAT_PLA) , BLOCK;setTargetHotend0(PLA_PREHEAT_HOTEND_TEMP);setTargetBed(PLA_PREHEAT_HPB_TEMP);
533 analogWrite(FAN_PIN, PLA_PREHEAT_FAN_SPEED);
537 case ItemP_preheat_abs:
538 MENUITEM( lcdprintPGM(MSG_PREHEAT_ABS) , BLOCK;setTargetHotend0(ABS_PREHEAT_HOTEND_TEMP);setTargetBed(ABS_PREHEAT_HPB_TEMP);
540 analogWrite(FAN_PIN, ABS_PREHEAT_FAN_SPEED);
545 MENUITEM( lcdprintPGM(MSG_COOLDOWN) , BLOCK;setTargetHotend0(0);setTargetHotend1(0);setTargetHotend2(0);setTargetBed(0);beepshort(); ) ;
547 // case ItemP_extrude:
548 // MENUITEM( lcdprintPGM(" Extrude") , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E50");beepshort(); ) ;
551 MENUITEM( lcdprintPGM(MSG_MOVE_AXIS) , BLOCK;status=Sub_PrepareMove;beepshort(); );
558 updateActiveLines(ItemP_move,encoderpos);
564 ItemAM_X, ItemAM_Y, ItemAM_Z, ItemAM_E
567 void MainMenu::showAxisMove()
572 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
577 MENUITEM( lcdprintPGM(MSG_PREPARE_ALT) , BLOCK;status=Main_Menu;beepshort(); ) ;
584 lcd.setCursor(0,line);lcdprintPGM(" X:");
585 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[X_AXIS]));
588 if((activeline!=line) )
593 linechanging=!linechanging;
601 encoderpos=activeline*lcdslow;
610 enquecommand("G1 F700 X0.1");
611 oldencoderpos=encoderpos;
615 else if (encoderpos < 0)
617 enquecommand("G1 F700 X-0.1");
618 oldencoderpos=encoderpos;
621 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[X_AXIS]));
629 lcd.setCursor(0,line);lcdprintPGM(" Y:");
630 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[Y_AXIS]));
633 if((activeline!=line) )
638 linechanging=!linechanging;
646 encoderpos=activeline*lcdslow;
655 enquecommand("G1 F700 Y0.1");
656 oldencoderpos=encoderpos;
660 else if (encoderpos < 0)
662 enquecommand("G1 F700 Y-0.1");
663 oldencoderpos=encoderpos;
666 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[Y_AXIS]));
674 lcd.setCursor(0,line);lcdprintPGM(" Z:");
675 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[Z_AXIS]));
678 if((activeline!=line) )
683 linechanging=!linechanging;
691 encoderpos=activeline*lcdslow;
700 enquecommand("G1 F70 Z0.1");
701 oldencoderpos=encoderpos;
705 else if (encoderpos < 0)
707 enquecommand("G1 F70 Z-0.1");
708 oldencoderpos=encoderpos;
711 lcd.setCursor(11,line);lcd.print(ftostr52(current_position[Z_AXIS]));
716 // ErikDB: TODO: this length should be changed for volumetric.
717 MENUITEM( lcdprintPGM(MSG_EXTRUDE) , BLOCK;enquecommand("G92 E0");enquecommand("G1 F700 E5");beepshort(); ) ;
724 updateActiveLines(ItemAM_E,encoderpos);
727 enum {ItemT_exit,ItemT_speed,ItemT_flow,ItemT_nozzle,
728 #if (HEATER_BED_PIN > -1)
733 void MainMenu::showTune()
737 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
739 //Serial.println((int)(line-lineoffset));
743 MENUITEM( lcdprintPGM(MSG_MAIN) , BLOCK;status=Main_Menu;beepshort(); ) ;
749 lcd.setCursor(0,line);lcdprintPGM(MSG_SPEED);
750 lcd.setCursor(13,line);lcd.print(ftostr3(feedmultiply));
753 if((activeline!=line) )
756 if(CLICKED) //AnalogWrite(FAN_PIN, fanpwm);
758 linechanging=!linechanging;
761 encoderpos=feedmultiply;
765 encoderpos=activeline*lcdslow;
772 if(encoderpos<1) encoderpos=1;
773 if(encoderpos>400) encoderpos=400;
774 feedmultiply = encoderpos;
775 feedmultiplychanged=true;
776 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
784 lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE);
785 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
788 if((activeline!=line) )
793 linechanging=!linechanging;
796 encoderpos=intround(degTargetHotend0());
800 setTargetHotend0(encoderpos);
801 encoderpos=activeline*lcdslow;
808 if(encoderpos<0) encoderpos=0;
809 if(encoderpos>260) encoderpos=260;
810 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
813 #if (HEATER_BED_PIN > -1)
818 lcd.setCursor(0,line);lcdprintPGM(MSG_BED);
819 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetBed())));
822 if((activeline!=line) )
827 linechanging=!linechanging;
830 encoderpos=intround(degTargetBed());
834 setTargetBed(encoderpos);
835 encoderpos=activeline*lcdslow;
842 if(encoderpos<0) encoderpos=0;
843 if(encoderpos>260) encoderpos=260;
844 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
854 lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED);
855 lcd.setCursor(13,line);lcd.print(ftostr3(FanSpeed));
858 if((activeline!=line) )
861 if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
863 linechanging=!linechanging;
870 encoderpos=activeline*lcdslow;
877 if(encoderpos<0) encoderpos=0;
878 if(encoderpos>255) encoderpos=255;
880 analogWrite(FAN_PIN, FanSpeed);
881 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
885 case ItemT_flow://axis_steps_per_unit[i] = code_value();
889 lcd.setCursor(0,line);lcdprintPGM(MSG_FLOW);
890 lcd.setCursor(13,line);lcd.print(ftostr52(axis_steps_per_unit[E_AXIS]));
893 if((activeline!=line) )
898 linechanging=!linechanging;
901 encoderpos=(long)(axis_steps_per_unit[E_AXIS]*100.0);
905 float factor=float(encoderpos)/100.0/float(axis_steps_per_unit[E_AXIS]);
906 position[E_AXIS]=lround(position[E_AXIS]*factor);
907 //current_position[E_AXIS]*=factor;
908 axis_steps_per_unit[E_AXIS]= encoderpos/100.0;
909 encoderpos=activeline*lcdslow;
917 if(encoderpos<5) encoderpos=5;
918 if(encoderpos>999999) encoderpos=999999;
919 lcd.setCursor(13,line);lcd.print(ftostr52(encoderpos/100.0));
928 updateActiveLines(ItemT_fan,encoderpos);
932 // #define MENUCHANGEITEM(repaint_action, enter_action, accept_action, change_action) \
934 // if(force_lcd_update) { lcd.setCursor(0,line); repaint_action; } \
935 // if(activeline==line) \
939 // linechanging=!linechanging; \
940 // if(linechanging) {enter_action;} \
941 // else {accept_action;} \
944 // if(linechanging) {change_action};}\
949 ItemCT_exit,ItemCT_nozzle0,
951 ItemCT_autotempactive,
952 ItemCT_autotempmin,ItemCT_autotempmax,ItemCT_autotempfact,
960 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
964 ItemCT_PID_P,ItemCT_PID_I,ItemCT_PID_D,ItemCT_PID_C
967 void MainMenu::showControlTemp()
971 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
976 MENUITEM( lcdprintPGM(MSG_CONTROL) , BLOCK;status=Main_Control;beepshort(); ) ;
982 lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE);
983 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend0())));
986 if((activeline!=line) )
991 linechanging=!linechanging;
994 encoderpos=intround(degTargetHotend0());
998 setTargetHotend0(encoderpos);
999 encoderpos=activeline*lcdslow;
1006 if(encoderpos<0) encoderpos=0;
1007 if(encoderpos>260) encoderpos=260;
1008 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1013 case ItemCT_nozzle1:
1015 if(force_lcd_update)
1017 lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE1);
1018 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend1())));
1021 if((activeline!=line) )
1026 linechanging=!linechanging;
1029 encoderpos=intround(degTargetHotend1());
1033 setTargetHotend1(encoderpos);
1034 encoderpos=activeline*lcdslow;
1041 if(encoderpos<0) encoderpos=0;
1042 if(encoderpos>260) encoderpos=260;
1043 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1049 case ItemCT_nozzle2:
1051 if(force_lcd_update)
1053 lcd.setCursor(0,line);lcdprintPGM(MSG_NOZZLE2);
1054 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetHotend2())));
1057 if((activeline!=line) )
1062 linechanging=!linechanging;
1065 encoderpos=intround(degTargetHotend2());
1069 setTargetHotend1(encoderpos);
1070 encoderpos=activeline*lcdslow;
1077 if(encoderpos<0) encoderpos=0;
1078 if(encoderpos>260) encoderpos=260;
1079 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1085 case ItemCT_autotempmin:
1087 if(force_lcd_update)
1089 lcd.setCursor(0,line);lcdprintPGM(MSG_MIN);
1090 lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_min));
1093 if((activeline!=line) )
1098 linechanging=!linechanging;
1101 encoderpos=intround(autotemp_min);
1105 autotemp_min=encoderpos;
1106 encoderpos=activeline*lcdslow;
1113 if(encoderpos<0) encoderpos=0;
1114 if(encoderpos>260) encoderpos=260;
1115 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1119 case ItemCT_autotempmax:
1121 if(force_lcd_update)
1123 lcd.setCursor(0,line);lcdprintPGM(MSG_MAX);
1124 lcd.setCursor(13,line);lcd.print(ftostr3(autotemp_max));
1127 if((activeline!=line) )
1132 linechanging=!linechanging;
1135 encoderpos=intround(autotemp_max);
1139 autotemp_max=encoderpos;
1140 encoderpos=activeline*lcdslow;
1147 if(encoderpos<0) encoderpos=0;
1148 if(encoderpos>260) encoderpos=260;
1149 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1153 case ItemCT_autotempfact:
1155 if(force_lcd_update)
1157 lcd.setCursor(0,line);lcdprintPGM(MSG_FACTOR);
1158 lcd.setCursor(13,line);lcd.print(ftostr32(autotemp_factor));
1161 if((activeline!=line) )
1166 linechanging=!linechanging;
1169 encoderpos=intround(autotemp_factor*100);
1173 autotemp_max=encoderpos;
1174 encoderpos=activeline*lcdslow;
1181 if(encoderpos<0) encoderpos=0;
1182 if(encoderpos>99) encoderpos=99;
1183 lcd.setCursor(13,line);lcd.print(ftostr32(encoderpos/100.));
1187 case ItemCT_autotempactive:
1189 if(force_lcd_update)
1191 lcd.setCursor(0,line);lcdprintPGM(MSG_AUTOTEMP);
1192 lcd.setCursor(13,line);
1193 if(autotemp_enabled)
1194 lcdprintPGM(MSG_ON);
1196 lcdprintPGM(MSG_OFF);
1199 if((activeline!=line) )
1204 autotemp_enabled=!autotemp_enabled;
1205 lcd.setCursor(13,line);
1206 if(autotemp_enabled)
1207 lcdprintPGM(MSG_ON);
1209 lcdprintPGM(MSG_OFF);
1215 #if defined BED_USES_THERMISTOR || defined BED_USES_AD595
1218 if(force_lcd_update)
1220 lcd.setCursor(0,line);lcdprintPGM(MSG_BED);
1221 lcd.setCursor(13,line);lcd.print(ftostr3(intround(degTargetBed())));
1224 if((activeline!=line) )
1229 linechanging=!linechanging;
1232 encoderpos=intround(degTargetBed());
1236 setTargetBed(encoderpos);
1237 encoderpos=activeline*lcdslow;
1244 if(encoderpos<0) encoderpos=0;
1245 if(encoderpos>260) encoderpos=260;
1246 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1252 if(force_lcd_update)
1254 lcd.setCursor(0,line);lcdprintPGM(MSG_FAN_SPEED);
1255 lcd.setCursor(13,line);lcd.print(ftostr3(FanSpeed));
1258 if((activeline!=line) )
1261 if(CLICKED) //nalogWrite(FAN_PIN, fanpwm);
1263 linechanging=!linechanging;
1266 encoderpos=FanSpeed;
1270 encoderpos=activeline*lcdslow;
1277 if(encoderpos<0) encoderpos=0;
1278 if(encoderpos>255) encoderpos=255;
1279 FanSpeed=encoderpos;
1280 analogWrite(FAN_PIN, FanSpeed);
1281 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1288 if(force_lcd_update)
1290 lcd.setCursor(0,line);lcdprintPGM(" PID-P: ");
1291 lcd.setCursor(13,line);lcd.print(itostr4(Kp));
1294 if((activeline!=line) )
1299 linechanging=!linechanging;
1302 encoderpos=(long)Kp;
1307 encoderpos=activeline*lcdslow;
1315 if(encoderpos<1) encoderpos=1;
1316 if(encoderpos>9990) encoderpos=9990;
1317 lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
1323 if(force_lcd_update)
1325 lcd.setCursor(0,line);lcdprintPGM(MSG_PID_I);
1326 lcd.setCursor(13,line);lcd.print(ftostr51(Ki/PID_dT));
1329 if((activeline!=line) )
1334 linechanging=!linechanging;
1337 encoderpos=(long)(Ki*10/PID_dT);
1341 Ki= encoderpos/10.*PID_dT;
1342 encoderpos=activeline*lcdslow;
1350 if(encoderpos<0) encoderpos=0;
1351 if(encoderpos>9990) encoderpos=9990;
1352 lcd.setCursor(13,line);lcd.print(ftostr51(encoderpos/10.));
1358 if(force_lcd_update)
1360 lcd.setCursor(0,line);lcdprintPGM(MSG_PID_D);
1361 lcd.setCursor(13,line);lcd.print(itostr4(Kd*PID_dT));
1364 if((activeline!=line) )
1370 linechanging=!linechanging;
1373 encoderpos=(long)(Kd/5./PID_dT);
1378 encoderpos=activeline*lcdslow;
1386 if(encoderpos<0) encoderpos=0;
1387 if(encoderpos>9990) encoderpos=9990;
1388 lcd.setCursor(13,line);lcd.print(itostr4(encoderpos));
1393 #ifdef PID_ADD_EXTRUSION_RATE
1395 if(force_lcd_update)
1397 lcd.setCursor(0,line);lcdprintPGM(MSG_PID_C);
1398 lcd.setCursor(13,line);lcd.print(itostr3(Kc));
1401 if((activeline!=line) )
1406 linechanging=!linechanging;
1409 encoderpos=(long)Kc;
1414 encoderpos=activeline*lcdslow;
1422 if(encoderpos<0) encoderpos=0;
1423 if(encoderpos>990) encoderpos=990;
1424 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1436 #ifdef PID_ADD_EXTRUSION_RATE
1437 updateActiveLines(ItemCT_PID_C,encoderpos);
1439 updateActiveLines(ItemCT_PID_D,encoderpos);
1446 ItemCM_acc, ItemCM_xyjerk,
1447 ItemCM_vmaxx, ItemCM_vmaxy, ItemCM_vmaxz, ItemCM_vmaxe,
1448 ItemCM_vtravmin,ItemCM_vmin,
1449 ItemCM_amaxx, ItemCM_amaxy, ItemCM_amaxz, ItemCM_amaxe,
1450 ItemCM_aret, ItemCM_xsteps,ItemCM_ysteps, ItemCM_zsteps, ItemCM_esteps
1455 void MainMenu::showControlMotion()
1459 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
1464 MENUITEM( lcdprintPGM(MSG_CONTROL) , BLOCK;status=Main_Control;beepshort(); ) ;
1468 if(force_lcd_update)
1470 lcd.setCursor(0,line);lcdprintPGM(MSG_ACC);
1471 lcd.setCursor(13,line);lcd.print(itostr3(acceleration/100));lcdprintPGM("00");
1474 if((activeline!=line) )
1479 linechanging=!linechanging;
1482 encoderpos=(long)acceleration/100;
1486 acceleration= encoderpos*100;
1487 encoderpos=activeline*lcdslow;
1494 if(encoderpos<5) encoderpos=5;
1495 if(encoderpos>990) encoderpos=990;
1496 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
1500 case ItemCM_xyjerk: //max_xy_jerk
1502 if(force_lcd_update)
1504 lcd.setCursor(0,line);lcdprintPGM(MSG_VXY_JERK);
1505 lcd.setCursor(13,line);lcd.print(itostr3(max_xy_jerk));
1508 if((activeline!=line) )
1513 linechanging=!linechanging;
1516 encoderpos=(long)max_xy_jerk;
1520 max_xy_jerk= encoderpos;
1521 encoderpos=activeline*lcdslow;
1529 if(encoderpos<1) encoderpos=1;
1530 if(encoderpos>990) encoderpos=990;
1531 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1541 if(force_lcd_update)
1543 lcd.setCursor(0,line);lcdprintPGM(MSG_VMAX);
1544 if(i==ItemCM_vmaxx)lcdprintPGM(MSG_X);
1545 if(i==ItemCM_vmaxy)lcdprintPGM(MSG_Y);
1546 if(i==ItemCM_vmaxz)lcdprintPGM(MSG_Z);
1547 if(i==ItemCM_vmaxe)lcdprintPGM(MSG_E);
1548 lcd.setCursor(13,line);lcd.print(itostr3(max_feedrate[i-ItemCM_vmaxx]));
1551 if((activeline!=line) )
1556 linechanging=!linechanging;
1559 encoderpos=(long)max_feedrate[i-ItemCM_vmaxx];
1563 max_feedrate[i-ItemCM_vmaxx]= encoderpos;
1564 encoderpos=activeline*lcdslow;
1572 if(encoderpos<1) encoderpos=1;
1573 if(encoderpos>990) encoderpos=990;
1574 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1581 if(force_lcd_update)
1583 lcd.setCursor(0,line);lcdprintPGM(MSG_VMIN);
1584 lcd.setCursor(13,line);lcd.print(itostr3(minimumfeedrate));
1587 if((activeline!=line) )
1592 linechanging=!linechanging;
1595 encoderpos=(long)(minimumfeedrate);
1599 minimumfeedrate= encoderpos;
1600 encoderpos=activeline*lcdslow;
1608 if(encoderpos<0) encoderpos=0;
1609 if(encoderpos>990) encoderpos=990;
1610 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1614 case ItemCM_vtravmin:
1616 if(force_lcd_update)
1618 lcd.setCursor(0,line);lcdprintPGM(MSG_VTRAV_MIN);
1619 lcd.setCursor(13,line);lcd.print(itostr3(mintravelfeedrate));
1622 if((activeline!=line) )
1627 linechanging=!linechanging;
1630 encoderpos=(long)mintravelfeedrate;
1634 mintravelfeedrate= encoderpos;
1635 encoderpos=activeline*lcdslow;
1643 if(encoderpos<0) encoderpos=0;
1644 if(encoderpos>990) encoderpos=990;
1645 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));
1655 if(force_lcd_update)
1657 lcd.setCursor(0,line);lcdprintPGM(" Amax ");
1658 if(i==ItemCM_amaxx)lcdprintPGM(MSG_X);
1659 if(i==ItemCM_amaxy)lcdprintPGM(MSG_Y);
1660 if(i==ItemCM_amaxz)lcdprintPGM(MSG_Z);
1661 if(i==ItemCM_amaxe)lcdprintPGM(MSG_E);
1662 lcd.setCursor(13,line);lcd.print(itostr3(max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100));lcdprintPGM("00");
1665 if((activeline!=line) )
1670 linechanging=!linechanging;
1673 encoderpos=(long)max_acceleration_units_per_sq_second[i-ItemCM_amaxx]/100;
1677 max_acceleration_units_per_sq_second[i-ItemCM_amaxx]= encoderpos*100;
1678 encoderpos=activeline*lcdslow;
1685 if(encoderpos<1) encoderpos=1;
1686 if(encoderpos>990) encoderpos=990;
1687 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
1693 case ItemCM_aret://float retract_acceleration = 7000;
1695 if(force_lcd_update)
1697 lcd.setCursor(0,line);lcdprintPGM(MSG_A_RETRACT);
1698 lcd.setCursor(13,line);lcd.print(ftostr3(retract_acceleration/100));lcdprintPGM("00");
1701 if((activeline!=line) )
1706 linechanging=!linechanging;
1709 encoderpos=(long)retract_acceleration/100;
1713 retract_acceleration= encoderpos*100;
1714 encoderpos=activeline*lcdslow;
1722 if(encoderpos<10) encoderpos=10;
1723 if(encoderpos>990) encoderpos=990;
1724 lcd.setCursor(13,line);lcd.print(itostr3(encoderpos));lcdprintPGM("00");
1728 case ItemCM_xsteps://axis_steps_per_unit[i] = code_value();
1730 if(force_lcd_update)
1732 lcd.setCursor(0,line);lcdprintPGM(MSG_XSTEPS);
1733 lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[X_AXIS]));
1736 if((activeline!=line) )
1741 linechanging=!linechanging;
1744 encoderpos=(long)(axis_steps_per_unit[X_AXIS]*100.0);
1748 float factor=float(encoderpos)/100.0/float(axis_steps_per_unit[X_AXIS]);
1749 position[X_AXIS]=lround(position[X_AXIS]*factor);
1750 //current_position[X_AXIS]*=factor;
1751 axis_steps_per_unit[X_AXIS]= encoderpos/100.0;
1752 encoderpos=activeline*lcdslow;
1759 if(encoderpos<5) encoderpos=5;
1760 if(encoderpos>999999) encoderpos=999999;
1761 lcd.setCursor(11,line);lcd.print(ftostr52(encoderpos/100.0));
1765 case ItemCM_ysteps://axis_steps_per_unit[i] = code_value();
1767 if(force_lcd_update)
1769 lcd.setCursor(0,line);lcdprintPGM(MSG_YSTEPS);
1770 lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[Y_AXIS]));
1773 if((activeline!=line) )
1778 linechanging=!linechanging;
1781 encoderpos=(long)(axis_steps_per_unit[Y_AXIS]*100.0);
1785 float factor=float(encoderpos)/100.0/float(axis_steps_per_unit[Y_AXIS]);
1786 position[Y_AXIS]=lround(position[Y_AXIS]*factor);
1787 //current_position[Y_AXIS]*=factor;
1788 axis_steps_per_unit[Y_AXIS]= encoderpos/100.0;
1789 encoderpos=activeline*lcdslow;
1797 if(encoderpos<5) encoderpos=5;
1798 if(encoderpos>999999) encoderpos=999999;
1799 lcd.setCursor(11,line);lcd.print(ftostr52(encoderpos/100.0));
1803 case ItemCM_zsteps://axis_steps_per_unit[i] = code_value();
1805 if(force_lcd_update)
1807 lcd.setCursor(0,line);lcdprintPGM(MSG_ZSTEPS);
1808 lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[Z_AXIS]));
1811 if((activeline!=line) )
1816 linechanging=!linechanging;
1819 encoderpos=(long)(axis_steps_per_unit[Z_AXIS]*100.0);
1823 float factor=float(encoderpos)/100.0/float(axis_steps_per_unit[Z_AXIS]);
1824 position[Z_AXIS]=lround(position[Z_AXIS]*factor);
1825 //current_position[Z_AXIS]*=factor;
1826 axis_steps_per_unit[Z_AXIS]= encoderpos/100.0;
1827 encoderpos=activeline*lcdslow;
1835 if(encoderpos<5) encoderpos=5;
1836 if(encoderpos>999999) encoderpos=999999;
1837 lcd.setCursor(11,line);lcd.print(ftostr52(encoderpos/100.0));
1842 case ItemCM_esteps://axis_steps_per_unit[i] = code_value();
1844 if(force_lcd_update)
1846 lcd.setCursor(0,line);lcdprintPGM(MSG_ESTEPS);
1847 lcd.setCursor(11,line);lcd.print(ftostr52(axis_steps_per_unit[E_AXIS]));
1850 if((activeline!=line) )
1855 linechanging=!linechanging;
1858 encoderpos=(long)(axis_steps_per_unit[E_AXIS]*100.0);
1862 float factor=float(encoderpos)/100.0/float(axis_steps_per_unit[E_AXIS]);
1863 position[E_AXIS]=lround(position[E_AXIS]*factor);
1864 //current_position[E_AXIS]*=factor;
1865 axis_steps_per_unit[E_AXIS]= encoderpos/100.0;
1866 encoderpos=activeline*lcdslow;
1874 if(encoderpos<5) encoderpos=5;
1875 if(encoderpos>999999) encoderpos=999999;
1876 lcd.setCursor(11,line);lcd.print(ftostr52(encoderpos/100.0));
1885 updateActiveLines(ItemCM_esteps,encoderpos);
1892 ItemR_retract_length,ItemR_retract_feedrate,ItemR_retract_zlift,
1893 ItemR_unretract_length,ItemR_unretract_feedrate,
1899 void MainMenu::showControlRetract()
1904 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
1909 MENUITEM( lcdprintPGM(MSG_CONTROL) , BLOCK;status=Main_Control;beepshort(); ) ;
1912 //float retract_length=2, retract_feedrate=1200, retract_zlift=0.4;
1913 //float retract_recover_length=0, retract_recover_feedrate=500;
1914 case ItemR_autoretract:
1916 if(force_lcd_update)
1918 lcd.setCursor(0,line);lcdprintPGM(MSG_AUTORETRACT);
1919 lcd.setCursor(13,line);
1920 if(autoretract_enabled)
1921 lcdprintPGM(MSG_ON);
1923 lcdprintPGM(MSG_OFF);
1926 if((activeline!=line) )
1931 autoretract_enabled=!autoretract_enabled;
1932 lcd.setCursor(13,line);
1933 if(autoretract_enabled)
1934 lcdprintPGM(MSG_ON);
1936 lcdprintPGM(MSG_OFF);
1942 case ItemR_retract_length:
1944 if(force_lcd_update)
1946 lcd.setCursor(0,line);lcdprintPGM(MSG_CONTROL_RETRACT);
1947 lcd.setCursor(13,line);lcd.print(ftostr52(retract_length));
1950 if((activeline!=line) )
1955 linechanging=!linechanging;
1958 encoderpos=(long)(retract_length*100);
1962 retract_length= encoderpos/100.;
1963 encoderpos=activeline*lcdslow;
1971 if(encoderpos<1) encoderpos=1;
1972 if(encoderpos>990) encoderpos=990;
1973 lcd.setCursor(13,line);lcd.print(ftostr52(encoderpos/100.));
1977 case ItemR_retract_feedrate:
1979 if(force_lcd_update)
1981 lcd.setCursor(0,line);lcdprintPGM(MSG_CONTROL_RETRACTF);
1982 lcd.setCursor(13,line);lcd.print(itostr4(retract_feedrate));
1985 if((activeline!=line) )
1990 linechanging=!linechanging;
1993 encoderpos=(long)(retract_feedrate/5);
1997 retract_feedrate= encoderpos*5.;
1998 encoderpos=activeline*lcdslow;
2006 if(encoderpos<1) encoderpos=1;
2007 if(encoderpos>990) encoderpos=990;
2008 lcd.setCursor(13,line);lcd.print(itostr4(encoderpos*5));
2012 case ItemR_retract_zlift://float retract_acceleration = 7000;
2014 if(force_lcd_update)
2016 lcd.setCursor(0,line);lcdprintPGM(MSG_CONTROL_RETRACT_ZLIFT);
2017 lcd.setCursor(13,line);lcd.print(ftostr52(retract_zlift));;
2020 if((activeline!=line) )
2025 linechanging=!linechanging;
2028 encoderpos=(long)(retract_zlift*10);
2032 retract_zlift= encoderpos/10.;
2033 encoderpos=activeline*lcdslow;
2041 if(encoderpos<0) encoderpos=0;
2042 if(encoderpos>990) encoderpos=990;
2043 lcd.setCursor(13,line);lcd.print(ftostr52(encoderpos/10.));
2047 case ItemR_unretract_length:
2049 if(force_lcd_update)
2051 lcd.setCursor(0,line);lcdprintPGM(MSG_CONTROL_RETRACT_RECOVER);
2052 lcd.setCursor(13,line);lcd.print(ftostr52(retract_recover_length));;
2055 if((activeline!=line) )
2060 linechanging=!linechanging;
2063 encoderpos=(long)(retract_recover_length*100);
2067 retract_recover_length= encoderpos/100.;
2068 encoderpos=activeline*lcdslow;
2076 if(encoderpos<0) encoderpos=0;
2077 if(encoderpos>990) encoderpos=990;
2078 lcd.setCursor(13,line);lcd.print(ftostr52(encoderpos/100.));
2083 case ItemR_unretract_feedrate:
2085 if(force_lcd_update)
2087 lcd.setCursor(0,line);lcdprintPGM(MSG_CONTROL_RETRACT_RECOVERF);
2088 lcd.setCursor(13,line);lcd.print(itostr4(retract_recover_feedrate));
2091 if((activeline!=line) )
2096 linechanging=!linechanging;
2099 encoderpos=(long)retract_recover_feedrate/5;
2103 retract_recover_feedrate= encoderpos*5.;
2104 encoderpos=activeline*lcdslow;
2112 if(encoderpos<1) encoderpos=1;
2113 if(encoderpos>990) encoderpos=990;
2114 lcd.setCursor(13,line);lcd.print(itostr4(encoderpos*5));
2124 updateActiveLines(ItemR_unretract_feedrate,encoderpos);
2131 ItemC_exit,ItemC_temp,ItemC_move,
2135 ItemC_store, ItemC_load,ItemC_failsafe
2138 void MainMenu::showControl()
2142 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
2147 MENUITEM( lcdprintPGM(MSG_MAIN_WIDE) , BLOCK;status=Main_Menu;beepshort(); ) ;
2150 MENUITEM( lcdprintPGM(MSG_TEMPERATURE_WIDE) , BLOCK;status=Sub_TempControl;beepshort(); ) ;
2153 MENUITEM( lcdprintPGM(MSG_MOTION_WIDE) , BLOCK;status=Sub_MotionControl;beepshort(); ) ;
2156 case ItemC_rectract:
2157 MENUITEM( lcdprintPGM(MSG_RECTRACT_WIDE) , BLOCK;status=Sub_RetractControl;beepshort(); ) ;
2162 if(force_lcd_update)
2164 lcd.setCursor(0,line);lcdprintPGM(MSG_STORE_EPROM);
2166 if((activeline==line) && CLICKED)
2168 //enquecommand("M84");
2171 EEPROM_StoreSettings();
2176 if(force_lcd_update)
2178 lcd.setCursor(0,line);lcdprintPGM(MSG_LOAD_EPROM);
2180 if((activeline==line) && CLICKED)
2182 //enquecommand("M84");
2185 EEPROM_RetrieveSettings();
2188 case ItemC_failsafe:
2190 if(force_lcd_update)
2192 lcd.setCursor(0,line);lcdprintPGM(MSG_RESTORE_FAILSAFE);
2194 if((activeline==line) && CLICKED)
2196 //enquecommand("M84");
2199 EEPROM_RetrieveSettings(true);
2207 updateActiveLines(ItemC_failsafe,encoderpos);
2214 void MainMenu::showSD()
2220 static uint8_t nrfiles=0;
2221 if(force_lcd_update)
2225 nrfiles=card.getnrfilenames();
2233 bool enforceupdate=false;
2234 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
2239 MENUITEM( lcdprintPGM(MSG_MAIN) , BLOCK;status=Main_Menu;beepshort(); ) ;
2243 // if(force_lcd_update)
2245 // lcd.setCursor(0,line);
2246 // #ifdef CARDINSERTED
2252 // lcdprintPGM(" \004Refresh");
2256 // lcdprintPGM(" \004Insert Card");
2260 // if((activeline==line) && CLICKED)
2265 // force_lcd_update=true;
2266 // nrfiles=card.getnrfilenames();
2270 MENUITEM( lcd.print(" ");card.getWorkDirName();
2271 if(card.filename[0]=='/') lcdprintPGM(MSG_REFRESH);
2274 lcd.print(card.filename);
2278 if(SDCARDDETECT == -1) card.initsd();
2288 if(i-FIRSTITEM<nrfiles)
2290 if(force_lcd_update)
2292 card.getfilename(i-FIRSTITEM);
2293 //Serial.print("Filenr:");Serial.println(i-2);
2294 lcd.setCursor(0,line);lcdprintPGM(" ");
2295 if(card.filenameIsDir) lcd.print("\005");
2296 lcd.print(card.filename);
2298 if((activeline==line) && CLICKED)
2301 card.getfilename(i-FIRSTITEM);
2302 if(card.filenameIsDir)
2304 for(int8_t i=0;i<strlen(card.filename);i++)
2305 card.filename[i]=tolower(card.filename[i]);
2306 card.chdir(card.filename);
2313 for(int8_t i=0;i<strlen(card.filename);i++)
2314 card.filename[i]=tolower(card.filename[i]);
2315 sprintf(cmd,"M23 %s",card.filename);
2316 //sprintf(cmd,"M115");
2318 enquecommand("M24");
2321 lcd_status(card.filename);
2331 updateActiveLines(FIRSTITEM+nrfiles-1,encoderpos);
2334 force_lcd_update=true;
2335 enforceupdate=false;
2341 enum {ItemM_watch, ItemM_prepare, ItemM_control, ItemM_file };
2342 void MainMenu::showMainMenu()
2346 force_lcd_update=false;
2350 if(!(movesplanned() || IS_SD_PRINTING))
2352 force_lcd_update=true;
2358 if(movesplanned() || IS_SD_PRINTING)
2360 force_lcd_update=true;
2366 for(int8_t i=lineoffset;i<lineoffset+LCD_HEIGHT;i++)
2371 MENUITEM( lcdprintPGM(MSG_WATCH) , BLOCK;status=Main_Status;beepshort(); ) ;
2374 MENUITEM( if(!tune) lcdprintPGM(MSG_PREPARE);else lcdprintPGM(MSG_TUNE); , BLOCK;status=Main_Prepare;beepshort(); ) ;
2378 MENUITEM( lcdprintPGM(MSG_CONTROL_ARROW) , BLOCK;status=Main_Control;beepshort(); ) ;
2383 if(force_lcd_update)
2385 lcd.setCursor(0,line);
2393 lcdprintPGM(MSG_STOP_PRINT);
2395 lcdprintPGM(MSG_CARD_MENU);
2399 lcdprintPGM(MSG_NO_CARD);
2405 if((activeline==line)&&CLICKED)
2407 card.printingHasFinished();
2419 SERIAL_ERRORLNPGM(MSG_SERIAL_ERROR_MENU_STRUCTURE);
2424 updateActiveLines(3,encoderpos);
2427 void MainMenu::update()
2429 static MainStatus oldstatus=Main_Menu; //init automatically causes foce_lcd_update=true
2430 static long timeoutToStatus=0;
2431 static bool oldcardstatus=false;
2433 if((CARDINSERTED != oldcardstatus))
2435 force_lcd_update=true;
2436 oldcardstatus=CARDINSERTED;
2437 lcd_init(); // to maybe revive the lcd if static electricty killed it.
2438 //Serial.println("echo: SD CHANGE");
2442 LCD_MESSAGEPGM(MSG_SD_INSERTED);
2447 LCD_MESSAGEPGM(MSG_SD_REMOVED);
2452 if(status!=oldstatus)
2454 force_lcd_update=true;
2460 if( (encoderpos!=lastencoderpos) || CLICKED)
2461 timeoutToStatus=millis()+STATUSTIMEOUT;
2473 timeoutToStatus=millis()+STATUSTIMEOUT;
2492 case Sub_PrepareMove:
2500 case Sub_MotionControl:
2502 showControlMotion();
2504 case Sub_RetractControl:
2506 showControlRetract();
2508 case Sub_TempControl:
2518 if(timeoutToStatus<millis())
2520 //force_lcd_update=false;
2521 lastencoderpos=encoderpos;
2529 // convert float to string with +123.4 format
2530 char *ftostr3(const float &x)
2532 //sprintf(conv,"%5.1f",x);
2534 conv[0]=(xx/100)%10+'0';
2535 conv[1]=(xx/10)%10+'0';
2536 conv[2]=(xx)%10+'0';
2541 char *itostr2(const uint8_t &x)
2543 //sprintf(conv,"%5.1f",x);
2545 conv[0]=(xx/10)%10+'0';
2546 conv[1]=(xx)%10+'0';
2551 // convert float to string with +123.4 format
2552 char *ftostr31(const float &x)
2555 conv[0]=(xx>=0)?'+':'-';
2557 conv[1]=(xx/1000)%10+'0';
2558 conv[2]=(xx/100)%10+'0';
2559 conv[3]=(xx/10)%10+'0';
2561 conv[5]=(xx)%10+'0';
2566 char *ftostr32(const float &x)
2569 conv[0]=(xx>=0)?'+':'-';
2571 conv[1]=(xx/100)%10+'0';
2573 conv[3]=(xx/10)%10+'0';
2574 conv[4]=(xx)%10+'0';
2579 char *itostr31(const int &xx)
2581 conv[0]=(xx>=0)?'+':'-';
2582 conv[1]=(xx/1000)%10+'0';
2583 conv[2]=(xx/100)%10+'0';
2584 conv[3]=(xx/10)%10+'0';
2586 conv[5]=(xx)%10+'0';
2591 char *itostr3(const int &xx)
2593 conv[0]=(xx/100)%10+'0';
2594 conv[1]=(xx/10)%10+'0';
2595 conv[2]=(xx)%10+'0';
2600 char *itostr4(const int &xx)
2602 conv[0]=(xx/1000)%10+'0';
2603 conv[1]=(xx/100)%10+'0';
2604 conv[2]=(xx/10)%10+'0';
2605 conv[3]=(xx)%10+'0';
2610 // convert float to string with +1234.5 format
2611 char *ftostr51(const float &x)
2614 conv[0]=(xx>=0)?'+':'-';
2616 conv[1]=(xx/10000)%10+'0';
2617 conv[2]=(xx/1000)%10+'0';
2618 conv[3]=(xx/100)%10+'0';
2619 conv[4]=(xx/10)%10+'0';
2621 conv[6]=(xx)%10+'0';
2626 // convert float to string with +123.45 format
2627 char *ftostr52(const float &x)
2630 conv[0]=(xx>=0)?'+':'-';
2632 conv[1]=(xx/10000)%10+'0';
2633 conv[2]=(xx/1000)%10+'0';
2634 conv[3]=(xx/100)%10+'0';
2636 conv[5]=(xx/10)%10+'0';
2637 conv[6]=(xx)%10+'0';