|  |  |  | @ -262,15 +262,15 @@ static void lcd_status_screen() | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //LCD_PROGRESS_BAR
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcd_status_update_delay) | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_status_update_delay--; | 
			
		
	
		
			
				
					|  |  |  |  |     else | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate) { | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_status_screen(); | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_status_update_delay = 10;   /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */ | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcd_status_update_delay) | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_status_update_delay--; | 
			
		
	
		
			
				
					|  |  |  |  |   else | 
			
		
	
		
			
				
					|  |  |  |  |     lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcdDrawUpdate) { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_implementation_status_screen(); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_status_update_delay = 10;   /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */ | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -346,86 +346,82 @@ static void lcd_sdcard_pause() { card.pauseSDPrint(); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sdcard_resume() { card.startFileprint(); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sdcard_stop() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     card.sdprinting = false; | 
			
		
	
		
			
				
					|  |  |  |  |     card.closefile(); | 
			
		
	
		
			
				
					|  |  |  |  |     quickStop(); | 
			
		
	
		
			
				
					|  |  |  |  |     if(SD_FINISHED_STEPPERRELEASE) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         enquecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     autotempShutdown(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sdcard_stop() { | 
			
		
	
		
			
				
					|  |  |  |  |   card.sdprinting = false; | 
			
		
	
		
			
				
					|  |  |  |  |   card.closefile(); | 
			
		
	
		
			
				
					|  |  |  |  |   quickStop(); | 
			
		
	
		
			
				
					|  |  |  |  |   if (SD_FINISHED_STEPPERRELEASE) { | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommands_P(PSTR(SD_FINISHED_RELEASECOMMAND)); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   autotempShutdown(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	cancel_heatup = true; | 
			
		
	
		
			
				
					|  |  |  |  |   cancel_heatup = true; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	lcd_setstatus(MSG_PRINT_ABORTED); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_setstatus(MSG_PRINT_ABORTED); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* Menu implementation */ | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_main_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_WATCH, lcd_status_screen); | 
			
		
	
		
			
				
					|  |  |  |  |     if (movesplanned() || IS_SD_PRINTING) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     }else{ | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DELTA_CALIBRATION_MENU | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, lcd_delta_calibrate_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #endif // DELTA_CALIBRATION_MENU
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_main_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_WATCH, lcd_status_screen); | 
			
		
	
		
			
				
					|  |  |  |  |   if (movesplanned() || IS_SD_PRINTING) { | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   else { | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef DELTA_CALIBRATION_MENU | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_DELTA_CALIBRATE, lcd_delta_calibrate_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef SDSUPPORT | 
			
		
	
		
			
				
					|  |  |  |  |     if (card.cardOK) { | 
			
		
	
		
			
				
					|  |  |  |  |       if (card.isFileOpen()) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (card.sdprinting) | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause); | 
			
		
	
		
			
				
					|  |  |  |  |         else | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |       else { | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); | 
			
		
	
		
			
				
					|  |  |  |  |         #if SDCARDDETECT < 1 | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21"));  // SD-card changed by user
 | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | /*JFR TEST*/            MENU_ITEM(gcode, "test multiline", PSTR("G4 S3\nM104 S50\nG4 S1\nM104 S200\nG4 S2\nM104 S0"));  // SD-card changed by user
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef SDSUPPORT | 
			
		
	
		
			
				
					|  |  |  |  |     if (card.cardOK) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         if (card.isFileOpen()) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             if (card.sdprinting) | 
			
		
	
		
			
				
					|  |  |  |  |                 MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause); | 
			
		
	
		
			
				
					|  |  |  |  |             else | 
			
		
	
		
			
				
					|  |  |  |  |                 MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop); | 
			
		
	
		
			
				
					|  |  |  |  |         }else{ | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #if SDCARDDETECT < 1 | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21"));  // SD-card changed by user
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     }else{ | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #if SDCARDDETECT < 1 | 
			
		
	
		
			
				
					|  |  |  |  |     else { | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu); | 
			
		
	
		
			
				
					|  |  |  |  |       #if SDCARDDETECT < 1 | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //SDSUPPORT
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef SDSUPPORT | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_autostart_sd() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     card.autostart_index=0; | 
			
		
	
		
			
				
					|  |  |  |  |   static void lcd_autostart_sd() { | 
			
		
	
		
			
				
					|  |  |  |  |     card.autostart_index = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     card.setroot(); | 
			
		
	
		
			
				
					|  |  |  |  |     card.checkautostart(true); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_set_home_offsets() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     for(int8_t i=0; i < NUM_AXIS; i++) { | 
			
		
	
		
			
				
					|  |  |  |  |       if (i != E_AXIS) { | 
			
		
	
		
			
				
					|  |  |  |  |         add_homing[i] -= current_position[i]; | 
			
		
	
		
			
				
					|  |  |  |  |         current_position[i] = 0.0; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_set_home_offsets() { | 
			
		
	
		
			
				
					|  |  |  |  |   for(int8_t i=0; i < NUM_AXIS; i++) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (i != E_AXIS) { | 
			
		
	
		
			
				
					|  |  |  |  |       add_homing[i] -= current_position[i]; | 
			
		
	
		
			
				
					|  |  |  |  |       current_position[i] = 0.0; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     plan_set_position(0.0, 0.0, 0.0, current_position[E_AXIS]); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   plan_set_position(0.0, 0.0, 0.0, current_position[E_AXIS]); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // Audio feedback
 | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommands_P(PSTR("M300 S659 P200\nM300 S698 P200")); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |   // Audio feedback
 | 
			
		
	
		
			
				
					|  |  |  |  |   enquecommands_P(PSTR("M300 S659 P200\nM300 S698 P200")); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -446,274 +442,181 @@ void lcd_set_home_offsets() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //BABYSTEPPING
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_tune_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_SPEED, &feedmultiply, 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_tune_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(int3, MSG_SPEED, &feedmultiply, 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 2", &target_temperature[1], 0, HEATER_1_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_2 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 3", &target_temperature[2], 0, HEATER_2_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_3 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 4", &target_temperature[3], 0, HEATER_3_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N2, &target_temperature[1], 0, HEATER_1_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_2 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N3, &target_temperature[2], 0, HEATER_2_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_3 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N4, &target_temperature[3], 0, HEATER_3_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW " 0", &extruder_multiply[0], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW " 1", &extruder_multiply[1], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_2 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW " 2", &extruder_multiply[2], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_3 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW " 3", &extruder_multiply[3], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW MSG_F0, &extruder_multiply[0], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW MSG_F1, &extruder_multiply[1], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_2 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW MSG_F2, &extruder_multiply[2], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_3 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FLOW MSG_F3, &extruder_multiply[3], 10, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef BABYSTEPPING | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef BABYSTEPPING | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef BABYSTEP_XY | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_BABYSTEP_X, lcd_babystep_x); | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_BABYSTEP_Y, lcd_babystep_y); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif //BABYSTEP_XY
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef FILAMENTCHANGEENABLE | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef FILAMENTCHANGEENABLE | 
			
		
	
		
			
				
					|  |  |  |  |      MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600")); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla0() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend0(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs0() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend0(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | void _lcd_preheat(int endnum, const float temph, const float tempb, const int fan) { | 
			
		
	
		
			
				
					|  |  |  |  |   if (temph > 0) setTargetHotend(temph, endnum); | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetBed(tempb); | 
			
		
	
		
			
				
					|  |  |  |  |   fanSpeed = fan; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |   setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla0() { _lcd_preheat(0, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs0() { _lcd_preheat(0, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 //2nd extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla1() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend1(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs1() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend1(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_pla1() { _lcd_preheat(1, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_abs1() { _lcd_preheat(1, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | #endif //2nd extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_2 != 0 //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla2() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend2(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs2() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend2(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_pla2() { _lcd_preheat(2, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_abs2() { _lcd_preheat(2, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | #endif //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_3 != 0 //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla3() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend3(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs3() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend3(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_pla3() { _lcd_preheat(3, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_abs3() { _lcd_preheat(3, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | #endif //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 //more than one extruder present
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla0123() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_pla0123() { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend0(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend1(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend2(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend3(plaPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs0123() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     _lcd_preheat(3, plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_preheat_abs0123() { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend0(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend1(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend2(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend3(absPreheatHotendTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |     _lcd_preheat(3, absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | #endif //more than one extruder present
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla_bedonly() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(plaPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = plaPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs_bedonly() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(absPreheatHPBTemp); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = absPreheatFanSpeed; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |     setWatch(); // heater sanity check timer
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_pla_bedonly() { _lcd_preheat(0, 0, plaPreheatHPBTemp, plaPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_preheat_abs_bedonly() { _lcd_preheat(0, 0, absPreheatHPBTemp, absPreheatFanSpeed); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_preheat_pla_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_preheat_pla_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_N "1", lcd_preheat_pla0); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_N "2", lcd_preheat_pla1); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_2 != 0 //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_N "3", lcd_preheat_pla2); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_3 != 0 //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_N "4", lcd_preheat_pla3); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_ALL, lcd_preheat_pla0123); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_BEDONLY, lcd_preheat_pla_bedonly); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_PLA_N MSG_H1, lcd_preheat_pla0); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA_N MSG_H2, lcd_preheat_pla1); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_2 != 0 //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA_N MSG_H3, lcd_preheat_pla2); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_3 != 0 //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA_N MSG_H4, lcd_preheat_pla3); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA_ALL, lcd_preheat_pla0123); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA_BEDONLY, lcd_preheat_pla_bedonly); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_preheat_abs_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_preheat_abs_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_ABS_N "1", lcd_preheat_abs0); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS_N "2", lcd_preheat_abs1); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_2 != 0 //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_ABS_N "3", lcd_preheat_abs2); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_3 != 0 //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_ABS_N "4", lcd_preheat_abs3); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_ABS_ALL, lcd_preheat_abs0123); | 
			
		
	
		
			
				
					|  |  |  |  | #endif //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |  MENU_ITEM(function, MSG_PREHEAT_ABS_BEDONLY, lcd_preheat_abs_bedonly); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_PREHEAT_ABS_N MSG_H1, lcd_preheat_abs0); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  | 	  MENU_ITEM(function, MSG_PREHEAT_ABS_N MSG_H2, lcd_preheat_abs1); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //2 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_2 != 0 //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS_N MSG_H3, lcd_preheat_abs2); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //3 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_3 != 0 //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS_N MSG_H4, lcd_preheat_abs3); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //4 extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS_ALL, lcd_preheat_abs0123); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //all extruder preheat
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS_BEDONLY, lcd_preheat_abs_bedonly); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_cooldown() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend0(0); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend1(0); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend2(0); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetHotend3(0); | 
			
		
	
		
			
				
					|  |  |  |  |     setTargetBed(0); | 
			
		
	
		
			
				
					|  |  |  |  |     fanSpeed = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_cooldown() { | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetHotend0(0); | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetHotend1(0); | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetHotend2(0); | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetHotend3(0); | 
			
		
	
		
			
				
					|  |  |  |  |   setTargetBed(0); | 
			
		
	
		
			
				
					|  |  |  |  |   fanSpeed = 0; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_prepare_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef SDSUPPORT | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_prepare_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef SDSUPPORT | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef MENU_ADDAUTOSTART | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(function, MSG_AUTOSTART, lcd_autostart_sd); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_SET_HOME_OFFSETS, lcd_set_home_offsets); | 
			
		
	
		
			
				
					|  |  |  |  |     //MENU_ITEM(gcode, MSG_SET_ORIGIN, PSTR("G92 X0 Y0 Z0"));
 | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_PREHEAT_PLA, lcd_preheat_pla_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_PREHEAT_ABS, lcd_preheat_abs_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   #else | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_PLA, lcd_preheat_pla0); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_PREHEAT_ABS, lcd_preheat_abs0); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); | 
			
		
	
		
			
				
					|  |  |  |  | #if PS_ON_PIN > -1 | 
			
		
	
		
			
				
					|  |  |  |  |     if (powersupply) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(gcode, MSG_SWITCH_PS_OFF, PSTR("M81")); | 
			
		
	
		
			
				
					|  |  |  |  |     }else{ | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(gcode, MSG_SWITCH_PS_ON, PSTR("M80")); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_SET_HOME_OFFSETS, lcd_set_home_offsets); | 
			
		
	
		
			
				
					|  |  |  |  |   //MENU_ITEM(gcode, MSG_SET_ORIGIN, PSTR("G92 X0 Y0 Z0"));
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_PREHEAT_PLA, lcd_preheat_pla_menu); | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(submenu, MSG_PREHEAT_ABS, lcd_preheat_abs_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     #else | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(function, MSG_PREHEAT_PLA, lcd_preheat_pla0); | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(function, MSG_PREHEAT_ABS, lcd_preheat_abs0); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); | 
			
		
	
		
			
				
					|  |  |  |  |   #if defined(POWER_SUPPLY) && POWER_SUPPLY > 0 && defined(PS_ON_PIN) && PS_ON_PIN > -1 | 
			
		
	
		
			
				
					|  |  |  |  |     if (powersupply) { | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(gcode, MSG_SWITCH_PS_OFF, PSTR("M81")); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 		 | 
			
		
	
		
			
				
					|  |  |  |  |     // JFR for RMud delta printer
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, "Calibrate bed", PSTR("M702\nG28\nG1 X-77.94 Y-45 Z36 F8000\nG4 S3\nM701 P0\nG1 X77.94 Y-45 Z36\nG4 S3\nM701 P1\nG1 X0 Y90 Z36\nG4 S3\nM701 P2\nM700\nG1 X0 Y0 Z100 F8000")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, "Check level", PSTR("G28\nG1 X0 Y0 Z1 F4000\nG1 X-77.94 Y-45 Z1\nG1 X77.94 Y-45\nG1 X0 Y90\nG1 X-77.94 Y-45\nG4 S2\nG1 X-77.94 Y-45 Z0.3 F2000\nG1 X-77.94 Y-45\nG1 X77.94 Y-45\nG1 X0 Y90\nG1 X-77.94 Y-45\nG1 X0 Y0 Z0")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, "Retract filament", PSTR("M302\nM82\nG92 E0\nG1 F4000 E-800")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, "Insert filament", PSTR("M302\nM82\nG92 E0\nG1 F4000 E60")); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(gcode, "Finalize filament", PSTR("G1 F4000 E790")); | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     else { | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(gcode, MSG_SWITCH_PS_ON, PSTR("M80")); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 	 | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DELTA_CALIBRATION_MENU | 
			
		
	
	
		
			
				
					|  |  |  | @ -755,89 +658,77 @@ static void lcd_move_x() { _lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS); } | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_y() { _lcd_move(PSTR("Y"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); } | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_z() { _lcd_move(PSTR("Z"), Z_AXIS, Z_MIN_POS, Z_MAX_POS); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_e() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     if (encoderPosition != 0) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale; | 
			
		
	
		
			
				
					|  |  |  |  |         encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         #ifdef DELTA | 
			
		
	
		
			
				
					|  |  |  |  |         calculate_delta(current_position); | 
			
		
	
		
			
				
					|  |  |  |  |         plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS]/60, active_extruder); | 
			
		
	
		
			
				
					|  |  |  |  |         #else | 
			
		
	
		
			
				
					|  |  |  |  |         plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS]/60, active_extruder); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_drawedit(PSTR("Extruder"), ftostr31(current_position[E_AXIS])); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_e() { | 
			
		
	
		
			
				
					|  |  |  |  |   if (encoderPosition != 0) { | 
			
		
	
		
			
				
					|  |  |  |  |     current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale; | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef DELTA | 
			
		
	
		
			
				
					|  |  |  |  |       calculate_delta(current_position); | 
			
		
	
		
			
				
					|  |  |  |  |       plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS]/60, active_extruder); | 
			
		
	
		
			
				
					|  |  |  |  |     #else | 
			
		
	
		
			
				
					|  |  |  |  |       plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS]/60, active_extruder); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR("Extruder"), ftostr31(current_position[E_AXIS])); | 
			
		
	
		
			
				
					|  |  |  |  |   if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_axis() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_MOVE_AXIS, lcd_move_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y); | 
			
		
	
		
			
				
					|  |  |  |  |     if (move_menu_scale < 10.0) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_axis() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_MOVE_AXIS, lcd_move_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y); | 
			
		
	
		
			
				
					|  |  |  |  |   if (move_menu_scale < 10.0) { | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_10mm() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = 10.0; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_10mm() { | 
			
		
	
		
			
				
					|  |  |  |  |   move_menu_scale = 10.0; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_1mm() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = 1.0; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_1mm() { | 
			
		
	
		
			
				
					|  |  |  |  |   move_menu_scale = 1.0; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_01mm() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = 0.1; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu_01mm() { | 
			
		
	
		
			
				
					|  |  |  |  |   move_menu_scale = 0.1; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_move_menu_axis(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm); | 
			
		
	
		
			
				
					|  |  |  |  |     //TODO:X,Y,Z,E
 | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_move_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm); | 
			
		
	
		
			
				
					|  |  |  |  |   //TODO:X,Y,Z,E
 | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_MOTION, lcd_control_motion_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_VOLUMETRIC, lcd_control_volumetric_menu); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_MOTION, lcd_control_motion_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(submenu, MSG_VOLUMETRIC, lcd_control_volumetric_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DOGLCD | 
			
		
	
		
			
				
					|  |  |  |  | //    MENU_ITEM_EDIT(int3, MSG_CONTRAST, &lcd_contrast, 0, 63);
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef DOGLCD | 
			
		
	
		
			
				
					|  |  |  |  |     //MENU_ITEM_EDIT(int3, MSG_CONTRAST, &lcd_contrast, 0, 63);
 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_CONTRAST, lcd_set_contrast); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef FWRETRACT | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef FWRETRACT | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(submenu, MSG_RETRACT, lcd_control_retract_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_LOAD_EPROM, Config_RetrieveSettings); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_RESTORE_FAILSAFE, Config_ResetDefault); | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(function, MSG_RESTORE_FAILSAFE, Config_ResetDefault); | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef PIDTEMP | 
			
		
	
	
		
			
				
					|  |  |  | @ -871,8 +762,7 @@ static void lcd_control_menu() | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //PIDTEMP
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_0 != 0 | 
			
		
	
	
		
			
				
					|  |  |  | @ -880,19 +770,19 @@ static void lcd_control_temperature_menu() | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |     #if TEMP_SENSOR_1 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 2", &target_temperature[1], 0, HEATER_1_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N2, &target_temperature[1], 0, HEATER_1_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     #if EXTRUDERS > 2 | 
			
		
	
		
			
				
					|  |  |  |  |       #if TEMP_SENSOR_2 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 3", &target_temperature[2], 0, HEATER_2_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N3, &target_temperature[2], 0, HEATER_2_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |       #if EXTRUDERS > 3 | 
			
		
	
		
			
				
					|  |  |  |  |         #if TEMP_SENSOR_3 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE " 4", &target_temperature[3], 0, HEATER_3_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_NOZZLE MSG_N4, &target_temperature[3], 0, HEATER_3_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |       #endif // EXTRUDERS > 3
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif // EXTRUDERS > 2
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif // EXTRUDERS > 1
 | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
	
		
			
				
					|  |  |  | @ -919,36 +809,36 @@ static void lcd_control_temperature_menu() | 
			
		
	
		
			
				
					|  |  |  |  |         // set up temp variables - undo the default scaling
 | 
			
		
	
		
			
				
					|  |  |  |  |         raw_Ki = unscalePID_i(PID_PARAM(Ki,1)); | 
			
		
	
		
			
				
					|  |  |  |  |         raw_Kd = unscalePID_d(PID_PARAM(Kd,1)); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT(float52, MSG_PID_P " E2", &PID_PARAM(Kp,1), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT(float52, MSG_PID_P MSG_E2, &PID_PARAM(Kp,1), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |         // i is typically a small value so allows values below 1
 | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I " E2", &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E2); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D " E2", &raw_Kd, 1, 9990, copy_and_scalePID_d_E2); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I MSG_E2, &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E2); | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D MSG_E2, &raw_Kd, 1, 9990, copy_and_scalePID_d_E2); | 
			
		
	
		
			
				
					|  |  |  |  |         #ifdef PID_ADD_EXTRUSION_RATE | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT(float3, MSG_PID_C " E2", &PID_PARAM(Kc,1), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT(float3, MSG_PID_C MSG_E2, &PID_PARAM(Kc,1), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif//PID_ADD_EXTRUSION_RATE
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         #if EXTRUDERS > 2 | 
			
		
	
		
			
				
					|  |  |  |  |           // set up temp variables - undo the default scaling
 | 
			
		
	
		
			
				
					|  |  |  |  |           raw_Ki = unscalePID_i(PID_PARAM(Ki,2)); | 
			
		
	
		
			
				
					|  |  |  |  |           raw_Kd = unscalePID_d(PID_PARAM(Kd,2)); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT(float52, MSG_PID_P " E3", &PID_PARAM(Kp,2), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT(float52, MSG_PID_P MSG_E3, &PID_PARAM(Kp,2), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |           // i is typically a small value so allows values below 1
 | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I " E3", &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E3); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D " E3", &raw_Kd, 1, 9990, copy_and_scalePID_d_E3); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I MSG_E3, &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E3); | 
			
		
	
		
			
				
					|  |  |  |  |           MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D MSG_E3, &raw_Kd, 1, 9990, copy_and_scalePID_d_E3); | 
			
		
	
		
			
				
					|  |  |  |  |           #ifdef PID_ADD_EXTRUSION_RATE | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT(float3, MSG_PID_C " E3", &PID_PARAM(Kc,2), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT(float3, MSG_PID_C MSG_E3, &PID_PARAM(Kc,2), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |           #endif//PID_ADD_EXTRUSION_RATE
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           #if EXTRUDERS > 3 | 
			
		
	
		
			
				
					|  |  |  |  |             // set up temp variables - undo the default scaling
 | 
			
		
	
		
			
				
					|  |  |  |  |             raw_Ki = unscalePID_i(PID_PARAM(Ki,3)); | 
			
		
	
		
			
				
					|  |  |  |  |             raw_Kd = unscalePID_d(PID_PARAM(Kd,3)); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT(float52, MSG_PID_P " E4", &PID_PARAM(Kp,3), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT(float52, MSG_PID_P MSG_E4, &PID_PARAM(Kp,3), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |             // i is typically a small value so allows values below 1
 | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I " E4", &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E4); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D " E4", &raw_Kd, 1, 9990, copy_and_scalePID_d_E4); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_I MSG_E4, &raw_Ki, 0.01, 9990, copy_and_scalePID_i_E4); | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_EDIT_CALLBACK(float52, MSG_PID_D MSG_E4, &raw_Kd, 1, 9990, copy_and_scalePID_d_E4); | 
			
		
	
		
			
				
					|  |  |  |  |             #ifdef PID_ADD_EXTRUSION_RATE | 
			
		
	
		
			
				
					|  |  |  |  |               MENU_ITEM_EDIT(float3, MSG_PID_C " E4", &PID_PARAM(Kc,3), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |               MENU_ITEM_EDIT(float3, MSG_PID_C MSG_E4, &PID_PARAM(Kc,3), 1, 9990); | 
			
		
	
		
			
				
					|  |  |  |  |             #endif//PID_ADD_EXTRUSION_RATE
 | 
			
		
	
		
			
				
					|  |  |  |  |           #endif//EXTRUDERS > 3
 | 
			
		
	
		
			
				
					|  |  |  |  |         #endif//EXTRUDERS > 2
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -960,84 +850,80 @@ static void lcd_control_temperature_menu() | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_preheat_pla_settings_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &plaPreheatFanSpeed, 0, 255); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_preheat_pla_settings_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &plaPreheatFanSpeed, 0, 255); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_NOZZLE, &plaPreheatHotendTemp, 0, HEATER_0_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_BED, &plaPreheatHPBTemp, 0, BED_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_preheat_abs_settings_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &absPreheatFanSpeed, 0, 255); | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_temperature_preheat_abs_settings_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &absPreheatFanSpeed, 0, 255); | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_0 != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_NOZZLE, &absPreheatHotendTemp, 0, HEATER_0_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #if TEMP_SENSOR_BED != 0 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(int3, MSG_BED, &absPreheatHPBTemp, 0, BED_MAXTEMP - 15); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef EEPROM_SETTINGS | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_motion_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ENABLE_AUTO_BED_LEVELING | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_motion_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef ENABLE_AUTO_BED_LEVELING | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, 0.5, 50); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 500, 99000); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_VZ_JERK, &max_z_jerk, 0.1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VE_JERK, &max_e_jerk, 1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VMAX MSG_X, &max_feedrate[X_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VMAX MSG_Y, &max_feedrate[Y_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VMAX MSG_Z, &max_feedrate[Z_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E, &max_feedrate[E_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VMIN, &minimumfeedrate, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_VTRAV_MIN, &mintravelfeedrate, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_X, &max_acceleration_units_per_sq_second[X_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Y, &max_acceleration_units_per_sq_second[Y_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Z, &max_acceleration_units_per_sq_second[Z_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &max_acceleration_units_per_sq_second[E_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float5, MSG_A_RETRACT, &retract_acceleration, 100, 99000); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_XSTEPS, &axis_steps_per_unit[X_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_YSTEPS, &axis_steps_per_unit[Y_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 500, 99000); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_VZ_JERK, &max_z_jerk, 0.1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VE_JERK, &max_e_jerk, 1, 990); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VMAX MSG_X, &max_feedrate[X_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VMAX MSG_Y, &max_feedrate[Y_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VMAX MSG_Z, &max_feedrate[Z_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VMAX MSG_E, &max_feedrate[E_AXIS], 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VMIN, &minimumfeedrate, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_VTRAV_MIN, &mintravelfeedrate, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_X, &max_acceleration_units_per_sq_second[X_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Y, &max_acceleration_units_per_sq_second[Y_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Z, &max_acceleration_units_per_sq_second[Z_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &max_acceleration_units_per_sq_second[E_AXIS], 100, 99000, reset_acceleration_rates); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float5, MSG_A_RETRACT, &retract_acceleration, 100, 99000); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_XSTEPS, &axis_steps_per_unit[X_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_YSTEPS, &axis_steps_per_unit[Y_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float51, MSG_ZSTEPS, &axis_steps_per_unit[Z_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float51, MSG_ESTEPS, &axis_steps_per_unit[E_AXIS], 5, 9999); | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(bool, MSG_ENDSTOP_ABORT, &abort_on_endstop_hit); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef SCARA | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef SCARA | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float74, MSG_XSCALE, &axis_scaling[X_AXIS],0.5,2); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float74, MSG_YSCALE, &axis_scaling[Y_AXIS],0.5,2); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_volumetric_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | 	MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_volumetric_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &volumetric_enabled, calculate_volumetric_multipliers); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &volumetric_enabled, calculate_volumetric_multipliers); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (volumetric_enabled) { | 
			
		
	
		
			
				
					|  |  |  |  |   if (volumetric_enabled) { | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_SIZE_EXTRUDER_0, &filament_size[0], 1.5, 3.25, calculate_volumetric_multipliers); | 
			
		
	
		
			
				
					|  |  |  |  |     #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_SIZE_EXTRUDER_1, &filament_size[1], 1.5, 3.25, calculate_volumetric_multipliers); | 
			
		
	
	
		
			
				
					|  |  |  | @ -1048,149 +934,133 @@ static void lcd_control_volumetric_menu() | 
			
		
	
		
			
				
					|  |  |  |  |         #endif //EXTRUDERS > 3
 | 
			
		
	
		
			
				
					|  |  |  |  |       #endif //EXTRUDERS > 2
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif //EXTRUDERS > 1
 | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DOGLCD | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_set_contrast() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     if (encoderPosition != 0) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_contrast -= encoderPosition; | 
			
		
	
		
			
				
					|  |  |  |  |         if (lcd_contrast < 0) lcd_contrast = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (lcd_contrast > 63) lcd_contrast = 63; | 
			
		
	
		
			
				
					|  |  |  |  |         encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.setContrast(lcd_contrast); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_drawedit(PSTR(MSG_CONTRAST), itostr2(lcd_contrast)); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     if (LCD_CLICKED) lcd_goto_menu(lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_set_contrast() { | 
			
		
	
		
			
				
					|  |  |  |  |   if (encoderPosition != 0) { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_contrast -= encoderPosition; | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcd_contrast < 0) lcd_contrast = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     else if (lcd_contrast > 63) lcd_contrast = 63; | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     u8g.setContrast(lcd_contrast); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_CONTRAST), itostr2(lcd_contrast)); | 
			
		
	
		
			
				
					|  |  |  |  |   if (LCD_CLICKED) lcd_goto_menu(lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //DOGLCD
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef FWRETRACT | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_retract_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &autoretract_enabled); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &retract_length, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |     #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_SWAP, &retract_length_swap, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &retract_feedrate, 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_ZLIFT, &retract_zlift, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER, &retract_recover_length, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |     #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER_SWAP, &retract_recover_length_swap, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &retract_recover_feedrate, 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_control_retract_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &autoretract_enabled); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &retract_length, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |   #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_SWAP, &retract_length_swap, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &retract_feedrate, 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_ZLIFT, &retract_zlift, 0, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER, &retract_recover_length, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |   #if EXTRUDERS > 1 | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT_RECOVER_SWAP, &retract_recover_length_swap, 0, 100); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &retract_recover_feedrate, 1, 999); | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //FWRETRACT
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if SDCARDDETECT == -1 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sd_refresh() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |   static void lcd_sd_refresh() { | 
			
		
	
		
			
				
					|  |  |  |  |     card.initsd(); | 
			
		
	
		
			
				
					|  |  |  |  |     currentMenuViewOffset = 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sd_updir() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     card.updir(); | 
			
		
	
		
			
				
					|  |  |  |  |     currentMenuViewOffset = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_sd_updir() { | 
			
		
	
		
			
				
					|  |  |  |  |   card.updir(); | 
			
		
	
		
			
				
					|  |  |  |  |   currentMenuViewOffset = 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_sdcard_menu() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) | 
			
		
	
		
			
				
					|  |  |  |  |         return;	// nothing to do (so don't thrash the SD card)
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint16_t fileCnt = card.getnrfilenames(); | 
			
		
	
		
			
				
					|  |  |  |  |     START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |     card.getWorkDirName(); | 
			
		
	
		
			
				
					|  |  |  |  |     if(card.filename[0]=='/') | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  | #if SDCARDDETECT == -1 | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     }else{ | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_sdcard_menu() { | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return;	// nothing to do (so don't thrash the SD card)
 | 
			
		
	
		
			
				
					|  |  |  |  |   uint16_t fileCnt = card.getnrfilenames(); | 
			
		
	
		
			
				
					|  |  |  |  |   START_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |   MENU_ITEM(back, MSG_MAIN, lcd_main_menu); | 
			
		
	
		
			
				
					|  |  |  |  |   card.getWorkDirName(); | 
			
		
	
		
			
				
					|  |  |  |  |   if (card.filename[0] == '/') { | 
			
		
	
		
			
				
					|  |  |  |  |     #if SDCARDDETECT == -1 | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   else { | 
			
		
	
		
			
				
					|  |  |  |  |     MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     for(uint16_t i=0;i<fileCnt;i++) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         if (_menuItemNr == _lineNr) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             #ifndef SDCARD_RATHERRECENTFIRST | 
			
		
	
		
			
				
					|  |  |  |  |               card.getfilename(i); | 
			
		
	
		
			
				
					|  |  |  |  |             #else | 
			
		
	
		
			
				
					|  |  |  |  |               card.getfilename(fileCnt-1-i); | 
			
		
	
		
			
				
					|  |  |  |  |             #endif | 
			
		
	
		
			
				
					|  |  |  |  |             if (card.filenameIsDir) | 
			
		
	
		
			
				
					|  |  |  |  |             { | 
			
		
	
		
			
				
					|  |  |  |  |                 MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); | 
			
		
	
		
			
				
					|  |  |  |  |             }else{ | 
			
		
	
		
			
				
					|  |  |  |  |                 MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |         }else{ | 
			
		
	
		
			
				
					|  |  |  |  |             MENU_ITEM_DUMMY(); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |   for(uint16_t i = 0; i < fileCnt; i++) { | 
			
		
	
		
			
				
					|  |  |  |  |     if (_menuItemNr == _lineNr) { | 
			
		
	
		
			
				
					|  |  |  |  |       #ifndef SDCARD_RATHERRECENTFIRST | 
			
		
	
		
			
				
					|  |  |  |  |         card.getfilename(i); | 
			
		
	
		
			
				
					|  |  |  |  |       #else | 
			
		
	
		
			
				
					|  |  |  |  |         card.getfilename(fileCnt-1-i); | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  |       if (card.filenameIsDir) | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); | 
			
		
	
		
			
				
					|  |  |  |  |       else | 
			
		
	
		
			
				
					|  |  |  |  |         MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  |     else { | 
			
		
	
		
			
				
					|  |  |  |  |       MENU_ITEM_DUMMY(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   END_MENU(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #define menu_edit_type(_type, _name, _strFunc, scale) \ | 
			
		
	
		
			
				
					|  |  |  |  |     void menu_edit_ ## _name () \ | 
			
		
	
		
			
				
					|  |  |  |  |     { \ | 
			
		
	
		
			
				
					|  |  |  |  |         if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ | 
			
		
	
		
			
				
					|  |  |  |  |         if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |         if (lcdDrawUpdate) \ | 
			
		
	
		
			
				
					|  |  |  |  |             lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \ | 
			
		
	
		
			
				
					|  |  |  |  |         if (LCD_CLICKED) \ | 
			
		
	
		
			
				
					|  |  |  |  |         { \ | 
			
		
	
		
			
				
					|  |  |  |  |             *((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \ | 
			
		
	
		
			
				
					|  |  |  |  |             lcd_goto_menu(prevMenu, prevEncoderPosition); \ | 
			
		
	
		
			
				
					|  |  |  |  |         } \ | 
			
		
	
		
			
				
					|  |  |  |  |     } \ | 
			
		
	
		
			
				
					|  |  |  |  |     void menu_edit_callback_ ## _name () { \ | 
			
		
	
		
			
				
					|  |  |  |  |         menu_edit_ ## _name (); \ | 
			
		
	
		
			
				
					|  |  |  |  |         if (LCD_CLICKED) (*callbackFunc)(); \ | 
			
		
	
		
			
				
					|  |  |  |  |   bool _menu_edit_ ## _name () { \ | 
			
		
	
		
			
				
					|  |  |  |  |     bool isClicked = LCD_CLICKED; \ | 
			
		
	
		
			
				
					|  |  |  |  |     if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ | 
			
		
	
		
			
				
					|  |  |  |  |     if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate) \ | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \ | 
			
		
	
		
			
				
					|  |  |  |  |     if (isClicked) { \ | 
			
		
	
		
			
				
					|  |  |  |  |       *((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \ | 
			
		
	
		
			
				
					|  |  |  |  |       lcd_goto_menu(prevMenu, prevEncoderPosition); \ | 
			
		
	
		
			
				
					|  |  |  |  |     } \ | 
			
		
	
		
			
				
					|  |  |  |  |     static void menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) \ | 
			
		
	
		
			
				
					|  |  |  |  |     { \ | 
			
		
	
		
			
				
					|  |  |  |  |         prevMenu = currentMenu; \ | 
			
		
	
		
			
				
					|  |  |  |  |         prevEncoderPosition = encoderPosition; \ | 
			
		
	
		
			
				
					|  |  |  |  |          \ | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 2; \ | 
			
		
	
		
			
				
					|  |  |  |  |         currentMenu = menu_edit_ ## _name; \ | 
			
		
	
		
			
				
					|  |  |  |  |          \ | 
			
		
	
		
			
				
					|  |  |  |  |         editLabel = pstr; \ | 
			
		
	
		
			
				
					|  |  |  |  |         editValue = ptr; \ | 
			
		
	
		
			
				
					|  |  |  |  |         minEditValue = minValue * scale; \ | 
			
		
	
		
			
				
					|  |  |  |  |         maxEditValue = maxValue * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |         encoderPosition = (*ptr) * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |     }\ | 
			
		
	
		
			
				
					|  |  |  |  |     static void menu_action_setting_edit_callback_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue, menuFunc_t callback) \ | 
			
		
	
		
			
				
					|  |  |  |  |     { \ | 
			
		
	
		
			
				
					|  |  |  |  |         prevMenu = currentMenu; \ | 
			
		
	
		
			
				
					|  |  |  |  |         prevEncoderPosition = encoderPosition; \ | 
			
		
	
		
			
				
					|  |  |  |  |          \ | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 2; \ | 
			
		
	
		
			
				
					|  |  |  |  |         currentMenu = menu_edit_callback_ ## _name; \ | 
			
		
	
		
			
				
					|  |  |  |  |          \ | 
			
		
	
		
			
				
					|  |  |  |  |         editLabel = pstr; \ | 
			
		
	
		
			
				
					|  |  |  |  |         editValue = ptr; \ | 
			
		
	
		
			
				
					|  |  |  |  |         minEditValue = minValue * scale; \ | 
			
		
	
		
			
				
					|  |  |  |  |         maxEditValue = maxValue * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |         encoderPosition = (*ptr) * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |         callbackFunc = callback;\ | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     return isClicked; \ | 
			
		
	
		
			
				
					|  |  |  |  |   } \ | 
			
		
	
		
			
				
					|  |  |  |  |   void menu_edit_ ## _name () { _menu_edit_ ## _name(); } \ | 
			
		
	
		
			
				
					|  |  |  |  |   void menu_edit_callback_ ## _name () { if (_menu_edit_ ## _name ()) (*callbackFunc)(); } \ | 
			
		
	
		
			
				
					|  |  |  |  |   static void _menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) { \ | 
			
		
	
		
			
				
					|  |  |  |  |     prevMenu = currentMenu; \ | 
			
		
	
		
			
				
					|  |  |  |  |     prevEncoderPosition = encoderPosition; \ | 
			
		
	
		
			
				
					|  |  |  |  |      \ | 
			
		
	
		
			
				
					|  |  |  |  |     lcdDrawUpdate = 2; \ | 
			
		
	
		
			
				
					|  |  |  |  |     currentMenu = menu_edit_ ## _name; \ | 
			
		
	
		
			
				
					|  |  |  |  |      \ | 
			
		
	
		
			
				
					|  |  |  |  |     editLabel = pstr; \ | 
			
		
	
		
			
				
					|  |  |  |  |     editValue = ptr; \ | 
			
		
	
		
			
				
					|  |  |  |  |     minEditValue = minValue * scale; \ | 
			
		
	
		
			
				
					|  |  |  |  |     maxEditValue = maxValue * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = (*ptr) * scale - minEditValue; \ | 
			
		
	
		
			
				
					|  |  |  |  |   } \ | 
			
		
	
		
			
				
					|  |  |  |  |   static void menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) { \ | 
			
		
	
		
			
				
					|  |  |  |  |     _menu_action_setting_edit_ ## _name(pstr, ptr, minValue, maxValue); \ | 
			
		
	
		
			
				
					|  |  |  |  |     currentMenu = menu_edit_ ## _name; \ | 
			
		
	
		
			
				
					|  |  |  |  |   }\ | 
			
		
	
		
			
				
					|  |  |  |  |   static void menu_action_setting_edit_callback_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue, menuFunc_t callback) { \ | 
			
		
	
		
			
				
					|  |  |  |  |     _menu_action_setting_edit_ ## _name(pstr, ptr, minValue, maxValue); \ | 
			
		
	
		
			
				
					|  |  |  |  |     currentMenu = menu_edit_callback_ ## _name; \ | 
			
		
	
		
			
				
					|  |  |  |  |     callbackFunc = callback; \ | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | menu_edit_type(int, int3, itostr3, 1) | 
			
		
	
		
			
				
					|  |  |  |  | menu_edit_type(float, float3, ftostr3, 1) | 
			
		
	
		
			
				
					|  |  |  |  | menu_edit_type(float, float32, ftostr32, 100) | 
			
		
	
	
		
			
				
					|  |  |  | @ -1201,94 +1071,81 @@ menu_edit_type(float, float52, ftostr52, 100) | 
			
		
	
		
			
				
					|  |  |  |  | menu_edit_type(unsigned long, long5, ftostr5, 0.01) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef REPRAPWORLD_KEYPAD | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_z_up() { | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_z_up() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 		lcd_move_z(); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_z(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_z_down() { | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_z_down() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = -1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 		lcd_move_z(); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_z(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_x_left() { | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_x_left() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = -1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 		lcd_move_x(); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_x(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_x_right() { | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_x_right() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 		lcd_move_x(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_y_down() { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_x(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_y_down() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 		lcd_move_y(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_y_up() { | 
			
		
	
		
			
				
					|  |  |  |  | 		encoderPosition = -1; | 
			
		
	
		
			
				
					|  |  |  |  | 		move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_y(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	static void reprapworld_keypad_move_home() { | 
			
		
	
		
			
				
					|  |  |  |  | 		enquecommands_P((PSTR("G28"))); // move all axis home
 | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_y_up() { | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = -1; | 
			
		
	
		
			
				
					|  |  |  |  |     move_menu_scale = REPRAPWORLD_KEYPAD_MOVE_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_move_y(); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   static void reprapworld_keypad_move_home() { | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommands_P((PSTR("G28"))); // move all axis home
 | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | #endif //REPRAPWORLD_KEYPAD
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** End of menus **/ | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_quick_feedback() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |     blocking_enc = millis() + 500; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_implementation_quick_feedback(); | 
			
		
	
		
			
				
					|  |  |  |  | static void lcd_quick_feedback() { | 
			
		
	
		
			
				
					|  |  |  |  |   lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |   blocking_enc = millis() + 500; | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_implementation_quick_feedback(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** Menu action functions **/ | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_back(menuFunc_t data) { lcd_goto_menu(data); } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_submenu(menuFunc_t data) { lcd_goto_menu(data); } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_gcode(const char* pgcode) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommands_P(pgcode); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_gcode(const char* pgcode) { enquecommands_P(pgcode); } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_function(menuFunc_t data) { (*data)(); } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_sdfile(const char* filename, char* longFilename) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     char cmd[30]; | 
			
		
	
		
			
				
					|  |  |  |  |     char* c; | 
			
		
	
		
			
				
					|  |  |  |  |     sprintf_P(cmd, PSTR("M23 %s"), filename); | 
			
		
	
		
			
				
					|  |  |  |  |     for(c = &cmd[4]; *c; c++) | 
			
		
	
		
			
				
					|  |  |  |  |         *c = tolower(*c); | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommand(cmd); | 
			
		
	
		
			
				
					|  |  |  |  |     enquecommands_P(PSTR("M24")); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_sdfile(const char* filename, char* longFilename) { | 
			
		
	
		
			
				
					|  |  |  |  |   char cmd[30]; | 
			
		
	
		
			
				
					|  |  |  |  |   char* c; | 
			
		
	
		
			
				
					|  |  |  |  |   sprintf_P(cmd, PSTR("M23 %s"), filename); | 
			
		
	
		
			
				
					|  |  |  |  |   for(c = &cmd[4]; *c; c++) *c = tolower(*c); | 
			
		
	
		
			
				
					|  |  |  |  |   enquecommand(cmd); | 
			
		
	
		
			
				
					|  |  |  |  |   enquecommands_P(PSTR("M24")); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_sddirectory(const char* filename, char* longFilename) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     card.chdir(filename); | 
			
		
	
		
			
				
					|  |  |  |  |     encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_sddirectory(const char* filename, char* longFilename) { | 
			
		
	
		
			
				
					|  |  |  |  |   card.chdir(filename); | 
			
		
	
		
			
				
					|  |  |  |  |   encoderPosition = 0; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     *ptr = !(*ptr); | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) { *ptr = !(*ptr); } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) { | 
			
		
	
		
			
				
					|  |  |  |  |   menu_action_setting_edit_bool(pstr, ptr); | 
			
		
	
		
			
				
					|  |  |  |  |   (*callback)(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	menu_action_setting_edit_bool(pstr, ptr); | 
			
		
	
		
			
				
					|  |  |  |  | 	(*callback)(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | #endif//ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** LCD API **/ | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_init() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_implementation_init(); | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_init() { | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_implementation_init(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef NEWPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef NEWPANEL | 
			
		
	
		
			
				
					|  |  |  |  |     SET_INPUT(BTN_EN1); | 
			
		
	
		
			
				
					|  |  |  |  |     SET_INPUT(BTN_EN2); | 
			
		
	
		
			
				
					|  |  |  |  |     WRITE(BTN_EN1,HIGH); | 
			
		
	
	
		
			
				
					|  |  |  | @ -1323,182 +1180,166 @@ void lcd_init() | 
			
		
	
		
			
				
					|  |  |  |  |   #endif // SR_LCD_2W_NL
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif//!NEWPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) | 
			
		
	
		
			
				
					|  |  |  |  |     pinMode(SDCARDDETECT,INPUT); | 
			
		
	
		
			
				
					|  |  |  |  |   #if defined(SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) | 
			
		
	
		
			
				
					|  |  |  |  |     pinMode(SDCARDDETECT, INPUT); | 
			
		
	
		
			
				
					|  |  |  |  |     WRITE(SDCARDDETECT, HIGH); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_oldcardstatus = IS_SD_INSERTED; | 
			
		
	
		
			
				
					|  |  |  |  | #endif//(SDCARDDETECT > 0)
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef LCD_HAS_SLOW_BUTTONS | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //(SDCARDDETECT > 0)
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef LCD_HAS_SLOW_BUTTONS | 
			
		
	
		
			
				
					|  |  |  |  |     slow_buttons = 0; | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_buttons_update(); | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_buttons_update(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  |     encoderDiff = 0; | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int lcd_strlen(char *s) { | 
			
		
	
		
			
				
					|  |  |  |  |      int i = 0, j = 0; | 
			
		
	
		
			
				
					|  |  |  |  |    while (s[i]) { | 
			
		
	
		
			
				
					|  |  |  |  |      if ((s[i] & 0xc0) != 0x80) j++; | 
			
		
	
		
			
				
					|  |  |  |  |      i++; | 
			
		
	
		
			
				
					|  |  |  |  |    } | 
			
		
	
		
			
				
					|  |  |  |  |    return j; | 
			
		
	
		
			
				
					|  |  |  |  |   int i = 0, j = 0; | 
			
		
	
		
			
				
					|  |  |  |  |   while (s[i]) { | 
			
		
	
		
			
				
					|  |  |  |  |     if ((s[i] & 0xc0) != 0x80) j++; | 
			
		
	
		
			
				
					|  |  |  |  |     i++; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   return j; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | int lcd_strlen_P(const char *s) { | 
			
		
	
		
			
				
					|  |  |  |  |      int j = 0; | 
			
		
	
		
			
				
					|  |  |  |  |    while (pgm_read_byte(s)) { | 
			
		
	
		
			
				
					|  |  |  |  |      if ((pgm_read_byte(s) & 0xc0) != 0x80) j++; | 
			
		
	
		
			
				
					|  |  |  |  |      s++; | 
			
		
	
		
			
				
					|  |  |  |  |    } | 
			
		
	
		
			
				
					|  |  |  |  |    return j; | 
			
		
	
		
			
				
					|  |  |  |  |   int j = 0; | 
			
		
	
		
			
				
					|  |  |  |  |   while (pgm_read_byte(s)) { | 
			
		
	
		
			
				
					|  |  |  |  |     if ((pgm_read_byte(s) & 0xc0) != 0x80) j++; | 
			
		
	
		
			
				
					|  |  |  |  |     s++; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   return j; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_update() { | 
			
		
	
		
			
				
					|  |  |  |  |   static unsigned long timeoutToStatus = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_update() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     static unsigned long timeoutToStatus = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef LCD_HAS_SLOW_BUTTONS | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef LCD_HAS_SLOW_BUTTONS | 
			
		
	
		
			
				
					|  |  |  |  |     slow_buttons = lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_buttons_update(); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_buttons_update(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #if (SDCARDDETECT > 0) | 
			
		
	
		
			
				
					|  |  |  |  |     if((IS_SD_INSERTED != lcd_oldcardstatus && lcd_detected())) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_oldcardstatus = IS_SD_INSERTED; | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_init( // to maybe revive the LCD if static electricity killed it.
 | 
			
		
	
		
			
				
					|  |  |  |  |           #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) && !defined(DOGLCD) | 
			
		
	
		
			
				
					|  |  |  |  |             currentMenu == lcd_status_screen | 
			
		
	
		
			
				
					|  |  |  |  |           #endif | 
			
		
	
		
			
				
					|  |  |  |  |         ); | 
			
		
	
		
			
				
					|  |  |  |  |   #if (SDCARDDETECT > 0) | 
			
		
	
		
			
				
					|  |  |  |  |     if (IS_SD_INSERTED != lcd_oldcardstatus && lcd_detected()) { | 
			
		
	
		
			
				
					|  |  |  |  |       lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |       lcd_oldcardstatus = IS_SD_INSERTED; | 
			
		
	
		
			
				
					|  |  |  |  |       lcd_implementation_init( // to maybe revive the LCD if static electricity killed it.
 | 
			
		
	
		
			
				
					|  |  |  |  |         #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) && !defined(DOGLCD) | 
			
		
	
		
			
				
					|  |  |  |  |           currentMenu == lcd_status_screen | 
			
		
	
		
			
				
					|  |  |  |  |         #endif | 
			
		
	
		
			
				
					|  |  |  |  |       ); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if(lcd_oldcardstatus) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             card.initsd(); | 
			
		
	
		
			
				
					|  |  |  |  |             LCD_MESSAGEPGM(MSG_SD_INSERTED); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         else | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             card.release(); | 
			
		
	
		
			
				
					|  |  |  |  |             LCD_MESSAGEPGM(MSG_SD_REMOVED); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |       if (lcd_oldcardstatus) { | 
			
		
	
		
			
				
					|  |  |  |  |         card.initsd(); | 
			
		
	
		
			
				
					|  |  |  |  |         LCD_MESSAGEPGM(MSG_SD_INSERTED); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |       else { | 
			
		
	
		
			
				
					|  |  |  |  |         card.release(); | 
			
		
	
		
			
				
					|  |  |  |  |         LCD_MESSAGEPGM(MSG_SD_REMOVED); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     #endif//CARDINSERTED
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif//CARDINSERTED
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcd_next_update_millis < millis()) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 		#ifdef REPRAPWORLD_KEYPAD | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_z_up(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_z_down(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_x_left(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_x_right(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_y_down(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_y_up(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  |         	if (REPRAPWORLD_KEYPAD_MOVE_HOME) { | 
			
		
	
		
			
				
					|  |  |  |  |         		reprapworld_keypad_move_home(); | 
			
		
	
		
			
				
					|  |  |  |  |         	} | 
			
		
	
		
			
				
					|  |  |  |  | 		#endif | 
			
		
	
		
			
				
					|  |  |  |  |         if (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |       int32_t encoderMultiplier = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef ENCODER_RATE_MULTIPLIER | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (encoderRateMultiplierEnabled) { | 
			
		
	
		
			
				
					|  |  |  |  |       int32_t encoderMovementSteps = abs(encoderDiff) / ENCODER_PULSES_PER_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       if (lastEncoderMovementMillis != 0) { | 
			
		
	
		
			
				
					|  |  |  |  |         // Note that the rate is always calculated between to passes through the 
 | 
			
		
	
		
			
				
					|  |  |  |  |         // loop and that the abs of the encoderDiff value is tracked.
 | 
			
		
	
		
			
				
					|  |  |  |  |         float encoderStepRate = | 
			
		
	
		
			
				
					|  |  |  |  |           (float)(encoderMovementSteps) / ((float)(millis() - lastEncoderMovementMillis)) * 1000.0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC)     encoderMultiplier = 100; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |         #ifdef ENCODER_RATE_MULTIPLIER_DEBUG | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO_START; | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO("Enc Step Rate: "); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO(encoderStepRate); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO("  Multiplier: "); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO(encoderMultiplier); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO("  ENCODER_10X_STEPS_PER_SEC: "); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO(ENCODER_10X_STEPS_PER_SEC); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHO("  ENCODER_100X_STEPS_PER_SEC: "); | 
			
		
	
		
			
				
					|  |  |  |  |           SERIAL_ECHOLN(ENCODER_100X_STEPS_PER_SEC); | 
			
		
	
		
			
				
					|  |  |  |  |         #endif //ENCODER_RATE_MULTIPLIER_DEBUG
 | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |   long ms = millis(); | 
			
		
	
		
			
				
					|  |  |  |  |   if (ms > lcd_next_update_millis) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       lastEncoderMovementMillis = millis(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //ENCODER_RATE_MULTIPLIER
 | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |       #ifdef REPRAPWORLD_KEYPAD | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_Z_UP)     reprapworld_keypad_move_z_up(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN)   reprapworld_keypad_move_z_down(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT)   reprapworld_keypad_move_x_left(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT)  reprapworld_keypad_move_x_right(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN)   reprapworld_keypad_move_y_down(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_Y_UP)     reprapworld_keypad_move_y_up(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (REPRAPWORLD_KEYPAD_MOVE_HOME)     reprapworld_keypad_move_home(); | 
			
		
	
		
			
				
					|  |  |  |  |       #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |             encoderPosition += (encoderDiff * encoderMultiplier) / ENCODER_PULSES_PER_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |             encoderDiff = 0; | 
			
		
	
		
			
				
					|  |  |  |  |             timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; | 
			
		
	
		
			
				
					|  |  |  |  |       bool encoderPastThreshold = (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP); | 
			
		
	
		
			
				
					|  |  |  |  |       if (encoderPastThreshold || LCD_CLICKED) { | 
			
		
	
		
			
				
					|  |  |  |  |         if (encoderPastThreshold) { | 
			
		
	
		
			
				
					|  |  |  |  |           int32_t encoderMultiplier = 1; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           #ifdef ENCODER_RATE_MULTIPLIER | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (encoderRateMultiplierEnabled) { | 
			
		
	
		
			
				
					|  |  |  |  |               int32_t encoderMovementSteps = abs(encoderDiff) / ENCODER_PULSES_PER_STEP; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |               if (lastEncoderMovementMillis != 0) { | 
			
		
	
		
			
				
					|  |  |  |  |                 // Note that the rate is always calculated between to passes through the 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 // loop and that the abs of the encoderDiff value is tracked.
 | 
			
		
	
		
			
				
					|  |  |  |  |                 float encoderStepRate = (float)(encoderMovementSteps) / ((float)(ms - lastEncoderMovementMillis)) * 1000.0; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC)     encoderMultiplier = 100; | 
			
		
	
		
			
				
					|  |  |  |  |                 else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |                 #ifdef ENCODER_RATE_MULTIPLIER_DEBUG | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO_START; | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO("Enc Step Rate: "); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO(encoderStepRate); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO("  Multiplier: "); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO(encoderMultiplier); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO("  ENCODER_10X_STEPS_PER_SEC: "); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO(ENCODER_10X_STEPS_PER_SEC); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHO("  ENCODER_100X_STEPS_PER_SEC: "); | 
			
		
	
		
			
				
					|  |  |  |  |                   SERIAL_ECHOLN(ENCODER_100X_STEPS_PER_SEC); | 
			
		
	
		
			
				
					|  |  |  |  |                 #endif //ENCODER_RATE_MULTIPLIER_DEBUG
 | 
			
		
	
		
			
				
					|  |  |  |  |               } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |               lastEncoderMovementMillis = ms; | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |           #endif //ENCODER_RATE_MULTIPLIER
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |           lcdDrawUpdate = 1; | 
			
		
	
		
			
				
					|  |  |  |  |           encoderPosition += (encoderDiff * encoderMultiplier) / ENCODER_PULSES_PER_STEP; | 
			
		
	
		
			
				
					|  |  |  |  |           encoderDiff = 0; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         if (LCD_CLICKED) | 
			
		
	
		
			
				
					|  |  |  |  |             timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; | 
			
		
	
		
			
				
					|  |  |  |  | #endif//ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DOGLCD        // Changes due to different driver architecture of the DOGM display
 | 
			
		
	
		
			
				
					|  |  |  |  |         blink++;     // Variable for fan animation and alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.firstPage(); | 
			
		
	
		
			
				
					|  |  |  |  |         do | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             u8g.setFont(FONT_MENU); | 
			
		
	
		
			
				
					|  |  |  |  |             u8g.setPrintPos(125,0); | 
			
		
	
		
			
				
					|  |  |  |  |             if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |             u8g.drawPixel(127,63); // draw alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |             u8g.setColorIndex(1); // black on white
 | 
			
		
	
		
			
				
					|  |  |  |  |             (*currentMenu)(); | 
			
		
	
		
			
				
					|  |  |  |  |             if (!lcdDrawUpdate)  break; // Terminate display update, when nothing new to draw. This must be done before the last dogm.next()
 | 
			
		
	
		
			
				
					|  |  |  |  |         } while( u8g.nextPage() ); | 
			
		
	
		
			
				
					|  |  |  |  | #else | 
			
		
	
		
			
				
					|  |  |  |  |         timeoutToStatus = ms + LCD_TIMEOUT_TO_STATUS; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #endif //ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef DOGLCD  // Changes due to different driver architecture of the DOGM display
 | 
			
		
	
		
			
				
					|  |  |  |  |       blink++;     // Variable for fan animation and alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |       u8g.firstPage(); | 
			
		
	
		
			
				
					|  |  |  |  |       do { | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.setFont(FONT_MENU); | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.setPrintPos(125, 0); | 
			
		
	
		
			
				
					|  |  |  |  |         if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.drawPixel(127, 63); // draw alive dot
 | 
			
		
	
		
			
				
					|  |  |  |  |         u8g.setColorIndex(1); // black on white
 | 
			
		
	
		
			
				
					|  |  |  |  |         (*currentMenu)(); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |         if (!lcdDrawUpdate) break; // Terminate display update, when nothing new to draw. This must be done before the last dogm.next()
 | 
			
		
	
		
			
				
					|  |  |  |  |       } while( u8g.nextPage() ); | 
			
		
	
		
			
				
					|  |  |  |  |     #else | 
			
		
	
		
			
				
					|  |  |  |  |       (*currentMenu)(); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef LCD_HAS_STATUS_INDICATORS | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_implementation_update_indicators(); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef LCD_HAS_STATUS_INDICATORS | 
			
		
	
		
			
				
					|  |  |  |  |       lcd_implementation_update_indicators(); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  |         if(timeoutToStatus < millis() && currentMenu != lcd_status_screen) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |             lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |             lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  | #endif//ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  |         if (lcdDrawUpdate == 2) lcd_implementation_clear(); | 
			
		
	
		
			
				
					|  |  |  |  |         if (lcdDrawUpdate) lcdDrawUpdate--; | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  |       if (currentMenu != lcd_status_screen && millis() > timeoutToStatus) { | 
			
		
	
		
			
				
					|  |  |  |  |         lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  |         lcdDrawUpdate = 2; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     #endif //ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate == 2) lcd_implementation_clear(); | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcdDrawUpdate) lcdDrawUpdate--; | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_ignore_click(bool b) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     ignore_click = b; | 
			
		
	
		
			
				
					|  |  |  |  |     wait_for_unclick = false; | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_ignore_click(bool b) { | 
			
		
	
		
			
				
					|  |  |  |  |   ignore_click = b; | 
			
		
	
		
			
				
					|  |  |  |  |   wait_for_unclick = false; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_finishstatus() { | 
			
		
	
	
		
			
				
					|  |  |  | @ -1521,145 +1362,122 @@ void lcd_finishstatus() { | 
			
		
	
		
			
				
					|  |  |  |  |     message_millis = millis();  //get status message to show up for a while
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setstatus(const char* message) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcd_status_message_level > 0) | 
			
		
	
		
			
				
					|  |  |  |  |         return; | 
			
		
	
		
			
				
					|  |  |  |  |     strncpy(lcd_status_message, message, LCD_WIDTH); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_finishstatus(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setstatus(const char* message) { | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcd_status_message_level > 0) return; | 
			
		
	
		
			
				
					|  |  |  |  |   strncpy(lcd_status_message, message, LCD_WIDTH); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_finishstatus(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setstatuspgm(const char* message) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     if (lcd_status_message_level > 0) | 
			
		
	
		
			
				
					|  |  |  |  |         return; | 
			
		
	
		
			
				
					|  |  |  |  |     strncpy_P(lcd_status_message, message, LCD_WIDTH); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_finishstatus(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setstatuspgm(const char* message) { | 
			
		
	
		
			
				
					|  |  |  |  |   if (lcd_status_message_level > 0) return; | 
			
		
	
		
			
				
					|  |  |  |  |   strncpy_P(lcd_status_message, message, LCD_WIDTH); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_finishstatus(); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setalertstatuspgm(const char* message) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_setstatuspgm(message); | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_status_message_level = 1; | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setalertstatuspgm(const char* message) { | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_setstatuspgm(message); | 
			
		
	
		
			
				
					|  |  |  |  |   lcd_status_message_level = 1; | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_return_to_status(); | 
			
		
	
		
			
				
					|  |  |  |  | #endif//ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_reset_alert_level() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_status_message_level = 0; | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_reset_alert_level() { lcd_status_message_level = 0; } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef DOGLCD | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_setcontrast(uint8_t value) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |   void lcd_setcontrast(uint8_t value) { | 
			
		
	
		
			
				
					|  |  |  |  |     lcd_contrast = value & 63; | 
			
		
	
		
			
				
					|  |  |  |  |     u8g.setContrast(lcd_contrast); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef ULTIPANEL | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* Warning: This function is called from interrupt context */ | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_buttons_update() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef NEWPANEL | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t newbutton=0; | 
			
		
	
		
			
				
					|  |  |  |  |     if(READ(BTN_EN1)==0)  newbutton|=EN_A; | 
			
		
	
		
			
				
					|  |  |  |  |     if(READ(BTN_EN2)==0)  newbutton|=EN_B; | 
			
		
	
		
			
				
					|  |  |  |  |   #if BTN_ENC > 0 | 
			
		
	
		
			
				
					|  |  |  |  |     if((blocking_enc<millis()) && (READ(BTN_ENC)==0)) | 
			
		
	
		
			
				
					|  |  |  |  |         newbutton |= EN_C; | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_buttons_update() { | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef NEWPANEL | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t newbutton = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     if (READ(BTN_EN1) == 0) newbutton |= EN_A; | 
			
		
	
		
			
				
					|  |  |  |  |     if (READ(BTN_EN2) == 0) newbutton |= EN_B; | 
			
		
	
		
			
				
					|  |  |  |  |     #if BTN_ENC > 0 | 
			
		
	
		
			
				
					|  |  |  |  |       if (millis() > blocking_enc && READ(BTN_ENC) == 0) newbutton |= EN_C; | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     buttons = newbutton; | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef LCD_HAS_SLOW_BUTTONS | 
			
		
	
		
			
				
					|  |  |  |  |     buttons |= slow_buttons; | 
			
		
	
		
			
				
					|  |  |  |  |       buttons |= slow_buttons; | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |     #ifdef REPRAPWORLD_KEYPAD | 
			
		
	
		
			
				
					|  |  |  |  |       // for the reprapworld_keypad
 | 
			
		
	
		
			
				
					|  |  |  |  |       uint8_t newbutton_reprapworld_keypad=0; | 
			
		
	
		
			
				
					|  |  |  |  |       WRITE(SHIFT_LD,LOW); | 
			
		
	
		
			
				
					|  |  |  |  |       WRITE(SHIFT_LD,HIGH); | 
			
		
	
		
			
				
					|  |  |  |  |       for(int8_t i=0;i<8;i++) { | 
			
		
	
		
			
				
					|  |  |  |  |           newbutton_reprapworld_keypad = newbutton_reprapworld_keypad>>1; | 
			
		
	
		
			
				
					|  |  |  |  |           if(READ(SHIFT_OUT)) | 
			
		
	
		
			
				
					|  |  |  |  |               newbutton_reprapworld_keypad|=(1<<7); | 
			
		
	
		
			
				
					|  |  |  |  |           WRITE(SHIFT_CLK,HIGH); | 
			
		
	
		
			
				
					|  |  |  |  |           WRITE(SHIFT_CLK,LOW); | 
			
		
	
		
			
				
					|  |  |  |  |       WRITE(SHIFT_LD, LOW); | 
			
		
	
		
			
				
					|  |  |  |  |       WRITE(SHIFT_LD, HIGH); | 
			
		
	
		
			
				
					|  |  |  |  |       for(int8_t i = 0; i < 8; i++) { | 
			
		
	
		
			
				
					|  |  |  |  |         newbutton_reprapworld_keypad >>= 1; | 
			
		
	
		
			
				
					|  |  |  |  |         if (READ(SHIFT_OUT)) newbutton_reprapworld_keypad |= (1 << 7); | 
			
		
	
		
			
				
					|  |  |  |  |         WRITE(SHIFT_CLK, HIGH); | 
			
		
	
		
			
				
					|  |  |  |  |         WRITE(SHIFT_CLK, LOW); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |       buttons_reprapworld_keypad=~newbutton_reprapworld_keypad; //invert it, because a pressed switch produces a logical 0
 | 
			
		
	
		
			
				
					|  |  |  |  | 	#endif | 
			
		
	
		
			
				
					|  |  |  |  | #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); | 
			
		
	
		
			
				
					|  |  |  |  |     #endif | 
			
		
	
		
			
				
					|  |  |  |  |   #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 >>= 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//!NEWPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     //manage encoder rotation
 | 
			
		
	
		
			
				
					|  |  |  |  |     uint8_t enc=0; | 
			
		
	
		
			
				
					|  |  |  |  |     if (buttons & EN_A) enc |= B01; | 
			
		
	
		
			
				
					|  |  |  |  |     if (buttons & EN_B) enc |= B10; | 
			
		
	
		
			
				
					|  |  |  |  |     if(enc != lastEncoderBits) | 
			
		
	
		
			
				
					|  |  |  |  |     { | 
			
		
	
		
			
				
					|  |  |  |  |         switch(enc) | 
			
		
	
		
			
				
					|  |  |  |  |         { | 
			
		
	
		
			
				
					|  |  |  |  |         case encrot0: | 
			
		
	
		
			
				
					|  |  |  |  |             if(lastEncoderBits==encrot3) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |             else if(lastEncoderBits==encrot1) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |  |         case encrot1: | 
			
		
	
		
			
				
					|  |  |  |  |             if(lastEncoderBits==encrot0) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |             else if(lastEncoderBits==encrot2) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |  |         case encrot2: | 
			
		
	
		
			
				
					|  |  |  |  |             if(lastEncoderBits==encrot1) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |             else if(lastEncoderBits==encrot3) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |  |         case encrot3: | 
			
		
	
		
			
				
					|  |  |  |  |             if(lastEncoderBits==encrot2) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |             else if(lastEncoderBits==encrot0) | 
			
		
	
		
			
				
					|  |  |  |  |                 encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |             break; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     buttons = ~newbutton; //invert it, because a pressed switch produces a logical 0
 | 
			
		
	
		
			
				
					|  |  |  |  |   #endif //!NEWPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   //manage encoder rotation
 | 
			
		
	
		
			
				
					|  |  |  |  |   uint8_t enc=0; | 
			
		
	
		
			
				
					|  |  |  |  |   if (buttons & EN_A) enc |= B01; | 
			
		
	
		
			
				
					|  |  |  |  |   if (buttons & EN_B) enc |= B10; | 
			
		
	
		
			
				
					|  |  |  |  |   if (enc != lastEncoderBits) { | 
			
		
	
		
			
				
					|  |  |  |  |     switch(enc) { | 
			
		
	
		
			
				
					|  |  |  |  |       case encrot0: | 
			
		
	
		
			
				
					|  |  |  |  |         if (lastEncoderBits==encrot3) encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (lastEncoderBits==encrot1) encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       case encrot1: | 
			
		
	
		
			
				
					|  |  |  |  |         if (lastEncoderBits==encrot0) encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (lastEncoderBits==encrot2) encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       case encrot2: | 
			
		
	
		
			
				
					|  |  |  |  |         if (lastEncoderBits==encrot1) encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (lastEncoderBits==encrot3) encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |       case encrot3: | 
			
		
	
		
			
				
					|  |  |  |  |         if (lastEncoderBits==encrot2) encoderDiff++; | 
			
		
	
		
			
				
					|  |  |  |  |         else if (lastEncoderBits==encrot0) encoderDiff--; | 
			
		
	
		
			
				
					|  |  |  |  |         break; | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |     lastEncoderBits = enc; | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   lastEncoderBits = enc; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool lcd_detected(void) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | #if (defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008)) && defined(DETECT_DEVICE) | 
			
		
	
		
			
				
					|  |  |  |  |   return lcd.LcdDetected() == 1; | 
			
		
	
		
			
				
					|  |  |  |  | #else | 
			
		
	
		
			
				
					|  |  |  |  |   return true; | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | bool lcd_detected(void) { | 
			
		
	
		
			
				
					|  |  |  |  |   #if (defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008)) && defined(DETECT_DEVICE) | 
			
		
	
		
			
				
					|  |  |  |  |     return lcd.LcdDetected() == 1; | 
			
		
	
		
			
				
					|  |  |  |  |   #else | 
			
		
	
		
			
				
					|  |  |  |  |     return true; | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_buzz(long duration, uint16_t freq) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | #ifdef LCD_USE_I2C_BUZZER | 
			
		
	
		
			
				
					|  |  |  |  |   lcd.buzz(duration,freq); | 
			
		
	
		
			
				
					|  |  |  |  | #endif | 
			
		
	
		
			
				
					|  |  |  |  | void lcd_buzz(long duration, uint16_t freq) { | 
			
		
	
		
			
				
					|  |  |  |  |   #ifdef LCD_USE_I2C_BUZZER | 
			
		
	
		
			
				
					|  |  |  |  |     lcd.buzz(duration,freq); | 
			
		
	
		
			
				
					|  |  |  |  |   #endif | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | bool lcd_clicked() | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  |   return LCD_CLICKED; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | #endif//ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | bool lcd_clicked() { return LCD_CLICKED; } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | #endif //ULTIPANEL
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /********************************/ | 
			
		
	
		
			
				
					|  |  |  |  | /** Float conversion utilities **/ | 
			
		
	
	
		
			
				
					|  |  |  | 
 |