@ -29,6 +29,47 @@
# include "stepper.h"
# include "stepper.h"
# include "configuration_store.h"
# include "configuration_store.h"
int plaPreheatHotendTemp ;
int plaPreheatHPBTemp ;
int plaPreheatFanSpeed ;
int absPreheatHotendTemp ;
int absPreheatHPBTemp ;
int absPreheatFanSpeed ;
# if ENABLED(FILAMENT_LCD_DISPLAY)
millis_t previous_lcd_status_ms = 0 ;
# endif
uint8_t lcd_status_message_level ;
char lcd_status_message [ 3 * ( LCD_WIDTH ) + 1 ] = WELCOME_MSG ; // worst case is kana with up to 3*LCD_WIDTH+1
# if ENABLED(DOGLCD)
# include "dogm_lcd_implementation.h"
# else
# include "ultralcd_implementation_hitachi_HD44780.h"
# endif
// The main status screen
static void lcd_status_screen ( ) ;
millis_t next_lcd_update_ms ;
enum LCDViewAction {
LCDVIEW_NONE ,
LCDVIEW_REDRAW_NOW ,
LCDVIEW_CALL_REDRAW_NEXT ,
LCDVIEW_CLEAR_CALL_REDRAW ,
LCDVIEW_CALL_NO_REDRAW
} ;
uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW ; // Set when the LCD needs to draw, decrements after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial)
# if ENABLED(ULTIPANEL)
// place-holders for Ki and Kd edits
float raw_Ki , raw_Kd ;
/**
/**
* REVERSE_MENU_DIRECTION
* REVERSE_MENU_DIRECTION
*
*
@ -56,35 +97,6 @@ millis_t manual_move_start_time = 0;
bool encoderRateMultiplierEnabled ;
bool encoderRateMultiplierEnabled ;
int32_t lastEncoderMovementMillis ;
int32_t lastEncoderMovementMillis ;
int plaPreheatHotendTemp ;
int plaPreheatHPBTemp ;
int plaPreheatFanSpeed ;
int absPreheatHotendTemp ;
int absPreheatHPBTemp ;
int absPreheatFanSpeed ;
# if ENABLED(FILAMENT_LCD_DISPLAY)
millis_t previous_lcd_status_ms = 0 ;
# endif
// Function pointer to menu functions.
typedef void ( * menuFunc_t ) ( ) ;
uint8_t lcd_status_message_level ;
char lcd_status_message [ 3 * ( LCD_WIDTH ) + 1 ] = WELCOME_MSG ; // worst case is kana with up to 3*LCD_WIDTH+1
# if ENABLED(DOGLCD)
# include "dogm_lcd_implementation.h"
# else
# include "ultralcd_implementation_hitachi_HD44780.h"
# endif
// The main status screen
static void lcd_status_screen ( ) ;
# if ENABLED(ULTIPANEL)
# if HAS_POWER_SWITCH
# if HAS_POWER_SWITCH
extern bool powersupply ;
extern bool powersupply ;
# endif
# endif
@ -116,7 +128,10 @@ static void lcd_status_screen();
# include "mesh_bed_leveling.h"
# include "mesh_bed_leveling.h"
# endif
# endif
/* Different types of actions that can be used in menu items. */
// Function pointer to menu functions.
typedef void ( * menuFunc_t ) ( ) ;
// Different types of actions that can be used in menu items.
static void menu_action_back ( ) ;
static void menu_action_back ( ) ;
static void menu_action_submenu ( menuFunc_t data ) ;
static void menu_action_submenu ( menuFunc_t data ) ;
static void menu_action_gcode ( const char * pgcode ) ;
static void menu_action_gcode ( const char * pgcode ) ;
@ -270,13 +285,9 @@ static void lcd_status_screen();
uint8_t lcd_sd_status ;
uint8_t lcd_sd_status ;
# endif
# endif
# endif // ULTIPANEL
typedef struct {
typedef struct {
menuFunc_t menu_function ;
menuFunc_t menu_function ;
# if ENABLED(ULTIPANEL)
uint32_t encoder_position ;
uint32_t encoder_position ;
# endif
} menuPosition ;
} menuPosition ;
menuFunc_t currentMenu = lcd_status_screen ; // pointer to the currently active menu handler
menuFunc_t currentMenu = lcd_status_screen ; // pointer to the currently active menu handler
@ -284,30 +295,16 @@ menuFunc_t currentMenu = lcd_status_screen; // pointer to the currently active m
menuPosition menu_history [ 10 ] ;
menuPosition menu_history [ 10 ] ;
uint8_t menu_history_depth = 0 ;
uint8_t menu_history_depth = 0 ;
millis_t next_lcd_update_ms ;
bool ignore_click = false ;
bool ignore_click = false ;
bool wait_for_unclick ;
bool wait_for_unclick ;
bool defer_return_to_status = false ;
bool defer_return_to_status = false ;
enum LCDViewAction {
LCDVIEW_NONE ,
LCDVIEW_REDRAW_NOW ,
LCDVIEW_CALL_REDRAW_NEXT ,
LCDVIEW_CLEAR_CALL_REDRAW ,
LCDVIEW_CALL_NO_REDRAW
} ;
uint8_t lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW ; // Set when the LCD needs to draw, decrements after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial)
// Variables used when editing values.
// Variables used when editing values.
const char * editLabel ;
const char * editLabel ;
void * editValue ;
void * editValue ;
int32_t minEditValue , maxEditValue ;
int32_t minEditValue , maxEditValue ;
menuFunc_t callbackFunc ; // call this after editing
menuFunc_t callbackFunc ; // call this after editing
// place-holders for Ki and Kd edits
float raw_Ki , raw_Kd ;
/**
/**
* General function to go directly to a menu
* General function to go directly to a menu
* Remembers the previous position
* Remembers the previous position
@ -356,6 +353,13 @@ static void lcd_goto_previous_menu(bool feedback=false) {
lcd_return_to_status ( ) ;
lcd_return_to_status ( ) ;
}
}
void lcd_ignore_click ( bool b ) {
ignore_click = b ;
wait_for_unclick = false ;
}
# endif // ULTIPANEL
/**
/**
*
*
* " Info Screen "
* " Info Screen "
@ -364,8 +368,11 @@ static void lcd_goto_previous_menu(bool feedback=false) {
*/
*/
static void lcd_status_screen ( ) {
static void lcd_status_screen ( ) {
# if ENABLED(ULTIPANEL)
ENCODER_DIRECTION_NORMAL ( ) ;
ENCODER_DIRECTION_NORMAL ( ) ;
encoderRateMultiplierEnabled = false ;
encoderRateMultiplierEnabled = false ;
# endif
# if ENABLED(LCD_PROGRESS_BAR)
# if ENABLED(LCD_PROGRESS_BAR)
millis_t ms = millis ( ) ;
millis_t ms = millis ( ) ;
@ -423,7 +430,7 @@ static void lcd_status_screen() {
if ( current_click ) {
if ( current_click ) {
lcd_goto_menu ( lcd_main_menu , true ) ;
lcd_goto_menu ( lcd_main_menu , true ) ;
lcd_implementation_init ( // to maybe revive the LCD if static electricity killed it.
lcd_implementation_init ( // to maybe revive the LCD if static electricity killed it.
# if ENABLED(LCD_PROGRESS_BAR)
# if ENABLED(LCD_PROGRESS_BAR) && ENABLED(ULTIPANEL)
currentMenu = = lcd_status_screen
currentMenu = = lcd_status_screen
# endif
# endif
) ;
) ;
@ -466,9 +473,9 @@ inline void line_to_current(AxisEnum axis) {
# if ENABLED(DELTA)
# if ENABLED(DELTA)
calculate_delta ( current_position ) ;
calculate_delta ( current_position ) ;
planner . buffer_line ( delta [ X_AXIS ] , delta [ Y_AXIS ] , delta [ Z_AXIS ] , current_position [ E_AXIS ] , manual_feedrate [ axis ] / 60 , active_extruder ) ;
planner . buffer_line ( delta [ X_AXIS ] , delta [ Y_AXIS ] , delta [ Z_AXIS ] , current_position [ E_AXIS ] , manual_feedrate [ axis ] / 60 , active_extruder ) ;
# else
# else // !DELTA
planner . buffer_line ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] , current_position [ E_AXIS ] , manual_feedrate [ axis ] / 60 , active_extruder ) ;
planner . buffer_line ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] , current_position [ E_AXIS ] , manual_feedrate [ axis ] / 60 , active_extruder ) ;
# endif
# endif // !DELTA
}
}
# if ENABLED(SDSUPPORT)
# if ENABLED(SDSUPPORT)
@ -487,7 +494,7 @@ inline void line_to_current(AxisEnum axis) {
stepper . quick_stop ( ) ;
stepper . quick_stop ( ) ;
# if DISABLED(DELTA) && DISABLED(SCARA)
# if DISABLED(DELTA) && DISABLED(SCARA)
set_current_position_from_planner ( ) ;
set_current_position_from_planner ( ) ;
# endif
# endif // !DELTA && !SCARA
clear_command_queue ( ) ;
clear_command_queue ( ) ;
card . sdprinting = false ;
card . sdprinting = false ;
card . closefile ( ) ;
card . closefile ( ) ;
@ -2158,13 +2165,12 @@ bool lcd_blink() {
* No worries . This function is only called from the main thread .
* No worries . This function is only called from the main thread .
*/
*/
void lcd_update ( ) {
void lcd_update ( ) {
# if ENABLED(ULTIPANEL)
# if ENABLED(ULTIPANEL)
static millis_t return_to_status_ms = 0 ;
static millis_t return_to_status_ms = 0 ;
manage_manual_move ( ) ;
manage_manual_move ( ) ;
# endif
# endif
lcd_buttons_update ( ) ;
lcd_buttons_update ( ) ;
# if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)
# if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)
@ -2173,7 +2179,7 @@ void lcd_update() {
if ( sd_status ! = lcd_sd_status & & lcd_detected ( ) ) {
if ( sd_status ! = lcd_sd_status & & lcd_detected ( ) ) {
lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW ;
lcdDrawUpdate = LCDVIEW_CLEAR_CALL_REDRAW ;
lcd_implementation_init ( // to maybe revive the LCD if static electricity killed it.
lcd_implementation_init ( // to maybe revive the LCD if static electricity killed it.
# if ENABLED(LCD_PROGRESS_BAR)
# if ENABLED(LCD_PROGRESS_BAR) && ENABLED(ULTIPANEL)
currentMenu = = lcd_status_screen
currentMenu = = lcd_status_screen
# endif
# endif
) ;
) ;
@ -2272,7 +2278,11 @@ void lcd_update() {
// We arrive here every ~100ms when idling often enough.
// We arrive here every ~100ms when idling often enough.
// Instead of tracking the changes simply redraw the Info Screen ~1 time a second.
// Instead of tracking the changes simply redraw the Info Screen ~1 time a second.
static int8_t lcd_status_update_delay = 1 ; // first update one loop delayed
static int8_t lcd_status_update_delay = 1 ; // first update one loop delayed
if ( currentMenu = = lcd_status_screen & & ! lcd_status_update_delay - - ) {
if (
# if ENABLED(ULTIPANEL)
currentMenu = = lcd_status_screen & &
# endif
! lcd_status_update_delay - - ) {
lcd_status_update_delay = 9 ;
lcd_status_update_delay = 9 ;
lcdDrawUpdate = LCDVIEW_REDRAW_NOW ;
lcdDrawUpdate = LCDVIEW_REDRAW_NOW ;
}
}
@ -2301,10 +2311,18 @@ void lcd_update() {
u8g . setColorIndex ( dot_color ) ; // Set color for the alive dot
u8g . setColorIndex ( dot_color ) ; // Set color for the alive dot
u8g . drawPixel ( 127 , 63 ) ; // draw alive dot
u8g . drawPixel ( 127 , 63 ) ; // draw alive dot
u8g . setColorIndex ( 1 ) ; // black on white
u8g . setColorIndex ( 1 ) ; // black on white
# if ENABLED(ULTIPANEL)
( * currentMenu ) ( ) ;
( * currentMenu ) ( ) ;
# else
lcd_status_screen ( ) ;
# endif
} while ( u8g . nextPage ( ) ) ;
} while ( u8g . nextPage ( ) ) ;
# else
# else
# if ENABLED(ULTIPANEL)
( * currentMenu ) ( ) ;
( * currentMenu ) ( ) ;
# else
lcd_status_screen ( ) ;
# endif
# endif
# endif
}
}
@ -2334,11 +2352,6 @@ void lcd_update() {
}
}
}
}
void lcd_ignore_click ( bool b ) {
ignore_click = b ;
wait_for_unclick = false ;
}
void lcd_finishstatus ( bool persist = false ) {
void lcd_finishstatus ( bool persist = false ) {
# if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE > 0))
# if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE > 0))
UNUSED ( persist ) ;
UNUSED ( persist ) ;