@ -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 \n M104 S50 \n G4 S1 \n M104 S200 \n G4 S2 \n M104 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 \n M300 S698 P200 " ) ) ;  
			
		
	
		
			
				
					     lcd_return_to_status ( ) ;  
			
		
	
		
			
				
					  // Audio feedback
 
 
			
		
	
		
			
				
					  enquecommands_P ( PSTR ( " M300 S659 P200 \n M300 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 \n G28 \n G1 X-77.94 Y-45 Z36 F8000 \n G4 S3 \n M701 P0 \n G1 X77.94 Y-45 Z36 \n G4 S3 \n M701 P1 \n G1 X0 Y90 Z36 \n G4 S3 \n M701 P2 \n M700 \n G1 X0 Y0 Z100 F8000 " ) ) ; 
 
			
		
	
		
			
				
					    MENU_ITEM ( gcode ,  " Check level " ,  PSTR ( " G28 \n G1 X0 Y0 Z1 F4000 \n G1 X-77.94 Y-45 Z1 \n G1 X77.94 Y-45 \n G1 X0 Y90 \n G1 X-77.94 Y-45 \n G4 S2 \n G1 X-77.94 Y-45 Z0.3 F2000 \n G1 X-77.94 Y-45 \n G1 X77.94 Y-45 \n G1 X0 Y90 \n G1 X-77.94 Y-45 \n G1 X0 Y0 Z0 " ) ) ; 
 
			
		
	
		
			
				
					    MENU_ITEM ( gcode ,  " Retract filament " ,  PSTR ( " M302 \n M82 \n G92 E0 \n G1 F4000 E-800 " ) ) ; 
 
			
		
	
		
			
				
					    MENU_ITEM ( gcode ,  " Insert filament " ,  PSTR ( " M302 \n M82 \n G92 E0 \n G1 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  
			
		
	
		
			
				
					//  
			
		
	
		
			
				
					   # ifdef DOGLCD  
			
		
	
		
			
				
					    // 
 
			
		
	
		
			
				
					    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 **/