2018-09-19 15:22:06 +00:00
//! @file
2019-09-01 07:51:51 +00:00
//! @date Aug 28, 2019
//! @author mkbel
//! @brief LCD
2018-09-19 15:22:06 +00:00
2016-07-22 13:28:01 +00:00
# include "temperature.h"
# include "ultralcd.h"
2018-07-11 18:45:56 +00:00
# include "fsensor.h"
2016-07-22 13:28:01 +00:00
# include "Marlin.h"
# include "language.h"
# include "cardreader.h"
# include "temperature.h"
# include "stepper.h"
# include "ConfigurationStore.h"
2019-01-28 20:54:44 +00:00
# include "printers.h"
2016-07-22 13:28:01 +00:00
# include <string.h>
2018-07-16 00:13:52 +00:00
# include "lcd.h"
# include "menu.h"
2019-10-11 16:06:37 +00:00
# include "backlight.h"
2018-07-16 00:13:52 +00:00
2016-07-22 13:28:01 +00:00
# include "util.h"
2016-08-31 15:12:05 +00:00
# include "mesh_bed_leveling.h"
2018-07-16 15:23:35 +00:00
# include "mesh_bed_calibration.h"
2016-07-22 13:28:01 +00:00
//#include "Configuration.h"
2017-11-07 15:49:04 +00:00
# include "cmdqueue.h"
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
# include "SdFatUtil.h"
2017-08-17 13:23:34 +00:00
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2017-06-17 18:40:22 +00:00
# include "pat9125.h"
2018-07-20 21:48:00 +00:00
# include "fsensor.h"
# endif //FILAMENT_SENSOR
2016-07-22 13:28:01 +00:00
2017-08-17 13:23:34 +00:00
# ifdef TMC2130
2017-07-03 05:43:50 +00:00
# include "tmc2130.h"
2017-08-17 13:23:34 +00:00
# endif //TMC2130
2017-07-03 05:43:50 +00:00
2018-07-23 18:04:47 +00:00
# include "sound.h"
2018-08-02 16:54:00 +00:00
# include "mmu.h"
2016-07-22 13:28:01 +00:00
2018-09-27 17:59:29 +00:00
# include "static_assert.h"
2018-12-12 23:12:00 +00:00
# include "io_atmega2560.h"
2019-06-10 18:41:18 +00:00
# include "first_lay_cal.h"
2018-09-27 17:59:29 +00:00
2019-09-15 22:43:37 +00:00
# include "fsensor.h"
# include "adc.h"
# include "config.h"
2020-04-28 15:35:28 +00:00
# ifndef LA_NOCOMPAT
# include "la10compat.h"
# endif
2017-12-28 17:59:57 +00:00
2018-07-16 00:13:52 +00:00
int scrollstuff = 0 ;
char longFilenameOLD [ LONG_FILENAME_LENGTH ] ;
2018-03-06 18:47:27 +00:00
2016-08-11 08:42:53 +00:00
2017-03-24 18:47:50 +00:00
static void lcd_sd_updir ( ) ;
2019-03-08 14:43:37 +00:00
static void lcd_mesh_bed_leveling_settings ( ) ;
2019-10-17 10:11:32 +00:00
static void lcd_backlight_menu ( ) ;
2017-03-24 18:47:50 +00:00
2016-07-22 13:28:01 +00:00
int8_t ReInitLCD = 0 ;
2018-04-25 18:47:19 +00:00
int8_t SilentModeMenu = SILENT_MODE_OFF ;
2019-03-10 15:03:46 +00:00
uint8_t SilentModeMenu_MMU = 1 ; //activate mmu unit stealth mode
2016-07-22 13:28:01 +00:00
2017-09-26 01:21:33 +00:00
int8_t FSensorStateMenu = 1 ;
2017-09-22 17:28:32 +00:00
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2020-03-02 18:07:23 +00:00
bool bMenuFSDetect = false ;
# endif //IR_SENSOR_ANALOG
2017-07-07 02:45:09 +00:00
2017-12-11 10:30:49 +00:00
# ifdef SDCARD_SORT_ALPHA
2018-08-19 16:34:57 +00:00
bool presort_flag = false ;
2017-12-11 10:30:49 +00:00
# endif
2019-06-12 16:19:41 +00:00
LcdCommands lcd_commands_type = LcdCommands : : Idle ;
2019-06-11 15:25:52 +00:00
static uint8_t lcd_commands_step = 0 ;
2018-08-19 16:34:57 +00:00
2019-06-12 16:42:55 +00:00
CustomMsg custom_message_type = CustomMsg : : Status ;
2018-08-19 16:34:57 +00:00
unsigned int custom_message_state = 0 ;
2016-07-22 13:28:01 +00:00
bool isPrintPaused = false ;
2017-03-24 18:47:50 +00:00
uint8_t farm_mode = 0 ;
2016-07-22 13:28:01 +00:00
int farm_no = 0 ;
2018-03-15 13:25:17 +00:00
int farm_timer = 8 ;
2019-06-12 07:58:42 +00:00
uint8_t farm_status = 0 ;
2017-03-24 18:47:50 +00:00
bool printer_connected = true ;
2016-07-22 13:28:01 +00:00
2017-06-29 16:35:43 +00:00
unsigned long display_time ; //just timer for showing pid finished message on lcd;
float pid_temp = DEFAULT_PID_TEMP ;
2016-07-22 13:28:01 +00:00
2018-07-22 14:26:12 +00:00
static bool forceMenuExpire = false ;
2018-11-05 16:43:07 +00:00
static bool lcd_autoDeplete ;
2016-07-22 13:28:01 +00:00
static float manual_feedrate [ ] = MANUAL_FEEDRATE ;
/* !Configuration settings */
uint8_t lcd_status_message_level ;
char lcd_status_message [ LCD_WIDTH + 1 ] = " " ; //////WELCOME!
unsigned char firstrun = 1 ;
2019-09-12 15:54:05 +00:00
static uint8_t lay1cal_filament = 0 ;
2016-07-22 13:28:01 +00:00
2018-04-18 22:49:42 +00:00
static const char separator [ ] PROGMEM = " -------------------- " ;
2016-07-22 13:28:01 +00:00
/** forward declarations **/
2018-04-25 14:51:35 +00:00
static const char * lcd_display_message_fullscreen_nonBlocking_P ( const char * msg , uint8_t & nlines ) ;
2016-08-11 08:42:53 +00:00
// void copy_and_scalePID_i();
// void copy_and_scalePID_d();
2016-07-22 13:28:01 +00:00
/* Different menus */
2020-03-02 18:07:23 +00:00
//static void lcd_status_screen(); // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
2019-07-29 12:55:42 +00:00
# if (LANG_MODE != 0)
2018-07-23 11:35:38 +00:00
static void lcd_language_menu ( ) ;
2019-07-29 12:55:42 +00:00
# endif
2016-07-22 13:28:01 +00:00
static void lcd_main_menu ( ) ;
static void lcd_tune_menu ( ) ;
2017-09-22 17:28:32 +00:00
//static void lcd_move_menu();
2016-07-22 13:28:01 +00:00
static void lcd_settings_menu ( ) ;
2016-08-11 08:42:53 +00:00
static void lcd_calibration_menu ( ) ;
2016-07-22 13:28:01 +00:00
static void lcd_control_temperature_menu ( ) ;
2018-08-24 18:31:49 +00:00
static void lcd_settings_linearity_correction_menu_save ( ) ;
2016-07-22 13:28:01 +00:00
static void prusa_stat_printerstatus ( int _status ) ;
2017-03-24 18:47:50 +00:00
static void prusa_stat_farm_number ( ) ;
2019-04-09 13:22:08 +00:00
static void prusa_stat_diameter ( ) ;
2016-07-22 13:28:01 +00:00
static void prusa_stat_temperatures ( ) ;
static void prusa_stat_printinfo ( ) ;
static void lcd_farm_no ( ) ;
2018-04-18 21:30:01 +00:00
static void lcd_menu_xyz_y_min ( ) ;
static void lcd_menu_xyz_skew ( ) ;
2018-04-19 12:17:46 +00:00
static void lcd_menu_xyz_offset ( ) ;
2018-12-18 16:38:24 +00:00
static void lcd_menu_fails_stats_mmu ( ) ;
static void lcd_menu_fails_stats_mmu_print ( ) ;
static void lcd_menu_fails_stats_mmu_total ( ) ;
2019-09-12 16:40:02 +00:00
static void mmu_unload_filament ( ) ;
2019-10-01 19:04:00 +00:00
static void lcd_v2_calibration ( ) ;
2019-03-11 19:43:07 +00:00
//static void lcd_menu_show_sensors_state(); // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
2018-12-18 16:38:24 +00:00
2019-02-13 22:53:00 +00:00
static void mmu_fil_eject_menu ( ) ;
static void mmu_load_to_nozzle_menu ( ) ;
2019-09-12 16:53:24 +00:00
static void preheat_or_continue ( ) ;
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-02-26 16:58:00 +00:00
static void mmu_cut_filament_menu ( ) ;
2019-03-15 02:38:37 +00:00
# endif //MMU_HAS_CUTTER
2019-02-13 22:53:00 +00:00
2018-07-22 14:14:13 +00:00
# if defined(TMC2130) || defined(FILAMENT_SENSOR)
2017-09-26 13:14:17 +00:00
static void lcd_menu_fails_stats ( ) ;
2018-07-22 14:14:13 +00:00
# endif //TMC2130 or FILAMENT_SENSOR
2017-09-26 13:14:17 +00:00
2019-06-20 08:17:48 +00:00
# ifdef TMC2130
2019-06-19 22:09:55 +00:00
static void lcd_belttest_v ( ) ;
2019-06-20 08:17:48 +00:00
# endif //TMC2130
2018-07-23 11:35:38 +00:00
static void lcd_selftest_v ( ) ;
# ifdef TMC2130
2018-10-08 13:58:49 +00:00
static void reset_crash_det ( unsigned char axis ) ;
static bool lcd_selfcheck_axis_sg ( unsigned char axis ) ;
2018-07-23 11:35:38 +00:00
static bool lcd_selfcheck_axis ( int _axis , int _travel ) ;
# else
static bool lcd_selfcheck_axis ( int _axis , int _travel ) ;
static bool lcd_selfcheck_pulleys ( int axis ) ;
# endif //TMC2130
2020-04-01 09:28:39 +00:00
static bool lcd_selfcheck_endstops ( ) ;
2018-07-23 11:35:38 +00:00
static bool lcd_selfcheck_check_heater ( bool _isbed ) ;
2019-06-12 14:44:07 +00:00
enum class TestScreen : uint_least8_t
{
ExtruderFan ,
PrintFan ,
FansOk ,
EndStops ,
AxisX ,
AxisY ,
AxisZ ,
Bed ,
Hotend ,
HotendOk ,
Fsensor ,
FsensorOk ,
AllCorrect ,
Failed ,
Home ,
2019-01-25 19:00:12 +00:00
} ;
2019-03-21 21:48:57 +00:00
enum class TestError : uint_least8_t
{
2019-06-12 16:53:09 +00:00
Heater ,
Bed ,
Endstops ,
Motor ,
Endstop ,
PrintFan ,
ExtruderFan ,
Pulley ,
Axis ,
SwappedFan ,
WiringFsensor ,
TriggeringFsensor ,
2019-09-15 22:43:37 +00:00
FsensorLevel
2019-03-21 21:48:57 +00:00
} ;
2019-06-12 14:44:07 +00:00
static int lcd_selftest_screen ( TestScreen screen , int _progress , int _progress_scale , bool _clear , int _delay ) ;
2018-07-23 11:35:38 +00:00
static void lcd_selftest_screen_step ( int _row , int _col , int _state , const char * _name , const char * _indicator ) ;
2019-05-10 06:52:24 +00:00
static bool lcd_selftest_manual_fan_check ( int _fan , bool check_opposite ,
bool _default = false ) ;
2019-02-06 15:27:44 +00:00
# ifdef FANCHECK
2019-05-13 14:25:47 +00:00
/** Enumerate for lcd_selftest_fan_auto function.
*/
enum class FanCheck : uint_least8_t {
2019-06-12 15:19:19 +00:00
Success ,
PrintFan ,
ExtruderFan ,
SwappedFan ,
2019-05-13 14:25:47 +00:00
} ;
/**
* Try to check fan working and wiring .
*
* @ param _fan i fan number 0 means extruder fan , 1 means print fan .
*
* @ returns a TestError noerror , extruderFan , printFan or swappedFan .
*/
static FanCheck lcd_selftest_fan_auto ( int _fan ) ;
2019-02-06 15:27:44 +00:00
# endif //FANCHECK
2019-05-13 14:25:47 +00:00
2019-03-01 16:21:13 +00:00
# ifdef PAT9125
2018-07-23 11:35:38 +00:00
static bool lcd_selftest_fsensor ( ) ;
2019-03-01 16:21:13 +00:00
# endif //PAT9125
2019-01-22 09:56:07 +00:00
static bool selftest_irsensor ( ) ;
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2020-03-02 18:07:23 +00:00
static bool lcd_selftest_IRsensor ( bool bStandalone = false ) ;
static void lcd_detect_IRsensor ( ) ;
2019-09-15 22:43:37 +00:00
# endif //IR_SENSOR_ANALOG
2019-03-21 21:48:57 +00:00
static void lcd_selftest_error ( TestError error , const char * _error_1 , const char * _error_2 ) ;
2018-07-23 11:35:38 +00:00
static void lcd_colorprint_change ( ) ;
2018-10-08 13:58:49 +00:00
# ifdef SNMM
static int get_ext_nr ( ) ;
# endif //SNMM
# if defined (SNMM) || defined(SNMM_V2)
2018-07-23 11:35:38 +00:00
static void fil_load_menu ( ) ;
static void fil_unload_menu ( ) ;
2018-10-08 13:58:49 +00:00
# endif // SNMM || SNMM_V2
2018-07-23 11:35:38 +00:00
static void lcd_disable_farm_mode ( ) ;
static void lcd_set_fan_check ( ) ;
2019-02-27 09:42:26 +00:00
static void lcd_cutter_enabled ( ) ;
2020-01-07 17:51:30 +00:00
# ifdef SNMM
2018-07-23 11:35:38 +00:00
static char snmm_stop_print_menu ( ) ;
2020-01-07 17:51:30 +00:00
# endif //SNMM
2018-07-23 11:35:38 +00:00
# ifdef SDCARD_SORT_ALPHA
static void lcd_sort_type_set ( ) ;
# endif
static void lcd_babystep_z ( ) ;
static void lcd_send_status ( ) ;
2018-10-08 13:58:49 +00:00
# ifdef FARM_CONNECT_MESSAGE
2018-07-23 11:35:38 +00:00
static void lcd_connect_printer ( ) ;
2018-10-08 13:58:49 +00:00
# endif //FARM_CONNECT_MESSAGE
2018-07-23 11:35:38 +00:00
2019-05-24 06:46:44 +00:00
//! Beware: has side effects - forces lcd_draw_update to 2, which means clear the display
2018-01-13 18:16:09 +00:00
void lcd_finishstatus ( ) ;
2016-07-22 13:28:01 +00:00
static void lcd_sdcard_menu ( ) ;
2019-07-19 16:34:46 +00:00
static void lcd_sheet_menu ( ) ;
2016-07-22 13:28:01 +00:00
# ifdef DELTA_CALIBRATION_MENU
static void lcd_delta_calibrate_menu ( ) ;
# endif // DELTA_CALIBRATION_MENU
/* Different types of actions that can be used in menu items. */
2018-10-08 13:58:49 +00:00
static void menu_action_sdfile ( const char * filename ) ;
static void menu_action_sddirectory ( const char * filename ) ;
2016-07-22 13:28:01 +00:00
# define ENCODER_FEEDRATE_DEADZONE 10
2018-12-14 18:43:26 +00:00
# define STATE_NA 255
# define STATE_OFF 0
# define STATE_ON 1
2016-07-22 13:28:01 +00:00
2018-07-16 02:13:26 +00:00
/*
2016-07-22 13:28:01 +00:00
# define MENU_ITEM(type, label, args...) do { \
2018-07-15 16:37:59 +00:00
if ( menu_item = = menu_line ) { \
2018-07-16 00:13:52 +00:00
if ( lcd_draw_update ) { \
2016-07-22 13:28:01 +00:00
const char * _label_pstr = ( label ) ; \
2018-07-16 00:13:52 +00:00
if ( lcd_encoder = = menu_item ) { \
2018-07-15 16:37:59 +00:00
lcd_implementation_drawmenu_ # # type # # _selected ( menu_row , _label_pstr , # # args ) ; \
2016-07-22 13:28:01 +00:00
} else { \
2018-07-15 16:37:59 +00:00
lcd_implementation_drawmenu_ # # type ( menu_row , _label_pstr , # # args ) ; \
2016-07-22 13:28:01 +00:00
} \
} \
2018-07-16 00:13:52 +00:00
if ( menu_clicked & & ( lcd_encoder = = menu_item ) ) { \
2016-07-22 13:28:01 +00:00
lcd_quick_feedback ( ) ; \
menu_action_ # # type ( args ) ; \
return ; \
} \
} \
2018-07-15 16:37:59 +00:00
menu_item + + ; \
2016-07-22 13:28:01 +00:00
} while ( 0 )
2018-07-16 02:13:26 +00:00
*/
2016-07-22 13:28:01 +00:00
# if (SDCARDDETECT > 0)
bool lcd_oldcardstatus ;
# endif
2019-07-22 16:43:43 +00:00
uint8_t selected_sheet = 0 ;
2016-07-22 13:28:01 +00:00
bool ignore_click = false ;
bool wait_for_unclick ;
// place-holders for Ki and Kd edits
2016-08-11 08:42:53 +00:00
# ifdef PIDTEMP
// float raw_Ki, raw_Kd;
# endif
2016-07-22 13:28:01 +00:00
2019-01-24 16:32:57 +00:00
bool bMain ; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
2019-07-16 18:10:49 +00:00
bool bSettings ; // flag (i.e. 'fake parameter') for 'lcd_hw_setup_menu()' function
2019-01-24 16:32:57 +00:00
2018-03-06 18:47:27 +00:00
2016-07-22 13:28:01 +00:00
2018-08-09 15:43:43 +00:00
const char STR_SEPARATOR [ ] PROGMEM = " ------------ " ;
2018-06-18 12:53:42 +00:00
2018-06-23 01:22:39 +00:00
2019-09-11 19:03:56 +00:00
static void lcd_implementation_drawmenu_sdfile_selected ( uint8_t row , const char * filename , char * longFilename )
2018-06-24 10:41:36 +00:00
{
2018-07-16 00:13:52 +00:00
char c ;
2019-08-31 14:00:39 +00:00
int enc_dif = lcd_encoder_diff / ENCODER_PULSES_PER_STEP ;
2018-07-16 00:13:52 +00:00
uint8_t n = LCD_WIDTH - 1 ;
2019-09-11 19:03:56 +00:00
2019-06-12 13:01:57 +00:00
for ( uint_least8_t g = 0 ; g < 4 ; g + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , g ) ;
lcd_print ( ' ' ) ;
2018-07-16 00:13:52 +00:00
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , row ) ;
lcd_print ( ' > ' ) ;
2019-09-11 19:03:56 +00:00
if ( longFilename [ 0 ] = = ' \0 ' )
{
longFilename = filename ;
}
2018-07-16 00:13:52 +00:00
int i = 1 ;
int j = 0 ;
char * longFilenameTMP = longFilename ;
2018-07-09 10:44:19 +00:00
2018-07-16 00:13:52 +00:00
while ( ( c = * longFilenameTMP ) ! = ' \0 ' )
{
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( i , row ) ;
lcd_print ( c ) ;
2018-07-16 00:13:52 +00:00
i + + ;
longFilenameTMP + + ;
if ( i = = LCD_WIDTH ) {
i = 1 ;
j + + ;
longFilenameTMP = longFilename + j ;
n = LCD_WIDTH - 1 ;
for ( int g = 0 ; g < 300 ; g + + ) {
manage_heater ( ) ;
2019-08-31 14:00:39 +00:00
if ( LCD_CLICKED | | ( enc_dif ! = ( lcd_encoder_diff / ENCODER_PULSES_PER_STEP ) ) ) {
2018-07-16 00:13:52 +00:00
longFilenameTMP = longFilename ;
* ( longFilenameTMP + LCD_WIDTH - 2 ) = ' \0 ' ;
i = 1 ;
j = 0 ;
break ;
} else {
2019-02-04 11:20:07 +00:00
if ( j = = 1 ) _delay_ms ( 3 ) ; //wait around 1.2 s to start scrolling text
_delay_ms ( 1 ) ; //then scroll with redrawing every 300 ms
2018-07-16 00:13:52 +00:00
}
2018-07-09 10:44:19 +00:00
2018-07-16 00:13:52 +00:00
}
}
}
if ( c ! = ' \0 ' ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( i , row ) ;
lcd_print ( c ) ;
2018-07-16 00:13:52 +00:00
i + + ;
}
n = n - i + 1 ;
while ( n - - )
2018-07-16 17:29:27 +00:00
lcd_print ( ' ' ) ;
2018-07-09 10:44:19 +00:00
}
2018-10-08 13:58:49 +00:00
static void lcd_implementation_drawmenu_sdfile ( uint8_t row , const char * filename , char * longFilename )
2018-06-18 12:53:42 +00:00
{
2018-07-16 00:13:52 +00:00
char c ;
uint8_t n = LCD_WIDTH - 1 ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , row ) ;
lcd_print ( ' ' ) ;
2018-07-16 00:13:52 +00:00
if ( longFilename [ 0 ] ! = ' \0 ' )
{
filename = longFilename ;
longFilename [ LCD_WIDTH - 1 ] = ' \0 ' ;
}
while ( ( ( c = * filename ) ! = ' \0 ' ) & & ( n > 0 ) )
{
2018-07-16 17:29:27 +00:00
lcd_print ( c ) ;
2018-07-16 00:13:52 +00:00
filename + + ;
n - - ;
}
while ( n - - )
2018-07-16 17:29:27 +00:00
lcd_print ( ' ' ) ;
2018-06-23 01:22:39 +00:00
}
2018-10-08 13:58:49 +00:00
static void lcd_implementation_drawmenu_sddirectory_selected ( uint8_t row , const char * filename , char * longFilename )
2018-06-23 12:33:54 +00:00
{
2018-07-16 00:13:52 +00:00
char c ;
uint8_t n = LCD_WIDTH - 2 ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , row ) ;
lcd_print ( ' > ' ) ;
lcd_print ( LCD_STR_FOLDER [ 0 ] ) ;
2018-07-16 00:13:52 +00:00
if ( longFilename [ 0 ] ! = ' \0 ' )
{
filename = longFilename ;
longFilename [ LCD_WIDTH - 2 ] = ' \0 ' ;
}
while ( ( ( c = * filename ) ! = ' \0 ' ) & & ( n > 0 ) )
{
2018-07-16 17:29:27 +00:00
lcd_print ( c ) ;
2018-07-16 00:13:52 +00:00
filename + + ;
n - - ;
}
while ( n - - )
2018-07-16 17:29:27 +00:00
lcd_print ( ' ' ) ;
2018-06-23 12:33:54 +00:00
}
2018-10-08 13:58:49 +00:00
static void lcd_implementation_drawmenu_sddirectory ( uint8_t row , const char * filename , char * longFilename )
2018-06-23 12:33:54 +00:00
{
2018-07-16 00:13:52 +00:00
char c ;
uint8_t n = LCD_WIDTH - 2 ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , row ) ;
lcd_print ( ' ' ) ;
lcd_print ( LCD_STR_FOLDER [ 0 ] ) ;
2018-07-16 00:13:52 +00:00
if ( longFilename [ 0 ] ! = ' \0 ' )
{
filename = longFilename ;
longFilename [ LCD_WIDTH - 2 ] = ' \0 ' ;
}
while ( ( ( c = * filename ) ! = ' \0 ' ) & & ( n > 0 ) )
{
2018-07-16 17:29:27 +00:00
lcd_print ( c ) ;
2018-07-16 00:13:52 +00:00
filename + + ;
n - - ;
}
while ( n - - )
2018-07-16 17:29:27 +00:00
lcd_print ( ' ' ) ;
2018-06-23 12:33:54 +00:00
}
2018-07-16 00:13:52 +00:00
2018-06-18 12:53:42 +00:00
2018-10-08 13:58:49 +00:00
# define MENU_ITEM_SDDIR(str_fn, str_fnl) do { if (menu_item_sddir(str_fn, str_fnl)) return; } while (0)
2018-07-16 02:13:26 +00:00
//#define MENU_ITEM_SDDIR(str, str_fn, str_fnl) MENU_ITEM(sddirectory, str, str_fn, str_fnl)
2018-07-16 00:13:52 +00:00
//extern uint8_t menu_item_sddir(const char* str, const char* str_fn, char* str_fnl);
2018-07-16 02:13:26 +00:00
# define MENU_ITEM_SDFILE(str, str_fn, str_fnl) do { if (menu_item_sdfile(str, str_fn, str_fnl)) return; } while (0)
//#define MENU_ITEM_SDFILE(str, str_fn, str_fnl) MENU_ITEM(sdfile, str, str_fn, str_fnl)
2018-07-16 00:13:52 +00:00
//extern uint8_t menu_item_sdfile(const char* str, const char* str_fn, char* str_fnl);
2018-10-08 13:58:49 +00:00
uint8_t menu_item_sddir ( const char * str_fn , char * str_fnl )
2018-06-23 12:33:54 +00:00
{
2018-07-16 02:13:26 +00:00
# ifdef NEW_SD_MENU
2018-07-09 10:44:19 +00:00
// str_fnl[18] = 0;
2018-07-16 00:13:52 +00:00
// printf_P(PSTR("menu dir %d '%s' '%s'\n"), menu_row, str_fn, str_fnl);
2018-07-15 16:37:59 +00:00
if ( menu_item = = menu_line )
2018-06-23 12:33:54 +00:00
{
2018-07-16 00:13:52 +00:00
if ( lcd_draw_update )
2018-07-09 10:44:19 +00:00
{
2018-07-16 00:13:52 +00:00
lcd_set_cursor ( 0 , menu_row ) ;
int cnt = lcd_printf_P ( PSTR ( " %c%c%-18s " ) , ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , LCD_STR_FOLDER [ 0 ] , str_fnl [ 0 ] ? str_fnl : str_fn ) ;
// int cnt = lcd_printf_P(PSTR("%c%c%-18s"), (lcd_encoder == menu_item)?'>':' ', LCD_STR_FOLDER[0], str_fn);
2018-07-09 10:44:19 +00:00
}
2018-07-16 00:13:52 +00:00
if ( menu_clicked & & ( lcd_encoder = = menu_item ) )
2018-07-09 10:44:19 +00:00
{
uint8_t depth = ( uint8_t ) card . getWorkDirDepth ( ) ;
strcpy ( dir_names [ depth ] , str_fn ) ;
// printf_P(PSTR("%s\n"), dir_names[depth]);
card . chdir ( str_fn ) ;
2018-07-16 00:13:52 +00:00
lcd_encoder = 0 ;
2018-06-23 12:42:58 +00:00
return menu_item_ret ( ) ;
2018-07-09 10:44:19 +00:00
}
2018-06-23 12:33:54 +00:00
}
2018-07-15 16:37:59 +00:00
menu_item + + ;
2018-06-23 12:33:54 +00:00
return 0 ;
2018-07-16 02:13:26 +00:00
# else //NEW_SD_MENU
if ( menu_item = = menu_line )
2018-06-18 12:53:42 +00:00
{
2018-07-16 02:13:26 +00:00
if ( lcd_draw_update )
2018-06-18 12:53:42 +00:00
{
2018-07-16 02:13:26 +00:00
if ( lcd_encoder = = menu_item )
2018-10-08 13:58:49 +00:00
lcd_implementation_drawmenu_sddirectory_selected ( menu_row , str_fn , str_fnl ) ;
2018-07-16 02:13:26 +00:00
else
2018-10-08 13:58:49 +00:00
lcd_implementation_drawmenu_sddirectory ( menu_row , str_fn , str_fnl ) ;
2018-07-16 02:13:26 +00:00
}
if ( menu_clicked & & ( lcd_encoder = = menu_item ) )
{
menu_clicked = false ;
2018-07-16 02:24:27 +00:00
lcd_update_enabled = 0 ;
2018-10-08 13:58:49 +00:00
menu_action_sddirectory ( str_fn ) ;
2018-07-16 02:24:27 +00:00
lcd_update_enabled = 1 ;
2018-06-23 12:42:58 +00:00
return menu_item_ret ( ) ;
2018-06-18 12:53:42 +00:00
}
}
2018-07-16 02:13:26 +00:00
menu_item + + ;
2018-06-23 01:22:39 +00:00
return 0 ;
2018-07-16 02:13:26 +00:00
# endif //NEW_SD_MENU
2018-06-18 12:53:42 +00:00
}
2018-10-08 13:58:49 +00:00
static uint8_t menu_item_sdfile ( const char *
# ifdef NEW_SD_MENU
str
# endif //NEW_SD_MENU
, const char * str_fn , char * str_fnl )
2018-06-23 01:22:39 +00:00
{
2018-07-16 02:13:26 +00:00
# ifdef NEW_SD_MENU
2018-07-16 00:13:52 +00:00
// printf_P(PSTR("menu sdfile\n"));
2018-07-09 10:44:19 +00:00
// str_fnl[19] = 0;
2018-07-16 00:13:52 +00:00
// printf_P(PSTR("menu file %d '%s' '%s'\n"), menu_row, str_fn, str_fnl);
2018-07-15 16:37:59 +00:00
if ( menu_item = = menu_line )
2018-06-23 01:22:39 +00:00
{
2018-07-16 00:13:52 +00:00
if ( lcd_draw_update )
2018-07-09 10:44:19 +00:00
{
2018-07-16 00:13:52 +00:00
// printf_P(PSTR("menu file %d %d '%s'\n"), menu_row, menuData.sdcard_menu.viewState, str_fnl[0]?str_fnl:str_fn);
lcd_set_cursor ( 0 , menu_row ) ;
/* if (lcd_encoder == menu_item)
2018-07-09 10:44:19 +00:00
{
2018-07-16 00:13:52 +00:00
lcd_printf_P ( PSTR ( " %c%-19s " ) , ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , ( str_fnl [ 0 ] ? str_fnl : str_fn ) + 1 ) ;
2018-07-09 10:44:19 +00:00
if ( menuData . sdcard_menu . viewState = = 0 )
{
menuData . sdcard_menu . viewState + + ;
2018-07-16 00:13:52 +00:00
lcd_printf_P ( PSTR ( " %c%-19s " ) , ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , ( str_fnl [ 0 ] ? str_fnl : str_fn ) + 1 ) ;
2018-07-09 10:44:19 +00:00
}
else if ( menuData . sdcard_menu . viewState = = 1 )
{
2018-07-16 00:13:52 +00:00
lcd_printf_P ( PSTR ( " %c%-19s " ) , ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , ( str_fnl [ 0 ] ? str_fnl : str_fn ) + 2 ) ;
2018-07-09 10:44:19 +00:00
}
}
else */
{
str_fnl [ 19 ] = 0 ;
2018-07-16 00:13:52 +00:00
lcd_printf_P ( PSTR ( " %c%-19s " ) , ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , str_fnl [ 0 ] ? str_fnl : str_fn ) ;
2018-07-09 10:44:19 +00:00
}
2018-06-23 12:33:54 +00:00
2018-07-16 00:13:52 +00:00
// int cnt = lcd_printf_P(PSTR("%c%-19s"), (lcd_encoder == menu_item)?'>':' ', str_fnl);
// int cnt = lcd_printf_P(PSTR("%cTESTIK.gcode"), (lcd_encoder == menu_item)?'>':' ');
2018-07-09 10:44:19 +00:00
}
2018-07-16 00:13:52 +00:00
if ( menu_clicked & & ( lcd_encoder = = menu_item ) )
2018-06-23 01:22:39 +00:00
{
2018-06-23 12:42:58 +00:00
return menu_item_ret ( ) ;
2018-06-23 01:22:39 +00:00
}
}
2018-07-15 16:37:59 +00:00
menu_item + + ;
2018-06-23 01:22:39 +00:00
return 0 ;
2018-07-16 02:13:26 +00:00
# else //NEW_SD_MENU
if ( menu_item = = menu_line )
2018-06-23 01:22:39 +00:00
{
2018-07-16 02:13:26 +00:00
if ( lcd_draw_update )
2018-06-23 01:22:39 +00:00
{
2018-07-16 02:13:26 +00:00
if ( lcd_encoder = = menu_item )
2019-09-11 19:03:56 +00:00
lcd_implementation_drawmenu_sdfile_selected ( menu_row , str_fn , str_fnl ) ;
2018-07-16 02:13:26 +00:00
else
2018-10-08 13:58:49 +00:00
lcd_implementation_drawmenu_sdfile ( menu_row , str_fn , str_fnl ) ;
2018-07-16 02:13:26 +00:00
}
if ( menu_clicked & & ( lcd_encoder = = menu_item ) )
{
2018-10-08 13:58:49 +00:00
lcd_consume_click ( ) ;
menu_action_sdfile ( str_fn ) ;
2018-06-23 12:42:58 +00:00
return menu_item_ret ( ) ;
2018-06-23 01:22:39 +00:00
}
}
2018-07-16 02:13:26 +00:00
menu_item + + ;
2018-06-23 01:22:39 +00:00
return 0 ;
2018-07-16 02:13:26 +00:00
# endif //NEW_SD_MENU
2018-06-23 01:22:39 +00:00
}
2018-08-19 22:27:45 +00:00
// Print temperature (nozzle/bed) (9 chars total)
void lcdui_print_temp ( char type , int val_current , int val_target )
{
int chars = lcd_printf_P ( _N ( " %c%3d/%d%c " ) , type , val_current , val_target , LCD_STR_DEGREE [ 0 ] ) ;
lcd_space ( 9 - chars ) ;
}
// Print Z-coordinate (8 chars total)
void lcdui_print_Z_coord ( void )
{
2019-06-12 16:42:55 +00:00
if ( custom_message_type = = CustomMsg : : MeshBedLeveling )
2018-08-19 22:27:45 +00:00
lcd_puts_P ( _N ( " Z --- " ) ) ;
else
2020-01-08 11:46:51 +00:00
lcd_printf_P ( _N ( " Z%6.2f%c " ) , current_position [ Z_AXIS ] , axis_known_position [ Z_AXIS ] ? ' ' : ' ? ' ) ;
2018-08-19 22:27:45 +00:00
}
# ifdef PLANNER_DIAGNOSTICS
// Print planner diagnostics (8 chars total)
void lcdui_print_planner_diag ( void )
{
lcd_set_cursor ( LCD_WIDTH - 8 - 2 , 1 ) ;
lcd_print ( LCD_STR_FEEDRATE [ 0 ] ) ;
lcd_print ( itostr3 ( feedmultiply ) ) ;
lcd_puts_P ( PSTR ( " % Q " ) ) ;
{
uint8_t queue = planner_queue_min ( ) ;
if ( queue < ( BLOCK_BUFFER_SIZE > > 1 ) )
lcd_putc ( ' ! ' ) ;
else
{
lcd_putc ( ( char ) ( queue / 10 ) + ' 0 ' ) ;
queue % = 10 ;
}
lcd_putc ( ( char ) queue + ' 0 ' ) ;
planner_queue_min_reset ( ) ;
}
}
# endif // PLANNER_DIAGNOSTICS
// Print feedrate (8 chars total)
void lcdui_print_feedrate ( void )
{
int chars = lcd_printf_P ( _N ( " %c%3d%% " ) , LCD_STR_FEEDRATE [ 0 ] , feedmultiply ) ;
lcd_space ( 8 - chars ) ;
}
// Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total)
void lcdui_print_percent_done ( void )
{
const char * src = is_usb_printing ? _N ( " USB " ) : ( IS_SD_PRINTING ? _N ( " SD " ) : _N ( " " ) ) ;
char per [ 4 ] ;
bool num = IS_SD_PRINTING | | ( PRINTER_ACTIVE & & ( print_percent_done_normal ! = PRINT_PERCENT_DONE_INIT ) ) ;
2019-08-29 22:07:24 +00:00
if ( ! num | | heating_status ) // either not printing or heating
{
2020-01-08 10:48:41 +00:00
const int8_t sheetNR = eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ;
const int8_t nextSheet = eeprom_next_initialized_sheet ( sheetNR ) ;
if ( ( nextSheet > = 0 ) & & ( sheetNR ! = nextSheet ) )
{
char sheet [ 8 ] ;
eeprom_read_block ( sheet , EEPROM_Sheets_base - > s [ sheetNR ] . name , 7 ) ;
sheet [ 7 ] = ' \0 ' ;
2020-01-08 13:31:33 +00:00
lcd_printf_P ( PSTR ( " %-7s " ) , sheet ) ;
2020-01-08 10:48:41 +00:00
return ; //do not also print the percentage
}
2019-08-29 22:07:24 +00:00
}
2020-01-08 10:48:41 +00:00
sprintf_P ( per , num ? _N ( " %3hhd " ) : _N ( " --- " ) , calc_percent_done ( ) ) ;
lcd_printf_P ( _N ( " %3S%3s%% " ) , src , per ) ;
2018-08-19 22:27:45 +00:00
}
// Print extruder status (5 chars total)
void lcdui_print_extruder ( void )
{
2018-08-22 14:38:34 +00:00
int chars = 0 ;
2018-12-12 13:50:55 +00:00
if ( mmu_extruder = = tmp_extruder ) {
if ( mmu_extruder = = MMU_FILAMENT_UNKNOWN ) chars = lcd_printf_P ( _N ( " F? " ) ) ;
else chars = lcd_printf_P ( _N ( " F%u " ) , mmu_extruder + 1 ) ;
}
2018-08-22 14:38:34 +00:00
else
2018-12-12 13:50:55 +00:00
{
if ( mmu_extruder = = MMU_FILAMENT_UNKNOWN ) chars = lcd_printf_P ( _N ( " ?>%u " ) , tmp_extruder + 1 ) ;
else chars = lcd_printf_P ( _N ( " %u>%u " ) , mmu_extruder + 1 , tmp_extruder + 1 ) ;
}
2018-08-19 22:59:36 +00:00
lcd_space ( 5 - chars ) ;
2018-08-19 22:27:45 +00:00
}
// Print farm number (5 chars total)
void lcdui_print_farm ( void )
{
int chars = lcd_printf_P ( _N ( " F0 " ) ) ;
// lcd_space(5 - chars);
/*
// Farm number display
if ( farm_mode )
{
lcd_set_cursor ( 6 , 2 ) ;
lcd_puts_P ( PSTR ( " F " ) ) ;
lcd_print ( farm_no ) ;
lcd_puts_P ( PSTR ( " " ) ) ;
// Beat display
lcd_set_cursor ( LCD_WIDTH - 1 , 0 ) ;
2019-01-27 21:48:51 +00:00
if ( ( _millis ( ) - kicktime ) < 60000 ) {
2018-08-19 22:27:45 +00:00
lcd_puts_P ( PSTR ( " L " ) ) ;
} else {
lcd_puts_P ( PSTR ( " " ) ) ;
}
}
else {
# ifdef SNMM
lcd_puts_P ( PSTR ( " E " ) ) ;
lcd_print ( get_ext_nr ( ) + 1 ) ;
# else
lcd_set_cursor ( LCD_WIDTH - 8 - 2 , 2 ) ;
lcd_puts_P ( PSTR ( " " ) ) ;
# endif
}
*/
}
# ifdef CMD_DIAGNOSTICS
// Print CMD queue diagnostic (8 chars total)
void lcdui_print_cmd_diag ( void )
{
lcd_set_cursor ( LCD_WIDTH - 8 - 1 , 2 ) ;
lcd_puts_P ( PSTR ( " C " ) ) ;
lcd_print ( buflen ) ; // number of commands in cmd buffer
if ( buflen < 9 ) lcd_puts_P ( " " ) ;
}
# endif //CMD_DIAGNOSTICS
// Print time (8 chars total)
void lcdui_print_time ( void )
{
//if remaining print time estimation is available print it else print elapsed time
uint16_t print_t = 0 ;
if ( print_time_remaining_normal ! = PRINT_TIME_REMAINING_INIT )
print_t = print_time_remaining ( ) ;
else if ( starttime ! = 0 )
2019-01-27 21:48:51 +00:00
print_t = _millis ( ) / 60000 - starttime / 60000 ;
2018-08-19 22:27:45 +00:00
int chars = 0 ;
if ( ( PRINTER_ACTIVE ) & & ( ( print_time_remaining_normal ! = PRINT_TIME_REMAINING_INIT ) | | ( starttime ! = 0 ) ) )
{
2018-09-04 12:39:46 +00:00
char suff = ' ' ;
char suff_doubt = ' ' ;
if ( print_time_remaining_normal ! = PRINT_TIME_REMAINING_INIT )
{
suff = ' R ' ;
if ( feedmultiply ! = 100 )
suff_doubt = ' ? ' ;
}
2018-11-04 19:27:09 +00:00
if ( print_t < 6000 ) //time<100h
chars = lcd_printf_P ( _N ( " %c%02u:%02u%c%c " ) , LCD_STR_CLOCK [ 0 ] , print_t / 60 , print_t % 60 , suff , suff_doubt ) ;
else //time>=100h
chars = lcd_printf_P ( _N ( " %c%3uh %c%c " ) , LCD_STR_CLOCK [ 0 ] , print_t / 60 , suff , suff_doubt ) ;
2018-08-19 22:27:45 +00:00
}
else
chars = lcd_printf_P ( _N ( " %c--:-- " ) , LCD_STR_CLOCK [ 0 ] ) ;
lcd_space ( 8 - chars ) ;
}
2018-07-15 16:37:59 +00:00
2018-08-19 16:34:57 +00:00
//Print status line on status screen
void lcdui_print_status_line ( void )
{
if ( IS_SD_PRINTING )
{
2019-09-11 19:03:56 +00:00
if ( strcmp ( longFilenameOLD , ( card . longFilename [ 0 ] ? card . longFilename : card . filename ) ) ! = 0 )
2018-08-19 16:34:57 +00:00
{
memset ( longFilenameOLD , ' \0 ' , strlen ( longFilenameOLD ) ) ;
2019-09-11 19:03:56 +00:00
sprintf_P ( longFilenameOLD , PSTR ( " %s " ) , ( card . longFilename [ 0 ] ? card . longFilename : card . filename ) ) ;
2018-08-19 16:34:57 +00:00
scrollstuff = 0 ;
}
}
2018-07-16 00:13:52 +00:00
2018-08-19 16:34:57 +00:00
if ( heating_status )
{ // If heating flag, show progress of heating
heating_status_counter + + ;
if ( heating_status_counter > 13 )
{
heating_status_counter = 0 ;
}
lcd_set_cursor ( 7 , 3 ) ;
lcd_puts_P ( PSTR ( " " ) ) ;
2018-07-16 00:13:52 +00:00
2018-08-19 16:34:57 +00:00
for ( unsigned int dots = 0 ; dots < heating_status_counter ; dots + + )
{
lcd_set_cursor ( 7 + dots , 3 ) ;
lcd_print ( ' . ' ) ;
}
switch ( heating_status )
{
case 1 :
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _T ( MSG_HEATING ) ) ;
break ;
case 2 :
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _T ( MSG_HEATING_COMPLETE ) ) ;
heating_status = 0 ;
heating_status_counter = 0 ;
break ;
case 3 :
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _T ( MSG_BED_HEATING ) ) ;
break ;
case 4 :
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _T ( MSG_BED_DONE ) ) ;
heating_status = 0 ;
heating_status_counter = 0 ;
break ;
default :
break ;
}
}
2019-06-12 16:42:55 +00:00
else if ( ( IS_SD_PRINTING ) & & ( custom_message_type = = CustomMsg : : Status ) )
2018-08-19 16:34:57 +00:00
{ // If printing from SD, show what we are printing
2019-09-11 19:03:56 +00:00
if ( strlen ( longFilenameOLD ) > LCD_WIDTH )
2018-08-19 16:34:57 +00:00
{
int inters = 0 ;
int gh = scrollstuff ;
while ( ( ( gh - scrollstuff ) < LCD_WIDTH ) & & ( inters = = 0 ) )
{
2019-09-11 19:03:56 +00:00
if ( longFilenameOLD [ gh ] = = ' \0 ' )
2018-08-19 16:34:57 +00:00
{
lcd_set_cursor ( gh - scrollstuff , 3 ) ;
2019-09-11 19:03:56 +00:00
lcd_print ( longFilenameOLD [ gh - 1 ] ) ;
2018-08-19 16:34:57 +00:00
scrollstuff = 0 ;
gh = scrollstuff ;
inters = 1 ;
}
else
{
lcd_set_cursor ( gh - scrollstuff , 3 ) ;
2019-09-11 19:03:56 +00:00
lcd_print ( longFilenameOLD [ gh - 1 ] ) ;
2018-08-19 16:34:57 +00:00
gh + + ;
}
}
scrollstuff + + ;
}
else
{
2019-09-11 19:03:56 +00:00
lcd_printf_P ( PSTR ( " %-20s " ) , longFilenameOLD ) ;
2018-08-19 16:34:57 +00:00
}
}
else
{ // Otherwise check for other special events
switch ( custom_message_type )
{
2019-06-12 16:42:55 +00:00
case CustomMsg : : Status : // Nothing special, print status message normally
2018-08-19 16:34:57 +00:00
lcd_print ( lcd_status_message ) ;
break ;
2019-06-12 16:42:55 +00:00
case CustomMsg : : MeshBedLeveling : // If mesh bed leveling in progress, show the status
2018-08-19 16:34:57 +00:00
if ( custom_message_state > 10 )
{
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( PSTR ( " " ) ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _T ( MSG_CALIBRATE_Z_AUTO ) ) ;
lcd_puts_P ( PSTR ( " : " ) ) ;
lcd_print ( custom_message_state - 10 ) ;
}
else
{
if ( custom_message_state = = 3 )
{
lcd_puts_P ( _T ( WELCOME_MSG ) ) ;
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : Status ;
2018-08-19 16:34:57 +00:00
}
if ( custom_message_state > 3 & & custom_message_state < = 10 )
{
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( PSTR ( " " ) ) ;
lcd_set_cursor ( 0 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Calibration done " ) ) ; ////MSG_HOMEYZ_DONE
2018-08-19 16:34:57 +00:00
custom_message_state - - ;
}
}
break ;
2019-06-12 16:42:55 +00:00
case CustomMsg : : FilamentLoading : // If loading filament, print status
2018-08-19 16:34:57 +00:00
lcd_print ( lcd_status_message ) ;
break ;
2019-06-12 16:42:55 +00:00
case CustomMsg : : PidCal : // PID tuning in progress
2018-08-19 16:34:57 +00:00
lcd_print ( lcd_status_message ) ;
if ( pid_cycle < = pid_number_of_cycles & & custom_message_state > 0 )
{
lcd_set_cursor ( 10 , 3 ) ;
lcd_print ( itostr3 ( pid_cycle ) ) ;
lcd_print ( ' / ' ) ;
lcd_print ( itostr3left ( pid_number_of_cycles ) ) ;
}
break ;
2019-06-12 16:42:55 +00:00
case CustomMsg : : TempCal : // PINDA temp calibration in progress
2018-08-19 16:34:57 +00:00
{
2019-11-08 17:44:48 +00:00
char statusLine [ LCD_WIDTH + 1 ] ;
sprintf_P ( statusLine , PSTR ( " %-20S " ) , _T ( MSG_TEMP_CALIBRATION ) ) ;
2018-08-19 16:34:57 +00:00
char progress [ 4 ] ;
2019-11-08 17:44:48 +00:00
sprintf_P ( progress , PSTR ( " %d/6 " ) , custom_message_state ) ;
memcpy ( statusLine + 12 , progress , sizeof ( progress ) - 1 ) ;
2018-08-19 16:34:57 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2019-11-08 17:44:48 +00:00
lcd_print ( statusLine ) ;
2018-08-19 16:34:57 +00:00
}
break ;
2019-06-12 16:42:55 +00:00
case CustomMsg : : TempCompPreheat : // temp compensation preheat
2018-08-19 16:34:57 +00:00
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _i ( " PINDA Heating " ) ) ; ////MSG_PINDA_PREHEAT c=20 r=1
if ( custom_message_state < = PINDA_HEAT_T )
{
lcd_puts_P ( PSTR ( " : " ) ) ;
lcd_print ( custom_message_state ) ; //seconds
lcd_print ( ' ' ) ;
}
break ;
}
}
// Fill the rest of line to have nice and clean output
for ( int fillspace = 0 ; fillspace < 20 ; fillspace + + )
if ( ( lcd_status_message [ fillspace ] < = 31 ) )
lcd_print ( ' ' ) ;
}
2018-07-16 00:13:52 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Status Screen
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |N 000/000D Z000.0 |
//! |B 000/000D F100% |
//! |USB100% T0 t--:-- |
//! |Status line.........|
//! ----------------------
//! N - nozzle temp symbol LCD_STR_THERMOMETER
//! D - Degree sysmbol LCD_STR_DEGREE
//! B - bed temp symbol LCD_STR_BEDTEMP
//! F - feedrate symbol LCD_STR_FEEDRATE
//! t - clock symbol LCD_STR_THERMOMETER
//! @endcode
2018-08-19 16:34:57 +00:00
void lcdui_print_status_screen ( void )
2018-06-23 01:22:39 +00:00
{
2018-08-19 16:34:57 +00:00
2018-08-19 22:27:45 +00:00
lcd_set_cursor ( 0 , 0 ) ; //line 0
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
//Print the hotend temperature (9 chars total)
lcdui_print_temp ( LCD_STR_THERMOMETER [ 0 ] , ( int ) ( degHotend ( 0 ) + 0.5 ) , ( int ) ( degTargetHotend ( 0 ) + 0.5 ) ) ;
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
lcd_space ( 3 ) ; //3 spaces
2018-06-18 12:53:42 +00:00
2018-08-19 22:27:45 +00:00
//Print Z-coordinate (8 chars total)
lcdui_print_Z_coord ( ) ;
2018-07-15 16:37:59 +00:00
2018-08-19 22:27:45 +00:00
lcd_set_cursor ( 0 , 1 ) ; //line 1
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
//Print the Bed temperature (9 chars total)
lcdui_print_temp ( LCD_STR_BEDTEMP [ 0 ] , ( int ) ( degBed ( ) + 0.5 ) , ( int ) ( degTargetBed ( ) + 0.5 ) ) ;
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
lcd_space ( 3 ) ; //3 spaces
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
# ifdef PLANNER_DIAGNOSTICS
//Print planner diagnostics (8 chars)
lcdui_print_planner_diag ( ) ;
# else // PLANNER_DIAGNOSTICS
//Print Feedrate (8 chars)
lcdui_print_feedrate ( ) ;
# endif // PLANNER_DIAGNOSTICS
lcd_set_cursor ( 0 , 2 ) ; //line 2
//Print SD status (7 chars)
lcdui_print_percent_done ( ) ;
if ( mmu_enabled )
//Print extruder status (5 chars)
lcdui_print_extruder ( ) ;
else if ( farm_mode )
//Print farm number (5 chars)
lcdui_print_farm ( ) ;
else
lcd_space ( 5 ) ; //5 spaces
2018-07-16 00:13:52 +00:00
# ifdef CMD_DIAGNOSTICS
2018-08-19 22:27:45 +00:00
//Print cmd queue diagnostics (8chars)
lcdui_print_cmd_diag ( ) ;
2018-07-16 00:13:52 +00:00
# else
2018-08-19 22:27:45 +00:00
//Print time (8chars)
lcdui_print_time ( ) ;
2018-07-16 00:13:52 +00:00
# endif //CMD_DIAGNOSTICS
2018-08-19 22:27:45 +00:00
lcd_set_cursor ( 0 , 3 ) ; //line 3
2018-07-16 00:13:52 +00:00
2018-08-19 22:27:45 +00:00
# ifndef DEBUG_DISABLE_LCD_STATUS_LINE
2018-08-19 16:34:57 +00:00
lcdui_print_status_line ( ) ;
2018-08-19 22:27:45 +00:00
# endif //DEBUG_DISABLE_LCD_STATUS_LINE
2018-07-16 00:13:52 +00:00
2018-08-19 16:34:57 +00:00
}
// Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent
2020-03-02 18:07:23 +00:00
void lcd_status_screen ( ) // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
2018-08-19 16:34:57 +00:00
{
if ( firstrun = = 1 )
{
firstrun = 0 ;
if ( lcd_status_message_level = = 0 )
2018-07-09 10:44:19 +00:00
{
2018-08-19 16:34:57 +00:00
strncpy_P ( lcd_status_message , _T ( WELCOME_MSG ) , LCD_WIDTH ) ;
lcd_finishstatus ( ) ;
}
if ( eeprom_read_byte ( ( uint8_t * ) EEPROM_TOTALTIME ) = = 255 & & eeprom_read_byte ( ( uint8_t * ) EEPROM_TOTALTIME + 1 ) = = 255 & & eeprom_read_byte ( ( uint8_t * ) EEPROM_TOTALTIME + 2 ) = = 255 & & eeprom_read_byte ( ( uint8_t * ) EEPROM_TOTALTIME + 3 ) = = 255 )
{
eeprom_update_dword ( ( uint32_t * ) EEPROM_TOTALTIME , 0 ) ;
eeprom_update_dword ( ( uint32_t * ) EEPROM_FILAMENTUSED , 0 ) ;
2018-07-09 10:44:19 +00:00
}
}
2018-06-23 12:33:54 +00:00
2018-08-19 16:34:57 +00:00
if ( lcd_status_update_delay )
lcd_status_update_delay - - ;
2018-07-16 00:13:52 +00:00
else
2018-08-19 16:34:57 +00:00
lcd_draw_update = 1 ;
if ( lcd_draw_update )
2018-07-09 10:44:19 +00:00
{
2018-08-19 16:34:57 +00:00
ReInitLCD + + ;
if ( ReInitLCD = = 30 )
2018-07-09 10:44:19 +00:00
{
2018-08-19 16:34:57 +00:00
lcd_refresh ( ) ; // to maybe revive the LCD if static electricity killed it.
ReInitLCD = 0 ;
}
else
{
if ( ( ReInitLCD % 10 ) = = 0 )
lcd_refresh_noclear ( ) ; //to maybe revive the LCD if static electricity killed it.
}
2018-07-16 00:13:52 +00:00
2018-08-19 16:34:57 +00:00
lcdui_print_status_screen ( ) ;
2018-07-16 00:13:52 +00:00
2018-08-19 16:34:57 +00:00
if ( farm_mode )
{
farm_timer - - ;
if ( farm_timer < 1 )
2018-07-09 10:44:19 +00:00
{
2018-08-19 16:34:57 +00:00
farm_timer = 10 ;
prusa_statistics ( 0 ) ;
2018-07-16 00:13:52 +00:00
}
2018-08-19 16:34:57 +00:00
switch ( farm_timer )
2018-07-16 00:13:52 +00:00
{
2018-08-19 16:34:57 +00:00
case 8 :
prusa_statistics ( 21 ) ;
2019-05-28 16:22:34 +00:00
if ( loading_flag )
prusa_statistics ( 22 ) ;
2018-08-19 16:34:57 +00:00
break ;
case 5 :
if ( IS_SD_PRINTING )
prusa_statistics ( 20 ) ;
break ;
2018-07-09 10:44:19 +00:00
}
2018-08-19 16:34:57 +00:00
} // end of farm_mode
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 */
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type ! = LcdCommands : : Idle )
2018-08-19 16:34:57 +00:00
lcd_commands ( ) ;
} // end of lcd_draw_update
2018-06-23 12:33:54 +00:00
2018-08-19 16:34:57 +00:00
bool current_click = LCD_CLICKED ;
2018-07-15 16:37:59 +00:00
2018-08-19 16:34:57 +00:00
if ( ignore_click )
{
if ( wait_for_unclick )
{
if ( ! current_click )
ignore_click = wait_for_unclick = false ;
else
current_click = false ;
2018-07-09 10:44:19 +00:00
}
2018-08-19 16:34:57 +00:00
else if ( current_click )
2018-07-09 10:44:19 +00:00
{
2018-08-19 16:34:57 +00:00
lcd_quick_feedback ( ) ;
wait_for_unclick = true ;
current_click = false ;
2018-07-09 10:44:19 +00:00
}
}
2018-06-23 12:33:54 +00:00
2019-05-24 06:46:44 +00:00
if ( current_click
& & ( menu_block_entering_on_serious_errors = = SERIOUS_ERR_NONE ) // or a serious error blocks entering the menu
)
2016-07-22 13:28:01 +00:00
{
2018-08-19 16:34:57 +00:00
menu_depth = 0 ; //redundant, as already done in lcd_return_to_status(), just to be sure
menu_submenu ( lcd_main_menu ) ;
lcd_refresh ( ) ; // to maybe revive the LCD if static electricity killed it.
2016-07-22 13:28:01 +00:00
}
2018-08-19 16:34:57 +00:00
# ifdef ULTIPANEL_FEEDMULTIPLY
// Dead zone at 100% feedrate
if ( ( feedmultiply < 100 & & ( feedmultiply + int ( lcd_encoder ) ) > 100 ) | |
( feedmultiply > 100 & & ( feedmultiply + int ( lcd_encoder ) ) < 100 ) )
2018-07-15 16:37:59 +00:00
{
2018-08-19 16:34:57 +00:00
lcd_encoder = 0 ;
feedmultiply = 100 ;
}
if ( feedmultiply = = 100 & & int ( lcd_encoder ) > ENCODER_FEEDRATE_DEADZONE )
2018-07-15 16:37:59 +00:00
{
2018-08-19 16:34:57 +00:00
feedmultiply + = int ( lcd_encoder ) - ENCODER_FEEDRATE_DEADZONE ;
lcd_encoder = 0 ;
}
else if ( feedmultiply = = 100 & & int ( lcd_encoder ) < - ENCODER_FEEDRATE_DEADZONE )
2016-07-22 13:28:01 +00:00
{
2018-08-19 16:34:57 +00:00
feedmultiply + = int ( lcd_encoder ) + ENCODER_FEEDRATE_DEADZONE ;
lcd_encoder = 0 ;
}
else if ( feedmultiply ! = 100 )
2016-07-22 13:28:01 +00:00
{
2018-08-19 16:34:57 +00:00
feedmultiply + = int ( lcd_encoder ) ;
lcd_encoder = 0 ;
2016-07-22 13:28:01 +00:00
}
# endif //ULTIPANEL_FEEDMULTIPLY
2018-08-19 16:34:57 +00:00
if ( feedmultiply < 10 )
feedmultiply = 10 ;
else if ( feedmultiply > 999 )
feedmultiply = 999 ;
2016-07-22 13:28:01 +00:00
}
void lcd_commands ( )
2019-07-17 08:30:49 +00:00
{
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : LongPause )
2017-06-29 16:35:43 +00:00
{
2018-10-08 13:58:49 +00:00
if ( ! blocks_queued ( ) & & ! homing_flag )
{
2018-05-22 01:20:03 +00:00
lcd_setstatuspgm ( _i ( " Print paused " ) ) ; ////MSG_PRINT_PAUSED c=20 r=1
2019-08-31 13:28:31 +00:00
lcd_commands_type = LcdCommands : : Idle ;
lcd_commands_step = 0 ;
2019-12-03 18:56:05 +00:00
long_pause ( ) ;
2017-06-29 16:35:43 +00:00
}
}
2017-11-07 15:49:04 +00:00
# ifdef SNMM
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : Layer1Cal )
2017-11-07 15:49:04 +00:00
{
char cmd1 [ 30 ] ;
float width = 0.4 ;
float length = 20 - width ;
float extr = count_e ( 0.2 , width , length ) ;
float extr_short_segment = count_e ( 0.2 , width , width ) ;
2018-07-22 14:26:12 +00:00
if ( lcd_commands_step > 1 ) lcd_timeoutToStatus . start ( ) ; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
2017-11-07 15:49:04 +00:00
if ( lcd_commands_step = = 0 )
{
lcd_commands_step = 10 ;
}
if ( lcd_commands_step = = 10 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
enquecommand_P ( PSTR ( " M107 " ) ) ;
2018-01-22 15:03:43 +00:00
enquecommand_P ( PSTR ( " M104 S " STRINGIFY ( PLA_PREHEAT_HOTEND_TEMP ) ) ) ;
enquecommand_P ( PSTR ( " M140 S " STRINGIFY ( PLA_PREHEAT_HPB_TEMP ) ) ) ;
enquecommand_P ( PSTR ( " M190 S " STRINGIFY ( PLA_PREHEAT_HPB_TEMP ) ) ) ;
enquecommand_P ( PSTR ( " M109 S " STRINGIFY ( PLA_PREHEAT_HOTEND_TEMP ) ) ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " T0 " ) ) ;
2018-05-23 14:37:08 +00:00
enquecommand_P ( _T ( MSG_M117_V2_CALIBRATION ) ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G87 " ) ) ; //sets calibration status
enquecommand_P ( PSTR ( " G28 " ) ) ;
enquecommand_P ( PSTR ( " G21 " ) ) ; //set units to millimeters
enquecommand_P ( PSTR ( " G90 " ) ) ; //use absolute coordinates
enquecommand_P ( PSTR ( " M83 " ) ) ; //use relative distances for extrusion
enquecommand_P ( PSTR ( " G92 E0 " ) ) ;
enquecommand_P ( PSTR ( " M203 E100 " ) ) ;
enquecommand_P ( PSTR ( " M92 E140 " ) ) ;
lcd_commands_step = 9 ;
}
if ( lcd_commands_step = = 9 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G1 Z0.250 F7200.000 " ) ) ;
2017-11-13 16:43:14 +00:00
enquecommand_P ( PSTR ( " G1 X50.0 E80.0 F1000.0 " ) ) ;
enquecommand_P ( PSTR ( " G1 X160.0 E20.0 F1000.0 " ) ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G1 Z0.200 F7200.000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X220.0 E13 F1000.0 " ) ) ;
enquecommand_P ( PSTR ( " G1 X240.0 E0 F1000.0 " ) ) ;
enquecommand_P ( PSTR ( " G92 E0.0 " ) ) ;
enquecommand_P ( PSTR ( " G21 " ) ) ;
enquecommand_P ( PSTR ( " G90 " ) ) ;
enquecommand_P ( PSTR ( " M83 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-4 F2100.00000 " ) ) ;
enquecommand_P ( PSTR ( " G1 Z0.150 F7200.000 " ) ) ;
enquecommand_P ( PSTR ( " M204 S1000 " ) ) ;
enquecommand_P ( PSTR ( " G1 F4000 " ) ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_babystep_z , 0 , false , true ) ;
2017-11-07 15:49:04 +00:00
lcd_commands_step = 8 ;
}
if ( lcd_commands_step = = 8 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) ) //draw meander
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G1 X50 Y155 " ) ) ;
enquecommand_P ( PSTR ( " G1 X60 Y155 E4 " ) ) ;
enquecommand_P ( PSTR ( " G1 F1080 " ) ) ;
enquecommand_P ( PSTR ( " G1 X75 Y155 E2.5 " ) ) ;
enquecommand_P ( PSTR ( " G1 X100 Y155 E2 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y155 E2.62773 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y135 E0.66174 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y135 E3.62773 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y115 E0.49386 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y115 E3.62773 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y95 E0.49386 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y95 E3.62773 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y75 E0.49386 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y75 E3.62773 " ) ) ;
enquecommand_P ( PSTR ( " G1 X200 Y55 E0.49386 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y55 E3.62773 " ) ) ;
lcd_commands_step = 7 ;
}
if ( lcd_commands_step = = 7 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
strcpy ( cmd1 , " G1 X50 Y35 E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
for ( int i = 0 ; i < 4 ; i + + ) {
strcpy ( cmd1 , " G1 X70 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - i * width * 2 ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 X50 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( i + 1 ) * width * 2 ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
}
lcd_commands_step = 6 ;
}
if ( lcd_commands_step = = 6 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
for ( int i = 4 ; i < 8 ; i + + ) {
strcpy ( cmd1 , " G1 X70 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - i * width * 2 ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 X50 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( i + 1 ) * width * 2 ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
}
lcd_commands_step = 5 ;
}
if ( lcd_commands_step = = 5 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
for ( int i = 8 ; i < 12 ; i + + ) {
strcpy ( cmd1 , " G1 X70 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - i * width * 2 ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 X50 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( i + 1 ) * width * 2 ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
}
lcd_commands_step = 4 ;
}
if ( lcd_commands_step = = 4 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
for ( int i = 12 ; i < 16 ; i + + ) {
strcpy ( cmd1 , " G1 X70 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - i * width * 2 ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 X50 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( 2 * i + 1 ) * width ) ) ;
strcat ( cmd1 , " E " ) ;
strcat ( cmd1 , ftostr43 ( extr ) ) ;
enquecommand ( cmd1 ) ;
strcpy ( cmd1 , " G1 Y " ) ;
strcat ( cmd1 , ftostr32 ( 35 - ( i + 1 ) * width * 2 ) ) ;
2017-11-13 16:43:14 +00:00
strcat ( cmd1 , " E " ) ;
2017-11-07 15:49:04 +00:00
strcat ( cmd1 , ftostr43 ( extr_short_segment ) ) ;
enquecommand ( cmd1 ) ;
}
lcd_commands_step = 3 ;
}
if ( lcd_commands_step = = 3 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-13 16:43:14 +00:00
enquecommand_P ( PSTR ( " G1 E-0.07500 F2100.00000 " ) ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G4 S0 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-4 F2100.00000 " ) ) ;
enquecommand_P ( PSTR ( " G1 Z0.5 F7200.000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X245 Y1 " ) ) ;
enquecommand_P ( PSTR ( " G1 X240 E4 " ) ) ;
enquecommand_P ( PSTR ( " G1 F4000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X190 E2.7 " ) ) ;
enquecommand_P ( PSTR ( " G1 F4600 " ) ) ;
enquecommand_P ( PSTR ( " G1 X110 E2.8 " ) ) ;
enquecommand_P ( PSTR ( " G1 F5200 " ) ) ;
enquecommand_P ( PSTR ( " G1 X40 E3 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-15.0000 F5000 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-50.0000 F5400 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-15.0000 F3000 " ) ) ;
enquecommand_P ( PSTR ( " G1 E-12.0000 F2000 " ) ) ;
enquecommand_P ( PSTR ( " G1 F1600 " ) ) ;
lcd_commands_step = 2 ;
}
if ( lcd_commands_step = = 2 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G1 X0 Y1 E3.0000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y1 E-5.0000 " ) ) ;
enquecommand_P ( PSTR ( " G1 F2000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X0 Y1 E5.0000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y1 E-5.0000 " ) ) ;
enquecommand_P ( PSTR ( " G1 F2400 " ) ) ;
enquecommand_P ( PSTR ( " G1 X0 Y1 E5.0000 " ) ) ;
2017-11-14 15:51:34 +00:00
enquecommand_P ( PSTR ( " G1 X50 Y1 E-5.0000 " ) ) ;
2017-11-07 15:49:04 +00:00
enquecommand_P ( PSTR ( " G1 F2400 " ) ) ;
enquecommand_P ( PSTR ( " G1 X0 Y1 E5.0000 " ) ) ;
enquecommand_P ( PSTR ( " G1 X50 Y1 E-3.0000 " ) ) ;
enquecommand_P ( PSTR ( " G4 S0 " ) ) ;
enquecommand_P ( PSTR ( " M107 " ) ) ;
enquecommand_P ( PSTR ( " M104 S0 " ) ) ;
enquecommand_P ( PSTR ( " M140 S0 " ) ) ;
enquecommand_P ( PSTR ( " G1 X10 Y180 F4000 " ) ) ;
enquecommand_P ( PSTR ( " G1 Z10 F1300.000 " ) ) ;
enquecommand_P ( PSTR ( " M84 " ) ) ;
lcd_commands_step = 1 ;
}
if ( lcd_commands_step = = 1 & & ! blocks_queued ( ) & & cmd_buffer_empty ( ) )
{
2018-05-23 14:37:08 +00:00
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
2017-11-07 15:49:04 +00:00
lcd_commands_step = 0 ;
lcd_commands_type = 0 ;
if ( eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) = = 1 ) {
2018-10-08 13:58:49 +00:00
lcd_wizard ( WizState : : RepeatLay1Cal ) ;
2017-11-07 15:49:04 +00:00
}
}
}
# else //if not SNMM
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : Layer1Cal )
2017-11-07 15:49:04 +00:00
{
char cmd1 [ 30 ] ;
2018-10-08 13:58:49 +00:00
2019-06-11 16:26:59 +00:00
if ( lcd_commands_step > 1 ) lcd_timeoutToStatus . start ( ) ; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
2018-10-08 13:58:49 +00:00
2019-08-16 17:00:45 +00:00
if ( ! blocks_queued ( ) & & cmd_buffer_empty ( ) & & ! saved_printing )
2018-10-08 13:58:49 +00:00
{
2019-06-11 16:26:59 +00:00
switch ( lcd_commands_step )
2018-10-08 13:58:49 +00:00
{
2019-06-11 16:26:59 +00:00
case 0 :
2019-08-16 18:47:55 +00:00
lcd_commands_step = 11 ;
2019-06-11 16:26:59 +00:00
break ;
2019-08-16 18:47:55 +00:00
case 11 :
2019-09-11 22:19:20 +00:00
lay1cal_wait_preheat ( ) ;
2019-06-11 16:26:59 +00:00
lcd_commands_step = 10 ;
break ;
case 10 :
2019-09-12 15:54:05 +00:00
lay1cal_load_filament ( cmd1 , lay1cal_filament ) ;
2019-06-11 16:26:59 +00:00
lcd_commands_step = 9 ;
break ;
case 9 :
lcd_clear ( ) ;
menu_depth = 0 ;
menu_submenu ( lcd_babystep_z ) ;
2019-08-16 18:47:55 +00:00
lay1cal_intro_line ( ) ;
2019-06-11 16:26:59 +00:00
lcd_commands_step = 8 ;
break ;
case 8 :
2019-06-11 16:56:29 +00:00
lay1cal_before_meander ( ) ;
2019-06-11 16:26:59 +00:00
lcd_commands_step = 7 ;
break ;
case 7 :
2019-06-11 23:36:48 +00:00
lay1cal_meander ( cmd1 ) ;
2019-06-11 16:26:59 +00:00
lcd_commands_step = 6 ;
break ;
case 6 :
for ( uint8_t i = 0 ; i < 4 ; i + + )
{
2019-06-11 23:36:48 +00:00
lay1cal_square ( cmd1 , i ) ;
2019-06-11 16:26:59 +00:00
}
lcd_commands_step = 5 ;
break ;
case 5 :
for ( uint8_t i = 4 ; i < 8 ; i + + )
{
2019-06-11 23:36:48 +00:00
lay1cal_square ( cmd1 , i ) ;
2019-06-11 16:26:59 +00:00
}
lcd_commands_step = 4 ;
break ;
case 4 :
for ( uint8_t i = 8 ; i < 12 ; i + + )
{
2019-06-11 23:36:48 +00:00
lay1cal_square ( cmd1 , i ) ;
2019-06-11 16:26:59 +00:00
}
lcd_commands_step = 3 ;
break ;
case 3 :
for ( uint8_t i = 12 ; i < 16 ; i + + )
{
2019-06-11 23:36:48 +00:00
lay1cal_square ( cmd1 , i ) ;
2019-06-11 16:26:59 +00:00
}
lcd_commands_step = 2 ;
break ;
case 2 :
enquecommand_P ( PSTR ( " M107 " ) ) ; //turn off printer fan
enquecommand_P ( PSTR ( " G1 E-0.07500 F2100.00000 " ) ) ; //retract
enquecommand_P ( PSTR ( " M104 S0 " ) ) ; // turn off temperature
enquecommand_P ( PSTR ( " M140 S0 " ) ) ; // turn off heatbed
enquecommand_P ( PSTR ( " G1 Z10 F1300.000 " ) ) ; //lift Z
enquecommand_P ( PSTR ( " G1 X10 Y180 F4000 " ) ) ; //Go to parking position
if ( mmu_enabled ) enquecommand_P ( PSTR ( " M702 C " ) ) ; //unload from nozzle
enquecommand_P ( PSTR ( " M84 " ) ) ; // disable motors
forceMenuExpire = true ; //if user dont confirm live adjust Z value by pressing the knob, we are saving last value by timeout to status screen
lcd_commands_step = 1 ;
break ;
case 1 :
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
lcd_commands_step = 0 ;
2019-06-12 16:19:41 +00:00
lcd_commands_type = LcdCommands : : Idle ;
2019-06-11 16:26:59 +00:00
if ( eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) = = 1 )
{
lcd_wizard ( WizState : : RepeatLay1Cal ) ;
}
break ;
2017-11-07 15:49:04 +00:00
}
}
}
# endif // not SNMM
2016-07-22 13:28:01 +00:00
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : FarmModeConfirm ) /// farm mode confirm
2016-07-22 13:28:01 +00:00
{
2018-08-19 16:34:57 +00:00
if ( lcd_commands_step = = 0 ) { lcd_commands_step = 6 ; }
2016-07-22 13:28:01 +00:00
if ( lcd_commands_step = = 1 & & ! blocks_queued ( ) )
{
lcd_confirm_print ( ) ;
lcd_commands_step = 0 ;
2019-06-12 16:19:41 +00:00
lcd_commands_type = LcdCommands : : Idle ;
2016-07-22 13:28:01 +00:00
}
if ( lcd_commands_step = = 2 & & ! blocks_queued ( ) )
{
lcd_commands_step = 1 ;
}
if ( lcd_commands_step = = 3 & & ! blocks_queued ( ) )
{
lcd_commands_step = 2 ;
}
if ( lcd_commands_step = = 4 & & ! blocks_queued ( ) )
{
enquecommand_P ( PSTR ( " G90 " ) ) ;
enquecommand_P ( PSTR ( " G1 X " STRINGIFY ( X_CANCEL_POS ) " Y " STRINGIFY ( Y_CANCEL_POS ) " E0 F7000 " ) ) ;
lcd_commands_step = 3 ;
}
if ( lcd_commands_step = = 5 & & ! blocks_queued ( ) )
{
lcd_commands_step = 4 ;
}
if ( lcd_commands_step = = 6 & & ! blocks_queued ( ) )
{
enquecommand_P ( PSTR ( " G91 " ) ) ;
enquecommand_P ( PSTR ( " G1 Z15 F1500 " ) ) ;
st_synchronize ( ) ;
2017-03-24 18:47:50 +00:00
# ifdef SNMM
lcd_commands_step = 7 ;
# else
2016-07-22 13:28:01 +00:00
lcd_commands_step = 5 ;
2017-03-24 18:47:50 +00:00
# endif
2016-07-22 13:28:01 +00:00
}
}
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : PidExtruder ) {
2017-06-29 16:35:43 +00:00
char cmd1 [ 30 ] ;
if ( lcd_commands_step = = 0 ) {
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : PidCal ;
2017-06-29 16:35:43 +00:00
custom_message_state = 1 ;
2018-07-16 00:13:52 +00:00
lcd_draw_update = 3 ;
2017-06-29 16:35:43 +00:00
lcd_commands_step = 3 ;
}
if ( lcd_commands_step = = 3 & & ! blocks_queued ( ) ) { //PID calibration
strcpy ( cmd1 , " M303 E0 S " ) ;
strcat ( cmd1 , ftostr3 ( pid_temp ) ) ;
2019-05-07 14:15:42 +00:00
// setting the correct target temperature (for visualization) is done in PID_autotune
2017-06-29 16:35:43 +00:00
enquecommand ( cmd1 ) ;
2018-05-22 01:20:03 +00:00
lcd_setstatuspgm ( _i ( " PID cal. " ) ) ; ////MSG_PID_RUNNING c=20 r=1
2017-06-29 16:35:43 +00:00
lcd_commands_step = 2 ;
}
if ( lcd_commands_step = = 2 & & pid_tuning_finished ) { //saving to eeprom
pid_tuning_finished = false ;
custom_message_state = 0 ;
2018-05-22 01:20:03 +00:00
lcd_setstatuspgm ( _i ( " PID cal. finished " ) ) ; ////MSG_PID_FINISHED c=20 r=1
2019-05-10 13:27:25 +00:00
setAllTargetHotends ( 0 ) ; // reset all hotends temperature including the number displayed on the main screen
2017-11-21 14:11:15 +00:00
if ( _Kp ! = 0 | | _Ki ! = 0 | | _Kd ! = 0 ) {
2017-06-29 16:35:43 +00:00
strcpy ( cmd1 , " M301 P " ) ;
strcat ( cmd1 , ftostr32 ( _Kp ) ) ;
strcat ( cmd1 , " I " ) ;
strcat ( cmd1 , ftostr32 ( _Ki ) ) ;
strcat ( cmd1 , " D " ) ;
strcat ( cmd1 , ftostr32 ( _Kd ) ) ;
enquecommand ( cmd1 ) ;
enquecommand_P ( PSTR ( " M500 " ) ) ;
2017-11-21 14:11:15 +00:00
}
else {
SERIAL_ECHOPGM ( " Invalid PID cal. results. Not stored to EEPROM. " ) ;
}
2019-01-27 21:48:51 +00:00
display_time = _millis ( ) ;
2017-06-29 16:35:43 +00:00
lcd_commands_step = 1 ;
}
2019-01-27 21:48:51 +00:00
if ( ( lcd_commands_step = = 1 ) & & ( ( _millis ( ) - display_time ) > 2000 ) ) { //calibration finished message
2018-05-23 14:37:08 +00:00
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : Status ;
2017-06-29 16:35:43 +00:00
pid_temp = DEFAULT_PID_TEMP ;
lcd_commands_step = 0 ;
2019-06-12 16:19:41 +00:00
lcd_commands_type = LcdCommands : : Idle ;
2017-06-29 16:35:43 +00:00
}
}
2016-07-22 13:28:01 +00:00
}
2018-08-02 16:54:00 +00:00
void lcd_return_to_status ( )
2018-07-15 16:37:59 +00:00
{
2018-07-16 21:23:15 +00:00
lcd_refresh ( ) ; // to maybe revive the LCD if static electricity killed it.
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_status_screen , 0 , false , true ) ;
2018-07-15 16:37:59 +00:00
menu_depth = 0 ;
2019-09-12 22:19:37 +00:00
eFilamentAction = FilamentAction : : None ; // i.e. non-autoLoad
2016-07-22 13:28:01 +00:00
}
2018-10-08 13:58:49 +00:00
//! @brief Pause print, disable nozzle heater, move to park position
void lcd_pause_print ( )
{
2019-12-14 17:05:08 +00:00
stop_and_save_print_to_ram ( 0.0 , - default_retraction ) ;
2019-12-03 18:56:05 +00:00
lcd_return_to_status ( ) ;
2018-10-08 13:58:49 +00:00
isPrintPaused = true ;
2019-06-12 16:19:41 +00:00
if ( LcdCommands : : Idle = = lcd_commands_type )
2018-10-08 13:58:49 +00:00
{
2019-06-12 16:19:41 +00:00
lcd_commands_type = LcdCommands : : LongPause ;
2018-10-08 13:58:49 +00:00
}
2019-09-19 17:48:59 +00:00
SERIAL_PROTOCOLLNRPGM ( MSG_OCTOPRINT_PAUSED ) ; //pause for octoprint
2016-07-22 13:28:01 +00:00
}
float move_menu_scale ;
static void lcd_move_menu_axis ( ) ;
/* Menu implementation */
2019-08-15 15:57:30 +00:00
static void lcd_cooldown ( )
2016-07-22 13:28:01 +00:00
{
2018-07-25 10:31:22 +00:00
setAllTargetHotends ( 0 ) ;
2016-07-22 13:28:01 +00:00
setTargetBed ( 0 ) ;
fanSpeed = 0 ;
2019-08-27 18:13:55 +00:00
eFilamentAction = FilamentAction : : None ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2019-09-13 14:55:05 +00:00
//! @brief append text label with a colon and format it into a fixed size output buffer
//! It would have been much easier if there was a ':' in the labels.
//! But since the texts like Bed, Nozzle and PINDA are used in other places
//! it is better to reuse these texts even though it requires some extra formatting code.
2019-09-18 10:49:44 +00:00
//! @param [in] ipgmLabel pointer to string in PROGMEM
//! @param [out] pointer to string in RAM which will receive the formatted text. Must be allocated to appropriate size
//! @param [in] dstSize allocated length of dst
2019-09-13 14:55:05 +00:00
static void pgmtext_with_colon ( const char * ipgmLabel , char * dst , uint8_t dstSize ) {
uint8_t i = 0 ;
2019-09-18 10:49:44 +00:00
for ( ; i < dstSize - 2 ; + + i ) { // 2 byte less than buffer, we'd be adding a ':' to the end
2019-09-13 14:55:05 +00:00
uint8_t b = pgm_read_byte ( ipgmLabel + i ) ;
if ( ! b )
break ;
dst [ i ] = b ;
}
dst [ i ] = ' : ' ; // append the colon
+ + i ;
for ( ; i < dstSize - 1 ; + + i ) // fill the rest with spaces
dst [ i ] = ' ' ;
2019-09-18 10:49:44 +00:00
dst [ dstSize - 1 ] = ' \0 ' ; // terminate the string properly
2019-09-13 14:55:05 +00:00
}
2016-07-22 13:28:01 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Extruder Info
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Nozzle FAN: 0000 RPM| FAN c=10 r=1 SPEED c=3 r=1
//! |Print FAN: 0000 RPM| FAN c=10 r=1 SPEED c=3 r=1
//! |Fil. Xd:000 Yd:000 | Fil. c=4 r=1
//! |Int: 000 Shut: 000 | Int: c=4 r=1 Shut: c=4 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2019-03-04 11:52:35 +00:00
void lcd_menu_extruder_info ( ) // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
2017-07-07 02:50:00 +00:00
{
2018-08-08 17:28:34 +00:00
2019-09-13 14:55:05 +00:00
// Display Nozzle fan RPM
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
lcd_home ( ) ;
2019-09-18 10:49:44 +00:00
static const size_t maxChars = 12 ;
char nozzle [ maxChars ] , print [ maxChars ] ;
2019-09-19 16:10:20 +00:00
pgmtext_with_colon ( _i ( " Nozzle FAN " ) , nozzle , maxChars ) ; ////c=10 r=1
pgmtext_with_colon ( _i ( " Print FAN " ) , print , maxChars ) ; ////c=10 r=1
2019-09-13 14:55:05 +00:00
lcd_printf_P ( _N ( " %s %4d RPM \n " " %s %4d RPM \n " ) , nozzle , 60 * fan_speed [ 0 ] , print , 60 * fan_speed [ 1 ] ) ;
2018-07-23 10:54:48 +00:00
2019-01-31 17:03:56 +00:00
# ifdef PAT9125
2018-02-21 14:19:34 +00:00
// Display X and Y difference from Filament sensor
2017-07-07 02:50:00 +00:00
// Display Light intensity from Filament sensor
2018-06-10 21:45:35 +00:00
// Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
// value ranges from 0(darkest) to 255(brightest).
2017-11-27 06:44:12 +00:00
// Display LASER shutter time from Filament sensor
2018-06-10 21:45:35 +00:00
// Shutter register is an index of LASER shutter time. It is automatically controlled by the chip's internal
// auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small.
// When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46.
2018-08-27 03:20:42 +00:00
if ( mmu_enabled = = false )
2018-07-23 10:54:48 +00:00
{
2018-08-27 03:20:42 +00:00
if ( ! fsensor_enabled )
lcd_puts_P ( _N ( " Filament sensor \n " " is disabled. " ) ) ;
else
{
2019-06-12 16:19:41 +00:00
if ( ! moves_planned ( ) & & ! IS_SD_PRINTING & & ! is_usb_printing & & ( lcd_commands_type ! = LcdCommands : : Layer1Cal ) )
2018-08-27 03:20:42 +00:00
pat9125_update ( ) ;
lcd_printf_P ( _N (
2019-08-22 02:58:16 +00:00
" Fil. Xd:%3d Yd:%3d \n " ////c=4 r=1
2019-09-20 11:01:07 +00:00
" Int: %3d " ////c=4 r=1
" Shut: %3d " ////c=4 r=1
2018-08-27 03:20:42 +00:00
) ,
pat9125_x , pat9125_y ,
pat9125_b , pat9125_s
) ;
}
2018-07-23 10:54:48 +00:00
}
2019-01-31 17:03:56 +00:00
# endif //PAT9125
2017-07-07 02:50:00 +00:00
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-07-07 02:50:00 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show Fails Statistics MMU
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | Main | c=18 r=1
//! | Last print | c=18 r=1
//! | Total | c=18 r=1
//! | |
//! ----------------------
//! @endcode
2018-12-18 16:33:27 +00:00
static void lcd_menu_fails_stats_mmu ( )
{
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-08-22 02:58:16 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Last print " ) , lcd_menu_fails_stats_mmu_print ) ; ////c=18 r=1
MENU_ITEM_SUBMENU_P ( _i ( " Total " ) , lcd_menu_fails_stats_mmu_total ) ; ////c=18 r=1
2018-12-18 16:33:27 +00:00
MENU_END ( ) ;
}
2019-08-22 02:58:16 +00:00
//! @brief Show Last Print Failures Statistics MMU
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | c=20 r=1
//! | MMU fails: 000| c=14 r=1
//! | MMU load fails: 000| c=14 r=1
//! | |
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-12-18 16:35:41 +00:00
static void lcd_menu_fails_stats_mmu_print ( )
{
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
uint8_t fails = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_FAIL ) ;
uint16_t load_fails = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_LOAD_FAIL ) ;
2019-09-13 14:55:05 +00:00
lcd_home ( ) ;
2019-09-20 11:01:07 +00:00
lcd_printf_P ( PSTR ( " %S \n " " %-16.16S%-3d \n " " %-16.16S%-3d " ) ,
_i ( " Last print failures " ) , ////c=20 r=1
_i ( " MMU fails " ) , fails , ////c=14 r=1
_i ( " MMU load fails " ) , load_fails ) ; ////c=14 r=1
2019-09-13 14:55:05 +00:00
menu_back_if_clicked_fb ( ) ;
2018-12-18 16:35:41 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show Total Failures Statistics MMU
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Total failures | c=20 r=1
//! | MMU fails: 000| c=14 r=1
//! | MMU load fails: 000| c=14 r=1
//! | MMU power fails:000| c=14 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-12-18 16:35:41 +00:00
static void lcd_menu_fails_stats_mmu_total ( )
{
2019-02-13 00:51:39 +00:00
mmu_command ( MmuCmd : : S3 ) ;
2018-12-18 16:35:41 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
uint8_t fails = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_FAIL_TOT ) ;
uint16_t load_fails = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_LOAD_FAIL_TOT ) ;
2019-09-13 14:55:05 +00:00
lcd_home ( ) ;
2019-09-20 11:01:07 +00:00
lcd_printf_P ( PSTR ( " %S \n " " %-16.16S%-3d \n " " %-16.16S%-3d \n " " %-16.16S%-3d " ) ,
_i ( " Total failures " ) , ////c=20 r=1
_i ( " MMU fails " ) , fails , ////c=14 r=1
_i ( " MMU load fails " ) , load_fails , ////c=14 r=1
_i ( " MMU power fails " ) , mmu_power_failures ) ; ////c=14 r=1
2019-09-13 14:55:05 +00:00
menu_back_if_clicked_fb ( ) ;
2018-12-18 16:35:41 +00:00
}
2018-07-22 14:14:13 +00:00
# if defined(TMC2130) && defined(FILAMENT_SENSOR)
2019-09-19 16:39:25 +00:00
static const char failStatsFmt [ ] PROGMEM = " %S \n " " %-16.16S%-3d \n " " %-16.16S%-3d \n " " %-7.7SX %-3d Y %-3d " ;
2019-08-22 02:58:16 +00:00
//! @brief Show Total Failures Statistics MMU
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Total failures | c=20 r=1
//! | Power failures: 000| c=14 r=1
//! | Filam. runouts: 000| c=14 r=1
//! | Crash X:000 Y:000| c=7 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-01-30 12:10:36 +00:00
static void lcd_menu_fails_stats_total ( )
2017-09-26 13:14:17 +00:00
{
2018-08-08 17:28:34 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-01-30 12:10:36 +00:00
uint16_t power = eeprom_read_word ( ( uint16_t * ) EEPROM_POWER_COUNT_TOT ) ;
uint16_t filam = eeprom_read_word ( ( uint16_t * ) EEPROM_FERROR_COUNT_TOT ) ;
uint16_t crashX = eeprom_read_word ( ( uint16_t * ) EEPROM_CRASH_COUNT_X_TOT ) ;
uint16_t crashY = eeprom_read_word ( ( uint16_t * ) EEPROM_CRASH_COUNT_Y_TOT ) ;
2019-09-13 14:55:05 +00:00
lcd_home ( ) ;
2019-09-20 11:01:07 +00:00
lcd_printf_P ( failStatsFmt ,
_i ( " Total failures " ) , ////c=20 r=1
_i ( " Power failures " ) , power , ////c=14 r=1
_i ( " Filam. runouts " ) , filam , ////c=14 r=1
_i ( " Crash " ) , crashX , crashY ) ; ////c=7 r=1
2019-09-13 14:55:05 +00:00
menu_back_if_clicked_fb ( ) ;
2017-09-26 13:14:17 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show Last Print Failures Statistics
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | c=20 r=1
2019-10-16 14:32:49 +00:00
//! | Power failures 000| c=14 r=1
//! | Filam. runouts 000| c=14 r=1
2019-08-22 02:58:16 +00:00
//! | Crash X:000 Y:000| c=7 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-01-30 12:10:36 +00:00
static void lcd_menu_fails_stats_print ( )
{
2018-08-08 17:28:34 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-01-30 12:10:36 +00:00
uint8_t power = eeprom_read_byte ( ( uint8_t * ) EEPROM_POWER_COUNT ) ;
uint8_t filam = eeprom_read_byte ( ( uint8_t * ) EEPROM_FERROR_COUNT ) ;
uint8_t crashX = eeprom_read_byte ( ( uint8_t * ) EEPROM_CRASH_COUNT_X ) ;
uint8_t crashY = eeprom_read_byte ( ( uint8_t * ) EEPROM_CRASH_COUNT_Y ) ;
2019-09-13 14:55:05 +00:00
lcd_home ( ) ;
2020-02-05 14:17:19 +00:00
# ifndef PAT9125
2019-09-20 11:01:07 +00:00
lcd_printf_P ( failStatsFmt ,
_i ( " Last print failures " ) , ////c=20 r=1
_i ( " Power failures " ) , power , ////c=14 r=1
_i ( " Filam. runouts " ) , filam , ////c=14 r=1
_i ( " Crash " ) , crashX , crashY ) ; ////c=7 r=1
2020-02-05 14:17:19 +00:00
# else
// On the MK3 include detailed PAT9125 statistics about soft failures
2019-06-02 16:00:31 +00:00
lcd_printf_P ( PSTR ( " %S \n "
2020-02-05 14:17:19 +00:00
" %-16.16S%-3d \n "
" %-7.7S H %-3d S %-3d \n "
" %-7.7S X %-3d Y %-3d " ) ,
_i ( " Last print failures " ) , ////c=20 r=1
_i ( " Power failures " ) , power , ////c=14 r=1
2020-05-12 20:23:40 +00:00
_i ( " Runouts " ) , filam , fsensor_softfail , //c=7
2020-02-05 14:17:19 +00:00
_i ( " Crash " ) , crashX , crashY ) ; ////c=7 r=1
# endif
2019-09-13 14:55:05 +00:00
menu_back_if_clicked_fb ( ) ;
2018-01-30 12:10:36 +00:00
}
2018-12-12 23:12:00 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Open fail statistics menu
//!
//! This version of function is used, when there is filament sensor,
//! power failure and crash detection.
//! There are Last print and Total menu items.
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | Main | c=18 r=1
//! | Last print | c=18 r=1
//! | Total | c=18 r=1
//! | |
//! ----------------------
//! @endcode
2018-12-12 23:12:00 +00:00
2018-01-30 12:10:36 +00:00
static void lcd_menu_fails_stats ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-08-22 02:58:16 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Last print " ) , lcd_menu_fails_stats_print ) ; ////c=18 r=1
MENU_ITEM_SUBMENU_P ( _i ( " Total " ) , lcd_menu_fails_stats_total ) ; ////c=18 r=1
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2018-01-30 12:10:36 +00:00
}
2018-12-12 23:12:00 +00:00
2018-07-22 14:14:13 +00:00
# elif defined(FILAMENT_SENSOR)
2019-10-16 14:32:49 +00:00
static const char failStatsFmt [ ] PROGMEM = " %S \n " " %-16.16S%-3d \n " " %S \n " " %-16.16S%-3d \n " ;
2019-08-22 02:58:16 +00:00
//!
//! @brief Print last print and total filament run outs
//!
//! This version of function is used, when there is filament sensor,
//! but no other sensors (e.g. power failure, crash detection).
//!
//! Example screen:
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | c=20 r=1
2019-10-16 14:32:49 +00:00
//! | Filam. runouts 000| c=14 r=1
2019-08-22 02:58:16 +00:00
//! |Total failures | c=20 r=1
2019-10-16 14:32:49 +00:00
//! | Filam. runouts 000| c=14 r=1
2019-08-22 02:58:16 +00:00
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-03-05 20:42:04 +00:00
static void lcd_menu_fails_stats ( )
{
2018-08-08 17:28:34 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-03-05 20:42:04 +00:00
uint8_t filamentLast = eeprom_read_byte ( ( uint8_t * ) EEPROM_FERROR_COUNT ) ;
uint16_t filamentTotal = eeprom_read_word ( ( uint16_t * ) EEPROM_FERROR_COUNT_TOT ) ;
2019-07-15 17:32:58 +00:00
lcd_home ( ) ;
2019-10-16 14:32:49 +00:00
lcd_printf_P ( failStatsFmt ,
_i ( " Last print failures " ) , ////c=20 r=1
_i ( " Filam. runouts " ) , filamentLast , ////c=14 r=1
_i ( " Total failures " ) , ////c=20 r=1
_i ( " Filam. runouts " ) , filamentTotal ) ; ////c=14 r=1
menu_back_if_clicked ( ) ;
2018-03-05 20:42:04 +00:00
}
2018-07-22 14:14:13 +00:00
# else
static void lcd_menu_fails_stats ( )
{
2018-08-08 17:28:34 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-07-22 14:14:13 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
MENU_END ( ) ;
}
2018-02-01 19:08:11 +00:00
# endif //TMC2130
2018-01-30 12:10:36 +00:00
2018-01-18 15:43:40 +00:00
# ifdef DEBUG_BUILD
2018-02-20 18:02:55 +00:00
# ifdef DEBUG_STACK_MONITOR
2017-12-10 19:38:09 +00:00
extern uint16_t SP_min ;
2017-12-11 15:17:36 +00:00
extern char * __malloc_heap_start ;
extern char * __malloc_heap_end ;
2018-02-20 18:02:55 +00:00
# endif //DEBUG_STACK_MONITOR
2017-12-10 22:45:46 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Debug Information
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |RAM statistics | c=20 r=1
//! | SP_min: 0000| c=14 r=1
//! | heap_start: 0000| c=14 r=1
//! | heap_end: 0000| c=14 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2017-12-10 19:38:09 +00:00
static void lcd_menu_debug ( )
{
2018-02-20 18:02:55 +00:00
# ifdef DEBUG_STACK_MONITOR
2019-07-15 17:32:58 +00:00
lcd_home ( ) ;
2019-09-20 11:01:07 +00:00
lcd_printf_P ( PSTR ( " RAM statistics \n " ////c=20 r=1
" SP_min: 0x%04x \n " ////c=14 r=1
" heap_start: 0x%04x \n " ////c=14 r=1
" heap_end: 0x%04x " ) , SP_min , __malloc_heap_start , __malloc_heap_end ) ; ////c=14 r=1
2018-02-20 18:02:55 +00:00
# endif //DEBUG_STACK_MONITOR
2017-12-10 19:38:09 +00:00
2018-06-24 10:41:36 +00:00
menu_back_if_clicked_fb ( ) ;
2017-12-10 19:38:09 +00:00
}
2018-01-18 15:43:40 +00:00
# endif /* DEBUG_BUILD */
2017-12-10 19:38:09 +00:00
2019-09-13 14:55:05 +00:00
//! @brief common line print for lcd_menu_temperatures
2019-09-18 10:49:44 +00:00
//! @param [in] ipgmLabel pointer to string in PROGMEM
//! @param [in] value to be printed behind the label
2019-09-13 14:55:05 +00:00
static void lcd_menu_temperatures_line ( const char * ipgmLabel , int value ) {
2019-09-18 10:49:44 +00:00
static const size_t maxChars = 15 ;
char tmp [ maxChars ] ;
pgmtext_with_colon ( ipgmLabel , tmp , maxChars ) ;
2019-09-13 14:55:05 +00:00
lcd_printf_P ( PSTR ( " %s%3d \x01 \n " ) , tmp , value ) ; // no need to add -14.14 to string alignment
}
2019-09-19 16:10:20 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Temperatures
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | Nozzle: 000D| c=14 r=1
//! | Bed: 000D| c=14 r=1
//! | Ambient: 000D| c=14 r=1
//! | PINDA: 000D| c=14 r=1
//! ----------------------
//! D - Degree sysmbol LCD_STR_DEGREE
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2017-09-05 12:02:35 +00:00
static void lcd_menu_temperatures ( )
{
2019-09-13 14:55:05 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
lcd_home ( ) ;
2019-09-19 16:10:20 +00:00
lcd_menu_temperatures_line ( _T ( MSG_NOZZLE ) , ( int ) current_temperature [ 0 ] ) ; ////c=14 r=1
lcd_menu_temperatures_line ( _T ( MSG_BED ) , ( int ) current_temperature_bed ) ; ////c=14 r=1
2018-02-01 19:08:11 +00:00
# ifdef AMBIENT_THERMISTOR
2019-09-19 16:10:20 +00:00
lcd_menu_temperatures_line ( _i ( " Ambient " ) , ( int ) current_temperature_ambient ) ; ////c=14 r=1
2018-02-01 19:08:11 +00:00
# endif //AMBIENT_THERMISTOR
2019-09-30 16:13:57 +00:00
# ifdef PINDA_THERMISTOR
2020-05-12 20:23:40 +00:00
lcd_menu_temperatures_line ( _i ( " PINDA " ) , ( int ) current_temperature_pinda ) ; ////c=14
2019-09-30 16:13:57 +00:00
# endif //PINDA_THERMISTOR
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-12-15 17:33:35 +00:00
}
2020-03-26 13:40:47 +00:00
# if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || defined(IR_SENSOR_ANALOG)
2017-12-15 17:33:35 +00:00
# define VOLT_DIV_R1 10000
# define VOLT_DIV_R2 2370
# define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
2019-09-15 22:43:37 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Voltages
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | |
//! | PWR: 00.0V | c=12 r=1
//! | Bed: 00.0V | c=12 r=1
2020-03-26 13:40:47 +00:00
//! | IR : 00.0V | c=12 r=1 optional
2019-08-22 02:58:16 +00:00
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2017-12-15 17:33:35 +00:00
static void lcd_menu_voltages ( )
{
2020-03-26 13:40:47 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
float volt_pwr = VOLT_DIV_REF * ( ( float ) current_voltage_raw_pwr / ( 1023 * OVERSAMPLENR ) ) / VOLT_DIV_FAC ;
float volt_bed = VOLT_DIV_REF * ( ( float ) current_voltage_raw_bed / ( 1023 * OVERSAMPLENR ) ) / VOLT_DIV_FAC ;
lcd_home ( ) ;
lcd_printf_P ( PSTR ( " PWR: %4.1fV \n " " BED: %4.1fV " ) , volt_pwr , volt_bed ) ;
# ifdef IR_SENSOR_ANALOG
2020-04-28 08:20:21 +00:00
lcd_printf_P ( PSTR ( " \n IR : %3.1fV " ) , Raw2Voltage ( current_voltage_raw_IR ) ) ;
2019-09-15 22:43:37 +00:00
# endif //IR_SENSOR_ANALOG
2020-03-26 13:40:47 +00:00
menu_back_if_clicked ( ) ;
2017-11-27 03:46:58 +00:00
}
2020-03-26 13:40:47 +00:00
# endif //defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || defined(IR_SENSOR_ANALOG)
2017-11-27 03:46:58 +00:00
2018-02-08 20:07:17 +00:00
# ifdef TMC2130
2019-08-22 02:58:16 +00:00
//! @brief Show Belt Status
//!
//! @code{.unparsed}
//! |01234567890123456789|
2020-05-12 20:23:40 +00:00
//! | Belt status | c=18
2019-08-22 02:58:16 +00:00
//! | X: 000 |
//! | Y: 000 |
//! | |
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2017-11-27 03:46:58 +00:00
static void lcd_menu_belt_status ( )
{
2019-07-15 17:32:58 +00:00
lcd_home ( ) ;
lcd_printf_P ( PSTR ( " %S \n " " X %d \n " " Y %d " ) , _i ( " Belt status " ) , eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_X ) ) , eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_Y ) ) ) ;
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-09-05 12:02:35 +00:00
}
2018-02-08 20:07:17 +00:00
# endif //TMC2130
2016-07-22 13:28:01 +00:00
2018-07-23 10:54:48 +00:00
# ifdef RESUME_DEBUG
2017-09-20 23:52:28 +00:00
extern void stop_and_save_print_to_ram ( float z_move , float e_move ) ;
extern void restore_print_from_ram_and_continue ( float e_move ) ;
2017-09-19 19:38:47 +00:00
static void lcd_menu_test_save ( )
{
2017-09-20 23:52:28 +00:00
stop_and_save_print_to_ram ( 10 , - 0.8 ) ;
2017-09-19 19:38:47 +00:00
}
static void lcd_menu_test_restore ( )
{
2017-09-20 23:52:28 +00:00
restore_print_from_ram_and_continue ( 0.8 ) ;
2017-09-19 19:38:47 +00:00
}
2018-07-23 10:54:48 +00:00
# endif //RESUME_DEBUG
2017-09-19 19:38:47 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Preheat Menu
2016-07-22 13:28:01 +00:00
static void lcd_preheat_menu ( )
{
2019-08-26 18:11:52 +00:00
eFilamentAction = FilamentAction : : Preheat ;
2019-09-12 16:15:15 +00:00
lcd_generic_preheat_menu ( ) ;
2016-07-22 13:28:01 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show Support Menu
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | Main |
//! | Firmware: | c=18 r=1
//! | 3.7.2.-2363 | c=16 r=1
//! | prusa3d.com | MSG_PRUSA3D
//! | forum.prusa3d.com | MSG_PRUSA3D_FORUM
//! | howto.prusa3d.com | MSG_PRUSA3D_HOWTO
//! | -------------- | STR_SEPARATOR
//! | 1_75mm_MK3 | FILAMENT_SIZE
//! | howto.prusa3d.com | ELECTRONICS
//! | howto.prusa3d.com | NOZZLE_TYPE
//! | -------------- | STR_SEPARATOR
//! | Date: | c=17 r=1
//! | MMM DD YYYY | __DATE__
//! | -------------- | STR_SEPARATOR
//! @endcode
//!
//! If MMU is connected
//!
//! @code{.unparsed}
//! | MMU2 connected | c=18 r=1
//! | FW: 1.0.6-7064523 |
//! @endcode
//!
//! If MMU is not connected
//!
//! @code{.unparsed}
//! | MMU2 N/A | c=18 r=1
//! @endcode
//!
//! If Flash Air is connected
//!
//! @code{.unparsed}
//! | -------------- | STR_SEPARATOR
//! | FlashAir IP Addr: | c=18 r=1
//! | 192.168.1.100 |
//! @endcode
//!
//! @code{.unparsed}
//! | -------------- | STR_SEPARATOR
2020-05-12 20:23:40 +00:00
//! | XYZ cal. details | MSG_XYZ_DETAILS c=18
2019-08-22 02:58:16 +00:00
//! | Extruder info | MSG_INFO_EXTRUDER
//! | XYZ cal. details | MSG_INFO_SENSORS
//! @endcode
//!
//! If TMC2130 defined
//!
//! @code{.unparsed}
//! | Belt status | MSG_MENU_BELT_STATUS
//! @endcode
//!
//! @code{.unparsed}
//! | Temperatures | MSG_MENU_TEMPERATURES
//! @endcode
//!
//! If Voltage Bed and PWR Pin are defined
//!
//! @code{.unparsed}
//! | Voltages | MSG_MENU_VOLTAGES
//! @endcode
//!
//!
//! If DEBUG_BUILD is defined
//!
//! @code{.unparsed}
//! | Debug | c=18 r=1
//! @endcode
//! ----------------------
//! @endcode
2016-07-22 13:28:01 +00:00
static void lcd_support_menu ( )
{
2018-08-10 00:59:49 +00:00
typedef struct
{ // 22bytes total
int8_t status ; // 1byte
bool is_flash_air ; // 1byte
uint8_t ip [ 4 ] ; // 4bytes
char ip_str [ 3 * 4 + 3 + 1 ] ; // 16bytes
} _menu_data_t ;
2018-08-22 16:55:42 +00:00
static_assert ( sizeof ( menu_data ) > = sizeof ( _menu_data_t ) , " _menu_data_t doesn't fit into menu_data " ) ;
2018-08-10 00:59:49 +00:00
_menu_data_t * _md = ( _menu_data_t * ) & ( menu_data [ 0 ] ) ;
if ( _md - > status = = 0 | | lcd_draw_update = = 2 )
2018-08-09 15:43:43 +00:00
{
2016-08-11 08:42:53 +00:00
// Menu was entered or SD card status has changed (plugged in or removed).
// Initialize its status.
2018-08-10 00:59:49 +00:00
_md - > status = 1 ;
_md - > is_flash_air = card . ToshibaFlashAir_isEnabled ( ) & & card . ToshibaFlashAir_GetIP ( _md - > ip ) ;
if ( _md - > is_flash_air )
sprintf_P ( _md - > ip_str , PSTR ( " %d.%d.%d.%d " ) ,
_md - > ip [ 0 ] , _md - > ip [ 1 ] ,
_md - > ip [ 2 ] , _md - > ip [ 3 ] ) ;
} else if ( _md - > is_flash_air & &
_md - > ip [ 0 ] = = 0 & & _md - > ip [ 1 ] = = 0 & &
_md - > ip [ 2 ] = = 0 & & _md - > ip [ 3 ] = = 0 & &
+ + _md - > status = = 16 )
2018-08-09 15:43:43 +00:00
{
2016-08-11 08:42:53 +00:00
// Waiting for the FlashAir card to get an IP address from a router. Force an update.
2018-08-10 00:59:49 +00:00
_md - > status = 0 ;
2016-08-11 08:42:53 +00:00
}
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
2016-07-22 13:28:01 +00:00
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2016-07-22 13:28:01 +00:00
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( PSTR ( " Firmware: " ) ) ;
MENU_ITEM_BACK_P ( PSTR ( " " FW_VERSION_FULL ) ) ;
2018-01-18 15:24:25 +00:00
# if (FW_DEV_VERSION != FW_VERSION_GOLD) && (FW_DEV_VERSION != FW_VERSION_RC)
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( PSTR ( " repo " FW_REPOSITORY ) ) ;
2018-01-18 15:24:25 +00:00
# endif
2016-07-22 13:28:01 +00:00
// Ideally this block would be optimized out by the compiler.
2017-10-17 19:05:31 +00:00
/* const uint8_t fw_string_len = strlen_P(FW_VERSION_STR_P());
2016-07-22 13:28:01 +00:00
if ( fw_string_len < 6 ) {
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( PSTR ( MSG_FW_VERSION " - " FW_version ) ) ;
2016-07-22 13:28:01 +00:00
} else {
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( PSTR ( " FW - " FW_version ) ) ;
2017-10-17 19:05:31 +00:00
} */
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
MENU_ITEM_BACK_P ( _i ( " prusa3d.com " ) ) ; ////MSG_PRUSA3D
MENU_ITEM_BACK_P ( _i ( " forum.prusa3d.com " ) ) ; ////MSG_PRUSA3D_FORUM
MENU_ITEM_BACK_P ( _i ( " howto.prusa3d.com " ) ) ; ////MSG_PRUSA3D_HOWTO
2018-08-09 15:43:43 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( PSTR ( FILAMENT_SIZE ) ) ;
MENU_ITEM_BACK_P ( PSTR ( ELECTRONICS ) ) ;
MENU_ITEM_BACK_P ( PSTR ( NOZZLE_TYPE ) ) ;
2018-08-09 15:43:43 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( _i ( " Date: " ) ) ; ////MSG_DATE c=17 r=1
MENU_ITEM_BACK_P ( PSTR ( __DATE__ ) ) ;
2016-07-22 13:28:01 +00:00
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2020-03-02 16:52:25 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
MENU_ITEM_BACK_P ( PSTR ( " Fil. sensor v.: " ) ) ;
2020-06-03 14:14:56 +00:00
MENU_ITEM_BACK_P ( FsensorIRVersionText ( ) ) ;
2020-03-02 20:18:11 +00:00
# endif // IR_SENSOR_ANALOG
2020-03-02 16:52:25 +00:00
2018-08-09 15:43:43 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
if ( mmu_enabled )
{
2019-08-22 02:58:16 +00:00
MENU_ITEM_BACK_P ( _i ( " MMU2 connected " ) ) ; ////c=18 r=1
MENU_ITEM_BACK_P ( PSTR ( " FW: " ) ) ; ////c=17 r=1
2018-08-09 15:43:43 +00:00
if ( ( ( menu_item - 1 ) = = menu_line ) & & lcd_draw_update )
{
lcd_set_cursor ( 6 , menu_row ) ;
if ( ( mmu_version > 0 ) & & ( mmu_buildnr > 0 ) )
lcd_printf_P ( PSTR ( " %d.%d.%d-%d " ) , mmu_version / 100 , mmu_version % 100 / 10 , mmu_version % 10 , mmu_buildnr ) ;
else
2018-11-22 13:37:29 +00:00
lcd_puts_P ( _i ( " unknown " ) ) ;
2018-08-09 15:43:43 +00:00
}
}
else
MENU_ITEM_BACK_P ( PSTR ( " MMU2 N/A " ) ) ;
2016-07-22 13:28:01 +00:00
// Show the FlashAir IP address, if the card is available.
2018-08-10 00:59:49 +00:00
if ( _md - > is_flash_air ) {
2018-08-09 15:43:43 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
2019-08-22 02:58:16 +00:00
MENU_ITEM_BACK_P ( PSTR ( " FlashAir IP Addr: " ) ) ; //c=18 r=1
2018-08-10 00:59:49 +00:00
///! MENU_ITEM(back_RAM, _md->ip_str, 0);
2016-07-22 13:28:01 +00:00
}
2018-08-09 15:43:43 +00:00
2017-06-29 16:35:43 +00:00
# ifndef MK1BP
2018-08-09 15:43:43 +00:00
MENU_ITEM_BACK_P ( STR_SEPARATOR ) ;
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " XYZ cal. details " ) , lcd_menu_xyz_y_min ) ; ////MSG_XYZ_DETAILS c=18
MENU_ITEM_SUBMENU_P ( _i ( " Extruder info " ) , lcd_menu_extruder_info ) ; ////MSG_INFO_EXTRUDER c=18
2019-02-06 20:36:21 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Sensor info " ) , lcd_menu_show_sensors_state ) ; ////MSG_INFO_SENSORS c=18 r=1
2018-02-08 20:07:17 +00:00
# ifdef TMC2130
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Belt status " ) , lcd_menu_belt_status ) ; ////MSG_MENU_BELT_STATUS c=18
2018-02-08 20:07:17 +00:00
# endif //TMC2130
2017-09-26 13:14:17 +00:00
2018-12-21 17:51:13 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Temperatures " ) , lcd_menu_temperatures ) ; ////MSG_MENU_TEMPERATURES c=18 r=1
2017-12-15 17:33:35 +00:00
2018-04-11 16:32:27 +00:00
# if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN)
2018-12-21 17:51:13 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Voltages " ) , lcd_menu_voltages ) ; ////MSG_MENU_VOLTAGES c=18 r=1
2018-04-11 16:32:27 +00:00
# endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
2018-01-18 15:43:40 +00:00
# ifdef DEBUG_BUILD
2019-08-22 02:58:16 +00:00
MENU_ITEM_SUBMENU_P ( PSTR ( " Debug " ) , lcd_menu_debug ) ; ////c=18 r=1
2018-01-18 15:43:40 +00:00
# endif /* DEBUG_BUILD */
2017-06-29 16:35:43 +00:00
# endif //MK1BP
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
2017-09-21 13:20:02 +00:00
void lcd_set_fan_check ( ) {
fans_check_enabled = ! fans_check_enabled ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_FAN_CHECK_ENABLED , fans_check_enabled ) ;
2019-11-17 09:10:13 +00:00
# ifdef FANCHECK
2019-11-17 08:44:11 +00:00
if ( fans_check_enabled = = false ) fan_check_error = EFCE_OK ; //reset error if fanCheck is disabled during error. Allows resuming print.
2019-11-17 09:10:13 +00:00
# endif //FANCHECK
2017-09-21 13:20:02 +00:00
}
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-02-27 16:34:03 +00:00
void lcd_cutter_enabled ( )
{
2019-05-30 18:46:41 +00:00
if ( EEPROM_MMU_CUTTER_ENABLED_enabled = = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED ) )
2019-02-27 16:34:03 +00:00
{
2019-05-30 18:46:41 +00:00
# ifndef MMU_ALWAYS_CUT
2019-02-27 16:34:03 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED , 0 ) ;
}
2019-05-30 18:46:41 +00:00
# else //MMU_ALWAYS_CUT
eeprom_update_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED , EEPROM_MMU_CUTTER_ENABLED_always ) ;
}
else if ( EEPROM_MMU_CUTTER_ENABLED_always = = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED ) )
{
eeprom_update_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED , 0 ) ;
}
# endif //MMU_ALWAYS_CUT
2019-02-27 16:34:03 +00:00
else
{
2019-05-30 18:46:41 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED , EEPROM_MMU_CUTTER_ENABLED_enabled ) ;
2019-02-27 16:34:03 +00:00
}
2019-02-27 09:42:26 +00:00
}
2019-03-15 02:38:37 +00:00
# endif //MMU_HAS_CUTTER
2019-02-27 09:42:26 +00:00
2017-12-20 21:29:41 +00:00
void lcd_set_filament_autoload ( ) {
2018-07-20 12:03:22 +00:00
fsensor_autoload_set ( ! fsensor_autoload_enabled ) ;
2017-12-20 21:29:41 +00:00
}
2020-02-05 14:17:19 +00:00
# if defined(FILAMENT_SENSOR) && defined(PAT9125)
2018-10-04 13:48:28 +00:00
void lcd_set_filament_oq_meass ( )
{
fsensor_oq_meassure_set ( ! fsensor_oq_meassure_enabled ) ;
}
2020-02-05 14:17:19 +00:00
# endif
2018-10-04 13:48:28 +00:00
2019-06-12 17:11:41 +00:00
FilamentAction eFilamentAction = FilamentAction : : None ; // must be initialized as 'non-autoLoad'
2019-01-31 04:21:53 +00:00
bool bFilamentFirstRun ;
bool bFilamentPreheatState ;
2019-02-20 02:01:33 +00:00
bool bFilamentAction = false ;
2019-08-27 18:48:53 +00:00
static bool bFilamentWaitingFlag = false ;
2019-01-31 04:21:53 +00:00
static void mFilamentPrompt ( )
2016-07-22 13:28:01 +00:00
{
2019-02-21 03:45:44 +00:00
uint8_t nLevel ;
2019-01-31 04:21:53 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcdui_print_temp ( LCD_STR_THERMOMETER [ 0 ] , ( int ) degHotend ( 0 ) , ( int ) degTargetHotend ( 0 ) ) ;
lcd_set_cursor ( 0 , 2 ) ;
2019-02-13 22:53:00 +00:00
lcd_puts_P ( _i ( " Press the knob " ) ) ; ////MSG_ c=20 r=1
2019-01-31 04:21:53 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2019-02-13 22:53:00 +00:00
switch ( eFilamentAction )
{
2019-06-12 17:11:41 +00:00
case FilamentAction : : Load :
case FilamentAction : : AutoLoad :
case FilamentAction : : MmuLoad :
2019-02-13 22:53:00 +00:00
lcd_puts_P ( _i ( " to load filament " ) ) ; ////MSG_ c=20 r=1
break ;
2019-06-12 17:11:41 +00:00
case FilamentAction : : UnLoad :
case FilamentAction : : MmuUnLoad :
2019-02-13 22:53:00 +00:00
lcd_puts_P ( _i ( " to unload filament " ) ) ; ////MSG_ c=20 r=1
break ;
2019-06-12 17:11:41 +00:00
case FilamentAction : : MmuEject :
case FilamentAction : : MmuCut :
case FilamentAction : : None :
2019-08-27 18:23:48 +00:00
case FilamentAction : : Preheat :
2019-09-12 15:54:05 +00:00
case FilamentAction : : Lay1Cal :
2019-02-13 22:53:00 +00:00
break ;
}
2019-01-31 04:21:53 +00:00
if ( lcd_clicked ( ) )
{
2019-02-21 03:45:44 +00:00
nLevel = 2 ;
2019-01-31 04:21:53 +00:00
if ( ! bFilamentPreheatState )
{
2019-02-21 03:45:44 +00:00
nLevel + + ;
2019-02-22 02:09:50 +00:00
// setTargetHotend0(0.0); // uncoment if return to base-state is required
2019-01-31 04:21:53 +00:00
}
2019-02-21 03:45:44 +00:00
menu_back ( nLevel ) ;
2019-02-13 22:53:00 +00:00
switch ( eFilamentAction )
2019-01-31 04:21:53 +00:00
{
2019-06-12 17:11:41 +00:00
case FilamentAction : : AutoLoad :
eFilamentAction = FilamentAction : : None ; // i.e. non-autoLoad
2019-03-01 17:07:19 +00:00
// no break
2019-06-12 17:11:41 +00:00
case FilamentAction : : Load :
2019-02-22 02:09:50 +00:00
loading_flag = true ;
2019-02-13 22:53:00 +00:00
enquecommand_P ( PSTR ( " M701 " ) ) ; // load filament
break ;
2019-06-12 17:11:41 +00:00
case FilamentAction : : UnLoad :
2019-02-13 22:53:00 +00:00
enquecommand_P ( PSTR ( " M702 " ) ) ; // unload filament
break ;
2019-06-12 17:11:41 +00:00
case FilamentAction : : MmuLoad :
case FilamentAction : : MmuUnLoad :
case FilamentAction : : MmuEject :
case FilamentAction : : MmuCut :
case FilamentAction : : None :
2019-08-27 18:23:48 +00:00
case FilamentAction : : Preheat :
2019-09-12 15:54:05 +00:00
case FilamentAction : : Lay1Cal :
2019-02-13 22:53:00 +00:00
break ;
2019-01-31 04:21:53 +00:00
}
}
}
2016-07-22 13:28:01 +00:00
2019-08-26 17:48:39 +00:00
void mFilamentItem ( uint16_t nTemp , uint16_t nTempBed )
2019-01-31 04:21:53 +00:00
{
2019-08-26 17:48:39 +00:00
static int nTargetOld ;
static int nTargetBedOld ;
uint8_t nLevel ;
2019-02-22 02:09:50 +00:00
2019-08-26 17:48:39 +00:00
nTargetOld = target_temperature [ 0 ] ;
nTargetBedOld = target_temperature_bed ;
setTargetHotend0 ( ( float ) nTemp ) ;
2019-09-16 16:48:52 +00:00
setTargetBed ( ( float ) nTempBed ) ;
2019-02-22 02:09:50 +00:00
2019-08-26 18:11:52 +00:00
{
2019-09-12 22:19:37 +00:00
const FilamentAction action = eFilamentAction ;
if ( action = = FilamentAction : : Preheat | | action = = FilamentAction : : Lay1Cal )
{
lcd_return_to_status ( ) ;
if ( action = = FilamentAction : : Lay1Cal )
{
lcd_commands_type = LcdCommands : : Layer1Cal ;
}
2019-06-05 16:12:46 +00:00
else
2019-09-12 22:19:37 +00:00
{
2019-06-05 16:12:46 +00:00
raise_z_above ( MIN_Z_FOR_PREHEAT ) ;
if ( eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) )
lcd_wizard ( WizState : : LoadFilHot ) ;
2019-09-12 22:19:37 +00:00
}
return ;
}
2019-08-26 18:11:52 +00:00
}
2019-08-26 17:48:39 +00:00
lcd_timeoutToStatus . stop ( ) ;
if ( current_temperature [ 0 ] > ( target_temperature [ 0 ] * 0.95 ) )
{
switch ( eFilamentAction )
{
case FilamentAction : : Load :
case FilamentAction : : AutoLoad :
case FilamentAction : : UnLoad :
if ( bFilamentWaitingFlag ) menu_submenu ( mFilamentPrompt ) ;
else
{
nLevel = bFilamentPreheatState ? 1 : 2 ;
menu_back ( nLevel ) ;
if ( ( eFilamentAction = = FilamentAction : : Load ) | | ( eFilamentAction = = FilamentAction : : AutoLoad ) )
{
loading_flag = true ;
enquecommand_P ( PSTR ( " M701 " ) ) ; // load filament
if ( eFilamentAction = = FilamentAction : : AutoLoad ) eFilamentAction = FilamentAction : : None ; // i.e. non-autoLoad
}
if ( eFilamentAction = = FilamentAction : : UnLoad )
enquecommand_P ( PSTR ( " M702 " ) ) ; // unload filament
}
break ;
case FilamentAction : : MmuLoad :
nLevel = bFilamentPreheatState ? 1 : 2 ;
bFilamentAction = true ;
menu_back ( nLevel ) ;
menu_submenu ( mmu_load_to_nozzle_menu ) ;
break ;
case FilamentAction : : MmuUnLoad :
nLevel = bFilamentPreheatState ? 1 : 2 ;
bFilamentAction = true ;
menu_back ( nLevel ) ;
extr_unload ( ) ;
break ;
case FilamentAction : : MmuEject :
nLevel = bFilamentPreheatState ? 1 : 2 ;
bFilamentAction = true ;
menu_back ( nLevel ) ;
menu_submenu ( mmu_fil_eject_menu ) ;
break ;
case FilamentAction : : MmuCut :
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-08-26 17:48:39 +00:00
nLevel = bFilamentPreheatState ? 1 : 2 ;
bFilamentAction = true ;
menu_back ( nLevel ) ;
menu_submenu ( mmu_cut_filament_menu ) ;
2019-03-15 02:38:37 +00:00
# endif //MMU_HAS_CUTTER
2019-08-26 17:48:39 +00:00
break ;
case FilamentAction : : None :
2019-08-27 18:23:48 +00:00
case FilamentAction : : Preheat :
2019-09-12 15:54:05 +00:00
case FilamentAction : : Lay1Cal :
2019-08-26 17:48:39 +00:00
break ;
}
if ( bFilamentWaitingFlag ) Sound_MakeSound ( e_SOUND_TYPE_StandardPrompt ) ;
bFilamentWaitingFlag = false ;
}
else
{
bFilamentWaitingFlag = true ;
lcd_set_cursor ( 0 , 0 ) ;
lcdui_print_temp ( LCD_STR_THERMOMETER [ 0 ] , ( int ) degHotend ( 0 ) , ( int ) degTargetHotend ( 0 ) ) ;
lcd_set_cursor ( 0 , 1 ) ;
switch ( eFilamentAction )
{
case FilamentAction : : Load :
case FilamentAction : : AutoLoad :
case FilamentAction : : MmuLoad :
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " Preheating to load " ) ) ; ////MSG_ c=20
2019-08-26 17:48:39 +00:00
break ;
case FilamentAction : : UnLoad :
case FilamentAction : : MmuUnLoad :
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " Preheating to unload " ) ) ; ////MSG_ c=20
2019-08-26 17:48:39 +00:00
break ;
case FilamentAction : : MmuEject :
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " Preheating to eject " ) ) ; ////MSG_ c=20
2019-08-26 17:48:39 +00:00
break ;
case FilamentAction : : MmuCut :
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " Preheating to cut " ) ) ; ////MSG_ c=20
2019-08-26 17:48:39 +00:00
break ;
case FilamentAction : : None :
2019-08-27 18:23:48 +00:00
case FilamentAction : : Preheat :
2019-09-12 15:54:05 +00:00
case FilamentAction : : Lay1Cal :
2019-08-26 17:48:39 +00:00
break ;
}
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _i ( " >Cancel " ) ) ; ////MSG_ c=20 r=1
if ( lcd_clicked ( ) )
{
bFilamentWaitingFlag = false ;
if ( ! bFilamentPreheatState )
{
setTargetHotend0 ( 0.0 ) ;
setTargetBed ( 0.0 ) ;
menu_back ( ) ;
}
else
{
setTargetHotend0 ( ( float ) nTargetOld ) ;
setTargetBed ( ( float ) nTargetBedOld ) ;
}
menu_back ( ) ;
if ( eFilamentAction = = FilamentAction : : AutoLoad ) eFilamentAction = FilamentAction : : None ; // i.e. non-autoLoad
}
}
2019-02-22 02:09:50 +00:00
}
2019-01-31 04:21:53 +00:00
2019-08-26 19:00:30 +00:00
static void mFilamentItem_farm ( )
{
bFilamentPreheatState = false ;
mFilamentItem ( FARM_PREHEAT_HOTEND_TEMP , FARM_PREHEAT_HPB_TEMP ) ;
}
static void mFilamentItem_farm_nozzle ( )
{
bFilamentPreheatState = false ;
mFilamentItem ( FARM_PREHEAT_HOTEND_TEMP , 0 ) ;
2019-02-22 02:09:50 +00:00
}
2019-01-31 04:21:53 +00:00
static void mFilamentItem_PLA ( )
2016-07-22 13:28:01 +00:00
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( PLA_PREHEAT_HOTEND_TEMP , PLA_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2016-07-22 13:28:01 +00:00
2019-01-31 04:21:53 +00:00
static void mFilamentItem_PET ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( PET_PREHEAT_HOTEND_TEMP , PET_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2016-07-22 13:28:01 +00:00
2019-08-27 15:01:41 +00:00
static void mFilamentItem_ASA ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( ASA_PREHEAT_HOTEND_TEMP , ASA_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2016-07-22 13:28:01 +00:00
2020-06-03 15:45:55 +00:00
static void mFilamentItem_PC ( )
{
bFilamentPreheatState = false ;
mFilamentItem ( PC_PREHEAT_HOTEND_TEMP , PC_PREHEAT_HPB_TEMP ) ;
}
2019-01-31 04:21:53 +00:00
static void mFilamentItem_ABS ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( ABS_PREHEAT_HOTEND_TEMP , ABS_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2016-07-22 13:28:01 +00:00
2019-01-31 04:21:53 +00:00
static void mFilamentItem_HIPS ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( HIPS_PREHEAT_HOTEND_TEMP , HIPS_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
static void mFilamentItem_PP ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( PP_PREHEAT_HOTEND_TEMP , PP_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2016-07-22 13:28:01 +00:00
2019-01-31 04:21:53 +00:00
static void mFilamentItem_FLEX ( )
{
2019-08-26 18:19:34 +00:00
bFilamentPreheatState = false ;
mFilamentItem ( FLEX_PREHEAT_HOTEND_TEMP , FLEX_PREHEAT_HPB_TEMP ) ;
2019-01-31 04:21:53 +00:00
}
2019-02-06 00:58:05 +00:00
void mFilamentBack ( )
{
2019-08-26 18:19:34 +00:00
menu_back ( ) ;
2019-08-27 18:13:55 +00:00
if ( eFilamentAction = = FilamentAction : : AutoLoad | |
2019-09-12 15:54:05 +00:00
eFilamentAction = = FilamentAction : : Preheat | |
eFilamentAction = = FilamentAction : : Lay1Cal )
2019-08-27 18:13:55 +00:00
{
eFilamentAction = FilamentAction : : None ; // i.e. non-autoLoad
}
2019-02-06 00:58:05 +00:00
}
2019-09-12 16:15:15 +00:00
void lcd_generic_preheat_menu ( )
2019-01-31 04:21:53 +00:00
{
2019-08-27 15:01:41 +00:00
MENU_BEGIN ( ) ;
2019-09-12 20:37:28 +00:00
if ( ! eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) )
2019-09-12 15:54:05 +00:00
{
if ( eFilamentAction = = FilamentAction : : Lay1Cal )
{
MENU_ITEM_FUNCTION_P ( _T ( MSG_BACK ) , mFilamentBack ) ;
}
else
{
MENU_ITEM_FUNCTION_P ( _T ( MSG_MAIN ) , mFilamentBack ) ;
}
}
2019-08-26 19:00:30 +00:00
if ( farm_mode )
{
MENU_ITEM_FUNCTION_P ( PSTR ( " farm - " STRINGIFY ( FARM_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( FARM_PREHEAT_HPB_TEMP ) ) , mFilamentItem_farm ) ;
MENU_ITEM_FUNCTION_P ( PSTR ( " nozzle - " STRINGIFY ( FARM_PREHEAT_HOTEND_TEMP ) " /0 " ) , mFilamentItem_farm_nozzle ) ;
}
else
{
MENU_ITEM_SUBMENU_P ( PSTR ( " PLA - " STRINGIFY ( PLA_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( PLA_PREHEAT_HPB_TEMP ) ) , mFilamentItem_PLA ) ;
MENU_ITEM_SUBMENU_P ( PSTR ( " PET - " STRINGIFY ( PET_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( PET_PREHEAT_HPB_TEMP ) ) , mFilamentItem_PET ) ;
MENU_ITEM_SUBMENU_P ( PSTR ( " ASA - " STRINGIFY ( ASA_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( ASA_PREHEAT_HPB_TEMP ) ) , mFilamentItem_ASA ) ;
2020-06-03 16:05:37 +00:00
MENU_ITEM_SUBMENU_P ( PSTR ( " PC - " STRINGIFY ( PC_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( PC_PREHEAT_HPB_TEMP ) ) , mFilamentItem_PC ) ;
2019-08-26 19:00:30 +00:00
MENU_ITEM_SUBMENU_P ( PSTR ( " ABS - " STRINGIFY ( ABS_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( ABS_PREHEAT_HPB_TEMP ) ) , mFilamentItem_ABS ) ;
MENU_ITEM_SUBMENU_P ( PSTR ( " HIPS - " STRINGIFY ( HIPS_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( HIPS_PREHEAT_HPB_TEMP ) ) , mFilamentItem_HIPS ) ;
MENU_ITEM_SUBMENU_P ( PSTR ( " PP - " STRINGIFY ( PP_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( PP_PREHEAT_HPB_TEMP ) ) , mFilamentItem_PP ) ;
MENU_ITEM_SUBMENU_P ( PSTR ( " FLEX - " STRINGIFY ( FLEX_PREHEAT_HOTEND_TEMP ) " / " STRINGIFY ( FLEX_PREHEAT_HPB_TEMP ) ) , mFilamentItem_FLEX ) ;
}
2019-09-12 20:37:28 +00:00
if ( ! eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) & & eFilamentAction = = FilamentAction : : Preheat ) MENU_ITEM_FUNCTION_P ( _T ( MSG_COOLDOWN ) , lcd_cooldown ) ;
2019-08-27 15:01:41 +00:00
MENU_END ( ) ;
2019-01-31 04:21:53 +00:00
}
2019-02-26 16:33:37 +00:00
void mFilamentItemForce ( )
{
mFilamentItem ( target_temperature [ 0 ] , target_temperature_bed ) ;
}
2019-01-31 04:21:53 +00:00
void lcd_unLoadFilament ( )
{
2019-06-12 17:11:41 +00:00
eFilamentAction = FilamentAction : : UnLoad ;
2019-09-12 16:53:24 +00:00
preheat_or_continue ( ) ;
2016-07-22 13:28:01 +00:00
}
2019-09-12 16:40:02 +00:00
static void mmu_unload_filament ( )
{
eFilamentAction = FilamentAction : : MmuUnLoad ;
2019-09-12 16:53:24 +00:00
preheat_or_continue ( ) ;
2016-07-22 13:28:01 +00:00
}
void lcd_wait_interact ( ) {
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2017-06-29 16:35:43 +00:00
# ifdef SNMM
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _i ( " Prepare new filament " ) ) ; ////MSG_PREPARE_FILAMENT c=20 r=1
2017-06-29 16:35:43 +00:00
# else
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Insert filament " ) ) ; ////MSG_INSERT_FILAMENT c=20
2017-06-29 16:35:43 +00:00
# endif
2019-02-01 20:04:06 +00:00
if ( ! fsensor_autoload_enabled ) {
lcd_set_cursor ( 0 , 2 ) ;
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " and press the knob " ) ) ; ////MSG_PRESS c=20 r=2
2019-02-01 20:04:06 +00:00
}
2016-07-22 13:28:01 +00:00
}
void lcd_change_success ( ) {
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Change success! " ) ) ; ////MSG_CHANGE_SUCCESS
2016-07-22 13:28:01 +00:00
}
2018-11-12 18:55:53 +00:00
static void lcd_loading_progress_bar ( uint16_t loading_time_ms ) {
2019-07-17 08:30:49 +00:00
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 20 ; i + + ) {
2018-11-12 17:35:06 +00:00
lcd_set_cursor ( i , 3 ) ;
lcd_print ( " . " ) ;
//loading_time_ms/20 delay
2019-06-12 13:01:57 +00:00
for ( uint_least8_t j = 0 ; j < 5 ; j + + ) {
2018-11-12 17:35:06 +00:00
delay_keep_alive ( loading_time_ms / 100 ) ;
}
}
2018-11-09 14:31:44 +00:00
}
void lcd_loading_color ( ) {
//we are extruding 25mm with feedrate 200mm/min -> 7.5 seconds for whole action, 0.375 s for one character
lcd_clear ( ) ;
lcd_set_cursor ( 0 , 0 ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Loading color " ) ) ; ////MSG_LOADING_COLOR
2018-11-09 14:31:44 +00:00
lcd_set_cursor ( 0 , 2 ) ;
lcd_puts_P ( _T ( MSG_PLEASE_WAIT ) ) ;
2018-11-12 18:55:53 +00:00
lcd_loading_progress_bar ( ( FILAMENTCHANGE_FINALFEED * 1000ul ) / FILAMENTCHANGE_EFEED_FINAL ) ; //show progress bar during filament loading slow sequence
2016-07-22 13:28:01 +00:00
}
void lcd_loading_filament ( ) {
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_LOADING_FILAMENT ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_PLEASE_WAIT ) ) ;
2018-11-09 14:31:44 +00:00
# ifdef SNMM
2016-07-22 13:28:01 +00:00
for ( int i = 0 ; i < 20 ; i + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( i , 3 ) ;
lcd_print ( " . " ) ;
2016-07-22 13:28:01 +00:00
for ( int j = 0 ; j < 10 ; j + + ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2019-01-27 21:48:51 +00:00
_delay ( 153 ) ;
2016-07-22 13:28:01 +00:00
}
}
2018-11-09 14:31:44 +00:00
# else //SNMM
2018-11-12 18:55:53 +00:00
uint16_t slow_seq_time = ( FILAMENTCHANGE_FINALFEED * 1000ul ) / FILAMENTCHANGE_EFEED_FINAL ;
uint16_t fast_seq_time = ( FILAMENTCHANGE_FIRSTFEED * 1000ul ) / FILAMENTCHANGE_EFEED_FIRST ;
lcd_loading_progress_bar ( slow_seq_time + fast_seq_time ) ; //show progress bar for total time of filament loading fast + slow sequence
2018-11-09 14:31:44 +00:00
# endif //SNMM
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
2016-07-22 13:28:01 +00:00
void lcd_alright ( ) {
int enc_dif = 0 ;
int cursor_pos = 1 ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Changed correctly? " ) ) ; ////MSG_CORRECTLY c=20
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 1 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_YES ) ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Filament not loaded " ) ) ; ////MSG_NOT_LOADED c=19
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Color not correct " ) ) ; ////MSG_NOT_COLOR
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-12-18 18:10:02 +00:00
lcd_consume_click ( ) ;
2016-07-22 13:28:01 +00:00
while ( lcd_change_fil_state = = 0 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 ) {
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
if ( ( abs ( enc_dif - lcd_encoder_diff ) ) > 1 ) {
if ( enc_dif > lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos + + ;
}
if ( cursor_pos > 3 ) {
cursor_pos = 3 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2016-07-22 13:28:01 +00:00
}
if ( cursor_pos < 1 ) {
cursor_pos = 1 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2016-07-22 13:28:01 +00:00
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2016-07-22 13:28:01 +00:00
}
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2016-07-22 13:28:01 +00:00
lcd_change_fil_state = cursor_pos ;
2019-01-27 21:48:51 +00:00
_delay ( 500 ) ;
2016-07-22 13:28:01 +00:00
}
} ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2018-11-01 15:29:09 +00:00
void show_preheat_nozzle_warning ( )
{
lcd_clear ( ) ;
lcd_set_cursor ( 0 , 0 ) ;
lcd_puts_P ( _T ( MSG_ERROR ) ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_puts_P ( _T ( MSG_PREHEAT_NOZZLE ) ) ;
2019-01-27 21:48:51 +00:00
_delay ( 2000 ) ;
2018-11-01 15:29:09 +00:00
lcd_clear ( ) ;
}
2018-10-31 20:48:05 +00:00
void lcd_load_filament_color_check ( )
{
bool clean = lcd_show_fullscreen_message_yes_no_and_wait_P ( _T ( MSG_FILAMENT_CLEAN ) , false , true ) ;
while ( ! clean ) {
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
2018-11-01 15:29:09 +00:00
load_filament_final_feed ( ) ;
2018-11-09 14:31:44 +00:00
st_synchronize ( ) ;
2018-10-31 20:48:05 +00:00
clean = lcd_show_fullscreen_message_yes_no_and_wait_P ( _T ( MSG_FILAMENT_CLEAN ) , false , true ) ;
}
}
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2018-04-25 14:51:35 +00:00
static void lcd_menu_AutoLoadFilament ( )
{
2019-02-06 00:58:05 +00:00
uint8_t nlines ;
lcd_display_message_fullscreen_nonBlocking_P ( _i ( " Autoloading filament is active, just press the knob and insert filament... " ) , nlines ) ; ////MSG_AUTOLOADING_ENABLED c=20 r=4
menu_back_if_clicked ( ) ;
2018-04-25 14:51:35 +00:00
}
2018-07-20 21:48:00 +00:00
# endif //FILAMENT_SENSOR
2016-07-22 13:28:01 +00:00
2019-09-12 16:53:24 +00:00
static void preheat_or_continue ( )
2016-07-22 13:28:01 +00:00
{
2019-09-12 16:33:02 +00:00
bFilamentFirstRun = false ;
if ( target_temperature [ 0 ] > = EXTRUDE_MINTEMP )
{
bFilamentPreheatState = true ;
mFilamentItem ( target_temperature [ 0 ] , target_temperature_bed ) ;
}
else lcd_generic_preheat_menu ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-04-25 14:51:35 +00:00
static void lcd_LoadFilament ( )
2016-07-22 13:28:01 +00:00
{
2019-09-12 16:53:24 +00:00
eFilamentAction = FilamentAction : : Load ;
preheat_or_continue ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-10-31 20:48:05 +00:00
2018-09-19 15:22:06 +00:00
//! @brief Show filament used a print time
//!
//! If printing current print statistics are shown
//!
//! @code{.unparsed}
//! |01234567890123456789|
2020-05-12 20:23:40 +00:00
//! |Filament used: | c=19
2020-02-03 16:40:46 +00:00
//! | 0000.00m |
//! |Print time: | c=19 r=1
2018-09-19 15:22:06 +00:00
//! | 00h 00m 00s |
//! ----------------------
//! @endcode
//!
//! If not printing, total statistics are shown
//!
//! @code{.unparsed}
//! |01234567890123456789|
2020-02-03 16:40:46 +00:00
//! |Total filament: | c=19 r=1
//! | 0000.00m |
//! |Total print time: | c=19 r=1
//! | 00d 00h 00m |
2018-09-19 15:22:06 +00:00
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations. Translations missing for "d"days, "h"ours, "m"inutes", "s"seconds".
2017-03-24 18:47:50 +00:00
void lcd_menu_statistics ( )
2016-07-22 13:28:01 +00:00
{
2020-02-03 16:40:46 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2016-07-22 13:28:01 +00:00
if ( IS_SD_PRINTING )
{
2018-09-19 15:21:45 +00:00
const float _met = ( ( float ) total_filament_used ) / ( 100000.f ) ;
2019-01-27 21:48:51 +00:00
const uint32_t _t = ( _millis ( ) - starttime ) / 1000ul ;
2020-02-03 16:40:46 +00:00
const uint32_t _h = _t / 3600 ;
const uint8_t _m = ( _t - ( _h * 3600ul ) ) / 60ul ;
const uint8_t _s = _t - ( ( _h * 3600ul ) + ( _m * 60ul ) ) ;
2018-09-19 15:21:45 +00:00
2020-02-03 16:40:46 +00:00
lcd_home ( ) ;
2018-06-10 23:06:47 +00:00
lcd_printf_P ( _N (
2019-07-15 17:32:58 +00:00
" %S: \n "
2020-02-03 16:40:46 +00:00
" %18.2fm \n "
2019-07-15 17:32:58 +00:00
" %S: \n "
2020-02-03 16:40:46 +00:00
" %10ldh %02hhdm %02hhds "
2019-09-20 11:01:07 +00:00
) ,
2020-05-12 20:23:40 +00:00
_i ( " Filament used " ) , _met , ////c=19
2020-02-03 17:20:43 +00:00
_i ( " Print time " ) , _h , _m , _s ) ; ////c=19 r=1
2018-06-24 10:41:36 +00:00
menu_back_if_clicked_fb ( ) ;
2016-07-22 13:28:01 +00:00
}
else
{
unsigned long _filament = eeprom_read_dword ( ( uint32_t * ) EEPROM_FILAMENTUSED ) ;
2017-03-24 18:47:50 +00:00
unsigned long _time = eeprom_read_dword ( ( uint32_t * ) EEPROM_TOTALTIME ) ; //in minutes
uint8_t _hours , _minutes ;
uint32_t _days ;
2018-06-10 23:06:47 +00:00
float _filament_m = ( float ) _filament / 100 ;
2016-07-22 13:28:01 +00:00
_days = _time / 1440 ;
_hours = ( _time - ( _days * 1440 ) ) / 60 ;
_minutes = _time - ( ( _days * 1440 ) + ( _hours * 60 ) ) ;
2018-09-19 15:22:06 +00:00
2020-02-03 16:40:46 +00:00
lcd_home ( ) ;
2018-06-10 23:06:47 +00:00
lcd_printf_P ( _N (
2019-07-15 17:32:58 +00:00
" %S: \n "
2020-02-03 16:40:46 +00:00
" %18.2fm \n "
2019-07-15 17:32:58 +00:00
" %S: \n "
2020-02-03 16:40:46 +00:00
" %10ldd %02hhdh %02hhdm "
) ,
2020-02-03 17:20:43 +00:00
_i ( " Total filament " ) , _filament_m , ////c=19 r=1
_i ( " Total print time " ) , _days , _hours , _minutes ) ; ////c=19 r=1
2020-02-03 16:40:46 +00:00
menu_back_if_clicked_fb ( ) ;
2016-07-22 13:28:01 +00:00
}
}
2018-07-19 14:57:31 +00:00
static void _lcd_move ( const char * name , int axis , int min , int max )
{
2018-08-10 00:59:49 +00:00
typedef struct
{ // 2bytes total
bool initialized ; // 1byte
bool endstopsEnabledPrevious ; // 1byte
} _menu_data_t ;
2018-08-22 16:55:42 +00:00
static_assert ( sizeof ( menu_data ) > = sizeof ( _menu_data_t ) , " _menu_data_t doesn't fit into menu_data " ) ;
2018-08-10 00:59:49 +00:00
_menu_data_t * _md = ( _menu_data_t * ) & ( menu_data [ 0 ] ) ;
if ( ! _md - > initialized )
2018-07-19 14:57:31 +00:00
{
2018-08-10 00:59:49 +00:00
_md - > endstopsEnabledPrevious = enable_endstops ( false ) ;
_md - > initialized = true ;
2018-07-19 14:57:31 +00:00
}
if ( lcd_encoder ! = 0 )
{
refresh_cmd_timeout ( ) ;
if ( ! planner_queue_full ( ) )
{
current_position [ axis ] + = float ( ( int ) lcd_encoder ) * move_menu_scale ;
if ( min_software_endstops & & current_position [ axis ] < min ) current_position [ axis ] = min ;
if ( max_software_endstops & & current_position [ axis ] > max ) current_position [ axis ] = max ;
lcd_encoder = 0 ;
world2machine_clamp ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] ) ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ axis ] / 60 ) ;
2018-07-19 14:57:31 +00:00
lcd_draw_update = 1 ;
}
}
if ( lcd_draw_update )
{
lcd_set_cursor ( 0 , 1 ) ;
2019-05-16 14:43:44 +00:00
menu_draw_float31 ( name , current_position [ axis ] ) ;
2018-07-19 14:57:31 +00:00
}
2018-08-19 11:59:33 +00:00
if ( menu_leaving | | LCD_CLICKED ) ( void ) enable_endstops ( _md - > endstopsEnabledPrevious ) ;
2018-07-19 14:57:31 +00:00
if ( LCD_CLICKED ) menu_back ( ) ;
2016-07-22 13:28:01 +00:00
}
static void lcd_move_e ( )
{
2018-07-19 14:57:31 +00:00
if ( degHotend0 ( ) > EXTRUDE_MINTEMP )
{
if ( lcd_encoder ! = 0 )
{
refresh_cmd_timeout ( ) ;
if ( ! planner_queue_full ( ) )
{
current_position [ E_AXIS ] + = float ( ( int ) lcd_encoder ) * move_menu_scale ;
lcd_encoder = 0 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ E_AXIS ] / 60 ) ;
2018-07-19 14:57:31 +00:00
lcd_draw_update = 1 ;
}
}
if ( lcd_draw_update )
{
lcd_set_cursor ( 0 , 1 ) ;
2019-05-16 14:43:44 +00:00
// Note: the colon behind the text is necessary to greatly shorten
// the implementation of menu_draw_float31
menu_draw_float31 ( PSTR ( " Extruder: " ) , current_position [ E_AXIS ] ) ;
2018-07-19 14:57:31 +00:00
}
if ( LCD_CLICKED ) menu_back ( ) ;
}
else
{
2018-11-01 15:29:09 +00:00
show_preheat_nozzle_warning ( ) ;
2017-03-24 18:47:50 +00:00
lcd_return_to_status ( ) ;
}
}
2018-07-19 14:57:31 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show measured Y distance of front calibration points from Y_MIN_POS
//! If those points are detected too close to edge of reachable area, their confidence is lowered.
//! This functionality is applied more often for MK2 printers.
//! @code{.unparsed}
//! |01234567890123456789|
//! |Y distance from min | c=19 r=1
//! | -------------- | STR_SEPARATOR
//! |Left: 00.00mm | c=11 r=1
//! |Right: 00.00mm | c=11 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-04-18 21:30:01 +00:00
static void lcd_menu_xyz_y_min ( )
{
2018-06-11 00:54:31 +00:00
float distanceMin [ 2 ] ;
2018-04-18 22:15:08 +00:00
count_xyz_details ( distanceMin ) ;
2019-07-15 17:32:58 +00:00
lcd_home ( ) ;
2018-06-11 00:54:31 +00:00
lcd_printf_P ( _N (
" %S: \n "
" %S \n "
" %S: \n "
" %S: "
) ,
2019-08-22 02:58:16 +00:00
_i ( " Y distance from min " ) , ////c=19 r=1
2018-06-11 00:54:31 +00:00
separator ,
2019-08-22 02:58:16 +00:00
_i ( " Left " ) , ////c=11 r=1
_i ( " Right " ) ////c=11 r=1
2018-06-11 00:54:31 +00:00
) ;
for ( uint8_t i = 0 ; i < 2 ; i + + )
{
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 11 , 2 + i ) ;
2019-11-07 15:02:45 +00:00
if ( distanceMin [ i ] > = 200 ) lcd_puts_P ( _T ( MSG_NA ) ) ; ////c=3 r=1
2018-06-11 00:54:31 +00:00
else lcd_printf_P ( _N ( " %6.2fmm " ) , distanceMin [ i ] ) ;
}
2018-04-18 21:30:01 +00:00
if ( lcd_clicked ( ) )
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_menu_xyz_skew , 0 , true , true ) ;
2017-06-29 16:35:43 +00:00
}
2018-07-19 14:57:31 +00:00
//@brief Show measured axis skewness
2018-06-11 00:54:31 +00:00
float _deg ( float rad )
2018-04-18 21:30:01 +00:00
{
2018-06-11 00:54:31 +00:00
return rad * 180 / M_PI ;
}
2017-06-29 16:35:43 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show Measured XYZ Skew
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Measured skew: 0.00D| c=13 r=1
//! | -------------- | STR_SEPARATOR
//! |Slight skew: 0.12D| c=13 r=1 c=4 r=1
//! |Severe skew: 0.25D| c=13 r=1 c=4 r=1
//! ----------------------
//! D - Degree sysmbol LCD_STR_DEGREE
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-06-11 00:54:31 +00:00
static void lcd_menu_xyz_skew ( )
{
float angleDiff = eeprom_read_float ( ( float * ) ( EEPROM_XYZ_CAL_SKEW ) ) ;
2019-07-15 17:32:58 +00:00
lcd_home ( ) ;
2018-06-11 00:54:31 +00:00
lcd_printf_P ( _N (
2018-06-25 16:28:43 +00:00
" %S: \n "
2018-06-11 00:54:31 +00:00
" %S \n "
2019-09-13 14:55:05 +00:00
" %-15.15S%3.2f \x01 \n "
" %-15.15S%3.2f \x01 "
2018-06-11 00:54:31 +00:00
) ,
2019-08-22 02:58:16 +00:00
_i ( " Measured skew " ) , ////c=13 r=1
2018-06-11 00:54:31 +00:00
separator ,
2019-09-19 16:10:20 +00:00
_i ( " Slight skew: " ) , _deg ( bed_skew_angle_mild ) , ////c=13 r=1 c=4 r=1
_i ( " Severe skew: " ) , _deg ( bed_skew_angle_extreme ) ////c=13 r=1 c=4 r=1
2018-06-11 00:54:31 +00:00
) ;
2019-07-15 17:32:58 +00:00
if ( angleDiff < 100 ) {
lcd_set_cursor ( 15 , 0 ) ;
2019-09-13 14:55:05 +00:00
lcd_printf_P ( _N ( " %3.2f \x01 " ) , _deg ( angleDiff ) ) ;
2019-07-15 17:32:58 +00:00
}
else {
lcd_set_cursor ( 15 , 0 ) ;
2019-08-19 07:20:17 +00:00
lcd_puts_P ( _T ( MSG_NA ) ) ;
2019-07-15 17:32:58 +00:00
}
2018-04-19 12:17:46 +00:00
if ( lcd_clicked ( ) )
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_menu_xyz_offset , 0 , true , true ) ;
2018-04-19 12:17:46 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show measured bed offset from expected position
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |[0;0] point offset | c=20 r=1
//! | -------------- | STR_SEPARATOR
//! |X: 000.00mm| c=10 r=1
//! |Y: 000.00mm| c=10 r=1
//! ----------------------
//! @endcode
2019-09-01 07:51:51 +00:00
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
2018-04-19 12:17:46 +00:00
static void lcd_menu_xyz_offset ( )
{
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " [0;0] point offset " ) ) ; ////MSG_MEASURED_OFFSET
2018-07-16 16:08:01 +00:00
lcd_puts_at_P ( 0 , 1 , separator ) ;
2019-08-22 02:58:16 +00:00
lcd_puts_at_P ( 0 , 2 , PSTR ( " X " ) ) ; ////c=10 r=1
lcd_puts_at_P ( 0 , 3 , PSTR ( " Y " ) ) ; ////c=10 r=1
2018-04-19 12:17:46 +00:00
2018-05-10 16:24:49 +00:00
float vec_x [ 2 ] ;
float vec_y [ 2 ] ;
float cntr [ 2 ] ;
world2machine_read_valid ( vec_x , vec_y , cntr ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 2 ; i + + )
2018-04-19 12:17:46 +00:00
{
2019-09-17 09:46:29 +00:00
lcd_set_cursor ( ( cntr [ i ] < 0 ) ? 10 : 11 , i + 2 ) ;
2018-07-16 17:29:27 +00:00
lcd_print ( cntr [ i ] ) ;
2019-09-17 08:51:43 +00:00
lcd_puts_at_P ( 16 , i + 2 , PSTR ( " mm " ) ) ;
2018-04-19 12:17:46 +00:00
}
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2018-04-18 21:30:01 +00:00
}
2016-07-22 13:28:01 +00:00
// Save a single axis babystep value.
void EEPROM_save_B ( int pos , int * value )
{
2018-07-16 00:13:52 +00:00
eeprom_update_byte ( ( unsigned char * ) pos , ( unsigned char ) ( ( * value ) & 0xff ) ) ;
eeprom_update_byte ( ( unsigned char * ) pos + 1 , ( unsigned char ) ( ( * value ) > > 8 ) ) ;
2016-07-22 13:28:01 +00:00
}
// Read a single axis babystep value.
void EEPROM_read_B ( int pos , int * value )
{
2018-07-16 00:13:52 +00:00
* value = ( int ) eeprom_read_byte ( ( unsigned char * ) pos ) | ( int ) ( eeprom_read_byte ( ( unsigned char * ) pos + 1 ) < < 8 ) ;
2016-07-22 13:28:01 +00:00
}
2019-05-16 14:43:44 +00:00
// Note: the colon behind the text (X, Y, Z) is necessary to greatly shorten
// the implementation of menu_draw_float31
2016-07-22 13:28:01 +00:00
static void lcd_move_x ( ) {
2019-05-16 14:43:44 +00:00
_lcd_move ( PSTR ( " X: " ) , X_AXIS , X_MIN_POS , X_MAX_POS ) ;
2016-07-22 13:28:01 +00:00
}
static void lcd_move_y ( ) {
2019-05-16 14:43:44 +00:00
_lcd_move ( PSTR ( " Y: " ) , Y_AXIS , Y_MIN_POS , Y_MAX_POS ) ;
2016-07-22 13:28:01 +00:00
}
static void lcd_move_z ( ) {
2019-05-16 14:43:44 +00:00
_lcd_move ( PSTR ( " Z: " ) , Z_AXIS , Z_MIN_POS , Z_MAX_POS ) ;
2016-07-22 13:28:01 +00:00
}
2018-05-03 20:03:38 +00:00
/**
* @ brief Adjust first layer offset from bed if axis is Z_AXIS
*
* If menu is left ( button pushed or timed out ) , value is stored to EEPROM and
* if the axis is Z_AXIS , CALIBRATION_STATUS_CALIBRATED is also stored .
* Purpose of this function for other axis then Z is unknown .
*
* @ param axis AxisEnum X_AXIS Y_AXIS Z_AXIS
* other value leads to storing Z_AXIS
* @ param msg text to be displayed
*/
2019-06-25 17:43:10 +00:00
static void lcd_babystep_z ( )
2016-08-11 08:42:53 +00:00
{
2018-08-10 00:59:49 +00:00
typedef struct
2019-06-25 17:43:10 +00:00
{
int8_t status ;
2019-06-26 12:10:12 +00:00
int16_t babystepMemZ ;
2019-06-25 17:43:10 +00:00
float babystepMemMMZ ;
2018-08-10 00:59:49 +00:00
} _menu_data_t ;
2018-08-22 16:55:42 +00:00
static_assert ( sizeof ( menu_data ) > = sizeof ( _menu_data_t ) , " _menu_data_t doesn't fit into menu_data " ) ;
2018-08-10 00:59:49 +00:00
_menu_data_t * _md = ( _menu_data_t * ) & ( menu_data [ 0 ] ) ;
if ( _md - > status = = 0 )
2018-07-19 14:57:31 +00:00
{
// Menu was entered.
// Initialize its status.
2018-08-10 00:59:49 +00:00
_md - > status = 1 ;
2017-03-24 18:47:50 +00:00
check_babystep ( ) ;
2019-07-03 17:37:11 +00:00
2019-08-30 10:24:13 +00:00
if ( ! eeprom_is_sheet_initialized ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ) {
2019-07-03 17:37:11 +00:00
_md - > babystepMemZ = 0 ;
}
else {
_md - > babystepMemZ = eeprom_read_word ( reinterpret_cast < uint16_t * > ( & ( EEPROM_Sheets_base - >
s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] . z_offset ) ) ) ;
}
2018-07-19 14:57:31 +00:00
2018-08-10 17:55:50 +00:00
// same logic as in babystep_load
if ( calibration_status ( ) > = CALIBRATION_STATUS_LIVE_ADJUST )
2019-06-25 17:43:10 +00:00
_md - > babystepMemZ = 0 ;
2018-08-10 17:55:50 +00:00
2019-06-25 17:43:10 +00:00
_md - > babystepMemMMZ = _md - > babystepMemZ / cs . axis_steps_per_unit [ Z_AXIS ] ;
2018-07-19 14:57:31 +00:00
lcd_draw_update = 1 ;
2017-03-24 18:47:50 +00:00
//SERIAL_ECHO("Z baby step: ");
2018-08-10 00:59:49 +00:00
//SERIAL_ECHO(_md->babystepMem[2]);
2018-07-19 14:57:31 +00:00
// Wait 90 seconds before closing the live adjust dialog.
2018-07-23 07:14:22 +00:00
lcd_timeoutToStatus . start ( ) ;
2018-07-19 14:57:31 +00:00
}
2017-03-24 18:47:50 +00:00
2018-07-19 14:57:31 +00:00
if ( lcd_encoder ! = 0 )
{
if ( homing_flag ) lcd_encoder = 0 ;
2019-06-25 17:43:10 +00:00
_md - > babystepMemZ + = ( int ) lcd_encoder ;
if ( _md - > babystepMemZ < Z_BABYSTEP_MIN ) _md - > babystepMemZ = Z_BABYSTEP_MIN ; //-3999 -> -9.99 mm
else if ( _md - > babystepMemZ > Z_BABYSTEP_MAX ) _md - > babystepMemZ = Z_BABYSTEP_MAX ; //0
else
{
CRITICAL_SECTION_START
babystepsTodo [ Z_AXIS ] + = ( int ) lcd_encoder ;
CRITICAL_SECTION_END
}
_md - > babystepMemMMZ = _md - > babystepMemZ / cs . axis_steps_per_unit [ Z_AXIS ] ;
2019-01-27 21:48:51 +00:00
_delay ( 50 ) ;
2018-07-19 14:57:31 +00:00
lcd_encoder = 0 ;
lcd_draw_update = 1 ;
2017-03-24 18:47:50 +00:00
}
2018-07-19 14:57:31 +00:00
if ( lcd_draw_update )
2018-07-19 15:42:59 +00:00
{
2019-06-26 13:23:55 +00:00
SheetFormatBuffer buffer ;
2019-06-26 13:51:58 +00:00
menu_format_sheet_E ( EEPROM_Sheets_base - > s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] , buffer ) ;
2019-06-26 13:23:55 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( buffer . c ) ;
2018-07-19 15:42:59 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2019-06-25 17:43:10 +00:00
menu_draw_float13 ( _i ( " Adjusting Z: " ) , _md - > babystepMemMMZ ) ; ////MSG_BABYSTEPPING_Z c=15 Beware: must include the ':' as its last character
2018-07-19 15:42:59 +00:00
}
2018-08-19 11:59:33 +00:00
if ( LCD_CLICKED | | menu_leaving )
2018-07-19 14:57:31 +00:00
{
// Only update the EEPROM when leaving the menu.
2019-10-01 14:57:37 +00:00
uint8_t active_sheet = eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ;
eeprom_update_word ( reinterpret_cast < uint16_t * > ( & ( EEPROM_Sheets_base - > s [ active_sheet ] . z_offset ) ) , _md - > babystepMemZ ) ;
eeprom_update_byte ( & ( EEPROM_Sheets_base - > s [ active_sheet ] . bed_temp ) , target_temperature_bed ) ;
2019-10-01 16:20:50 +00:00
# ifdef PINDA_THERMISTOR
2019-10-01 14:57:37 +00:00
eeprom_update_byte ( & ( EEPROM_Sheets_base - > s [ active_sheet ] . pinda_temp ) , current_temperature_pinda ) ;
2019-09-17 18:26:03 +00:00
# endif //PINDA_THERMISTOR
2019-06-25 17:43:10 +00:00
calibration_status_store ( CALIBRATION_STATUS_CALIBRATED ) ;
2018-07-19 14:57:31 +00:00
}
if ( LCD_CLICKED ) menu_back ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-08-19 11:59:33 +00:00
2018-08-10 00:59:49 +00:00
typedef struct
2018-08-19 11:59:33 +00:00
{ // 12bytes + 9bytes = 21bytes total
2018-08-22 16:55:42 +00:00
menu_data_edit_t reserved ; //12 bytes reserved for number editing functions
2018-08-10 00:59:49 +00:00
int8_t status ; // 1byte
2018-08-19 11:59:33 +00:00
int16_t left ; // 2byte
int16_t right ; // 2byte
int16_t front ; // 2byte
int16_t rear ; // 2byte
2018-08-10 00:59:49 +00:00
} _menu_data_adjust_bed_t ;
2018-08-22 16:55:42 +00:00
static_assert ( sizeof ( menu_data ) > = sizeof ( _menu_data_adjust_bed_t ) , " _menu_data_adjust_bed_t doesn't fit into menu_data " ) ;
2018-08-10 00:59:49 +00:00
2018-08-19 11:59:33 +00:00
void lcd_adjust_bed_reset ( void )
2016-08-11 08:42:53 +00:00
{
2018-08-10 00:59:49 +00:00
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_VALID , 1 ) ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_LEFT , 0 ) ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_RIGHT , 0 ) ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_FRONT , 0 ) ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_REAR , 0 ) ;
_menu_data_adjust_bed_t * _md = ( _menu_data_adjust_bed_t * ) & ( menu_data [ 0 ] ) ;
_md - > status = 0 ;
2016-08-11 08:42:53 +00:00
}
2019-08-22 02:58:16 +00:00
//! @brief Show Bed level correct
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! |Settings: | MSG_SETTINGS
//! |Left side [um]: | MSG_BED_CORRECTION_LEFT
//! |Right side[um]: | MSG_BED_CORRECTION_RIGHT
//! |Front side[um]: | MSG_BED_CORRECTION_FRONT
//! |Rear side [um]: | MSG_BED_CORRECTION_REAR
//! |Reset | MSG_BED_CORRECTION_RESET
//! ----------------------
//! @endcode
2018-08-19 11:59:33 +00:00
void lcd_adjust_bed ( void )
2016-08-11 08:42:53 +00:00
{
2018-08-10 00:59:49 +00:00
_menu_data_adjust_bed_t * _md = ( _menu_data_adjust_bed_t * ) & ( menu_data [ 0 ] ) ;
if ( _md - > status = = 0 )
{
2016-08-11 08:42:53 +00:00
// Menu was entered.
2018-08-19 11:59:33 +00:00
_md - > left = 0 ;
_md - > right = 0 ;
_md - > front = 0 ;
_md - > rear = 0 ;
if ( eeprom_read_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_VALID ) = = 1 )
{
_md - > left = eeprom_read_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_LEFT ) ;
_md - > right = eeprom_read_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_RIGHT ) ;
_md - > front = eeprom_read_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_FRONT ) ;
_md - > rear = eeprom_read_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_REAR ) ;
}
2018-08-10 00:59:49 +00:00
_md - > status = 1 ;
2016-08-11 08:42:53 +00:00
}
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
2018-08-19 11:59:33 +00:00
// leaving menu - this condition must be immediately before MENU_ITEM_BACK_P
2019-05-06 13:33:13 +00:00
ON_MENU_LEAVE (
2018-08-19 11:59:33 +00:00
eeprom_update_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_LEFT , _md - > left ) ;
eeprom_update_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_RIGHT , _md - > right ) ;
eeprom_update_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_FRONT , _md - > front ) ;
eeprom_update_int8 ( ( unsigned char * ) EEPROM_BED_CORRECTION_REAR , _md - > rear ) ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_BED_CORRECTION_VALID , 1 ) ;
2019-05-06 15:39:00 +00:00
) ;
2019-05-06 13:33:13 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ;
2018-08-19 11:59:33 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " Left side [um] " ) , & _md - > left , - BED_ADJUSTMENT_UM_MAX , BED_ADJUSTMENT_UM_MAX ) ; ////MSG_BED_CORRECTION_LEFT c=14 r=1
MENU_ITEM_EDIT_int3_P ( _i ( " Right side[um] " ) , & _md - > right , - BED_ADJUSTMENT_UM_MAX , BED_ADJUSTMENT_UM_MAX ) ; ////MSG_BED_CORRECTION_RIGHT c=14 r=1
MENU_ITEM_EDIT_int3_P ( _i ( " Front side[um] " ) , & _md - > front , - BED_ADJUSTMENT_UM_MAX , BED_ADJUSTMENT_UM_MAX ) ; ////MSG_BED_CORRECTION_FRONT c=14 r=1
MENU_ITEM_EDIT_int3_P ( _i ( " Rear side [um] " ) , & _md - > rear , - BED_ADJUSTMENT_UM_MAX , BED_ADJUSTMENT_UM_MAX ) ; ////MSG_BED_CORRECTION_REAR c=14 r=1
2019-05-07 10:23:09 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Reset " ) , lcd_adjust_bed_reset ) ; ////MSG_BED_CORRECTION_RESET
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-08-11 08:42:53 +00:00
}
2016-07-22 13:28:01 +00:00
2019-08-22 02:58:16 +00:00
//! @brief Show PID Extruder
//!
//! @code{.unparsed}
//! |01234567890123456789|
//! | Set temperature: | MSG_SET_TEMPERATURE
//! | |
//! | 210 |
//! | |
//! ----------------------
//! @endcode
2018-08-19 11:59:33 +00:00
void pid_extruder ( )
{
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 0 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _i ( " Set temperature: " ) ) ; ////MSG_SET_TEMPERATURE c=19 r=1
2018-07-16 00:13:52 +00:00
pid_temp + = int ( lcd_encoder ) ;
2017-06-29 16:35:43 +00:00
if ( pid_temp > HEATER_0_MAXTEMP ) pid_temp = HEATER_0_MAXTEMP ;
if ( pid_temp < HEATER_0_MINTEMP ) pid_temp = HEATER_0_MINTEMP ;
2018-07-16 00:13:52 +00:00
lcd_encoder = 0 ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
lcd_print ( ftostr3 ( pid_temp ) ) ;
2017-06-29 16:35:43 +00:00
if ( lcd_clicked ( ) ) {
2019-06-12 16:19:41 +00:00
lcd_commands_type = LcdCommands : : PidExtruder ;
2017-06-29 16:35:43 +00:00
lcd_return_to_status ( ) ;
lcd_update ( 2 ) ;
}
}
2018-08-10 17:55:50 +00:00
/*
2016-07-22 13:28:01 +00:00
void lcd_adjust_z ( ) {
int enc_dif = 0 ;
int cursor_pos = 1 ;
int fsm = 0 ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Auto adjust Z? " ) ) ; ////MSG_ADJUSTZ
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 1 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_YES ) ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_NO ) ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2016-07-22 13:28:01 +00:00
while ( fsm = = 0 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 ) {
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
if ( ( abs ( enc_dif - lcd_encoder_diff ) ) > 1 ) {
if ( enc_dif > lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos + + ;
}
if ( cursor_pos > 2 ) {
cursor_pos = 2 ;
}
if ( cursor_pos < 1 ) {
cursor_pos = 1 ;
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2016-07-22 13:28:01 +00:00
}
}
if ( lcd_clicked ( ) ) {
fsm = cursor_pos ;
if ( fsm = = 1 ) {
2016-08-11 08:42:53 +00:00
int babystepLoadZ = 0 ;
EEPROM_read_B ( EEPROM_BABYSTEP_Z , & babystepLoadZ ) ;
2016-07-22 13:28:01 +00:00
CRITICAL_SECTION_START
2016-08-11 08:42:53 +00:00
babystepsTodo [ Z_AXIS ] = babystepLoadZ ;
2016-07-22 13:28:01 +00:00
CRITICAL_SECTION_END
} else {
2016-08-11 08:42:53 +00:00
int zero = 0 ;
EEPROM_save_B ( EEPROM_BABYSTEP_X , & zero ) ;
EEPROM_save_B ( EEPROM_BABYSTEP_Y , & zero ) ;
EEPROM_save_B ( EEPROM_BABYSTEP_Z , & zero ) ;
2016-07-22 13:28:01 +00:00
}
2019-01-27 21:48:51 +00:00
_delay ( 500 ) ;
2016-07-22 13:28:01 +00:00
}
} ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
2018-08-10 17:55:50 +00:00
} */
2016-07-22 13:28:01 +00:00
2019-09-17 18:26:03 +00:00
# ifdef PINDA_THERMISTOR
2018-04-24 11:43:51 +00:00
bool lcd_wait_for_pinda ( float temp ) {
2018-04-19 14:55:00 +00:00
lcd_set_custom_characters_degree ( ) ;
2018-07-25 10:31:22 +00:00
setAllTargetHotends ( 0 ) ;
2018-04-19 14:55:00 +00:00
setTargetBed ( 0 ) ;
2018-05-11 14:31:42 +00:00
LongTimer pinda_timeout ;
2018-04-24 11:43:51 +00:00
pinda_timeout . start ( ) ;
bool target_temp_reached = true ;
2018-04-19 14:55:00 +00:00
while ( current_temperature_pinda > temp ) {
2018-05-22 01:20:03 +00:00
lcd_display_message_fullscreen_P ( _i ( " Waiting for PINDA probe cooling " ) ) ; ////MSG_WAITING_TEMP_PINDA c=20 r=3
2018-04-19 14:55:00 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 4 ) ;
lcd_print ( LCD_STR_THERMOMETER [ 0 ] ) ;
lcd_print ( ftostr3 ( current_temperature_pinda ) ) ;
lcd_print ( " / " ) ;
lcd_print ( ftostr3 ( temp ) ) ;
lcd_print ( LCD_STR_DEGREE ) ;
2018-04-19 14:55:00 +00:00
delay_keep_alive ( 1000 ) ;
serialecho_temperatures ( ) ;
2018-04-24 11:43:51 +00:00
if ( pinda_timeout . expired ( 8 * 60 * 1000ul ) ) { //PINDA cooling from 60 C to 35 C takes about 7 minutes
target_temp_reached = false ;
break ;
}
2018-04-19 14:55:00 +00:00
}
lcd_set_custom_characters_arrows ( ) ;
lcd_update_enable ( true ) ;
2018-07-18 14:17:45 +00:00
return target_temp_reached ;
2018-04-19 14:55:00 +00:00
}
2019-09-17 18:26:03 +00:00
# endif //PINDA_THERMISTOR
2018-04-19 14:55:00 +00:00
2018-01-15 10:30:28 +00:00
void lcd_wait_for_heater ( ) {
2018-08-03 16:37:52 +00:00
lcd_display_message_fullscreen_P ( _T ( MSG_WIZARD_HEATING ) ) ;
lcd_set_degree ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 4 ) ;
lcd_print ( LCD_STR_THERMOMETER [ 0 ] ) ;
lcd_print ( ftostr3 ( degHotend ( active_extruder ) ) ) ;
lcd_print ( " / " ) ;
lcd_print ( ftostr3 ( degTargetHotend ( active_extruder ) ) ) ;
lcd_print ( LCD_STR_DEGREE ) ;
2018-01-15 10:30:28 +00:00
}
2017-12-14 18:36:32 +00:00
void lcd_wait_for_cool_down ( ) {
2017-03-24 18:47:50 +00:00
lcd_set_custom_characters_degree ( ) ;
2018-07-25 10:31:22 +00:00
setAllTargetHotends ( 0 ) ;
2017-12-14 18:36:32 +00:00
setTargetBed ( 0 ) ;
2019-04-06 09:50:22 +00:00
int fanSpeedBckp = fanSpeed ;
fanSpeed = 255 ;
2017-03-24 18:47:50 +00:00
while ( ( degHotend ( 0 ) > MAX_HOTEND_TEMP_CALIBRATION ) | | ( degBed ( ) > MAX_BED_TEMP_CALIBRATION ) ) {
2018-05-22 01:20:03 +00:00
lcd_display_message_fullscreen_P ( _i ( " Waiting for nozzle and bed cooling " ) ) ; ////MSG_WAITING_TEMP c=20 r=3
2017-03-24 18:47:50 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 4 ) ;
lcd_print ( LCD_STR_THERMOMETER [ 0 ] ) ;
lcd_print ( ftostr3 ( degHotend ( 0 ) ) ) ;
lcd_print ( " /0 " ) ;
lcd_print ( LCD_STR_DEGREE ) ;
lcd_set_cursor ( 9 , 4 ) ;
lcd_print ( LCD_STR_BEDTEMP [ 0 ] ) ;
lcd_print ( ftostr3 ( degBed ( ) ) ) ;
lcd_print ( " /0 " ) ;
lcd_print ( LCD_STR_DEGREE ) ;
2017-03-24 18:47:50 +00:00
lcd_set_custom_characters ( ) ;
delay_keep_alive ( 1000 ) ;
2017-12-14 18:36:32 +00:00
serialecho_temperatures ( ) ;
2017-03-24 18:47:50 +00:00
}
2019-04-06 09:50:22 +00:00
fanSpeed = fanSpeedBckp ;
2017-03-24 18:47:50 +00:00
lcd_set_custom_characters_arrows ( ) ;
2017-12-14 18:36:32 +00:00
lcd_update_enable ( true ) ;
}
2017-03-24 18:47:50 +00:00
2016-07-22 13:28:01 +00:00
// Lets the user move the Z carriage up to the end stoppers.
// When done, it sets the current Z to Z_MAX_POS and returns true.
// Otherwise the Z calibration is not changed and false is returned.
2017-11-12 10:30:06 +00:00
# ifndef TMC2130
2016-08-11 08:42:53 +00:00
bool lcd_calibrate_z_end_stop_manual ( bool only_z )
2016-07-22 13:28:01 +00:00
{
// Don't know where we are. Let's claim we are Z=0, so the soft end stops will not be triggered when moving up.
current_position [ Z_AXIS ] = 0 ;
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2016-07-22 13:28:01 +00:00
// Until confirmed by the confirmation dialog.
for ( ; ; ) {
2018-05-22 01:20:03 +00:00
const char * msg = only_z ? _i ( " Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done. " ) : _i ( " Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done. " ) ; ////MSG_MOVE_CARRIAGE_TO_THE_TOP c=20 r=8////MSG_MOVE_CARRIAGE_TO_THE_TOP_Z c=20 r=8
2016-09-01 08:44:24 +00:00
const char * msg_next = lcd_display_message_fullscreen_P ( msg ) ;
const bool multi_screen = msg_next ! = NULL ;
2019-01-27 21:48:51 +00:00
unsigned long previous_millis_msg = _millis ( ) ;
2016-07-22 13:28:01 +00:00
// Until the user finishes the z up movement.
2018-07-16 00:13:52 +00:00
lcd_encoder_diff = 0 ;
lcd_encoder = 0 ;
2016-07-22 13:28:01 +00:00
for ( ; ; ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( lcd_encoder_diff ) > = ENCODER_PULSES_PER_STEP ) {
2019-01-27 21:48:51 +00:00
_delay ( 50 ) ;
2018-07-16 00:13:52 +00:00
lcd_encoder + = abs ( lcd_encoder_diff / ENCODER_PULSES_PER_STEP ) ;
lcd_encoder_diff = 0 ;
2016-08-11 08:42:53 +00:00
if ( ! planner_queue_full ( ) ) {
// Only move up, whatever direction the user rotates the encoder.
2018-07-16 00:13:52 +00:00
current_position [ Z_AXIS ] + = fabs ( lcd_encoder ) ;
lcd_encoder = 0 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ Z_AXIS ] / 60 ) ;
2016-08-11 08:42:53 +00:00
}
2016-07-22 13:28:01 +00:00
}
if ( lcd_clicked ( ) ) {
2016-08-11 08:42:53 +00:00
// Abort a move if in progress.
planner_abort_hard ( ) ;
2016-07-22 13:28:01 +00:00
while ( lcd_clicked ( ) ) ;
2019-01-27 21:48:51 +00:00
_delay ( 10 ) ;
2016-07-22 13:28:01 +00:00
while ( lcd_clicked ( ) ) ;
break ;
}
2019-01-27 21:48:51 +00:00
if ( multi_screen & & _millis ( ) - previous_millis_msg > 5000 ) {
2016-09-01 08:44:24 +00:00
if ( msg_next = = NULL )
msg_next = msg ;
msg_next = lcd_display_message_fullscreen_P ( msg_next ) ;
2019-01-27 21:48:51 +00:00
previous_millis_msg = _millis ( ) ;
2016-09-01 08:44:24 +00:00
}
2016-07-22 13:28:01 +00:00
}
// Let the user confirm, that the Z carriage is at the top end stoppers.
2018-05-22 01:20:03 +00:00
int8_t result = lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " Are left and right Z~carriages all up? " ) , false ) ; ////MSG_CONFIRM_CARRIAGE_AT_THE_TOP c=20 r=2
2016-07-22 13:28:01 +00:00
if ( result = = - 1 )
goto canceled ;
else if ( result = = 1 )
goto calibrated ;
// otherwise perform another round of the Z up dialog.
}
calibrated :
// Let the machine think the Z axis is a bit higher than it is, so it will not home into the bed
// during the search for the induction points.
2019-01-28 18:48:46 +00:00
if ( ( PRINTER_TYPE = = PRINTER_MK25 ) | | ( PRINTER_TYPE = = PRINTER_MK2 ) | | ( PRINTER_TYPE = = PRINTER_MK2_SNMM ) ) {
2019-01-28 18:23:19 +00:00
current_position [ Z_AXIS ] = Z_MAX_POS - 3.f ;
}
else {
current_position [ Z_AXIS ] = Z_MAX_POS + 4.f ;
}
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2016-07-22 13:28:01 +00:00
return true ;
canceled :
return false ;
}
2017-11-12 10:30:06 +00:00
# endif // TMC2130
2016-08-11 08:42:53 +00:00
static inline bool pgm_is_whitespace ( const char * c_addr )
2016-07-22 13:28:01 +00:00
{
2016-08-11 08:42:53 +00:00
const char c = pgm_read_byte ( c_addr ) ;
return c = = ' ' | | c = = ' \t ' | | c = = ' \r ' | | c = = ' \n ' ;
2016-07-22 13:28:01 +00:00
}
2016-08-11 08:42:53 +00:00
static inline bool pgm_is_interpunction ( const char * c_addr )
{
const char c = pgm_read_byte ( c_addr ) ;
return c = = ' . ' | | c = = ' , ' | | c = = ' : ' | | c = = ' ; ' | | c = = ' ? ' | | c = = ' ! ' | | c = = ' / ' ;
}
2018-04-25 14:51:35 +00:00
/**
* @ brief show full screen message
*
* This function is non - blocking
* @ param msg message to be displayed from PROGMEM
* @ param nlines
* @ return rest of the text ( to be displayed on next page )
*/
static const char * lcd_display_message_fullscreen_nonBlocking_P ( const char * msg , uint8_t & nlines )
2016-07-22 13:28:01 +00:00
{
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2016-08-11 08:42:53 +00:00
const char * msgend = msg ;
2016-09-01 08:44:24 +00:00
uint8_t row = 0 ;
2016-09-01 13:14:55 +00:00
bool multi_screen = false ;
2016-09-01 08:44:24 +00:00
for ( ; row < 4 ; + + row ) {
2016-07-22 13:28:01 +00:00
while ( pgm_is_whitespace ( msg ) )
+ + msg ;
if ( pgm_read_byte ( msg ) = = 0 )
// End of the message.
break ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , row ) ;
2016-09-01 13:14:55 +00:00
uint8_t linelen = min ( strlen_P ( msg ) , 20 ) ;
const char * msgend2 = msg + linelen ;
2016-08-11 08:42:53 +00:00
msgend = msgend2 ;
2016-09-01 13:14:55 +00:00
if ( row = = 3 & & linelen = = 20 ) {
// Last line of the display, full line shall be displayed.
// Find out, whether this message will be split into multiple screens.
while ( pgm_is_whitespace ( msgend ) )
+ + msgend ;
multi_screen = pgm_read_byte ( msgend ) ! = 0 ;
if ( multi_screen )
msgend = ( msgend2 - = 2 ) ;
}
2016-08-11 08:42:53 +00:00
if ( pgm_read_byte ( msgend ) ! = 0 & & ! pgm_is_whitespace ( msgend ) & & ! pgm_is_interpunction ( msgend ) ) {
2016-09-01 13:14:55 +00:00
// Splitting a word. Find the start of the current word.
2016-07-22 13:28:01 +00:00
while ( msgend > msg & & ! pgm_is_whitespace ( msgend - 1 ) )
- - msgend ;
if ( msgend = = msg )
// Found a single long word, which cannot be split. Just cut it.
msgend = msgend2 ;
}
for ( ; msg < msgend ; + + msg ) {
char c = char ( pgm_read_byte ( msg ) ) ;
if ( c = = ' ~ ' )
c = ' ' ;
2018-07-16 17:29:27 +00:00
lcd_print ( c ) ;
2016-07-22 13:28:01 +00:00
}
}
2016-08-11 08:42:53 +00:00
2016-09-01 13:14:55 +00:00
if ( multi_screen ) {
// Display the "next screen" indicator character.
// lcd_set_custom_characters_arrows();
lcd_set_custom_characters_nextpage ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 19 , 3 ) ;
2016-09-01 13:14:55 +00:00
// Display the down arrow.
2018-07-16 17:29:27 +00:00
lcd_print ( char ( 1 ) ) ;
2016-09-01 13:14:55 +00:00
}
2016-09-01 08:44:24 +00:00
nlines = row ;
2016-09-01 13:14:55 +00:00
return multi_screen ? msgend : NULL ;
2016-07-22 13:28:01 +00:00
}
2018-04-25 14:51:35 +00:00
const char * lcd_display_message_fullscreen_P ( const char * msg , uint8_t & nlines )
{
2018-07-16 00:13:52 +00:00
// Disable update of the screen by the usual lcd_update(0) routine.
2018-04-25 14:51:35 +00:00
lcd_update_enable ( false ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-08-02 16:54:00 +00:00
// uint8_t nlines;
2018-04-25 14:51:35 +00:00
return lcd_display_message_fullscreen_nonBlocking_P ( msg , nlines ) ;
}
2018-08-02 16:54:00 +00:00
const char * lcd_display_message_fullscreen_P ( const char * msg )
{
uint8_t nlines ;
return lcd_display_message_fullscreen_P ( msg , nlines ) ;
}
2018-04-25 14:51:35 +00:00
/**
* @ brief show full screen message and wait
*
* This function is blocking .
* @ param msg message to be displayed from PROGMEM
*/
2016-07-22 13:28:01 +00:00
void lcd_show_fullscreen_message_and_wait_P ( const char * msg )
{
2018-10-08 13:58:49 +00:00
LcdUpdateDisabler lcdUpdateDisabler ;
2016-08-11 08:42:53 +00:00
const char * msg_next = lcd_display_message_fullscreen_P ( msg ) ;
bool multi_screen = msg_next ! = NULL ;
2017-11-07 15:49:04 +00:00
lcd_set_custom_characters_nextpage ( ) ;
2018-12-07 17:31:30 +00:00
lcd_consume_click ( ) ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
// Until confirmed by a button click.
for ( ; ; ) {
2017-11-07 15:49:04 +00:00
if ( ! multi_screen ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 19 , 3 ) ;
2017-11-07 15:49:04 +00:00
// Display the confirm char.
2018-07-16 17:29:27 +00:00
lcd_print ( char ( 2 ) ) ;
2017-11-07 15:49:04 +00:00
}
2016-08-11 08:42:53 +00:00
// Wait for 5 seconds before displaying the next text.
for ( uint8_t i = 0 ; i < 100 ; + + i ) {
delay_keep_alive ( 50 ) ;
if ( lcd_clicked ( ) ) {
2017-12-20 12:33:45 +00:00
if ( msg_next = = NULL ) {
KEEPALIVE_STATE ( IN_HANDLER ) ;
lcd_set_custom_characters ( ) ;
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
return ;
}
else {
break ;
}
2016-08-11 08:42:53 +00:00
}
}
if ( multi_screen ) {
if ( msg_next = = NULL )
msg_next = msg ;
msg_next = lcd_display_message_fullscreen_P ( msg_next ) ;
2017-11-07 15:49:04 +00:00
if ( msg_next = = NULL ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 19 , 3 ) ;
2017-11-07 15:49:04 +00:00
// Display the confirm char.
2018-07-16 17:29:27 +00:00
lcd_print ( char ( 2 ) ) ;
2017-11-07 15:49:04 +00:00
}
2016-07-22 13:28:01 +00:00
}
}
}
2018-11-02 22:03:14 +00:00
bool lcd_wait_for_click_delay ( uint16_t nDelay )
// nDelay :: timeout [s] (0 ~ no timeout)
// true ~ clicked, false ~ delayed
2016-07-22 13:28:01 +00:00
{
2018-11-02 22:03:14 +00:00
bool bDelayed ;
2019-01-27 21:48:51 +00:00
long nTime0 = _millis ( ) / 1000 ;
2018-12-07 17:31:30 +00:00
lcd_consume_click ( ) ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
2016-07-22 13:28:01 +00:00
for ( ; ; ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2019-01-27 21:48:51 +00:00
bDelayed = ( ( _millis ( ) / 1000 - nTime0 ) > nDelay ) ;
2018-11-02 22:03:14 +00:00
bDelayed = ( bDelayed & & ( nDelay ! = 0 ) ) ; // 0 ~ no timeout, always waiting for click
if ( lcd_clicked ( ) | | bDelayed ) {
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2018-11-02 22:03:14 +00:00
return ( ! bDelayed ) ;
2016-07-22 13:28:01 +00:00
}
}
}
2018-11-02 22:03:14 +00:00
void lcd_wait_for_click ( )
{
lcd_wait_for_click_delay ( 0 ) ;
}
2018-10-08 13:58:49 +00:00
//! @brief Show multiple screen message with yes and no possible choices and wait with possible timeout
//! @param msg Message to show
//! @param allow_timeouting if true, allows time outing of the screen
//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
//! @retval 1 yes choice selected by user
//! @retval 0 no choice selected by user
//! @retval -1 screen timed out
2017-11-07 15:49:04 +00:00
int8_t lcd_show_multiscreen_message_yes_no_and_wait_P ( const char * msg , bool allow_timeouting , bool default_yes ) //currently just max. n*4 + 3 lines supported (set in language header files)
2018-10-08 13:58:49 +00:00
{
return lcd_show_multiscreen_message_two_choices_and_wait_P ( msg , allow_timeouting , default_yes , _T ( MSG_YES ) , _T ( MSG_NO ) ) ;
}
//! @brief Show multiple screen message with two possible choices and wait with possible timeout
//! @param msg Message to show
//! @param allow_timeouting if true, allows time outing of the screen
//! @param default_first if true, fist choice is selected by default, otherwise second choice is preselected
//! @param first_choice text caption of first possible choice
//! @param second_choice text caption of second possible choice
//! @retval 1 first choice selected by user
//! @retval 0 second choice selected by user
//! @retval -1 screen timed out
int8_t lcd_show_multiscreen_message_two_choices_and_wait_P ( const char * msg , bool allow_timeouting , bool default_first ,
const char * first_choice , const char * second_choice )
2017-11-07 15:49:04 +00:00
{
const char * msg_next = lcd_display_message_fullscreen_P ( msg ) ;
bool multi_screen = msg_next ! = NULL ;
2018-10-08 13:58:49 +00:00
bool yes = default_first ? true : false ;
2017-11-07 15:49:04 +00:00
// Wait for user confirmation or a timeout.
2019-01-27 21:48:51 +00:00
unsigned long previous_millis_cmd = _millis ( ) ;
2018-07-16 00:13:52 +00:00
int8_t enc_dif = lcd_encoder_diff ;
2018-12-07 17:31:30 +00:00
lcd_consume_click ( ) ;
2017-11-07 15:49:04 +00:00
//KEEPALIVE_STATE(PAUSED_FOR_USER);
for ( ; ; ) {
for ( uint8_t i = 0 ; i < 100 ; + + i ) {
delay_keep_alive ( 50 ) ;
2019-01-27 21:48:51 +00:00
if ( allow_timeouting & & _millis ( ) - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS )
2017-11-07 15:49:04 +00:00
return - 1 ;
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( enc_dif - lcd_encoder_diff ) > 4 ) {
2017-11-07 15:49:04 +00:00
if ( msg_next = = NULL ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff & & yes ) {
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 7 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " > " ) ) ) ;
2017-11-07 15:49:04 +00:00
yes = false ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2017-11-07 15:49:04 +00:00
}
2018-07-16 00:13:52 +00:00
else if ( enc_dif > lcd_encoder_diff & & ! yes ) {
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " > " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 7 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " " ) ) ) ;
2017-11-07 15:49:04 +00:00
yes = true ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2017-11-07 15:49:04 +00:00
}
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2017-11-07 15:49:04 +00:00
}
else {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2017-11-07 15:49:04 +00:00
break ; //turning knob skips waiting loop
}
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2017-11-07 15:49:04 +00:00
if ( msg_next = = NULL ) {
//KEEPALIVE_STATE(IN_HANDLER);
lcd_set_custom_characters ( ) ;
return yes ;
}
else break ;
}
}
if ( multi_screen ) {
if ( msg_next = = NULL ) {
msg_next = msg ;
}
msg_next = lcd_display_message_fullscreen_P ( msg_next ) ;
}
if ( msg_next = = NULL ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
if ( yes ) lcd_puts_P ( PSTR ( " > " ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 3 ) ;
2018-10-08 13:58:49 +00:00
lcd_puts_P ( first_choice ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 7 , 3 ) ;
2018-07-16 16:08:01 +00:00
if ( ! yes ) lcd_puts_P ( PSTR ( " > " ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 8 , 3 ) ;
2018-10-08 13:58:49 +00:00
lcd_puts_P ( second_choice ) ;
2017-11-07 15:49:04 +00:00
}
}
}
2018-10-08 13:58:49 +00:00
//! @brief Show single screen message with yes and no possible choices and wait with possible timeout
//! @param msg Message to show
//! @param allow_timeouting if true, allows time outing of the screen
//! @param default_yes if true, yes choice is selected by default, otherwise no choice is preselected
//! @retval 1 yes choice selected by user
//! @retval 0 no choice selected by user
//! @retval -1 screen timed out
2017-03-24 18:47:50 +00:00
int8_t lcd_show_fullscreen_message_yes_no_and_wait_P ( const char * msg , bool allow_timeouting , bool default_yes )
2016-07-22 13:28:01 +00:00
{
2017-03-24 18:47:50 +00:00
lcd_display_message_fullscreen_P ( msg ) ;
if ( default_yes ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( PSTR ( " > " ) ) ;
lcd_puts_P ( _T ( MSG_YES ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_NO ) ) ;
2017-03-24 18:47:50 +00:00
}
else {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_YES ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( PSTR ( " > " ) ) ;
lcd_puts_P ( _T ( MSG_NO ) ) ;
2017-03-24 18:47:50 +00:00
}
2019-09-12 18:30:27 +00:00
int8_t retval = default_yes ? true : false ;
2017-03-24 18:47:50 +00:00
// Wait for user confirmation or a timeout.
2019-01-27 21:48:51 +00:00
unsigned long previous_millis_cmd = _millis ( ) ;
2018-07-16 00:13:52 +00:00
int8_t enc_dif = lcd_encoder_diff ;
2018-12-07 17:31:30 +00:00
lcd_consume_click ( ) ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
2017-03-24 18:47:50 +00:00
for ( ; ; ) {
2019-01-27 21:48:51 +00:00
if ( allow_timeouting & & _millis ( ) - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS )
2019-09-12 18:30:27 +00:00
{
retval = - 1 ;
break ;
}
2017-03-24 18:47:50 +00:00
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( enc_dif - lcd_encoder_diff ) > 4 ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-09-12 18:30:27 +00:00
if ( enc_dif < lcd_encoder_diff & & retval ) {
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " > " ) ) ) ;
2019-09-12 18:30:27 +00:00
retval = 0 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2017-03-24 18:47:50 +00:00
}
2019-09-12 18:30:27 +00:00
else if ( enc_dif > lcd_encoder_diff & & ! retval ) {
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " > " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " " ) ) ) ;
2019-09-12 18:30:27 +00:00
retval = 1 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2017-03-24 18:47:50 +00:00
}
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2017-03-24 18:47:50 +00:00
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2019-09-12 18:30:27 +00:00
break ;
2017-03-24 18:47:50 +00:00
}
}
2019-09-12 18:30:27 +00:00
lcd_encoder_diff = 0 ;
return retval ;
2016-07-22 13:28:01 +00:00
}
2018-10-08 13:58:49 +00:00
void lcd_bed_calibration_show_result ( BedSkewOffsetDetectionResultType result , uint8_t point_too_far_mask )
2016-07-22 13:28:01 +00:00
{
const char * msg = NULL ;
if ( result = = BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND ) {
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " XYZ calibration failed. Bed calibration point was not found. " ) ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND c=20 r=8
2016-07-22 13:28:01 +00:00
} else if ( result = = BED_SKEW_OFFSET_DETECTION_FITTING_FAILED ) {
if ( point_too_far_mask = = 0 )
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED ) ;
2016-07-22 13:28:01 +00:00
else if ( point_too_far_mask = = 2 | | point_too_far_mask = = 7 )
// Only the center point or all the three front points.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration failed. Front calibration points not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR c=20 r=8
2018-07-17 15:41:45 +00:00
else if ( ( point_too_far_mask & 1 ) = = 0 )
2016-07-22 13:28:01 +00:00
// The right and maybe the center point out of reach.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration failed. Right front calibration point not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR c=20 r=8
2016-07-22 13:28:01 +00:00
else
// The left and maybe the center point out of reach.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration failed. Left front calibration point not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR c=20 r=8
2016-07-22 13:28:01 +00:00
lcd_show_fullscreen_message_and_wait_P ( msg ) ;
} else {
if ( point_too_far_mask ! = 0 ) {
if ( point_too_far_mask = = 2 | | point_too_far_mask = = 7 )
// Only the center point or all the three front points.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration compromised. Front calibration points not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR c=20 r=8
2018-07-17 15:41:45 +00:00
else if ( ( point_too_far_mask & 1 ) = = 0 )
2016-07-22 13:28:01 +00:00
// The right and maybe the center point out of reach.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration compromised. Right front calibration point not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR c=20 r=8
2016-07-22 13:28:01 +00:00
else
// The left and maybe the center point out of reach.
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration compromised. Left front calibration point not reachable. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR c=20 r=8
2016-07-22 13:28:01 +00:00
lcd_show_fullscreen_message_and_wait_P ( msg ) ;
}
if ( point_too_far_mask = = 0 | | result > 0 ) {
switch ( result ) {
default :
// should not happen
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED ) ;
2016-07-22 13:28:01 +00:00
break ;
case BED_SKEW_OFFSET_DETECTION_PERFECT :
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration ok. X/Y axes are perpendicular. Congratulations! " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_PERFECT c=20 r=8
2016-07-22 13:28:01 +00:00
break ;
case BED_SKEW_OFFSET_DETECTION_SKEW_MILD :
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration all right. X/Y axes are slightly skewed. Good job! " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD c=20 r=8
2016-07-22 13:28:01 +00:00
break ;
case BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME :
2018-05-22 01:20:03 +00:00
msg = _i ( " XYZ calibration all right. Skew will be corrected automatically. " ) ; ////MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME c=20 r=8
2016-07-22 13:28:01 +00:00
break ;
}
lcd_show_fullscreen_message_and_wait_P ( msg ) ;
}
}
}
2018-04-24 11:43:51 +00:00
void lcd_temp_cal_show_result ( bool result ) {
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : Status ;
2018-04-24 11:43:51 +00:00
disable_x ( ) ;
disable_y ( ) ;
disable_z ( ) ;
disable_e0 ( ) ;
disable_e1 ( ) ;
disable_e2 ( ) ;
setTargetBed ( 0 ) ; //set bed target temperature back to 0
if ( result = = true ) {
eeprom_update_byte ( ( uint8_t * ) EEPROM_CALIBRATION_STATUS_PINDA , 1 ) ;
SERIAL_ECHOLNPGM ( " Temperature calibration done. Continue with pressing the knob. " ) ;
2018-05-23 14:37:08 +00:00
lcd_show_fullscreen_message_and_wait_P ( _T ( MSG_TEMP_CALIBRATION_DONE ) ) ;
2018-04-24 11:43:51 +00:00
eeprom_update_byte ( ( unsigned char * ) EEPROM_TEMP_CAL_ACTIVE , 1 ) ;
}
else {
eeprom_update_byte ( ( uint8_t * ) EEPROM_CALIBRATION_STATUS_PINDA , 0 ) ;
SERIAL_ECHOLNPGM ( " Temperature calibration failed. Continue with pressing the knob. " ) ;
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Temperature calibration failed " ) ) ; ////MSG_TEMP_CAL_FAILED c=20 r=8
2018-04-24 11:43:51 +00:00
eeprom_update_byte ( ( unsigned char * ) EEPROM_TEMP_CAL_ACTIVE , 0 ) ;
}
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
}
2016-07-22 13:28:01 +00:00
static void lcd_show_end_stops ( ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( ( PSTR ( " End stops diag " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2018-07-17 15:47:39 +00:00
lcd_puts_P ( ( READ ( X_MIN_PIN ) ^ ( bool ) X_MIN_ENDSTOP_INVERTING ) ? ( PSTR ( " X1 " ) ) : ( PSTR ( " X0 " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-17 15:47:39 +00:00
lcd_puts_P ( ( READ ( Y_MIN_PIN ) ^ ( bool ) Y_MIN_ENDSTOP_INVERTING ) ? ( PSTR ( " Y1 " ) ) : ( PSTR ( " Y0 " ) ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-17 15:47:39 +00:00
lcd_puts_P ( ( READ ( Z_MIN_PIN ) ^ ( bool ) Z_MIN_ENDSTOP_INVERTING ) ? ( PSTR ( " Z1 " ) ) : ( PSTR ( " Z0 " ) ) ) ;
2016-07-22 13:28:01 +00:00
}
2018-10-08 13:58:49 +00:00
# ifndef TMC2130
2016-07-22 13:28:01 +00:00
static void menu_show_end_stops ( ) {
lcd_show_end_stops ( ) ;
2018-06-23 01:22:39 +00:00
if ( LCD_CLICKED ) menu_back ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-10-08 13:58:49 +00:00
# endif // not defined TMC2130
2016-07-22 13:28:01 +00:00
// Lets the user move the Z carriage up to the end stoppers.
// When done, it sets the current Z to Z_MAX_POS and returns true.
// Otherwise the Z calibration is not changed and false is returned.
void lcd_diag_show_end_stops ( )
{
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2016-07-22 13:28:01 +00:00
for ( ; ; ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
lcd_show_end_stops ( ) ;
if ( lcd_clicked ( ) ) {
break ;
}
}
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2018-12-14 18:43:26 +00:00
static void lcd_print_state ( uint8_t state )
2018-08-28 14:12:59 +00:00
{
2018-12-14 18:43:26 +00:00
switch ( state ) {
case STATE_ON :
2019-08-19 07:20:17 +00:00
lcd_puts_P ( _N ( " 1 " ) ) ;
2018-12-14 18:43:26 +00:00
break ;
case STATE_OFF :
2019-08-19 07:20:17 +00:00
lcd_puts_P ( _N ( " 0 " ) ) ;
2018-12-14 18:43:26 +00:00
break ;
default :
2019-08-19 07:20:17 +00:00
lcd_puts_P ( _T ( MSG_NA ) ) ;
2018-12-14 18:43:26 +00:00
break ;
}
2018-08-28 14:12:59 +00:00
}
2018-12-14 18:43:26 +00:00
static void lcd_show_sensors_state ( )
2018-08-28 14:12:59 +00:00
{
2018-12-14 18:43:26 +00:00
//0: N/A; 1: OFF; 2: ON
uint8_t pinda_state = STATE_NA ;
uint8_t finda_state = STATE_NA ;
uint8_t idler_state = STATE_NA ;
2018-08-28 14:12:59 +00:00
2018-12-14 18:43:26 +00:00
pinda_state = READ ( Z_MIN_PIN ) ;
2019-10-31 16:45:22 +00:00
if ( mmu_enabled & & ( ( _millis ( ) - mmu_last_finda_response ) < 1000ul ) )
{
2018-12-14 18:43:26 +00:00
finda_state = mmu_finda ;
}
2019-01-24 00:12:30 +00:00
if ( ir_sensor_detected ) {
idler_state = ! PIN_GET ( IR_SENSOR_PIN ) ;
2018-12-21 16:12:16 +00:00
}
2018-12-21 17:51:13 +00:00
lcd_puts_at_P ( 0 , 0 , _i ( " Sensor state " ) ) ;
2018-12-14 18:43:26 +00:00
lcd_puts_at_P ( 1 , 1 , _i ( " PINDA: " ) ) ;
lcd_set_cursor ( LCD_WIDTH - 4 , 1 ) ;
lcd_print_state ( pinda_state ) ;
lcd_puts_at_P ( 1 , 2 , _i ( " FINDA: " ) ) ;
lcd_set_cursor ( LCD_WIDTH - 4 , 2 ) ;
lcd_print_state ( finda_state ) ;
lcd_puts_at_P ( 1 , 3 , _i ( " IR: " ) ) ;
lcd_set_cursor ( LCD_WIDTH - 4 , 3 ) ;
lcd_print_state ( idler_state ) ;
2018-12-12 23:12:00 +00:00
}
2019-03-11 19:43:07 +00:00
void lcd_menu_show_sensors_state ( ) // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
2018-12-12 23:12:00 +00:00
{
2018-12-14 18:43:26 +00:00
lcd_timeoutToStatus . stop ( ) ;
lcd_show_sensors_state ( ) ;
if ( LCD_CLICKED )
{
lcd_timeoutToStatus . start ( ) ;
menu_back ( ) ;
}
2018-12-12 23:12:00 +00:00
}
2016-07-22 13:28:01 +00:00
2019-07-12 08:10:56 +00:00
void prusa_statistics_err ( char c ) {
SERIAL_ECHO ( " {[ERR: " ) ;
SERIAL_ECHO ( c ) ;
SERIAL_ECHO ( ' ] ' ) ;
prusa_stat_farm_number ( ) ;
}
2019-07-22 15:10:04 +00:00
static void prusa_statistics_case0 ( uint8_t statnr ) {
2020-06-01 15:51:28 +00:00
SERIAL_ECHO ( ' { ' ) ;
2019-07-22 15:10:04 +00:00
prusa_stat_printerstatus ( statnr ) ;
prusa_stat_farm_number ( ) ;
prusa_stat_printinfo ( ) ;
}
2018-03-15 13:25:17 +00:00
void prusa_statistics ( int _message , uint8_t _fil_nr ) {
2017-07-07 02:45:09 +00:00
# ifdef DEBUG_DISABLE_PRUSA_STATISTICS
return ;
# endif //DEBUG_DISABLE_PRUSA_STATISTICS
2016-07-22 13:28:01 +00:00
switch ( _message )
{
case 0 : // default message
2019-03-05 15:00:50 +00:00
if ( busy_state = = PAUSED_FOR_USER )
2019-07-12 08:10:56 +00:00
{
2019-07-22 15:10:04 +00:00
prusa_statistics_case0 ( 15 ) ;
2019-03-05 15:00:50 +00:00
}
2019-10-20 15:34:54 +00:00
else if ( isPrintPaused )
2019-03-05 15:00:50 +00:00
{
2019-07-22 15:10:04 +00:00
prusa_statistics_case0 ( 14 ) ;
2019-03-05 15:00:50 +00:00
}
2019-05-28 16:22:34 +00:00
else if ( IS_SD_PRINTING | | loading_flag )
2016-07-22 13:28:01 +00:00
{
2019-07-22 15:10:04 +00:00
prusa_statistics_case0 ( 4 ) ;
2016-07-22 13:28:01 +00:00
}
else
{
2020-06-01 15:51:28 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_printerstatus ( 1 ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
2019-04-09 13:22:08 +00:00
prusa_stat_diameter ( ) ;
2017-03-24 18:47:50 +00:00
status_number = 1 ;
2016-07-22 13:28:01 +00:00
}
break ;
case 1 : // 1 heating
farm_status = 2 ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_printerstatus ( 2 ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 2 ;
2016-07-22 13:28:01 +00:00
farm_timer = 1 ;
break ;
case 2 : // heating done
farm_status = 3 ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_printerstatus ( 3 ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHOLN ( ' } ' ) ;
2017-03-24 18:47:50 +00:00
status_number = 3 ;
2016-07-22 13:28:01 +00:00
farm_timer = 1 ;
2019-05-28 16:22:34 +00:00
if ( IS_SD_PRINTING | | loading_flag )
2016-07-22 13:28:01 +00:00
{
farm_status = 4 ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_printerstatus ( 4 ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 4 ;
2016-07-22 13:28:01 +00:00
}
else
{
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_printerstatus ( 3 ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 3 ;
2016-07-22 13:28:01 +00:00
}
farm_timer = 1 ;
break ;
case 3 : // filament change
2019-07-12 08:10:56 +00:00
// must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function
// saved a considerable amount of FLASH
return ;
2016-07-22 13:28:01 +00:00
break ;
case 4 : // print succesfull
2018-03-15 13:25:17 +00:00
SERIAL_ECHO ( " {[RES:1][FIL: " ) ;
MYSERIAL . print ( int ( _fil_nr ) ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_printerstatus ( status_number ) ;
prusa_stat_farm_number ( ) ;
2016-07-22 13:28:01 +00:00
farm_timer = 2 ;
break ;
case 5 : // print not succesfull
2018-03-15 13:25:17 +00:00
SERIAL_ECHO ( " {[RES:0][FIL: " ) ;
MYSERIAL . print ( int ( _fil_nr ) ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_printerstatus ( status_number ) ;
prusa_stat_farm_number ( ) ;
2016-07-22 13:28:01 +00:00
farm_timer = 2 ;
break ;
case 6 : // print done
2018-03-15 13:25:17 +00:00
SERIAL_ECHO ( " {[PRN:8] " ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 8 ;
2016-07-22 13:28:01 +00:00
farm_timer = 2 ;
break ;
case 7 : // print done - stopped
2018-03-15 13:25:17 +00:00
SERIAL_ECHO ( " {[PRN:9] " ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 9 ;
2016-07-22 13:28:01 +00:00
farm_timer = 2 ;
break ;
case 8 : // printer started
SERIAL_ECHO ( " {[PRN:0][PFN: " ) ;
2017-03-24 18:47:50 +00:00
status_number = 0 ;
2016-07-22 13:28:01 +00:00
SERIAL_ECHO ( farm_no ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2016-07-22 13:28:01 +00:00
farm_timer = 2 ;
break ;
case 20 : // echo farm no
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_printerstatus ( status_number ) ;
prusa_stat_farm_number ( ) ;
2018-03-15 13:25:17 +00:00
farm_timer = 4 ;
2016-07-22 13:28:01 +00:00
break ;
case 21 : // temperatures
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' { ' ) ;
2016-07-22 13:28:01 +00:00
prusa_stat_temperatures ( ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
prusa_stat_printerstatus ( status_number ) ;
2016-07-22 13:28:01 +00:00
break ;
2016-08-31 15:12:05 +00:00
case 22 : // waiting for filament change
2018-03-15 13:25:17 +00:00
SERIAL_ECHO ( " {[PRN:5] " ) ;
2017-03-24 18:47:50 +00:00
prusa_stat_farm_number ( ) ;
status_number = 5 ;
2016-08-31 15:12:05 +00:00
break ;
2017-03-24 18:47:50 +00:00
case 90 : // Error - Thermal Runaway
2019-07-12 08:10:56 +00:00
prusa_statistics_err ( ' 1 ' ) ;
2017-03-24 18:47:50 +00:00
break ;
case 91 : // Error - Thermal Runaway Preheat
2019-07-12 08:10:56 +00:00
prusa_statistics_err ( ' 2 ' ) ;
2017-03-24 18:47:50 +00:00
break ;
case 92 : // Error - Min temp
2019-07-12 08:10:56 +00:00
prusa_statistics_err ( ' 3 ' ) ;
2017-03-24 18:47:50 +00:00
break ;
case 93 : // Error - Max temp
2019-07-12 08:10:56 +00:00
prusa_statistics_err ( ' 4 ' ) ;
2017-03-24 18:47:50 +00:00
break ;
2016-08-31 15:12:05 +00:00
case 99 : // heartbeat
SERIAL_ECHO ( " {[PRN:99] " ) ;
prusa_stat_temperatures ( ) ;
2017-03-24 18:47:50 +00:00
SERIAL_ECHO ( " [PFN: " ) ;
SERIAL_ECHO ( farm_no ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2016-08-31 15:12:05 +00:00
break ;
2016-07-22 13:28:01 +00:00
}
2019-07-12 08:10:56 +00:00
SERIAL_ECHOLN ( ' } ' ) ;
2016-07-22 13:28:01 +00:00
}
static void prusa_stat_printerstatus ( int _status )
{
SERIAL_ECHO ( " [PRN: " ) ;
SERIAL_ECHO ( _status ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
static void prusa_stat_farm_number ( ) {
SERIAL_ECHO ( " [PFN: " ) ;
SERIAL_ECHO ( farm_no ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2017-03-24 18:47:50 +00:00
}
2019-04-09 13:22:08 +00:00
static void prusa_stat_diameter ( ) {
SERIAL_ECHO ( " [DIA: " ) ;
SERIAL_ECHO ( eeprom_read_word ( ( uint16_t * ) EEPROM_NOZZLE_DIAMETER_uM ) ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2019-04-09 13:22:08 +00:00
}
2016-07-22 13:28:01 +00:00
static void prusa_stat_temperatures ( )
{
SERIAL_ECHO ( " [ST0: " ) ;
SERIAL_ECHO ( target_temperature [ 0 ] ) ;
SERIAL_ECHO ( " ][STB: " ) ;
SERIAL_ECHO ( target_temperature_bed ) ;
SERIAL_ECHO ( " ][AT0: " ) ;
SERIAL_ECHO ( current_temperature [ 0 ] ) ;
SERIAL_ECHO ( " ][ATB: " ) ;
SERIAL_ECHO ( current_temperature_bed ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2016-07-22 13:28:01 +00:00
}
static void prusa_stat_printinfo ( )
{
SERIAL_ECHO ( " [TFU: " ) ;
SERIAL_ECHO ( total_filament_used ) ;
SERIAL_ECHO ( " ][PCD: " ) ;
SERIAL_ECHO ( itostr3 ( card . percentDone ( ) ) ) ;
SERIAL_ECHO ( " ][FEM: " ) ;
SERIAL_ECHO ( itostr3 ( feedmultiply ) ) ;
SERIAL_ECHO ( " ][FNM: " ) ;
SERIAL_ECHO ( longFilenameOLD ) ;
SERIAL_ECHO ( " ][TIM: " ) ;
if ( starttime ! = 0 )
{
2019-01-27 21:48:51 +00:00
SERIAL_ECHO ( _millis ( ) / 1000 - starttime / 1000 ) ;
2016-07-22 13:28:01 +00:00
}
else
{
SERIAL_ECHO ( 0 ) ;
}
SERIAL_ECHO ( " ][FWR: " ) ;
2018-01-11 14:50:26 +00:00
SERIAL_ECHO ( FW_VERSION ) ;
2019-07-12 08:10:56 +00:00
SERIAL_ECHO ( ' ] ' ) ;
2019-04-09 13:22:08 +00:00
prusa_stat_diameter ( ) ;
2016-07-22 13:28:01 +00:00
}
2017-11-16 19:52:13 +00:00
/*
2016-07-22 13:28:01 +00:00
void lcd_pick_babystep ( ) {
int enc_dif = 0 ;
int cursor_pos = 1 ;
int fsm = 0 ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Pick print " ) ) ; ////MSG_PICK_Z
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 3 , 2 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " 1 " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 3 , 3 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " 2 " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 12 , 2 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " 3 " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 12 , 3 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " 4 " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2016-07-22 13:28:01 +00:00
while ( fsm = = 0 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 ) {
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
if ( ( abs ( enc_dif - lcd_encoder_diff ) ) > 1 ) {
if ( enc_dif > lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2016-07-22 13:28:01 +00:00
cursor_pos + + ;
}
if ( cursor_pos > 4 ) {
cursor_pos = 4 ;
}
if ( cursor_pos < 1 ) {
cursor_pos = 1 ;
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 1 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 10 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 10 , 3 ) ;
lcd_print ( " " ) ;
2016-07-22 13:28:01 +00:00
if ( cursor_pos < 3 ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , cursor_pos + 1 ) ;
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
} else {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 10 , cursor_pos - 1 ) ;
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
}
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2016-07-22 13:28:01 +00:00
}
}
if ( lcd_clicked ( ) ) {
fsm = cursor_pos ;
2016-08-11 08:42:53 +00:00
int babyStepZ ;
EEPROM_read_B ( EEPROM_BABYSTEP_Z0 + ( ( fsm - 1 ) * 2 ) , & babyStepZ ) ;
EEPROM_save_B ( EEPROM_BABYSTEP_Z , & babyStepZ ) ;
2017-03-24 18:47:50 +00:00
calibration_status_store ( CALIBRATION_STATUS_CALIBRATED ) ;
2019-01-27 21:48:51 +00:00
_delay ( 500 ) ;
2016-07-22 13:28:01 +00:00
}
} ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2017-11-16 19:52:13 +00:00
*/
2016-07-22 13:28:01 +00:00
void lcd_move_menu_axis ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ;
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Move X " ) , lcd_move_x ) ; ////MSG_MOVE_X
MENU_ITEM_SUBMENU_P ( _i ( " Move Y " ) , lcd_move_y ) ; ////MSG_MOVE_Y
MENU_ITEM_SUBMENU_P ( _i ( " Move Z " ) , lcd_move_z ) ; ////MSG_MOVE_Z
MENU_ITEM_SUBMENU_P ( _i ( " Extruder " ) , lcd_move_e ) ; ////MSG_MOVE_E
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
static void lcd_move_menu_1mm ( )
{
move_menu_scale = 1.0 ;
lcd_move_menu_axis ( ) ;
}
void EEPROM_save ( int pos , uint8_t * value , uint8_t size )
{
do
{
eeprom_write_byte ( ( unsigned char * ) pos , * value ) ;
pos + + ;
value + + ;
} while ( - - size ) ;
}
void EEPROM_read ( int pos , uint8_t * value , uint8_t size )
{
do
{
* value = eeprom_read_byte ( ( unsigned char * ) pos ) ;
pos + + ;
value + + ;
} while ( - - size ) ;
}
2017-12-10 10:08:50 +00:00
# ifdef SDCARD_SORT_ALPHA
static void lcd_sort_type_set ( ) {
uint8_t sdSort ;
EEPROM_read ( EEPROM_SD_SORT , ( uint8_t * ) & sdSort , sizeof ( sdSort ) ) ;
switch ( sdSort ) {
case SD_SORT_TIME : sdSort = SD_SORT_ALPHA ; break ;
case SD_SORT_ALPHA : sdSort = SD_SORT_NONE ; break ;
default : sdSort = SD_SORT_TIME ;
}
eeprom_update_byte ( ( unsigned char * ) EEPROM_SD_SORT , sdSort ) ;
2017-12-11 10:30:49 +00:00
presort_flag = true ;
2017-12-10 10:08:50 +00:00
}
# endif //SDCARD_SORT_ALPHA
2018-02-01 19:08:11 +00:00
# ifdef TMC2130
2018-01-12 18:54:32 +00:00
static void lcd_crash_mode_info ( )
{
lcd_update_enable ( true ) ;
static uint32_t tim = 0 ;
2019-01-27 21:48:51 +00:00
if ( ( tim + 1000 ) < _millis ( ) )
2018-01-12 18:54:32 +00:00
{
2019-07-15 17:32:58 +00:00
lcd_clear ( ) ;
2019-07-26 15:53:08 +00:00
fputs_P ( _i ( " Crash detection can \n be turned on only in \n Normal mode " ) , lcdout ) ; ////MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
2019-01-27 21:48:51 +00:00
tim = _millis ( ) ;
2018-01-12 18:54:32 +00:00
}
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2018-01-12 18:54:32 +00:00
}
2017-12-27 20:43:04 +00:00
static void lcd_crash_mode_info2 ( )
{
2018-01-12 18:54:32 +00:00
lcd_update_enable ( true ) ;
static uint32_t tim = 0 ;
2019-01-27 21:48:51 +00:00
if ( ( tim + 1000 ) < _millis ( ) )
2018-01-12 18:54:32 +00:00
{
2019-07-15 17:32:58 +00:00
lcd_clear ( ) ;
2019-07-26 15:53:08 +00:00
fputs_P ( _i ( " WARNING: \n Crash detection \n disabled in \n Stealth mode " ) , lcdout ) ; ////MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
2019-01-27 21:48:51 +00:00
tim = _millis ( ) ;
2018-01-12 18:54:32 +00:00
}
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-12-27 20:43:04 +00:00
}
2018-02-01 19:08:11 +00:00
# endif //TMC2130
2017-12-27 20:43:04 +00:00
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2017-12-28 17:59:57 +00:00
static void lcd_filament_autoload_info ( )
{
2018-05-15 18:23:22 +00:00
uint8_t nlines ;
lcd_update_enable ( true ) ;
static uint32_t tim = 0 ;
2019-01-27 21:48:51 +00:00
if ( ( tim + 1000 ) < _millis ( ) )
2018-05-15 18:23:22 +00:00
{
2018-05-28 11:22:14 +00:00
lcd_display_message_fullscreen_nonBlocking_P ( _i ( " Autoloading filament available only when filament sensor is turned on... " ) , nlines ) ; ////MSG_AUTOLOADING_ONLY_IF_FSENS_ON c=20 r=4
2019-01-27 21:48:51 +00:00
tim = _millis ( ) ;
2018-05-15 18:23:22 +00:00
}
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-12-28 17:59:57 +00:00
}
static void lcd_fsensor_fail ( )
{
2018-05-15 18:23:22 +00:00
uint8_t nlines ;
lcd_update_enable ( true ) ;
static uint32_t tim = 0 ;
2019-01-27 21:48:51 +00:00
if ( ( tim + 1000 ) < _millis ( ) )
2018-05-15 18:23:22 +00:00
{
2018-05-28 11:22:14 +00:00
lcd_display_message_fullscreen_nonBlocking_P ( _i ( " ERROR: Filament sensor is not responding, please check connection. " ) , nlines ) ; ////MSG_FSENS_NOT_RESPONDING c=20 r=4
2019-01-27 21:48:51 +00:00
tim = _millis ( ) ;
2018-05-15 18:23:22 +00:00
}
2018-06-24 10:41:36 +00:00
menu_back_if_clicked ( ) ;
2017-12-28 17:59:57 +00:00
}
2018-07-20 21:48:00 +00:00
# endif //FILAMENT_SENSOR
2018-02-21 14:19:34 +00:00
2018-07-23 18:04:47 +00:00
//-//
static void lcd_sound_state_set ( void )
{
Sound_CycleState ( ) ;
}
2017-12-27 20:43:04 +00:00
2019-03-11 11:33:22 +00:00
# ifndef MMU_FORCE_STEALTH_MODE
2019-03-10 15:03:46 +00:00
static void lcd_silent_mode_mmu_set ( ) {
if ( SilentModeMenu_MMU = = 1 ) SilentModeMenu_MMU = 0 ;
else SilentModeMenu_MMU = 1 ;
2019-03-11 11:33:22 +00:00
//saving to eeprom is done in mmu_loop() after mmu actually switches state and confirms with "ok"
2019-03-10 15:03:46 +00:00
}
2019-03-11 11:33:22 +00:00
# endif //MMU_FORCE_STEALTH_MODE
2019-03-10 15:03:46 +00:00
2016-07-22 13:28:01 +00:00
static void lcd_silent_mode_set ( ) {
2017-09-15 16:04:19 +00:00
switch ( SilentModeMenu ) {
2018-04-11 14:41:41 +00:00
# ifdef TMC2130
2018-04-25 18:47:19 +00:00
case SILENT_MODE_NORMAL : SilentModeMenu = SILENT_MODE_STEALTH ; break ;
case SILENT_MODE_STEALTH : SilentModeMenu = SILENT_MODE_NORMAL ; break ;
default : SilentModeMenu = SILENT_MODE_NORMAL ; break ; // (probably) not needed
2018-04-11 14:41:41 +00:00
# else
2018-04-25 18:47:19 +00:00
case SILENT_MODE_POWER : SilentModeMenu = SILENT_MODE_SILENT ; break ;
case SILENT_MODE_SILENT : SilentModeMenu = SILENT_MODE_AUTO ; break ;
case SILENT_MODE_AUTO : SilentModeMenu = SILENT_MODE_POWER ; break ;
default : SilentModeMenu = SILENT_MODE_POWER ; break ; // (probably) not needed
2018-04-11 14:41:41 +00:00
# endif //TMC2130
2017-09-15 16:04:19 +00:00
}
2016-08-11 08:42:53 +00:00
eeprom_update_byte ( ( unsigned char * ) EEPROM_SILENT , SilentModeMenu ) ;
2017-08-17 13:23:34 +00:00
# ifdef TMC2130
2019-03-04 20:30:36 +00:00
lcd_display_message_fullscreen_P ( _i ( " Mode change in progress ... " ) ) ;
2018-01-20 14:39:21 +00:00
// Wait until the planner queue is drained and the stepper routine achieves
// an idle state.
2017-09-20 23:52:28 +00:00
st_synchronize ( ) ;
2017-12-27 19:29:24 +00:00
if ( tmc2130_wait_standstill_xy ( 1000 ) ) { }
// MYSERIAL.print("standstill OK");
// else
// MYSERIAL.print("standstill NG!");
2018-07-19 16:56:01 +00:00
cli ( ) ;
2018-04-25 18:47:19 +00:00
tmc2130_mode = ( SilentModeMenu ! = SILENT_MODE_NORMAL ) ? TMC2130_MODE_SILENT : TMC2130_MODE_NORMAL ;
2018-07-19 16:56:01 +00:00
update_mode_profile ( ) ;
2017-07-03 05:43:50 +00:00
tmc2130_init ( ) ;
2018-01-20 14:39:21 +00:00
// We may have missed a stepper timer interrupt due to the time spent in tmc2130_init.
// Be safe than sorry, reset the stepper timer before re-enabling interrupts.
st_reset_timer ( ) ;
2017-09-20 23:52:28 +00:00
sei ( ) ;
2017-08-17 13:23:34 +00:00
# endif //TMC2130
2018-03-29 21:01:13 +00:00
st_current_init ( ) ;
2018-02-01 19:08:11 +00:00
# ifdef TMC2130
2019-08-20 15:22:27 +00:00
if ( lcd_crash_detect_enabled ( ) & & ( SilentModeMenu ! = SILENT_MODE_NORMAL ) )
2018-06-23 01:22:39 +00:00
menu_submenu ( lcd_crash_mode_info2 ) ;
2019-03-04 20:30:36 +00:00
lcd_encoder_diff = 0 ; // reset 'encoder buffer'
2018-02-01 19:08:11 +00:00
# endif //TMC2130
2017-12-27 20:43:04 +00:00
}
2018-02-01 19:08:11 +00:00
# ifdef TMC2130
2019-08-20 15:22:27 +00:00
static void crash_mode_switch ( )
2017-09-22 17:28:32 +00:00
{
2019-08-20 15:22:27 +00:00
if ( lcd_crash_detect_enabled ( ) )
{
lcd_crash_detect_disable ( ) ;
}
else
{
lcd_crash_detect_enable ( ) ;
2017-09-22 17:28:32 +00:00
}
2019-06-12 16:19:41 +00:00
if ( IS_SD_PRINTING | | is_usb_printing | | ( lcd_commands_type = = LcdCommands : : Layer1Cal ) ) menu_goto ( lcd_tune_menu , 9 , true , true ) ;
2018-07-16 00:13:52 +00:00
else menu_goto ( lcd_settings_menu , 9 , true , true ) ;
2017-09-22 17:28:32 +00:00
}
2018-02-01 19:08:11 +00:00
# endif //TMC2130
2018-05-02 20:13:47 +00:00
2017-09-22 17:28:32 +00:00
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2017-09-22 17:28:32 +00:00
static void lcd_fsensor_state_set ( )
{
2017-09-26 02:30:10 +00:00
FSensorStateMenu = ! FSensorStateMenu ; //set also from fsensor_enable() and fsensor_disable()
2018-08-27 03:20:42 +00:00
if ( ! FSensorStateMenu ) {
fsensor_disable ( ) ;
if ( fsensor_autoload_enabled & & ! mmu_enabled )
menu_submenu ( lcd_filament_autoload_info ) ;
}
else {
fsensor_enable ( ) ;
if ( fsensor_not_responding & & ! mmu_enabled )
menu_submenu ( lcd_fsensor_fail ) ;
}
2017-09-22 17:28:32 +00:00
}
2018-07-20 21:48:00 +00:00
# endif //FILAMENT_SENSOR
2018-02-21 14:19:34 +00:00
2017-09-22 17:28:32 +00:00
2017-12-10 10:08:50 +00:00
# if !SDSORT_USES_RAM
2017-12-11 10:30:49 +00:00
void lcd_set_degree ( ) {
lcd_set_custom_characters_degree ( ) ;
2017-12-10 10:08:50 +00:00
}
void lcd_set_progress ( ) {
lcd_set_custom_characters_progress ( ) ;
}
# endif
2018-06-07 22:20:28 +00:00
# if (LANG_MODE != 0)
2018-06-23 12:33:54 +00:00
void menu_setlang ( unsigned char lang )
{
if ( ! lang_select ( lang ) )
{
2018-11-22 16:32:53 +00:00
if ( lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " Copy selected language? " ) , false , true ) )
2018-06-23 12:33:54 +00:00
lang_boot_update_start ( lang ) ;
lcd_update_enable ( true ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_language_menu , 0 , true , true ) ;
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-07-16 00:13:52 +00:00
lcd_draw_update = 2 ;
2018-06-23 12:33:54 +00:00
}
}
2016-07-22 13:28:01 +00:00
static void lcd_language_menu ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
if ( lang_is_selected ( ) ) MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ; //
2018-06-23 12:33:54 +00:00
if ( menu_item_text_P ( lang_get_name_by_code ( lang_get_code ( 0 ) ) ) ) //primary language
{
menu_setlang ( 0 ) ;
return ;
}
2018-06-14 20:46:01 +00:00
uint8_t cnt = lang_get_count ( ) ;
# ifdef W25X20CL
if ( cnt = = 2 ) //display secondary language in case of clear xflash
2018-06-23 12:33:54 +00:00
{
if ( menu_item_text_P ( lang_get_name_by_code ( lang_get_code ( 1 ) ) ) )
{
menu_setlang ( 1 ) ;
return ;
}
}
2018-06-14 20:46:01 +00:00
else
2018-06-15 18:37:33 +00:00
for ( int i = 2 ; i < cnt ; i + + ) //skip seconday language - solved in lang_select (MK3)
2018-06-14 20:46:01 +00:00
# else //W25X20CL
2018-06-15 18:37:33 +00:00
for ( int i = 1 ; i < cnt ; i + + ) //all seconday languages (MK2/25)
2018-06-14 20:46:01 +00:00
# endif //W25X20CL
2018-06-23 12:33:54 +00:00
if ( menu_item_text_P ( lang_get_name_by_code ( lang_get_code ( i ) ) ) )
{
menu_setlang ( i ) ;
return ;
}
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-06-07 22:20:28 +00:00
# endif //(LANG_MODE != 0)
2016-07-22 13:28:01 +00:00
void lcd_mesh_bedleveling ( )
{
2017-06-29 16:35:43 +00:00
mesh_bed_run_from_menu = true ;
2016-07-22 13:28:01 +00:00
enquecommand_P ( PSTR ( " G80 " ) ) ;
lcd_return_to_status ( ) ;
}
void lcd_mesh_calibration ( )
{
enquecommand_P ( PSTR ( " M45 " ) ) ;
lcd_return_to_status ( ) ;
}
2016-08-11 08:42:53 +00:00
void lcd_mesh_calibration_z ( )
{
enquecommand_P ( PSTR ( " M45 Z " ) ) ;
lcd_return_to_status ( ) ;
}
2017-06-29 16:35:43 +00:00
void lcd_pinda_calibration_menu ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MENU_CALIBRATION ) ) ;
MENU_ITEM_SUBMENU_P ( _i ( " Calibrate " ) , lcd_calibrate_pinda ) ; ////MSG_CALIBRATE_PINDA c=17 r=1
MENU_END ( ) ;
2017-06-29 16:35:43 +00:00
}
void lcd_temp_calibration_set ( ) {
2020-06-11 18:00:55 +00:00
bool temp_cal_active = eeprom_read_byte ( ( unsigned char * ) EEPROM_TEMP_CAL_ACTIVE ) ;
2017-06-29 16:35:43 +00:00
temp_cal_active = ! temp_cal_active ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_TEMP_CAL_ACTIVE , temp_cal_active ) ;
}
2018-03-07 17:30:33 +00:00
# ifdef HAS_SECOND_SERIAL_PORT
2017-12-08 15:56:06 +00:00
void lcd_second_serial_set ( ) {
if ( selectedSerialPort = = 1 ) selectedSerialPort = 0 ;
else selectedSerialPort = 1 ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_SECOND_SERIAL_ACTIVE , selectedSerialPort ) ;
2018-01-25 14:23:11 +00:00
MYSERIAL . begin ( BAUDRATE ) ;
2017-12-08 15:56:06 +00:00
}
2018-03-07 17:30:33 +00:00
# endif //HAS_SECOND_SERIAL_PORT
2017-12-08 15:56:06 +00:00
2017-06-29 16:35:43 +00:00
void lcd_calibrate_pinda ( ) {
enquecommand_P ( PSTR ( " G76 " ) ) ;
lcd_return_to_status ( ) ;
}
2017-03-24 18:47:50 +00:00
# ifndef SNMM
/*void lcd_calibrate_extruder() {
if ( degHotend0 ( ) > EXTRUDE_MINTEMP )
{
current_position [ E_AXIS ] = 0 ; //set initial position to zero
plan_set_e_position ( current_position [ E_AXIS ] ) ;
//long steps_start = st_get_position(E_AXIS);
long steps_final ;
float e_steps_per_unit ;
float feedrate = ( 180 / axis_steps_per_unit [ E_AXIS ] ) * 1 ; //3 //initial automatic extrusion feedrate (depends on current value of axis_steps_per_unit to avoid too fast extrusion)
float e_shift_calibration = ( axis_steps_per_unit [ E_AXIS ] > 180 ) ? ( ( 180 / axis_steps_per_unit [ E_AXIS ] ) * 70 ) : 70 ; //length of initial automatic extrusion sequence
2018-05-22 01:20:03 +00:00
const char * msg_e_cal_knob = _i ( " Rotate knob until mark reaches extruder body. Click when done. " ) ; ////MSG_E_CAL_KNOB c=20 r=8
2017-03-24 18:47:50 +00:00
const char * msg_next_e_cal_knob = lcd_display_message_fullscreen_P ( msg_e_cal_knob ) ;
const bool multi_screen = msg_next_e_cal_knob ! = NULL ;
unsigned long msg_millis ;
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Mark filament 100mm from extruder body. Click when done. " ) ) ; ////MSG_MARK_FIL c=20 r=8
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-03-24 18:47:50 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ; lcd_puts_P ( _T ( MSG_PLEASE_WAIT ) ) ;
2017-03-24 18:47:50 +00:00
current_position [ E_AXIS ] + = e_shift_calibration ;
2019-08-21 07:59:51 +00:00
plan_buffer_line_curposXYZE ( feedrate , active_extruder ) ;
2017-03-24 18:47:50 +00:00
st_synchronize ( ) ;
lcd_display_message_fullscreen_P ( msg_e_cal_knob ) ;
2019-01-27 21:48:51 +00:00
msg_millis = _millis ( ) ;
2017-03-24 18:47:50 +00:00
while ( ! LCD_CLICKED ) {
2019-01-27 21:48:51 +00:00
if ( multi_screen & & _millis ( ) - msg_millis > 5000 ) {
2017-03-24 18:47:50 +00:00
if ( msg_next_e_cal_knob = = NULL )
msg_next_e_cal_knob = msg_e_cal_knob ;
msg_next_e_cal_knob = lcd_display_message_fullscreen_P ( msg_next_e_cal_knob ) ;
2019-01-27 21:48:51 +00:00
msg_millis = _millis ( ) ;
2017-03-24 18:47:50 +00:00
}
//manage_inactivity(true);
manage_heater ( ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( lcd_encoder_diff ) > = ENCODER_PULSES_PER_STEP ) { //adjusting mark by knob rotation
2017-03-24 18:47:50 +00:00
delay_keep_alive ( 50 ) ;
2019-01-27 21:48:51 +00:00
//previous_millis_cmd = _millis();
2018-07-16 00:13:52 +00:00
lcd_encoder + = ( lcd_encoder_diff / ENCODER_PULSES_PER_STEP ) ;
lcd_encoder_diff = 0 ;
2017-03-24 18:47:50 +00:00
if ( ! planner_queue_full ( ) ) {
2018-07-16 00:13:52 +00:00
current_position [ E_AXIS ] + = float ( abs ( ( int ) lcd_encoder ) ) * 0.01 ; //0.05
lcd_encoder = 0 ;
2019-08-21 07:59:51 +00:00
plan_buffer_line_curposXYZE ( feedrate , active_extruder ) ;
2017-03-24 18:47:50 +00:00
}
}
}
steps_final = current_position [ E_AXIS ] * axis_steps_per_unit [ E_AXIS ] ;
//steps_final = st_get_position(E_AXIS);
2018-07-16 00:13:52 +00:00
lcd_draw_update = 1 ;
2017-03-24 18:47:50 +00:00
e_steps_per_unit = ( ( float ) ( steps_final ) ) / 100.0f ;
if ( e_steps_per_unit < MIN_E_STEPS_PER_UNIT ) e_steps_per_unit = MIN_E_STEPS_PER_UNIT ;
if ( e_steps_per_unit > MAX_E_STEPS_PER_UNIT ) e_steps_per_unit = MAX_E_STEPS_PER_UNIT ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-03-24 18:47:50 +00:00
axis_steps_per_unit [ E_AXIS ] = e_steps_per_unit ;
enquecommand_P ( PSTR ( " M500 " ) ) ; //store settings to eeprom
2018-07-16 02:13:26 +00:00
//lcd_drawedit(PSTR("Result"), ftostr31(axis_steps_per_unit[E_AXIS]));
2017-03-24 18:47:50 +00:00
//delay_keep_alive(2000);
delay_keep_alive ( 500 ) ;
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " E calibration finished. Please clean the nozzle. Click when done. " ) ) ; ////MSG_CLEAN_NOZZLE_E c=20 r=8
2017-03-24 18:47:50 +00:00
lcd_update_enable ( true ) ;
2018-07-16 00:13:52 +00:00
lcd_draw_update = 2 ;
2017-03-24 18:47:50 +00:00
}
else
{
2018-11-01 15:29:09 +00:00
show_preheat_nozzle_warning ( ) ;
2017-03-24 18:47:50 +00:00
}
lcd_return_to_status ( ) ;
}
void lcd_extr_cal_reset ( ) {
float tmp1 [ ] = DEFAULT_AXIS_STEPS_PER_UNIT ;
axis_steps_per_unit [ E_AXIS ] = tmp1 [ 3 ] ;
//extrudemultiply = 100;
enquecommand_P ( PSTR ( " M500 " ) ) ;
} */
# endif
2016-08-11 08:42:53 +00:00
void lcd_toshiba_flash_air_compatibility_toggle ( )
{
card . ToshibaFlashAir_enable ( ! card . ToshibaFlashAir_isEnabled ( ) ) ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY , card . ToshibaFlashAir_isEnabled ( ) ) ;
}
2019-10-01 19:04:00 +00:00
//! @brief Continue first layer calibration with previous value or start from zero?
//!
//! @code{.unparsed}
//! |01234567890123456789|
2019-10-01 20:57:59 +00:00
//! |Sheet Smooth1 actual| c=a, c=b, a+b = 13
//! |Z offset: -1.480 mm | c=a, c=b, a+b = 14
//! |>Continue | c=19
//! | Start from zero | c=19
2019-10-01 19:04:00 +00:00
//! ----------------------
//! @endcode
2019-10-01 16:22:12 +00:00
void lcd_first_layer_calibration_reset ( )
{
2019-10-01 19:04:00 +00:00
typedef struct
{
bool reset ;
} MenuData ;
static_assert ( sizeof ( menu_data ) > = sizeof ( MenuData ) , " _menu_data_t doesn't fit into menu_data " ) ;
MenuData * menuData = ( MenuData * ) & ( menu_data [ 0 ] ) ;
if ( LCD_CLICKED | | ! eeprom_is_sheet_initialized ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) | |
( calibration_status ( ) > = CALIBRATION_STATUS_LIVE_ADJUST ) | |
( 0 = = static_cast < int16_t > ( eeprom_read_word ( reinterpret_cast < uint16_t * >
( & EEPROM_Sheets_base - > s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] . z_offset ) ) ) ) )
{
if ( menuData - > reset )
{
eeprom_update_word ( reinterpret_cast < uint16_t * > ( & EEPROM_Sheets_base - > s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] . z_offset ) , 0xffff ) ;
}
menu_goto ( lcd_v2_calibration , 0 , true , true ) ;
}
2019-10-01 17:20:36 +00:00
2019-10-01 19:04:00 +00:00
if ( lcd_encoder > 0 )
{
menuData - > reset = true ;
lcd_encoder = 1 ;
}
else if ( lcd_encoder < 1 )
{
menuData - > reset = false ;
lcd_encoder = 0 ;
}
char sheet_name [ sizeof ( Sheet : : name ) ] ;
eeprom_read_block ( sheet_name , & EEPROM_Sheets_base - > s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] . name , sizeof ( Sheet : : name ) ) ;
2019-10-01 16:22:12 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2019-10-01 20:57:59 +00:00
float offset = static_cast < int16_t > ( eeprom_read_word ( reinterpret_cast < uint16_t * > ( & EEPROM_Sheets_base - > s [ ( eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ) ] . z_offset ) ) ) / cs . axis_steps_per_unit [ Z_AXIS ] ;
2019-11-15 16:47:39 +00:00
lcd_printf_P ( _i ( " Sheet %.7s \n Z offset: %+1.3f mm \n %cContinue \n %cStart from zero " ) , //// \n denotes line break, %.7s is replaced by 7 character long sheet name, %+1.3f is replaced by 6 character long floating point number, %c is replaced by > or white space (one character) based on whether first or second option is selected. % denoted place holders can not be reordered. r=4
2019-10-01 20:57:59 +00:00
sheet_name , offset , menuData - > reset ? ' ' : ' > ' , menuData - > reset ? ' > ' : ' ' ) ;
2019-10-01 19:04:00 +00:00
2019-10-01 16:22:12 +00:00
}
2018-08-02 16:54:00 +00:00
void lcd_v2_calibration ( )
{
if ( mmu_enabled )
2018-10-08 13:58:49 +00:00
{
2019-09-20 11:01:07 +00:00
const uint8_t filament = choose_menu_P (
2019-09-30 16:13:57 +00:00
_i ( " Select filament: " ) , ////c=20 r=1
2019-09-20 11:01:07 +00:00
_T ( MSG_FILAMENT ) , _i ( " Cancel " ) ) ; ////c=19 r=1
2018-10-08 13:58:49 +00:00
if ( filament < 5 )
{
2019-09-12 15:54:05 +00:00
lay1cal_filament = filament ;
}
else
{
menu_back ( ) ;
return ;
2018-10-08 13:58:49 +00:00
}
}
2019-09-12 21:41:42 +00:00
else if ( ! eeprom_read_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE ) )
2018-08-02 16:54:00 +00:00
{
2019-09-11 22:14:24 +00:00
bool loaded = false ;
if ( fsensor_enabled & & ir_sensor_detected )
{
loaded = ( digitalRead ( IR_SENSOR_PIN ) = = 0 ) ;
}
else
{
loaded = lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " Is filament loaded? " ) , false , true ) ; ////MSG_PLA_FILAMENT_LOADED c=20 r=2
2019-09-12 18:05:16 +00:00
lcd_update_enabled = true ;
2019-09-11 22:14:24 +00:00
}
2019-09-12 15:54:05 +00:00
if ( ! loaded )
{
2019-09-11 22:14:24 +00:00
lcd_display_message_fullscreen_P ( _i ( " Please load filament first. " ) ) ; ////MSG_PLEASE_LOAD_PLA c=20 r=4
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 20 ; i + + ) { //wait max. 2s
2018-08-02 16:54:00 +00:00
delay_keep_alive ( 100 ) ;
if ( lcd_clicked ( ) ) {
break ;
}
2017-11-07 15:49:04 +00:00
}
2019-09-12 18:05:16 +00:00
lcd_update_enabled = true ;
2019-09-12 15:54:05 +00:00
menu_back ( ) ;
return ;
2017-11-07 15:49:04 +00:00
}
}
2019-09-12 15:54:05 +00:00
eFilamentAction = FilamentAction : : Lay1Cal ;
2019-09-12 16:15:15 +00:00
menu_goto ( lcd_generic_preheat_menu , 0 , true , true ) ;
2017-11-07 15:49:04 +00:00
}
void lcd_wizard ( ) {
bool result = true ;
if ( calibration_status ( ) ! = CALIBRATION_STATUS_ASSEMBLED ) {
2018-05-22 01:20:03 +00:00
result = lcd_show_multiscreen_message_yes_no_and_wait_P ( _i ( " Running Wizard will delete current calibration results and start from the beginning. Continue? " ) , false , false ) ; ////MSG_WIZARD_RERUN c=20 r=7
2017-11-07 15:49:04 +00:00
}
if ( result ) {
calibration_status_store ( CALIBRATION_STATUS_ASSEMBLED ) ;
2018-10-08 13:58:49 +00:00
lcd_wizard ( WizState : : Run ) ;
2017-11-07 15:49:04 +00:00
}
else {
lcd_return_to_status ( ) ;
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
}
}
2019-07-29 12:55:42 +00:00
# if (LANG_MODE != 0)
2018-06-10 14:04:32 +00:00
void lcd_language ( )
{
lcd_update_enable ( true ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 00:13:52 +00:00
menu_goto ( lcd_language_menu , 0 , true , true ) ;
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . stop ( ) ; //infinite timeout
2018-07-16 00:13:52 +00:00
lcd_draw_update = 2 ;
2018-07-15 16:37:59 +00:00
while ( ( menu_menu ! = lcd_status_screen ) & & ( ! lang_is_selected ( ) ) )
2018-06-10 14:04:32 +00:00
{
2019-01-27 21:48:51 +00:00
_delay ( 50 ) ;
2018-07-16 00:13:52 +00:00
lcd_update ( 0 ) ;
2018-06-10 14:04:32 +00:00
manage_heater ( ) ;
manage_inactivity ( true ) ;
}
if ( lang_is_selected ( ) )
lcd_return_to_status ( ) ;
else
lang_select ( LANG_ID_PRI ) ;
}
2019-07-29 12:55:42 +00:00
# endif
2018-06-10 14:04:32 +00:00
2018-10-08 13:58:49 +00:00
static void wait_preheat ( )
{
current_position [ Z_AXIS ] = 100 ; //move in z axis to make space for loading filament
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( homing_feedrate [ Z_AXIS ] / 60 ) ;
2018-10-08 13:58:49 +00:00
delay_keep_alive ( 2000 ) ;
lcd_display_message_fullscreen_P ( _T ( MSG_WIZARD_HEATING ) ) ;
2018-11-04 22:08:23 +00:00
lcd_set_custom_characters ( ) ;
while ( abs ( degHotend ( 0 ) - degTargetHotend ( 0 ) ) > 3 ) {
2018-10-08 13:58:49 +00:00
lcd_display_message_fullscreen_P ( _T ( MSG_WIZARD_HEATING ) ) ;
2017-11-07 15:49:04 +00:00
2018-10-08 13:58:49 +00:00
lcd_set_cursor ( 0 , 4 ) ;
2018-11-04 22:08:23 +00:00
//Print the hotend temperature (9 chars total)
lcdui_print_temp ( LCD_STR_THERMOMETER [ 0 ] , ( int ) ( degHotend ( 0 ) + 0.5 ) , ( int ) ( degTargetHotend ( 0 ) + 0.5 ) ) ;
2018-10-08 13:58:49 +00:00
delay_keep_alive ( 1000 ) ;
}
2018-11-04 22:08:23 +00:00
}
static void lcd_wizard_load ( )
{
if ( mmu_enabled )
{
2019-10-22 07:11:47 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please insert filament into the first tube of the MMU, then press the knob to load it. " ) ) ; ////c=20 r=8
2019-07-30 17:15:33 +00:00
tmp_extruder = 0 ;
2018-11-04 22:08:23 +00:00
}
else
{
2019-10-22 07:11:47 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please insert filament into the extruder, then press the knob to load it. " ) ) ; ////MSG_WIZARD_LOAD_FILAMENT c=20 r=8
2018-11-04 22:08:23 +00:00
}
lcd_update_enable ( false ) ;
lcd_clear ( ) ;
lcd_puts_at_P ( 0 , 2 , _T ( MSG_LOADING_FILAMENT ) ) ;
# ifdef SNMM
change_extr ( 0 ) ;
# endif
loading_flag = true ;
gcode_M701 ( ) ;
2018-10-08 13:58:49 +00:00
}
2018-11-05 16:43:07 +00:00
bool lcd_autoDepleteEnabled ( )
{
return ( lcd_autoDeplete & & fsensor_enabled ) ;
}
2019-09-16 19:14:17 +00:00
static void wizard_lay1cal_message ( bool cold )
{
lcd_show_fullscreen_message_and_wait_P (
_i ( " Now I will calibrate distance between tip of the nozzle and heatbed surface. " ) ) ; ////MSG_WIZARD_V2_CAL c=20 r=8
if ( mmu_enabled )
{
lcd_show_fullscreen_message_and_wait_P (
2019-10-22 07:11:47 +00:00
_i ( " Choose a filament for the First Layer Calibration and select it in the on-screen menu. " ) ) ;
2019-09-16 19:14:17 +00:00
}
else if ( cold )
{
lcd_show_fullscreen_message_and_wait_P (
_i ( " Select temperature which matches your material. " ) ) ;
}
lcd_show_fullscreen_message_and_wait_P (
2019-10-22 07:11:47 +00:00
_i ( " The printer will start printing a zig-zag line. Rotate the knob until you reach the optimal height. Check the pictures in the handbook (Calibration chapter). " ) ) ; ////MSG_WIZARD_V2_CAL_2 c=20 r=12
2019-09-16 19:14:17 +00:00
}
2018-10-08 13:58:49 +00:00
//! @brief Printer first run wizard (Selftest and calibration)
//!
//!
//! First layer calibration with MMU state diagram
//!
//! @startuml
//! [*] --> IsFil
2019-09-12 20:37:28 +00:00
//! IsFil : Is any filament loaded?
2019-09-17 16:58:59 +00:00
//! LoadFilCold : Push the button to start loading Filament 1
2018-10-08 13:58:49 +00:00
//!
2019-09-17 16:58:59 +00:00
//! IsFil --> Lay1CalCold : yes
//! IsFil --> LoadFilCold : no
//! LoadFilCold --> Lay1CalCold : click
//! @enduml
//!
//! First layer calibration without MMU state diagram
//!
//! @startuml
//! [*] --> IsFil
//! IsFil : Is filament loaded?
//! Preheat : Select nozle temperature which matches your material.
//! LoadFilHot : Insert filament to extruder and press the knob.
2018-10-08 13:58:49 +00:00
//!
2019-09-17 16:58:59 +00:00
//! IsFil --> Lay1CalCold : yes
//! IsFil --> Preheat : no
//! Preheat --> LoadFilHot : select
//! LoadFilHot --> Lay1CalHot : click
2018-10-08 13:58:49 +00:00
//! @enduml
//!
//! @param state Entry point of the wizard
//!
//! state | description
//! ---------------------- | ----------------
//! WizState::Run | Main entry point
//! WizState::RepeatLay1Cal | Entry point after passing 1st layer calibration
2019-09-17 16:58:59 +00:00
//! WizState::LoadFilHot | Entry point after temporarily left for preheat before load filament
2018-10-08 13:58:49 +00:00
void lcd_wizard ( WizState state )
{
using S = WizState ;
2017-11-07 15:49:04 +00:00
bool end = false ;
int wizard_event ;
const char * msg = NULL ;
2019-09-16 16:31:12 +00:00
// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
// other than WizState::Run - it is useful for debugging wizard.
if ( state ! = S : : Run ) eeprom_update_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE , 1 ) ;
2019-10-31 17:07:20 +00:00
FORCE_BL_ON_START ;
while ( ! end ) {
2019-08-07 15:23:19 +00:00
printf_P ( PSTR ( " Wizard state: %d \n " ) , state ) ;
2017-11-07 15:49:04 +00:00
switch ( state ) {
2018-10-08 13:58:49 +00:00
case S : : Run : //Run wizard?
2019-08-07 15:23:19 +00:00
// 2019-08-07 brutal hack - solving the "viper" situation.
// It is caused by the fact, that tmc2130_st_isr makes a crash detection before the printers really starts.
// And thus it calles stop_and_save_print_to_ram which sets the saved_printing flag.
// Having this flag set during normal printing is lethal - mesh_plan_buffer_line exist in the middle of planning long travels
// which results in distorted print.
// This primarily happens when the printer is new and parked in 0,0
// So any new printer will fail the first layer calibration unless being reset or the Stop function gets called.
// We really must find a way to prevent the crash from happening before the printer is started - that would be the correct solution.
// Btw. the flag may even trigger the viper situation on normal start this way and the user won't be able to find out why.
saved_printing = false ;
2018-05-22 01:20:03 +00:00
wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P ( _i ( " Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process? " ) , false , true ) ; ////MSG_WIZARD_WELCOME c=20 r=7
2017-11-07 15:49:04 +00:00
if ( wizard_event ) {
2018-10-08 13:58:49 +00:00
state = S : : Restore ;
2019-09-16 16:22:34 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE , 1 ) ;
2017-11-07 15:49:04 +00:00
}
else {
2019-09-16 16:22:34 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE , 0 ) ;
2017-11-07 15:49:04 +00:00
end = true ;
}
break ;
2019-09-17 16:58:59 +00:00
case S : : Restore :
2017-11-07 15:49:04 +00:00
switch ( calibration_status ( ) ) {
2018-10-08 13:58:49 +00:00
case CALIBRATION_STATUS_ASSEMBLED : state = S : : Selftest ; break ; //run selftest
case CALIBRATION_STATUS_XYZ_CALIBRATION : state = S : : Xyz ; break ; //run xyz cal.
case CALIBRATION_STATUS_Z_CALIBRATION : state = S : : Z ; break ; //run z cal.
case CALIBRATION_STATUS_LIVE_ADJUST : state = S : : IsFil ; break ; //run live adjust
2019-09-16 16:22:34 +00:00
case CALIBRATION_STATUS_CALIBRATED : end = true ; eeprom_update_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE , 0 ) ; break ;
2018-10-08 13:58:49 +00:00
default : state = S : : Selftest ; break ; //if calibration status is unknown, run wizard from the beginning
2017-11-07 15:49:04 +00:00
}
2018-02-06 16:01:09 +00:00
break ;
2018-10-08 13:58:49 +00:00
case S : : Selftest :
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " First, I will run the selftest to check most common assembly problems. " ) ) ; ////MSG_WIZARD_SELFTEST c=20 r=8
2017-11-07 15:49:04 +00:00
wizard_event = lcd_selftest ( ) ;
if ( wizard_event ) {
calibration_status_store ( CALIBRATION_STATUS_XYZ_CALIBRATION ) ;
2018-10-08 13:58:49 +00:00
state = S : : Xyz ;
2017-11-07 15:49:04 +00:00
}
else end = true ;
break ;
2019-09-17 16:58:59 +00:00
case S : : Xyz :
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " I will run xyz calibration now. It will take approx. 12 mins. " ) ) ; ////MSG_WIZARD_XYZ_CAL c=20 r=8
2018-02-22 09:38:46 +00:00
wizard_event = gcode_M45 ( false , 0 ) ;
2018-10-08 13:58:49 +00:00
if ( wizard_event ) state = S : : IsFil ;
2017-11-07 15:49:04 +00:00
else end = true ;
break ;
2019-09-17 16:58:59 +00:00
case S : : Z :
2018-11-04 22:08:23 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please remove shipping helpers first. " ) ) ;
lcd_show_fullscreen_message_and_wait_P ( _i ( " Now remove the test print from steel sheet. " ) ) ;
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " I will run z calibration now. " ) ) ; ////MSG_WIZARD_Z_CAL c=20 r=8
2018-05-23 14:37:08 +00:00
wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P ( _T ( MSG_STEEL_SHEET_CHECK ) , false , false ) ;
if ( ! wizard_event ) lcd_show_fullscreen_message_and_wait_P ( _T ( MSG_PLACE_STEEL_SHEET ) ) ;
2018-02-22 09:38:46 +00:00
wizard_event = gcode_M45 ( true , 0 ) ;
2018-11-04 22:08:23 +00:00
if ( wizard_event ) {
//current filament needs to be unloaded and then new filament should be loaded
//start to preheat nozzle for unloading remaining PLA filament
setTargetHotend ( PLA_PREHEAT_HOTEND_TEMP , 0 ) ;
lcd_display_message_fullscreen_P ( _i ( " Now I will preheat nozzle for PLA. " ) ) ;
wait_preheat ( ) ;
//unload current filament
2019-09-12 20:37:28 +00:00
unload_filament ( ) ;
2018-11-04 22:08:23 +00:00
//load filament
lcd_wizard_load ( ) ;
setTargetHotend ( 0 , 0 ) ; //we are finished, cooldown nozzle
state = S : : Finish ; //shipped, no need to set first layer, go to final message directly
}
2017-11-07 15:49:04 +00:00
else end = true ;
break ;
2019-09-17 16:58:59 +00:00
case S : : IsFil :
//start to preheat nozzle and bed to save some time later
2017-11-07 15:49:04 +00:00
setTargetHotend ( PLA_PREHEAT_HOTEND_TEMP , 0 ) ;
setTargetBed ( PLA_PREHEAT_HPB_TEMP ) ;
2018-10-08 13:58:49 +00:00
if ( mmu_enabled )
{
2019-10-22 07:11:47 +00:00
wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " Is filament loaded? " ) , true ) ; ////c=20 r=2
2018-10-08 13:58:49 +00:00
} else
{
2019-09-12 21:20:03 +00:00
wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " Is filament loaded? " ) , true ) ; ////MSG_WIZARD_FILAMENT_LOADED c=20 r=2
2018-10-08 13:58:49 +00:00
}
2019-09-16 19:14:17 +00:00
if ( wizard_event ) state = S : : Lay1CalCold ;
2018-10-08 13:58:49 +00:00
else
{
2019-09-16 19:14:17 +00:00
if ( mmu_enabled ) state = S : : LoadFilCold ;
2019-09-12 20:37:28 +00:00
else state = S : : Preheat ;
2018-10-08 13:58:49 +00:00
}
2017-11-07 15:49:04 +00:00
break ;
2018-10-08 13:58:49 +00:00
case S : : Preheat :
menu_goto ( lcd_preheat_menu , 0 , false , true ) ;
lcd_show_fullscreen_message_and_wait_P ( _i ( " Select nozzle preheat temperature which matches your material. " ) ) ;
end = true ; // Leave wizard temporarily for lcd_preheat_menu
break ;
2019-09-17 16:58:59 +00:00
case S : : LoadFilHot :
2018-10-08 13:58:49 +00:00
wait_preheat ( ) ;
2018-11-04 22:08:23 +00:00
lcd_wizard_load ( ) ;
2019-09-16 19:14:17 +00:00
state = S : : Lay1CalHot ;
2017-11-07 15:49:04 +00:00
break ;
2019-09-17 16:58:59 +00:00
case S : : LoadFilCold :
2019-09-16 19:14:17 +00:00
lcd_wizard_load ( ) ;
state = S : : Lay1CalCold ;
break ;
case S : : Lay1CalCold :
wizard_lay1cal_message ( true ) ;
2019-09-12 20:37:28 +00:00
menu_goto ( lcd_v2_calibration , 0 , false , true ) ;
end = true ; // Leave wizard temporarily for lcd_v2_calibration
2017-11-07 15:49:04 +00:00
break ;
2019-09-16 19:14:17 +00:00
case S : : Lay1CalHot :
wizard_lay1cal_message ( false ) ;
lcd_commands_type = LcdCommands : : Layer1Cal ;
end = true ; // Leave wizard temporarily for lcd_v2_calibration
break ;
2019-09-17 16:58:59 +00:00
case S : : RepeatLay1Cal :
2018-05-22 01:20:03 +00:00
wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P ( _i ( " Do you want to repeat last step to readjust distance between nozzle and heatbed? " ) , false ) ; ////MSG_WIZARD_REPEAT_V2_CAL c=20 r=7
2019-09-13 15:09:11 +00:00
if ( wizard_event )
{
2018-05-22 01:20:03 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please clean heatbed and then press the knob. " ) ) ; ////MSG_WIZARD_CLEAN_HEATBED c=20 r=8
2019-09-16 19:14:17 +00:00
state = S : : Lay1CalCold ;
2017-11-07 15:49:04 +00:00
}
2019-09-13 15:09:11 +00:00
else
{
2019-10-22 07:11:47 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets. " ) ) ;
2018-10-08 13:58:49 +00:00
state = S : : Finish ;
2017-11-07 15:49:04 +00:00
}
break ;
2019-09-17 16:58:59 +00:00
case S : : Finish :
2019-09-16 16:22:34 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_WIZARD_ACTIVE , 0 ) ;
2017-11-07 15:49:04 +00:00
end = true ;
break ;
default : break ;
}
}
2019-10-31 17:07:20 +00:00
FORCE_BL_ON_END ;
2018-09-10 18:08:13 +00:00
printf_P ( _N ( " Wizard end state: %d \n " ) , state ) ;
2017-11-07 15:49:04 +00:00
switch ( state ) { //final message
2018-10-08 13:58:49 +00:00
case S : : Restore : //printer was already calibrated
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_WIZARD_DONE ) ;
2017-11-07 15:49:04 +00:00
break ;
2018-10-08 13:58:49 +00:00
case S : : Selftest : //selftest
case S : : Xyz : //xyz cal.
case S : : Z : //z cal.
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_WIZARD_CALIBRATION_FAILED ) ;
2017-11-07 15:49:04 +00:00
break ;
2018-10-08 13:58:49 +00:00
case S : : Finish : //we are finished
2017-11-07 15:49:04 +00:00
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_WIZARD_DONE ) ;
2017-11-07 15:49:04 +00:00
lcd_reset_alert_level ( ) ;
2018-05-23 14:37:08 +00:00
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
2018-11-04 22:44:29 +00:00
lcd_return_to_status ( ) ;
2017-11-07 15:49:04 +00:00
break ;
default :
2018-05-23 14:37:08 +00:00
msg = _T ( MSG_WIZARD_QUIT ) ;
2017-11-07 15:49:04 +00:00
break ;
}
2019-09-16 19:14:17 +00:00
if ( ! ( ( S : : Lay1CalCold = = state ) | | ( S : : Lay1CalHot = = state ) | | ( S : : Preheat = = state ) ) )
{
2018-09-10 18:08:13 +00:00
lcd_show_fullscreen_message_and_wait_P ( msg ) ;
}
2017-11-07 15:49:04 +00:00
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
}
2018-08-24 13:40:21 +00:00
2018-08-27 19:08:40 +00:00
# ifdef TMC2130
2018-07-16 02:13:26 +00:00
void lcd_settings_linearity_correction_menu ( void )
{
MENU_BEGIN ( ) ;
2019-05-06 13:33:13 +00:00
ON_MENU_LEAVE (
lcd_settings_linearity_correction_menu_save ( ) ;
2019-05-06 15:39:00 +00:00
) ;
2018-08-24 18:31:49 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ;
2018-07-16 02:13:26 +00:00
# ifdef TMC2130_LINEARITY_CORRECTION_XYZ
//tmc2130_wave_fac[X_AXIS]
2017-11-07 15:49:04 +00:00
2020-05-12 20:23:40 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " X-correct: " ) , & tmc2130_wave_fac [ X_AXIS ] , TMC2130_WAVE_FAC1000_MIN - TMC2130_WAVE_FAC1000_STP , TMC2130_WAVE_FAC1000_MAX ) ; ////MSG_X_CORRECTION c=13
MENU_ITEM_EDIT_int3_P ( _i ( " Y-correct: " ) , & tmc2130_wave_fac [ Y_AXIS ] , TMC2130_WAVE_FAC1000_MIN - TMC2130_WAVE_FAC1000_STP , TMC2130_WAVE_FAC1000_MAX ) ; ////MSG_Y_CORRECTION c=13
MENU_ITEM_EDIT_int3_P ( _i ( " Z-correct: " ) , & tmc2130_wave_fac [ Z_AXIS ] , TMC2130_WAVE_FAC1000_MIN - TMC2130_WAVE_FAC1000_STP , TMC2130_WAVE_FAC1000_MAX ) ; ////MSG_Z_CORRECTION c=13
2018-07-16 02:13:26 +00:00
# endif //TMC2130_LINEARITY_CORRECTION_XYZ
2020-05-12 20:23:40 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " E-correct: " ) , & tmc2130_wave_fac [ E_AXIS ] , TMC2130_WAVE_FAC1000_MIN - TMC2130_WAVE_FAC1000_STP , TMC2130_WAVE_FAC1000_MAX ) ; ////MSG_EXTRUDER_CORRECTION c=13
2018-07-16 02:13:26 +00:00
MENU_END ( ) ;
}
2018-08-27 19:08:40 +00:00
# endif // TMC2130
2018-08-24 13:40:21 +00:00
2018-08-10 13:19:35 +00:00
# ifdef FILAMENT_SENSOR
# define SETTINGS_FILAMENT_SENSOR \
do \
{ \
if ( FSensorStateMenu = = 0 ) \
{ \
2018-10-25 16:26:26 +00:00
if ( fsensor_not_responding & & ( mmu_enabled = = false ) ) \
2018-08-10 13:19:35 +00:00
{ \
/* Filament sensor not working*/ \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_NA ) , lcd_fsensor_state_set ) ; /*////MSG_FSENSOR_NA*/ \
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR_AUTOLOAD ) , NULL , lcd_fsensor_fail ) ; \
2018-08-10 13:19:35 +00:00
} \
else \
{ \
/* Filament sensor turned off, working, no problems*/ \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_OFF ) , lcd_fsensor_state_set ) ; \
2018-10-25 16:26:26 +00:00
if ( mmu_enabled = = false ) \
2018-08-10 13:19:35 +00:00
{ \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR_AUTOLOAD ) , NULL , lcd_filament_autoload_info ) ; \
2018-08-10 13:19:35 +00:00
} \
} \
} \
else \
{ \
/* Filament sensor turned on, working, no problems*/ \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_ON ) , lcd_fsensor_state_set ) ; \
2018-08-10 13:19:35 +00:00
if ( mmu_enabled = = false ) \
{ \
if ( fsensor_autoload_enabled ) \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR_AUTOLOAD ) , _T ( MSG_ON ) , lcd_set_filament_autoload ) ; /*////MSG_FSENS_AUTOLOAD_ON c=17 r=1*/ \
2018-08-10 13:19:35 +00:00
else \
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR_AUTOLOAD ) , _T ( MSG_OFF ) , lcd_set_filament_autoload ) ; /*////MSG_FSENS_AUTOLOAD_OFF c=17 r=1*/ \
2018-11-05 17:37:36 +00:00
/*if (fsensor_oq_meassure_enabled)*/ \
/*MENU_ITEM_FUNCTION_P(_i("F. OQ meass. [on]"), lcd_set_filament_oq_meass);*/ /*////MSG_FSENS_OQMEASS_ON c=17 r=1*/ \
/*else*/ \
/*MENU_ITEM_FUNCTION_P(_i("F. OQ meass.[off]"), lcd_set_filament_oq_meass);*/ /*////MSG_FSENS_OQMEASS_OFF c=17 r=1*/ \
2018-08-10 13:19:35 +00:00
} \
} \
} \
while ( 0 )
# else //FILAMENT_SENSOR
# define SETTINGS_FILAMENT_SENSOR do{}while(0)
# endif //FILAMENT_SENSOR
2018-11-05 17:02:46 +00:00
static void auto_deplete_switch ( )
{
lcd_autoDeplete = ! lcd_autoDeplete ;
eeprom_update_byte ( ( unsigned char * ) EEPROM_AUTO_DEPLETE , lcd_autoDeplete ) ;
}
2019-08-29 12:40:04 +00:00
static void settingsAutoDeplete ( )
2018-11-05 17:02:46 +00:00
{
if ( mmu_enabled )
{
if ( ! fsensor_enabled )
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_AUTO_DEPLETE ) , _T ( MSG_NA ) , NULL ) ;
2018-11-05 17:02:46 +00:00
}
else if ( lcd_autoDeplete )
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_AUTO_DEPLETE ) , _T ( MSG_ON ) , auto_deplete_switch ) ;
2018-11-05 17:02:46 +00:00
}
else
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_AUTO_DEPLETE ) , _T ( MSG_OFF ) , auto_deplete_switch ) ;
2018-11-05 17:02:46 +00:00
}
}
}
2018-11-05 16:43:07 +00:00
# define SETTINGS_AUTO_DEPLETE \
do \
{ \
2019-08-29 12:40:04 +00:00
settingsAutoDeplete ( ) ; \
2018-11-05 16:43:07 +00:00
} \
while ( 0 ) \
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-08-29 12:49:26 +00:00
static void settingsCutter ( )
2019-02-27 16:47:51 +00:00
{
if ( mmu_enabled )
{
2019-05-30 18:46:41 +00:00
if ( EEPROM_MMU_CUTTER_ENABLED_enabled = = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED ) )
2019-02-27 16:47:51 +00:00
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_CUTTER ) , _T ( MSG_ON ) , lcd_cutter_enabled ) ;
2019-02-27 16:47:51 +00:00
}
2019-05-30 18:46:41 +00:00
# ifdef MMU_ALWAYS_CUT
else if ( EEPROM_MMU_CUTTER_ENABLED_always = = eeprom_read_byte ( ( uint8_t * ) EEPROM_MMU_CUTTER_ENABLED ) )
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_CUTTER ) , _i ( " Always " ) , lcd_cutter_enabled ) ;
2019-05-30 18:46:41 +00:00
}
# endif
2019-02-27 16:47:51 +00:00
else
{
2019-08-29 14:35:26 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_CUTTER ) , _T ( MSG_OFF ) , lcd_cutter_enabled ) ;
2019-02-27 16:47:51 +00:00
}
}
}
# define SETTINGS_CUTTER \
do \
{ \
2019-08-29 12:43:41 +00:00
settingsCutter ( ) ; \
2019-02-27 16:47:51 +00:00
} \
2019-03-15 02:38:37 +00:00
while ( 0 )
# else
# define SETTINGS_CUTTER
# endif //MMU_HAS_CUTTER
2019-02-27 16:47:51 +00:00
2018-08-10 13:19:35 +00:00
# ifdef TMC2130
# define SETTINGS_SILENT_MODE \
do \
{ \
if ( ! farm_mode ) \
{ \
if ( SilentModeMenu = = SILENT_MODE_NORMAL ) \
{ \
2019-08-30 04:59:58 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_NORMAL ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
} \
2019-08-30 04:59:58 +00:00
else MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_STEALTH ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
if ( SilentModeMenu = = SILENT_MODE_NORMAL ) \
{ \
2019-08-29 19:31:30 +00:00
if ( lcd_crash_detect_enabled ( ) ) MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , _T ( MSG_ON ) , crash_mode_switch ) ; \
else MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , _T ( MSG_OFF ) , crash_mode_switch ) ; \
2018-08-10 13:19:35 +00:00
} \
2019-08-29 19:31:30 +00:00
else MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , NULL , lcd_crash_mode_info ) ; \
2018-08-10 13:19:35 +00:00
} \
} \
while ( 0 )
# else //TMC2130
# define SETTINGS_SILENT_MODE \
do \
{ \
if ( ! farm_mode ) \
{ \
switch ( SilentModeMenu ) \
{ \
case SILENT_MODE_POWER : \
2019-08-30 04:59:58 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_HIGH_POWER ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
break ; \
case SILENT_MODE_SILENT : \
2019-08-30 04:59:58 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_SILENT ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
break ; \
case SILENT_MODE_AUTO : \
2019-08-30 04:59:58 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_AUTO_POWER ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
break ; \
default : \
2019-08-30 04:59:58 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_HIGH_POWER ) , lcd_silent_mode_set ) ; \
2018-08-10 13:19:35 +00:00
break ; /* (probably) not needed*/ \
} \
} \
} \
while ( 0 )
# endif //TMC2130
2019-03-10 15:03:46 +00:00
# ifndef MMU_FORCE_STEALTH_MODE
2019-03-11 11:33:22 +00:00
# define SETTINGS_MMU_MODE \
do \
{ \
if ( mmu_enabled ) \
2019-03-10 15:03:46 +00:00
{ \
2019-08-31 04:38:40 +00:00
if ( SilentModeMenu_MMU = = 0 ) MENU_ITEM_TOGGLE_P ( _T ( MSG_MMU_MODE ) , _T ( MSG_NORMAL ) , lcd_silent_mode_mmu_set ) ; \
else MENU_ITEM_TOGGLE_P ( _T ( MSG_MMU_MODE ) , _T ( MSG_STEALTH ) , lcd_silent_mode_mmu_set ) ; \
2019-03-10 15:03:46 +00:00
} \
2018-08-10 13:19:35 +00:00
} \
2019-03-11 11:33:22 +00:00
while ( 0 )
# else //MMU_FORCE_STEALTH_MODE
# define SETTINGS_MMU_MODE
# endif //MMU_FORCE_STEALTH_MODE
2018-08-10 13:19:35 +00:00
# ifdef SDCARD_SORT_ALPHA
# define SETTINGS_SD \
do \
{ \
if ( card . ToshibaFlashAir_isEnabled ( ) ) \
2019-08-31 11:55:51 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_SD_CARD ) , _T ( MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY ) , lcd_toshiba_flash_air_compatibility_toggle ) ; \
2018-08-10 13:19:35 +00:00
else \
2019-08-31 11:55:51 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_SD_CARD ) , _T ( MSG_NORMAL ) , lcd_toshiba_flash_air_compatibility_toggle ) ; \
2018-08-10 13:19:35 +00:00
\
if ( ! farm_mode ) \
{ \
uint8_t sdSort ; \
EEPROM_read ( EEPROM_SD_SORT , ( uint8_t * ) & sdSort , sizeof ( sdSort ) ) ; \
switch ( sdSort ) \
{ \
2019-08-31 11:55:51 +00:00
case SD_SORT_TIME : MENU_ITEM_TOGGLE_P ( _T ( MSG_SORT ) , _T ( MSG_SORT_TIME ) , lcd_sort_type_set ) ; break ; \
case SD_SORT_ALPHA : MENU_ITEM_TOGGLE_P ( _T ( MSG_SORT ) , _T ( MSG_SORT_ALPHA ) , lcd_sort_type_set ) ; break ; \
default : MENU_ITEM_TOGGLE_P ( _T ( MSG_SORT ) , _T ( MSG_NONE ) , lcd_sort_type_set ) ; \
2018-08-10 13:19:35 +00:00
} \
} \
} \
while ( 0 )
# else // SDCARD_SORT_ALPHA
# define SETTINGS_SD \
do \
{ \
if ( card . ToshibaFlashAir_isEnabled ( ) ) \
2019-08-31 11:55:51 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_SD_CARD ) , _T ( MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY ) , lcd_toshiba_flash_air_compatibility_toggle ) ; \
2018-08-10 13:19:35 +00:00
else \
2019-08-31 11:55:51 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_SD_CARD ) , _T ( MSG_NORMAL ) , lcd_toshiba_flash_air_compatibility_toggle ) ; \
2018-08-10 13:19:35 +00:00
} \
while ( 0 )
# endif // SDCARD_SORT_ALPHA
2019-03-08 14:43:37 +00:00
/*
2019-02-28 18:42:09 +00:00
# define SETTINGS_MBL_MODE \
do \
{ \
switch ( e_mbl_type ) \
{ \
case e_MBL_FAST : \
2019-03-06 12:27:31 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Mode [Fast] " ) , mbl_mode_set ) ; \
2019-02-28 18:42:09 +00:00
break ; \
case e_MBL_OPTIMAL : \
2019-03-06 12:27:31 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Mode [Optimal] " ) , mbl_mode_set ) ; \
2019-02-28 18:42:09 +00:00
break ; \
case e_MBL_PREC : \
2019-03-06 12:27:31 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Mode [Precise] " ) , mbl_mode_set ) ; \
2019-02-28 18:42:09 +00:00
break ; \
default : \
2019-03-06 12:27:31 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Mode [Optimal] " ) , mbl_mode_set ) ; \
2019-02-28 18:42:09 +00:00
break ; \
} \
} \
while ( 0 )
2019-03-08 14:43:37 +00:00
*/
2019-02-28 18:42:09 +00:00
2018-08-10 13:19:35 +00:00
# define SETTINGS_SOUND \
do \
{ \
switch ( eSoundMode ) \
2019-08-31 13:56:14 +00:00
{ \
case e_SOUND_MODE_LOUD : \
MENU_ITEM_TOGGLE_P ( _T ( MSG_SOUND ) , _T ( MSG_SOUND_LOUD ) , lcd_sound_state_set ) ; \
break ; \
case e_SOUND_MODE_ONCE : \
MENU_ITEM_TOGGLE_P ( _T ( MSG_SOUND ) , _T ( MSG_SOUND_ONCE ) , lcd_sound_state_set ) ; \
break ; \
case e_SOUND_MODE_SILENT : \
MENU_ITEM_TOGGLE_P ( _T ( MSG_SOUND ) , _T ( MSG_SILENT ) , lcd_sound_state_set ) ; \
break ; \
case e_SOUND_MODE_BLIND : \
MENU_ITEM_TOGGLE_P ( _T ( MSG_SOUND ) , _T ( MSG_SOUND_BLIND ) , lcd_sound_state_set ) ; \
break ; \
default : \
MENU_ITEM_TOGGLE_P ( _T ( MSG_SOUND ) , _T ( MSG_SOUND_LOUD ) , lcd_sound_state_set ) ; \
} \
2018-08-10 13:19:35 +00:00
} \
while ( 0 )
2019-03-13 23:36:56 +00:00
//-//
static void lcd_check_mode_set ( void )
{
2019-07-03 15:21:11 +00:00
switch ( oCheckMode )
2019-03-13 23:36:56 +00:00
{
2019-07-03 15:21:11 +00:00
case ClCheckMode : : _None :
oCheckMode = ClCheckMode : : _Warn ;
2019-03-13 23:36:56 +00:00
break ;
2019-07-03 15:21:11 +00:00
case ClCheckMode : : _Warn :
oCheckMode = ClCheckMode : : _Strict ;
2019-03-13 23:36:56 +00:00
break ;
2019-07-03 15:21:11 +00:00
case ClCheckMode : : _Strict :
oCheckMode = ClCheckMode : : _None ;
2019-03-13 23:36:56 +00:00
break ;
default :
2019-07-03 15:21:11 +00:00
oCheckMode = ClCheckMode : : _None ;
2019-03-13 23:36:56 +00:00
}
2019-07-03 15:21:11 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_CHECK_MODE , ( uint8_t ) oCheckMode ) ;
2019-03-13 23:36:56 +00:00
}
2019-07-03 15:21:11 +00:00
# define SETTINGS_MODE \
do \
{ \
switch ( oCheckMode ) \
{ \
case ClCheckMode : : _None : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_NOZZLE ) , _T ( MSG_NONE ) , lcd_check_mode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckMode : : _Warn : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_NOZZLE ) , _T ( MSG_WARN ) , lcd_check_mode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckMode : : _Strict : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_NOZZLE ) , _T ( MSG_STRICT ) , lcd_check_mode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
default : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_NOZZLE ) , _T ( MSG_NONE ) , lcd_check_mode_set ) ; \
2019-07-03 15:21:11 +00:00
} \
} \
while ( 0 )
2019-03-13 23:36:56 +00:00
static void lcd_nozzle_diameter_set ( void )
{
uint16_t nDiameter ;
2019-07-03 15:21:11 +00:00
switch ( oNozzleDiameter )
2019-03-13 23:36:56 +00:00
{
2019-07-03 15:21:11 +00:00
case ClNozzleDiameter : : _Diameter_250 :
oNozzleDiameter = ClNozzleDiameter : : _Diameter_400 ;
2019-03-13 23:36:56 +00:00
nDiameter = 400 ;
break ;
2019-07-03 15:21:11 +00:00
case ClNozzleDiameter : : _Diameter_400 :
oNozzleDiameter = ClNozzleDiameter : : _Diameter_600 ;
2019-03-13 23:36:56 +00:00
nDiameter = 600 ;
break ;
2019-07-03 15:21:11 +00:00
case ClNozzleDiameter : : _Diameter_600 :
oNozzleDiameter = ClNozzleDiameter : : _Diameter_250 ;
2019-03-13 23:36:56 +00:00
nDiameter = 250 ;
break ;
default :
2019-07-03 15:21:11 +00:00
oNozzleDiameter = ClNozzleDiameter : : _Diameter_400 ;
2019-03-13 23:36:56 +00:00
nDiameter = 400 ;
}
2019-07-03 15:21:11 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_NOZZLE_DIAMETER , ( uint8_t ) oNozzleDiameter ) ;
2019-03-13 23:36:56 +00:00
eeprom_update_word ( ( uint16_t * ) EEPROM_NOZZLE_DIAMETER_uM , nDiameter ) ;
}
2019-07-03 15:21:11 +00:00
# define SETTINGS_NOZZLE \
2019-03-13 23:36:56 +00:00
do \
{ \
2019-08-30 14:36:21 +00:00
float fNozzleDiam ; \
2019-07-03 15:21:11 +00:00
switch ( oNozzleDiameter ) \
2019-08-30 14:36:21 +00:00
{ \
case ClNozzleDiameter : : _Diameter_250 : fNozzleDiam = 0.25f ; break ; \
case ClNozzleDiameter : : _Diameter_400 : fNozzleDiam = 0.4f ; break ; \
case ClNozzleDiameter : : _Diameter_600 : fNozzleDiam = 0.6f ; break ; \
default : fNozzleDiam = 0.4f ; break ; \
} \
2019-11-09 18:58:56 +00:00
MENU_ITEM_TOGGLE ( _T ( MSG_NOZZLE_DIAMETER ) , ftostr12ns ( fNozzleDiam ) , lcd_nozzle_diameter_set ) ; \
2019-03-13 23:36:56 +00:00
} \
while ( 0 )
2019-07-03 15:21:11 +00:00
static void lcd_check_model_set ( void )
{
switch ( oCheckModel )
{
case ClCheckModel : : _None :
oCheckModel = ClCheckModel : : _Warn ;
break ;
case ClCheckModel : : _Warn :
oCheckModel = ClCheckModel : : _Strict ;
break ;
case ClCheckModel : : _Strict :
oCheckModel = ClCheckModel : : _None ;
break ;
default :
oCheckModel = ClCheckModel : : _None ;
}
eeprom_update_byte ( ( uint8_t * ) EEPROM_CHECK_MODEL , ( uint8_t ) oCheckModel ) ;
}
# define SETTINGS_MODEL \
2019-03-13 23:36:56 +00:00
do \
{ \
2019-07-03 15:21:11 +00:00
switch ( oCheckModel ) \
2019-03-13 23:36:56 +00:00
{ \
2019-07-03 15:21:11 +00:00
case ClCheckModel : : _None : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODEL ) , _T ( MSG_NONE ) , lcd_check_model_set ) ; \
2019-03-13 23:36:56 +00:00
break ; \
2019-07-03 15:21:11 +00:00
case ClCheckModel : : _Warn : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODEL ) , _T ( MSG_WARN ) , lcd_check_model_set ) ; \
2019-03-13 23:36:56 +00:00
break ; \
2019-07-03 15:21:11 +00:00
case ClCheckModel : : _Strict : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODEL ) , _T ( MSG_STRICT ) , lcd_check_model_set ) ; \
2019-03-13 23:36:56 +00:00
break ; \
default : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODEL ) , _T ( MSG_NONE ) , lcd_check_model_set ) ; \
2019-03-13 23:36:56 +00:00
} \
} \
while ( 0 )
2019-07-03 15:21:11 +00:00
static void lcd_check_version_set ( void )
{
switch ( oCheckVersion )
{
case ClCheckVersion : : _None :
oCheckVersion = ClCheckVersion : : _Warn ;
break ;
case ClCheckVersion : : _Warn :
oCheckVersion = ClCheckVersion : : _Strict ;
break ;
case ClCheckVersion : : _Strict :
oCheckVersion = ClCheckVersion : : _None ;
break ;
default :
oCheckVersion = ClCheckVersion : : _None ;
}
eeprom_update_byte ( ( uint8_t * ) EEPROM_CHECK_VERSION , ( uint8_t ) oCheckVersion ) ;
}
# define SETTINGS_VERSION \
do \
{ \
switch ( oCheckVersion ) \
{ \
case ClCheckVersion : : _None : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FIRMWARE ) , _T ( MSG_NONE ) , lcd_check_version_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckVersion : : _Warn : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FIRMWARE ) , _T ( MSG_WARN ) , lcd_check_version_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckVersion : : _Strict : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FIRMWARE ) , _T ( MSG_STRICT ) , lcd_check_version_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
default : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FIRMWARE ) , _T ( MSG_NONE ) , lcd_check_version_set ) ; \
2019-07-03 15:21:11 +00:00
} \
} \
while ( 0 )
2020-06-08 11:45:29 +00:00
#if 0 // temporarily unused
2019-07-03 15:21:11 +00:00
static void lcd_check_gcode_set ( void )
{
switch ( oCheckGcode )
{
case ClCheckGcode : : _None :
oCheckGcode = ClCheckGcode : : _Warn ;
break ;
case ClCheckGcode : : _Warn :
oCheckGcode = ClCheckGcode : : _Strict ;
break ;
case ClCheckGcode : : _Strict :
oCheckGcode = ClCheckGcode : : _None ;
break ;
default :
oCheckGcode = ClCheckGcode : : _None ;
}
eeprom_update_byte ( ( uint8_t * ) EEPROM_CHECK_GCODE , ( uint8_t ) oCheckGcode ) ;
}
2020-06-08 11:45:29 +00:00
# endif
2019-07-03 15:21:11 +00:00
# define SETTINGS_GCODE \
do \
{ \
switch ( oCheckGcode ) \
{ \
case ClCheckGcode : : _None : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_GCODE ) , _T ( MSG_NONE ) , lcd_check_gcode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckGcode : : _Warn : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_GCODE ) , _T ( MSG_WARN ) , lcd_check_gcode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
case ClCheckGcode : : _Strict : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_GCODE ) , _T ( MSG_STRICT ) , lcd_check_gcode_set ) ; \
2019-07-03 15:21:11 +00:00
break ; \
default : \
2019-08-30 14:36:21 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_GCODE ) , _T ( MSG_NONE ) , lcd_check_gcode_set ) ; \
2019-07-03 15:21:11 +00:00
} \
} \
while ( 0 )
2019-07-16 18:10:49 +00:00
static void lcd_checking_menu ( void )
2019-03-13 23:36:56 +00:00
{
MENU_BEGIN ( ) ;
2019-07-16 18:10:49 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_HW_SETUP ) ) ;
2019-07-03 15:21:11 +00:00
SETTINGS_MODE ;
SETTINGS_MODEL ;
SETTINGS_VERSION ;
2019-07-16 18:10:49 +00:00
//-// temporarily disabled
//SETTINGS_GCODE;
MENU_END ( ) ;
}
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2019-09-15 22:43:37 +00:00
static void lcd_fsensor_actionNA_set ( void )
{
switch ( oFsensorActionNA )
{
case ClFsensorActionNA : : _Continue :
oFsensorActionNA = ClFsensorActionNA : : _Pause ;
break ;
case ClFsensorActionNA : : _Pause :
oFsensorActionNA = ClFsensorActionNA : : _Continue ;
break ;
default :
oFsensorActionNA = ClFsensorActionNA : : _Continue ;
}
eeprom_update_byte ( ( uint8_t * ) EEPROM_FSENSOR_ACTION_NA , ( uint8_t ) oFsensorActionNA ) ;
}
# define FSENSOR_ACTION_NA \
do \
{ \
switch ( oFsensorActionNA ) \
{ \
case ClFsensorActionNA : : _Continue : \
2019-11-19 11:51:10 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FS_ACTION ) , _T ( MSG_FS_CONTINUE ) , lcd_fsensor_actionNA_set ) ; \
2019-09-15 22:43:37 +00:00
break ; \
case ClFsensorActionNA : : _Pause : \
2019-11-19 11:51:10 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FS_ACTION ) , _T ( MSG_FS_PAUSE ) , lcd_fsensor_actionNA_set ) ; \
2019-09-15 22:43:37 +00:00
break ; \
default : \
oFsensorActionNA = ClFsensorActionNA : : _Continue ; \
} \
} \
while ( 0 )
# endif //IR_SENSOR_ANALOG
2019-08-29 15:21:08 +00:00
template < uint8_t number >
static void select_sheet_menu ( )
2019-07-16 18:10:49 +00:00
{
2019-08-29 15:21:08 +00:00
selected_sheet = number ;
lcd_sheet_menu ( ) ;
}
2019-07-19 16:34:46 +00:00
2019-08-29 15:21:08 +00:00
static void sheets_menu ( )
{
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _i ( " HW Setup " ) ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 0 ] , select_sheet_menu < 0 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 1 ] , select_sheet_menu < 1 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 2 ] , select_sheet_menu < 2 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 3 ] , select_sheet_menu < 3 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 4 ] , select_sheet_menu < 4 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 5 ] , select_sheet_menu < 5 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 6 ] , select_sheet_menu < 6 > ) ;
MENU_ITEM_SUBMENU_E ( EEPROM_Sheets_base - > s [ 7 ] , select_sheet_menu < 7 > ) ;
MENU_END ( ) ;
}
2019-07-19 16:34:46 +00:00
2019-08-29 15:21:08 +00:00
void lcd_hw_setup_menu ( void ) // can not be "static"
{
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( bSettings ? MSG_SETTINGS : MSG_BACK ) ) ; // i.e. default menu-item / menu-item after checking mismatch
2019-07-19 16:34:46 +00:00
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Steel sheets " ) , sheets_menu ) ; ////MSG_STEEL_SHEETS c=18
2019-08-29 15:21:08 +00:00
SETTINGS_NOZZLE ;
MENU_ITEM_SUBMENU_P ( _i ( " Checks " ) , lcd_checking_menu ) ;
2019-09-15 22:43:37 +00:00
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2019-09-16 13:29:28 +00:00
FSENSOR_ACTION_NA ;
2020-06-03 14:14:56 +00:00
//! Fsensor Detection isn't ready for mmu yet it is temporarily disabled.
//! @todo Don't forget to remove this as soon Fsensor Detection works with mmu
if ( ! mmu_enabled ) MENU_ITEM_FUNCTION_P ( PSTR ( " Fsensor Detection " ) , lcd_detect_IRsensor ) ;
2019-09-15 22:43:37 +00:00
# endif //IR_SENSOR_ANALOG
2019-08-29 15:21:08 +00:00
MENU_END ( ) ;
2019-03-13 23:36:56 +00:00
}
2016-07-22 13:28:01 +00:00
static void lcd_settings_menu ( )
{
2018-07-20 21:48:00 +00:00
EEPROM_read ( EEPROM_SILENT , ( uint8_t * ) & SilentModeMenu , sizeof ( SilentModeMenu ) ) ;
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2016-07-22 13:28:01 +00:00
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Temperature " ) , lcd_control_temperature_menu ) ; ////MSG_TEMPERATURE
2018-07-20 21:48:00 +00:00
if ( ! homing_flag )
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Move axis " ) , lcd_move_menu_1mm ) ; ////MSG_MOVE_AXIS
2018-07-20 21:48:00 +00:00
if ( ! isPrintPaused )
2019-05-07 10:23:09 +00:00
MENU_ITEM_GCODE_P ( _i ( " Disable steppers " ) , PSTR ( " M84 " ) ) ; ////MSG_DISABLE_STEPPERS
2018-02-21 14:19:34 +00:00
2018-08-10 13:19:35 +00:00
SETTINGS_FILAMENT_SENSOR ;
2017-12-28 17:59:57 +00:00
2018-11-05 16:43:07 +00:00
SETTINGS_AUTO_DEPLETE ;
2018-08-10 14:10:49 +00:00
2019-02-27 16:47:51 +00:00
SETTINGS_CUTTER ;
2019-02-27 09:42:26 +00:00
2019-08-10 18:03:45 +00:00
MENU_ITEM_TOGGLE_P ( _i ( " Fans check " ) , fans_check_enabled ? _T ( MSG_ON ) : _T ( MSG_OFF ) , lcd_set_fan_check ) ;
2017-09-22 17:28:32 +00:00
2018-08-10 13:19:35 +00:00
SETTINGS_SILENT_MODE ;
2019-07-16 18:10:49 +00:00
2019-08-05 08:40:21 +00:00
if ( ! farm_mode )
{
bSettings = true ; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
MENU_ITEM_SUBMENU_P ( _i ( " HW Setup " ) , lcd_hw_setup_menu ) ; ////MSG_HW_SETUP
}
2019-03-11 11:33:22 +00:00
SETTINGS_MMU_MODE ;
2018-06-13 18:55:15 +00:00
2019-03-08 14:43:37 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Mesh bed leveling " ) , lcd_mesh_bed_leveling_settings ) ; ////MSG_MBL_SETTINGS c=18 r=1
2018-06-13 18:55:15 +00:00
2018-08-10 13:19:35 +00:00
# if defined (TMC2130) && defined (LINEARITY_CORRECTION)
2018-08-24 13:40:21 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Lin. correction " ) , lcd_settings_linearity_correction_menu ) ;
2018-08-10 13:19:35 +00:00
# endif //LINEARITY_CORRECTION && TMC2130
2020-06-15 22:15:13 +00:00
if ( has_temperature_compensation ( ) )
{
MENU_ITEM_TOGGLE_P ( _T ( MSG_TEMP_CALIBRATION ) , eeprom_read_byte ( ( unsigned char * ) EEPROM_TEMP_CAL_ACTIVE ) ? _T ( MSG_ON ) : _T ( MSG_OFF ) , lcd_temp_calibration_set ) ;
}
2018-07-20 21:48:00 +00:00
2018-03-05 16:14:20 +00:00
# ifdef HAS_SECOND_SERIAL_PORT
2019-08-31 12:25:00 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_RPI_PORT ) , ( selectedSerialPort = = 0 ) ? _T ( MSG_OFF ) : _T ( MSG_ON ) , lcd_second_serial_set ) ;
2018-03-05 16:14:20 +00:00
# endif //HAS_SECOND_SERIAL
2017-12-08 15:56:06 +00:00
2018-07-20 21:48:00 +00:00
if ( ! isPrintPaused & & ! homing_flag )
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_BABYSTEP_Z ) , lcd_babystep_z ) ;
2018-06-07 22:20:28 +00:00
# if (LANG_MODE != 0)
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Select language " ) , lcd_language_menu ) ; ////MSG_LANGUAGE_SELECT
2018-06-07 22:20:28 +00:00
# endif //(LANG_MODE != 0)
2016-08-11 08:42:53 +00:00
2018-08-10 13:19:35 +00:00
SETTINGS_SD ;
SETTINGS_SOUND ;
2018-07-23 18:04:47 +00:00
2019-10-11 16:23:38 +00:00
# ifdef LCD_BL_PIN
2019-10-16 11:40:45 +00:00
if ( backlightSupport )
{
2019-11-17 07:53:14 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_BRIGHTNESS ) , lcd_backlight_menu ) ;
2019-10-16 11:40:45 +00:00
}
2019-10-11 16:23:38 +00:00
# endif //LCD_BL_PIN
2018-07-23 18:04:47 +00:00
2018-07-20 21:48:00 +00:00
if ( farm_mode )
{
MENU_ITEM_SUBMENU_P ( PSTR ( " Farm number " ) , lcd_farm_no ) ;
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( PSTR ( " Disable farm mode " ) , lcd_disable_farm_mode ) ;
2018-07-20 21:48:00 +00:00
}
2016-08-11 08:42:53 +00:00
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-08-11 08:42:53 +00:00
}
2018-03-29 21:01:13 +00:00
# ifdef TMC2130
2018-03-28 14:13:16 +00:00
static void lcd_ustep_linearity_menu_save ( )
{
2018-05-27 23:47:08 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_X_FAC , tmc2130_wave_fac [ X_AXIS ] ) ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_Y_FAC , tmc2130_wave_fac [ Y_AXIS ] ) ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_Z_FAC , tmc2130_wave_fac [ Z_AXIS ] ) ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_E_FAC , tmc2130_wave_fac [ E_AXIS ] ) ;
2018-03-28 14:13:16 +00:00
}
2018-03-29 21:01:13 +00:00
# endif //TMC2130
2019-03-05 17:00:16 +00:00
# ifdef TMC2130
2018-08-24 18:31:49 +00:00
static void lcd_settings_linearity_correction_menu_save ( )
2018-03-28 16:53:37 +00:00
{
bool changed = false ;
2018-05-27 23:47:08 +00:00
if ( tmc2130_wave_fac [ X_AXIS ] < TMC2130_WAVE_FAC1000_MIN ) tmc2130_wave_fac [ X_AXIS ] = 0 ;
if ( tmc2130_wave_fac [ Y_AXIS ] < TMC2130_WAVE_FAC1000_MIN ) tmc2130_wave_fac [ Y_AXIS ] = 0 ;
if ( tmc2130_wave_fac [ Z_AXIS ] < TMC2130_WAVE_FAC1000_MIN ) tmc2130_wave_fac [ Z_AXIS ] = 0 ;
2018-03-28 16:53:37 +00:00
if ( tmc2130_wave_fac [ E_AXIS ] < TMC2130_WAVE_FAC1000_MIN ) tmc2130_wave_fac [ E_AXIS ] = 0 ;
2018-05-27 23:47:08 +00:00
changed | = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_X_FAC ) ! = tmc2130_wave_fac [ X_AXIS ] ) ;
changed | = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_Y_FAC ) ! = tmc2130_wave_fac [ Y_AXIS ] ) ;
changed | = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_Z_FAC ) ! = tmc2130_wave_fac [ Z_AXIS ] ) ;
changed | = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_TMC2130_WAVE_E_FAC ) ! = tmc2130_wave_fac [ E_AXIS ] ) ;
2018-03-28 16:53:37 +00:00
lcd_ustep_linearity_menu_save ( ) ;
if ( changed ) tmc2130_init ( ) ;
}
2019-03-05 17:00:16 +00:00
# endif //TMC2130
2018-02-15 03:17:58 +00:00
2016-08-11 08:42:53 +00:00
static void lcd_calibration_menu ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2016-08-11 08:42:53 +00:00
if ( ! isPrintPaused )
{
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Wizard " ) , lcd_wizard ) ; ////MSG_WIZARD c=17 r=1
2019-09-12 15:54:05 +00:00
if ( lcd_commands_type = = LcdCommands : : Idle )
{
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_V2_CALIBRATION ) , lcd_first_layer_calibration_reset ) ; ////MSG_V2_CALIBRATION c=18
2019-09-12 15:54:05 +00:00
}
2018-06-23 01:22:39 +00:00
MENU_ITEM_GCODE_P ( _T ( MSG_AUTO_HOME ) , PSTR ( " G28 W " ) ) ;
2019-06-19 22:09:55 +00:00
# ifdef TMC2130
2020-05-12 20:23:40 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Belt test " ) , lcd_belttest_v ) ; ////MSG_BELTTEST c=17
2019-06-19 22:09:55 +00:00
# endif //TMC2130
2020-05-12 20:23:40 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Selftest " ) , lcd_selftest_v ) ; ////MSG_SELFTEST c=17
2017-06-29 16:35:43 +00:00
# ifdef MK1BP
2016-08-11 08:42:53 +00:00
// MK1
// "Calibrate Z"
2018-06-23 01:22:39 +00:00
MENU_ITEM_GCODE_P ( _T ( MSG_HOMEYZ ) , PSTR ( " G28 Z " ) ) ;
2017-06-29 16:35:43 +00:00
# else //MK1BP
2016-08-11 08:42:53 +00:00
// MK2
2019-05-07 10:23:09 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Calibrate XYZ " ) , lcd_mesh_calibration ) ; ////MSG_CALIBRATE_BED
2016-08-11 08:42:53 +00:00
// "Calibrate Z" with storing the reference values to EEPROM.
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_HOMEYZ ) , lcd_mesh_calibration_z ) ;
2017-03-24 18:47:50 +00:00
# ifndef SNMM
2018-06-23 01:22:39 +00:00
//MENU_ITEM_FUNCTION_P(_i("Calibrate E"), lcd_calibrate_extruder);////MSG_CALIBRATE_E c=20 r=1
2017-03-24 18:47:50 +00:00
# endif
2016-08-11 08:42:53 +00:00
// "Mesh Bed Leveling"
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Mesh Bed Leveling " ) , lcd_mesh_bedleveling ) ; ////MSG_MESH_BED_LEVELING
2017-11-27 15:06:34 +00:00
2017-06-29 16:35:43 +00:00
# endif //MK1BP
2018-05-28 11:22:14 +00:00
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Bed level correct " ) , lcd_adjust_bed ) ; ////MSG_BED_CORRECTION_MENU
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " PID calibration " ) , pid_extruder ) ; ////MSG_PID_EXTRUDER c=17 r=1
2018-12-21 17:51:13 +00:00
# ifndef TMC2130
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Show end stops " ) , menu_show_end_stops ) ; ////MSG_SHOW_END_STOPS c=18
2018-05-15 18:23:22 +00:00
# endif
2017-06-29 16:35:43 +00:00
# ifndef MK1BP
2019-05-07 10:23:09 +00:00
MENU_ITEM_GCODE_P ( _i ( " Reset XYZ calibr. " ) , PSTR ( " M44 " ) ) ; ////MSG_CALIBRATE_BED_RESET
2017-06-29 16:35:43 +00:00
# endif //MK1BP
2017-03-24 18:47:50 +00:00
# ifndef SNMM
2018-06-23 01:22:39 +00:00
//MENU_ITEM_FUNCTION_P(MSG_RESET_CALIBRATE_E, lcd_extr_cal_reset);
2017-03-24 18:47:50 +00:00
# endif
2017-11-27 15:21:54 +00:00
# ifndef MK1BP
2020-06-15 22:15:13 +00:00
if ( has_temperature_compensation ( ) )
{
MENU_ITEM_SUBMENU_P ( _i ( " Temp. calibration " ) , lcd_pinda_calibration_menu ) ; ////MSG_CALIBRATION_PINDA_MENU c=17 r=1
}
2017-11-27 15:21:54 +00:00
# endif //MK1BP
2016-08-11 08:42:53 +00:00
}
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
2017-06-29 16:35:43 +00:00
void bowden_menu ( ) {
2018-07-16 00:13:52 +00:00
int enc_dif = lcd_encoder_diff ;
2017-06-29 16:35:43 +00:00
int cursor_pos = 0 ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " > " ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 4 ; i + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , i ) ;
lcd_print ( " Extruder " ) ;
lcd_print ( i ) ;
lcd_print ( " : " ) ;
2017-06-29 16:35:43 +00:00
EEPROM_read_B ( EEPROM_BOWDEN_LENGTH + i * 2 , & bowden_length [ i ] ) ;
2018-07-16 17:29:27 +00:00
lcd_print ( bowden_length [ i ] - 48 ) ;
2016-07-22 13:28:01 +00:00
2017-06-29 16:35:43 +00:00
}
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2017-06-29 16:35:43 +00:00
while ( 1 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 2 ) {
2017-03-24 18:47:50 +00:00
2018-07-16 00:13:52 +00:00
if ( enc_dif > lcd_encoder_diff ) {
2017-06-29 16:35:43 +00:00
cursor_pos - - ;
}
2017-03-24 18:47:50 +00:00
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2017-06-29 16:35:43 +00:00
cursor_pos + + ;
}
2017-03-24 18:47:50 +00:00
2017-06-29 16:35:43 +00:00
if ( cursor_pos > 3 ) {
cursor_pos = 3 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2017-06-29 16:35:43 +00:00
}
2017-03-24 18:47:50 +00:00
2017-06-29 16:35:43 +00:00
if ( cursor_pos < 0 ) {
cursor_pos = 0 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2017-06-29 16:35:43 +00:00
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-06-29 16:35:43 +00:00
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-06-29 16:35:43 +00:00
while ( 1 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 1 ) ;
lcd_print ( " Extruder " ) ;
lcd_print ( cursor_pos ) ;
lcd_print ( " : " ) ;
lcd_set_cursor ( 13 , 1 ) ;
lcd_print ( bowden_length [ cursor_pos ] - 48 ) ;
2017-06-29 16:35:43 +00:00
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 2 ) {
if ( enc_dif > lcd_encoder_diff ) {
2017-06-29 16:35:43 +00:00
bowden_length [ cursor_pos ] - - ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 13 , 1 ) ;
lcd_print ( bowden_length [ cursor_pos ] - 48 ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2017-06-29 16:35:43 +00:00
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2017-06-29 16:35:43 +00:00
bowden_length [ cursor_pos ] + + ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 13 , 1 ) ;
lcd_print ( bowden_length [ cursor_pos ] - 48 ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2017-06-29 16:35:43 +00:00
}
}
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-06-29 16:35:43 +00:00
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2017-06-29 16:35:43 +00:00
EEPROM_save_B ( EEPROM_BOWDEN_LENGTH + cursor_pos * 2 , & bowden_length [ cursor_pos ] ) ;
if ( lcd_show_fullscreen_message_yes_no_and_wait_P ( PSTR ( " Continue with another bowden? " ) ) ) {
lcd_update_enable ( true ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 4 ; i + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , i ) ;
lcd_print ( " Extruder " ) ;
lcd_print ( i ) ;
lcd_print ( " : " ) ;
2017-06-29 16:35:43 +00:00
EEPROM_read_B ( EEPROM_BOWDEN_LENGTH + i * 2 , & bowden_length [ i ] ) ;
2018-07-16 17:29:27 +00:00
lcd_print ( bowden_length [ i ] - 48 ) ;
2017-06-29 16:35:43 +00:00
}
break ;
}
else return ;
}
}
}
}
}
2017-03-24 18:47:50 +00:00
2020-01-07 17:51:30 +00:00
# ifdef SNMM
2018-07-09 12:20:56 +00:00
2017-06-29 16:35:43 +00:00
static char snmm_stop_print_menu ( ) { //menu for choosing which filaments will be unloaded in stop print
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_puts_at_P ( 0 , 0 , _T ( MSG_UNLOAD_FILAMENT ) ) ; lcd_print ( " : " ) ;
lcd_set_cursor ( 0 , 1 ) ; lcd_print ( " > " ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_at_P ( 1 , 2 , _i ( " Used during print " ) ) ; ////MSG_USED c=19 r=1
lcd_puts_at_P ( 1 , 3 , _i ( " Current " ) ) ; ////MSG_CURRENT c=19 r=1
2017-06-29 16:35:43 +00:00
char cursor_pos = 1 ;
int enc_dif = 0 ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2017-06-29 16:35:43 +00:00
while ( 1 ) {
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 ) {
2017-06-29 16:35:43 +00:00
2018-07-16 00:13:52 +00:00
if ( ( abs ( enc_dif - lcd_encoder_diff ) ) > 1 ) {
if ( enc_dif > lcd_encoder_diff ) cursor_pos - - ;
if ( enc_dif < lcd_encoder_diff ) cursor_pos + + ;
2019-06-10 13:03:52 +00:00
if ( cursor_pos > 3 ) {
cursor_pos = 3 ;
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
}
if ( cursor_pos < 1 ) {
cursor_pos = 1 ;
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
}
2017-06-29 16:35:43 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-06-29 16:35:43 +00:00
}
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2017-06-29 16:35:43 +00:00
return ( cursor_pos - 1 ) ;
}
}
2017-03-24 18:47:50 +00:00
2017-06-29 16:35:43 +00:00
}
2017-03-24 18:47:50 +00:00
2020-01-07 17:51:30 +00:00
# endif //SNMM
2018-10-08 13:58:49 +00:00
//! @brief Select one of numbered items
//!
//! Create list of items with header. Header can not be selected.
//! Each item has text description passed by function parameter and
//! number. There are 5 numbered items, if mmu_enabled, 4 otherwise.
//! Items are numbered from 1 to 4 or 5. But index returned starts at 0.
//! There can be last item with different text and no number.
//!
//! @param header Header text
//! @param item Item text
//! @param last_item Last item text, or nullptr if there is no Last item
//! @return selected item index, first item index is 0
uint8_t choose_menu_P ( const char * header , const char * item , const char * last_item )
{
//following code should handle 3 to 127 number of items well
const int8_t items_no = last_item ? ( mmu_enabled ? 6 : 5 ) : ( mmu_enabled ? 5 : 4 ) ;
const uint8_t item_len = item ? strlen_P ( item ) : 0 ;
int8_t first = 0 ;
int8_t enc_dif = lcd_encoder_diff ;
int8_t cursor_pos = 1 ;
2017-06-29 16:35:43 +00:00
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-10-08 13:58:49 +00:00
2017-11-15 14:09:29 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
2018-10-08 13:58:49 +00:00
while ( 1 )
{
manage_heater ( ) ;
manage_inactivity ( true ) ;
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 )
{
if ( enc_dif > lcd_encoder_diff )
{
cursor_pos - - ;
}
if ( enc_dif < lcd_encoder_diff )
{
cursor_pos + + ;
}
enc_dif = lcd_encoder_diff ;
2019-08-27 15:10:29 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2017-06-29 16:35:43 +00:00
}
2018-10-08 13:58:49 +00:00
if ( cursor_pos > 3 )
2019-06-10 13:03:52 +00:00
{
2018-10-08 13:58:49 +00:00
cursor_pos = 3 ;
if ( first < items_no - 3 )
{
first + + ;
lcd_clear ( ) ;
2019-08-28 07:39:28 +00:00
} else { // here we are at the very end of the list
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2018-10-08 13:58:49 +00:00
}
}
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
if ( cursor_pos < 1 )
{
cursor_pos = 1 ;
if ( first > 0 )
{
first - - ;
lcd_clear ( ) ;
2019-08-28 07:39:28 +00:00
} else { // here we are at the very end of the list
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2018-10-08 13:58:49 +00:00
}
}
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
if ( header ) lcd_puts_at_P ( 0 , 0 , header ) ;
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
const bool last_visible = ( first = = items_no - 3 ) ;
2019-06-12 13:01:57 +00:00
const uint_least8_t ordinary_items = ( last_item & & last_visible ) ? 2 : 3 ;
2017-06-29 16:35:43 +00:00
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < ordinary_items ; i + + )
2018-10-08 13:58:49 +00:00
{
if ( item ) lcd_puts_at_P ( 1 , i + 1 , item ) ;
}
2017-06-29 16:35:43 +00:00
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < ordinary_items ; i + + )
2018-10-08 13:58:49 +00:00
{
lcd_set_cursor ( 2 + item_len , i + 1 ) ;
lcd_print ( first + i + 1 ) ;
}
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
if ( last_item & & last_visible ) lcd_puts_at_P ( 1 , 3 , last_item ) ;
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2018-10-08 13:58:49 +00:00
if ( lcd_clicked ( ) )
{
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2018-10-08 13:58:49 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2018-11-02 19:25:24 +00:00
lcd_encoder_diff = 0 ;
2017-06-29 16:35:43 +00:00
return ( cursor_pos + first - 1 ) ;
}
}
}
char reset_menu ( ) {
# ifdef SNMM
int items_no = 5 ;
# else
int items_no = 4 ;
# endif
static int first = 0 ;
int enc_dif = 0 ;
char cursor_pos = 0 ;
const char * item [ items_no ] ;
item [ 0 ] = " Language " ;
item [ 1 ] = " Statistics " ;
item [ 2 ] = " Shipping prep " ;
item [ 3 ] = " All Data " ;
# ifdef SNMM
item [ 4 ] = " Bowden length " ;
# endif // SNMM
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " > " ) ;
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2017-06-29 16:35:43 +00:00
while ( 1 ) {
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 4 ; i + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , i ) ;
lcd_print ( item [ first + i ] ) ;
2017-06-29 16:35:43 +00:00
}
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
manage_heater ( ) ;
manage_inactivity ( true ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 4 ) {
2017-03-24 18:47:50 +00:00
2018-07-16 00:13:52 +00:00
if ( ( abs ( enc_dif - lcd_encoder_diff ) ) > 1 ) {
if ( enc_dif > lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
cursor_pos + + ;
}
if ( cursor_pos > 3 ) {
cursor_pos = 3 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2017-06-29 16:35:43 +00:00
if ( first < items_no - 4 ) {
first + + ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-06-29 16:35:43 +00:00
}
2017-03-24 18:47:50 +00:00
}
if ( cursor_pos < 0 ) {
cursor_pos = 0 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2017-06-29 16:35:43 +00:00
if ( first > 0 ) {
first - - ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-06-29 16:35:43 +00:00
}
2017-03-24 18:47:50 +00:00
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2017-06-29 16:35:43 +00:00
return ( cursor_pos + first ) ;
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
}
2018-07-15 16:37:59 +00:00
static void lcd_disable_farm_mode ( )
{
2017-03-24 18:47:50 +00:00
int8_t disable = lcd_show_fullscreen_message_yes_no_and_wait_P ( PSTR ( " Disable farm mode? " ) , true , false ) ; //allow timeouting, default no
2018-07-15 16:37:59 +00:00
if ( disable )
{
2017-03-24 18:47:50 +00:00
enquecommand_P ( PSTR ( " G99 " ) ) ;
lcd_return_to_status ( ) ;
}
lcd_update_enable ( true ) ;
2018-07-16 00:13:52 +00:00
lcd_draw_update = 2 ;
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
2018-10-31 20:48:05 +00:00
2017-03-24 18:47:50 +00:00
static void fil_load_menu ( )
{
2019-05-14 14:43:33 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-05-14 14:45:15 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Load all " ) , load_all ) ; ////MSG_LOAD_ALL c=17
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 1 ' , extr_adj , 0 ) ; ////MSG_LOAD_FILAMENT_1 c=16
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 2 ' , extr_adj , 1 ) ; ////MSG_LOAD_FILAMENT_2 c=17
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 3 ' , extr_adj , 2 ) ; ////MSG_LOAD_FILAMENT_3 c=17
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 4 ' , extr_adj , 3 ) ; ////MSG_LOAD_FILAMENT_4 c=17
2017-03-24 18:47:50 +00:00
2019-05-14 14:43:33 +00:00
if ( mmu_enabled )
2019-05-14 14:45:15 +00:00
{
2019-05-30 14:28:02 +00:00
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 5 ' , extr_adj , 4 ) ;
2019-05-14 14:45:15 +00:00
}
2019-05-14 14:43:33 +00:00
MENU_END ( ) ;
2019-02-26 09:32:10 +00:00
}
2018-11-01 15:29:09 +00:00
static void mmu_load_to_nozzle_menu ( )
2019-02-13 22:53:00 +00:00
{
2019-05-14 14:45:15 +00:00
if ( bFilamentAction )
{
2019-05-14 14:43:33 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 1 ' , lcd_mmu_load_to_nozzle , 0 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 2 ' , lcd_mmu_load_to_nozzle , 1 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 3 ' , lcd_mmu_load_to_nozzle , 2 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 4 ' , lcd_mmu_load_to_nozzle , 3 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_LOAD_FILAMENT ) , ' 5 ' , lcd_mmu_load_to_nozzle , 4 ) ;
MENU_END ( ) ;
2019-05-14 14:45:15 +00:00
}
else
2019-05-14 14:43:33 +00:00
{
2019-06-12 17:11:41 +00:00
eFilamentAction = FilamentAction : : MmuLoad ;
2019-09-12 16:53:24 +00:00
preheat_or_continue ( ) ;
2019-05-14 14:43:33 +00:00
}
2019-02-13 22:53:00 +00:00
}
2018-11-01 15:29:09 +00:00
2019-05-14 13:47:25 +00:00
static void mmu_eject_filament ( uint8_t filament )
2018-08-28 23:58:28 +00:00
{
2019-02-26 10:11:05 +00:00
menu_back ( ) ;
mmu_eject_filament ( filament , true ) ;
2018-08-28 23:58:28 +00:00
}
2019-02-26 10:11:05 +00:00
static void mmu_fil_eject_menu ( )
{
2019-05-14 14:45:15 +00:00
if ( bFilamentAction )
2019-02-26 10:11:05 +00:00
{
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-05-14 13:47:25 +00:00
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_EJECT_FILAMENT ) , ' 1 ' , mmu_eject_filament , 0 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_EJECT_FILAMENT ) , ' 2 ' , mmu_eject_filament , 1 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_EJECT_FILAMENT ) , ' 3 ' , mmu_eject_filament , 2 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_EJECT_FILAMENT ) , ' 4 ' , mmu_eject_filament , 3 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_EJECT_FILAMENT ) , ' 5 ' , mmu_eject_filament , 4 ) ;
2019-02-26 10:11:05 +00:00
MENU_END ( ) ;
}
else
{
2019-06-12 17:11:41 +00:00
eFilamentAction = FilamentAction : : MmuEject ;
2019-09-12 16:53:24 +00:00
preheat_or_continue ( ) ;
2019-02-26 10:11:05 +00:00
}
2019-02-13 22:53:00 +00:00
}
2018-08-28 23:58:28 +00:00
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-02-26 16:58:00 +00:00
static void mmu_cut_filament_menu ( )
{
2019-05-14 14:45:15 +00:00
if ( bFilamentAction )
{
2019-05-14 14:43:33 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-05-30 17:36:10 +00:00
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_CUT_FILAMENT ) , ' 1 ' , mmu_cut_filament , 0 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_CUT_FILAMENT ) , ' 2 ' , mmu_cut_filament , 1 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_CUT_FILAMENT ) , ' 3 ' , mmu_cut_filament , 2 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_CUT_FILAMENT ) , ' 4 ' , mmu_cut_filament , 3 ) ;
MENU_ITEM_FUNCTION_NR_P ( _T ( MSG_CUT_FILAMENT ) , ' 5 ' , mmu_cut_filament , 4 ) ;
2019-05-14 14:43:33 +00:00
MENU_END ( ) ;
2019-05-14 14:45:15 +00:00
}
else
{
2019-06-12 17:11:41 +00:00
eFilamentAction = FilamentAction : : MmuCut ;
2019-05-14 14:43:33 +00:00
bFilamentFirstRun = false ;
if ( target_temperature [ 0 ] > = EXTRUDE_MINTEMP )
{
bFilamentPreheatState = true ;
mFilamentItem ( target_temperature [ 0 ] , target_temperature_bed ) ;
}
2019-09-12 16:15:15 +00:00
else lcd_generic_preheat_menu ( ) ;
2019-05-14 14:43:33 +00:00
}
2019-02-26 16:58:00 +00:00
}
2019-03-15 02:38:37 +00:00
# endif //MMU_HAS_CUTTER
2019-02-26 16:58:00 +00:00
2018-10-31 20:48:05 +00:00
# ifdef SNMM
2017-03-24 18:47:50 +00:00
static void fil_unload_menu ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
2019-05-07 10:23:09 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Unload all " ) , extr_unload_all ) ; ////MSG_UNLOAD_ALL c=17
MENU_ITEM_FUNCTION_P ( _i ( " Unload filament 1 " ) , extr_unload_0 ) ; ////MSG_UNLOAD_FILAMENT_1 c=17
MENU_ITEM_FUNCTION_P ( _i ( " Unload filament 2 " ) , extr_unload_1 ) ; ////MSG_UNLOAD_FILAMENT_2 c=17
MENU_ITEM_FUNCTION_P ( _i ( " Unload filament 3 " ) , extr_unload_2 ) ; ////MSG_UNLOAD_FILAMENT_3 c=17
MENU_ITEM_FUNCTION_P ( _i ( " Unload filament 4 " ) , extr_unload_3 ) ; ////MSG_UNLOAD_FILAMENT_4 c=17
2017-03-24 18:47:50 +00:00
2018-08-02 16:54:00 +00:00
if ( mmu_enabled )
2019-05-07 10:23:09 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Unload filament 5 " ) , extr_unload_4 ) ; ////MSG_UNLOAD_FILAMENT_5 c=17
2018-07-09 13:24:59 +00:00
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2017-03-24 18:47:50 +00:00
}
static void change_extr_menu ( ) {
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ;
MENU_ITEM_FUNCTION_P ( _i ( " Extruder 1 " ) , extr_change_0 ) ; ////MSG_EXTRUDER_1 c=17 r=1
MENU_ITEM_FUNCTION_P ( _i ( " Extruder 2 " ) , extr_change_1 ) ; ////MSG_EXTRUDER_2 c=17 r=1
MENU_ITEM_FUNCTION_P ( _i ( " Extruder 3 " ) , extr_change_2 ) ; ////MSG_EXTRUDER_3 c=17 r=1
MENU_ITEM_FUNCTION_P ( _i ( " Extruder 4 " ) , extr_change_3 ) ; ////MSG_EXTRUDER_4 c=17 r=1
2017-03-24 18:47:50 +00:00
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2017-03-24 18:47:50 +00:00
}
2018-11-01 15:29:09 +00:00
# endif //SNMM
2017-03-24 18:47:50 +00:00
2018-08-01 09:33:58 +00:00
//unload filament for single material printer (used in M702 gcode)
2018-08-02 16:54:00 +00:00
void unload_filament ( )
{
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : FilamentLoading ;
2018-08-01 09:33:58 +00:00
lcd_setstatuspgm ( _T ( MSG_UNLOADING_FILAMENT ) ) ;
2019-06-05 16:12:46 +00:00
raise_z_above ( MIN_Z_FOR_UNLOAD ) ;
2018-08-01 09:33:58 +00:00
// extr_unload2();
current_position [ E_AXIS ] - = 45 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( 5200 / 60 ) ;
2018-08-01 09:33:58 +00:00
st_synchronize ( ) ;
current_position [ E_AXIS ] - = 15 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( 1000 / 60 ) ;
2018-08-01 09:33:58 +00:00
st_synchronize ( ) ;
current_position [ E_AXIS ] - = 20 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( 1000 / 60 ) ;
2018-08-01 09:33:58 +00:00
st_synchronize ( ) ;
lcd_display_message_fullscreen_P ( _T ( MSG_PULL_OUT_FILAMENT ) ) ;
//disable extruder steppers so filament can be removed
disable_e0 ( ) ;
disable_e1 ( ) ;
disable_e2 ( ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2018-08-01 09:33:58 +00:00
2018-10-08 13:58:49 +00:00
Sound_MakeSound ( e_SOUND_TYPE_StandardPrompt ) ;
2018-08-01 09:33:58 +00:00
uint8_t counterBeep = 0 ;
while ( ! lcd_clicked ( ) & & ( counterBeep < 50 ) ) {
delay_keep_alive ( 100 ) ;
counterBeep + + ;
}
st_synchronize ( ) ;
while ( lcd_clicked ( ) ) delay_keep_alive ( 100 ) ;
lcd_update_enable ( true ) ;
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : Status ;
2018-08-01 09:33:58 +00:00
}
2017-03-24 18:47:50 +00:00
static void lcd_farm_no ( )
{
char step = 0 ;
int enc_dif = 0 ;
int _farmno = farm_no ;
int _ret = 0 ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-03-24 18:47:50 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " Farm no " ) ;
2017-03-24 18:47:50 +00:00
do
{
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 2 ) {
if ( enc_dif > lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
switch ( step ) {
case ( 0 ) : if ( _farmno > = 100 ) _farmno - = 100 ; break ;
case ( 1 ) : if ( _farmno % 100 > = 10 ) _farmno - = 10 ; break ;
case ( 2 ) : if ( _farmno % 10 > = 1 ) _farmno - - ; break ;
default : break ;
}
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
switch ( step ) {
case ( 0 ) : if ( _farmno < 900 ) _farmno + = 100 ; break ;
case ( 1 ) : if ( _farmno % 100 < 90 ) _farmno + = 10 ; break ;
case ( 2 ) : if ( _farmno % 10 < = 8 ) _farmno + + ; break ;
default : break ;
}
}
enc_dif = 0 ;
2018-07-16 00:13:52 +00:00
lcd_encoder_diff = 0 ;
2017-03-24 18:47:50 +00:00
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
if ( _farmno < 100 ) lcd_print ( " 0 " ) ;
if ( _farmno < 10 ) lcd_print ( " 0 " ) ;
lcd_print ( _farmno ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
2017-03-24 18:47:50 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( step , 3 ) ;
lcd_print ( " ^ " ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-03-24 18:47:50 +00:00
if ( lcd_clicked ( ) )
{
2019-01-27 21:48:51 +00:00
_delay ( 200 ) ;
2017-03-24 18:47:50 +00:00
step + + ;
if ( step = = 3 ) {
_ret = 1 ;
farm_no = _farmno ;
EEPROM_save_B ( EEPROM_FARM_NUMBER , & farm_no ) ;
prusa_statistics ( 20 ) ;
lcd_return_to_status ( ) ;
}
}
manage_heater ( ) ;
} while ( _ret = = 0 ) ;
}
2018-03-15 13:25:17 +00:00
unsigned char lcd_choose_color ( ) {
//function returns index of currently chosen item
//following part can be modified from 2 to 255 items:
//-----------------------------------------------------
unsigned char items_no = 2 ;
const char * item [ items_no ] ;
item [ 0 ] = " Orange " ;
item [ 1 ] = " Black " ;
//-----------------------------------------------------
2019-06-12 13:01:57 +00:00
uint_least8_t active_rows ;
2018-03-15 13:25:17 +00:00
static int first = 0 ;
int enc_dif = 0 ;
unsigned char cursor_pos = 1 ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " > " ) ;
2018-03-15 13:25:17 +00:00
active_rows = items_no < 3 ? items_no : 3 ;
2018-12-11 14:59:44 +00:00
lcd_consume_click ( ) ;
2018-03-15 13:25:17 +00:00
while ( 1 ) {
2018-07-16 16:08:01 +00:00
lcd_puts_at_P ( 0 , 0 , PSTR ( " Choose color: " ) ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < active_rows ; i + + ) {
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , i + 1 ) ;
lcd_print ( item [ first + i ] ) ;
2018-03-15 13:25:17 +00:00
}
manage_heater ( ) ;
manage_inactivity ( true ) ;
proc_commands ( ) ;
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 12 ) {
2018-03-15 13:25:17 +00:00
2018-07-16 00:13:52 +00:00
if ( enc_dif > lcd_encoder_diff ) {
2018-03-15 13:25:17 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2018-03-15 13:25:17 +00:00
cursor_pos + + ;
}
if ( cursor_pos > active_rows ) {
cursor_pos = active_rows ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2018-03-15 13:25:17 +00:00
if ( first < items_no - active_rows ) {
first + + ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-03-15 13:25:17 +00:00
}
}
if ( cursor_pos < 1 ) {
cursor_pos = 1 ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_BlindAlert ) ;
2018-03-15 13:25:17 +00:00
if ( first > 0 ) {
first - - ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-03-15 13:25:17 +00:00
}
}
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 2 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_print ( " " ) ;
lcd_set_cursor ( 0 , cursor_pos ) ;
lcd_print ( " > " ) ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2018-03-15 13:25:17 +00:00
}
if ( lcd_clicked ( ) ) {
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2018-03-15 13:25:17 +00:00
switch ( cursor_pos + first - 1 ) {
case 0 : return 1 ; break ;
case 1 : return 0 ; break ;
default : return 99 ; break ;
}
}
}
}
2017-03-24 18:47:50 +00:00
void lcd_confirm_print ( )
{
2018-03-15 13:25:17 +00:00
uint8_t filament_type ;
2017-03-24 18:47:50 +00:00
int enc_dif = 0 ;
int cursor_pos = 1 ;
int _ret = 0 ;
int _t = 0 ;
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2017-03-24 18:47:50 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
lcd_print ( " Print ok ? " ) ;
2017-03-24 18:47:50 +00:00
do
{
2018-07-16 00:13:52 +00:00
if ( abs ( enc_dif - lcd_encoder_diff ) > 12 ) {
if ( enc_dif > lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
cursor_pos - - ;
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2017-03-24 18:47:50 +00:00
cursor_pos + + ;
}
2018-07-16 00:13:52 +00:00
enc_dif = lcd_encoder_diff ;
2017-03-24 18:47:50 +00:00
}
if ( cursor_pos > 2 ) { cursor_pos = 2 ; }
if ( cursor_pos < 1 ) { cursor_pos = 1 ; }
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ; lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ; lcd_print ( " " ) ;
lcd_set_cursor ( 2 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_YES ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 2 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_NO ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 + cursor_pos ) ;
lcd_print ( " > " ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2017-03-24 18:47:50 +00:00
_t = _t + 1 ;
if ( _t > 100 )
2016-07-22 13:28:01 +00:00
{
prusa_statistics ( 99 ) ;
_t = 0 ;
}
if ( lcd_clicked ( ) )
{
2019-03-19 18:48:40 +00:00
filament_type = FARM_FILAMENT_COLOR_NONE ;
2016-07-22 13:28:01 +00:00
if ( cursor_pos = = 1 )
{
_ret = 1 ;
2019-03-19 18:48:40 +00:00
// filament_type = lcd_choose_color();
2018-03-15 13:25:17 +00:00
prusa_statistics ( 4 , filament_type ) ;
no_response = true ; //we need confirmation by recieving PRUSA thx
important_status = 4 ;
saved_filament_type = filament_type ;
2019-01-27 21:48:51 +00:00
NcTime = _millis ( ) ;
2016-07-22 13:28:01 +00:00
}
if ( cursor_pos = = 2 )
{
_ret = 2 ;
2019-03-19 18:48:40 +00:00
// filament_type = lcd_choose_color();
2018-03-15 13:25:17 +00:00
prusa_statistics ( 5 , filament_type ) ;
no_response = true ; //we need confirmation by recieving PRUSA thx
important_status = 5 ;
saved_filament_type = filament_type ;
2019-01-27 21:48:51 +00:00
NcTime = _millis ( ) ;
2016-07-22 13:28:01 +00:00
}
}
manage_heater ( ) ;
manage_inactivity ( ) ;
2018-03-15 13:25:17 +00:00
proc_commands ( ) ;
2016-07-22 13:28:01 +00:00
} while ( _ret = = 0 ) ;
}
2018-06-12 16:56:40 +00:00
# include "w25x20cl.h"
2018-10-08 13:58:49 +00:00
# ifdef LCD_TEST
2018-06-12 16:56:40 +00:00
static void lcd_test_menu ( )
2018-05-30 17:29:52 +00:00
{
2018-06-12 16:56:40 +00:00
W25X20CL_SPI_ENTER ( ) ;
w25x20cl_enable_wr ( ) ;
w25x20cl_chip_erase ( ) ;
w25x20cl_disable_wr ( ) ;
}
2018-10-08 13:58:49 +00:00
# endif //LCD_TEST
2019-09-30 17:30:09 +00:00
static bool fan_error_selftest ( )
2018-10-08 13:58:49 +00:00
{
2019-09-25 12:58:07 +00:00
# ifdef FANCHECK
2019-11-16 20:44:34 +00:00
if ( ! fans_check_enabled ) return 0 ;
2019-09-30 17:01:31 +00:00
2019-09-25 12:58:07 +00:00
fanSpeed = 255 ;
# ifdef FAN_SOFT_PWM
fanSpeedSoftPwm = 255 ;
# endif //FAN_SOFT_PWM
manage_heater ( ) ; //enables print fan
2020-06-01 15:58:15 +00:00
setExtruderAutoFanState ( 3 ) ; //force enables the extruder fan
2019-09-25 12:58:07 +00:00
# ifdef FAN_SOFT_PWM
extruder_autofan_last_check = _millis ( ) ;
fan_measuring = true ;
# endif //FAN_SOFT_PWM
2019-09-25 19:35:35 +00:00
_delay ( 1000 ) ; //delay_keep_alive would turn off extruder fan, because temerature is too low (maybe)
2019-09-25 12:58:07 +00:00
manage_heater ( ) ;
fanSpeed = 0 ;
2020-06-01 15:58:15 +00:00
setExtruderAutoFanState ( 1 ) ; //releases lock on the extruder fan
2019-09-25 12:58:07 +00:00
# ifdef FAN_SOFT_PWM
fanSpeedSoftPwm = 0 ;
# endif //FAN_SOFT_PWM
manage_heater ( ) ;
# ifdef TACH_0
2019-09-25 19:35:35 +00:00
if ( fan_speed [ 0 ] < = 20 ) { //extruder fan error
2019-09-30 17:16:01 +00:00
LCD_ALERTMESSAGERPGM ( MSG_FANCHECK_EXTRUDER ) ;
2019-09-30 17:30:09 +00:00
return 1 ;
2019-09-25 12:58:07 +00:00
}
# endif
# ifdef TACH_1
2019-09-25 19:35:35 +00:00
if ( fan_speed [ 1 ] < = 20 ) { //print fan error
2019-09-30 17:16:01 +00:00
LCD_ALERTMESSAGERPGM ( MSG_FANCHECK_PRINT ) ;
2019-09-30 17:30:09 +00:00
return 1 ;
2019-09-25 12:58:07 +00:00
}
# endif
2019-11-16 20:44:34 +00:00
# endif //FANCHECK
2019-09-30 17:30:09 +00:00
return 0 ;
2019-09-30 17:01:31 +00:00
}
2018-10-08 13:58:49 +00:00
//! @brief Resume paused print
//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(),
//! as restore_print_from_ram_and_continue() calls lcd_update() internally.
void lcd_resume_print ( )
{
lcd_return_to_status ( ) ;
lcd_reset_alert_level ( ) ; //for fan speed error
2019-09-30 17:30:09 +00:00
if ( fan_error_selftest ( ) ) return ; //abort if error persists
2019-09-25 12:58:07 +00:00
2019-12-28 19:26:19 +00:00
lcd_setstatuspgm ( _T ( MSG_FINISHING_MOVEMENTS ) ) ;
st_synchronize ( ) ;
2020-05-12 20:23:40 +00:00
lcd_setstatuspgm ( _T ( MSG_RESUMING_PRINT ) ) ; ////MSG_RESUMING_PRINT c=20
2019-12-15 21:22:44 +00:00
isPrintPaused = false ;
2019-12-14 17:05:08 +00:00
restore_print_from_ram_and_continue ( default_retraction ) ;
2019-01-27 21:48:51 +00:00
pause_time + = ( _millis ( ) - start_pause_print ) ; //accumulate time when print is paused for correct statistics calculation
2018-11-09 17:31:28 +00:00
refresh_cmd_timeout ( ) ;
2019-09-19 17:48:59 +00:00
SERIAL_PROTOCOLLNRPGM ( MSG_OCTOPRINT_RESUMED ) ; //resume octoprint
2018-10-08 13:58:49 +00:00
}
2018-05-30 17:29:52 +00:00
2019-07-22 16:43:43 +00:00
static void change_sheet ( )
2019-06-21 13:44:56 +00:00
{
2019-07-22 16:43:43 +00:00
eeprom_update_byte ( & ( EEPROM_Sheets_base - > active_sheet ) , selected_sheet ) ;
2019-06-21 13:44:56 +00:00
menu_back ( 3 ) ;
}
2019-07-03 17:37:11 +00:00
2019-07-22 16:43:43 +00:00
2019-06-21 13:44:56 +00:00
2019-06-24 15:11:13 +00:00
static void lcd_rename_sheet_menu ( )
{
struct MenuData
{
bool initialized ;
uint8_t selected ;
char name [ sizeof ( Sheet : : name ) ] ;
} ;
static_assert ( sizeof ( menu_data ) > = sizeof ( MenuData ) , " MenuData doesn't fit into menu_data " ) ;
MenuData * menuData = ( MenuData * ) & ( menu_data [ 0 ] ) ;
if ( ! menuData - > initialized )
{
2019-07-22 16:43:43 +00:00
eeprom_read_block ( menuData - > name , EEPROM_Sheets_base - > s [ selected_sheet ] . name , sizeof ( Sheet : : name ) ) ;
2019-06-24 15:11:13 +00:00
lcd_encoder = menuData - > name [ 0 ] ;
menuData - > initialized = true ;
}
if ( lcd_encoder < ' \x20 ' ) lcd_encoder = ' \x20 ' ;
if ( lcd_encoder > ' \x7F ' ) lcd_encoder = ' \x7F ' ;
menuData - > name [ menuData - > selected ] = lcd_encoder ;
lcd_set_cursor ( 0 , 0 ) ;
for ( uint_least8_t i = 0 ; i < sizeof ( Sheet : : name ) ; + + i )
{
lcd_putc ( menuData - > name [ i ] ) ;
}
lcd_set_cursor ( menuData - > selected , 1 ) ;
lcd_putc ( ' ^ ' ) ;
if ( lcd_clicked ( ) )
{
if ( ( menuData - > selected + 1u ) < sizeof ( Sheet : : name ) )
{
lcd_encoder = menuData - > name [ + + ( menuData - > selected ) ] ;
}
else
{
eeprom_update_block ( menuData - > name ,
2019-07-22 16:43:43 +00:00
EEPROM_Sheets_base - > s [ selected_sheet ] . name ,
2019-06-24 15:11:13 +00:00
sizeof ( Sheet : : name ) ) ;
menu_back ( ) ;
}
}
}
2019-07-19 16:34:46 +00:00
static void lcd_reset_sheet ( )
{
2019-08-29 15:21:08 +00:00
SheetName sheetName ;
2019-08-30 10:24:13 +00:00
eeprom_default_sheet_name ( selected_sheet , sheetName ) ;
2019-10-01 14:57:37 +00:00
eeprom_update_word ( reinterpret_cast < uint16_t * > ( & ( EEPROM_Sheets_base - > s [ selected_sheet ] . z_offset ) ) , EEPROM_EMPTY_VALUE16 ) ;
2019-08-29 15:21:08 +00:00
eeprom_update_block ( sheetName . c , EEPROM_Sheets_base - > s [ selected_sheet ] . name , sizeof ( Sheet : : name ) ) ;
2019-08-29 01:33:33 +00:00
if ( selected_sheet = = eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) )
{
2019-08-30 10:24:13 +00:00
eeprom_switch_to_next_sheet ( ) ;
if ( ( - 1 = = eeprom_next_initialized_sheet ( 0 ) ) & & ( CALIBRATION_STATUS_CALIBRATED = = calibration_status ( ) ) )
2019-08-29 01:33:33 +00:00
{
calibration_status_store ( CALIBRATION_STATUS_LIVE_ADJUST ) ;
}
}
2019-07-23 09:31:20 +00:00
2019-08-29 18:52:53 +00:00
menu_back ( ) ;
2019-07-19 16:34:46 +00:00
}
2019-08-30 12:45:25 +00:00
//! @brief Activate selected_sheet and run first layer calibration
static void activate_calibrate_sheet ( )
{
eeprom_update_byte ( & ( EEPROM_Sheets_base - > active_sheet ) , selected_sheet ) ;
2019-10-01 16:22:12 +00:00
lcd_first_layer_calibration_reset ( ) ;
2019-07-19 16:34:46 +00:00
}
2019-06-20 14:40:53 +00:00
static void lcd_sheet_menu ( )
{
2019-06-21 13:44:56 +00:00
MENU_BEGIN ( ) ;
2020-05-12 20:23:40 +00:00
MENU_ITEM_BACK_P ( _i ( " Steel sheets " ) ) ; ////MSG_STEEL_SHEETS c=18
2019-07-22 16:43:43 +00:00
2019-08-30 10:24:13 +00:00
if ( eeprom_is_sheet_initialized ( selected_sheet ) ) {
2019-07-22 16:43:43 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Select " ) , change_sheet ) ; //// c=18
}
2019-09-12 15:54:05 +00:00
if ( lcd_commands_type = = LcdCommands : : Idle )
{
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_V2_CALIBRATION ) , activate_calibrate_sheet ) ; ////MSG_V2_CALIBRATION c=18
2019-09-12 15:54:05 +00:00
}
2019-07-19 16:34:46 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Rename " ) , lcd_rename_sheet_menu ) ; //// c=18
2019-08-29 18:52:53 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Reset " ) , lcd_reset_sheet ) ; //// c=18
2019-06-21 13:44:56 +00:00
MENU_END ( ) ;
2019-06-20 14:40:53 +00:00
}
2016-07-22 13:28:01 +00:00
static void lcd_main_menu ( )
{
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
2016-07-22 13:28:01 +00:00
// Majkl superawesome menu
2017-09-19 19:38:47 +00:00
2018-06-23 01:22:39 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_WATCH ) ) ;
2017-07-06 17:09:06 +00:00
2017-09-26 10:48:46 +00:00
# ifdef RESUME_DEBUG
2017-09-19 19:38:47 +00:00
if ( ! saved_printing )
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( PSTR ( " tst - Save " ) , lcd_menu_test_save ) ;
2017-09-19 19:38:47 +00:00
else
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( PSTR ( " tst - Restore " ) , lcd_menu_test_restore ) ;
2017-09-26 10:48:46 +00:00
# endif //RESUME_DEBUG
2017-09-19 19:38:47 +00:00
2017-07-06 17:09:06 +00:00
# ifdef TMC2130_DEBUG
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( PSTR ( " recover print " ) , recover_print ) ;
MENU_ITEM_FUNCTION_P ( PSTR ( " power panic " ) , uvlo_ ) ;
2017-07-06 17:09:06 +00:00
# endif //TMC2130_DEBUG
2018-08-28 21:50:31 +00:00
2019-06-12 16:19:41 +00:00
if ( ( IS_SD_PRINTING | | is_usb_printing | | ( lcd_commands_type = = LcdCommands : : Layer1Cal ) ) & & ( current_position [ Z_AXIS ] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU ) & & ! homing_flag & & ! mesh_bed_leveling_flag )
2016-07-22 13:28:01 +00:00
{
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_BABYSTEP_Z ) , lcd_babystep_z ) ; //8
2016-07-22 13:28:01 +00:00
}
2019-06-12 16:19:41 +00:00
if ( moves_planned ( ) | | IS_SD_PRINTING | | is_usb_printing | | ( lcd_commands_type = = LcdCommands : : Layer1Cal ) )
2016-07-22 13:28:01 +00:00
{
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Tune " ) , lcd_tune_menu ) ; ////MSG_TUNE
2016-07-22 13:28:01 +00:00
} else
{
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Preheat " ) , lcd_preheat_menu ) ; ////MSG_PREHEAT
2016-07-22 13:28:01 +00:00
}
2019-06-20 14:40:53 +00:00
2019-12-23 18:06:13 +00:00
if ( isPrintPaused & & saved_printing_type = = PRINTING_TYPE_USB )
{
2019-09-19 17:48:59 +00:00
# ifdef FANCHECK
2019-12-23 18:06:13 +00:00
if ( ( fan_check_error = = EFCE_FIXED ) | | ( fan_check_error = = EFCE_OK ) )
MENU_ITEM_SUBMENU_P ( _i ( " Resume print " ) , lcd_resume_print ) ; ////MSG_RESUME_PRINT
# else
MENU_ITEM_SUBMENU_P ( _i ( " Resume print " ) , lcd_resume_print ) ; ////MSG_RESUME_PRINT
2019-09-19 17:48:59 +00:00
# endif
2019-12-23 18:06:13 +00:00
}
2019-06-20 14:40:53 +00:00
2016-07-22 13:28:01 +00:00
# ifdef SDSUPPORT
2019-06-12 16:19:41 +00:00
if ( card . cardOK | | lcd_commands_type = = LcdCommands : : Layer1Cal )
2016-07-22 13:28:01 +00:00
{
if ( card . isFileOpen ( ) )
{
2017-06-29 16:35:43 +00:00
if ( mesh_bed_leveling_flag = = false & & homing_flag = = false ) {
if ( card . sdprinting )
{
2019-05-07 10:23:09 +00:00
MENU_ITEM_FUNCTION_P ( _i ( " Pause print " ) , lcd_pause_print ) ; ////MSG_PAUSE_PRINT
2017-06-29 16:35:43 +00:00
}
2019-12-15 21:22:44 +00:00
else if ( isPrintPaused )
2017-06-29 16:35:43 +00:00
{
2019-06-24 16:01:49 +00:00
# ifdef FANCHECK
2019-09-25 15:32:35 +00:00
if ( ( fan_check_error = = EFCE_FIXED ) | | ( fan_check_error = = EFCE_OK ) )
2019-09-19 17:48:59 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Resume print " ) , lcd_resume_print ) ; ////MSG_RESUME_PRINT
2019-06-24 16:01:49 +00:00
# else
MENU_ITEM_SUBMENU_P ( _i ( " Resume print " ) , lcd_resume_print ) ; ////MSG_RESUME_PRINT
# endif
2017-06-29 16:35:43 +00:00
}
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_STOP_PRINT ) , lcd_sdcard_stop ) ;
2016-07-22 13:28:01 +00:00
}
}
2019-06-12 16:19:41 +00:00
else if ( lcd_commands_type = = LcdCommands : : Layer1Cal & & mesh_bed_leveling_flag = = false & & homing_flag = = false ) {
2018-06-23 01:22:39 +00:00
//MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
2017-12-12 13:25:13 +00:00
}
2016-07-22 13:28:01 +00:00
else
{
2019-06-12 16:19:41 +00:00
if ( ! is_usb_printing & & ( lcd_commands_type ! = LcdCommands : : Layer1Cal ) )
2016-07-22 13:28:01 +00:00
{
2018-06-23 01:22:39 +00:00
//if (farm_mode) MENU_ITEM_SUBMENU_P(MSG_FARM_CARD_MENU, lcd_farm_sdcard_menu);
2019-01-24 16:32:57 +00:00
/*else*/ {
bMain = true ; // flag ('fake parameter') for 'lcd_sdcard_menu()' function
MENU_ITEM_SUBMENU_P ( _T ( MSG_CARD_MENU ) , lcd_sdcard_menu ) ;
}
2016-07-22 13:28:01 +00:00
}
# if SDCARDDETECT < 1
2019-05-07 10:23:09 +00:00
MENU_ITEM_GCODE_P ( _i ( " Change SD card " ) , PSTR ( " M21 " ) ) ; // SD-card changed by user////MSG_CNG_SDCARD
2016-07-22 13:28:01 +00:00
# endif
}
2017-12-12 13:25:13 +00:00
2016-07-22 13:28:01 +00:00
} else
{
2019-01-24 16:32:57 +00:00
bMain = true ; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " No SD card " ) , lcd_sdcard_menu ) ; ////MSG_NO_CARD
2016-07-22 13:28:01 +00:00
# if SDCARDDETECT < 1
2019-05-07 10:23:09 +00:00
MENU_ITEM_GCODE_P ( _i ( " Init. SD card " ) , PSTR ( " M21 " ) ) ; // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD
2016-07-22 13:28:01 +00:00
# endif
}
# endif
2019-08-28 17:01:48 +00:00
if ( ! isPrintPaused & & ! IS_SD_PRINTING & & ! is_usb_printing & & ( lcd_commands_type ! = LcdCommands : : Layer1Cal ) )
{
if ( ! farm_mode )
{
2019-08-28 17:08:53 +00:00
const int8_t sheet = eeprom_read_byte ( & ( EEPROM_Sheets_base - > active_sheet ) ) ;
2019-08-30 10:24:13 +00:00
const int8_t nextSheet = eeprom_next_initialized_sheet ( sheet ) ;
2019-08-28 17:08:53 +00:00
if ( ( nextSheet > = 0 ) & & ( sheet ! = nextSheet ) ) // show menu only if we have 2 or more sheets initialized
{
2019-08-30 10:24:13 +00:00
MENU_ITEM_FUNCTION_E ( EEPROM_Sheets_base - > s [ sheet ] , eeprom_switch_to_next_sheet ) ;
2019-08-28 17:08:53 +00:00
}
2019-08-28 17:01:48 +00:00
}
}
2016-07-22 13:28:01 +00:00
2019-06-12 16:19:41 +00:00
if ( IS_SD_PRINTING | | is_usb_printing | | ( lcd_commands_type = = LcdCommands : : Layer1Cal ) )
2016-07-22 13:28:01 +00:00
{
2017-03-24 18:47:50 +00:00
if ( farm_mode )
{
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( PSTR ( " Farm number " ) , lcd_farm_no ) ;
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
}
else
{
2018-08-02 16:54:00 +00:00
if ( mmu_enabled )
{
MENU_ITEM_SUBMENU_P ( _T ( MSG_LOAD_FILAMENT ) , fil_load_menu ) ;
2018-11-01 15:29:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Load to nozzle " ) , mmu_load_to_nozzle_menu ) ;
2019-02-20 02:01:33 +00:00
//-// MENU_ITEM_FUNCTION_P(_T(MSG_UNLOAD_FILAMENT), extr_unload);
2019-02-21 03:45:44 +00:00
//bFilamentFirstRun=true;
2019-09-12 16:40:02 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_UNLOAD_FILAMENT ) , mmu_unload_filament ) ;
2018-08-28 23:58:28 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Eject filament " ) , mmu_fil_eject_menu ) ;
2019-03-15 02:38:37 +00:00
# ifdef MMU_HAS_CUTTER
2019-02-26 16:58:00 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Cut filament " ) , mmu_cut_filament_menu ) ;
2019-03-15 02:38:37 +00:00
# endif //MMU_HAS_CUTTER
2018-08-02 16:54:00 +00:00
}
2017-12-27 20:57:51 +00:00
else
2018-08-02 16:54:00 +00:00
{
2018-10-31 20:48:05 +00:00
# ifdef SNMM
MENU_ITEM_SUBMENU_P ( _T ( MSG_UNLOAD_FILAMENT ) , fil_unload_menu ) ;
MENU_ITEM_SUBMENU_P ( _i ( " Change extruder " ) , change_extr_menu ) ; ////MSG_CHANGE_EXTR c=20 r=1
# endif
2018-08-02 16:54:00 +00:00
# ifdef FILAMENT_SENSOR
2018-08-27 03:20:42 +00:00
if ( ( fsensor_autoload_enabled = = true ) & & ( fsensor_enabled = = true ) & & ( mmu_enabled = = false ) )
2020-05-12 20:23:40 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " AutoLoad filament " ) , lcd_menu_AutoLoadFilament ) ; ////MSG_AUTOLOAD_FILAMENT c=18
2018-08-02 16:54:00 +00:00
else
# endif //FILAMENT_SENSOR
2019-01-31 04:21:53 +00:00
{
bFilamentFirstRun = true ;
MENU_ITEM_SUBMENU_P ( _T ( MSG_LOAD_FILAMENT ) , lcd_LoadFilament ) ;
}
bFilamentFirstRun = true ;
2018-08-02 16:54:00 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_UNLOAD_FILAMENT ) , lcd_unLoadFilament ) ;
}
2018-06-23 01:22:39 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_SETTINGS ) , lcd_settings_menu ) ;
if ( ! isPrintPaused ) MENU_ITEM_SUBMENU_P ( _T ( MSG_MENU_CALIBRATION ) , lcd_calibration_menu ) ;
2018-02-22 19:50:34 +00:00
2016-07-22 13:28:01 +00:00
}
2019-07-03 17:37:11 +00:00
2019-06-12 16:19:41 +00:00
if ( ! is_usb_printing & & ( lcd_commands_type ! = LcdCommands : : Layer1Cal ) )
2016-07-22 13:28:01 +00:00
{
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Statistics " ) , lcd_menu_statistics ) ; ////MSG_STATISTICS
2016-07-22 13:28:01 +00:00
}
2017-09-26 13:46:33 +00:00
2018-07-22 14:14:13 +00:00
# if defined(TMC2130) || defined(FILAMENT_SENSOR)
2018-11-22 13:37:29 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Fail stats " ) , lcd_menu_fails_stats ) ;
2018-03-05 20:42:04 +00:00
# endif
2018-12-12 23:12:00 +00:00
if ( mmu_enabled ) {
MENU_ITEM_SUBMENU_P ( _i ( " Fail stats MMU " ) , lcd_menu_fails_stats_mmu ) ;
}
2019-07-09 10:31:20 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " Support " ) , lcd_support_menu ) ; ////MSG_SUPPORT
2018-10-08 13:58:49 +00:00
# ifdef LCD_TEST
2019-05-07 10:23:09 +00:00
MENU_ITEM_SUBMENU_P ( _i ( " W25x20CL init " ) , lcd_test_menu ) ; ////MSG_SUPPORT
2018-10-08 13:58:49 +00:00
# endif //LCD_TEST
2017-12-22 19:31:45 +00:00
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
2017-03-24 18:47:50 +00:00
void stack_error ( ) {
2019-06-10 13:03:52 +00:00
Sound_MakeCustom ( 1000 , 0 , true ) ;
2018-05-22 01:20:03 +00:00
lcd_display_message_fullscreen_P ( _i ( " Error - static memory has been overwritten " ) ) ; ////MSG_STACK_ERROR c=20 r=4
2017-03-24 18:47:50 +00:00
//err_triggered = 1;
while ( 1 ) delay_keep_alive ( 1000 ) ;
}
2016-07-22 13:28:01 +00:00
2018-01-12 19:51:14 +00:00
# ifdef DEBUG_STEPPER_TIMER_MISSED
bool stepper_timer_overflow_state = false ;
2018-02-15 10:44:19 +00:00
uint16_t stepper_timer_overflow_max = 0 ;
uint16_t stepper_timer_overflow_last = 0 ;
uint16_t stepper_timer_overflow_cnt = 0 ;
2018-01-12 19:51:14 +00:00
void stepper_timer_overflow ( ) {
2018-02-15 10:44:19 +00:00
char msg [ 28 ] ;
sprintf_P ( msg , PSTR ( " #%d %d max %d " ) , + + stepper_timer_overflow_cnt , stepper_timer_overflow_last > > 1 , stepper_timer_overflow_max > > 1 ) ;
lcd_setstatus ( msg ) ;
stepper_timer_overflow_state = false ;
if ( stepper_timer_overflow_last > stepper_timer_overflow_max )
stepper_timer_overflow_max = stepper_timer_overflow_last ;
SERIAL_ECHOPGM ( " Stepper timer overflow: " ) ;
MYSERIAL . print ( msg ) ;
SERIAL_ECHOLNPGM ( " " ) ;
2018-01-12 19:51:14 +00:00
WRITE ( BEEPER , LOW ) ;
}
# endif /* DEBUG_STEPPER_TIMER_MISSED */
2017-09-18 10:46:50 +00:00
2017-06-29 16:35:43 +00:00
static void lcd_colorprint_change ( ) {
enquecommand_P ( PSTR ( " M600 " ) ) ;
2019-07-17 08:30:49 +00:00
2019-06-12 16:42:55 +00:00
custom_message_type = CustomMsg : : FilamentLoading ; //just print status message
2018-05-23 14:37:08 +00:00
lcd_setstatuspgm ( _T ( MSG_FINISHING_MOVEMENTS ) ) ;
2017-06-29 16:35:43 +00:00
lcd_return_to_status ( ) ;
2018-07-16 00:13:52 +00:00
lcd_draw_update = 3 ;
2017-06-29 16:35:43 +00:00
}
2019-05-25 15:49:18 +00:00
2019-05-26 14:30:59 +00:00
# ifdef LA_LIVE_K
2019-05-25 15:49:18 +00:00
// @wavexx: looks like there's no generic float editing function in menu.cpp so we
// redefine our custom handling functions to mimick other tunables
2019-12-05 14:18:24 +00:00
const char menu_fmt_float13off [ ] PROGMEM = " %c%-13.13S%6.6S " ;
2019-05-25 15:49:18 +00:00
static void lcd_advance_draw_K ( char chr , float val )
{
if ( val < = 0 )
2019-12-18 16:03:54 +00:00
lcd_printf_P ( menu_fmt_float13off , chr , MSG_ADVANCE_K , _T ( MSG_OFF ) ) ;
2019-05-25 15:49:18 +00:00
else
2019-12-18 16:03:54 +00:00
lcd_printf_P ( menu_fmt_float13 , chr , MSG_ADVANCE_K , val ) ;
2019-05-25 15:49:18 +00:00
}
static void lcd_advance_edit_K ( void )
{
if ( lcd_draw_update )
{
if ( lcd_encoder < 0 ) lcd_encoder = 0 ;
if ( lcd_encoder > 999 ) lcd_encoder = 999 ;
lcd_set_cursor ( 0 , 1 ) ;
lcd_advance_draw_K ( ' ' , 0.01 * lcd_encoder ) ;
}
if ( LCD_CLICKED )
{
extruder_advance_K = 0.01 * lcd_encoder ;
menu_back_no_reset ( ) ;
}
}
static uint8_t lcd_advance_K ( )
{
if ( menu_item = = menu_line )
{
if ( lcd_draw_update )
{
lcd_set_cursor ( 0 , menu_row ) ;
lcd_advance_draw_K ( ( lcd_encoder = = menu_item ) ? ' > ' : ' ' , extruder_advance_K ) ;
}
if ( menu_clicked & & ( lcd_encoder = = menu_item ) )
{
menu_submenu_no_reset ( lcd_advance_edit_K ) ;
lcd_encoder = 100. * extruder_advance_K ;
return menu_item_ret ( ) ;
}
}
menu_item + + ;
return 0 ;
}
# define MENU_ITEM_EDIT_advance_K() do { if (lcd_advance_K()) return; } while (0)
# endif
2016-07-22 13:28:01 +00:00
static void lcd_tune_menu ( )
{
2018-08-10 00:59:49 +00:00
typedef struct
2018-08-22 17:47:29 +00:00
{
menu_data_edit_t reserved ; //!< reserved for number editing functions
int8_t status ; //!< To recognize, whether the menu has been just initialized.
//! Backup of extrudemultiply, to recognize, that the value has been changed and
//! it needs to be applied.
int16_t extrudemultiply ;
2018-08-10 00:59:49 +00:00
} _menu_data_t ;
2018-08-22 16:55:42 +00:00
static_assert ( sizeof ( menu_data ) > = sizeof ( _menu_data_t ) , " _menu_data_t doesn't fit into menu_data " ) ;
2018-08-10 00:59:49 +00:00
_menu_data_t * _md = ( _menu_data_t * ) & ( menu_data [ 0 ] ) ;
if ( _md - > status = = 0 )
{
// Menu was entered. Mark the menu as entered and save the current extrudemultiply value.
_md - > status = 1 ;
_md - > extrudemultiply = extrudemultiply ;
}
else if ( _md - > extrudemultiply ! = extrudemultiply )
{
// extrudemultiply has been changed from the child menu. Apply the new value.
_md - > extrudemultiply = extrudemultiply ;
calculate_extruder_multipliers ( ) ;
}
2018-03-07 14:46:46 +00:00
2016-07-22 13:28:01 +00:00
EEPROM_read ( EEPROM_SILENT , ( uint8_t * ) & SilentModeMenu , sizeof ( SilentModeMenu ) ) ;
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_MAIN ) ) ; //1
2019-05-07 10:23:09 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " Speed " ) , & feedmultiply , 10 , 999 ) ; //2////MSG_SPEED
2018-03-05 00:23:18 +00:00
2018-07-16 00:13:52 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_NOZZLE ) , & target_temperature [ 0 ] , 0 , HEATER_0_MAXTEMP - 10 ) ; //3
MENU_ITEM_EDIT_int3_P ( _T ( MSG_BED ) , & target_temperature_bed , 0 , BED_MAXTEMP - 10 ) ; //4
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_FAN_SPEED ) , & fanSpeed , 0 , 255 ) ; //5
2019-05-07 10:23:09 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " Flow " ) , & extrudemultiply , 10 , 999 ) ; //6////MSG_FLOW
2019-05-26 14:30:59 +00:00
# ifdef LA_LIVE_K
2019-05-25 15:49:18 +00:00
MENU_ITEM_EDIT_advance_K ( ) ; //7
# endif
2016-07-22 13:28:01 +00:00
# ifdef FILAMENTCHANGEENABLE
2019-05-25 15:49:18 +00:00
MENU_ITEM_FUNCTION_P ( _T ( MSG_FILAMENTCHANGE ) , lcd_colorprint_change ) ; //8
2016-07-22 13:28:01 +00:00
# endif
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2018-03-05 00:23:18 +00:00
if ( FSensorStateMenu = = 0 ) {
2019-09-15 22:43:37 +00:00
if ( fsensor_not_responding & & ( mmu_enabled = = false ) ) {
/* Filament sensor not working*/
2019-11-19 11:55:37 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_NA ) , lcd_fsensor_state_set ) ;
2019-09-15 22:43:37 +00:00
}
else {
/* Filament sensor turned off, working, no problems*/
2019-11-19 11:55:37 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_OFF ) , lcd_fsensor_state_set ) ;
2019-09-15 22:43:37 +00:00
}
2018-03-05 00:23:18 +00:00
}
else {
2019-08-19 08:58:16 +00:00
MENU_ITEM_TOGGLE_P ( _T ( MSG_FSENSOR ) , _T ( MSG_ON ) , lcd_fsensor_state_set ) ;
2018-03-05 00:23:18 +00:00
}
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2019-09-15 22:43:37 +00:00
FSENSOR_ACTION_NA ;
# endif //IR_SENSOR_ANALOG
2018-07-20 21:48:00 +00:00
# endif //FILAMENT_SENSOR
2018-11-05 16:43:07 +00:00
SETTINGS_AUTO_DEPLETE ;
2017-09-26 02:30:10 +00:00
2019-02-27 16:47:51 +00:00
SETTINGS_CUTTER ;
2019-03-19 18:48:40 +00:00
if ( farm_mode )
{
2019-08-10 18:03:45 +00:00
MENU_ITEM_TOGGLE_P ( _i ( " Fans check " ) , fans_check_enabled ? _T ( MSG_ON ) : _T ( MSG_OFF ) , lcd_set_fan_check ) ;
2019-03-19 18:48:40 +00:00
}
2018-03-05 00:23:18 +00:00
# ifdef TMC2130
2018-05-02 20:13:47 +00:00
if ( ! farm_mode )
{
2019-08-30 04:59:58 +00:00
if ( SilentModeMenu = = SILENT_MODE_NORMAL ) MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_NORMAL ) , lcd_silent_mode_set ) ;
else MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_STEALTH ) , lcd_silent_mode_set ) ;
2018-05-02 20:13:47 +00:00
if ( SilentModeMenu = = SILENT_MODE_NORMAL )
{
2019-08-29 19:31:30 +00:00
if ( lcd_crash_detect_enabled ( ) ) MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , _T ( MSG_ON ) , crash_mode_switch ) ;
else MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , _T ( MSG_OFF ) , crash_mode_switch ) ;
2018-05-02 20:13:47 +00:00
}
2019-08-29 19:31:30 +00:00
else MENU_ITEM_TOGGLE_P ( _T ( MSG_CRASHDETECT ) , NULL , lcd_crash_mode_info ) ;
2018-05-02 20:13:47 +00:00
}
2018-03-05 00:23:18 +00:00
# else //TMC2130
if ( ! farm_mode ) { //dont show in menu if we are in farm mode
switch ( SilentModeMenu ) {
2019-08-30 04:59:58 +00:00
case SILENT_MODE_POWER : MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_HIGH_POWER ) , lcd_silent_mode_set ) ; break ;
case SILENT_MODE_SILENT : MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_SILENT ) , lcd_silent_mode_set ) ; break ;
case SILENT_MODE_AUTO : MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_AUTO_POWER ) , lcd_silent_mode_set ) ; break ;
default : MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , _T ( MSG_HIGH_POWER ) , lcd_silent_mode_set ) ; break ; // (probably) not needed
2018-03-05 00:23:18 +00:00
}
}
# endif //TMC2130
2019-08-31 13:56:14 +00:00
SETTINGS_MMU_MODE ;
SETTINGS_SOUND ;
2019-10-19 15:45:04 +00:00
# ifdef LCD_BL_PIN
if ( backlightSupport )
{
2019-11-17 07:53:14 +00:00
MENU_ITEM_SUBMENU_P ( _T ( MSG_BRIGHTNESS ) , lcd_backlight_menu ) ;
2019-10-19 15:45:04 +00:00
}
# endif //LCD_BL_PIN
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
2019-03-28 13:58:58 +00:00
static void mbl_magnets_elimination_toggle ( ) {
2019-03-08 14:43:37 +00:00
bool magnet_elimination = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_MBL_MAGNET_ELIMINATION ) > 0 ) ;
magnet_elimination = ! magnet_elimination ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_MBL_MAGNET_ELIMINATION , ( uint8_t ) magnet_elimination ) ;
}
2019-03-28 13:58:58 +00:00
static void mbl_mesh_toggle ( ) {
2019-03-08 14:43:37 +00:00
uint8_t mesh_nr = eeprom_read_byte ( ( uint8_t * ) EEPROM_MBL_POINTS_NR ) ;
if ( mesh_nr = = 3 ) mesh_nr = 7 ;
else mesh_nr = 3 ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_MBL_POINTS_NR , mesh_nr ) ;
}
2019-03-28 15:39:56 +00:00
static void mbl_probe_nr_toggle ( ) {
2019-03-28 11:02:46 +00:00
mbl_z_probe_nr = eeprom_read_byte ( ( uint8_t * ) EEPROM_MBL_PROBE_NR ) ;
switch ( mbl_z_probe_nr ) {
case 1 : mbl_z_probe_nr = 3 ; break ;
case 3 : mbl_z_probe_nr = 5 ; break ;
case 5 : mbl_z_probe_nr = 1 ; break ;
default : mbl_z_probe_nr = 3 ; break ;
}
eeprom_update_byte ( ( uint8_t * ) EEPROM_MBL_PROBE_NR , mbl_z_probe_nr ) ;
}
2019-03-08 14:43:37 +00:00
static void lcd_mesh_bed_leveling_settings ( )
2019-03-06 12:27:31 +00:00
{
2019-03-08 14:43:37 +00:00
bool magnet_elimination = ( eeprom_read_byte ( ( uint8_t * ) EEPROM_MBL_MAGNET_ELIMINATION ) > 0 ) ;
uint8_t points_nr = eeprom_read_byte ( ( uint8_t * ) EEPROM_MBL_POINTS_NR ) ;
2019-11-09 18:58:56 +00:00
char sToggle [ 4 ] ; //enough for nxn format
2019-03-06 12:27:31 +00:00
2019-03-08 14:43:37 +00:00
MENU_BEGIN ( ) ;
2019-11-09 18:58:56 +00:00
MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ;
sToggle [ 0 ] = points_nr + ' 0 ' ;
sToggle [ 1 ] = ' x ' ;
sToggle [ 2 ] = points_nr + ' 0 ' ;
sToggle [ 3 ] = 0 ;
MENU_ITEM_TOGGLE ( _T ( MSG_MESH ) , sToggle , mbl_mesh_toggle ) ;
sToggle [ 0 ] = mbl_z_probe_nr + ' 0 ' ;
sToggle [ 1 ] = 0 ;
MENU_ITEM_TOGGLE ( _T ( MSG_Z_PROBE_NR ) , sToggle , mbl_probe_nr_toggle ) ;
MENU_ITEM_TOGGLE_P ( _T ( MSG_MAGNETS_COMP ) , ( points_nr = = 7 ) ? ( magnet_elimination ? _T ( MSG_ON ) : _T ( MSG_OFF ) ) : _T ( MSG_NA ) , mbl_magnets_elimination_toggle ) ;
2019-03-08 14:43:37 +00:00
MENU_END ( ) ;
//SETTINGS_MBL_MODE;
2019-03-06 12:27:31 +00:00
}
2019-10-17 10:14:32 +00:00
# ifdef LCD_BL_PIN
2019-10-17 10:11:32 +00:00
static void backlight_mode_toggle ( )
{
switch ( backlightMode )
{
case BACKLIGHT_MODE_BRIGHT : backlightMode = BACKLIGHT_MODE_DIM ; break ;
case BACKLIGHT_MODE_DIM : backlightMode = BACKLIGHT_MODE_AUTO ; break ;
case BACKLIGHT_MODE_AUTO : backlightMode = BACKLIGHT_MODE_BRIGHT ; break ;
default : backlightMode = BACKLIGHT_MODE_BRIGHT ; break ;
}
backlight_save ( ) ;
}
static void lcd_backlight_menu ( )
{
MENU_BEGIN ( ) ;
ON_MENU_LEAVE (
backlight_save ( ) ;
) ;
MENU_ITEM_BACK_P ( _T ( MSG_BACK ) ) ;
2019-11-17 07:53:14 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_BL_HIGH ) , & backlightLevel_HIGH , backlightLevel_LOW , 255 ) ;
MENU_ITEM_EDIT_int3_P ( _T ( MSG_BL_LOW ) , & backlightLevel_LOW , 0 , backlightLevel_HIGH ) ;
MENU_ITEM_TOGGLE_P ( _T ( MSG_MODE ) , ( ( backlightMode = = BACKLIGHT_MODE_BRIGHT ) ? _T ( MSG_BRIGHT ) : ( ( backlightMode = = BACKLIGHT_MODE_DIM ) ? _T ( MSG_DIM ) : _T ( MSG_AUTO ) ) ) , backlight_mode_toggle ) ;
MENU_ITEM_EDIT_int3_P ( _T ( MSG_TIMEOUT ) , & backlightTimer_period , 1 , 999 ) ;
2019-10-17 10:11:32 +00:00
MENU_END ( ) ;
}
2019-10-17 10:14:32 +00:00
# endif //LCD_BL_PIN
2019-10-17 10:11:32 +00:00
2016-07-22 13:28:01 +00:00
static void lcd_control_temperature_menu ( )
{
# ifdef PIDTEMP
// set up temp variables - undo the default scaling
2016-08-11 08:42:53 +00:00
// raw_Ki = unscalePID_i(Ki);
// raw_Kd = unscalePID_d(Kd);
2016-07-22 13:28:01 +00:00
# endif
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
MENU_ITEM_BACK_P ( _T ( MSG_SETTINGS ) ) ;
2016-07-22 13:28:01 +00:00
# if TEMP_SENSOR_0 != 0
2018-07-16 00:13:52 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_NOZZLE ) , & target_temperature [ 0 ] , 0 , HEATER_0_MAXTEMP - 10 ) ;
2016-07-22 13:28:01 +00:00
# endif
# if TEMP_SENSOR_1 != 0
2019-05-07 10:23:09 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " Nozzle2 " ) , & target_temperature [ 1 ] , 0 , HEATER_1_MAXTEMP - 10 ) ; ////MSG_NOZZLE1
2016-07-22 13:28:01 +00:00
# endif
# if TEMP_SENSOR_2 != 0
2019-05-07 10:23:09 +00:00
MENU_ITEM_EDIT_int3_P ( _i ( " Nozzle3 " ) , & target_temperature [ 2 ] , 0 , HEATER_2_MAXTEMP - 10 ) ; ////MSG_NOZZLE2
2016-07-22 13:28:01 +00:00
# endif
# if TEMP_SENSOR_BED != 0
2018-07-16 00:13:52 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_BED ) , & target_temperature_bed , 0 , BED_MAXTEMP - 3 ) ;
2016-07-22 13:28:01 +00:00
# endif
2018-07-16 00:13:52 +00:00
MENU_ITEM_EDIT_int3_P ( _T ( MSG_FAN_SPEED ) , & fanSpeed , 0 , 255 ) ;
2016-07-22 13:28:01 +00:00
# if defined AUTOTEMP && (TEMP_SENSOR_0 != 0)
2018-07-16 02:13:26 +00:00
//MENU_ITEM_EDIT removed, following code must be redesigned if AUTOTEMP enabled
2016-07-22 13:28:01 +00:00
MENU_ITEM_EDIT ( bool , MSG_AUTOTEMP , & autotemp_enabled ) ;
2019-05-07 10:23:09 +00:00
MENU_ITEM_EDIT ( float3 , _i ( " \002 Min " ) , & autotemp_min , 0 , HEATER_0_MAXTEMP - 10 ) ; ////MSG_MIN
MENU_ITEM_EDIT ( float3 , _i ( " \002 Max " ) , & autotemp_max , 0 , HEATER_0_MAXTEMP - 10 ) ; ////MSG_MAX
MENU_ITEM_EDIT ( float32 , _i ( " \002 Fact " ) , & autotemp_factor , 0.0 , 1.0 ) ; ////MSG_FACTOR
2016-07-22 13:28:01 +00:00
# endif
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2016-07-22 13:28:01 +00:00
}
# if SDCARDDETECT == -1
static void lcd_sd_refresh ( )
{
card . initsd ( ) ;
2018-07-16 00:13:52 +00:00
menu_top = 0 ;
2016-07-22 13:28:01 +00:00
}
# endif
static void lcd_sd_updir ( )
{
card . updir ( ) ;
2018-07-16 00:13:52 +00:00
menu_top = 0 ;
2016-07-22 13:28:01 +00:00
}
2018-07-19 12:23:45 +00:00
void lcd_print_stop ( )
{
2019-12-16 14:52:37 +00:00
if ( ! card . sdprinting ) {
SERIAL_ECHOLNRPGM ( MSG_OCTOPRINT_CANCEL ) ; // for Octoprint
}
2019-12-16 15:39:20 +00:00
CRITICAL_SECTION_START ;
2019-12-16 14:52:37 +00:00
// Clear any saved printing state
cancel_saved_printing ( ) ;
// Abort the planner/queue/sd
planner_abort_hard ( ) ;
2017-09-22 16:22:21 +00:00
cmdqueue_reset ( ) ;
card . sdprinting = false ;
card . closefile ( ) ;
2019-12-16 14:52:37 +00:00
st_reset_timer ( ) ;
2019-12-16 15:39:20 +00:00
CRITICAL_SECTION_END ;
2019-12-16 14:52:37 +00:00
2020-01-07 17:51:30 +00:00
# ifdef MESH_BED_LEVELING
mbl . active = false ; //also prevents undoing the mbl compensation a second time in the second planner_abort_hard()
# endif
2019-12-16 14:52:37 +00:00
lcd_setstatuspgm ( _T ( MSG_PRINT_ABORTED ) ) ;
2019-01-27 21:48:51 +00:00
stoptime = _millis ( ) ;
2017-09-22 16:22:21 +00:00
unsigned long t = ( stoptime - starttime - pause_time ) / 1000 ; //time in s
pause_time = 0 ;
save_statistics ( total_filament_used , t ) ;
2020-01-07 17:51:30 +00:00
lcd_commands_step = 0 ;
lcd_commands_type = LcdCommands : : Idle ;
lcd_cooldown ( ) ; //turns off heaters and fan; goes to status screen.
cancel_heatup = true ; //unroll temperature wait loop stack.
current_position [ Z_AXIS ] + = 10 ; //lift Z.
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ Z_AXIS ] / 60 ) ;
2020-01-07 17:51:30 +00:00
if ( axis_known_position [ X_AXIS ] & & axis_known_position [ Y_AXIS ] ) //if axis are homed, move to parked position.
{
current_position [ X_AXIS ] = X_CANCEL_POS ;
current_position [ Y_AXIS ] = Y_CANCEL_POS ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2020-01-07 17:51:30 +00:00
}
st_synchronize ( ) ;
if ( mmu_enabled ) extr_unload ( ) ; //M702 C
finishAndDisableSteppers ( ) ; //M84
lcd_setstatuspgm ( _T ( WELCOME_MSG ) ) ;
custom_message_type = CustomMsg : : Status ;
planner_abort_hard ( ) ; //needs to be done since plan_buffer_line resets waiting_inside_plan_buffer_line_print_aborted to false. Also copies current to destination.
2020-01-07 18:42:21 +00:00
2020-03-05 09:22:35 +00:00
axis_relative_modes = E_AXIS_MASK ; //XYZ absolute, E relative
2020-01-07 19:02:13 +00:00
isPrintPaused = false ; //clear isPrintPaused flag to allow starting next print after pause->stop scenario.
2017-09-22 16:22:21 +00:00
}
2016-07-22 13:28:01 +00:00
void lcd_sdcard_stop ( )
{
2018-12-19 18:20:09 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_STOP_PRINT ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 2 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_NO ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 2 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_YES ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ; lcd_print ( " " ) ;
lcd_set_cursor ( 0 , 3 ) ; lcd_print ( " " ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
if ( ( int32_t ) lcd_encoder > 2 ) { lcd_encoder = 2 ; }
if ( ( int32_t ) lcd_encoder < 1 ) { lcd_encoder = 1 ; }
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 + lcd_encoder ) ;
lcd_print ( " > " ) ;
2016-07-22 13:28:01 +00:00
if ( lcd_clicked ( ) )
{
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_ButtonEcho ) ;
2018-07-16 00:13:52 +00:00
if ( ( int32_t ) lcd_encoder = = 1 )
2016-07-22 13:28:01 +00:00
{
lcd_return_to_status ( ) ;
}
2018-07-16 00:13:52 +00:00
if ( ( int32_t ) lcd_encoder = = 2 )
2016-07-22 13:28:01 +00:00
{
2017-09-22 16:22:21 +00:00
lcd_print_stop ( ) ;
2016-07-22 13:28:01 +00:00
}
}
}
void lcd_sdcard_menu ( )
{
2017-12-11 10:30:49 +00:00
uint8_t sdSort = eeprom_read_byte ( ( uint8_t * ) EEPROM_SD_SORT ) ;
2018-10-08 13:58:49 +00:00
2017-12-11 10:30:49 +00:00
if ( presort_flag = = true ) {
presort_flag = false ;
card . presort ( ) ;
}
2018-07-16 00:13:52 +00:00
if ( lcd_draw_update = = 0 & & LCD_CLICKED = = 0 )
2019-01-27 21:48:51 +00:00
//_delay(100);
2016-07-22 13:28:01 +00:00
return ; // nothing to do (so don't thrash the SD card)
uint16_t fileCnt = card . getnrfilenames ( ) ;
2018-07-09 10:44:19 +00:00
2018-06-23 01:22:39 +00:00
MENU_BEGIN ( ) ;
2019-03-06 18:51:26 +00:00
MENU_ITEM_BACK_P ( _T ( bMain ? MSG_MAIN : MSG_BACK ) ) ; // i.e. default menu-item / menu-item after card insertion
2016-07-22 13:28:01 +00:00
card . getWorkDirName ( ) ;
if ( card . filename [ 0 ] = = ' / ' )
{
# if SDCARDDETECT == -1
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( _T ( MSG_REFRESH ) , lcd_sd_refresh ) ;
2016-07-22 13:28:01 +00:00
# endif
} else {
2018-06-23 01:22:39 +00:00
MENU_ITEM_FUNCTION_P ( PSTR ( LCD_STR_FOLDER " .. " ) , lcd_sd_updir ) ;
2016-07-22 13:28:01 +00:00
}
2018-03-29 21:01:13 +00:00
2016-07-22 13:28:01 +00:00
for ( uint16_t i = 0 ; i < fileCnt ; i + + )
{
2018-07-15 16:37:59 +00:00
if ( menu_item = = menu_line )
2016-07-22 13:28:01 +00:00
{
2017-12-11 10:30:49 +00:00
const uint16_t nr = ( ( sdSort = = SD_SORT_NONE ) | | farm_mode | | ( sdSort = = SD_SORT_TIME ) ) ? ( fileCnt - 1 - i ) : i ;
2017-12-10 10:08:50 +00:00
/*#ifdef SDCARD_RATHERRECENTFIRST
# ifndef SDCARD_SORT_ALPHA
fileCnt - 1 -
# endif
# endif
i ; */
# ifdef SDCARD_SORT_ALPHA
if ( sdSort = = SD_SORT_NONE ) card . getfilename ( nr ) ;
else card . getfilename_sorted ( nr ) ;
# else
card . getfilename ( nr ) ;
# endif
if ( card . filenameIsDir )
2018-10-08 13:58:49 +00:00
MENU_ITEM_SDDIR ( card . filename , card . longFilename ) ;
2017-12-10 10:08:50 +00:00
else
2018-07-09 10:44:19 +00:00
MENU_ITEM_SDFILE ( _T ( MSG_CARD_MENU ) , card . filename , card . longFilename ) ;
2016-07-22 13:28:01 +00:00
} else {
MENU_ITEM_DUMMY ( ) ;
}
}
2018-06-23 01:22:39 +00:00
MENU_END ( ) ;
2018-02-15 03:17:58 +00:00
}
2019-06-20 08:17:48 +00:00
# ifdef TMC2130
2019-06-19 22:09:55 +00:00
static void lcd_belttest_v ( )
{
lcd_belttest ( ) ;
menu_back_if_clicked ( ) ;
}
2020-02-11 23:33:40 +00:00
2019-06-19 22:09:55 +00:00
void lcd_belttest ( )
{
2020-02-12 00:44:26 +00:00
lcd_clear ( ) ;
2020-02-11 23:33:40 +00:00
// Belttest requires high power mode. Enable it.
FORCE_HIGH_POWER_START ;
2020-02-07 21:14:33 +00:00
2019-06-19 22:09:55 +00:00
uint16_t X = eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_X ) ) ;
uint16_t Y = eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_Y ) ) ;
2020-03-31 21:48:56 +00:00
lcd_printf_P ( _i ( " Checking X axis " ) ) ; // share message with selftest
lcd_set_cursor ( 0 , 1 ) , lcd_printf_P ( PSTR ( " X: %u -> ... " ) , X ) ;
2019-06-19 22:09:55 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2020-02-08 17:33:23 +00:00
2020-02-12 00:44:26 +00:00
// N.B: it doesn't make sense to handle !lcd_selfcheck...() because selftest_sg throws its own error screen
// that clobbers ours, with more info than we could provide. So on fail we just fall through to take us back to status.
if ( lcd_selfcheck_axis_sg ( X_AXIS ) ) {
X = eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_X ) ) ;
2020-03-31 21:48:56 +00:00
lcd_set_cursor ( 10 , 1 ) , lcd_printf_P ( PSTR ( " %u " ) , X ) ; // Show new X value next to old one.
2020-02-12 00:44:26 +00:00
lcd_puts_at_P ( 0 , 2 , _i ( " Checking Y axis " ) ) ;
2020-03-31 21:48:56 +00:00
lcd_set_cursor ( 0 , 3 ) , lcd_printf_P ( PSTR ( " Y: %u -> ... " ) , Y ) ;
2020-02-12 00:44:26 +00:00
if ( lcd_selfcheck_axis_sg ( Y_AXIS ) )
{
Y = eeprom_read_word ( ( uint16_t * ) ( EEPROM_BELTSTATUS_Y ) ) ;
2020-03-31 21:48:56 +00:00
lcd_set_cursor ( 10 , 3 ) , lcd_printf_P ( PSTR ( " %u " ) , Y ) ;
2020-02-12 00:44:26 +00:00
lcd_set_cursor ( 19 , 3 ) ;
2020-02-21 23:14:13 +00:00
lcd_print ( LCD_STR_UPLEVEL ) ;
2020-02-12 00:44:26 +00:00
lcd_wait_for_click_delay ( 10 ) ;
}
2019-06-19 22:09:55 +00:00
}
2020-02-12 00:44:26 +00:00
2020-02-11 23:33:40 +00:00
FORCE_HIGH_POWER_END ;
2019-06-19 22:09:55 +00:00
KEEPALIVE_STATE ( NOT_BUSY ) ;
}
2019-06-20 08:17:48 +00:00
# endif //TMC2130
2016-07-22 13:28:01 +00:00
2020-03-26 13:40:47 +00:00
# ifdef IR_SENSOR_ANALOG
2020-03-26 14:07:48 +00:00
// called also from marlin_main.cpp
2020-06-03 14:14:56 +00:00
void printf_IRSensorAnalogBoardChange ( ) {
printf_P ( PSTR ( " Filament sensor board change detected: revision%S \n " ) , FsensorIRVersionText ( ) ) ;
2020-03-26 14:07:48 +00:00
}
2020-03-02 16:52:25 +00:00
static bool lcd_selftest_IRsensor ( bool bStandalone )
2019-09-15 22:43:37 +00:00
{
2020-04-24 17:46:54 +00:00
bool bPCBrev04 ;
2020-03-26 14:07:48 +00:00
uint16_t volt_IR_int ;
2019-09-15 22:43:37 +00:00
2020-04-28 08:20:21 +00:00
volt_IR_int = current_voltage_raw_IR ;
bPCBrev04 = ( volt_IR_int < IRsensor_Hopen_TRESHOLD ) ;
printf_P ( PSTR ( " Measured filament sensor high level: %4.2fV \n " ) , Raw2Voltage ( volt_IR_int ) ) ;
if ( volt_IR_int < IRsensor_Hmin_TRESHOLD ) {
2020-03-26 14:07:48 +00:00
if ( ! bStandalone )
lcd_selftest_error ( TestError : : FsensorLevel , " HIGH " , " " ) ;
return ( false ) ;
}
2020-05-12 20:23:40 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Insert the filament (do not load it) into the extruder and then press the knob. " ) ) ; ////c=20 r=6
2020-04-28 08:20:21 +00:00
volt_IR_int = current_voltage_raw_IR ;
printf_P ( PSTR ( " Measured filament sensor low level: %4.2fV \n " ) , Raw2Voltage ( volt_IR_int ) ) ;
if ( volt_IR_int > ( IRsensor_Lmax_TRESHOLD ) ) {
2020-03-26 14:07:48 +00:00
if ( ! bStandalone )
lcd_selftest_error ( TestError : : FsensorLevel , " LOW " , " " ) ;
return ( false ) ;
}
2020-04-28 08:20:21 +00:00
if ( ( bPCBrev04 ? 1 : 0 ) ! = ( uint8_t ) oFsensorPCB ) { // safer then "(uint8_t)bPCBrev04"
oFsensorPCB = bPCBrev04 ? ClFsensorPCB : : _Rev04 : ClFsensorPCB : : _Old ;
2020-06-03 14:14:56 +00:00
printf_IRSensorAnalogBoardChange ( ) ;
2020-03-26 14:07:48 +00:00
eeprom_update_byte ( ( uint8_t * ) EEPROM_FSENSOR_PCB , ( uint8_t ) oFsensorPCB ) ;
}
return ( true ) ;
2019-09-15 22:43:37 +00:00
}
2020-03-02 16:52:25 +00:00
2020-03-26 14:07:48 +00:00
static void lcd_detect_IRsensor ( ) {
bool bAction ;
2020-06-03 14:14:56 +00:00
bool loaded ;
2020-03-26 14:07:48 +00:00
bMenuFSDetect = true ; // inhibits some code inside "manage_inactivity()"
2020-06-03 14:14:56 +00:00
/// Check if filament is loaded. If it is loaded stop detection.
/// @todo Add autodetection with MMU2s
loaded = ! READ ( IR_SENSOR_PIN ) ;
if ( loaded ) {
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please unload the filament first, then repeat this action. " ) ) ;
2020-03-26 14:07:48 +00:00
return ;
2020-06-03 14:14:56 +00:00
} else {
lcd_show_fullscreen_message_and_wait_P ( _i ( " Please check the IR sensor connections and filament is unloaded. " ) ) ;
bAction = lcd_selftest_IRsensor ( true ) ;
2020-03-26 14:07:48 +00:00
}
2020-06-03 14:14:56 +00:00
if ( bAction ) {
2020-05-12 20:23:40 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Sensor verified, remove the filament now. " ) ) ; ////c=20 r=3
2020-06-03 14:14:56 +00:00
// the fsensor board has been successfully identified, any previous "not responding" may be cleared now
fsensor_not_responding = false ;
2020-04-28 08:20:21 +00:00
} else {
2020-05-12 20:23:40 +00:00
lcd_show_fullscreen_message_and_wait_P ( _i ( " Verification failed, remove the filament and try again. " ) ) ; ////c=20 r=5
2020-06-03 14:14:56 +00:00
// here it is unclear what to to with the fsensor_not_responding flag
}
2020-03-26 14:07:48 +00:00
bMenuFSDetect = false ; // de-inhibits some code inside "manage_inactivity()"
2019-09-15 22:43:37 +00:00
}
# endif //IR_SENSOR_ANALOG
2017-11-15 15:40:35 +00:00
static void lcd_selftest_v ( )
{
( void ) lcd_selftest ( ) ;
}
2018-02-27 16:52:13 +00:00
bool lcd_selftest ( )
2016-07-22 13:28:01 +00:00
{
int _progress = 0 ;
2018-02-20 18:02:55 +00:00
bool _result = true ;
2019-05-13 14:25:47 +00:00
bool _swapped_fan = false ;
2020-05-12 18:15:02 +00:00
# ifdef IR_SENSOR_ANALOG
2020-06-03 14:14:56 +00:00
//! Check if IR sensor is in unknown state, if so run Fsensor Detection
//! As the Fsensor Detection isn't yet ready for the mmu2s we set temporarily the IR sensor 0.3 or older for mmu2s
//! @todo Don't forget to remove this as soon Fsensor Detection works with mmu
if ( oFsensorPCB = = ClFsensorPCB : : _Undef ) {
if ( ! mmu_enabled ) {
lcd_detect_IRsensor ( ) ;
}
else {
eeprom_update_byte ( ( uint8_t * ) EEPROM_FSENSOR_PCB , 0 ) ;
}
}
2020-01-22 03:45:13 +00:00
# endif //IR_SENSOR_ANALOG
2017-12-14 18:36:32 +00:00
lcd_wait_for_cool_down ( ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2019-05-07 10:23:09 +00:00
lcd_set_cursor ( 0 , 0 ) ; lcd_puts_P ( _i ( " Self test start " ) ) ; ////MSG_SELFTEST_START c=20
2017-12-12 19:21:09 +00:00
# ifdef TMC2130
FORCE_HIGH_POWER_START ;
# endif // TMC2130
2020-01-27 18:02:15 +00:00
FORCE_BL_ON_START ;
2020-01-31 15:57:18 +00:00
_delay ( 2000 ) ;
2017-12-14 18:36:32 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2018-02-20 18:02:55 +00:00
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : ExtruderFan , _progress , 3 , true , 2000 ) ;
2019-03-21 23:03:14 +00:00
# if (defined(FANCHECK) && defined(TACH_0))
2019-05-13 14:25:47 +00:00
switch ( lcd_selftest_fan_auto ( 0 ) ) { // check extruder Fan
2019-06-12 15:19:19 +00:00
case FanCheck : : ExtruderFan :
2019-05-13 14:25:47 +00:00
_result = false ;
break ;
2019-06-12 15:19:19 +00:00
case FanCheck : : SwappedFan :
2019-05-13 14:25:47 +00:00
_swapped_fan = true ;
// no break
default :
_result = true ;
break ;
}
2018-02-21 14:19:34 +00:00
# else //defined(TACH_0)
_result = lcd_selftest_manual_fan_check ( 0 , false ) ;
2019-05-13 14:25:47 +00:00
# endif //defined(TACH_0)
2018-04-12 16:24:30 +00:00
if ( ! _result )
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : ExtruderFan , " " , " " ) ;
2018-04-12 16:24:30 +00:00
}
2018-03-28 14:13:54 +00:00
2017-03-24 18:47:50 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : PrintFan , _progress , 3 , true , 2000 ) ;
2019-05-13 14:25:47 +00:00
# if (defined(FANCHECK) && defined(TACH_1))
switch ( lcd_selftest_fan_auto ( 1 ) ) { // check print fan
2019-06-12 15:19:19 +00:00
case FanCheck : : PrintFan :
2019-05-13 14:25:47 +00:00
_result = false ;
break ;
2019-06-12 15:19:19 +00:00
case FanCheck : : SwappedFan :
2019-05-13 14:25:47 +00:00
_swapped_fan = true ;
// no break
default :
_result = true ;
break ;
}
2018-02-06 16:01:09 +00:00
# else //defined(TACH_1)
_result = lcd_selftest_manual_fan_check ( 1 , false ) ;
2019-05-13 14:25:47 +00:00
# endif //defined(TACH_1)
2018-04-12 16:24:30 +00:00
if ( ! _result )
2019-05-13 14:25:47 +00:00
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : PrintFan , " " , " " ) ; //print fan not spinning
2018-04-12 16:24:30 +00:00
}
2019-05-13 14:25:47 +00:00
}
2018-04-12 16:24:30 +00:00
2019-05-13 14:25:47 +00:00
if ( _swapped_fan ) {
//turn on print fan and check that left extruder fan is not spinning
_result = lcd_selftest_manual_fan_check ( 1 , true ) ;
if ( _result ) {
//print fan is stil turned on; check that it is spinning
_result = lcd_selftest_manual_fan_check ( 1 , false , true ) ;
if ( ! _result ) {
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : PrintFan , " " , " " ) ;
2019-05-13 14:25:47 +00:00
}
}
else {
// fans are swapped
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : SwappedFan , " " , " " ) ;
2019-05-13 14:25:47 +00:00
}
2017-03-24 18:47:50 +00:00
}
2017-06-29 16:35:43 +00:00
2017-03-24 18:47:50 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : FansOk , _progress , 3 , true , 2000 ) ;
2020-04-01 09:28:39 +00:00
_result = lcd_selfcheck_endstops ( ) ; //With TMC2130, only the Z probe is tested.
2017-03-24 18:47:50 +00:00
}
2018-03-28 14:13:54 +00:00
2016-07-22 13:28:01 +00:00
if ( _result )
{
2017-06-29 16:35:43 +00:00
//current_position[Z_AXIS] += 15; //move Z axis higher to avoid false triggering of Z end stop in case that we are very low - just above heatbed
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AxisX , _progress , 3 , true , 2000 ) ;
2017-11-16 17:02:11 +00:00
# ifdef TMC2130
2019-01-24 18:22:36 +00:00
_result = lcd_selfcheck_axis_sg ( X_AXIS ) ;
2017-11-16 17:02:11 +00:00
# else
2019-01-24 18:22:36 +00:00
_result = lcd_selfcheck_axis ( X_AXIS , X_MAX_POS ) ;
2017-11-16 17:02:11 +00:00
# endif //TMC2130
2017-03-24 18:47:50 +00:00
}
2019-01-24 18:22:36 +00:00
2017-03-24 18:47:50 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AxisX , _progress , 3 , true , 0 ) ;
2017-06-29 16:35:43 +00:00
2017-11-16 17:02:11 +00:00
# ifndef TMC2130
_result = lcd_selfcheck_pulleys ( X_AXIS ) ;
# endif
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
2016-07-22 13:28:01 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AxisY , _progress , 3 , true , 1500 ) ;
2017-11-16 17:02:11 +00:00
# ifdef TMC2130
2017-07-06 11:19:11 +00:00
_result = lcd_selfcheck_axis_sg ( Y_AXIS ) ;
2017-11-16 17:02:11 +00:00
# else
_result = lcd_selfcheck_axis ( Y_AXIS , Y_MAX_POS ) ;
# endif // TMC2130
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AxisZ , _progress , 3 , true , 0 ) ;
2017-11-16 17:02:11 +00:00
# ifndef TMC2130
_result = lcd_selfcheck_pulleys ( Y_AXIS ) ;
# endif // TMC2130
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
if ( _result )
{
2017-08-17 13:23:34 +00:00
# ifdef TMC2130
2017-07-06 11:19:11 +00:00
tmc2130_home_exit ( ) ;
2017-07-07 08:09:09 +00:00
enable_endstops ( false ) ;
2018-04-27 12:49:37 +00:00
# endif
2017-07-06 11:19:11 +00:00
//homeaxis(X_AXIS);
//homeaxis(Y_AXIS);
2020-04-20 07:55:14 +00:00
current_position [ X_AXIS ] = pgm_read_float ( bed_ref_points_4 ) ;
current_position [ Y_AXIS ] = pgm_read_float ( bed_ref_points_4 + 1 ) ;
2019-10-11 18:00:51 +00:00
# ifdef TMC2130
//current_position[X_AXIS] += 0;
current_position [ Y_AXIS ] + = 4 ;
# endif //TMC2130
2017-07-06 11:19:11 +00:00
current_position [ Z_AXIS ] = current_position [ Z_AXIS ] + 10 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-07-06 11:19:11 +00:00
st_synchronize ( ) ;
2019-10-11 18:00:51 +00:00
set_destination_to_current ( ) ;
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AxisZ , _progress , 3 , true , 1500 ) ;
2019-10-12 10:19:17 +00:00
# ifdef TMC2130
2020-04-02 11:44:44 +00:00
homeaxis ( Z_AXIS ) ; //In case of failure, the code gets stuck in this function.
2019-10-12 10:19:17 +00:00
# else
_result = lcd_selfcheck_axis ( Z_AXIS , Z_MAX_POS ) ;
# endif //TMC2130
2019-10-11 18:00:51 +00:00
//raise Z to not damage the bed during and hotend testing
current_position [ Z_AXIS ] + = 20 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2019-10-11 18:00:51 +00:00
st_synchronize ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-03-13 22:02:46 +00:00
# ifdef TMC2130
2018-02-20 18:02:55 +00:00
if ( _result )
{
2018-04-27 07:23:56 +00:00
current_position [ Z_AXIS ] = current_position [ Z_AXIS ] + 10 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2018-04-27 07:23:56 +00:00
st_synchronize ( ) ;
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Home , 0 , 2 , true , 0 ) ;
2018-02-22 19:50:34 +00:00
bool bres = tmc2130_home_calibrate ( X_AXIS ) ;
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Home , 1 , 2 , true , 0 ) ;
2018-02-22 19:50:34 +00:00
bres & = tmc2130_home_calibrate ( Y_AXIS ) ;
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Home , 2 , 2 , true , 0 ) ;
2018-02-22 19:50:34 +00:00
if ( bres )
eeprom_update_byte ( ( uint8_t * ) EEPROM_TMC2130_HOME_ENABLED , 1 ) ;
_result = bres ;
2018-02-20 18:02:55 +00:00
}
2018-03-13 22:02:46 +00:00
# endif //TMC2130
2018-02-20 18:02:55 +00:00
2016-07-22 13:28:01 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Bed , _progress , 3 , true , 2000 ) ;
2017-07-06 11:19:11 +00:00
_result = lcd_selfcheck_check_heater ( true ) ;
2016-07-22 13:28:01 +00:00
}
2019-01-24 18:22:36 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Hotend , _progress , 3 , true , 1000 ) ;
2019-01-24 19:03:37 +00:00
_result = lcd_selfcheck_check_heater ( false ) ;
2019-01-24 18:22:36 +00:00
}
2016-07-22 13:28:01 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : HotendOk , _progress , 3 , true , 2000 ) ; //nozzle ok
2019-01-21 20:39:38 +00:00
}
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2019-01-22 09:56:07 +00:00
if ( _result )
2019-01-21 20:39:38 +00:00
{
2019-01-25 16:57:24 +00:00
2019-01-22 09:56:07 +00:00
if ( mmu_enabled )
2019-01-25 16:57:24 +00:00
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Fsensor , _progress , 3 , true , 2000 ) ; //check filaments sensor
2019-01-22 09:56:07 +00:00
_result = selftest_irsensor ( ) ;
2019-01-25 16:57:24 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : FsensorOk , _progress , 3 , true , 2000 ) ; //fil sensor OK
2019-01-25 16:57:24 +00:00
}
2019-01-22 09:56:07 +00:00
} else
2019-01-21 20:39:38 +00:00
{
2019-01-24 00:12:30 +00:00
# ifdef PAT9125
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Fsensor , _progress , 3 , true , 2000 ) ; //check filaments sensor
2019-09-15 22:43:37 +00:00
_result = lcd_selftest_fsensor ( ) ;
2019-01-25 16:57:24 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : FsensorOk , _progress , 3 , true , 2000 ) ; //fil sensor OK
2019-01-25 16:57:24 +00:00
}
# endif //PAT9125
2020-06-03 14:14:56 +00:00
#if 0
// Intentionally disabled - that's why we moved the detection to runtime by just checking the two voltages.
// The idea is not to force the user to remove and insert the filament on an assembled printer.
//def IR_SENSOR_ANALOG
2019-09-15 22:43:37 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Fsensor , _progress , 3 , true , 2000 ) ; //check filament sensor
2020-06-03 14:14:56 +00:00
_result = lcd_selftest_IRsensor ( ) ;
2019-09-15 22:43:37 +00:00
if ( _result )
{
_progress = lcd_selftest_screen ( TestScreen : : FsensorOk , _progress , 3 , true , 2000 ) ; //filament sensor OK
}
# endif //IR_SENSOR_ANALOG
2019-01-21 20:39:38 +00:00
}
}
2019-01-25 16:57:24 +00:00
# endif //FILAMENT_SENSOR
2017-12-20 22:40:18 +00:00
if ( _result )
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : AllCorrect , _progress , 3 , true , 5000 ) ; //all correct
2016-07-22 13:28:01 +00:00
}
else
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( TestScreen : : Failed , _progress , 3 , true , 5000 ) ;
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
lcd_reset_alert_level ( ) ;
enquecommand_P ( PSTR ( " M84 " ) ) ;
2018-07-24 13:20:03 +00:00
lcd_update_enable ( true ) ;
2017-07-06 21:01:59 +00:00
2016-07-22 13:28:01 +00:00
if ( _result )
{
2019-05-07 10:23:09 +00:00
LCD_ALERTMESSAGERPGM ( _i ( " Self test OK " ) ) ; ////MSG_SELFTEST_OK
2016-07-22 13:28:01 +00:00
}
else
{
2018-05-23 14:37:08 +00:00
LCD_ALERTMESSAGERPGM ( _T ( MSG_SELFTEST_FAILED ) ) ;
2016-07-22 13:28:01 +00:00
}
2017-12-12 19:21:09 +00:00
# ifdef TMC2130
FORCE_HIGH_POWER_END ;
# endif // TMC2130
2019-10-31 17:07:20 +00:00
FORCE_BL_ON_END ;
KEEPALIVE_STATE ( NOT_BUSY ) ;
2017-11-07 15:49:04 +00:00
return ( _result ) ;
2016-07-22 13:28:01 +00:00
}
2017-11-16 17:02:11 +00:00
# ifdef TMC2130
2018-10-08 13:58:49 +00:00
static void reset_crash_det ( unsigned char axis ) {
2017-11-16 17:02:11 +00:00
current_position [ axis ] + = 10 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
if ( eeprom_read_byte ( ( uint8_t * ) EEPROM_CRASH_DET ) ) tmc2130_sg_stop_on_crash = true ;
}
2017-06-29 16:35:43 +00:00
2018-10-08 13:58:49 +00:00
static bool lcd_selfcheck_axis_sg ( unsigned char axis ) {
2017-11-16 17:02:11 +00:00
// each axis length is measured twice
2017-07-06 11:19:11 +00:00
float axis_length , current_position_init , current_position_final ;
float measured_axis_length [ 2 ] ;
2017-11-16 17:02:11 +00:00
float margin = 60 ;
2017-11-21 17:46:13 +00:00
float max_error_mm = 5 ;
2017-07-06 11:19:11 +00:00
switch ( axis ) {
case 0 : axis_length = X_MAX_POS ; break ;
case 1 : axis_length = Y_MAX_POS + 8 ; break ;
default : axis_length = 210 ; break ;
}
2017-11-16 17:02:11 +00:00
tmc2130_sg_stop_on_crash = false ;
2017-07-07 08:09:09 +00:00
tmc2130_home_exit ( ) ;
enable_endstops ( true ) ;
2017-11-21 17:46:13 +00:00
2020-03-31 21:33:08 +00:00
raise_z_above ( MESH_HOME_Z_SEARCH ) ;
st_synchronize ( ) ;
tmc2130_home_enter ( 1 < < axis ) ;
2017-11-21 17:46:13 +00:00
2017-11-16 17:02:11 +00:00
// first axis length measurement begin
2018-03-07 19:42:15 +00:00
2017-11-16 17:02:11 +00:00
current_position [ axis ] - = ( axis_length + margin ) ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-07-07 08:09:09 +00:00
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
2017-07-06 11:19:11 +00:00
2017-11-27 03:46:58 +00:00
tmc2130_sg_meassure_start ( axis ) ;
2017-11-16 17:02:11 +00:00
current_position_init = st_get_position_mm ( axis ) ;
2017-07-07 08:09:09 +00:00
2017-11-16 17:02:11 +00:00
current_position [ axis ] + = 2 * margin ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
2017-11-27 03:46:58 +00:00
2017-11-16 17:02:11 +00:00
current_position [ axis ] + = axis_length ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-07-06 21:01:59 +00:00
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
2017-07-06 11:19:11 +00:00
2017-11-27 03:46:58 +00:00
uint16_t sg1 = tmc2130_sg_meassure_stop ( ) ;
printf_P ( PSTR ( " %c AXIS SG1=%d \n " ) , ' X ' + axis , sg1 ) ;
eeprom_write_word ( ( ( uint16_t * ) ( ( axis = = X_AXIS ) ? EEPROM_BELTSTATUS_X : EEPROM_BELTSTATUS_Y ) ) , sg1 ) ;
2017-11-16 17:02:11 +00:00
current_position_final = st_get_position_mm ( axis ) ;
measured_axis_length [ 0 ] = abs ( current_position_final - current_position_init ) ;
2017-07-06 21:01:59 +00:00
2017-11-27 03:46:58 +00:00
2017-11-16 17:02:11 +00:00
// first measurement end and second measurement begin
2017-11-27 03:46:58 +00:00
2017-11-16 17:02:11 +00:00
current_position [ axis ] - = margin ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
2017-07-06 21:01:59 +00:00
2017-11-16 17:02:11 +00:00
current_position [ axis ] - = ( axis_length + margin ) ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2017-11-16 17:02:11 +00:00
st_synchronize ( ) ;
2017-11-08 13:25:31 +00:00
2017-11-16 17:02:11 +00:00
current_position_init = st_get_position_mm ( axis ) ;
measured_axis_length [ 1 ] = abs ( current_position_final - current_position_init ) ;
2017-11-27 03:46:58 +00:00
2020-03-31 21:33:08 +00:00
tmc2130_home_exit ( ) ;
2017-11-27 03:46:58 +00:00
2017-11-16 17:02:11 +00:00
//end of second measurement, now check for possible errors:
2018-03-07 19:42:15 +00:00
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 2 ; i + + ) { //check if measured axis length corresponds to expected length
2018-06-10 20:06:00 +00:00
printf_P ( _N ( " Measured axis length:%.3f \n " ) , measured_axis_length [ i ] ) ;
2017-07-06 11:19:11 +00:00
if ( abs ( measured_axis_length [ i ] - axis_length ) > max_error_mm ) {
2017-07-07 08:09:09 +00:00
enable_endstops ( false ) ;
2017-11-16 17:02:11 +00:00
2017-07-06 11:19:11 +00:00
const char * _error_1 ;
if ( axis = = X_AXIS ) _error_1 = " X " ;
if ( axis = = Y_AXIS ) _error_1 = " Y " ;
if ( axis = = Z_AXIS ) _error_1 = " Z " ;
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Axis , _error_1 , " " ) ;
2017-12-15 16:54:52 +00:00
current_position [ axis ] = 0 ;
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2017-11-16 17:02:11 +00:00
reset_crash_det ( axis ) ;
2020-03-31 21:33:08 +00:00
enable_endstops ( true ) ;
endstops_hit_on_purpose ( ) ;
2017-07-06 11:19:11 +00:00
return false ;
}
}
2018-06-10 20:06:00 +00:00
printf_P ( _N ( " Axis length difference:%.3f \n " ) , abs ( measured_axis_length [ 0 ] - measured_axis_length [ 1 ] ) ) ;
2017-07-06 11:19:11 +00:00
2017-11-16 17:02:11 +00:00
if ( abs ( measured_axis_length [ 0 ] - measured_axis_length [ 1 ] ) > 1 ) { //check if difference between first and second measurement is low
2017-07-06 11:19:11 +00:00
//loose pulleys
const char * _error_1 ;
if ( axis = = X_AXIS ) _error_1 = " X " ;
if ( axis = = Y_AXIS ) _error_1 = " Y " ;
if ( axis = = Z_AXIS ) _error_1 = " Z " ;
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Pulley , _error_1 , " " ) ;
2017-12-15 16:54:52 +00:00
current_position [ axis ] = 0 ;
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2017-11-16 17:02:11 +00:00
reset_crash_det ( axis ) ;
2020-03-31 21:33:08 +00:00
endstops_hit_on_purpose ( ) ;
2017-07-06 11:19:11 +00:00
return false ;
}
2017-12-15 16:54:52 +00:00
current_position [ axis ] = 0 ;
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2017-11-16 17:02:11 +00:00
reset_crash_det ( axis ) ;
2020-03-31 21:33:08 +00:00
endstops_hit_on_purpose ( ) ;
2017-07-06 11:19:11 +00:00
return true ;
}
2017-11-16 17:02:11 +00:00
# endif //TMC2130
2017-07-06 11:19:11 +00:00
2019-10-12 10:19:17 +00:00
# ifndef TMC2130
2017-07-06 11:19:11 +00:00
2016-07-22 13:28:01 +00:00
static bool lcd_selfcheck_axis ( int _axis , int _travel )
{
2018-03-28 14:13:54 +00:00
// printf_P(PSTR("lcd_selfcheck_axis %d, %d\n"), _axis, _travel);
2016-07-22 13:28:01 +00:00
bool _stepdone = false ;
bool _stepresult = false ;
int _progress = 0 ;
int _travel_done = 0 ;
int _err_endstop = 0 ;
int _lcd_refresh = 0 ;
_travel = _travel + ( _travel / 10 ) ;
2017-07-06 11:19:11 +00:00
2018-04-27 12:49:37 +00:00
if ( _axis = = X_AXIS ) {
current_position [ Z_AXIS ] + = 17 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2018-04-27 12:49:37 +00:00
}
2018-02-06 16:01:09 +00:00
do {
2017-03-24 18:47:50 +00:00
current_position [ _axis ] = current_position [ _axis ] - 1 ;
2016-07-22 13:28:01 +00:00
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2016-07-22 13:28:01 +00:00
st_synchronize ( ) ;
2018-03-28 14:13:54 +00:00
# ifdef TMC2130
2018-07-17 15:47:39 +00:00
if ( ( READ ( Z_MIN_PIN ) ^ ( bool ) Z_MIN_ENDSTOP_INVERTING ) )
2018-03-28 14:13:54 +00:00
# else //TMC2130
2018-07-17 15:47:39 +00:00
if ( ( READ ( X_MIN_PIN ) ^ ( bool ) X_MIN_ENDSTOP_INVERTING ) | |
( READ ( Y_MIN_PIN ) ^ ( bool ) Y_MIN_ENDSTOP_INVERTING ) | |
( READ ( Z_MIN_PIN ) ^ ( bool ) Z_MIN_ENDSTOP_INVERTING ) )
2018-03-28 14:13:54 +00:00
# endif //TMC2130
2016-07-22 13:28:01 +00:00
{
if ( _axis = = 0 )
{
2018-02-06 16:01:09 +00:00
_stepresult = ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) ? true : false ;
_err_endstop = ( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) ? 1 : 2 ;
2016-07-22 13:28:01 +00:00
}
if ( _axis = = 1 )
{
2018-02-06 16:01:09 +00:00
_stepresult = ( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) ? true : false ;
_err_endstop = ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) ? 0 : 2 ;
2016-07-22 13:28:01 +00:00
}
if ( _axis = = 2 )
{
2018-02-06 16:01:09 +00:00
_stepresult = ( ( READ ( Z_MIN_PIN ) ^ Z_MIN_ENDSTOP_INVERTING ) = = 1 ) ? true : false ;
_err_endstop = ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) ? 0 : 1 ;
2018-03-28 14:13:54 +00:00
printf_P ( PSTR ( " lcd_selfcheck_axis %d, %d \n " ) , _stepresult , _err_endstop ) ;
2017-03-24 18:47:50 +00:00
/*disable_x();
disable_y ( ) ;
disable_z ( ) ; */
2016-07-22 13:28:01 +00:00
}
_stepdone = true ;
}
if ( _lcd_refresh < 6 )
{
_lcd_refresh + + ;
}
else
{
2019-06-12 14:44:07 +00:00
_progress = lcd_selftest_screen ( static_cast < TestScreen > ( static_cast < int > ( TestScreen : : AxisX ) + _axis ) , _progress , 3 , false , 0 ) ;
2016-07-22 13:28:01 +00:00
_lcd_refresh = 0 ;
}
manage_heater ( ) ;
2017-03-24 18:47:50 +00:00
manage_inactivity ( true ) ;
2016-07-22 13:28:01 +00:00
2019-01-27 21:48:51 +00:00
//_delay(100);
2016-07-22 13:28:01 +00:00
( _travel_done < = _travel ) ? _travel_done + + : _stepdone = true ;
2018-02-06 16:01:09 +00:00
2016-07-22 13:28:01 +00:00
} while ( ! _stepdone ) ;
2017-03-24 18:47:50 +00:00
//current_position[_axis] = current_position[_axis] + 15;
2019-08-21 07:59:51 +00:00
//plan_buffer_line_curposXYZE(manual_feedrate[0] / 60, active_extruder);
2016-07-22 13:28:01 +00:00
if ( ! _stepresult )
{
const char * _error_1 ;
const char * _error_2 ;
if ( _axis = = X_AXIS ) _error_1 = " X " ;
if ( _axis = = Y_AXIS ) _error_1 = " Y " ;
if ( _axis = = Z_AXIS ) _error_1 = " Z " ;
if ( _err_endstop = = 0 ) _error_2 = " X " ;
if ( _err_endstop = = 1 ) _error_2 = " Y " ;
if ( _err_endstop = = 2 ) _error_2 = " Z " ;
2018-03-28 14:13:54 +00:00
2016-07-22 13:28:01 +00:00
if ( _travel_done > = _travel )
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Endstop , _error_1 , _error_2 ) ;
2016-07-22 13:28:01 +00:00
}
else
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Motor , _error_1 , _error_2 ) ;
2016-07-22 13:28:01 +00:00
}
2019-10-11 18:00:51 +00:00
}
current_position [ _axis ] = 0 ; //simulate axis home to avoid negative numbers for axis position, especially Z.
2020-06-01 15:51:28 +00:00
plan_set_position_curposXYZE ( ) ;
2016-07-22 13:28:01 +00:00
return _stepresult ;
}
2017-03-24 18:47:50 +00:00
static bool lcd_selfcheck_pulleys ( int axis )
{
float tmp_motor_loud [ 3 ] = DEFAULT_PWM_MOTOR_CURRENT_LOUD ;
float tmp_motor [ 3 ] = DEFAULT_PWM_MOTOR_CURRENT ;
2018-02-06 16:01:09 +00:00
float current_position_init ;
2017-03-24 18:47:50 +00:00
float move ;
bool endstop_triggered = false ;
int i ;
unsigned long timeout_counter ;
refresh_cmd_timeout ( ) ;
manage_inactivity ( true ) ;
if ( axis = = 0 ) move = 50 ; //X_AXIS
2018-02-06 16:01:09 +00:00
else move = 50 ; //Y_AXIS
2017-03-24 18:47:50 +00:00
2018-02-06 16:01:09 +00:00
current_position_init = current_position [ axis ] ;
current_position [ axis ] + = 2 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2018-02-06 16:01:09 +00:00
for ( i = 0 ; i < 5 ; i + + ) {
refresh_cmd_timeout ( ) ;
current_position [ axis ] = current_position [ axis ] + move ;
2018-03-29 21:01:13 +00:00
st_current_set ( 0 , 850 ) ; //set motor current higher
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( 200 ) ;
2018-02-06 16:01:09 +00:00
st_synchronize ( ) ;
2018-04-25 18:47:19 +00:00
if ( SilentModeMenu ! = SILENT_MODE_OFF ) st_current_set ( 0 , tmp_motor [ 0 ] ) ; //set back to normal operation currents
2018-03-29 21:01:13 +00:00
else st_current_set ( 0 , tmp_motor_loud [ 0 ] ) ; //set motor current back
2018-02-06 16:01:09 +00:00
current_position [ axis ] = current_position [ axis ] - move ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( 50 ) ;
2018-02-06 16:01:09 +00:00
st_synchronize ( ) ;
if ( ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) ) {
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Pulley , ( axis = = 0 ) ? " X " : " Y " , " " ) ;
2018-02-06 16:01:09 +00:00
return ( false ) ;
}
}
2019-01-27 21:48:51 +00:00
timeout_counter = _millis ( ) + 2500 ;
2018-02-06 16:01:09 +00:00
endstop_triggered = false ;
manage_inactivity ( true ) ;
while ( ! endstop_triggered ) {
if ( ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) ) {
endstop_triggered = true ;
if ( current_position_init - 1 < = current_position [ axis ] & & current_position_init + 1 > = current_position [ axis ] ) {
2020-04-20 07:55:14 +00:00
current_position [ axis ] + = 10 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2020-04-20 07:55:14 +00:00
st_synchronize ( ) ;
2018-02-06 16:01:09 +00:00
return ( true ) ;
}
else {
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Pulley , ( axis = = 0 ) ? " X " : " Y " , " " ) ;
2017-03-24 18:47:50 +00:00
return ( false ) ;
}
}
2018-02-06 16:01:09 +00:00
else {
current_position [ axis ] - = 1 ;
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2018-02-06 16:01:09 +00:00
st_synchronize ( ) ;
2019-01-27 21:48:51 +00:00
if ( _millis ( ) > timeout_counter ) {
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Pulley , ( axis = = 0 ) ? " X " : " Y " , " " ) ;
2018-02-06 16:01:09 +00:00
return ( false ) ;
2017-03-24 18:47:50 +00:00
}
2018-02-06 16:01:09 +00:00
}
}
return ( true ) ;
2017-03-24 18:47:50 +00:00
}
2020-04-01 09:28:39 +00:00
# endif //not defined TMC2130
2018-03-13 19:43:19 +00:00
2017-03-24 18:47:50 +00:00
static bool lcd_selfcheck_endstops ( )
2018-02-06 16:01:09 +00:00
{
2017-03-24 18:47:50 +00:00
bool _result = true ;
2020-04-01 09:28:39 +00:00
if (
# ifndef TMC2130
( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
2018-02-06 16:01:09 +00:00
( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
2020-04-01 09:28:39 +00:00
# endif //!TMC2130
2018-02-06 16:01:09 +00:00
( ( READ ( Z_MIN_PIN ) ^ Z_MIN_ENDSTOP_INVERTING ) = = 1 ) )
2017-03-24 18:47:50 +00:00
{
2020-04-01 09:28:39 +00:00
# ifndef TMC2130
2018-02-06 16:01:09 +00:00
if ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) current_position [ 0 ] + = 10 ;
if ( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) current_position [ 1 ] + = 10 ;
2020-04-01 09:28:39 +00:00
# endif //!TMC2130
2018-02-06 16:01:09 +00:00
if ( ( READ ( Z_MIN_PIN ) ^ Z_MIN_ENDSTOP_INVERTING ) = = 1 ) current_position [ 2 ] + = 10 ;
2017-03-24 18:47:50 +00:00
}
2020-06-01 15:51:28 +00:00
plan_buffer_line_curposXYZE ( manual_feedrate [ 0 ] / 60 ) ;
2020-04-01 09:28:39 +00:00
st_synchronize ( ) ;
2017-03-24 18:47:50 +00:00
2020-04-01 09:28:39 +00:00
if (
# ifndef TMC2130
( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
2018-02-06 16:01:09 +00:00
( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) | |
2020-04-01 09:28:39 +00:00
# endif //!TMC2130
2018-02-06 16:01:09 +00:00
( ( READ ( Z_MIN_PIN ) ^ Z_MIN_ENDSTOP_INVERTING ) = = 1 ) )
2017-03-24 18:47:50 +00:00
{
_result = false ;
2017-06-28 12:24:45 +00:00
char _error [ 4 ] = " " ;
2020-04-01 09:28:39 +00:00
# ifndef TMC2130
2018-02-06 16:01:09 +00:00
if ( ( READ ( X_MIN_PIN ) ^ X_MIN_ENDSTOP_INVERTING ) = = 1 ) strcat ( _error , " X " ) ;
if ( ( READ ( Y_MIN_PIN ) ^ Y_MIN_ENDSTOP_INVERTING ) = = 1 ) strcat ( _error , " Y " ) ;
2020-04-01 09:28:39 +00:00
# endif //!TMC2130
2018-02-06 16:01:09 +00:00
if ( ( READ ( Z_MIN_PIN ) ^ Z_MIN_ENDSTOP_INVERTING ) = = 1 ) strcat ( _error , " Z " ) ;
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Endstops , _error , " " ) ;
2017-03-24 18:47:50 +00:00
}
manage_heater ( ) ;
manage_inactivity ( true ) ;
return _result ;
}
2016-07-22 13:28:01 +00:00
static bool lcd_selfcheck_check_heater ( bool _isbed )
{
int _counter = 0 ;
int _progress = 0 ;
bool _stepresult = false ;
bool _docycle = true ;
int _checked_snapshot = ( _isbed ) ? degBed ( ) : degHotend ( 0 ) ;
int _opposite_snapshot = ( _isbed ) ? degHotend ( 0 ) : degBed ( ) ;
2017-06-29 16:35:43 +00:00
int _cycles = ( _isbed ) ? 180 : 60 ; //~ 90s / 30s
2016-07-22 13:28:01 +00:00
2017-06-29 16:35:43 +00:00
target_temperature [ 0 ] = ( _isbed ) ? 0 : 200 ;
2016-07-22 13:28:01 +00:00
target_temperature_bed = ( _isbed ) ? 100 : 0 ;
manage_heater ( ) ;
2017-03-24 18:47:50 +00:00
manage_inactivity ( true ) ;
2017-12-14 18:36:32 +00:00
KEEPALIVE_STATE ( NOT_BUSY ) ; //we are sending temperatures on serial line, so no need to send host keepalive messages
2016-07-22 13:28:01 +00:00
do {
_counter + + ;
2017-06-29 16:35:43 +00:00
_docycle = ( _counter < _cycles ) ? true : false ;
2016-07-22 13:28:01 +00:00
manage_heater ( ) ;
2017-03-24 18:47:50 +00:00
manage_inactivity ( true ) ;
2019-06-12 14:44:07 +00:00
_progress = ( _isbed ) ? lcd_selftest_screen ( TestScreen : : Bed , _progress , 2 , false , 400 ) : lcd_selftest_screen ( TestScreen : : Hotend , _progress , 2 , false , 400 ) ;
2017-06-29 16:35:43 +00:00
/*if (_isbed) {
MYSERIAL . print ( " Bed temp: " ) ;
MYSERIAL . println ( degBed ( ) ) ;
}
else {
MYSERIAL . print ( " Hotend temp: " ) ;
MYSERIAL . println ( degHotend ( 0 ) ) ;
} */
2017-12-14 18:36:32 +00:00
if ( _counter % 5 = = 0 ) serialecho_temperatures ( ) ; //show temperatures once in two seconds
2016-07-22 13:28:01 +00:00
2017-06-29 16:35:43 +00:00
} while ( _docycle ) ;
2016-07-22 13:28:01 +00:00
target_temperature [ 0 ] = 0 ;
target_temperature_bed = 0 ;
manage_heater ( ) ;
int _checked_result = ( _isbed ) ? degBed ( ) - _checked_snapshot : degHotend ( 0 ) - _checked_snapshot ;
int _opposite_result = ( _isbed ) ? degHotend ( 0 ) - _opposite_snapshot : degBed ( ) - _opposite_snapshot ;
2017-06-29 16:35:43 +00:00
/*
MYSERIAL . println ( " " ) ;
MYSERIAL . print ( " Checked result: " ) ;
MYSERIAL . println ( _checked_result ) ;
MYSERIAL . print ( " Opposite result: " ) ;
MYSERIAL . println ( _opposite_result ) ;
*/
2019-01-24 20:02:04 +00:00
if ( _opposite_result < ( ( _isbed ) ? 30 : 9 ) )
2016-07-22 13:28:01 +00:00
{
2019-01-24 20:02:04 +00:00
if ( _checked_result > = ( ( _isbed ) ? 9 : 30 ) )
2016-07-22 13:28:01 +00:00
{
_stepresult = true ;
}
else
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Heater , " " , " " ) ;
2016-07-22 13:28:01 +00:00
}
}
else
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : Bed , " " , " " ) ;
2016-07-22 13:28:01 +00:00
}
manage_heater ( ) ;
2017-03-24 18:47:50 +00:00
manage_inactivity ( true ) ;
2017-12-14 18:36:32 +00:00
KEEPALIVE_STATE ( IN_HANDLER ) ;
2016-07-22 13:28:01 +00:00
return _stepresult ;
}
2019-03-21 21:48:57 +00:00
static void lcd_selftest_error ( TestError testError , const char * _error_1 , const char * _error_2 )
2016-07-22 13:28:01 +00:00
{
2018-07-16 02:13:26 +00:00
lcd_beeper_quick_feedback ( ) ;
2019-10-31 17:07:20 +00:00
FORCE_BL_ON_END ;
2016-07-22 13:28:01 +00:00
target_temperature [ 0 ] = 0 ;
target_temperature_bed = 0 ;
manage_heater ( ) ;
manage_inactivity ( ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Selftest error ! " ) ) ; ////MSG_SELFTEST_ERROR
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Please check : " ) ) ; ////MSG_SELFTEST_PLEASECHECK
2016-07-22 13:28:01 +00:00
2019-03-21 21:48:57 +00:00
switch ( testError )
2016-07-22 13:28:01 +00:00
{
2019-06-12 16:53:09 +00:00
case TestError : : Heater :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Heater/Thermistor " ) ) ; ////MSG_SELFTEST_HEATERTHERMISTOR
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Not connected " ) ) ; ////MSG_SELFTEST_NOTCONNECTED
2016-07-22 13:28:01 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Bed :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Bed / Heater " ) ) ; ////MSG_SELFTEST_BEDHEATER
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_WIRINGERROR ) ) ;
2016-07-22 13:28:01 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Endstops :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Endstops " ) ) ; ////MSG_SELFTEST_ENDSTOPS
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_WIRINGERROR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 17 , 3 ) ;
lcd_print ( _error_1 ) ;
2016-07-22 13:28:01 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Motor :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_MOTOR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 2 ) ;
lcd_print ( _error_1 ) ;
lcd_set_cursor ( 0 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Endstop " ) ) ; ////MSG_SELFTEST_ENDSTOP
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_2 ) ;
2016-07-22 13:28:01 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Endstop :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2020-05-12 20:23:40 +00:00
lcd_puts_P ( _i ( " Endstop not hit " ) ) ; ////MSG_SELFTEST_ENDSTOP_NOTHIT c=20
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_MOTOR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2016-07-22 13:28:01 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : PrintFan :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_COOLING_FAN ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_WIRINGERROR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2017-03-24 18:47:50 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : ExtruderFan :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_EXTRUDER_FAN ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_WIRINGERROR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2017-03-24 18:47:50 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Pulley :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _i ( " Loose pulley " ) ) ; ////MSG_LOOSE_PULLEY c=20 r=1
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_MOTOR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2017-03-24 18:47:50 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : Axis :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Axis length " ) ) ; ////MSG_SELFTEST_AXIS_LENGTH
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Axis " ) ) ; ////MSG_SELFTEST_AXIS
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2017-07-06 11:19:11 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : SwappedFan :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Front/left fans " ) ) ; ////MSG_SELFTEST_FANS
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_P ( _i ( " Swapped " ) ) ; ////MSG_SELFTEST_SWAPPED
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( _error_1 ) ;
2017-12-14 18:36:32 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : WiringFsensor :
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ;
2019-03-21 22:36:59 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_FILAMENT_SENSOR ) ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 3 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( _T ( MSG_SELFTEST_WIRINGERROR ) ) ;
2017-12-20 22:40:18 +00:00
break ;
2019-06-12 16:53:09 +00:00
case TestError : : TriggeringFsensor :
2019-09-15 22:43:37 +00:00
lcd_set_cursor ( 0 , 2 ) ;
lcd_puts_P ( _T ( MSG_SELFTEST_FILAMENT_SENSOR ) ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_puts_P ( _i ( " False triggering " ) ) ; ////c=20
break ;
case TestError : : FsensorLevel :
lcd_set_cursor ( 0 , 2 ) ;
lcd_puts_P ( _T ( MSG_SELFTEST_FILAMENT_SENSOR ) ) ;
lcd_set_cursor ( 0 , 3 ) ;
lcd_printf_P ( _i ( " %s level expected " ) , _error_1 ) ; ////c=20
break ;
2016-07-22 13:28:01 +00:00
}
2019-01-27 21:48:51 +00:00
_delay ( 1000 ) ;
2018-07-16 02:13:26 +00:00
lcd_beeper_quick_feedback ( ) ;
2016-07-22 13:28:01 +00:00
do {
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2016-07-22 13:28:01 +00:00
manage_heater ( ) ;
manage_inactivity ( ) ;
} while ( ! lcd_clicked ( ) ) ;
2018-05-23 14:37:08 +00:00
LCD_ALERTMESSAGERPGM ( _T ( MSG_SELFTEST_FAILED ) ) ;
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2017-03-24 18:47:50 +00:00
2018-07-20 21:48:00 +00:00
# ifdef FILAMENT_SENSOR
2019-03-01 16:21:13 +00:00
# ifdef PAT9125
2018-07-20 21:48:00 +00:00
static bool lcd_selftest_fsensor ( void )
{
2017-12-20 22:40:18 +00:00
fsensor_init ( ) ;
if ( fsensor_not_responding )
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : WiringFsensor , " " , " " ) ;
2017-12-20 22:40:18 +00:00
}
2018-07-20 21:48:00 +00:00
return ( ! fsensor_not_responding ) ;
2017-12-20 22:40:18 +00:00
}
2019-03-01 16:21:13 +00:00
# endif //PAT9125
2019-01-22 09:56:07 +00:00
2019-01-22 13:05:08 +00:00
//! @brief Self-test of infrared barrier filament sensor mounted on MK3S with MMUv2 printer
//!
//! Test whether sensor is not triggering filament presence when extruder idler is moving without filament.
//!
//! Steps:
//! * Backup current active extruder temperature
//! * Pre-heat to PLA extrude temperature.
//! * Unload filament possibly present.
2019-01-22 13:54:06 +00:00
//! * Move extruder idler same way as during filament load
2019-01-25 17:01:17 +00:00
//! and sample IR_SENSOR_PIN.
2019-01-22 13:54:06 +00:00
//! * Check that pin doesn't go low.
2019-01-22 13:05:08 +00:00
//!
//! @retval true passed
//! @retval false failed
2019-01-22 09:56:07 +00:00
static bool selftest_irsensor ( )
{
class TempBackup
{
public :
TempBackup ( ) :
m_temp ( degTargetHotend ( active_extruder ) ) ,
m_extruder ( active_extruder ) { }
~ TempBackup ( ) { setTargetHotend ( m_temp , m_extruder ) ; }
private :
float m_temp ;
uint8_t m_extruder ;
} ;
2019-01-24 20:24:46 +00:00
uint8_t progress ;
{
TempBackup tempBackup ;
setTargetHotend ( ABS_PREHEAT_HOTEND_TEMP , active_extruder ) ;
mmu_wait_for_heater_blocking ( ) ;
2019-06-12 14:44:07 +00:00
progress = lcd_selftest_screen ( TestScreen : : Fsensor , 0 , 1 , true , 0 ) ;
2019-01-24 20:24:46 +00:00
mmu_filament_ramming ( ) ;
}
2019-06-12 14:44:07 +00:00
progress = lcd_selftest_screen ( TestScreen : : Fsensor , progress , 1 , true , 0 ) ;
2019-02-13 00:51:39 +00:00
mmu_command ( MmuCmd : : U0 ) ;
2019-01-22 13:54:06 +00:00
manage_response ( false , false ) ;
2019-01-22 09:56:07 +00:00
for ( uint_least8_t i = 0 ; i < 200 ; + + i )
{
2019-06-12 14:44:07 +00:00
if ( 0 = = ( i % 32 ) ) progress = lcd_selftest_screen ( TestScreen : : Fsensor , progress , 1 , true , 0 ) ;
2019-01-22 17:03:03 +00:00
2019-01-22 09:56:07 +00:00
mmu_load_step ( false ) ;
while ( blocks_queued ( ) )
{
2019-03-21 22:36:59 +00:00
if ( PIN_GET ( IR_SENSOR_PIN ) = = 0 )
{
2019-06-12 16:53:09 +00:00
lcd_selftest_error ( TestError : : TriggeringFsensor , " " , " " ) ;
2019-03-21 22:36:59 +00:00
return false ;
}
2019-01-22 09:56:07 +00:00
# ifdef TMC2130
manage_heater ( ) ;
// Vojtech: Don't disable motors inside the planner!
if ( ! tmc2130_update_sg ( ) )
{
manage_inactivity ( true ) ;
}
# else //TMC2130
manage_heater ( ) ;
// Vojtech: Don't disable motors inside the planner!
manage_inactivity ( true ) ;
# endif //TMC2130
}
}
return true ;
}
2018-07-20 21:48:00 +00:00
# endif //FILAMENT_SENSOR
2017-12-20 22:40:18 +00:00
2019-05-10 06:52:24 +00:00
static bool lcd_selftest_manual_fan_check ( int _fan , bool check_opposite ,
bool _default )
2018-01-10 15:40:06 +00:00
{
bool _result = check_opposite ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-01-10 15:40:06 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN ) ) ;
2019-05-10 06:52:24 +00:00
2018-01-10 15:40:06 +00:00
switch ( _fan )
{
2018-02-06 16:01:09 +00:00
case 0 :
2018-01-10 15:40:06 +00:00
// extruder cooling fan
2019-05-10 06:52:24 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2018-07-16 16:08:01 +00:00
if ( check_opposite = = true ) lcd_puts_P ( _T ( MSG_SELFTEST_COOLING_FAN ) ) ;
else lcd_puts_P ( _T ( MSG_SELFTEST_EXTRUDER_FAN ) ) ;
2020-06-01 15:58:15 +00:00
setExtruderAutoFanState ( 3 ) ;
2018-01-10 15:40:06 +00:00
break ;
2018-02-06 16:01:09 +00:00
case 1 :
2018-01-10 15:40:06 +00:00
// object cooling fan
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2018-07-16 16:08:01 +00:00
if ( check_opposite = = true ) lcd_puts_P ( _T ( MSG_SELFTEST_EXTRUDER_FAN ) ) ;
else lcd_puts_P ( _T ( MSG_SELFTEST_COOLING_FAN ) ) ;
2018-01-10 15:40:06 +00:00
SET_OUTPUT ( FAN_PIN ) ;
2019-02-01 12:29:50 +00:00
# ifdef FAN_SOFT_PWM
fanSpeedSoftPwm = 255 ;
# else //FAN_SOFT_PWM
2018-01-10 15:40:06 +00:00
analogWrite ( FAN_PIN , 255 ) ;
2019-02-01 12:29:50 +00:00
# endif //FAN_SOFT_PWM
2018-01-10 15:40:06 +00:00
break ;
}
2019-01-27 21:48:51 +00:00
_delay ( 500 ) ;
2018-01-10 15:40:06 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 1 , 2 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_YES ) ) ;
lcd_set_cursor ( 0 , 3 ) ; lcd_print ( " > " ) ;
lcd_set_cursor ( 1 , 3 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_NO ) ) ;
2018-01-10 15:40:06 +00:00
2019-05-10 06:52:24 +00:00
int8_t enc_dif = int ( _default ) * 3 ;
2018-01-10 15:40:06 +00:00
KEEPALIVE_STATE ( PAUSED_FOR_USER ) ;
2018-04-12 16:24:30 +00:00
2019-05-10 06:52:24 +00:00
lcd_button_pressed = false ;
2018-01-10 15:40:06 +00:00
do
{
2018-07-16 00:13:52 +00:00
if ( abs ( ( enc_dif - lcd_encoder_diff ) ) > 2 ) {
if ( enc_dif > lcd_encoder_diff ) {
2018-01-10 15:40:06 +00:00
_result = ! check_opposite ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ; lcd_print ( " > " ) ;
lcd_set_cursor ( 1 , 2 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_YES ) ) ;
lcd_set_cursor ( 0 , 3 ) ; lcd_print ( " " ) ;
lcd_set_cursor ( 1 , 3 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_NO ) ) ;
2018-01-10 15:40:06 +00:00
}
2018-07-16 00:13:52 +00:00
if ( enc_dif < lcd_encoder_diff ) {
2018-01-10 15:40:06 +00:00
_result = check_opposite ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 2 ) ; lcd_print ( " " ) ;
lcd_set_cursor ( 1 , 2 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_YES ) ) ;
lcd_set_cursor ( 0 , 3 ) ; lcd_print ( " > " ) ;
lcd_set_cursor ( 1 , 3 ) ; lcd_puts_P ( _T ( MSG_SELFTEST_FAN_NO ) ) ;
2018-01-10 15:40:06 +00:00
}
enc_dif = 0 ;
2018-07-16 00:13:52 +00:00
lcd_encoder_diff = 0 ;
2018-01-10 15:40:06 +00:00
}
manage_heater ( ) ;
2019-01-27 21:48:51 +00:00
_delay ( 100 ) ;
2018-01-10 15:40:06 +00:00
} while ( ! lcd_clicked ( ) ) ;
KEEPALIVE_STATE ( IN_HANDLER ) ;
2020-06-01 15:58:15 +00:00
setExtruderAutoFanState ( 0 ) ;
2018-01-10 15:40:06 +00:00
SET_OUTPUT ( FAN_PIN ) ;
2019-02-01 12:29:50 +00:00
# ifdef FAN_SOFT_PWM
fanSpeedSoftPwm = 0 ;
# else //FAN_SOFT_PWM
2018-01-10 15:40:06 +00:00
analogWrite ( FAN_PIN , 0 ) ;
2019-02-01 12:29:50 +00:00
# endif //FAN_SOFT_PWM
2018-01-10 15:40:06 +00:00
fanSpeed = 0 ;
manage_heater ( ) ;
return _result ;
}
2019-02-06 15:15:19 +00:00
# ifdef FANCHECK
2019-05-13 14:25:47 +00:00
static FanCheck lcd_selftest_fan_auto ( int _fan )
2017-03-24 18:47:50 +00:00
{
2017-06-28 12:24:45 +00:00
switch ( _fan ) {
case 0 :
fanSpeed = 0 ;
manage_heater ( ) ; //turn off fan
2020-06-01 15:58:15 +00:00
setExtruderAutoFanState ( 3 ) ; //extruder fan
2019-02-05 03:02:38 +00:00
# ifdef FAN_SOFT_PWM
extruder_autofan_last_check = _millis ( ) ;
2019-02-06 21:56:10 +00:00
fan_measuring = true ;
2019-02-05 03:02:38 +00:00
# endif //FAN_SOFT_PWM
2020-06-01 15:58:15 +00:00
_delay ( 2000 ) ;
setExtruderAutoFanState ( 0 ) ; //extruder fan
2017-06-28 12:24:45 +00:00
manage_heater ( ) ; //count average fan speed from 2s delay and turn off fans
2019-02-06 21:56:10 +00:00
2019-02-05 03:02:38 +00:00
printf_P ( PSTR ( " Test 1: \n " ) ) ;
printf_P ( PSTR ( " Print fan speed: %d \n " ) , fan_speed [ 1 ] ) ;
printf_P ( PSTR ( " Extr fan speed: %d \n " ) , fan_speed [ 0 ] ) ;
2019-05-13 14:25:47 +00:00
2020-06-05 14:37:21 +00:00
if ( fan_speed [ 0 ] < 20 ) { // < 1200 RPM would mean either a faulty Noctua or Altfan
2019-06-12 15:19:19 +00:00
return FanCheck : : ExtruderFan ;
2019-05-13 14:25:47 +00:00
}
# ifdef FAN_SOFT_PWM
else if ( fan_speed [ 0 ] > 50 ) { // printerFan is faster
2019-06-12 15:19:19 +00:00
return FanCheck : : SwappedFan ;
2019-05-13 14:25:47 +00:00
}
2017-06-28 12:24:45 +00:00
break ;
2019-05-13 14:25:47 +00:00
# endif
2017-03-24 18:47:50 +00:00
case 1 :
2017-06-28 12:24:45 +00:00
//will it work with Thotend > 50 C ?
2019-05-10 06:52:24 +00:00
# ifdef FAN_SOFT_PWM
fanSpeed = 255 ;
fanSpeedSoftPwm = 255 ;
2019-02-06 11:37:18 +00:00
extruder_autofan_last_check = _millis ( ) ; //store time when measurement starts
fan_measuring = true ; //start fan measuring, rest is on manage_heater
2019-02-05 03:02:38 +00:00
# else //FAN_SOFT_PWM
2017-12-14 18:36:32 +00:00
fanSpeed = 150 ; //print fan
2019-02-05 03:02:38 +00:00
# endif //FAN_SOFT_PWM
2017-12-14 18:36:32 +00:00
for ( uint8_t i = 0 ; i < 5 ; i + + ) {
delay_keep_alive ( 1000 ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( " - " ) ;
2017-12-14 18:36:32 +00:00
delay_keep_alive ( 1000 ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( " | " ) ;
2017-12-14 18:36:32 +00:00
}
2019-02-05 03:02:38 +00:00
fanSpeed = 0 ;
2019-05-13 14:25:47 +00:00
# ifdef FAN_SOFT_PWM
fanSpeedSoftPwm = 0 ;
2019-02-05 03:02:38 +00:00
# else //FAN_SOFT_PWM
2017-06-28 12:24:45 +00:00
manage_heater ( ) ; //turn off fan
manage_inactivity ( true ) ; //to turn off print fan
2019-02-05 03:02:38 +00:00
# endif //FAN_SOFT_PWM
printf_P ( PSTR ( " Test 2: \n " ) ) ;
printf_P ( PSTR ( " Print fan speed: %d \n " ) , fan_speed [ 1 ] ) ;
printf_P ( PSTR ( " Extr fan speed: %d \n " ) , fan_speed [ 0 ] ) ;
2017-06-28 12:24:45 +00:00
if ( ! fan_speed [ 1 ] ) {
2019-06-12 15:19:19 +00:00
return FanCheck : : PrintFan ;
2017-06-28 12:24:45 +00:00
}
2019-05-13 14:25:47 +00:00
# ifdef FAN_SOFT_PWM
fanSpeed = 80 ;
fanSpeedSoftPwm = 80 ;
for ( uint8_t i = 0 ; i < 5 ; i + + ) {
delay_keep_alive ( 1000 ) ;
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( " - " ) ;
delay_keep_alive ( 1000 ) ;
lcd_set_cursor ( 18 , 3 ) ;
lcd_print ( " | " ) ;
2017-12-14 18:36:32 +00:00
}
2019-05-13 14:25:47 +00:00
fanSpeed = 0 ;
2017-12-14 18:36:32 +00:00
2019-05-13 14:25:47 +00:00
// noctua speed is between 17 and 24, turbine more then 30
if ( fan_speed [ 1 ] < 30 ) {
2019-06-12 15:19:19 +00:00
return FanCheck : : SwappedFan ;
2019-05-13 14:25:47 +00:00
}
# else
// fan is spinning, but measured RPM are too low for print fan, it must
// be left extruder fan
else if ( fan_speed [ 1 ] < 34 ) {
2019-06-12 15:19:19 +00:00
return FanCheck : : SwappedFan ;
2019-05-13 14:25:47 +00:00
}
# endif //FAN_SOFT_PWM
2017-03-24 18:47:50 +00:00
break ;
}
2019-06-12 15:19:19 +00:00
return FanCheck : : Success ;
2017-03-24 18:47:50 +00:00
}
2019-02-06 15:15:19 +00:00
# endif //FANCHECK
2019-06-12 14:44:07 +00:00
static int lcd_selftest_screen ( TestScreen screen , int _progress , int _progress_scale , bool _clear , int _delay )
2016-07-22 13:28:01 +00:00
{
2017-06-29 16:35:43 +00:00
2020-06-01 15:51:28 +00:00
lcd_update_enable ( false ) ;
2016-07-22 13:28:01 +00:00
2019-01-22 18:01:55 +00:00
const char * _indicator = ( _progress > = _progress_scale ) ? " - " : " | " ;
2016-07-22 13:28:01 +00:00
2018-07-16 15:54:16 +00:00
if ( _clear ) lcd_clear ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 0 ) ;
2016-07-22 13:28:01 +00:00
2019-06-12 14:44:07 +00:00
if ( screen = = TestScreen : : ExtruderFan ) lcd_puts_P ( _T ( MSG_SELFTEST_FAN ) ) ;
if ( screen = = TestScreen : : PrintFan ) lcd_puts_P ( _T ( MSG_SELFTEST_FAN ) ) ;
if ( screen = = TestScreen : : FansOk ) lcd_puts_P ( _T ( MSG_SELFTEST_FAN ) ) ;
if ( screen = = TestScreen : : EndStops ) lcd_puts_P ( _i ( " Checking endstops " ) ) ; ////MSG_SELFTEST_CHECK_ENDSTOPS c=20
if ( screen = = TestScreen : : AxisX ) lcd_puts_P ( _i ( " Checking X axis " ) ) ; ////MSG_SELFTEST_CHECK_X c=20
if ( screen = = TestScreen : : AxisY ) lcd_puts_P ( _i ( " Checking Y axis " ) ) ; ////MSG_SELFTEST_CHECK_Y c=20
if ( screen = = TestScreen : : AxisZ ) lcd_puts_P ( _i ( " Checking Z axis " ) ) ; ////MSG_SELFTEST_CHECK_Z c=20
if ( screen = = TestScreen : : Bed ) lcd_puts_P ( _T ( MSG_SELFTEST_CHECK_BED ) ) ;
if ( screen = = TestScreen : : Hotend
| | screen = = TestScreen : : HotendOk ) lcd_puts_P ( _i ( " Checking hotend " ) ) ; ////MSG_SELFTEST_CHECK_HOTEND c=20
if ( screen = = TestScreen : : Fsensor ) lcd_puts_P ( _T ( MSG_SELFTEST_CHECK_FSENSOR ) ) ;
if ( screen = = TestScreen : : FsensorOk ) lcd_puts_P ( _T ( MSG_SELFTEST_CHECK_FSENSOR ) ) ;
if ( screen = = TestScreen : : AllCorrect ) lcd_puts_P ( _i ( " All correct " ) ) ; ////MSG_SELFTEST_CHECK_ALLCORRECT c=20
if ( screen = = TestScreen : : Failed ) lcd_puts_P ( _T ( MSG_SELFTEST_FAILED ) ) ;
if ( screen = = TestScreen : : Home ) lcd_puts_P ( _i ( " Calibrating home " ) ) ; ////c=20 r=1
2016-07-22 13:28:01 +00:00
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 0 , 1 ) ;
2018-07-16 16:08:01 +00:00
lcd_puts_P ( separator ) ;
2019-06-12 14:44:07 +00:00
if ( ( screen > = TestScreen : : ExtruderFan ) & & ( screen < = TestScreen : : FansOk ) )
2017-03-24 18:47:50 +00:00
{
2017-06-28 12:24:45 +00:00
//SERIAL_ECHOLNPGM("Fan test");
2019-05-07 10:23:09 +00:00
lcd_puts_at_P ( 0 , 2 , _i ( " Extruder fan: " ) ) ; ////MSG_SELFTEST_EXTRUDER_FAN_SPEED c=18
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 2 ) ;
2019-06-12 14:44:07 +00:00
( screen < TestScreen : : PrintFan ) ? lcd_print ( _indicator ) : lcd_print ( " OK " ) ;
2019-05-07 10:23:09 +00:00
lcd_puts_at_P ( 0 , 3 , _i ( " Print fan: " ) ) ; ////MSG_SELFTEST_PRINT_FAN_SPEED c=18
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 3 ) ;
2019-06-12 14:44:07 +00:00
( screen < TestScreen : : FansOk ) ? lcd_print ( _indicator ) : lcd_print ( " OK " ) ;
2017-06-29 16:35:43 +00:00
}
2019-06-12 14:44:07 +00:00
else if ( screen > = TestScreen : : Fsensor & & screen < = TestScreen : : FsensorOk )
2017-12-20 22:40:18 +00:00
{
2019-03-21 22:36:59 +00:00
lcd_puts_at_P ( 0 , 2 , _T ( MSG_SELFTEST_FILAMENT_SENSOR ) ) ;
lcd_putc ( ' : ' ) ;
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( 18 , 2 ) ;
2019-06-12 14:44:07 +00:00
( screen = = TestScreen : : Fsensor ) ? lcd_print ( _indicator ) : lcd_print ( " OK " ) ;
2017-12-20 22:40:18 +00:00
}
2019-06-12 14:44:07 +00:00
else if ( screen < TestScreen : : Fsensor )
2017-06-28 12:24:45 +00:00
{
//SERIAL_ECHOLNPGM("Other tests");
2016-07-22 13:28:01 +00:00
2020-06-01 15:51:28 +00:00
TestScreen _step_block = TestScreen : : AxisX ;
2019-01-25 19:00:12 +00:00
lcd_selftest_screen_step ( 2 , 2 , ( ( screen = = _step_block ) ? 1 : ( screen < _step_block ) ? 0 : 2 ) , " X " , _indicator ) ;
2016-07-22 13:28:01 +00:00
2019-06-12 14:44:07 +00:00
_step_block = TestScreen : : AxisY ;
2019-01-25 19:00:12 +00:00
lcd_selftest_screen_step ( 2 , 8 , ( ( screen = = _step_block ) ? 1 : ( screen < _step_block ) ? 0 : 2 ) , " Y " , _indicator ) ;
2016-07-22 13:28:01 +00:00
2019-06-12 14:44:07 +00:00
_step_block = TestScreen : : AxisZ ;
2019-01-25 19:00:12 +00:00
lcd_selftest_screen_step ( 2 , 14 , ( ( screen = = _step_block ) ? 1 : ( screen < _step_block ) ? 0 : 2 ) , " Z " , _indicator ) ;
2016-07-22 13:28:01 +00:00
2019-06-12 14:44:07 +00:00
_step_block = TestScreen : : Bed ;
2019-01-25 19:00:12 +00:00
lcd_selftest_screen_step ( 3 , 0 , ( ( screen = = _step_block ) ? 1 : ( screen < _step_block ) ? 0 : 2 ) , " Bed " , _indicator ) ;
2019-01-24 18:22:36 +00:00
2020-06-01 15:51:28 +00:00
_step_block = TestScreen : : Hotend ;
lcd_selftest_screen_step ( 3 , 9 , ( ( screen = = _step_block ) ? 1 : ( screen < _step_block ) ? 0 : 2 ) , " Hotend " , _indicator ) ;
2017-03-24 18:47:50 +00:00
}
2016-07-22 13:28:01 +00:00
2017-12-13 13:55:53 +00:00
if ( _delay > 0 ) delay_keep_alive ( _delay ) ;
2016-07-22 13:28:01 +00:00
_progress + + ;
2019-01-22 18:01:55 +00:00
return ( _progress > = _progress_scale * 2 ) ? 0 : _progress ;
2016-07-22 13:28:01 +00:00
}
2017-06-29 16:35:43 +00:00
2016-07-22 13:28:01 +00:00
static void lcd_selftest_screen_step ( int _row , int _col , int _state , const char * _name , const char * _indicator )
{
2018-07-16 17:29:27 +00:00
lcd_set_cursor ( _col , _row ) ;
2016-07-22 13:28:01 +00:00
switch ( _state )
{
case 1 :
2018-07-16 17:29:27 +00:00
lcd_print ( _name ) ;
lcd_set_cursor ( _col + strlen ( _name ) , _row ) ;
lcd_print ( " : " ) ;
lcd_set_cursor ( _col + strlen ( _name ) + 1 , _row ) ;
lcd_print ( _indicator ) ;
2016-07-22 13:28:01 +00:00
break ;
case 2 :
2018-07-16 17:29:27 +00:00
lcd_print ( _name ) ;
lcd_set_cursor ( _col + strlen ( _name ) , _row ) ;
lcd_print ( " : " ) ;
lcd_set_cursor ( _col + strlen ( _name ) + 1 , _row ) ;
lcd_print ( " OK " ) ;
2016-07-22 13:28:01 +00:00
break ;
default :
2018-07-16 17:29:27 +00:00
lcd_print ( _name ) ;
2016-07-22 13:28:01 +00:00
}
}
/** End of menus **/
/** Menu action functions **/
2018-02-09 19:26:42 +00:00
2017-12-06 13:55:53 +00:00
static bool check_file ( const char * filename ) {
2018-03-28 15:00:17 +00:00
if ( farm_mode ) return true ;
2017-12-06 13:55:53 +00:00
bool result = false ;
uint32_t filesize ;
2017-12-08 18:22:02 +00:00
card . openFile ( ( char * ) filename , true ) ;
2017-12-06 13:55:53 +00:00
filesize = card . getFileSize ( ) ;
if ( filesize > END_FILE_SECTION ) {
card . setIndex ( filesize - END_FILE_SECTION ) ;
}
while ( ! card . eof ( ) & & ! result ) {
card . sdprinting = true ;
get_command ( ) ;
result = check_commands ( ) ;
}
card . printingHasFinished ( ) ;
2018-05-23 14:37:08 +00:00
strncpy_P ( lcd_status_message , _T ( WELCOME_MSG ) , LCD_WIDTH ) ;
2018-01-12 20:21:21 +00:00
lcd_finishstatus ( ) ;
2017-12-06 13:55:53 +00:00
return result ;
}
2018-10-08 13:58:49 +00:00
static void menu_action_sdfile ( const char * filename )
2016-07-22 13:28:01 +00:00
{
2017-03-24 18:47:50 +00:00
loading_flag = false ;
2016-07-22 13:28:01 +00:00
char cmd [ 30 ] ;
char * c ;
2017-12-06 13:55:53 +00:00
bool result = true ;
2016-07-22 13:28:01 +00:00
sprintf_P ( cmd , PSTR ( " M23 %s " ) , filename ) ;
for ( c = & cmd [ 4 ] ; * c ; c + + )
* c = tolower ( * c ) ;
2017-12-07 16:16:23 +00:00
2018-06-13 18:55:15 +00:00
const char end [ 5 ] = " .gco " ;
2018-06-12 12:35:25 +00:00
//we are storing just first 8 characters of 8.3 filename assuming that extension is always ".gco"
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < 8 ; i + + ) {
2019-07-17 08:30:49 +00:00
if ( strcmp ( ( cmd + i + 4 ) , end ) = = 0 ) {
2018-06-12 12:35:25 +00:00
//filename is shorter then 8.3, store '\0' character on position where ".gco" string was found to terminate stored string properly
eeprom_write_byte ( ( uint8_t * ) EEPROM_FILENAME + i , ' \0 ' ) ;
2018-06-12 13:06:11 +00:00
break ;
2018-06-12 12:35:25 +00:00
}
else {
eeprom_write_byte ( ( uint8_t * ) EEPROM_FILENAME + i , cmd [ i + 4 ] ) ;
}
2017-12-07 16:16:23 +00:00
}
uint8_t depth = ( uint8_t ) card . getWorkDirDepth ( ) ;
eeprom_write_byte ( ( uint8_t * ) EEPROM_DIR_DEPTH , depth ) ;
2019-06-12 13:01:57 +00:00
for ( uint_least8_t i = 0 ; i < depth ; i + + ) {
for ( uint_least8_t j = 0 ; j < 8 ; j + + ) {
2017-12-07 16:16:23 +00:00
eeprom_write_byte ( ( uint8_t * ) EEPROM_DIRS + j + 8 * i , dir_names [ i ] [ j ] ) ;
}
}
2017-12-06 13:55:53 +00:00
if ( ! check_file ( filename ) ) {
2020-05-12 20:23:40 +00:00
result = lcd_show_fullscreen_message_yes_no_and_wait_P ( _i ( " File incomplete. Continue anyway? " ) , false , false ) ; ////MSG_FILE_INCOMPLETE c=20 r=3
2017-12-06 13:55:53 +00:00
lcd_update_enable ( true ) ;
2017-07-02 19:01:23 +00:00
}
2017-12-06 13:55:53 +00:00
if ( result ) {
enquecommand ( cmd ) ;
enquecommand_P ( PSTR ( " M24 " ) ) ;
2017-11-27 05:20:51 +00:00
}
2016-07-22 13:28:01 +00:00
lcd_return_to_status ( ) ;
}
2018-07-16 02:13:26 +00:00
2018-10-08 13:58:49 +00:00
void menu_action_sddirectory ( const char * filename )
2016-07-22 13:28:01 +00:00
{
2017-11-27 05:20:51 +00:00
uint8_t depth = ( uint8_t ) card . getWorkDirDepth ( ) ;
strcpy ( dir_names [ depth ] , filename ) ;
MYSERIAL . println ( dir_names [ depth ] ) ;
2016-07-22 13:28:01 +00:00
card . chdir ( filename ) ;
2018-07-16 00:13:52 +00:00
lcd_encoder = 0 ;
2016-07-22 13:28:01 +00:00
}
/** LCD API **/
2017-03-24 18:47:50 +00:00
2018-07-16 21:23:15 +00:00
void ultralcd_init ( )
2016-07-22 13:28:01 +00:00
{
2018-08-10 14:10:49 +00:00
{
uint8_t autoDepleteRaw = eeprom_read_byte ( reinterpret_cast < uint8_t * > ( EEPROM_AUTO_DEPLETE ) ) ;
2018-08-27 17:36:54 +00:00
if ( 0xff = = autoDepleteRaw ) lcd_autoDeplete = false ;
else lcd_autoDeplete = autoDepleteRaw ;
2018-08-10 14:10:49 +00:00
}
2019-10-11 16:06:37 +00:00
backlight_init ( ) ;
2018-07-16 21:23:15 +00:00
lcd_init ( ) ;
2018-07-16 21:54:46 +00:00
lcd_refresh ( ) ;
2018-07-16 00:13:52 +00:00
lcd_longpress_func = menu_lcd_longpress_func ;
lcd_charsetup_func = menu_lcd_charsetup_func ;
lcd_lcdupdate_func = menu_lcd_lcdupdate_func ;
menu_menu = lcd_status_screen ;
2018-07-16 21:54:46 +00:00
menu_lcd_charsetup_func ( ) ;
2016-07-22 13:28:01 +00:00
SET_INPUT ( BTN_EN1 ) ;
SET_INPUT ( BTN_EN2 ) ;
WRITE ( BTN_EN1 , HIGH ) ;
WRITE ( BTN_EN2 , HIGH ) ;
# if BTN_ENC > 0
SET_INPUT ( BTN_ENC ) ;
WRITE ( BTN_ENC , HIGH ) ;
# endif
# if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0)
pinMode ( SDCARDDETECT , INPUT ) ;
WRITE ( SDCARDDETECT , HIGH ) ;
lcd_oldcardstatus = IS_SD_INSERTED ;
# endif //(SDCARDDETECT > 0)
2018-07-16 00:13:52 +00:00
lcd_encoder_diff = 0 ;
2016-07-22 13:28:01 +00:00
}
2017-03-24 18:47:50 +00:00
void lcd_printer_connected ( ) {
printer_connected = true ;
2016-07-22 13:28:01 +00:00
}
2018-03-15 13:25:17 +00:00
static void lcd_send_status ( ) {
2019-01-27 21:48:51 +00:00
if ( farm_mode & & no_response & & ( ( _millis ( ) - NcTime ) > ( NC_TIME * 1000 ) ) ) {
2018-03-15 13:25:17 +00:00
//send important status messages periodicaly
prusa_statistics ( important_status , saved_filament_type ) ;
2019-01-27 21:48:51 +00:00
NcTime = _millis ( ) ;
2018-06-25 15:29:34 +00:00
# ifdef FARM_CONNECT_MESSAGE
2018-03-15 13:25:17 +00:00
lcd_connect_printer ( ) ;
2018-06-25 15:29:34 +00:00
# endif //FARM_CONNECT_MESSAGE
2018-03-15 13:25:17 +00:00
}
2018-03-23 14:53:44 +00:00
}
2018-03-15 13:25:17 +00:00
2018-10-08 13:58:49 +00:00
# ifdef FARM_CONNECT_MESSAGE
2018-03-15 13:25:17 +00:00
static void lcd_connect_printer ( ) {
lcd_update_enable ( false ) ;
2018-07-16 15:54:16 +00:00
lcd_clear ( ) ;
2018-03-15 13:25:17 +00:00
int i = 0 ;
int t = 0 ;
lcd_set_custom_characters_progress ( ) ;
2018-07-16 17:29:27 +00:00
lcd_puts_at_P ( 0 , 0 , _i ( " Connect printer to " ) ) ;
lcd_puts_at_P ( 0 , 1 , _i ( " monitoring or hold " ) ) ;
lcd_puts_at_P ( 0 , 2 , _i ( " the knob to continue " ) ) ;
2018-03-15 13:25:17 +00:00
while ( no_response ) {
i + + ;
t + + ;
delay_keep_alive ( 100 ) ;
proc_commands ( ) ;
if ( t = = 10 ) {
prusa_statistics ( important_status , saved_filament_type ) ;
t = 0 ;
}
if ( READ ( BTN_ENC ) ) { //if button is not pressed
i = 0 ;
2018-07-16 17:29:27 +00:00
lcd_puts_at_P ( 0 , 3 , PSTR ( " " ) ) ;
2018-03-15 13:25:17 +00:00
}
2018-07-16 17:29:27 +00:00
if ( i ! = 0 ) lcd_puts_at_P ( ( i * 20 ) / ( NC_BUTTON_LONG_PRESS * 10 ) , 3 , " \x01 " ) ;
2018-03-15 13:25:17 +00:00
if ( i = = NC_BUTTON_LONG_PRESS * 10 ) {
no_response = false ;
}
}
lcd_set_custom_characters_degree ( ) ;
lcd_update_enable ( true ) ;
lcd_update ( 2 ) ;
}
2018-10-08 13:58:49 +00:00
# endif //FARM_CONNECT_MESSAGE
2018-03-15 13:25:17 +00:00
2017-03-24 18:47:50 +00:00
void lcd_ping ( ) { //chceck if printer is connected to monitoring when in farm mode
if ( farm_mode ) {
bool empty = is_buffer_empty ( ) ;
2019-01-27 21:48:51 +00:00
if ( ( _millis ( ) - PingTime ) * 0.001 > ( empty ? PING_TIME : PING_TIME_LONG ) ) { //if commands buffer is empty use shorter time period
2017-03-24 18:47:50 +00:00
//if there are comamnds in buffer, some long gcodes can delay execution of ping command
//therefore longer period is used
printer_connected = false ;
}
else {
lcd_printer_connected ( ) ;
}
}
}
2016-07-22 13:28:01 +00:00
void lcd_ignore_click ( bool b )
{
ignore_click = b ;
wait_for_unclick = false ;
}
void lcd_finishstatus ( ) {
int len = strlen ( lcd_status_message ) ;
if ( len > 0 ) {
while ( len < LCD_WIDTH ) {
lcd_status_message [ len + + ] = ' ' ;
}
}
lcd_status_message [ LCD_WIDTH ] = ' \0 ' ;
2018-07-16 00:13:52 +00:00
lcd_draw_update = 2 ;
2016-07-22 13:28:01 +00:00
}
void lcd_setstatus ( const char * message )
{
if ( lcd_status_message_level > 0 )
return ;
strncpy ( lcd_status_message , message , LCD_WIDTH ) ;
lcd_finishstatus ( ) ;
}
2019-05-24 06:46:44 +00:00
void lcd_updatestatuspgm ( const char * message ) {
strncpy_P ( lcd_status_message , message , LCD_WIDTH ) ;
lcd_status_message [ LCD_WIDTH ] = 0 ;
lcd_finishstatus ( ) ;
// hack lcd_draw_update to 1, i.e. without clear
lcd_draw_update = 1 ;
}
2016-07-22 13:28:01 +00:00
void lcd_setstatuspgm ( const char * message )
{
if ( lcd_status_message_level > 0 )
return ;
2019-05-24 06:46:44 +00:00
lcd_updatestatuspgm ( message ) ;
2016-07-22 13:28:01 +00:00
}
void lcd_setalertstatuspgm ( const char * message )
{
lcd_setstatuspgm ( message ) ;
lcd_status_message_level = 1 ;
lcd_return_to_status ( ) ;
}
void lcd_reset_alert_level ( )
{
lcd_status_message_level = 0 ;
}
2017-09-22 18:43:30 +00:00
uint8_t get_message_level ( )
{
return lcd_status_message_level ;
}
2016-07-22 13:28:01 +00:00
2018-07-16 00:13:52 +00:00
void menu_lcd_longpress_func ( void )
2016-07-22 13:28:01 +00:00
{
2019-10-31 17:07:20 +00:00
backlight_wake ( ) ;
2019-08-05 16:22:56 +00:00
if ( homing_flag | | mesh_bed_leveling_flag | | menu_menu = = lcd_babystep_z | | menu_menu = = lcd_move_z )
2019-04-23 18:24:04 +00:00
{
2019-08-05 16:22:56 +00:00
// disable longpress during re-entry, while homing or calibration
lcd_quick_feedback ( ) ;
2019-04-23 18:24:04 +00:00
return ;
}
2019-10-01 08:51:02 +00:00
// explicitely listed menus which are allowed to rise the move-z or live-adj-z functions
// The lists are not the same for both functions, so first decide which function is to be performed
2019-10-01 13:31:01 +00:00
if ( ( moves_planned ( ) | | IS_SD_PRINTING | | is_usb_printing ) ) { // long press as live-adj-z
if ( ( current_position [ Z_AXIS ] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU ) // only allow live-adj-z up to 2mm of print height
& & ( menu_menu = = lcd_status_screen // and in listed menus...
| | menu_menu = = lcd_main_menu
| | menu_menu = = lcd_tune_menu
| | menu_menu = = lcd_support_menu
)
2019-10-01 08:51:02 +00:00
) {
lcd_clear ( ) ;
menu_submenu ( lcd_babystep_z ) ;
} else {
// otherwise consume the long press as normal click
2019-10-01 15:13:36 +00:00
if ( menu_menu ! = lcd_status_screen )
menu_back ( ) ;
2019-10-01 08:51:02 +00:00
}
} else { // long press as move-z
if ( menu_menu = = lcd_status_screen
| | menu_menu = = lcd_main_menu
| | menu_menu = = lcd_preheat_menu
| | menu_menu = = lcd_sdcard_menu
| | menu_menu = = lcd_settings_menu
| | menu_menu = = lcd_control_temperature_menu
# if (LANG_MODE != 0)
| | menu_menu = = lcd_language
# endif
| | menu_menu = = lcd_support_menu
) {
move_menu_scale = 1.0 ;
menu_submenu ( lcd_move_z ) ;
} else {
// otherwise consume the long press as normal click
2019-10-01 15:13:36 +00:00
if ( menu_menu ! = lcd_status_screen )
menu_back ( ) ;
2019-10-01 08:51:02 +00:00
}
2019-04-23 18:24:04 +00:00
}
2018-07-16 00:13:52 +00:00
}
void menu_lcd_charsetup_func ( void )
2016-07-22 13:28:01 +00:00
{
2018-07-16 00:13:52 +00:00
if ( menu_menu = = lcd_status_screen )
lcd_set_custom_characters_degree ( ) ;
else
lcd_set_custom_characters_arrows ( ) ;
2016-07-22 13:28:01 +00:00
}
2018-07-22 14:26:12 +00:00
static inline bool z_menu_expired ( )
{
2018-07-23 07:14:22 +00:00
return ( menu_menu = = lcd_babystep_z
2018-07-22 14:26:12 +00:00
& & lcd_timeoutToStatus . expired ( LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z ) ) ;
}
static inline bool other_menu_expired ( )
{
2018-07-23 07:14:22 +00:00
return ( menu_menu ! = lcd_status_screen
& & menu_menu ! = lcd_babystep_z
2018-07-22 14:26:12 +00:00
& & lcd_timeoutToStatus . expired ( LCD_TIMEOUT_TO_STATUS ) ) ;
}
static inline bool forced_menu_expire ( )
{
2018-07-23 07:14:22 +00:00
bool retval = ( menu_menu ! = lcd_status_screen
2018-07-22 14:26:12 +00:00
& & forceMenuExpire ) ;
forceMenuExpire = false ;
return retval ;
}
2018-07-16 00:13:52 +00:00
void menu_lcd_lcdupdate_func ( void )
2016-07-22 13:28:01 +00:00
{
2018-07-16 00:13:52 +00:00
# if (SDCARDDETECT > 0)
2018-07-19 14:57:31 +00:00
if ( ( IS_SD_INSERTED ! = lcd_oldcardstatus ) )
{
lcd_draw_update = 2 ;
lcd_oldcardstatus = IS_SD_INSERTED ;
lcd_refresh ( ) ; // to maybe revive the LCD if static electricity killed it.
2019-10-30 19:11:19 +00:00
backlight_wake ( ) ;
2018-07-19 14:57:31 +00:00
if ( lcd_oldcardstatus )
{
card . initsd ( ) ;
2019-01-24 16:32:57 +00:00
LCD_MESSAGERPGM ( _T ( WELCOME_MSG ) ) ;
bMain = false ; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
menu_submenu ( lcd_sdcard_menu ) ;
2018-07-19 14:57:31 +00:00
//get_description();
}
else
{
2019-03-06 18:51:26 +00:00
if ( menu_menu = = lcd_sdcard_menu )
menu_back ( ) ;
2018-07-19 14:57:31 +00:00
card . release ( ) ;
2019-05-07 10:23:09 +00:00
LCD_MESSAGERPGM ( _i ( " Card removed " ) ) ; ////MSG_SD_REMOVED
2018-07-19 14:57:31 +00:00
}
}
2018-07-16 00:13:52 +00:00
# endif //CARDINSERTED
2019-10-11 16:06:37 +00:00
backlight_update ( ) ;
2019-01-27 21:48:51 +00:00
if ( lcd_next_update_millis < _millis ( ) )
2018-07-19 14:57:31 +00:00
{
if ( abs ( lcd_encoder_diff ) > = ENCODER_PULSES_PER_STEP )
{
if ( lcd_draw_update = = 0 )
lcd_draw_update = 1 ;
lcd_encoder + = lcd_encoder_diff / ENCODER_PULSES_PER_STEP ;
2019-06-10 13:03:52 +00:00
Sound_MakeSound ( e_SOUND_TYPE_EncoderMove ) ;
2018-07-19 14:57:31 +00:00
lcd_encoder_diff = 0 ;
2018-07-22 14:26:12 +00:00
lcd_timeoutToStatus . start ( ) ;
2019-10-31 17:07:20 +00:00
backlight_wake ( ) ;
2018-07-19 14:57:31 +00:00
}
2016-07-22 13:28:01 +00:00
2019-10-13 11:31:43 +00:00
if ( LCD_CLICKED )
{
lcd_timeoutToStatus . start ( ) ;
2019-10-31 17:07:20 +00:00
backlight_wake ( ) ;
2019-10-13 11:31:43 +00:00
}
2016-07-22 13:28:01 +00:00
2018-07-19 14:57:31 +00:00
( * menu_menu ) ( ) ;
2016-07-22 13:28:01 +00:00
2018-07-22 14:26:12 +00:00
if ( z_menu_expired ( ) | | other_menu_expired ( ) | | forced_menu_expire ( ) )
2018-07-19 14:57:31 +00:00
{
2018-08-19 11:59:33 +00:00
// Exiting a menu. Let's call the menu function the last time with menu_leaving flag set to true
2018-07-19 14:57:31 +00:00
// to give it a chance to save its state.
// This is useful for example, when the babystep value has to be written into EEPROM.
if ( menu_menu ! = NULL )
{
2018-08-19 11:59:33 +00:00
menu_leaving = 1 ;
2018-07-19 14:57:31 +00:00
( * menu_menu ) ( ) ;
2018-08-19 11:59:33 +00:00
menu_leaving = 0 ;
2018-07-19 14:57:31 +00:00
}
lcd_clear ( ) ;
lcd_return_to_status ( ) ;
lcd_draw_update = 2 ;
}
if ( lcd_draw_update = = 2 ) lcd_clear ( ) ;
if ( lcd_draw_update ) lcd_draw_update - - ;
2019-01-27 21:48:51 +00:00
lcd_next_update_millis = _millis ( ) + LCD_UPDATE_INTERVAL ;
2018-07-19 14:57:31 +00:00
}
2018-07-16 00:13:52 +00:00
if ( ! SdFatUtil : : test_stack_integrity ( ) ) stack_error ( ) ;
lcd_ping ( ) ; //check that we have received ping command if we are in farm mode
lcd_send_status ( ) ;
2019-06-12 16:19:41 +00:00
if ( lcd_commands_type = = LcdCommands : : Layer1Cal ) lcd_commands ( ) ;
2016-07-22 13:28:01 +00:00
}
2019-08-20 15:22:27 +00:00
# ifdef TMC2130
//! @brief Is crash detection enabled?
//!
//! @retval true crash detection enabled
//! @retval false crash detection disabled
bool lcd_crash_detect_enabled ( )
{
return eeprom_read_byte ( ( uint8_t * ) EEPROM_CRASH_DET ) ;
}
void lcd_crash_detect_enable ( )
{
tmc2130_sg_stop_on_crash = true ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_CRASH_DET , 0xFF ) ;
}
void lcd_crash_detect_disable ( )
{
tmc2130_sg_stop_on_crash = false ;
tmc2130_sg_crash = 0 ;
eeprom_update_byte ( ( uint8_t * ) EEPROM_CRASH_DET , 0x00 ) ;
}
# endif