diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 27e83d42..584cfaf5 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,10 +5,12 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.1" +#define FW_version "3.0.2" +// The total size of the EEPROM is +// 4096 for the Atmega2560 #define EEPROM_SILENT 4095 #define EEPROM_LANG 4094 #define EEPROM_BABYSTEP_X 4092 @@ -17,8 +19,12 @@ #define EEPROM_BABYSTEP_Z_SET 4087 #define EEPROM_BABYSTEP_Z0 4085 #define EEPROM_FILAMENTUSED 4081 +// uint32_t #define EEPROM_TOTALTIME 4077 +#define EEPROM_BED_CALIBRATION_CENTER (EEPROM_TOTALTIME-2*4) +#define EEPROM_BED_CALIBRATION_VEC_X (EEPROM_BED_CALIBRATION_CENTER-2*4) +#define EEPROM_BED_CALIBRATION_VEC_Y (EEPROM_BED_CALIBRATION_VEC_X-2*4) // This configuration file contains the basic settings. diff --git a/Firmware/Firmware.sublime-project b/Firmware/Firmware.sublime-project new file mode 100644 index 00000000..a889c474 --- /dev/null +++ b/Firmware/Firmware.sublime-project @@ -0,0 +1,59 @@ +{ + "build_systems": + [ + { + "name": "compile", + "working_dir": "$project_path", + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + // Arduino build process: + // https://www.arduino.cc/en/Hacking/BuildProcess + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\arduino_debug.exe\" --pref build.path=..\\output --verify --board marlinAddon:avr:rambo -v --preserve-temp-files Firmware.ino" + }, + { + "name": "compile & upload", + "working_dir": "$project_path", + "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", + //FIXME + // Better to use avrdude directly? + // http://www.nongnu.org/avrdude/user-manual/avrdude_4.html + // avrdude -F -v -pm168 -cstk500v1 -P\\.\COM4 -b19200 -D -Uflash:w:"file.hex":i + // may need add path to avrdude config file: -C"c:\utils\arduino-0016\hardware\tools\avr\etc\avrdude.conf" if Arduino IDE installed in "c:\utils\arduino-0016\" + // https://typeunsafe.wordpress.com/2011/07/22/programming-arduino-with-avrdude/ + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\arduino_debug.exe\" --pref build.path=..\\output --upload --port COM6 --board marlinAddon:avr:rambo -v --preserve-temp-files Firmware.ino" + }, + { + "name": "map-data", + "working_dir": "$project_path", + // https://sourceware.org/binutils/docs-2.21/binutils/objdump.html + // Maybe it is better to generate map files by the linker? + // avr-gcc -g -mmcu=atmega8 -Wl,-Map,demo.map -o demo.elf demo.o + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr\\bin\\avr-objdump.exe\" -x -S -C -j .data ..\\output\\Firmware.ino.elf > ..\\output\\Firmware-data.map" + }, + { + "name": "map-bss", + "working_dir": "$project_path", + // https://sourceware.org/binutils/docs-2.21/binutils/objdump.html + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr\\bin\\avr-objdump.exe\" -x -S -C -j .bss ..\\output\\Firmware.ino.elf > ..\\output\\Firmware-bss.map" + }, + { + "name": "map-all", + "working_dir": "$project_path", + // https://sourceware.org/binutils/docs-2.21/binutils/objdump.html + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr\\bin\\avr-objdump.exe\" -x -S -C ..\\output\\Firmware.ino.elf > ..\\output\\Firmware-all.map" + }, + { + "name": "disassemble", + "working_dir": "$project_path", + // https://sourceware.org/binutils/docs-2.21/binutils/objdump.html + "shell_cmd": "\"c:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr\\bin\\avr-objdump.exe\" -h -w -S ..\\output\\Firmware.ino.elf > ..\\output\\Firmware.asm" + } + ], + "folders": + [ + { + "path": "." +// "folder_exclude_patterns": [".svn", "._d", ".metadata", ".settings"], +// "file_exclude_patterns": ["XS.c"] + } + ] +} diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index a05054ce..69b9a40c 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -250,6 +250,7 @@ extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in per extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder. extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner extern float current_position[NUM_AXIS] ; +extern float destination[NUM_AXIS] ; extern float add_homing[3]; #ifdef DELTA extern float endstop_adj[3]; @@ -322,3 +323,6 @@ extern void digipot_i2c_init(); extern void calculate_volumetric_multipliers(); +// Similar to the default Arduino delay function, +// but it keeps the background tasks running. +extern void delay_keep_alive(int ms); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1b210e7c..be0f792e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -46,6 +46,7 @@ #ifdef MESH_BED_LEVELING #include "mesh_bed_leveling.h" + #include "mesh_bed_calibration.h" #endif #include "ultralcd.h" @@ -247,6 +248,8 @@ int value; int babystepLoad[3]; float homing_feedrate[] = HOMING_FEEDRATE; +// Currently only the extruder axis may be switched to a relative mode. +// Other axes are always absolute or relative based on the common relative_mode flag. bool axis_relative_modes[] = AXIS_RELATIVE_MODES; int feedmultiply=100; //100->1 200->2 int saved_feedmultiply; @@ -260,8 +263,8 @@ int extruder_multiply[EXTRUDERS] = {100 #endif }; -bool is_usb_printing; -bool _doMeshL; +bool is_usb_printing = false; +bool _doMeshL = false; unsigned int usb_printing_counter; int lcd_change_fil_state = 0; @@ -406,20 +409,24 @@ const char echomagic[] PROGMEM = "echo:"; //=============================Private Variables============================= //=========================================================================== const char axis_codes[NUM_AXIS] = {'X', 'Y', 'Z', 'E'}; -static float destination[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0}; +float destination[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0}; #ifndef DELTA static float delta[3] = {0.0, 0.0, 0.0}; #endif +// For tracing an arc static float offset[3] = {0.0, 0.0, 0.0}; static bool home_all_axis = true; static float feedrate = 1500.0, next_feedrate, saved_feedrate; static long gcode_N, gcode_LastN, Stopped_gcode_LastN = 0; -static bool relative_mode = false; //Determines Absolute or Relative Coordinates +// Determines Absolute or Relative Coordinates. +// Also there is bool axis_relative_modes[] per axis flag. +static bool relative_mode = false; static char cmdbuffer[BUFSIZE][MAX_CMD_SIZE]; +// Marking a line in the cmdbuffer. If false, the command is confirmed by sending an "OK" on the serial line. static bool fromsd[BUFSIZE]; static int bufindr = 0; static int bufindw = 0; @@ -498,11 +505,6 @@ void serial_echopair_P(const char *s_P, unsigned long v) } #endif //!SDSUPPORT -#ifdef MESH_BED_LEVELING -static void find_bed(); -#endif - - //adds an command to the main command buffer //thats really done in a non-safe way. //needs overworking someday @@ -636,6 +638,20 @@ void setup() SERIAL_PROTOCOLLNPGM("start"); SERIAL_ECHO_START; +#if 0 + SERIAL_ECHOLN("Reading eeprom from 0 to 100: start"); + for (int i = 0; i < 4096; ++ i) { + int b = eeprom_read_byte((unsigned char*)i); + if (b != 255) { + SERIAL_ECHO(i); + SERIAL_ECHO(":"); + SERIAL_ECHO(b); + SERIAL_ECHOLN(""); + } + } + SERIAL_ECHOLN("Reading eeprom from 0 to 100: done"); + #endif + // Check startup - does nothing if bootloader sets MCUSR to 0 byte mcu = MCUSR; if(mcu & 1) SERIAL_ECHOLNRPGM(MSG_POWERUP); @@ -669,9 +685,6 @@ void setup() { fromsd[i] = false; } - - - // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) Config_RetrieveSettings(); @@ -995,7 +1008,9 @@ DEFINE_PGM_READ_ANY(signed char, byte); #define XYZ_CONSTS_FROM_CONFIG(type, array, CONFIG) \ static const PROGMEM type array##_P[3] = \ { X_##CONFIG, Y_##CONFIG, Z_##CONFIG }; \ -static inline type array(int axis) \ +static inline type array(int axis) \ + { return pgm_read_any(&array##_P[axis]); } \ +type array##_ext(int axis) \ { return pgm_read_any(&array##_P[axis]); } XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS); @@ -1506,6 +1521,7 @@ void process_commands() // PRUSA GCODES +/* if(code_seen('PRUSA')){ if(code_seen('Fir')){ @@ -1519,12 +1535,15 @@ void process_commands() lcd_force_language_selection(); } else if(code_seen('Lz')) { EEPROM_save_B(EEPROM_BABYSTEP_Z,0); - } else if (code_seen('Cal')) { - lcd_calibration(); - } + } + //else if (code_seen('Cal')) { + // lcd_calibration(); + // } } - else if(code_seen('G')) + else +*/ + if(code_seen('G')) { switch((int)code_value()) { @@ -1786,7 +1805,6 @@ void process_commands() mbl.active = 0; #endif - saved_feedrate = feedrate; saved_feedmultiply = feedmultiply; feedmultiply = 100; @@ -1939,15 +1957,17 @@ void process_commands() feedrate = max_feedrate[Z_AXIS]; plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate, active_extruder); st_synchronize(); - #endif + #endif // defined (Z_RAISE_BEFORE_HOMING) && (Z_RAISE_BEFORE_HOMING > 0) #ifdef MESH_BED_LEVELING // If Mesh bed leveling, moxve X&Y to safe position for home - if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] )) - { - HOMEAXIS(X); - HOMEAXIS(Y); - } - destination[X_AXIS] = MESH_MIN_X - X_PROBE_OFFSET_FROM_EXTRUDER; - destination[Y_AXIS] = MESH_MIN_Y - Y_PROBE_OFFSET_FROM_EXTRUDER; + if (!(axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] )) + { + HOMEAXIS(X); + HOMEAXIS(Y); + } + // 1st mesh bed leveling measurement point, corrected. + mbl.get_meas_xy(0, 0, destination[X_AXIS], destination[Y_AXIS], false); + // destination[X_AXIS] = MESH_MIN_X - X_PROBE_OFFSET_FROM_EXTRUDER; + // destination[Y_AXIS] = MESH_MIN_Y - Y_PROBE_OFFSET_FROM_EXTRUDER; destination[Z_AXIS] = MESH_HOME_Z_SEARCH; // Set destination away from bed feedrate = homing_feedrate[Z_AXIS]/10; current_position[Z_AXIS] = 0; @@ -1959,11 +1979,11 @@ void process_commands() current_position[Y_AXIS] = destination[Y_AXIS]; HOMEAXIS(Z); _doMeshL = true; - #else - HOMEAXIS(Z); - #endif + #else // MESH_BED_LEVELING + HOMEAXIS(Z); + #endif // MESH_BED_LEVELING } - #else // Z Safe mode activated. + #else // defined(Z_SAFE_HOMING): Z Safe mode activated. if(home_all_axis) { destination[X_AXIS] = round(Z_SAFE_HOMING_X_POINT - X_PROBE_OFFSET_FROM_EXTRUDER); destination[Y_AXIS] = round(Z_SAFE_HOMING_Y_POINT - Y_PROBE_OFFSET_FROM_EXTRUDER); @@ -2005,10 +2025,8 @@ void process_commands() SERIAL_ECHOLNRPGM(MSG_ZPROBE_OUT); } } - #endif - #endif - - + #endif // Z_SAFE_HOMING + #endif // Z_HOME_DIR < 0 if(code_seen(axis_codes[Z_AXIS])) { if(code_value_long() != 0) { @@ -2046,15 +2064,17 @@ void process_commands() } } #endif + #ifdef MESH_BED_LEVELING if (code_seen('W')) { _doMeshL = false; - SERIAL_ECHOLN("G80 disabled"); + SERIAL_ECHOLN("G80 disabled"); } if ( _doMeshL) { + st_synchronize(); enquecommand_P((PSTR("G80"))); } #endif @@ -2270,7 +2290,7 @@ void process_commands() // Firstly check if we know where we are if ( !( axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS] ) ){ // We don't know where we are! HOME! - enquecommand_P((PSTR("G28"))); + enquecommand_P((PSTR("G28 W0"))); enquecommand_P((PSTR("G80"))); break; } @@ -2278,13 +2298,13 @@ void process_commands() mbl.reset(); // Cycle through all points and probe them - current_position[X_AXIS] = MESH_MIN_X - X_PROBE_OFFSET_FROM_EXTRUDER; - current_position[Y_AXIS] = MESH_MIN_Y - Y_PROBE_OFFSET_FROM_EXTRUDER; - - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/30, active_extruder); - + // First move up. current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder); + // The move to the first calibration point. + mbl.get_meas_xy(0, 0, current_position[X_AXIS], current_position[Y_AXIS], false); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[X_AXIS]/30, active_extruder); + // Wait until the move is finished. st_synchronize(); int mesh_point = 0; @@ -2301,7 +2321,6 @@ void process_commands() // Move Z to proper distance current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], Z_LIFT_FEEDRATE, active_extruder); - st_synchronize(); // Get cords of measuring point @@ -2309,26 +2328,19 @@ void process_commands() iy = mesh_point / MESH_MEAS_NUM_X_POINTS; if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag - current_position[X_AXIS] = mbl.get_meas_x(ix); - current_position[Y_AXIS] = mbl.get_meas_y(iy); - - current_position[X_AXIS] -= X_PROBE_OFFSET_FROM_EXTRUDER; - current_position[Y_AXIS] -= Y_PROBE_OFFSET_FROM_EXTRUDER; + mbl.get_meas_xy(ix, iy, current_position[X_AXIS], current_position[Y_AXIS], false); + enable_endstops(false); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], XY_AXIS_FEEDRATE, active_extruder); - st_synchronize(); // Go down until endstop is hit - - find_bed(); - - - + find_bed_induction_sensor_point_z(); + mbl.set_z(ix, iy, current_position[Z_AXIS]); - if (!IS_SD_PRINTING) - { - custom_message_state--; - } + if (!IS_SD_PRINTING) + { + custom_message_state--; + } mesh_point++; } @@ -2343,16 +2355,14 @@ void process_commands() plan_buffer_line(current_position[X_AXIS], current_position[X_AXIS], current_position[Z_AXIS], current_position[E_AXIS], XY_AXIS_FEEDRATE, active_extruder); st_synchronize(); - if(card.sdprinting || is_usb_printing ) - { + if(card.sdprinting || is_usb_printing ) + { if(eeprom_read_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET) == 0x01) - { + { EEPROM_read_B(EEPROM_BABYSTEP_Z,&babystepLoad[2]); babystepsTodo[Z_AXIS] = babystepLoad[2]; } } - - } break; @@ -2388,7 +2398,7 @@ void process_commands() case 82: SERIAL_PROTOCOLLNPGM("Finding bed "); setup_for_endstop_move(); - find_bed(); + find_bed_induction_sensor_point_z(); clean_up_after_endstop_move(); SERIAL_PROTOCOLPGM("Bed found at: "); SERIAL_PROTOCOL_F(current_position[Z_AXIS], 5); @@ -2705,6 +2715,102 @@ void process_commands() } break; + case 44: + reset_bed_offset_and_skew(); + break; + + case 45: // M45: mesh_bed_calibration + { + // Firstly check if we know where we are + if ( !( axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) ){ + // We don't know where we are! HOME! + enquecommand_P((PSTR("G28 X0 Y0"))); + enquecommand_P((PSTR("M45"))); + break; + } + + setup_for_endstop_move(); + find_bed_offset_and_skew(); +// improve_bed_offset_and_skew(); + clean_up_after_endstop_move(); + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); + /* + current_position[X_AXIS] = X_MIN_POS+0.2; + current_position[Y_AXIS] = Y_MIN_POS+0.2; + current_position[Z_AXIS] = Z_MIN_POS; + plan_buffer_line(current_position[X_AXIS], current_position[X_AXIS], current_position[Z_AXIS], current_position[E_AXIS], XY_AXIS_FEEDRATE, active_extruder); + */ + st_synchronize(); + } + break; + + case 46: // M46: mesh_bed_calibration with manual Z up + { + // Firstly check if we know where we are + if ( !( axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) ){ + // We don't know where we are! HOME! + enquecommand_P((PSTR("G28 X0 Y0 W0"))); // W0 tells G28 to not perform mesh bed leveling. + enquecommand_P((PSTR("M46"))); + break; + } + + lcd_update_enable(false); + if (lcd_calibrate_z_end_stop_manual()) { + mbl.reset(); + setup_for_endstop_move(); + find_bed_offset_and_skew(); +// improve_bed_offset_and_skew(1); + clean_up_after_endstop_move(); + // Print head up. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); + st_synchronize(); + } + // lcd_update_enable(true); + //lcd_implementation_clear(); + //lcd_return_to_status(); + // lcd_update(); + // Mesh bed leveling. + // enquecommand_P((PSTR("G80"))); + // The iprovement. + + //enquecommand_P((PSTR("G80"))); + enquecommand_P((PSTR("G28 X0 Y0 W0"))); + enquecommand_P((PSTR("M47"))); + } + break; + + case 47: + { + // Firstly check if we know where we are + if ( !( axis_known_position[X_AXIS] && axis_known_position[Y_AXIS]) ) { + // We don't know where we are! HOME! + enquecommand_P((PSTR("G28 X0 Y0 W0"))); // W0 tells G28 to not perform mesh bed leveling. + enquecommand_P((PSTR("M47"))); + break; + } + lcd_update_enable(false); + mbl.reset(); + setup_for_endstop_move(); + bool success = improve_bed_offset_and_skew(1); + clean_up_after_endstop_move(); + // Print head up. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); + st_synchronize(); + lcd_update_enable(true); + lcd_update(); + if (success) + // Mesh bed leveling. + enquecommand_P((PSTR("G80"))); + break; + } + + // case 47: + // lcd_diag_show_end_stops(); + // break; + // M48 Z-Probe repeatability measurement function. // // Usage: M48 <n #_samples> <X X_position_for_samples> <Y Y_position_for_samples> <V Verbose_Level> <Engage_probe_for_each_reading> <L legs_of_movement_prior_to_doing_probe> @@ -4789,36 +4895,6 @@ void calculate_delta(float cartesian[3]) #ifdef MESH_BED_LEVELING - - static void find_bed() { - feedrate = homing_feedrate[Z_AXIS]; - - // move down until you find the bed - float zPosition = -10; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); - st_synchronize(); - - // we have to let the planner know where we are right now as it is not where we said to go. - zPosition = st_get_position_mm(Z_AXIS); - plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS]); - - // move up the retract distance - zPosition += home_retract_mm(Z_AXIS); - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); - st_synchronize(); - - // move back down slowly to find bed - feedrate = homing_feedrate[Z_AXIS]/4; - zPosition -= home_retract_mm(Z_AXIS) * 2; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); - st_synchronize(); - - current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); - // make sure the planner knows where we are as it may be a bit different than we last said to move to - plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); - } - - void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, const uint8_t extruder) { float dx = x - current_position[X_AXIS]; float dy = y - current_position[Y_AXIS]; @@ -5467,4 +5543,21 @@ void calculate_volumetric_multipliers() { #endif #endif } - + +void delay_keep_alive(int ms) +{ + for (;;) { + manage_heater(); + manage_inactivity(); + lcd_update(); + if (ms == 0) + break; + else if (ms >= 50) { + delay(50); + ms -= 50; + } else { + delay(ms); + ms = 0; + } + } +} diff --git a/Firmware/langtool.pl b/Firmware/langtool.pl new file mode 100644 index 00000000..a689f3b8 --- /dev/null +++ b/Firmware/langtool.pl @@ -0,0 +1,153 @@ +#!/usr/bin/perl +# Processes language_xx.h files into language.cpp and language.h + +use strict; +use warnings; + +my @langs = ("en","cz","it","es","pl"); + +sub parselang +{ + my ($filename) = @_; + open(my $fh, '<:encoding(UTF-8)', $filename) + or die "Could not open file '$filename' $!"; + # Create a new hash reference. + my $out = {}; + while (my $line = <$fh>) { + chomp $line; + next if (index($line, 'MSG') == -1); + $line =~ /(?is)\#define\s*(\S*)\s*(.*)/; + my $symbol = $1; + my $v = $2; + next if (! defined $symbol or length($symbol) == 0); + # Trim whitespaces from both sides + $v =~ s/^\s+|\s+$//g; + #$string =~ s/" MACHINE_NAME "/Prusa i3/; + $v =~ s/" FIRMWARE_URL "/https:\/\/github.com\/prusa3d\/Prusa-i3-Plus\//; + $v =~ s/" PROTOCOL_VERSION "/1.0/; + $v =~ s/" STRINGIFY\(EXTRUDERS\) "/1/; + $v =~ s/" MACHINE_UUID "/00000000-0000-0000-0000-000000000000/; + ${$out}{$symbol} = $v; + } + return $out; +} + +my %texts; +my $num_languages = 0; +foreach my $lang (@langs) { + my $symbols = parselang("language_$lang.h"); + foreach my $key (keys %{$symbols}) { + if (! (exists $texts{$key})) { + $texts{$key} = []; + } + my $strings = $texts{$key}; + die "Symbol $key defined first in $lang, undefined in the preceding language files." + if (scalar(@$strings) != $num_languages); + push @$strings, ${$symbols}{$key}; + } + $num_languages += 1; + foreach my $key (keys %texts) { + my $strings = $texts{$key}; + if (scalar(@$strings) != $num_languages) { + # die "Symbol $key undefined in $lang." + print "Symbol $key undefined in $lang. Using the english variant.\n"; + push @$strings, ${$strings}[0]; + } + } +} + +my $filename = 'language_all.h'; +open(my $fh, '>', $filename) or die "Could not open file '$filename' $!"; + +# For the programmatic access to the program memory, read +# http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html + +print $fh <<END +#ifndef LANGUAGE_ALL_H +#define LANGUAGE_ALL_H + +#define LANG_NUM (${num_languages}) + +extern unsigned char lang_selected; + +#define LANG_TABLE_SELECT_EXPLICIT(TABLE, LANG) ((const char*)(pgm_read_ptr(TABLE + (LANG)))) +#define LANG_TABLE_SELECT(TABLE) LANG_TABLE_SELECT_EXPLICIT(TABLE, lang_selected) + +END +; + +foreach my $key (sort(keys %texts)) { + print $fh "extern const char* const ${key}_LANG_TABLE[LANG_NUM];\n"; + print $fh "#define $key LANG_TABLE_SELECT(${key}_LANG_TABLE)\n"; + print $fh "#define ${key}_EXPLICIT(LANG) LANG_TABLE_SELECT_EXPLICIT(${key}_LANG_TABLE, LANG)\n" + if ($key eq "MSG_LANGUAGE_NAME" || $key eq "MSG_LANGUAGE_SELECT"); +} + +print $fh <<END + +extern char* CAT2(const char *s1,const char *s2); +extern char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4); + +#endif //LANGUAGE_ALL.H +END +; +close $fh; +print ".h created\n"; + + + +$filename = 'language_all.cpp'; +open($fh, '>', $filename) or die "Could not open file '$filename' $!"; + +print $fh <<'END' +#include <avr/pgmspace.h> +#include "configuration_prusa.h" +#include "language_all.h" + +#define LCD_WIDTH 20 +extern unsigned char lang_selected; + +END +; + +foreach my $key (sort(keys %texts)) { + my $strings = $texts{$key}; + for (my $i = 0; $i <= $#{$strings}; $i ++) { + my $suffix = uc($langs[$i]); + print $fh "const char ${key}_${suffix}[] PROGMEM = ${$strings}[$i];\n"; + } + print $fh "const char * const ${key}_LANG_TABLE[LANG_NUM] PROGMEM = {\n"; + for (my $i = 0; $i <= $#{$strings}; $i ++) { + my $suffix = uc($langs[$i]); + print $fh "\t${key}_${suffix}"; + print $fh ',' if $i < $#{$strings}; + print $fh "\n"; + } + print $fh "};\n\n"; +} + +print $fh <<'END' + +char langbuffer[LCD_WIDTH+1]; +char* CAT2(const char *s1,const char *s2) { + unsigned char len=0; + strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); + len+=strlen_P(s1); + strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); + return langbuffer; +} +char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4) { + unsigned char len=0; + strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); + len+=strlen_P(s1); + strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); + len+=strlen_P(s2); + strncpy_P(langbuffer+len,s3,LCD_WIDTH-len); + len+=strlen_P(s3); + strncpy_P(langbuffer+len,s4,LCD_WIDTH-len); + return langbuffer; +} +END +; + +print ".cpp created.\nDone!\n"; diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 8c797896..25aeb378 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -1,2564 +1,3498 @@ -#include <avr/pgmspace.h> -#include "Configuration_prusa.h" -#define LCD_WIDTH 20 -extern unsigned char lang_selected; -const char MSGEN0[] PROGMEM = { CUSTOM_MENDEL_NAME " ready." }; //WELCOME_MSG -const char MSGCZ0[] PROGMEM = { CUSTOM_MENDEL_NAME " ok" }; //WELCOME_MSG -const char MSGIT0[] PROGMEM = { CUSTOM_MENDEL_NAME " pronto." }; //WELCOME_MSG -const char MSGES0[] PROGMEM = { CUSTOM_MENDEL_NAME " lista" }; //WELCOME_MSG -const char MSGPL0[] PROGMEM = { CUSTOM_MENDEL_NAME " gotowa" }; //WELCOME_MSG -const char MSGEN1[] PROGMEM = { "Card inserted" }; //MSG_SD_INSERTED -const char MSGCZ1[] PROGMEM = { "Karta vlozena" }; //MSG_SD_INSERTED -const char MSGIT1[] PROGMEM = { "SD Card inserita" }; //MSG_SD_INSERTED -const char MSGES1[] PROGMEM = { "Tarjeta colocada" }; //MSG_SD_INSERTED -const char MSGPL1[] PROGMEM = { "Karta wlozona" }; //MSG_SD_INSERTED -const char MSGEN2[] PROGMEM = { "Card removed" }; //MSG_SD_REMOVED -const char MSGCZ2[] PROGMEM = { "Karta vyjmuta" }; //MSG_SD_REMOVED -const char MSGIT2[] PROGMEM = { "SD Card rimossa" }; //MSG_SD_REMOVED -const char MSGES2[] PROGMEM = { "Tarjeta retirada" }; //MSG_SD_REMOVED -const char MSGPL2[] PROGMEM = { "Karta wyjeta" }; //MSG_SD_REMOVED -const char MSGEN3[] PROGMEM = { "Main" }; //MSG_MAIN -const char MSGCZ3[] PROGMEM = { "Hlavni nabidka" }; //MSG_MAIN -const char MSGIT3[] PROGMEM = { "Menu principale" }; //MSG_MAIN -const char MSGES3[] PROGMEM = { "Menu principal" }; //MSG_MAIN -const char MSGPL3[] PROGMEM = { "Menu glowne" }; //MSG_MAIN -const char MSGEN4[] PROGMEM = { "Autostart" }; //MSG_AUTOSTART -const char MSGCZ4[] PROGMEM = { "Autostart" }; //MSG_AUTOSTART -const char MSGIT4[] PROGMEM = { "Autostart" }; //MSG_AUTOSTART -const char MSGES4[] PROGMEM = { "Autostart" }; //MSG_AUTOSTART -const char MSGPL4[] PROGMEM = { "Autostart" }; //MSG_AUTOSTART -const char MSGEN5[] PROGMEM = { "Disable steppers" }; //MSG_DISABLE_STEPPERS -const char MSGCZ5[] PROGMEM = { "Vypnout motory" }; //MSG_DISABLE_STEPPERS -const char MSGIT5[] PROGMEM = { "Disabilita Motori" }; //MSG_DISABLE_STEPPERS -const char MSGES5[] PROGMEM = { "Apagar motores" }; //MSG_DISABLE_STEPPERS -const char MSGPL5[] PROGMEM = { "Wylaczyc silniki" }; //MSG_DISABLE_STEPPERS -const char MSGEN6[] PROGMEM = { "Auto home" }; //MSG_AUTO_HOME -const char MSGCZ6[] PROGMEM = { "Auto home" }; //MSG_AUTO_HOME -const char MSGIT6[] PROGMEM = { "Auto Home" }; //MSG_AUTO_HOME -const char MSGES6[] PROGMEM = { "Llevar al origen" }; //MSG_AUTO_HOME -const char MSGPL6[] PROGMEM = { "Auto home" }; //MSG_AUTO_HOME -const char MSGEN7[] PROGMEM = { "Set home offsets" }; //MSG_SET_HOME_OFFSETS -const char MSGCZ7[] PROGMEM = { "Nastav pocatek home" }; //MSG_SET_HOME_OFFSETS -const char MSGIT7[] PROGMEM = { "Set home offsets" }; //MSG_SET_HOME_OFFSETS -const char MSGES7[] PROGMEM = { "Set home offsets" }; //MSG_SET_HOME_OFFSETS -const char MSGPL7[] PROGMEM = { "Nastav pocatek home" }; //MSG_SET_HOME_OFFSETS -const char MSGEN8[] PROGMEM = { "Set origin" }; //MSG_SET_ORIGIN -const char MSGCZ8[] PROGMEM = { "Nastav pocatek" }; //MSG_SET_ORIGIN -const char MSGIT8[] PROGMEM = { "Set origin" }; //MSG_SET_ORIGIN -const char MSGES8[] PROGMEM = { "Set origin" }; //MSG_SET_ORIGIN -const char MSGPL8[] PROGMEM = { "Nastav pocatek" }; //MSG_SET_ORIGIN -const char MSGEN9[] PROGMEM = { "Preheat PLA" }; //MSG_PREHEAT_PLA -const char MSGCZ9[] PROGMEM = { "Predehrev PLA" }; //MSG_PREHEAT_PLA -const char MSGIT9[] PROGMEM = { "Preheat PLA" }; //MSG_PREHEAT_PLA -const char MSGES9[] PROGMEM = { "Preheat PLA" }; //MSG_PREHEAT_PLA -const char MSGPL9[] PROGMEM = { "Predehrev PLA" }; //MSG_PREHEAT_PLA -const char MSGEN10[] PROGMEM = { "Preheat PLA 1" }; //MSG_PREHEAT_PLA0 -const char MSGCZ10[] PROGMEM = { "Predehrev PLA 1" }; //MSG_PREHEAT_PLA0 -const char MSGIT10[] PROGMEM = { "Preheat PLA 1" }; //MSG_PREHEAT_PLA0 -const char MSGES10[] PROGMEM = { "Preheat PLA 1" }; //MSG_PREHEAT_PLA0 -const char MSGPL10[] PROGMEM = { "Predehrev PLA 1" }; //MSG_PREHEAT_PLA0 -const char MSGEN11[] PROGMEM = { "Preheat PLA 2" }; //MSG_PREHEAT_PLA1 -const char MSGCZ11[] PROGMEM = { "Predehrev PLA 2" }; //MSG_PREHEAT_PLA1 -const char MSGIT11[] PROGMEM = { "Preheat PLA 2" }; //MSG_PREHEAT_PLA1 -const char MSGES11[] PROGMEM = { "Preheat PLA 2" }; //MSG_PREHEAT_PLA1 -const char MSGPL11[] PROGMEM = { "Predehrev PLA 2" }; //MSG_PREHEAT_PLA1 -const char MSGEN12[] PROGMEM = { "Preheat PLA 3" }; //MSG_PREHEAT_PLA2 -const char MSGCZ12[] PROGMEM = { "Predehrev PLA 3" }; //MSG_PREHEAT_PLA2 -const char MSGIT12[] PROGMEM = { "Preheat PLA 3" }; //MSG_PREHEAT_PLA2 -const char MSGES12[] PROGMEM = { "Preheat PLA 3" }; //MSG_PREHEAT_PLA2 -const char MSGPL12[] PROGMEM = { "Predehrev PLA 3" }; //MSG_PREHEAT_PLA2 -const char MSGEN13[] PROGMEM = { "Preheat PLA All" }; //MSG_PREHEAT_PLA012 -const char MSGCZ13[] PROGMEM = { "Predehrev PLA All" }; //MSG_PREHEAT_PLA012 -const char MSGIT13[] PROGMEM = { "Preheat PLA All" }; //MSG_PREHEAT_PLA012 -const char MSGES13[] PROGMEM = { "Preheat PLA All" }; //MSG_PREHEAT_PLA012 -const char MSGPL13[] PROGMEM = { "Predehrev PLA All" }; //MSG_PREHEAT_PLA012 -const char MSGEN14[] PROGMEM = { "Preheat PLA Bed" }; //MSG_PREHEAT_PLA_BEDONLY -const char MSGCZ14[] PROGMEM = { "Predehrev PLA Bed" }; //MSG_PREHEAT_PLA_BEDONLY -const char MSGIT14[] PROGMEM = { "Preheat PLA Bed" }; //MSG_PREHEAT_PLA_BEDONLY -const char MSGES14[] PROGMEM = { "Preheat PLA Bed" }; //MSG_PREHEAT_PLA_BEDONLY -const char MSGPL14[] PROGMEM = { "Predehrev PLA Bed" }; //MSG_PREHEAT_PLA_BEDONLY -const char MSGEN15[] PROGMEM = { "Preheat PLA conf" }; //MSG_PREHEAT_PLA_SETTINGS -const char MSGCZ15[] PROGMEM = { "Predehrev PLA conf" }; //MSG_PREHEAT_PLA_SETTINGS -const char MSGIT15[] PROGMEM = { "Preheat PLA conf" }; //MSG_PREHEAT_PLA_SETTINGS -const char MSGES15[] PROGMEM = { "Preheat PLA conf" }; //MSG_PREHEAT_PLA_SETTINGS -const char MSGPL15[] PROGMEM = { "Predehrev PLA conf" }; //MSG_PREHEAT_PLA_SETTINGS -const char MSGEN16[] PROGMEM = { "Preheat ABS" }; //MSG_PREHEAT_ABS -const char MSGCZ16[] PROGMEM = { "Predehrev ABS" }; //MSG_PREHEAT_ABS -const char MSGIT16[] PROGMEM = { "Preheat ABS" }; //MSG_PREHEAT_ABS -const char MSGES16[] PROGMEM = { "Preheat ABS" }; //MSG_PREHEAT_ABS -const char MSGPL16[] PROGMEM = { "Predehrev ABS" }; //MSG_PREHEAT_ABS -const char MSGEN17[] PROGMEM = { "Preheat ABS 1" }; //MSG_PREHEAT_ABS0 -const char MSGCZ17[] PROGMEM = { "Predehrev ABS 1" }; //MSG_PREHEAT_ABS0 -const char MSGIT17[] PROGMEM = { "Preheat ABS 1" }; //MSG_PREHEAT_ABS0 -const char MSGES17[] PROGMEM = { "Preheat ABS 1" }; //MSG_PREHEAT_ABS0 -const char MSGPL17[] PROGMEM = { "Predehrev ABS 1" }; //MSG_PREHEAT_ABS0 -const char MSGEN18[] PROGMEM = { "Preheat ABS 2" }; //MSG_PREHEAT_ABS1 -const char MSGCZ18[] PROGMEM = { "Predehrev ABS 2" }; //MSG_PREHEAT_ABS1 -const char MSGIT18[] PROGMEM = { "Preheat ABS 2" }; //MSG_PREHEAT_ABS1 -const char MSGES18[] PROGMEM = { "Preheat ABS 2" }; //MSG_PREHEAT_ABS1 -const char MSGPL18[] PROGMEM = { "Predehrev ABS 2" }; //MSG_PREHEAT_ABS1 -const char MSGEN19[] PROGMEM = { "Preheat ABS 3" }; //MSG_PREHEAT_ABS2 -const char MSGCZ19[] PROGMEM = { "Predehrev ABS 3" }; //MSG_PREHEAT_ABS2 -const char MSGIT19[] PROGMEM = { "Preheat ABS 3" }; //MSG_PREHEAT_ABS2 -const char MSGES19[] PROGMEM = { "Preheat ABS 3" }; //MSG_PREHEAT_ABS2 -const char MSGPL19[] PROGMEM = { "Predehrev ABS 3" }; //MSG_PREHEAT_ABS2 -const char MSGEN20[] PROGMEM = { "Preheat ABS All" }; //MSG_PREHEAT_ABS012 -const char MSGCZ20[] PROGMEM = { "Predehrev ABS All" }; //MSG_PREHEAT_ABS012 -const char MSGIT20[] PROGMEM = { "Preheat ABS All" }; //MSG_PREHEAT_ABS012 -const char MSGES20[] PROGMEM = { "Preheat ABS All" }; //MSG_PREHEAT_ABS012 -const char MSGPL20[] PROGMEM = { "Predehrev ABS All" }; //MSG_PREHEAT_ABS012 -const char MSGEN21[] PROGMEM = { "Preheat ABS Bed" }; //MSG_PREHEAT_ABS_BEDONLY -const char MSGCZ21[] PROGMEM = { "Predehrev ABS Bed" }; //MSG_PREHEAT_ABS_BEDONLY -const char MSGIT21[] PROGMEM = { "Preheat ABS Bed" }; //MSG_PREHEAT_ABS_BEDONLY -const char MSGES21[] PROGMEM = { "Preheat ABS Bed" }; //MSG_PREHEAT_ABS_BEDONLY -const char MSGPL21[] PROGMEM = { "Predehrev ABS Bed" }; //MSG_PREHEAT_ABS_BEDONLY -const char MSGEN22[] PROGMEM = { "Preheat ABS conf" }; //MSG_PREHEAT_ABS_SETTINGS -const char MSGCZ22[] PROGMEM = { "Predehrev ABS conf" }; //MSG_PREHEAT_ABS_SETTINGS -const char MSGIT22[] PROGMEM = { "Preheat ABS conf" }; //MSG_PREHEAT_ABS_SETTINGS -const char MSGES22[] PROGMEM = { "Preheat ABS conf" }; //MSG_PREHEAT_ABS_SETTINGS -const char MSGPL22[] PROGMEM = { "Predehrev ABS conf" }; //MSG_PREHEAT_ABS_SETTINGS -const char MSGEN23[] PROGMEM = { "Cooldown" }; //MSG_COOLDOWN -const char MSGCZ23[] PROGMEM = { "Zchladit" }; //MSG_COOLDOWN -const char MSGIT23[] PROGMEM = { "Raffredda" }; //MSG_COOLDOWN -const char MSGES23[] PROGMEM = { "Enfriar" }; //MSG_COOLDOWN -const char MSGPL23[] PROGMEM = { "Wychlodzic" }; //MSG_COOLDOWN -const char MSGEN24[] PROGMEM = { "Switch power on" }; //MSG_SWITCH_PS_ON -const char MSGCZ24[] PROGMEM = { "Vypnout zdroj" }; //MSG_SWITCH_PS_ON -const char MSGIT24[] PROGMEM = { "Switch power on" }; //MSG_SWITCH_PS_ON -const char MSGES24[] PROGMEM = { "Switch power on" }; //MSG_SWITCH_PS_ON -const char MSGPL24[] PROGMEM = { "Vypnout zdroj" }; //MSG_SWITCH_PS_ON -const char MSGEN25[] PROGMEM = { "Switch power off" }; //MSG_SWITCH_PS_OFF -const char MSGCZ25[] PROGMEM = { "Zapnout zdroj" }; //MSG_SWITCH_PS_OFF -const char MSGIT25[] PROGMEM = { "Switch power off" }; //MSG_SWITCH_PS_OFF -const char MSGES25[] PROGMEM = { "Switch power off" }; //MSG_SWITCH_PS_OFF -const char MSGPL25[] PROGMEM = { "Zapnout zdroj" }; //MSG_SWITCH_PS_OFF -const char MSGEN26[] PROGMEM = { "Extrude" }; //MSG_EXTRUDE -const char MSGCZ26[] PROGMEM = { "Extrudovat" }; //MSG_EXTRUDE -const char MSGIT26[] PROGMEM = { "Extrude" }; //MSG_EXTRUDE -const char MSGES26[] PROGMEM = { "Extrude" }; //MSG_EXTRUDE -const char MSGPL26[] PROGMEM = { "Extrudovat" }; //MSG_EXTRUDE -const char MSGEN27[] PROGMEM = { "Retract" }; //MSG_RETRACT -const char MSGCZ27[] PROGMEM = { "Retract" }; //MSG_RETRACT -const char MSGIT27[] PROGMEM = { "Retract" }; //MSG_RETRACT -const char MSGES27[] PROGMEM = { "Retract" }; //MSG_RETRACT -const char MSGPL27[] PROGMEM = { "Retract" }; //MSG_RETRACT -const char MSGEN28[] PROGMEM = { "Move axis" }; //MSG_MOVE_AXIS -const char MSGCZ28[] PROGMEM = { "Posunout osu" }; //MSG_MOVE_AXIS -const char MSGIT28[] PROGMEM = { "Muovi Asse" }; //MSG_MOVE_AXIS -const char MSGES28[] PROGMEM = { "Mover ejes" }; //MSG_MOVE_AXIS -const char MSGPL28[] PROGMEM = { "Ruch osi" }; //MSG_MOVE_AXIS -const char MSGEN29[] PROGMEM = { "Move X" }; //MSG_MOVE_X -const char MSGCZ29[] PROGMEM = { "Posunout X" }; //MSG_MOVE_X -const char MSGIT29[] PROGMEM = { "Muovi X" }; //MSG_MOVE_X -const char MSGES29[] PROGMEM = { "Mover X" }; //MSG_MOVE_X -const char MSGPL29[] PROGMEM = { "Przesunac X" }; //MSG_MOVE_X -const char MSGEN30[] PROGMEM = { "Move Y" }; //MSG_MOVE_Y -const char MSGCZ30[] PROGMEM = { "Posunout Y" }; //MSG_MOVE_Y -const char MSGIT30[] PROGMEM = { "Muovi Y" }; //MSG_MOVE_Y -const char MSGES30[] PROGMEM = { "Mover Y" }; //MSG_MOVE_Y -const char MSGPL30[] PROGMEM = { "Przesunac Y" }; //MSG_MOVE_Y -const char MSGEN31[] PROGMEM = { "Move Z" }; //MSG_MOVE_Z -const char MSGCZ31[] PROGMEM = { "Posunout Z" }; //MSG_MOVE_Z -const char MSGIT31[] PROGMEM = { "Muovi Z" }; //MSG_MOVE_Z -const char MSGES31[] PROGMEM = { "Mover Z" }; //MSG_MOVE_Z -const char MSGPL31[] PROGMEM = { "Przesunac Z" }; //MSG_MOVE_Z -const char MSGEN32[] PROGMEM = { "Extruder" }; //MSG_MOVE_E -const char MSGCZ32[] PROGMEM = { "Extruder" }; //MSG_MOVE_E -const char MSGIT32[] PROGMEM = { "Estrusore" }; //MSG_MOVE_E -const char MSGES32[] PROGMEM = { "Extrusor" }; //MSG_MOVE_E -const char MSGPL32[] PROGMEM = { "Extruder" }; //MSG_MOVE_E -const char MSGEN33[] PROGMEM = { "Extruder2" }; //MSG_MOVE_E1 -const char MSGCZ33[] PROGMEM = { "Extruder2" }; //MSG_MOVE_E1 -const char MSGIT33[] PROGMEM = { "Extruder2" }; //MSG_MOVE_E1 -const char MSGES33[] PROGMEM = { "Extruder2" }; //MSG_MOVE_E1 -const char MSGPL33[] PROGMEM = { "Extruder2" }; //MSG_MOVE_E1 -const char MSGEN34[] PROGMEM = { "Extruder3" }; //MSG_MOVE_E2 -const char MSGCZ34[] PROGMEM = { "Extruder3" }; //MSG_MOVE_E2 -const char MSGIT34[] PROGMEM = { "Extruder3" }; //MSG_MOVE_E2 -const char MSGES34[] PROGMEM = { "Extruder3" }; //MSG_MOVE_E2 -const char MSGPL34[] PROGMEM = { "Extruder3" }; //MSG_MOVE_E2 -const char MSGEN35[] PROGMEM = { "Move 0.1mm" }; //MSG_MOVE_01MM -const char MSGCZ35[] PROGMEM = { "Posunout o 0.1mm" }; //MSG_MOVE_01MM -const char MSGIT35[] PROGMEM = { "Move 0.1mm" }; //MSG_MOVE_01MM -const char MSGES35[] PROGMEM = { "Move 0.1mm" }; //MSG_MOVE_01MM -const char MSGPL35[] PROGMEM = { "Posunout o 0.1mm" }; //MSG_MOVE_01MM -const char MSGEN36[] PROGMEM = { "Move 1mm" }; //MSG_MOVE_1MM -const char MSGCZ36[] PROGMEM = { "Posunout o 1mm" }; //MSG_MOVE_1MM -const char MSGIT36[] PROGMEM = { "Move 1mm" }; //MSG_MOVE_1MM -const char MSGES36[] PROGMEM = { "Move 1mm" }; //MSG_MOVE_1MM -const char MSGPL36[] PROGMEM = { "Posunout o 1mm" }; //MSG_MOVE_1MM -const char MSGEN37[] PROGMEM = { "Move 10mm" }; //MSG_MOVE_10MM -const char MSGCZ37[] PROGMEM = { "Posunout o 10mm" }; //MSG_MOVE_10MM -const char MSGIT37[] PROGMEM = { "Move 10mm" }; //MSG_MOVE_10MM -const char MSGES37[] PROGMEM = { "Move 10mm" }; //MSG_MOVE_10MM -const char MSGPL37[] PROGMEM = { "Posunout o 10mm" }; //MSG_MOVE_10MM -const char MSGEN38[] PROGMEM = { "Speed" }; //MSG_SPEED -const char MSGCZ38[] PROGMEM = { "Rychlost" }; //MSG_SPEED -const char MSGIT38[] PROGMEM = { "Velcità" }; //MSG_SPEED -const char MSGES38[] PROGMEM = { "Velocidad" }; //MSG_SPEED -const char MSGPL38[] PROGMEM = { "Predkosc" }; //MSG_SPEED -const char MSGEN39[] PROGMEM = { "Nozzle" }; //MSG_NOZZLE -const char MSGCZ39[] PROGMEM = { "Tryska" }; //MSG_NOZZLE -const char MSGIT39[] PROGMEM = { "Ugello" }; //MSG_NOZZLE -const char MSGES39[] PROGMEM = { "Fusor" }; //MSG_NOZZLE -const char MSGPL39[] PROGMEM = { "Dysza" }; //MSG_NOZZLE -const char MSGEN40[] PROGMEM = { "Nozzle2" }; //MSG_NOZZLE1 -const char MSGCZ40[] PROGMEM = { "Tryska2" }; //MSG_NOZZLE1 -const char MSGIT40[] PROGMEM = { "Nozzle2" }; //MSG_NOZZLE1 -const char MSGES40[] PROGMEM = { "Nozzle2" }; //MSG_NOZZLE1 -const char MSGPL40[] PROGMEM = { "Tryska2" }; //MSG_NOZZLE1 -const char MSGEN41[] PROGMEM = { "Nozzle3" }; //MSG_NOZZLE2 -const char MSGCZ41[] PROGMEM = { "Tryska3" }; //MSG_NOZZLE2 -const char MSGIT41[] PROGMEM = { "Nozzle3" }; //MSG_NOZZLE2 -const char MSGES41[] PROGMEM = { "Nozzle3" }; //MSG_NOZZLE2 -const char MSGPL41[] PROGMEM = { "Tryska3" }; //MSG_NOZZLE2 -const char MSGEN42[] PROGMEM = { "Bed" }; //MSG_BED -const char MSGCZ42[] PROGMEM = { "Bed" }; //MSG_BED -const char MSGIT42[] PROGMEM = { "Piatto" }; //MSG_BED -const char MSGES42[] PROGMEM = { "Base" }; //MSG_BED -const char MSGPL42[] PROGMEM = { "Stolik" }; //MSG_BED -const char MSGEN43[] PROGMEM = { "Fan speed" }; //MSG_FAN_SPEED -const char MSGCZ43[] PROGMEM = { "Rychlost vent." }; //MSG_FAN_SPEED -const char MSGIT43[] PROGMEM = { "Ventola" }; //MSG_FAN_SPEED -const char MSGES43[] PROGMEM = { "Ventilador" }; //MSG_FAN_SPEED -const char MSGPL43[] PROGMEM = { "Predkosc went." }; //MSG_FAN_SPEED -const char MSGEN44[] PROGMEM = { "Flow" }; //MSG_FLOW -const char MSGCZ44[] PROGMEM = { "Prutok" }; //MSG_FLOW -const char MSGIT44[] PROGMEM = { "Flusso" }; //MSG_FLOW -const char MSGES44[] PROGMEM = { "Flujo" }; //MSG_FLOW -const char MSGPL44[] PROGMEM = { "Przeplyw" }; //MSG_FLOW -const char MSGEN45[] PROGMEM = { "Flow 0" }; //MSG_FLOW0 -const char MSGCZ45[] PROGMEM = { "Prutok 0" }; //MSG_FLOW0 -const char MSGIT45[] PROGMEM = { "Flow 0" }; //MSG_FLOW0 -const char MSGES45[] PROGMEM = { "Flow 0" }; //MSG_FLOW0 -const char MSGPL45[] PROGMEM = { "Prutok 0" }; //MSG_FLOW0 -const char MSGEN46[] PROGMEM = { "Flow 1" }; //MSG_FLOW1 -const char MSGCZ46[] PROGMEM = { "Prutok 1" }; //MSG_FLOW1 -const char MSGIT46[] PROGMEM = { "Flow 1" }; //MSG_FLOW1 -const char MSGES46[] PROGMEM = { "Flow 1" }; //MSG_FLOW1 -const char MSGPL46[] PROGMEM = { "Prutok 1" }; //MSG_FLOW1 -const char MSGEN47[] PROGMEM = { "Flow 2" }; //MSG_FLOW2 -const char MSGCZ47[] PROGMEM = { "Prutok 2" }; //MSG_FLOW2 -const char MSGIT47[] PROGMEM = { "Flow 2" }; //MSG_FLOW2 -const char MSGES47[] PROGMEM = { "Flow 2" }; //MSG_FLOW2 -const char MSGPL47[] PROGMEM = { "Prutok 2" }; //MSG_FLOW2 -const char MSGEN48[] PROGMEM = { "Control" }; //MSG_CONTROL -const char MSGCZ48[] PROGMEM = { "Kontrola" }; //MSG_CONTROL -const char MSGIT48[] PROGMEM = { "Control" }; //MSG_CONTROL -const char MSGES48[] PROGMEM = { "Control" }; //MSG_CONTROL -const char MSGPL48[] PROGMEM = { "Kontrola" }; //MSG_CONTROL -const char MSGEN49[] PROGMEM = { " \002 Min" }; //MSG_MIN -const char MSGCZ49[] PROGMEM = { " \002 Min" }; //MSG_MIN -const char MSGIT49[] PROGMEM = { " \002 Min" }; //MSG_MIN -const char MSGES49[] PROGMEM = { " \002 Min" }; //MSG_MIN -const char MSGPL49[] PROGMEM = { " \002 Min" }; //MSG_MIN -const char MSGEN50[] PROGMEM = { " \002 Max" }; //MSG_MAX -const char MSGCZ50[] PROGMEM = { " \002 Max" }; //MSG_MAX -const char MSGIT50[] PROGMEM = { " \002 Max" }; //MSG_MAX -const char MSGES50[] PROGMEM = { " \002 Max" }; //MSG_MAX -const char MSGPL50[] PROGMEM = { " \002 Max" }; //MSG_MAX -const char MSGEN51[] PROGMEM = { " \002 Fact" }; //MSG_FACTOR -const char MSGCZ51[] PROGMEM = { " \002 Fact" }; //MSG_FACTOR -const char MSGIT51[] PROGMEM = { " \002 Fact" }; //MSG_FACTOR -const char MSGES51[] PROGMEM = { " \002 Fact" }; //MSG_FACTOR -const char MSGPL51[] PROGMEM = { " \002 Fact" }; //MSG_FACTOR -const char MSGEN52[] PROGMEM = { "Autotemp" }; //MSG_AUTOTEMP -const char MSGCZ52[] PROGMEM = { "Autotemp" }; //MSG_AUTOTEMP -const char MSGIT52[] PROGMEM = { "Autotemp" }; //MSG_AUTOTEMP -const char MSGES52[] PROGMEM = { "Autotemp" }; //MSG_AUTOTEMP -const char MSGPL52[] PROGMEM = { "Autotemp" }; //MSG_AUTOTEMP -const char MSGEN53[] PROGMEM = { "On " }; //MSG_ON -const char MSGCZ53[] PROGMEM = { "On " }; //MSG_ON -const char MSGIT53[] PROGMEM = { "On " }; //MSG_ON -const char MSGES53[] PROGMEM = { "On " }; //MSG_ON -const char MSGPL53[] PROGMEM = { "On " }; //MSG_ON -const char MSGEN54[] PROGMEM = { "Off" }; //MSG_OFF -const char MSGCZ54[] PROGMEM = { "Off" }; //MSG_OFF -const char MSGIT54[] PROGMEM = { "Off" }; //MSG_OFF -const char MSGES54[] PROGMEM = { "Off" }; //MSG_OFF -const char MSGPL54[] PROGMEM = { "Off" }; //MSG_OFF -const char MSGEN55[] PROGMEM = { "PID-P" }; //MSG_PID_P -const char MSGCZ55[] PROGMEM = { "PID-P" }; //MSG_PID_P -const char MSGIT55[] PROGMEM = { "PID-P" }; //MSG_PID_P -const char MSGES55[] PROGMEM = { "PID-P" }; //MSG_PID_P -const char MSGPL55[] PROGMEM = { "PID-P" }; //MSG_PID_P -const char MSGEN56[] PROGMEM = { "PID-I" }; //MSG_PID_I -const char MSGCZ56[] PROGMEM = { "PID-I" }; //MSG_PID_I -const char MSGIT56[] PROGMEM = { "PID-I" }; //MSG_PID_I -const char MSGES56[] PROGMEM = { "PID-I" }; //MSG_PID_I -const char MSGPL56[] PROGMEM = { "PID-I" }; //MSG_PID_I -const char MSGEN57[] PROGMEM = { "PID-D" }; //MSG_PID_D -const char MSGCZ57[] PROGMEM = { "PID-D" }; //MSG_PID_D -const char MSGIT57[] PROGMEM = { "PID-D" }; //MSG_PID_D -const char MSGES57[] PROGMEM = { "PID-D" }; //MSG_PID_D -const char MSGPL57[] PROGMEM = { "PID-D" }; //MSG_PID_D -const char MSGEN58[] PROGMEM = { "PID-C" }; //MSG_PID_C -const char MSGCZ58[] PROGMEM = { "PID-C" }; //MSG_PID_C -const char MSGIT58[] PROGMEM = { "PID-C" }; //MSG_PID_C -const char MSGES58[] PROGMEM = { "PID-C" }; //MSG_PID_C -const char MSGPL58[] PROGMEM = { "PID-C" }; //MSG_PID_C -const char MSGEN59[] PROGMEM = { "Accel" }; //MSG_ACC -const char MSGCZ59[] PROGMEM = { "Accel" }; //MSG_ACC -const char MSGIT59[] PROGMEM = { "Accel" }; //MSG_ACC -const char MSGES59[] PROGMEM = { "Accel" }; //MSG_ACC -const char MSGPL59[] PROGMEM = { "Accel" }; //MSG_ACC -const char MSGEN60[] PROGMEM = { "Vxy-jerk" }; //MSG_VXY_JERK -const char MSGCZ60[] PROGMEM = { "Vxy-jerk" }; //MSG_VXY_JERK -const char MSGIT60[] PROGMEM = { "Vxy-jerk" }; //MSG_VXY_JERK -const char MSGES60[] PROGMEM = { "Vxy-jerk" }; //MSG_VXY_JERK -const char MSGPL60[] PROGMEM = { "Vxy-jerk" }; //MSG_VXY_JERK -const char MSGEN61[] PROGMEM = { "Vz-jerk" }; //MSG_VZ_JERK -const char MSGCZ61[] PROGMEM = { "Vz-jerk" }; //MSG_VZ_JERK -const char MSGIT61[] PROGMEM = { "Vz-jerk" }; //MSG_VZ_JERK -const char MSGES61[] PROGMEM = { "Vz-jerk" }; //MSG_VZ_JERK -const char MSGPL61[] PROGMEM = { "Vz-jerk" }; //MSG_VZ_JERK -const char MSGEN62[] PROGMEM = { "Ve-jerk" }; //MSG_VE_JERK -const char MSGCZ62[] PROGMEM = { "Ve-jerk" }; //MSG_VE_JERK -const char MSGIT62[] PROGMEM = { "Ve-jerk" }; //MSG_VE_JERK -const char MSGES62[] PROGMEM = { "Ve-jerk" }; //MSG_VE_JERK -const char MSGPL62[] PROGMEM = { "Ve-jerk" }; //MSG_VE_JERK -const char MSGEN63[] PROGMEM = { "Vmax " }; //MSG_VMAX -const char MSGCZ63[] PROGMEM = { "Vmax " }; //MSG_VMAX -const char MSGIT63[] PROGMEM = { "Vmax " }; //MSG_VMAX -const char MSGES63[] PROGMEM = { "Vmax " }; //MSG_VMAX -const char MSGPL63[] PROGMEM = { "Vmax " }; //MSG_VMAX -const char MSGEN64[] PROGMEM = { "x" }; //MSG_X -const char MSGCZ64[] PROGMEM = { "x" }; //MSG_X -const char MSGIT64[] PROGMEM = { "x" }; //MSG_X -const char MSGES64[] PROGMEM = { "x" }; //MSG_X -const char MSGPL64[] PROGMEM = { "x" }; //MSG_X -const char MSGEN65[] PROGMEM = { "y" }; //MSG_Y -const char MSGCZ65[] PROGMEM = { "y" }; //MSG_Y -const char MSGIT65[] PROGMEM = { "y" }; //MSG_Y -const char MSGES65[] PROGMEM = { "y" }; //MSG_Y -const char MSGPL65[] PROGMEM = { "y" }; //MSG_Y -const char MSGEN66[] PROGMEM = { "z" }; //MSG_Z -const char MSGCZ66[] PROGMEM = { "z" }; //MSG_Z -const char MSGIT66[] PROGMEM = { "z" }; //MSG_Z -const char MSGES66[] PROGMEM = { "z" }; //MSG_Z -const char MSGPL66[] PROGMEM = { "z" }; //MSG_Z -const char MSGEN67[] PROGMEM = { "e" }; //MSG_E -const char MSGCZ67[] PROGMEM = { "e" }; //MSG_E -const char MSGIT67[] PROGMEM = { "e" }; //MSG_E -const char MSGES67[] PROGMEM = { "e" }; //MSG_E -const char MSGPL67[] PROGMEM = { "e" }; //MSG_E -const char MSGEN68[] PROGMEM = { "Vmin" }; //MSG_VMIN -const char MSGCZ68[] PROGMEM = { "Vmin" }; //MSG_VMIN -const char MSGIT68[] PROGMEM = { "Vmin" }; //MSG_VMIN -const char MSGES68[] PROGMEM = { "Vmin" }; //MSG_VMIN -const char MSGPL68[] PROGMEM = { "Vmin" }; //MSG_VMIN -const char MSGEN69[] PROGMEM = { "VTrav min" }; //MSG_VTRAV_MIN -const char MSGCZ69[] PROGMEM = { "VTrav min" }; //MSG_VTRAV_MIN -const char MSGIT69[] PROGMEM = { "VTrav min" }; //MSG_VTRAV_MIN -const char MSGES69[] PROGMEM = { "VTrav min" }; //MSG_VTRAV_MIN -const char MSGPL69[] PROGMEM = { "VTrav min" }; //MSG_VTRAV_MIN -const char MSGEN70[] PROGMEM = { "Amax " }; //MSG_AMAX -const char MSGCZ70[] PROGMEM = { "Amax " }; //MSG_AMAX -const char MSGIT70[] PROGMEM = { "Amax " }; //MSG_AMAX -const char MSGES70[] PROGMEM = { "Amax " }; //MSG_AMAX -const char MSGPL70[] PROGMEM = { "Amax " }; //MSG_AMAX -const char MSGEN71[] PROGMEM = { "A-retract" }; //MSG_A_RETRACT -const char MSGCZ71[] PROGMEM = { "A-retract" }; //MSG_A_RETRACT -const char MSGIT71[] PROGMEM = { "A-retract" }; //MSG_A_RETRACT -const char MSGES71[] PROGMEM = { "A-retract" }; //MSG_A_RETRACT -const char MSGPL71[] PROGMEM = { "A-retract" }; //MSG_A_RETRACT -const char MSGEN72[] PROGMEM = { "Xsteps/mm" }; //MSG_XSTEPS -const char MSGCZ72[] PROGMEM = { "Xsteps/mm" }; //MSG_XSTEPS -const char MSGIT72[] PROGMEM = { "Xsteps/mm" }; //MSG_XSTEPS -const char MSGES72[] PROGMEM = { "Xsteps/mm" }; //MSG_XSTEPS -const char MSGPL72[] PROGMEM = { "Xsteps/mm" }; //MSG_XSTEPS -const char MSGEN73[] PROGMEM = { "Ysteps/mm" }; //MSG_YSTEPS -const char MSGCZ73[] PROGMEM = { "Ysteps/mm" }; //MSG_YSTEPS -const char MSGIT73[] PROGMEM = { "Ysteps/mm" }; //MSG_YSTEPS -const char MSGES73[] PROGMEM = { "Ysteps/mm" }; //MSG_YSTEPS -const char MSGPL73[] PROGMEM = { "Ysteps/mm" }; //MSG_YSTEPS -const char MSGEN74[] PROGMEM = { "Zsteps/mm" }; //MSG_ZSTEPS -const char MSGCZ74[] PROGMEM = { "Zsteps/mm" }; //MSG_ZSTEPS -const char MSGIT74[] PROGMEM = { "Zsteps/mm" }; //MSG_ZSTEPS -const char MSGES74[] PROGMEM = { "Zsteps/mm" }; //MSG_ZSTEPS -const char MSGPL74[] PROGMEM = { "Zsteps/mm" }; //MSG_ZSTEPS -const char MSGEN75[] PROGMEM = { "Esteps/mm" }; //MSG_ESTEPS -const char MSGCZ75[] PROGMEM = { "Esteps/mm" }; //MSG_ESTEPS -const char MSGIT75[] PROGMEM = { "Esteps/mm" }; //MSG_ESTEPS -const char MSGES75[] PROGMEM = { "Esteps/mm" }; //MSG_ESTEPS -const char MSGPL75[] PROGMEM = { "Esteps/mm" }; //MSG_ESTEPS -const char MSGEN76[] PROGMEM = { "Temperature" }; //MSG_TEMPERATURE -const char MSGCZ76[] PROGMEM = { "Teplota" }; //MSG_TEMPERATURE -const char MSGIT76[] PROGMEM = { "Temperatura" }; //MSG_TEMPERATURE -const char MSGES76[] PROGMEM = { "Temperatura" }; //MSG_TEMPERATURE -const char MSGPL76[] PROGMEM = { "Temperatura" }; //MSG_TEMPERATURE -const char MSGEN77[] PROGMEM = { "Motion" }; //MSG_MOTION -const char MSGCZ77[] PROGMEM = { "Pohyb" }; //MSG_MOTION -const char MSGIT77[] PROGMEM = { "Motion" }; //MSG_MOTION -const char MSGES77[] PROGMEM = { "Motion" }; //MSG_MOTION -const char MSGPL77[] PROGMEM = { "Pohyb" }; //MSG_MOTION -const char MSGEN78[] PROGMEM = { "Filament" }; //MSG_VOLUMETRIC -const char MSGCZ78[] PROGMEM = { "Filament" }; //MSG_VOLUMETRIC -const char MSGIT78[] PROGMEM = { "Filament" }; //MSG_VOLUMETRIC -const char MSGES78[] PROGMEM = { "Filament" }; //MSG_VOLUMETRIC -const char MSGPL78[] PROGMEM = { "Filament" }; //MSG_VOLUMETRIC -const char MSGEN79[] PROGMEM = { "E in mm3" }; //MSG_VOLUMETRIC_ENABLED -const char MSGCZ79[] PROGMEM = { "E in mm3" }; //MSG_VOLUMETRIC_ENABLED -const char MSGIT79[] PROGMEM = { "E in mm3" }; //MSG_VOLUMETRIC_ENABLED -const char MSGES79[] PROGMEM = { "E in mm3" }; //MSG_VOLUMETRIC_ENABLED -const char MSGPL79[] PROGMEM = { "E in mm3" }; //MSG_VOLUMETRIC_ENABLED -const char MSGEN80[] PROGMEM = { "Fil. Dia. 1" }; //MSG_FILAMENT_SIZE_EXTRUDER_0 -const char MSGCZ80[] PROGMEM = { "Fil. Dia. 1" }; //MSG_FILAMENT_SIZE_EXTRUDER_0 -const char MSGIT80[] PROGMEM = { "Fil. Dia. 1" }; //MSG_FILAMENT_SIZE_EXTRUDER_0 -const char MSGES80[] PROGMEM = { "Fil. Dia. 1" }; //MSG_FILAMENT_SIZE_EXTRUDER_0 -const char MSGPL80[] PROGMEM = { "Fil. Dia. 1" }; //MSG_FILAMENT_SIZE_EXTRUDER_0 -const char MSGEN81[] PROGMEM = { "Fil. Dia. 2" }; //MSG_FILAMENT_SIZE_EXTRUDER_1 -const char MSGCZ81[] PROGMEM = { "Fil. Dia. 2" }; //MSG_FILAMENT_SIZE_EXTRUDER_1 -const char MSGIT81[] PROGMEM = { "Fil. Dia. 2" }; //MSG_FILAMENT_SIZE_EXTRUDER_1 -const char MSGES81[] PROGMEM = { "Fil. Dia. 2" }; //MSG_FILAMENT_SIZE_EXTRUDER_1 -const char MSGPL81[] PROGMEM = { "Fil. Dia. 2" }; //MSG_FILAMENT_SIZE_EXTRUDER_1 -const char MSGEN82[] PROGMEM = { "Fil. Dia. 3" }; //MSG_FILAMENT_SIZE_EXTRUDER_2 -const char MSGCZ82[] PROGMEM = { "Fil. Dia. 3" }; //MSG_FILAMENT_SIZE_EXTRUDER_2 -const char MSGIT82[] PROGMEM = { "Fil. Dia. 3" }; //MSG_FILAMENT_SIZE_EXTRUDER_2 -const char MSGES82[] PROGMEM = { "Fil. Dia. 3" }; //MSG_FILAMENT_SIZE_EXTRUDER_2 -const char MSGPL82[] PROGMEM = { "Fil. Dia. 3" }; //MSG_FILAMENT_SIZE_EXTRUDER_2 -const char MSGEN83[] PROGMEM = { "LCD contrast" }; //MSG_CONTRAST -const char MSGCZ83[] PROGMEM = { "LCD contrast" }; //MSG_CONTRAST -const char MSGIT83[] PROGMEM = { "LCD contrast" }; //MSG_CONTRAST -const char MSGES83[] PROGMEM = { "LCD contrast" }; //MSG_CONTRAST -const char MSGPL83[] PROGMEM = { "LCD contrast" }; //MSG_CONTRAST -const char MSGEN84[] PROGMEM = { "Store memory" }; //MSG_STORE_EPROM -const char MSGCZ84[] PROGMEM = { "Store memory" }; //MSG_STORE_EPROM -const char MSGIT84[] PROGMEM = { "Store memory" }; //MSG_STORE_EPROM -const char MSGES84[] PROGMEM = { "Store memory" }; //MSG_STORE_EPROM -const char MSGPL84[] PROGMEM = { "Store memory" }; //MSG_STORE_EPROM -const char MSGEN85[] PROGMEM = { "Load memory" }; //MSG_LOAD_EPROM -const char MSGCZ85[] PROGMEM = { "Ulozit pamet" }; //MSG_LOAD_EPROM -const char MSGIT85[] PROGMEM = { "Load memory" }; //MSG_LOAD_EPROM -const char MSGES85[] PROGMEM = { "Load memory" }; //MSG_LOAD_EPROM -const char MSGPL85[] PROGMEM = { "Ulozit pamet" }; //MSG_LOAD_EPROM -const char MSGEN86[] PROGMEM = { "Restore failsafe" }; //MSG_RESTORE_FAILSAFE -const char MSGCZ86[] PROGMEM = { "Obnovit vychozi" }; //MSG_RESTORE_FAILSAFE -const char MSGIT86[] PROGMEM = { "Restore failsafe" }; //MSG_RESTORE_FAILSAFE -const char MSGES86[] PROGMEM = { "Restore failsafe" }; //MSG_RESTORE_FAILSAFE -const char MSGPL86[] PROGMEM = { "Obnovit vychozi" }; //MSG_RESTORE_FAILSAFE -const char MSGEN87[] PROGMEM = { "Refresh" }; //MSG_REFRESH -const char MSGCZ87[] PROGMEM = { "Obnovit" }; //MSG_REFRESH -const char MSGIT87[] PROGMEM = { "Refresh" }; //MSG_REFRESH -const char MSGES87[] PROGMEM = { "Refresh" }; //MSG_REFRESH -const char MSGPL87[] PROGMEM = { "Obnovit" }; //MSG_REFRESH -const char MSGEN88[] PROGMEM = { "Info screen" }; //MSG_WATCH -const char MSGCZ88[] PROGMEM = { "Informace" }; //MSG_WATCH -const char MSGIT88[] PROGMEM = { "Guarda" }; //MSG_WATCH -const char MSGES88[] PROGMEM = { "Monitorizar" }; //MSG_WATCH -const char MSGPL88[] PROGMEM = { "Informacje" }; //MSG_WATCH -const char MSGEN89[] PROGMEM = { "Prepare" }; //MSG_PREPARE -const char MSGCZ89[] PROGMEM = { "Priprava" }; //MSG_PREPARE -const char MSGIT89[] PROGMEM = { "Prepare" }; //MSG_PREPARE -const char MSGES89[] PROGMEM = { "Prepare" }; //MSG_PREPARE -const char MSGPL89[] PROGMEM = { "Priprava" }; //MSG_PREPARE -const char MSGEN90[] PROGMEM = { "Tune" }; //MSG_TUNE -const char MSGCZ90[] PROGMEM = { "Ladit" }; //MSG_TUNE -const char MSGIT90[] PROGMEM = { "Adatta" }; //MSG_TUNE -const char MSGES90[] PROGMEM = { "Ajustar" }; //MSG_TUNE -const char MSGPL90[] PROGMEM = { "Nastroic" }; //MSG_TUNE -const char MSGEN91[] PROGMEM = { "Pause print" }; //MSG_PAUSE_PRINT -const char MSGCZ91[] PROGMEM = { "Pozastavit tisk" }; //MSG_PAUSE_PRINT -const char MSGIT91[] PROGMEM = { "Pausa" }; //MSG_PAUSE_PRINT -const char MSGES91[] PROGMEM = { "Pausar impresion" }; //MSG_PAUSE_PRINT -const char MSGPL91[] PROGMEM = { "Przerwac druk" }; //MSG_PAUSE_PRINT -const char MSGEN92[] PROGMEM = { "Resume print" }; //MSG_RESUME_PRINT -const char MSGCZ92[] PROGMEM = { "Pokracovat" }; //MSG_RESUME_PRINT -const char MSGIT92[] PROGMEM = { "Riprendi stampa" }; //MSG_RESUME_PRINT -const char MSGES92[] PROGMEM = { "Reanudar impres." }; //MSG_RESUME_PRINT -const char MSGPL92[] PROGMEM = { "Kontynuowac" }; //MSG_RESUME_PRINT -const char MSGEN93[] PROGMEM = { "Stop print" }; //MSG_STOP_PRINT -const char MSGCZ93[] PROGMEM = { "Zastavit tisk" }; //MSG_STOP_PRINT -const char MSGIT93[] PROGMEM = { "Arresta stampa" }; //MSG_STOP_PRINT -const char MSGES93[] PROGMEM = { "Detener impresion" }; //MSG_STOP_PRINT -const char MSGPL93[] PROGMEM = { "Zatrzymac druk" }; //MSG_STOP_PRINT -const char MSGEN94[] PROGMEM = { "Print from SD" }; //MSG_CARD_MENU -const char MSGCZ94[] PROGMEM = { "Tisk z SD" }; //MSG_CARD_MENU -const char MSGIT94[] PROGMEM = { "Menu SD Carta" }; //MSG_CARD_MENU -const char MSGES94[] PROGMEM = { "Menu de SD" }; //MSG_CARD_MENU -const char MSGPL94[] PROGMEM = { "Druk z SD" }; //MSG_CARD_MENU -const char MSGEN95[] PROGMEM = { "No SD card" }; //MSG_NO_CARD -const char MSGCZ95[] PROGMEM = { "Zadna SD karta" }; //MSG_NO_CARD -const char MSGIT95[] PROGMEM = { "No SD Carta" }; //MSG_NO_CARD -const char MSGES95[] PROGMEM = { "No hay tarjeta SD" }; //MSG_NO_CARD -const char MSGPL95[] PROGMEM = { "Brak karty SD" }; //MSG_NO_CARD -const char MSGEN96[] PROGMEM = { "Sleep..." }; //MSG_DWELL -const char MSGCZ96[] PROGMEM = { "Sleep..." }; //MSG_DWELL -const char MSGIT96[] PROGMEM = { "Sospensione..." }; //MSG_DWELL -const char MSGES96[] PROGMEM = { "Reposo..." }; //MSG_DWELL -const char MSGPL96[] PROGMEM = { "Sleep..." }; //MSG_DWELL -const char MSGEN97[] PROGMEM = { "Wait for user..." }; //MSG_USERWAIT -const char MSGCZ97[] PROGMEM = { "Wait for user..." }; //MSG_USERWAIT -const char MSGIT97[] PROGMEM = { "Attendi Utente..." }; //MSG_USERWAIT -const char MSGES97[] PROGMEM = { "Esperando ordenes" }; //MSG_USERWAIT -const char MSGPL97[] PROGMEM = { "Wait for user..." }; //MSG_USERWAIT -const char MSGEN98[] PROGMEM = { "Resuming print" }; //MSG_RESUMING -const char MSGCZ98[] PROGMEM = { "Obnoveni tisku" }; //MSG_RESUMING -const char MSGIT98[] PROGMEM = { "Riprendi Stampa" }; //MSG_RESUMING -const char MSGES98[] PROGMEM = { "Resumiendo impre." }; //MSG_RESUMING -const char MSGPL98[] PROGMEM = { "Wznowienie druku" }; //MSG_RESUMING -const char MSGEN99[] PROGMEM = { "Print aborted" }; //MSG_PRINT_ABORTED -const char MSGCZ99[] PROGMEM = { "Tisk prerusen" }; //MSG_PRINT_ABORTED -const char MSGIT99[] PROGMEM = { "Stampa abortita" }; //MSG_PRINT_ABORTED -const char MSGES99[] PROGMEM = { "Print aborted" }; //MSG_PRINT_ABORTED -const char MSGPL99[] PROGMEM = { "Druk przerwany" }; //MSG_PRINT_ABORTED -const char MSGEN100[] PROGMEM = { "No move." }; //MSG_NO_MOVE -const char MSGCZ100[] PROGMEM = { "No move." }; //MSG_NO_MOVE -const char MSGIT100[] PROGMEM = { "Nessun Movimento" }; //MSG_NO_MOVE -const char MSGES100[] PROGMEM = { "Sin movimiento" }; //MSG_NO_MOVE -const char MSGPL100[] PROGMEM = { "No move." }; //MSG_NO_MOVE -const char MSGEN101[] PROGMEM = { "KILLED. " }; //MSG_KILLED -const char MSGCZ101[] PROGMEM = { "KILLED. " }; //MSG_KILLED -const char MSGIT101[] PROGMEM = { "UCCISO " }; //MSG_KILLED -const char MSGES101[] PROGMEM = { "PARADA DE EMERG." }; //MSG_KILLED -const char MSGPL101[] PROGMEM = { "KILLED. " }; //MSG_KILLED -const char MSGEN102[] PROGMEM = { "STOPPED. " }; //MSG_STOPPED -const char MSGCZ102[] PROGMEM = { "STOPPED. " }; //MSG_STOPPED -const char MSGIT102[] PROGMEM = { "ARRESTATO " }; //MSG_STOPPED -const char MSGES102[] PROGMEM = { "PARADA" }; //MSG_STOPPED -const char MSGPL102[] PROGMEM = { "STOPPED. " }; //MSG_STOPPED -const char MSGEN103[] PROGMEM = { "Retract mm" }; //MSG_CONTROL_RETRACT -const char MSGCZ103[] PROGMEM = { "Retract mm" }; //MSG_CONTROL_RETRACT -const char MSGIT103[] PROGMEM = { "Retract mm" }; //MSG_CONTROL_RETRACT -const char MSGES103[] PROGMEM = { "Retract mm" }; //MSG_CONTROL_RETRACT -const char MSGPL103[] PROGMEM = { "Retract mm" }; //MSG_CONTROL_RETRACT -const char MSGEN104[] PROGMEM = { "Swap Re.mm" }; //MSG_CONTROL_RETRACT_SWAP -const char MSGCZ104[] PROGMEM = { "Swap Re.mm" }; //MSG_CONTROL_RETRACT_SWAP -const char MSGIT104[] PROGMEM = { "Swap Re.mm" }; //MSG_CONTROL_RETRACT_SWAP -const char MSGES104[] PROGMEM = { "Swap Re.mm" }; //MSG_CONTROL_RETRACT_SWAP -const char MSGPL104[] PROGMEM = { "Swap Re.mm" }; //MSG_CONTROL_RETRACT_SWAP -const char MSGEN105[] PROGMEM = { "Retract V" }; //MSG_CONTROL_RETRACTF -const char MSGCZ105[] PROGMEM = { "Retract V" }; //MSG_CONTROL_RETRACTF -const char MSGIT105[] PROGMEM = { "Retract V" }; //MSG_CONTROL_RETRACTF -const char MSGES105[] PROGMEM = { "Retract V" }; //MSG_CONTROL_RETRACTF -const char MSGPL105[] PROGMEM = { "Retract V" }; //MSG_CONTROL_RETRACTF -const char MSGEN106[] PROGMEM = { "Hop mm" }; //MSG_CONTROL_RETRACT_ZLIFT -const char MSGCZ106[] PROGMEM = { "Hop mm" }; //MSG_CONTROL_RETRACT_ZLIFT -const char MSGIT106[] PROGMEM = { "Hop mm" }; //MSG_CONTROL_RETRACT_ZLIFT -const char MSGES106[] PROGMEM = { "Hop mm" }; //MSG_CONTROL_RETRACT_ZLIFT -const char MSGPL106[] PROGMEM = { "Hop mm" }; //MSG_CONTROL_RETRACT_ZLIFT -const char MSGEN107[] PROGMEM = { "UnRet +mm" }; //MSG_CONTROL_RETRACT_RECOVER -const char MSGCZ107[] PROGMEM = { "UnRet +mm" }; //MSG_CONTROL_RETRACT_RECOVER -const char MSGIT107[] PROGMEM = { "UnRet +mm" }; //MSG_CONTROL_RETRACT_RECOVER -const char MSGES107[] PROGMEM = { "UnRet +mm" }; //MSG_CONTROL_RETRACT_RECOVER -const char MSGPL107[] PROGMEM = { "UnRet +mm" }; //MSG_CONTROL_RETRACT_RECOVER -const char MSGEN108[] PROGMEM = { "S UnRet+mm" }; //MSG_CONTROL_RETRACT_RECOVER_SWAP -const char MSGCZ108[] PROGMEM = { "S UnRet+mm" }; //MSG_CONTROL_RETRACT_RECOVER_SWAP -const char MSGIT108[] PROGMEM = { "S UnRet+mm" }; //MSG_CONTROL_RETRACT_RECOVER_SWAP -const char MSGES108[] PROGMEM = { "S UnRet+mm" }; //MSG_CONTROL_RETRACT_RECOVER_SWAP -const char MSGPL108[] PROGMEM = { "S UnRet+mm" }; //MSG_CONTROL_RETRACT_RECOVER_SWAP -const char MSGEN109[] PROGMEM = { "UnRet V" }; //MSG_CONTROL_RETRACT_RECOVERF -const char MSGCZ109[] PROGMEM = { "UnRet V" }; //MSG_CONTROL_RETRACT_RECOVERF -const char MSGIT109[] PROGMEM = { "UnRet V" }; //MSG_CONTROL_RETRACT_RECOVERF -const char MSGES109[] PROGMEM = { "UnRet V" }; //MSG_CONTROL_RETRACT_RECOVERF -const char MSGPL109[] PROGMEM = { "UnRet V" }; //MSG_CONTROL_RETRACT_RECOVERF -const char MSGEN110[] PROGMEM = { "AutoRetr." }; //MSG_AUTORETRACT -const char MSGCZ110[] PROGMEM = { "AutoRetr." }; //MSG_AUTORETRACT -const char MSGIT110[] PROGMEM = { "AutoRetr." }; //MSG_AUTORETRACT -const char MSGES110[] PROGMEM = { "AutoRetr." }; //MSG_AUTORETRACT -const char MSGPL110[] PROGMEM = { "AutoRetr." }; //MSG_AUTORETRACT -const char MSGEN111[] PROGMEM = { "Change filament" }; //MSG_FILAMENTCHANGE -const char MSGCZ111[] PROGMEM = { "Vymenit filament" }; //MSG_FILAMENTCHANGE -const char MSGIT111[] PROGMEM = { "Cambiare filamento" }; //MSG_FILAMENTCHANGE -const char MSGES111[] PROGMEM = { "Cambiar filamento" }; //MSG_FILAMENTCHANGE -const char MSGPL111[] PROGMEM = { "Wymienic filament" }; //MSG_FILAMENTCHANGE -const char MSGEN112[] PROGMEM = { "Init. SD card" }; //MSG_INIT_SDCARD -const char MSGCZ112[] PROGMEM = { "Inic. SD" }; //MSG_INIT_SDCARD -const char MSGIT112[] PROGMEM = { "Init. SD card" }; //MSG_INIT_SDCARD -const char MSGES112[] PROGMEM = { "Init. SD card" }; //MSG_INIT_SDCARD -const char MSGPL112[] PROGMEM = { "Inic. SD" }; //MSG_INIT_SDCARD -const char MSGEN113[] PROGMEM = { "Change SD card" }; //MSG_CNG_SDCARD -const char MSGCZ113[] PROGMEM = { "Vymenit SD" }; //MSG_CNG_SDCARD -const char MSGIT113[] PROGMEM = { "Change SD card" }; //MSG_CNG_SDCARD -const char MSGES113[] PROGMEM = { "Change SD card" }; //MSG_CNG_SDCARD -const char MSGPL113[] PROGMEM = { "Vymenit SD" }; //MSG_CNG_SDCARD -const char MSGEN114[] PROGMEM = { "Z probe out. bed" }; //MSG_ZPROBE_OUT -const char MSGCZ114[] PROGMEM = { "Z probe out. bed" }; //MSG_ZPROBE_OUT -const char MSGIT114[] PROGMEM = { "Z probe out. bed" }; //MSG_ZPROBE_OUT -const char MSGES114[] PROGMEM = { "Z probe out. bed" }; //MSG_ZPROBE_OUT -const char MSGPL114[] PROGMEM = { "Z probe out. bed" }; //MSG_ZPROBE_OUT -const char MSGEN115[] PROGMEM = { "Home X/Y before Z" }; //MSG_POSITION_UNKNOWN -const char MSGCZ115[] PROGMEM = { "Home X/Y before Z" }; //MSG_POSITION_UNKNOWN -const char MSGIT115[] PROGMEM = { "Home X/Y before Z" }; //MSG_POSITION_UNKNOWN -const char MSGES115[] PROGMEM = { "Home X/Y before Z" }; //MSG_POSITION_UNKNOWN -const char MSGPL115[] PROGMEM = { "Home X/Y before Z" }; //MSG_POSITION_UNKNOWN -const char MSGEN116[] PROGMEM = { "Z Offset" }; //MSG_ZPROBE_ZOFFSET -const char MSGCZ116[] PROGMEM = { "Z Offset" }; //MSG_ZPROBE_ZOFFSET -const char MSGIT116[] PROGMEM = { "Z Offset" }; //MSG_ZPROBE_ZOFFSET -const char MSGES116[] PROGMEM = { "Z Offset" }; //MSG_ZPROBE_ZOFFSET -const char MSGPL116[] PROGMEM = { "Z Offset" }; //MSG_ZPROBE_ZOFFSET -const char MSGEN117[] PROGMEM = { "Babystep X" }; //MSG_BABYSTEP_X -const char MSGCZ117[] PROGMEM = { "Babystep X" }; //MSG_BABYSTEP_X -const char MSGIT117[] PROGMEM = { "Babystep X" }; //MSG_BABYSTEP_X -const char MSGES117[] PROGMEM = { "Babystep X" }; //MSG_BABYSTEP_X -const char MSGPL117[] PROGMEM = { "Babystep X" }; //MSG_BABYSTEP_X -const char MSGEN118[] PROGMEM = { "Babystep Y" }; //MSG_BABYSTEP_Y -const char MSGCZ118[] PROGMEM = { "Babystep Y" }; //MSG_BABYSTEP_Y -const char MSGIT118[] PROGMEM = { "Babystep Y" }; //MSG_BABYSTEP_Y -const char MSGES118[] PROGMEM = { "Babystep Y" }; //MSG_BABYSTEP_Y -const char MSGPL118[] PROGMEM = { "Babystep Y" }; //MSG_BABYSTEP_Y -const char MSGEN119[] PROGMEM = { "Live adjust Z" }; //MSG_BABYSTEP_Z -const char MSGCZ119[] PROGMEM = { "Doladeni osy Z" }; //MSG_BABYSTEP_Z -const char MSGIT119[] PROGMEM = { "Babystep Z" }; //MSG_BABYSTEP_Z -const char MSGES119[] PROGMEM = { "Micropaso Z" }; //MSG_BABYSTEP_Z -const char MSGPL119[] PROGMEM = { "Dostrojenie osy Z" }; //MSG_BABYSTEP_Z -const char MSGEN120[] PROGMEM = { "Endstop abort" }; //MSG_ENDSTOP_ABORT -const char MSGCZ120[] PROGMEM = { "Endstop abort" }; //MSG_ENDSTOP_ABORT -const char MSGIT120[] PROGMEM = { "Endstop abort" }; //MSG_ENDSTOP_ABORT -const char MSGES120[] PROGMEM = { "Endstop abort" }; //MSG_ENDSTOP_ABORT -const char MSGPL120[] PROGMEM = { "Endstop abort" }; //MSG_ENDSTOP_ABORT -const char MSGEN121[] PROGMEM = { "Auto adjust Z ?" }; //MSG_ADJUSTZ -const char MSGCZ121[] PROGMEM = { "Auto doladit Z ?" }; //MSG_ADJUSTZ -const char MSGIT121[] PROGMEM = { "Auto regolare Z ?" }; //MSG_ADJUSTZ -const char MSGES121[] PROGMEM = { "Auto Micropaso Z?" }; //MSG_ADJUSTZ -const char MSGPL121[] PROGMEM = { "Autodostroic Z?" }; //MSG_ADJUSTZ -const char MSGEN122[] PROGMEM = { "Pick print" }; //MSG_PICK_Z -const char MSGCZ122[] PROGMEM = { "Vyberte vytisk" }; //MSG_PICK_Z -const char MSGIT122[] PROGMEM = { "Vyberte vytisk" }; //MSG_PICK_Z -const char MSGES122[] PROGMEM = { "Vyberte vytisk" }; //MSG_PICK_Z -const char MSGPL122[] PROGMEM = { "Vyberte vytisk" }; //MSG_PICK_Z -const char MSGEN123[] PROGMEM = { "Calibrate Z" }; //MSG_HOMEYZ -const char MSGCZ123[] PROGMEM = { "Kalibrovat Z" }; //MSG_HOMEYZ -const char MSGIT123[] PROGMEM = { "Calibra Z" }; //MSG_HOMEYZ -const char MSGES123[] PROGMEM = { "Calibrar Z" }; //MSG_HOMEYZ -const char MSGPL123[] PROGMEM = { "Kalibruj Z" }; //MSG_HOMEYZ -const char MSGEN124[] PROGMEM = { "Calibrating Z" }; //MSG_HOMEYZ_PROGRESS -const char MSGCZ124[] PROGMEM = { "Kalibruji Z" }; //MSG_HOMEYZ_PROGRESS -const char MSGIT124[] PROGMEM = { "Calibrando Z" }; //MSG_HOMEYZ_PROGRESS -const char MSGES124[] PROGMEM = { "Calibrando Z" }; //MSG_HOMEYZ_PROGRESS -const char MSGPL124[] PROGMEM = { "Kalibruje Z" }; //MSG_HOMEYZ_PROGRESS -const char MSGEN125[] PROGMEM = { "Calibration done" }; //MSG_HOMEYZ_DONE -const char MSGCZ125[] PROGMEM = { "Kalibrace OK" }; //MSG_HOMEYZ_DONE -const char MSGIT125[] PROGMEM = { "Calibratura OK" }; //MSG_HOMEYZ_DONE -const char MSGES125[] PROGMEM = { "Calibración OK" }; //MSG_HOMEYZ_DONE -const char MSGPL125[] PROGMEM = { "Kalibracja OK" }; //MSG_HOMEYZ_DONE -const char MSGEN126[] PROGMEM = { "Settings" }; //MSG_SETTINGS -const char MSGCZ126[] PROGMEM = { "Nastaveni" }; //MSG_SETTINGS -const char MSGIT126[] PROGMEM = { "Impostazioni" }; //MSG_SETTINGS -const char MSGES126[] PROGMEM = { "Ajuste" }; //MSG_SETTINGS -const char MSGPL126[] PROGMEM = { "Ustawienia" }; //MSG_SETTINGS -const char MSGEN127[] PROGMEM = { "Preheat" }; //MSG_PREHEAT -const char MSGCZ127[] PROGMEM = { "Predehrev" }; //MSG_PREHEAT -const char MSGIT127[] PROGMEM = { "Preriscalda" }; //MSG_PREHEAT -const char MSGES127[] PROGMEM = { "Precalentar" }; //MSG_PREHEAT -const char MSGPL127[] PROGMEM = { "Grzanie" }; //MSG_PREHEAT -const char MSGEN128[] PROGMEM = { "Unload filament" }; //MSG_UNLOAD_FILAMENT -const char MSGCZ128[] PROGMEM = { "Vyjmout filament" }; //MSG_UNLOAD_FILAMENT -const char MSGIT128[] PROGMEM = { "Scaricare fil." }; //MSG_UNLOAD_FILAMENT -const char MSGES128[] PROGMEM = { "Sacar filamento" }; //MSG_UNLOAD_FILAMENT -const char MSGPL128[] PROGMEM = { "Wyjac filament" }; //MSG_UNLOAD_FILAMENT -const char MSGEN129[] PROGMEM = { "Load filament" }; //MSG_LOAD_FILAMENT -const char MSGCZ129[] PROGMEM = { "Zavest filament" }; //MSG_LOAD_FILAMENT -const char MSGIT129[] PROGMEM = { "Caricare filamento" }; //MSG_LOAD_FILAMENT -const char MSGES129[] PROGMEM = { "Introducir filamento" }; //MSG_LOAD_FILAMENT -const char MSGPL129[] PROGMEM = { "Wprowadz filament" }; //MSG_LOAD_FILAMENT -const char MSGEN130[] PROGMEM = { "Rectract" }; //MSG_RECTRACT -const char MSGCZ130[] PROGMEM = { "Rectract" }; //MSG_RECTRACT -const char MSGIT130[] PROGMEM = { "Rectract" }; //MSG_RECTRACT -const char MSGES130[] PROGMEM = { "Rectract" }; //MSG_RECTRACT -const char MSGPL130[] PROGMEM = { "Rectract" }; //MSG_RECTRACT -const char MSGEN131[] PROGMEM = { "ERROR:" }; //MSG_ERROR -const char MSGCZ131[] PROGMEM = { "CHYBA:" }; //MSG_ERROR -const char MSGIT131[] PROGMEM = { "ERROR:" }; //MSG_ERROR -const char MSGES131[] PROGMEM = { "ERROR:" }; //MSG_ERROR -const char MSGPL131[] PROGMEM = { "BLAD:" }; //MSG_ERROR -const char MSGEN132[] PROGMEM = { "Preheat the nozzle!" }; //MSG_PREHEAT_NOZZLE -const char MSGCZ132[] PROGMEM = { "Predehrejte trysku!" }; //MSG_PREHEAT_NOZZLE -const char MSGIT132[] PROGMEM = { "Preris. ugello!" }; //MSG_PREHEAT_NOZZLE -const char MSGES132[] PROGMEM = { "Precal. extrusor!" }; //MSG_PREHEAT_NOZZLE -const char MSGPL132[] PROGMEM = { "Nagrzej dysze!" }; //MSG_PREHEAT_NOZZLE -const char MSGEN133[] PROGMEM = { "Support" }; //MSG_SUPPORT -const char MSGCZ133[] PROGMEM = { "Podpora" }; //MSG_SUPPORT -const char MSGIT133[] PROGMEM = { "Support" }; //MSG_SUPPORT -const char MSGES133[] PROGMEM = { "Support" }; //MSG_SUPPORT -const char MSGPL133[] PROGMEM = { "Pomoc" }; //MSG_SUPPORT -const char MSGEN134[] PROGMEM = { "Changed correctly?" }; //MSG_CORRECTLY -const char MSGCZ134[] PROGMEM = { "Vymena ok?" }; //MSG_CORRECTLY -const char MSGIT134[] PROGMEM = { "Cambiato corr.?" }; //MSG_CORRECTLY -const char MSGES134[] PROGMEM = { "Cambiado correc.?" }; //MSG_CORRECTLY -const char MSGPL134[] PROGMEM = { "Wymiana ok?" }; //MSG_CORRECTLY -const char MSGEN135[] PROGMEM = { "Yes" }; //MSG_YES -const char MSGCZ135[] PROGMEM = { "Ano" }; //MSG_YES -const char MSGIT135[] PROGMEM = { "Si" }; //MSG_YES -const char MSGES135[] PROGMEM = { "Si" }; //MSG_YES -const char MSGPL135[] PROGMEM = { "Tak" }; //MSG_YES -const char MSGEN136[] PROGMEM = { "No" }; //MSG_NO -const char MSGCZ136[] PROGMEM = { "Ne" }; //MSG_NO -const char MSGIT136[] PROGMEM = { "No" }; //MSG_NO -const char MSGES136[] PROGMEM = { "No" }; //MSG_NO -const char MSGPL136[] PROGMEM = { "Nie" }; //MSG_NO -const char MSGEN137[] PROGMEM = { "Filament not loaded" }; //MSG_NOT_LOADED -const char MSGCZ137[] PROGMEM = { "Filament nezaveden" }; //MSG_NOT_LOADED -const char MSGIT137[] PROGMEM = { "Fil. no cargado" }; //MSG_NOT_LOADED -const char MSGES137[] PROGMEM = { "Fil. no cargado" }; //MSG_NOT_LOADED -const char MSGPL137[] PROGMEM = { "Brak filamentu" }; //MSG_NOT_LOADED -const char MSGEN138[] PROGMEM = { "Color not clear" }; //MSG_NOT_COLOR -const char MSGCZ138[] PROGMEM = { "Barva neni cista" }; //MSG_NOT_COLOR -const char MSGIT138[] PROGMEM = { "Color no claro" }; //MSG_NOT_COLOR -const char MSGES138[] PROGMEM = { "Color no claro" }; //MSG_NOT_COLOR -const char MSGPL138[] PROGMEM = { "Kolor zanieczysz." }; //MSG_NOT_COLOR -const char MSGEN139[] PROGMEM = { "Loading filament" }; //MSG_LOADING_FILAMENT -const char MSGCZ139[] PROGMEM = { "Zavadeni filamentu" }; //MSG_LOADING_FILAMENT -const char MSGIT139[] PROGMEM = { "Cargando fil." }; //MSG_LOADING_FILAMENT -const char MSGES139[] PROGMEM = { "Cargando fil." }; //MSG_LOADING_FILAMENT -const char MSGPL139[] PROGMEM = { "Wprow. filamentu" }; //MSG_LOADING_FILAMENT -const char MSGEN140[] PROGMEM = { "Please wait" }; //MSG_PLEASE_WAIT -const char MSGCZ140[] PROGMEM = { "Prosim cekejte" }; //MSG_PLEASE_WAIT -const char MSGIT140[] PROGMEM = { "Aspetta" }; //MSG_PLEASE_WAIT -const char MSGES140[] PROGMEM = { "Espera" }; //MSG_PLEASE_WAIT -const char MSGPL140[] PROGMEM = { "Prosze czekac" }; //MSG_PLEASE_WAIT -const char MSGEN141[] PROGMEM = { "Loading color" }; //MSG_LOADING_COLOR -const char MSGCZ141[] PROGMEM = { "Cisteni barvy" }; //MSG_LOADING_COLOR -const char MSGIT141[] PROGMEM = { "Cargando color" }; //MSG_LOADING_COLOR -const char MSGES141[] PROGMEM = { "Cargando color" }; //MSG_LOADING_COLOR -const char MSGPL141[] PROGMEM = { "Czyszcz. koloru" }; //MSG_LOADING_COLOR -const char MSGEN142[] PROGMEM = { "Change success!" }; //MSG_CHANGE_SUCCESS -const char MSGCZ142[] PROGMEM = { "Zmena uspesna!" }; //MSG_CHANGE_SUCCESS -const char MSGIT142[] PROGMEM = { "Cambia. riuscito!" }; //MSG_CHANGE_SUCCESS -const char MSGES142[] PROGMEM = { "Cambiar bien!" }; //MSG_CHANGE_SUCCESS -const char MSGPL142[] PROGMEM = { "Wymiana ok!" }; //MSG_CHANGE_SUCCESS -const char MSGEN143[] PROGMEM = { "And press the knob" }; //MSG_PRESS -const char MSGCZ143[] PROGMEM = { "A stisknete tlacitko" }; //MSG_PRESS -const char MSGIT143[] PROGMEM = { "Y pulse el mando" }; //MSG_PRESS -const char MSGES143[] PROGMEM = { "Y pulse el mando" }; //MSG_PRESS -const char MSGPL143[] PROGMEM = { "Nacisnij przycisk" }; //MSG_PRESS -const char MSGEN144[] PROGMEM = { "Insert filament" }; //MSG_INSERT_FILAMENT -const char MSGCZ144[] PROGMEM = { "Vlozte filament" }; //MSG_INSERT_FILAMENT -const char MSGIT144[] PROGMEM = { "Inserire filamento" }; //MSG_INSERT_FILAMENT -const char MSGES144[] PROGMEM = { "Inserta filamento" }; //MSG_INSERT_FILAMENT -const char MSGPL144[] PROGMEM = { "Wprowadz filament" }; //MSG_INSERT_FILAMENT -const char MSGEN145[] PROGMEM = { "Changing filament!" }; //MSG_CHANGING_FILAMENT -const char MSGCZ145[] PROGMEM = { "Vymena filamentu!" }; //MSG_CHANGING_FILAMENT -const char MSGIT145[] PROGMEM = { "Mutevole fil.!" }; //MSG_CHANGING_FILAMENT -const char MSGES145[] PROGMEM = { "Cambiando fil.!" }; //MSG_CHANGING_FILAMENT -const char MSGPL145[] PROGMEM = { "Wymiana filamentu" }; //MSG_CHANGING_FILAMENT -const char MSGEN146[] PROGMEM = { "Mode [silent]" }; //MSG_SILENT_MODE_ON -const char MSGCZ146[] PROGMEM = { "Mod [tichy]" }; //MSG_SILENT_MODE_ON -const char MSGIT146[] PROGMEM = { "Modo [silenzioso]" }; //MSG_SILENT_MODE_ON -const char MSGES146[] PROGMEM = { "Modo [silencio]" }; //MSG_SILENT_MODE_ON -const char MSGPL146[] PROGMEM = { "Mod [cichy]" }; //MSG_SILENT_MODE_ON -const char MSGEN147[] PROGMEM = { "Mode [high power]" }; //MSG_SILENT_MODE_OFF -const char MSGCZ147[] PROGMEM = { "Mod [vys. vykon]" }; //MSG_SILENT_MODE_OFF -const char MSGIT147[] PROGMEM = { "Modo [piu forza]" }; //MSG_SILENT_MODE_OFF -const char MSGES147[] PROGMEM = { "Modo [mas fuerza]" }; //MSG_SILENT_MODE_OFF -const char MSGPL147[] PROGMEM = { "Mod [w wydajnosc]" }; //MSG_SILENT_MODE_OFF -const char MSGEN148[] PROGMEM = { "Reboot the printer" }; //MSG_REBOOT -const char MSGCZ148[] PROGMEM = { "Restartujte tiskarnu" }; //MSG_REBOOT -const char MSGIT148[] PROGMEM = { "Riavvio la stamp." }; //MSG_REBOOT -const char MSGES148[] PROGMEM = { "Reiniciar la imp." }; //MSG_REBOOT -const char MSGPL148[] PROGMEM = { "Restart drukarki" }; //MSG_REBOOT -const char MSGEN149[] PROGMEM = { " for take effect" }; //MSG_TAKE_EFFECT -const char MSGCZ149[] PROGMEM = { " pro projeveni zmen" }; //MSG_TAKE_EFFECT -const char MSGIT149[] PROGMEM = { " per mostrare i camb." }; //MSG_TAKE_EFFECT -const char MSGES149[] PROGMEM = { "para tomar efecto" }; //MSG_TAKE_EFFECT -const char MSGPL149[] PROGMEM = { "wprow. zmian" }; //MSG_TAKE_EFFECT -const char MSGEN150[] PROGMEM = { "enqueing \"" }; //MSG_Enqueing -const char MSGCZ150[] PROGMEM = { "enqueing \"" }; //MSG_Enqueing -const char MSGIT150[] PROGMEM = { "enqueing \"" }; //MSG_Enqueing -const char MSGES150[] PROGMEM = { "enqueing \"" }; //MSG_Enqueing -const char MSGPL150[] PROGMEM = { "enqueing \"" }; //MSG_Enqueing -const char MSGEN151[] PROGMEM = { "PowerUp" }; //MSG_POWERUP -const char MSGCZ151[] PROGMEM = { "PowerUp" }; //MSG_POWERUP -const char MSGIT151[] PROGMEM = { "PowerUp" }; //MSG_POWERUP -const char MSGES151[] PROGMEM = { "PowerUp" }; //MSG_POWERUP -const char MSGPL151[] PROGMEM = { "PowerUp" }; //MSG_POWERUP -const char MSGEN152[] PROGMEM = { " External Reset" }; //MSG_EXTERNAL_RESET -const char MSGCZ152[] PROGMEM = { " External Reset" }; //MSG_EXTERNAL_RESET -const char MSGIT152[] PROGMEM = { " External Reset" }; //MSG_EXTERNAL_RESET -const char MSGES152[] PROGMEM = { " External Reset" }; //MSG_EXTERNAL_RESET -const char MSGPL152[] PROGMEM = { " External Reset" }; //MSG_EXTERNAL_RESET -const char MSGEN153[] PROGMEM = { " Brown out Reset" }; //MSG_BROWNOUT_RESET -const char MSGCZ153[] PROGMEM = { " Brown out Reset" }; //MSG_BROWNOUT_RESET -const char MSGIT153[] PROGMEM = { " Brown out Reset" }; //MSG_BROWNOUT_RESET -const char MSGES153[] PROGMEM = { " Brown out Reset" }; //MSG_BROWNOUT_RESET -const char MSGPL153[] PROGMEM = { " Brown out Reset" }; //MSG_BROWNOUT_RESET -const char MSGEN154[] PROGMEM = { " Watchdog Reset" }; //MSG_WATCHDOG_RESET -const char MSGCZ154[] PROGMEM = { " Watchdog Reset" }; //MSG_WATCHDOG_RESET -const char MSGIT154[] PROGMEM = { " Watchdog Reset" }; //MSG_WATCHDOG_RESET -const char MSGES154[] PROGMEM = { " Watchdog Reset" }; //MSG_WATCHDOG_RESET -const char MSGPL154[] PROGMEM = { " Watchdog Reset" }; //MSG_WATCHDOG_RESET -const char MSGEN155[] PROGMEM = { " Software Reset" }; //MSG_SOFTWARE_RESET -const char MSGCZ155[] PROGMEM = { " Software Reset" }; //MSG_SOFTWARE_RESET -const char MSGIT155[] PROGMEM = { " Software Reset" }; //MSG_SOFTWARE_RESET -const char MSGES155[] PROGMEM = { " Software Reset" }; //MSG_SOFTWARE_RESET -const char MSGPL155[] PROGMEM = { " Software Reset" }; //MSG_SOFTWARE_RESET -const char MSGEN156[] PROGMEM = { " | Author: " }; //MSG_AUTHOR -const char MSGCZ156[] PROGMEM = { " | Author: " }; //MSG_AUTHOR -const char MSGIT156[] PROGMEM = { " | Author: " }; //MSG_AUTHOR -const char MSGES156[] PROGMEM = { " | Author: " }; //MSG_AUTHOR -const char MSGPL156[] PROGMEM = { " | Author: " }; //MSG_AUTHOR -const char MSGEN157[] PROGMEM = { " Last Updated: " }; //MSG_CONFIGURATION_VER -const char MSGCZ157[] PROGMEM = { " Last Updated: " }; //MSG_CONFIGURATION_VER -const char MSGIT157[] PROGMEM = { " Last Updated: " }; //MSG_CONFIGURATION_VER -const char MSGES157[] PROGMEM = { " Last Updated: " }; //MSG_CONFIGURATION_VER -const char MSGPL157[] PROGMEM = { " Last Updated: " }; //MSG_CONFIGURATION_VER -const char MSGEN158[] PROGMEM = { " Free Memory: " }; //MSG_FREE_MEMORY -const char MSGCZ158[] PROGMEM = { " Free Memory: " }; //MSG_FREE_MEMORY -const char MSGIT158[] PROGMEM = { " Free Memory: " }; //MSG_FREE_MEMORY -const char MSGES158[] PROGMEM = { " Free Memory: " }; //MSG_FREE_MEMORY -const char MSGPL158[] PROGMEM = { " Free Memory: " }; //MSG_FREE_MEMORY -const char MSGEN159[] PROGMEM = { " PlannerBufferBytes: " }; //MSG_PLANNER_BUFFER_BYTES -const char MSGCZ159[] PROGMEM = { " PlannerBufferBytes: " }; //MSG_PLANNER_BUFFER_BYTES -const char MSGIT159[] PROGMEM = { " PlannerBufferBytes: " }; //MSG_PLANNER_BUFFER_BYTES -const char MSGES159[] PROGMEM = { " PlannerBufferBytes: " }; //MSG_PLANNER_BUFFER_BYTES -const char MSGPL159[] PROGMEM = { " PlannerBufferBytes: " }; //MSG_PLANNER_BUFFER_BYTES -const char MSGEN160[] PROGMEM = { "ok" }; //MSG_OK -const char MSGCZ160[] PROGMEM = { "ok" }; //MSG_OK -const char MSGIT160[] PROGMEM = { "ok" }; //MSG_OK -const char MSGES160[] PROGMEM = { "ok" }; //MSG_OK -const char MSGPL160[] PROGMEM = { "ok" }; //MSG_OK -const char MSGEN161[] PROGMEM = { "Done saving file." }; //MSG_FILE_SAVED -const char MSGCZ161[] PROGMEM = { "Done saving file." }; //MSG_FILE_SAVED -const char MSGIT161[] PROGMEM = { "Done saving file." }; //MSG_FILE_SAVED -const char MSGES161[] PROGMEM = { "Done saving file." }; //MSG_FILE_SAVED -const char MSGPL161[] PROGMEM = { "Done saving file." }; //MSG_FILE_SAVED -const char MSGEN162[] PROGMEM = { "Line Number is not Last Line Number+1, Last Line: " }; //MSG_ERR_LINE_NO -const char MSGCZ162[] PROGMEM = { "Line Number is not Last Line Number+1, Last Line: " }; //MSG_ERR_LINE_NO -const char MSGIT162[] PROGMEM = { "Line Number is not Last Line Number+1, Last Line: " }; //MSG_ERR_LINE_NO -const char MSGES162[] PROGMEM = { "Line Number is not Last Line Number+1, Last Line: " }; //MSG_ERR_LINE_NO -const char MSGPL162[] PROGMEM = { "Line Number is not Last Line Number+1, Last Line: " }; //MSG_ERR_LINE_NO -const char MSGEN163[] PROGMEM = { "checksum mismatch, Last Line: " }; //MSG_ERR_CHECKSUM_MISMATCH -const char MSGCZ163[] PROGMEM = { "checksum mismatch, Last Line: " }; //MSG_ERR_CHECKSUM_MISMATCH -const char MSGIT163[] PROGMEM = { "checksum mismatch, Last Line: " }; //MSG_ERR_CHECKSUM_MISMATCH -const char MSGES163[] PROGMEM = { "checksum mismatch, Last Line: " }; //MSG_ERR_CHECKSUM_MISMATCH -const char MSGPL163[] PROGMEM = { "checksum mismatch, Last Line: " }; //MSG_ERR_CHECKSUM_MISMATCH -const char MSGEN164[] PROGMEM = { "No Checksum with line number, Last Line: " }; //MSG_ERR_NO_CHECKSUM -const char MSGCZ164[] PROGMEM = { "No Checksum with line number, Last Line: " }; //MSG_ERR_NO_CHECKSUM -const char MSGIT164[] PROGMEM = { "No Checksum with line number, Last Line: " }; //MSG_ERR_NO_CHECKSUM -const char MSGES164[] PROGMEM = { "No Checksum with line number, Last Line: " }; //MSG_ERR_NO_CHECKSUM -const char MSGPL164[] PROGMEM = { "No Checksum with line number, Last Line: " }; //MSG_ERR_NO_CHECKSUM -const char MSGEN165[] PROGMEM = { "No Line Number with checksum, Last Line: " }; //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -const char MSGCZ165[] PROGMEM = { "No Line Number with checksum, Last Line: " }; //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -const char MSGIT165[] PROGMEM = { "No Line Number with checksum, Last Line: " }; //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -const char MSGES165[] PROGMEM = { "No Line Number with checksum, Last Line: " }; //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -const char MSGPL165[] PROGMEM = { "No Line Number with checksum, Last Line: " }; //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -const char MSGEN166[] PROGMEM = { "Done printing file" }; //MSG_FILE_PRINTED -const char MSGCZ166[] PROGMEM = { "Done printing file" }; //MSG_FILE_PRINTED -const char MSGIT166[] PROGMEM = { "Done printing file" }; //MSG_FILE_PRINTED -const char MSGES166[] PROGMEM = { "Done printing file" }; //MSG_FILE_PRINTED -const char MSGPL166[] PROGMEM = { "Done printing file" }; //MSG_FILE_PRINTED -const char MSGEN167[] PROGMEM = { "Begin file list" }; //MSG_BEGIN_FILE_LIST -const char MSGCZ167[] PROGMEM = { "Begin file list" }; //MSG_BEGIN_FILE_LIST -const char MSGIT167[] PROGMEM = { "Begin file list" }; //MSG_BEGIN_FILE_LIST -const char MSGES167[] PROGMEM = { "Begin file list" }; //MSG_BEGIN_FILE_LIST -const char MSGPL167[] PROGMEM = { "Begin file list" }; //MSG_BEGIN_FILE_LIST -const char MSGEN168[] PROGMEM = { "End file list" }; //MSG_END_FILE_LIST -const char MSGCZ168[] PROGMEM = { "End file list" }; //MSG_END_FILE_LIST -const char MSGIT168[] PROGMEM = { "End file list" }; //MSG_END_FILE_LIST -const char MSGES168[] PROGMEM = { "End file list" }; //MSG_END_FILE_LIST -const char MSGPL168[] PROGMEM = { "End file list" }; //MSG_END_FILE_LIST -const char MSGEN169[] PROGMEM = { "M104 Invalid extruder " }; //MSG_M104_INVALID_EXTRUDER -const char MSGCZ169[] PROGMEM = { "M104 Invalid extruder " }; //MSG_M104_INVALID_EXTRUDER -const char MSGIT169[] PROGMEM = { "M104 Invalid extruder " }; //MSG_M104_INVALID_EXTRUDER -const char MSGES169[] PROGMEM = { "M104 Invalid extruder " }; //MSG_M104_INVALID_EXTRUDER -const char MSGPL169[] PROGMEM = { "M104 Invalid extruder " }; //MSG_M104_INVALID_EXTRUDER -const char MSGEN170[] PROGMEM = { "M105 Invalid extruder " }; //MSG_M105_INVALID_EXTRUDER -const char MSGCZ170[] PROGMEM = { "M105 Invalid extruder " }; //MSG_M105_INVALID_EXTRUDER -const char MSGIT170[] PROGMEM = { "M105 Invalid extruder " }; //MSG_M105_INVALID_EXTRUDER -const char MSGES170[] PROGMEM = { "M105 Invalid extruder " }; //MSG_M105_INVALID_EXTRUDER -const char MSGPL170[] PROGMEM = { "M105 Invalid extruder " }; //MSG_M105_INVALID_EXTRUDER -const char MSGEN171[] PROGMEM = { "M200 Invalid extruder " }; //MSG_M200_INVALID_EXTRUDER -const char MSGCZ171[] PROGMEM = { "M200 Invalid extruder " }; //MSG_M200_INVALID_EXTRUDER -const char MSGIT171[] PROGMEM = { "M200 Invalid extruder " }; //MSG_M200_INVALID_EXTRUDER -const char MSGES171[] PROGMEM = { "M200 Invalid extruder " }; //MSG_M200_INVALID_EXTRUDER -const char MSGPL171[] PROGMEM = { "M200 Invalid extruder " }; //MSG_M200_INVALID_EXTRUDER -const char MSGEN172[] PROGMEM = { "M218 Invalid extruder " }; //MSG_M218_INVALID_EXTRUDER -const char MSGCZ172[] PROGMEM = { "M218 Invalid extruder " }; //MSG_M218_INVALID_EXTRUDER -const char MSGIT172[] PROGMEM = { "M218 Invalid extruder " }; //MSG_M218_INVALID_EXTRUDER -const char MSGES172[] PROGMEM = { "M218 Invalid extruder " }; //MSG_M218_INVALID_EXTRUDER -const char MSGPL172[] PROGMEM = { "M218 Invalid extruder " }; //MSG_M218_INVALID_EXTRUDER -const char MSGEN173[] PROGMEM = { "M221 Invalid extruder " }; //MSG_M221_INVALID_EXTRUDER -const char MSGCZ173[] PROGMEM = { "M221 Invalid extruder " }; //MSG_M221_INVALID_EXTRUDER -const char MSGIT173[] PROGMEM = { "M221 Invalid extruder " }; //MSG_M221_INVALID_EXTRUDER -const char MSGES173[] PROGMEM = { "M221 Invalid extruder " }; //MSG_M221_INVALID_EXTRUDER -const char MSGPL173[] PROGMEM = { "M221 Invalid extruder " }; //MSG_M221_INVALID_EXTRUDER -const char MSGEN174[] PROGMEM = { "No thermistors - no temperature" }; //MSG_ERR_NO_THERMISTORS -const char MSGCZ174[] PROGMEM = { "No thermistors - no temperature" }; //MSG_ERR_NO_THERMISTORS -const char MSGIT174[] PROGMEM = { "No thermistors - no temperature" }; //MSG_ERR_NO_THERMISTORS -const char MSGES174[] PROGMEM = { "No thermistors - no temperature" }; //MSG_ERR_NO_THERMISTORS -const char MSGPL174[] PROGMEM = { "No thermistors - no temperature" }; //MSG_ERR_NO_THERMISTORS -const char MSGEN175[] PROGMEM = { "M109 Invalid extruder " }; //MSG_M109_INVALID_EXTRUDER -const char MSGCZ175[] PROGMEM = { "M109 Invalid extruder " }; //MSG_M109_INVALID_EXTRUDER -const char MSGIT175[] PROGMEM = { "M109 Invalid extruder " }; //MSG_M109_INVALID_EXTRUDER -const char MSGES175[] PROGMEM = { "M109 Invalid extruder " }; //MSG_M109_INVALID_EXTRUDER -const char MSGPL175[] PROGMEM = { "M109 Invalid extruder " }; //MSG_M109_INVALID_EXTRUDER -const char MSGEN176[] PROGMEM = { "Heating" }; //MSG_HEATING -const char MSGCZ176[] PROGMEM = { "Zahrivani" }; //MSG_HEATING -const char MSGIT176[] PROGMEM = { "Riscaldamento..." }; //MSG_HEATING -const char MSGES176[] PROGMEM = { "Calentando..." }; //MSG_HEATING -const char MSGPL176[] PROGMEM = { "Grzanie..." }; //MSG_HEATING -const char MSGEN177[] PROGMEM = { "Heating done." }; //MSG_HEATING_COMPLETE -const char MSGCZ177[] PROGMEM = { "Zahrivani OK." }; //MSG_HEATING_COMPLETE -const char MSGIT177[] PROGMEM = { "Riscaldamento fatto." }; //MSG_HEATING_COMPLETE -const char MSGES177[] PROGMEM = { "Calentando listo." }; //MSG_HEATING_COMPLETE -const char MSGPL177[] PROGMEM = { "Grzanie OK." }; //MSG_HEATING_COMPLETE -const char MSGEN178[] PROGMEM = { "Bed Heating" }; //MSG_BED_HEATING -const char MSGCZ178[] PROGMEM = { "Zahrivani bed" }; //MSG_BED_HEATING -const char MSGIT178[] PROGMEM = { "Piatto riscaldam." }; //MSG_BED_HEATING -const char MSGES178[] PROGMEM = { "Base Calentando" }; //MSG_BED_HEATING -const char MSGPL178[] PROGMEM = { "Grzanie stolika.." }; //MSG_BED_HEATING -const char MSGEN179[] PROGMEM = { "Bed done" }; //MSG_BED_DONE -const char MSGCZ179[] PROGMEM = { "Bed OK." }; //MSG_BED_DONE -const char MSGIT179[] PROGMEM = { "Piatto fatto." }; //MSG_BED_DONE -const char MSGES179[] PROGMEM = { "Base listo." }; //MSG_BED_DONE -const char MSGPL179[] PROGMEM = { "Stolik OK." }; //MSG_BED_DONE -const char MSGEN180[] PROGMEM = { "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n" }; //MSG_M115_REPORT -const char MSGCZ180[] PROGMEM = { "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n" }; //MSG_M115_REPORT -const char MSGIT180[] PROGMEM = { "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n" }; //MSG_M115_REPORT -const char MSGES180[] PROGMEM = { "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n" }; //MSG_M115_REPORT -const char MSGPL180[] PROGMEM = { "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n" }; //MSG_M115_REPORT -const char MSGEN181[] PROGMEM = { " Count X: " }; //MSG_COUNT_X -const char MSGCZ181[] PROGMEM = { " Count X: " }; //MSG_COUNT_X -const char MSGIT181[] PROGMEM = { " Count X: " }; //MSG_COUNT_X -const char MSGES181[] PROGMEM = { " Count X: " }; //MSG_COUNT_X -const char MSGPL181[] PROGMEM = { " Count X: " }; //MSG_COUNT_X -const char MSGEN182[] PROGMEM = { "Printer halted. kill() called!" }; //MSG_ERR_KILLED -const char MSGCZ182[] PROGMEM = { "Printer halted. kill() called!" }; //MSG_ERR_KILLED -const char MSGIT182[] PROGMEM = { "Printer halted. kill() called!" }; //MSG_ERR_KILLED -const char MSGES182[] PROGMEM = { "Printer halted. kill() called!" }; //MSG_ERR_KILLED -const char MSGPL182[] PROGMEM = { "Printer halted. kill() called!" }; //MSG_ERR_KILLED -const char MSGEN183[] PROGMEM = { "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" }; //MSG_ERR_STOPPED -const char MSGCZ183[] PROGMEM = { "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" }; //MSG_ERR_STOPPED -const char MSGIT183[] PROGMEM = { "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" }; //MSG_ERR_STOPPED -const char MSGES183[] PROGMEM = { "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" }; //MSG_ERR_STOPPED -const char MSGPL183[] PROGMEM = { "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" }; //MSG_ERR_STOPPED -const char MSGEN184[] PROGMEM = { "Resend: " }; //MSG_RESEND -const char MSGCZ184[] PROGMEM = { "Resend: " }; //MSG_RESEND -const char MSGIT184[] PROGMEM = { "Resend: " }; //MSG_RESEND -const char MSGES184[] PROGMEM = { "Resend: " }; //MSG_RESEND -const char MSGPL184[] PROGMEM = { "Resend: " }; //MSG_RESEND -const char MSGEN185[] PROGMEM = { "Unknown command: \"" }; //MSG_UNKNOWN_COMMAND -const char MSGCZ185[] PROGMEM = { "Unknown command: \"" }; //MSG_UNKNOWN_COMMAND -const char MSGIT185[] PROGMEM = { "Unknown command: \"" }; //MSG_UNKNOWN_COMMAND -const char MSGES185[] PROGMEM = { "Unknown command: \"" }; //MSG_UNKNOWN_COMMAND -const char MSGPL185[] PROGMEM = { "Unknown command: \"" }; //MSG_UNKNOWN_COMMAND -const char MSGEN186[] PROGMEM = { "Active Extruder: " }; //MSG_ACTIVE_EXTRUDER -const char MSGCZ186[] PROGMEM = { "Active Extruder: " }; //MSG_ACTIVE_EXTRUDER -const char MSGIT186[] PROGMEM = { "Active Extruder: " }; //MSG_ACTIVE_EXTRUDER -const char MSGES186[] PROGMEM = { "Active Extruder: " }; //MSG_ACTIVE_EXTRUDER -const char MSGPL186[] PROGMEM = { "Active Extruder: " }; //MSG_ACTIVE_EXTRUDER -const char MSGEN187[] PROGMEM = { "Invalid extruder" }; //MSG_INVALID_EXTRUDER -const char MSGCZ187[] PROGMEM = { "Invalid extruder" }; //MSG_INVALID_EXTRUDER -const char MSGIT187[] PROGMEM = { "Invalid extruder" }; //MSG_INVALID_EXTRUDER -const char MSGES187[] PROGMEM = { "Invalid extruder" }; //MSG_INVALID_EXTRUDER -const char MSGPL187[] PROGMEM = { "Invalid extruder" }; //MSG_INVALID_EXTRUDER -const char MSGEN188[] PROGMEM = { "x_min: " }; //MSG_X_MIN -const char MSGCZ188[] PROGMEM = { "x_min: " }; //MSG_X_MIN -const char MSGIT188[] PROGMEM = { "x_min: " }; //MSG_X_MIN -const char MSGES188[] PROGMEM = { "x_min: " }; //MSG_X_MIN -const char MSGPL188[] PROGMEM = { "x_min: " }; //MSG_X_MIN -const char MSGEN189[] PROGMEM = { "x_max: " }; //MSG_X_MAX -const char MSGCZ189[] PROGMEM = { "x_max: " }; //MSG_X_MAX -const char MSGIT189[] PROGMEM = { "x_max: " }; //MSG_X_MAX -const char MSGES189[] PROGMEM = { "x_max: " }; //MSG_X_MAX -const char MSGPL189[] PROGMEM = { "x_max: " }; //MSG_X_MAX -const char MSGEN190[] PROGMEM = { "y_min: " }; //MSG_Y_MIN -const char MSGCZ190[] PROGMEM = { "y_min: " }; //MSG_Y_MIN -const char MSGIT190[] PROGMEM = { "y_min: " }; //MSG_Y_MIN -const char MSGES190[] PROGMEM = { "y_min: " }; //MSG_Y_MIN -const char MSGPL190[] PROGMEM = { "y_min: " }; //MSG_Y_MIN -const char MSGEN191[] PROGMEM = { "y_max: " }; //MSG_Y_MAX -const char MSGCZ191[] PROGMEM = { "y_max: " }; //MSG_Y_MAX -const char MSGIT191[] PROGMEM = { "y_max: " }; //MSG_Y_MAX -const char MSGES191[] PROGMEM = { "y_max: " }; //MSG_Y_MAX -const char MSGPL191[] PROGMEM = { "y_max: " }; //MSG_Y_MAX -const char MSGEN192[] PROGMEM = { "z_min: " }; //MSG_Z_MIN -const char MSGCZ192[] PROGMEM = { "z_min: " }; //MSG_Z_MIN -const char MSGIT192[] PROGMEM = { "z_min: " }; //MSG_Z_MIN -const char MSGES192[] PROGMEM = { "z_min: " }; //MSG_Z_MIN -const char MSGPL192[] PROGMEM = { "z_min: " }; //MSG_Z_MIN -const char MSGEN193[] PROGMEM = { "z_max: " }; //MSG_Z_MAX -const char MSGCZ193[] PROGMEM = { "z_max: " }; //MSG_Z_MAX -const char MSGIT193[] PROGMEM = { "z_max: " }; //MSG_Z_MAX -const char MSGES193[] PROGMEM = { "z_max: " }; //MSG_Z_MAX -const char MSGPL193[] PROGMEM = { "z_max: " }; //MSG_Z_MAX -const char MSGEN194[] PROGMEM = { "Reporting endstop status" }; //MSG_M119_REPORT -const char MSGCZ194[] PROGMEM = { "Reporting endstop status" }; //MSG_M119_REPORT -const char MSGIT194[] PROGMEM = { "Reporting endstop status" }; //MSG_M119_REPORT -const char MSGES194[] PROGMEM = { "Reporting endstop status" }; //MSG_M119_REPORT -const char MSGPL194[] PROGMEM = { "Reporting endstop status" }; //MSG_M119_REPORT -const char MSGEN195[] PROGMEM = { "TRIGGERED" }; //MSG_ENDSTOP_HIT -const char MSGCZ195[] PROGMEM = { "TRIGGERED" }; //MSG_ENDSTOP_HIT -const char MSGIT195[] PROGMEM = { "TRIGGERED" }; //MSG_ENDSTOP_HIT -const char MSGES195[] PROGMEM = { "TRIGGERED" }; //MSG_ENDSTOP_HIT -const char MSGPL195[] PROGMEM = { "TRIGGERED" }; //MSG_ENDSTOP_HIT -const char MSGEN196[] PROGMEM = { "open" }; //MSG_ENDSTOP_OPEN -const char MSGCZ196[] PROGMEM = { "open" }; //MSG_ENDSTOP_OPEN -const char MSGIT196[] PROGMEM = { "open" }; //MSG_ENDSTOP_OPEN -const char MSGES196[] PROGMEM = { "open" }; //MSG_ENDSTOP_OPEN -const char MSGPL196[] PROGMEM = { "open" }; //MSG_ENDSTOP_OPEN -const char MSGEN197[] PROGMEM = { "Hotend offsets:" }; //MSG_HOTEND_OFFSET -const char MSGCZ197[] PROGMEM = { "Hotend offsets:" }; //MSG_HOTEND_OFFSET -const char MSGIT197[] PROGMEM = { "Hotend offsets:" }; //MSG_HOTEND_OFFSET -const char MSGES197[] PROGMEM = { "Hotend offsets:" }; //MSG_HOTEND_OFFSET -const char MSGPL197[] PROGMEM = { "Hotend offsets:" }; //MSG_HOTEND_OFFSET -const char MSGEN198[] PROGMEM = { "Cannot open subdir" }; //MSG_SD_CANT_OPEN_SUBDIR -const char MSGCZ198[] PROGMEM = { "Cannot open subdir" }; //MSG_SD_CANT_OPEN_SUBDIR -const char MSGIT198[] PROGMEM = { "Cannot open subdir" }; //MSG_SD_CANT_OPEN_SUBDIR -const char MSGES198[] PROGMEM = { "Cannot open subdir" }; //MSG_SD_CANT_OPEN_SUBDIR -const char MSGPL198[] PROGMEM = { "Cannot open subdir" }; //MSG_SD_CANT_OPEN_SUBDIR -const char MSGEN199[] PROGMEM = { "SD init fail" }; //MSG_SD_INIT_FAIL -const char MSGCZ199[] PROGMEM = { "SD init fail" }; //MSG_SD_INIT_FAIL -const char MSGIT199[] PROGMEM = { "SD init fail" }; //MSG_SD_INIT_FAIL -const char MSGES199[] PROGMEM = { "SD init fail" }; //MSG_SD_INIT_FAIL -const char MSGPL199[] PROGMEM = { "SD init fail" }; //MSG_SD_INIT_FAIL -const char MSGEN200[] PROGMEM = { "volume.init failed" }; //MSG_SD_VOL_INIT_FAIL -const char MSGCZ200[] PROGMEM = { "volume.init failed" }; //MSG_SD_VOL_INIT_FAIL -const char MSGIT200[] PROGMEM = { "volume.init failed" }; //MSG_SD_VOL_INIT_FAIL -const char MSGES200[] PROGMEM = { "volume.init failed" }; //MSG_SD_VOL_INIT_FAIL -const char MSGPL200[] PROGMEM = { "volume.init failed" }; //MSG_SD_VOL_INIT_FAIL -const char MSGEN201[] PROGMEM = { "openRoot failed" }; //MSG_SD_OPENROOT_FAIL -const char MSGCZ201[] PROGMEM = { "openRoot failed" }; //MSG_SD_OPENROOT_FAIL -const char MSGIT201[] PROGMEM = { "openRoot failed" }; //MSG_SD_OPENROOT_FAIL -const char MSGES201[] PROGMEM = { "openRoot failed" }; //MSG_SD_OPENROOT_FAIL -const char MSGPL201[] PROGMEM = { "openRoot failed" }; //MSG_SD_OPENROOT_FAIL -const char MSGEN202[] PROGMEM = { "SD card ok" }; //MSG_SD_CARD_OK -const char MSGCZ202[] PROGMEM = { "SD card ok" }; //MSG_SD_CARD_OK -const char MSGIT202[] PROGMEM = { "SD card ok" }; //MSG_SD_CARD_OK -const char MSGES202[] PROGMEM = { "SD card ok" }; //MSG_SD_CARD_OK -const char MSGPL202[] PROGMEM = { "SD card ok" }; //MSG_SD_CARD_OK -const char MSGEN203[] PROGMEM = { "workDir open failed" }; //MSG_SD_WORKDIR_FAIL -const char MSGCZ203[] PROGMEM = { "workDir open failed" }; //MSG_SD_WORKDIR_FAIL -const char MSGIT203[] PROGMEM = { "workDir open failed" }; //MSG_SD_WORKDIR_FAIL -const char MSGES203[] PROGMEM = { "workDir open failed" }; //MSG_SD_WORKDIR_FAIL -const char MSGPL203[] PROGMEM = { "workDir open failed" }; //MSG_SD_WORKDIR_FAIL -const char MSGEN204[] PROGMEM = { "open failed, File: " }; //MSG_SD_OPEN_FILE_FAIL -const char MSGCZ204[] PROGMEM = { "open failed, File: " }; //MSG_SD_OPEN_FILE_FAIL -const char MSGIT204[] PROGMEM = { "open failed, File: " }; //MSG_SD_OPEN_FILE_FAIL -const char MSGES204[] PROGMEM = { "open failed, File: " }; //MSG_SD_OPEN_FILE_FAIL -const char MSGPL204[] PROGMEM = { "open failed, File: " }; //MSG_SD_OPEN_FILE_FAIL -const char MSGEN205[] PROGMEM = { "File opened: " }; //MSG_SD_FILE_OPENED -const char MSGCZ205[] PROGMEM = { "File opened: " }; //MSG_SD_FILE_OPENED -const char MSGIT205[] PROGMEM = { "File opened: " }; //MSG_SD_FILE_OPENED -const char MSGES205[] PROGMEM = { "File opened: " }; //MSG_SD_FILE_OPENED -const char MSGPL205[] PROGMEM = { "File opened: " }; //MSG_SD_FILE_OPENED -const char MSGEN206[] PROGMEM = { " Size: " }; //MSG_SD_SIZE -const char MSGCZ206[] PROGMEM = { " Size: " }; //MSG_SD_SIZE -const char MSGIT206[] PROGMEM = { " Size: " }; //MSG_SD_SIZE -const char MSGES206[] PROGMEM = { " Size: " }; //MSG_SD_SIZE -const char MSGPL206[] PROGMEM = { " Size: " }; //MSG_SD_SIZE -const char MSGEN207[] PROGMEM = { "File selected" }; //MSG_SD_FILE_SELECTED -const char MSGCZ207[] PROGMEM = { "File selected" }; //MSG_SD_FILE_SELECTED -const char MSGIT207[] PROGMEM = { "File selected" }; //MSG_SD_FILE_SELECTED -const char MSGES207[] PROGMEM = { "File selected" }; //MSG_SD_FILE_SELECTED -const char MSGPL207[] PROGMEM = { "File selected" }; //MSG_SD_FILE_SELECTED -const char MSGEN208[] PROGMEM = { "Writing to file: " }; //MSG_SD_WRITE_TO_FILE -const char MSGCZ208[] PROGMEM = { "Writing to file: " }; //MSG_SD_WRITE_TO_FILE -const char MSGIT208[] PROGMEM = { "Writing to file: " }; //MSG_SD_WRITE_TO_FILE -const char MSGES208[] PROGMEM = { "Writing to file: " }; //MSG_SD_WRITE_TO_FILE -const char MSGPL208[] PROGMEM = { "Writing to file: " }; //MSG_SD_WRITE_TO_FILE -const char MSGEN209[] PROGMEM = { "SD printing byte " }; //MSG_SD_PRINTING_BYTE -const char MSGCZ209[] PROGMEM = { "SD printing byte " }; //MSG_SD_PRINTING_BYTE -const char MSGIT209[] PROGMEM = { "SD printing byte " }; //MSG_SD_PRINTING_BYTE -const char MSGES209[] PROGMEM = { "SD printing byte " }; //MSG_SD_PRINTING_BYTE -const char MSGPL209[] PROGMEM = { "SD printing byte " }; //MSG_SD_PRINTING_BYTE -const char MSGEN210[] PROGMEM = { "Not SD printing" }; //MSG_SD_NOT_PRINTING -const char MSGCZ210[] PROGMEM = { "Not SD printing" }; //MSG_SD_NOT_PRINTING -const char MSGIT210[] PROGMEM = { "Not SD printing" }; //MSG_SD_NOT_PRINTING -const char MSGES210[] PROGMEM = { "Not SD printing" }; //MSG_SD_NOT_PRINTING -const char MSGPL210[] PROGMEM = { "Not SD printing" }; //MSG_SD_NOT_PRINTING -const char MSGEN211[] PROGMEM = { "error writing to file" }; //MSG_SD_ERR_WRITE_TO_FILE -const char MSGCZ211[] PROGMEM = { "error writing to file" }; //MSG_SD_ERR_WRITE_TO_FILE -const char MSGIT211[] PROGMEM = { "error writing to file" }; //MSG_SD_ERR_WRITE_TO_FILE -const char MSGES211[] PROGMEM = { "error writing to file" }; //MSG_SD_ERR_WRITE_TO_FILE -const char MSGPL211[] PROGMEM = { "error writing to file" }; //MSG_SD_ERR_WRITE_TO_FILE -const char MSGEN212[] PROGMEM = { "Cannot enter subdir: " }; //MSG_SD_CANT_ENTER_SUBDIR -const char MSGCZ212[] PROGMEM = { "Cannot enter subdir: " }; //MSG_SD_CANT_ENTER_SUBDIR -const char MSGIT212[] PROGMEM = { "Cannot enter subdir: " }; //MSG_SD_CANT_ENTER_SUBDIR -const char MSGES212[] PROGMEM = { "Cannot enter subdir: " }; //MSG_SD_CANT_ENTER_SUBDIR -const char MSGPL212[] PROGMEM = { "Cannot enter subdir: " }; //MSG_SD_CANT_ENTER_SUBDIR -const char MSGEN213[] PROGMEM = { "Steprate too high: " }; //MSG_STEPPER_TOO_HIGH -const char MSGCZ213[] PROGMEM = { "Steprate too high: " }; //MSG_STEPPER_TOO_HIGH -const char MSGIT213[] PROGMEM = { "Steprate too high: " }; //MSG_STEPPER_TOO_HIGH -const char MSGES213[] PROGMEM = { "Steprate too high: " }; //MSG_STEPPER_TOO_HIGH -const char MSGPL213[] PROGMEM = { "Steprate too high: " }; //MSG_STEPPER_TOO_HIGH -const char MSGEN214[] PROGMEM = { "endstops hit: " }; //MSG_ENDSTOPS_HIT -const char MSGCZ214[] PROGMEM = { "endstops hit: " }; //MSG_ENDSTOPS_HIT -const char MSGIT214[] PROGMEM = { "endstops hit: " }; //MSG_ENDSTOPS_HIT -const char MSGES214[] PROGMEM = { "endstops hit: " }; //MSG_ENDSTOPS_HIT -const char MSGPL214[] PROGMEM = { "endstops hit: " }; //MSG_ENDSTOPS_HIT -const char MSGEN215[] PROGMEM = { " cold extrusion prevented" }; //MSG_ERR_COLD_EXTRUDE_STOP -const char MSGCZ215[] PROGMEM = { " cold extrusion prevented" }; //MSG_ERR_COLD_EXTRUDE_STOP -const char MSGIT215[] PROGMEM = { " cold extrusion prevented" }; //MSG_ERR_COLD_EXTRUDE_STOP -const char MSGES215[] PROGMEM = { " cold extrusion prevented" }; //MSG_ERR_COLD_EXTRUDE_STOP -const char MSGPL215[] PROGMEM = { " cold extrusion prevented" }; //MSG_ERR_COLD_EXTRUDE_STOP -const char MSGEN216[] PROGMEM = { " too long extrusion prevented" }; //MSG_ERR_LONG_EXTRUDE_STOP -const char MSGCZ216[] PROGMEM = { " too long extrusion prevented" }; //MSG_ERR_LONG_EXTRUDE_STOP -const char MSGIT216[] PROGMEM = { " too long extrusion prevented" }; //MSG_ERR_LONG_EXTRUDE_STOP -const char MSGES216[] PROGMEM = { " too long extrusion prevented" }; //MSG_ERR_LONG_EXTRUDE_STOP -const char MSGPL216[] PROGMEM = { " too long extrusion prevented" }; //MSG_ERR_LONG_EXTRUDE_STOP -const char MSGEN217[] PROGMEM = { "Babystepping X" }; //MSG_BABYSTEPPING_X -const char MSGCZ217[] PROGMEM = { "Babystepping X" }; //MSG_BABYSTEPPING_X -const char MSGIT217[] PROGMEM = { "Babystepping X" }; //MSG_BABYSTEPPING_X -const char MSGES217[] PROGMEM = { "Babystepping X" }; //MSG_BABYSTEPPING_X -const char MSGPL217[] PROGMEM = { "Babystepping X" }; //MSG_BABYSTEPPING_X -const char MSGEN218[] PROGMEM = { "Babystepping Y" }; //MSG_BABYSTEPPING_Y -const char MSGCZ218[] PROGMEM = { "Babystepping Y" }; //MSG_BABYSTEPPING_Y -const char MSGIT218[] PROGMEM = { "Babystepping Y" }; //MSG_BABYSTEPPING_Y -const char MSGES218[] PROGMEM = { "Babystepping Y" }; //MSG_BABYSTEPPING_Y -const char MSGPL218[] PROGMEM = { "Babystepping Y" }; //MSG_BABYSTEPPING_Y -const char MSGEN219[] PROGMEM = { "Adjusting Z" }; //MSG_BABYSTEPPING_Z -const char MSGCZ219[] PROGMEM = { "Dostavovani Z" }; //MSG_BABYSTEPPING_Z -const char MSGIT219[] PROGMEM = { "Adjusting Z" }; //MSG_BABYSTEPPING_Z -const char MSGES219[] PROGMEM = { "Adjusting Z" }; //MSG_BABYSTEPPING_Z -const char MSGPL219[] PROGMEM = { "Dostavovani Z" }; //MSG_BABYSTEPPING_Z -const char MSGEN220[] PROGMEM = { "Error in menu structure" }; //MSG_SERIAL_ERROR_MENU_STRUCTURE -const char MSGCZ220[] PROGMEM = { "Error in menu structure" }; //MSG_SERIAL_ERROR_MENU_STRUCTURE -const char MSGIT220[] PROGMEM = { "Error in menu structure" }; //MSG_SERIAL_ERROR_MENU_STRUCTURE -const char MSGES220[] PROGMEM = { "Error in menu structure" }; //MSG_SERIAL_ERROR_MENU_STRUCTURE -const char MSGPL220[] PROGMEM = { "Error in menu structure" }; //MSG_SERIAL_ERROR_MENU_STRUCTURE -const char MSGEN221[] PROGMEM = { "English" }; //MSG_LANGUAGE_NAME -const char MSGCZ221[] PROGMEM = { "Cestina" }; //MSG_LANGUAGE_NAME -const char MSGIT221[] PROGMEM = { "Italiano" }; //MSG_LANGUAGE_NAME -const char MSGES221[] PROGMEM = { "Espanol" }; //MSG_LANGUAGE_NAME -const char MSGPL221[] PROGMEM = { "Polski" }; //MSG_LANGUAGE_NAME -const char MSGEN222[] PROGMEM = { "Select language " }; //MSG_LANGUAGE_SELECT -const char MSGCZ222[] PROGMEM = { "Vyber jazyka " }; //MSG_LANGUAGE_SELECT -const char MSGIT222[] PROGMEM = { "Selez. la lingua" }; //MSG_LANGUAGE_SELECT -const char MSGES222[] PROGMEM = { "Cambia la lengua " }; //MSG_LANGUAGE_SELECT -const char MSGPL222[] PROGMEM = { "Wybor jezyka " }; //MSG_LANGUAGE_SELECT -const char MSGEN223[] PROGMEM = { "prusa3d.com" }; //MSG_PRUSA3D -const char MSGCZ223[] PROGMEM = { "prusa3d.cz" }; //MSG_PRUSA3D -const char MSGIT223[] PROGMEM = { "prusa3d.com" }; //MSG_PRUSA3D -const char MSGES223[] PROGMEM = { "prusa3d.com" }; //MSG_PRUSA3D -const char MSGPL223[] PROGMEM = { "prusa3d.cz" }; //MSG_PRUSA3D -const char MSGEN224[] PROGMEM = { "forum.prusa3d.com" }; //MSG_PRUSA3D_FORUM -const char MSGCZ224[] PROGMEM = { "forum.prusa3d.cz" }; //MSG_PRUSA3D_FORUM -const char MSGIT224[] PROGMEM = { "forum.prusa3d.com" }; //MSG_PRUSA3D_FORUM -const char MSGES224[] PROGMEM = { "forum.prusa3d.com" }; //MSG_PRUSA3D_FORUM -const char MSGPL224[] PROGMEM = { "forum.prusa3d.cz" }; //MSG_PRUSA3D_FORUM -const char MSGEN225[] PROGMEM = { "howto.prusa3d.com" }; //MSG_PRUSA3D_HOWTO -const char MSGCZ225[] PROGMEM = { "howto.prusa3d.cz" }; //MSG_PRUSA3D_HOWTO -const char MSGIT225[] PROGMEM = { "howto.prusa3d.com" }; //MSG_PRUSA3D_HOWTO -const char MSGES225[] PROGMEM = { "howto.prusa3d.com" }; //MSG_PRUSA3D_HOWTO -const char MSGPL225[] PROGMEM = { "howto.prusa3d.cz" }; //MSG_PRUSA3D_HOWTO -const char MSGEN226[] PROGMEM = { "Selftest error !" }; //MSG_SELFTEST_ERROR -const char MSGCZ226[] PROGMEM = { "Selftest error !" }; //MSG_SELFTEST_ERROR -const char MSGIT226[] PROGMEM = { "Autotest negativo" }; //MSG_SELFTEST_ERROR -const char MSGES226[] PROGMEM = { "¡Autotest error!" }; //MSG_SELFTEST_ERROR -const char MSGPL226[] PROGMEM = { "Selftest error !" }; //MSG_SELFTEST_ERROR -const char MSGEN227[] PROGMEM = { "Please check :" }; //MSG_SELFTEST_PLEASECHECK -const char MSGCZ227[] PROGMEM = { "Zkontrolujte :" }; //MSG_SELFTEST_PLEASECHECK -const char MSGIT227[] PROGMEM = { "Verifica:" }; //MSG_SELFTEST_PLEASECHECK -const char MSGES227[] PROGMEM = { "Controla :" }; //MSG_SELFTEST_PLEASECHECK -const char MSGPL227[] PROGMEM = { "Skontroluj :" }; //MSG_SELFTEST_PLEASECHECK -const char MSGEN228[] PROGMEM = { "Not connected" }; //MSG_SELFTEST_NOTCONNECTED -const char MSGCZ228[] PROGMEM = { "Nezapojeno " }; //MSG_SELFTEST_NOTCONNECTED -const char MSGIT228[] PROGMEM = { "Non connesso" }; //MSG_SELFTEST_NOTCONNECTED -const char MSGES228[] PROGMEM = { "No hay conexion " }; //MSG_SELFTEST_NOTCONNECTED -const char MSGPL228[] PROGMEM = { "Nie podlaczono " }; //MSG_SELFTEST_NOTCONNECTED -const char MSGEN229[] PROGMEM = { "Heater/Thermistor" }; //MSG_SELFTEST_HEATERTHERMISTOR -const char MSGCZ229[] PROGMEM = { "Heater/Thermistor" }; //MSG_SELFTEST_HEATERTHERMISTOR -const char MSGIT229[] PROGMEM = { "Riscald./Termistore" }; //MSG_SELFTEST_HEATERTHERMISTOR -const char MSGES229[] PROGMEM = { "Calent./Termistor" }; //MSG_SELFTEST_HEATERTHERMISTOR -const char MSGPL229[] PROGMEM = { "Heater/Thermistor" }; //MSG_SELFTEST_HEATERTHERMISTOR -const char MSGEN230[] PROGMEM = { "Bed / Heater" }; //MSG_SELFTEST_BEDHEATER -const char MSGCZ230[] PROGMEM = { "Bed / Heater" }; //MSG_SELFTEST_BEDHEATER -const char MSGIT230[] PROGMEM = { "Piastra/Riscaldatore" }; //MSG_SELFTEST_BEDHEATER -const char MSGES230[] PROGMEM = { "Cama/Calentador" }; //MSG_SELFTEST_BEDHEATER -const char MSGPL230[] PROGMEM = { "Bed / Heater" }; //MSG_SELFTEST_BEDHEATER -const char MSGEN231[] PROGMEM = { "Wiring error" }; //MSG_SELFTEST_WIRINGERROR -const char MSGCZ231[] PROGMEM = { "Chyba zapojeni" }; //MSG_SELFTEST_WIRINGERROR -const char MSGIT231[] PROGMEM = { "Errore cablaggio" }; //MSG_SELFTEST_WIRINGERROR -const char MSGES231[] PROGMEM = { "Error de conexión" }; //MSG_SELFTEST_WIRINGERROR -const char MSGPL231[] PROGMEM = { "Blad polaczenia" }; //MSG_SELFTEST_WIRINGERROR -const char MSGEN232[] PROGMEM = { "Endstops" }; //MSG_SELFTEST_ENDSTOPS -const char MSGCZ232[] PROGMEM = { "Endstops" }; //MSG_SELFTEST_ENDSTOPS -const char MSGIT232[] PROGMEM = { "Limiti corsa" }; //MSG_SELFTEST_ENDSTOPS -const char MSGES232[] PROGMEM = { "Topes final" }; //MSG_SELFTEST_ENDSTOPS -const char MSGPL232[] PROGMEM = { "Endstops" }; //MSG_SELFTEST_ENDSTOPS -const char MSGEN233[] PROGMEM = { "Motor" }; //MSG_SELFTEST_MOTOR -const char MSGCZ233[] PROGMEM = { "Motor" }; //MSG_SELFTEST_MOTOR -const char MSGIT233[] PROGMEM = { "Motore" }; //MSG_SELFTEST_MOTOR -const char MSGES233[] PROGMEM = { "Motor" }; //MSG_SELFTEST_MOTOR -const char MSGPL233[] PROGMEM = { "Silnik" }; //MSG_SELFTEST_MOTOR -const char MSGEN234[] PROGMEM = { "Endstop" }; //MSG_SELFTEST_ENDSTOP -const char MSGCZ234[] PROGMEM = { "Endstop" }; //MSG_SELFTEST_ENDSTOP -const char MSGIT234[] PROGMEM = { "Limite corsa" }; //MSG_SELFTEST_ENDSTOP -const char MSGES234[] PROGMEM = { "Tope final" }; //MSG_SELFTEST_ENDSTOP -const char MSGPL234[] PROGMEM = { "Endstop" }; //MSG_SELFTEST_ENDSTOP -const char MSGEN235[] PROGMEM = { "Endstop not hit" }; //MSG_SELFTEST_ENDSTOP_NOTHIT -const char MSGCZ235[] PROGMEM = { "Endstop not hit" }; //MSG_SELFTEST_ENDSTOP_NOTHIT -const char MSGIT235[] PROGMEM = { "Lim. fuoriportata" }; //MSG_SELFTEST_ENDSTOP_NOTHIT -const char MSGES235[] PROGMEM = { "Tope fin. no toc." }; //MSG_SELFTEST_ENDSTOP_NOTHIT -const char MSGPL235[] PROGMEM = { "Endstop not hit" }; //MSG_SELFTEST_ENDSTOP_NOTHIT -const char MSGEN236[] PROGMEM = { "Self test OK" }; //MSG_SELFTEST_OK -const char MSGCZ236[] PROGMEM = { "Self test OK" }; //MSG_SELFTEST_OK -const char MSGIT236[] PROGMEM = { "Autotest OK" }; //MSG_SELFTEST_OK -const char MSGES236[] PROGMEM = { "Self test OK" }; //MSG_SELFTEST_OK -const char MSGPL236[] PROGMEM = { "Self test OK" }; //MSG_SELFTEST_OK -const char MSGEN237[] PROGMEM = { "Total filament :" }; //MSG_STATS_TOTALFILAMENT -const char MSGCZ237[] PROGMEM = { "Filament celkem :" }; //MSG_STATS_TOTALFILAMENT -const char MSGIT237[] PROGMEM = { "Filamento tot:" }; //MSG_STATS_TOTALFILAMENT -const char MSGES237[] PROGMEM = { "Filamento total:" }; //MSG_STATS_TOTALFILAMENT -const char MSGPL237[] PROGMEM = { "Filament lacznie :" }; //MSG_STATS_TOTALFILAMENT -const char MSGEN238[] PROGMEM = { "Total print time :" }; //MSG_STATS_TOTALPRINTTIME -const char MSGCZ238[] PROGMEM = { "Celkovy cas :" }; //MSG_STATS_TOTALPRINTTIME -const char MSGIT238[] PROGMEM = { "Tempo stampa tot:" }; //MSG_STATS_TOTALPRINTTIME -const char MSGES238[] PROGMEM = { "Tiempo total :" }; //MSG_STATS_TOTALPRINTTIME -const char MSGPL238[] PROGMEM = { "Czas calkowity :" }; //MSG_STATS_TOTALPRINTTIME -const char MSGEN239[] PROGMEM = { "Filament used: " }; //MSG_STATS_FILAMENTUSED -const char MSGCZ239[] PROGMEM = { "Filament : " }; //MSG_STATS_FILAMENTUSED -const char MSGIT239[] PROGMEM = { "Filamento:" }; //MSG_STATS_FILAMENTUSED -const char MSGES239[] PROGMEM = { "Filamento : " }; //MSG_STATS_FILAMENTUSED -const char MSGPL239[] PROGMEM = { "Filament : " }; //MSG_STATS_FILAMENTUSED -const char MSGEN240[] PROGMEM = { "Print time: " }; //MSG_STATS_PRINTTIME -const char MSGCZ240[] PROGMEM = { "Cas tisku : " }; //MSG_STATS_PRINTTIME -const char MSGIT240[] PROGMEM = { "Tempo stampa:" }; //MSG_STATS_PRINTTIME -const char MSGES240[] PROGMEM = { "Tiempo de imp.:" }; //MSG_STATS_PRINTTIME -const char MSGPL240[] PROGMEM = { "Czas druku : " }; //MSG_STATS_PRINTTIME -const char MSGEN241[] PROGMEM = { "Self test start " }; //MSG_SELFTEST_START -const char MSGCZ241[] PROGMEM = { "Self test start " }; //MSG_SELFTEST_START -const char MSGIT241[] PROGMEM = { "Inizia autotest" }; //MSG_SELFTEST_START -const char MSGES241[] PROGMEM = { "Autotest salida" }; //MSG_SELFTEST_START -const char MSGPL241[] PROGMEM = { "Self test start " }; //MSG_SELFTEST_START -const char MSGEN242[] PROGMEM = { "Checking endstops" }; //MSG_SELFTEST_CHECK_ENDSTOPS -const char MSGCZ242[] PROGMEM = { "Kontrola endstops" }; //MSG_SELFTEST_CHECK_ENDSTOPS -const char MSGIT242[] PROGMEM = { "Verifica limiti" }; //MSG_SELFTEST_CHECK_ENDSTOPS -const char MSGES242[] PROGMEM = { "Cont. topes final" }; //MSG_SELFTEST_CHECK_ENDSTOPS -const char MSGPL242[] PROGMEM = { "Kontrola endstops" }; //MSG_SELFTEST_CHECK_ENDSTOPS -const char MSGEN243[] PROGMEM = { "Checking hotend " }; //MSG_SELFTEST_CHECK_HOTEND -const char MSGCZ243[] PROGMEM = { "Kontrola hotend " }; //MSG_SELFTEST_CHECK_HOTEND -const char MSGIT243[] PROGMEM = { "Verifica lim temp" }; //MSG_SELFTEST_CHECK_HOTEND -const char MSGES243[] PROGMEM = { "Control hotend " }; //MSG_SELFTEST_CHECK_HOTEND -const char MSGPL243[] PROGMEM = { "Kontrola hotend " }; //MSG_SELFTEST_CHECK_HOTEND -const char MSGEN244[] PROGMEM = { "Checking X axis " }; //MSG_SELFTEST_CHECK_X -const char MSGCZ244[] PROGMEM = { "Kontrola X axis " }; //MSG_SELFTEST_CHECK_X -const char MSGIT244[] PROGMEM = { "Verifica asse X" }; //MSG_SELFTEST_CHECK_X -const char MSGES244[] PROGMEM = { "Control del eje X" }; //MSG_SELFTEST_CHECK_X -const char MSGPL244[] PROGMEM = { "Kontrola X axis " }; //MSG_SELFTEST_CHECK_X -const char MSGEN245[] PROGMEM = { "Checking Y axis " }; //MSG_SELFTEST_CHECK_Y -const char MSGCZ245[] PROGMEM = { "Kontrola Y axis " }; //MSG_SELFTEST_CHECK_Y -const char MSGIT245[] PROGMEM = { "Verifica asse Y" }; //MSG_SELFTEST_CHECK_Y -const char MSGES245[] PROGMEM = { "Control del eje Y" }; //MSG_SELFTEST_CHECK_Y -const char MSGPL245[] PROGMEM = { "Kontrola Y axis " }; //MSG_SELFTEST_CHECK_Y -const char MSGEN246[] PROGMEM = { "Checking Z axis " }; //MSG_SELFTEST_CHECK_Z -const char MSGCZ246[] PROGMEM = { "Kontrola Z axis " }; //MSG_SELFTEST_CHECK_Z -const char MSGIT246[] PROGMEM = { "Verifica asse Z" }; //MSG_SELFTEST_CHECK_Z -const char MSGES246[] PROGMEM = { "Control del eje Z" }; //MSG_SELFTEST_CHECK_Z -const char MSGPL246[] PROGMEM = { "Kontrola Z axis " }; //MSG_SELFTEST_CHECK_Z -const char MSGEN247[] PROGMEM = { "Checking bed " }; //MSG_SELFTEST_CHECK_BED -const char MSGCZ247[] PROGMEM = { "Kontrola bed " }; //MSG_SELFTEST_CHECK_BED -const char MSGIT247[] PROGMEM = { "Verifica piastra" }; //MSG_SELFTEST_CHECK_BED -const char MSGES247[] PROGMEM = { "Control de cama" }; //MSG_SELFTEST_CHECK_BED -const char MSGPL247[] PROGMEM = { "Kontrola bed " }; //MSG_SELFTEST_CHECK_BED -const char MSGEN248[] PROGMEM = { "All correct " }; //MSG_SELFTEST_CHECK_ALLCORRECT -const char MSGCZ248[] PROGMEM = { "Vse OK " }; //MSG_SELFTEST_CHECK_ALLCORRECT -const char MSGIT248[] PROGMEM = { "Nessun errore" }; //MSG_SELFTEST_CHECK_ALLCORRECT -const char MSGES248[] PROGMEM = { "Todo bie " }; //MSG_SELFTEST_CHECK_ALLCORRECT -const char MSGPL248[] PROGMEM = { "Wszystko OK " }; //MSG_SELFTEST_CHECK_ALLCORRECT -const char MSGEN249[] PROGMEM = { "Selftest " }; //MSG_SELFTEST -const char MSGCZ249[] PROGMEM = { "Selftest " }; //MSG_SELFTEST -const char MSGIT249[] PROGMEM = { "Autotest" }; //MSG_SELFTEST -const char MSGES249[] PROGMEM = { "Autotest" }; //MSG_SELFTEST -const char MSGPL249[] PROGMEM = { "Selftest " }; //MSG_SELFTEST -const char MSGEN250[] PROGMEM = { "Selftest failed " }; //MSG_SELFTEST_FAILED -const char MSGCZ250[] PROGMEM = { "Selftest selhal " }; //MSG_SELFTEST_FAILED -const char MSGIT250[] PROGMEM = { "Autotest fallito" }; //MSG_SELFTEST_FAILED -const char MSGES250[] PROGMEM = { "Autotest fallado" }; //MSG_SELFTEST_FAILED -const char MSGPL250[] PROGMEM = { "Selftest nieudany" }; //MSG_SELFTEST_FAILED -const char MSGEN251[] PROGMEM = { "Statistics " }; //MSG_STATISTICS -const char MSGCZ251[] PROGMEM = { "Statistika " }; //MSG_STATISTICS -const char MSGIT251[] PROGMEM = { "Statistiche" }; //MSG_STATISTICS -const char MSGES251[] PROGMEM = { "Estadistica " }; //MSG_STATISTICS -const char MSGPL251[] PROGMEM = { "Statystyka " }; //MSG_STATISTICS -const char MSGEN252[] PROGMEM = { "USB printing " }; //MSG_USB_PRINTING -const char MSGCZ252[] PROGMEM = { "Tisk z USB " }; //MSG_USB_PRINTING -const char MSGIT252[] PROGMEM = { "Stampa da USB" }; //MSG_USB_PRINTING -const char MSGES252[] PROGMEM = { "Impresion de USB " }; //MSG_USB_PRINTING -const char MSGPL252[] PROGMEM = { "Druk z USB " }; //MSG_USB_PRINTING -const char* MSGEN[] = {MSGEN0, //WELCOME_MSG -MSGEN1, //MSG_SD_INSERTED -MSGEN2, //MSG_SD_REMOVED -MSGEN3, //MSG_MAIN -MSGEN4, //MSG_AUTOSTART -MSGEN5, //MSG_DISABLE_STEPPERS -MSGEN6, //MSG_AUTO_HOME -MSGEN7, //MSG_SET_HOME_OFFSETS -MSGEN8, //MSG_SET_ORIGIN -MSGEN9, //MSG_PREHEAT_PLA -MSGEN10, //MSG_PREHEAT_PLA0 -MSGEN11, //MSG_PREHEAT_PLA1 -MSGEN12, //MSG_PREHEAT_PLA2 -MSGEN13, //MSG_PREHEAT_PLA012 -MSGEN14, //MSG_PREHEAT_PLA_BEDONLY -MSGEN15, //MSG_PREHEAT_PLA_SETTINGS -MSGEN16, //MSG_PREHEAT_ABS -MSGEN17, //MSG_PREHEAT_ABS0 -MSGEN18, //MSG_PREHEAT_ABS1 -MSGEN19, //MSG_PREHEAT_ABS2 -MSGEN20, //MSG_PREHEAT_ABS012 -MSGEN21, //MSG_PREHEAT_ABS_BEDONLY -MSGEN22, //MSG_PREHEAT_ABS_SETTINGS -MSGEN23, //MSG_COOLDOWN -MSGEN24, //MSG_SWITCH_PS_ON -MSGEN25, //MSG_SWITCH_PS_OFF -MSGEN26, //MSG_EXTRUDE -MSGEN27, //MSG_RETRACT -MSGEN28, //MSG_MOVE_AXIS -MSGEN29, //MSG_MOVE_X -MSGEN30, //MSG_MOVE_Y -MSGEN31, //MSG_MOVE_Z -MSGEN32, //MSG_MOVE_E -MSGEN33, //MSG_MOVE_E1 -MSGEN34, //MSG_MOVE_E2 -MSGEN35, //MSG_MOVE_01MM -MSGEN36, //MSG_MOVE_1MM -MSGEN37, //MSG_MOVE_10MM -MSGEN38, //MSG_SPEED -MSGEN39, //MSG_NOZZLE -MSGEN40, //MSG_NOZZLE1 -MSGEN41, //MSG_NOZZLE2 -MSGEN42, //MSG_BED -MSGEN43, //MSG_FAN_SPEED -MSGEN44, //MSG_FLOW -MSGEN45, //MSG_FLOW0 -MSGEN46, //MSG_FLOW1 -MSGEN47, //MSG_FLOW2 -MSGEN48, //MSG_CONTROL -MSGEN49, //MSG_MIN -MSGEN50, //MSG_MAX -MSGEN51, //MSG_FACTOR -MSGEN52, //MSG_AUTOTEMP -MSGEN53, //MSG_ON -MSGEN54, //MSG_OFF -MSGEN55, //MSG_PID_P -MSGEN56, //MSG_PID_I -MSGEN57, //MSG_PID_D -MSGEN58, //MSG_PID_C -MSGEN59, //MSG_ACC -MSGEN60, //MSG_VXY_JERK -MSGEN61, //MSG_VZ_JERK -MSGEN62, //MSG_VE_JERK -MSGEN63, //MSG_VMAX -MSGEN64, //MSG_X -MSGEN65, //MSG_Y -MSGEN66, //MSG_Z -MSGEN67, //MSG_E -MSGEN68, //MSG_VMIN -MSGEN69, //MSG_VTRAV_MIN -MSGEN70, //MSG_AMAX -MSGEN71, //MSG_A_RETRACT -MSGEN72, //MSG_XSTEPS -MSGEN73, //MSG_YSTEPS -MSGEN74, //MSG_ZSTEPS -MSGEN75, //MSG_ESTEPS -MSGEN76, //MSG_TEMPERATURE -MSGEN77, //MSG_MOTION -MSGEN78, //MSG_VOLUMETRIC -MSGEN79, //MSG_VOLUMETRIC_ENABLED -MSGEN80, //MSG_FILAMENT_SIZE_EXTRUDER_0 -MSGEN81, //MSG_FILAMENT_SIZE_EXTRUDER_1 -MSGEN82, //MSG_FILAMENT_SIZE_EXTRUDER_2 -MSGEN83, //MSG_CONTRAST -MSGEN84, //MSG_STORE_EPROM -MSGEN85, //MSG_LOAD_EPROM -MSGEN86, //MSG_RESTORE_FAILSAFE -MSGEN87, //MSG_REFRESH -MSGEN88, //MSG_WATCH -MSGEN89, //MSG_PREPARE -MSGEN90, //MSG_TUNE -MSGEN91, //MSG_PAUSE_PRINT -MSGEN92, //MSG_RESUME_PRINT -MSGEN93, //MSG_STOP_PRINT -MSGEN94, //MSG_CARD_MENU -MSGEN95, //MSG_NO_CARD -MSGEN96, //MSG_DWELL -MSGEN97, //MSG_USERWAIT -MSGEN98, //MSG_RESUMING -MSGEN99, //MSG_PRINT_ABORTED -MSGEN100, //MSG_NO_MOVE -MSGEN101, //MSG_KILLED -MSGEN102, //MSG_STOPPED -MSGEN103, //MSG_CONTROL_RETRACT -MSGEN104, //MSG_CONTROL_RETRACT_SWAP -MSGEN105, //MSG_CONTROL_RETRACTF -MSGEN106, //MSG_CONTROL_RETRACT_ZLIFT -MSGEN107, //MSG_CONTROL_RETRACT_RECOVER -MSGEN108, //MSG_CONTROL_RETRACT_RECOVER_SWAP -MSGEN109, //MSG_CONTROL_RETRACT_RECOVERF -MSGEN110, //MSG_AUTORETRACT -MSGEN111, //MSG_FILAMENTCHANGE -MSGEN112, //MSG_INIT_SDCARD -MSGEN113, //MSG_CNG_SDCARD -MSGEN114, //MSG_ZPROBE_OUT -MSGEN115, //MSG_POSITION_UNKNOWN -MSGEN116, //MSG_ZPROBE_ZOFFSET -MSGEN117, //MSG_BABYSTEP_X -MSGEN118, //MSG_BABYSTEP_Y -MSGEN119, //MSG_BABYSTEP_Z -MSGEN120, //MSG_ENDSTOP_ABORT -MSGEN121, //MSG_ADJUSTZ -MSGEN122, //MSG_PICK_Z -MSGEN123, //MSG_HOMEYZ -MSGEN124, //MSG_HOMEYZ_PROGRESS -MSGEN125, //MSG_HOMEYZ_DONE -MSGEN126, //MSG_SETTINGS -MSGEN127, //MSG_PREHEAT -MSGEN128, //MSG_UNLOAD_FILAMENT -MSGEN129, //MSG_LOAD_FILAMENT -MSGEN130, //MSG_RECTRACT -MSGEN131, //MSG_ERROR -MSGEN132, //MSG_PREHEAT_NOZZLE -MSGEN133, //MSG_SUPPORT -MSGEN134, //MSG_CORRECTLY -MSGEN135, //MSG_YES -MSGEN136, //MSG_NO -MSGEN137, //MSG_NOT_LOADED -MSGEN138, //MSG_NOT_COLOR -MSGEN139, //MSG_LOADING_FILAMENT -MSGEN140, //MSG_PLEASE_WAIT -MSGEN141, //MSG_LOADING_COLOR -MSGEN142, //MSG_CHANGE_SUCCESS -MSGEN143, //MSG_PRESS -MSGEN144, //MSG_INSERT_FILAMENT -MSGEN145, //MSG_CHANGING_FILAMENT -MSGEN146, //MSG_SILENT_MODE_ON -MSGEN147, //MSG_SILENT_MODE_OFF -MSGEN148, //MSG_REBOOT -MSGEN149, //MSG_TAKE_EFFECT -MSGEN150, //MSG_Enqueing -MSGEN151, //MSG_POWERUP -MSGEN152, //MSG_EXTERNAL_RESET -MSGEN153, //MSG_BROWNOUT_RESET -MSGEN154, //MSG_WATCHDOG_RESET -MSGEN155, //MSG_SOFTWARE_RESET -MSGEN156, //MSG_AUTHOR -MSGEN157, //MSG_CONFIGURATION_VER -MSGEN158, //MSG_FREE_MEMORY -MSGEN159, //MSG_PLANNER_BUFFER_BYTES -MSGEN160, //MSG_OK -MSGEN161, //MSG_FILE_SAVED -MSGEN162, //MSG_ERR_LINE_NO -MSGEN163, //MSG_ERR_CHECKSUM_MISMATCH -MSGEN164, //MSG_ERR_NO_CHECKSUM -MSGEN165, //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -MSGEN166, //MSG_FILE_PRINTED -MSGEN167, //MSG_BEGIN_FILE_LIST -MSGEN168, //MSG_END_FILE_LIST -MSGEN169, //MSG_M104_INVALID_EXTRUDER -MSGEN170, //MSG_M105_INVALID_EXTRUDER -MSGEN171, //MSG_M200_INVALID_EXTRUDER -MSGEN172, //MSG_M218_INVALID_EXTRUDER -MSGEN173, //MSG_M221_INVALID_EXTRUDER -MSGEN174, //MSG_ERR_NO_THERMISTORS -MSGEN175, //MSG_M109_INVALID_EXTRUDER -MSGEN176, //MSG_HEATING -MSGEN177, //MSG_HEATING_COMPLETE -MSGEN178, //MSG_BED_HEATING -MSGEN179, //MSG_BED_DONE -MSGEN180, //MSG_M115_REPORT -MSGEN181, //MSG_COUNT_X -MSGEN182, //MSG_ERR_KILLED -MSGEN183, //MSG_ERR_STOPPED -MSGEN184, //MSG_RESEND -MSGEN185, //MSG_UNKNOWN_COMMAND -MSGEN186, //MSG_ACTIVE_EXTRUDER -MSGEN187, //MSG_INVALID_EXTRUDER -MSGEN188, //MSG_X_MIN -MSGEN189, //MSG_X_MAX -MSGEN190, //MSG_Y_MIN -MSGEN191, //MSG_Y_MAX -MSGEN192, //MSG_Z_MIN -MSGEN193, //MSG_Z_MAX -MSGEN194, //MSG_M119_REPORT -MSGEN195, //MSG_ENDSTOP_HIT -MSGEN196, //MSG_ENDSTOP_OPEN -MSGEN197, //MSG_HOTEND_OFFSET -MSGEN198, //MSG_SD_CANT_OPEN_SUBDIR -MSGEN199, //MSG_SD_INIT_FAIL -MSGEN200, //MSG_SD_VOL_INIT_FAIL -MSGEN201, //MSG_SD_OPENROOT_FAIL -MSGEN202, //MSG_SD_CARD_OK -MSGEN203, //MSG_SD_WORKDIR_FAIL -MSGEN204, //MSG_SD_OPEN_FILE_FAIL -MSGEN205, //MSG_SD_FILE_OPENED -MSGEN206, //MSG_SD_SIZE -MSGEN207, //MSG_SD_FILE_SELECTED -MSGEN208, //MSG_SD_WRITE_TO_FILE -MSGEN209, //MSG_SD_PRINTING_BYTE -MSGEN210, //MSG_SD_NOT_PRINTING -MSGEN211, //MSG_SD_ERR_WRITE_TO_FILE -MSGEN212, //MSG_SD_CANT_ENTER_SUBDIR -MSGEN213, //MSG_STEPPER_TOO_HIGH -MSGEN214, //MSG_ENDSTOPS_HIT -MSGEN215, //MSG_ERR_COLD_EXTRUDE_STOP -MSGEN216, //MSG_ERR_LONG_EXTRUDE_STOP -MSGEN217, //MSG_BABYSTEPPING_X -MSGEN218, //MSG_BABYSTEPPING_Y -MSGEN219, //MSG_BABYSTEPPING_Z -MSGEN220, //MSG_SERIAL_ERROR_MENU_STRUCTURE -MSGEN221, //MSG_LANGUAGE_NAME -MSGEN222, //MSG_LANGUAGE_SELECT -MSGEN223, //MSG_PRUSA3D -MSGEN224, //MSG_PRUSA3D_FORUM -MSGEN225, //MSG_PRUSA3D_HOWTO -MSGEN226, //MSG_SELFTEST_ERROR -MSGEN227, //MSG_SELFTEST_PLEASECHECK -MSGEN228, //MSG_SELFTEST_NOTCONNECTED -MSGEN229, //MSG_SELFTEST_HEATERTHERMISTOR -MSGEN230, //MSG_SELFTEST_BEDHEATER -MSGEN231, //MSG_SELFTEST_WIRINGERROR -MSGEN232, //MSG_SELFTEST_ENDSTOPS -MSGEN233, //MSG_SELFTEST_MOTOR -MSGEN234, //MSG_SELFTEST_ENDSTOP -MSGEN235, //MSG_SELFTEST_ENDSTOP_NOTHIT -MSGEN236, //MSG_SELFTEST_OK -MSGEN237, //MSG_STATS_TOTALFILAMENT -MSGEN238, //MSG_STATS_TOTALPRINTTIME -MSGEN239, //MSG_STATS_FILAMENTUSED -MSGEN240, //MSG_STATS_PRINTTIME -MSGEN241, //MSG_SELFTEST_START -MSGEN242, //MSG_SELFTEST_CHECK_ENDSTOPS -MSGEN243, //MSG_SELFTEST_CHECK_HOTEND -MSGEN244, //MSG_SELFTEST_CHECK_X -MSGEN245, //MSG_SELFTEST_CHECK_Y -MSGEN246, //MSG_SELFTEST_CHECK_Z -MSGEN247, //MSG_SELFTEST_CHECK_BED -MSGEN248, //MSG_SELFTEST_CHECK_ALLCORRECT -MSGEN249, //MSG_SELFTEST -MSGEN250, //MSG_SELFTEST_FAILED -MSGEN251, //MSG_STATISTICS -MSGEN252, //MSG_USB_PRINTING -}; -const char* MSGCZ[] = {MSGCZ0, //WELCOME_MSG -MSGCZ1, //MSG_SD_INSERTED -MSGCZ2, //MSG_SD_REMOVED -MSGCZ3, //MSG_MAIN -MSGCZ4, //MSG_AUTOSTART -MSGCZ5, //MSG_DISABLE_STEPPERS -MSGCZ6, //MSG_AUTO_HOME -MSGCZ7, //MSG_SET_HOME_OFFSETS -MSGCZ8, //MSG_SET_ORIGIN -MSGCZ9, //MSG_PREHEAT_PLA -MSGCZ10, //MSG_PREHEAT_PLA0 -MSGCZ11, //MSG_PREHEAT_PLA1 -MSGCZ12, //MSG_PREHEAT_PLA2 -MSGCZ13, //MSG_PREHEAT_PLA012 -MSGCZ14, //MSG_PREHEAT_PLA_BEDONLY -MSGCZ15, //MSG_PREHEAT_PLA_SETTINGS -MSGCZ16, //MSG_PREHEAT_ABS -MSGCZ17, //MSG_PREHEAT_ABS0 -MSGCZ18, //MSG_PREHEAT_ABS1 -MSGCZ19, //MSG_PREHEAT_ABS2 -MSGCZ20, //MSG_PREHEAT_ABS012 -MSGCZ21, //MSG_PREHEAT_ABS_BEDONLY -MSGCZ22, //MSG_PREHEAT_ABS_SETTINGS -MSGCZ23, //MSG_COOLDOWN -MSGCZ24, //MSG_SWITCH_PS_ON -MSGCZ25, //MSG_SWITCH_PS_OFF -MSGCZ26, //MSG_EXTRUDE -MSGCZ27, //MSG_RETRACT -MSGCZ28, //MSG_MOVE_AXIS -MSGCZ29, //MSG_MOVE_X -MSGCZ30, //MSG_MOVE_Y -MSGCZ31, //MSG_MOVE_Z -MSGCZ32, //MSG_MOVE_E -MSGCZ33, //MSG_MOVE_E1 -MSGCZ34, //MSG_MOVE_E2 -MSGCZ35, //MSG_MOVE_01MM -MSGCZ36, //MSG_MOVE_1MM -MSGCZ37, //MSG_MOVE_10MM -MSGCZ38, //MSG_SPEED -MSGCZ39, //MSG_NOZZLE -MSGCZ40, //MSG_NOZZLE1 -MSGCZ41, //MSG_NOZZLE2 -MSGCZ42, //MSG_BED -MSGCZ43, //MSG_FAN_SPEED -MSGCZ44, //MSG_FLOW -MSGCZ45, //MSG_FLOW0 -MSGCZ46, //MSG_FLOW1 -MSGCZ47, //MSG_FLOW2 -MSGCZ48, //MSG_CONTROL -MSGCZ49, //MSG_MIN -MSGCZ50, //MSG_MAX -MSGCZ51, //MSG_FACTOR -MSGCZ52, //MSG_AUTOTEMP -MSGCZ53, //MSG_ON -MSGCZ54, //MSG_OFF -MSGCZ55, //MSG_PID_P -MSGCZ56, //MSG_PID_I -MSGCZ57, //MSG_PID_D -MSGCZ58, //MSG_PID_C -MSGCZ59, //MSG_ACC -MSGCZ60, //MSG_VXY_JERK -MSGCZ61, //MSG_VZ_JERK -MSGCZ62, //MSG_VE_JERK -MSGCZ63, //MSG_VMAX -MSGCZ64, //MSG_X -MSGCZ65, //MSG_Y -MSGCZ66, //MSG_Z -MSGCZ67, //MSG_E -MSGCZ68, //MSG_VMIN -MSGCZ69, //MSG_VTRAV_MIN -MSGCZ70, //MSG_AMAX -MSGCZ71, //MSG_A_RETRACT -MSGCZ72, //MSG_XSTEPS -MSGCZ73, //MSG_YSTEPS -MSGCZ74, //MSG_ZSTEPS -MSGCZ75, //MSG_ESTEPS -MSGCZ76, //MSG_TEMPERATURE -MSGCZ77, //MSG_MOTION -MSGCZ78, //MSG_VOLUMETRIC -MSGCZ79, //MSG_VOLUMETRIC_ENABLED -MSGCZ80, //MSG_FILAMENT_SIZE_EXTRUDER_0 -MSGCZ81, //MSG_FILAMENT_SIZE_EXTRUDER_1 -MSGCZ82, //MSG_FILAMENT_SIZE_EXTRUDER_2 -MSGCZ83, //MSG_CONTRAST -MSGCZ84, //MSG_STORE_EPROM -MSGCZ85, //MSG_LOAD_EPROM -MSGCZ86, //MSG_RESTORE_FAILSAFE -MSGCZ87, //MSG_REFRESH -MSGCZ88, //MSG_WATCH -MSGCZ89, //MSG_PREPARE -MSGCZ90, //MSG_TUNE -MSGCZ91, //MSG_PAUSE_PRINT -MSGCZ92, //MSG_RESUME_PRINT -MSGCZ93, //MSG_STOP_PRINT -MSGCZ94, //MSG_CARD_MENU -MSGCZ95, //MSG_NO_CARD -MSGCZ96, //MSG_DWELL -MSGCZ97, //MSG_USERWAIT -MSGCZ98, //MSG_RESUMING -MSGCZ99, //MSG_PRINT_ABORTED -MSGCZ100, //MSG_NO_MOVE -MSGCZ101, //MSG_KILLED -MSGCZ102, //MSG_STOPPED -MSGCZ103, //MSG_CONTROL_RETRACT -MSGCZ104, //MSG_CONTROL_RETRACT_SWAP -MSGCZ105, //MSG_CONTROL_RETRACTF -MSGCZ106, //MSG_CONTROL_RETRACT_ZLIFT -MSGCZ107, //MSG_CONTROL_RETRACT_RECOVER -MSGCZ108, //MSG_CONTROL_RETRACT_RECOVER_SWAP -MSGCZ109, //MSG_CONTROL_RETRACT_RECOVERF -MSGCZ110, //MSG_AUTORETRACT -MSGCZ111, //MSG_FILAMENTCHANGE -MSGCZ112, //MSG_INIT_SDCARD -MSGCZ113, //MSG_CNG_SDCARD -MSGCZ114, //MSG_ZPROBE_OUT -MSGCZ115, //MSG_POSITION_UNKNOWN -MSGCZ116, //MSG_ZPROBE_ZOFFSET -MSGCZ117, //MSG_BABYSTEP_X -MSGCZ118, //MSG_BABYSTEP_Y -MSGCZ119, //MSG_BABYSTEP_Z -MSGCZ120, //MSG_ENDSTOP_ABORT -MSGCZ121, //MSG_ADJUSTZ -MSGCZ122, //MSG_PICK_Z -MSGCZ123, //MSG_HOMEYZ -MSGCZ124, //MSG_HOMEYZ_PROGRESS -MSGCZ125, //MSG_HOMEYZ_DONE -MSGCZ126, //MSG_SETTINGS -MSGCZ127, //MSG_PREHEAT -MSGCZ128, //MSG_UNLOAD_FILAMENT -MSGCZ129, //MSG_LOAD_FILAMENT -MSGCZ130, //MSG_RECTRACT -MSGCZ131, //MSG_ERROR -MSGCZ132, //MSG_PREHEAT_NOZZLE -MSGCZ133, //MSG_SUPPORT -MSGCZ134, //MSG_CORRECTLY -MSGCZ135, //MSG_YES -MSGCZ136, //MSG_NO -MSGCZ137, //MSG_NOT_LOADED -MSGCZ138, //MSG_NOT_COLOR -MSGCZ139, //MSG_LOADING_FILAMENT -MSGCZ140, //MSG_PLEASE_WAIT -MSGCZ141, //MSG_LOADING_COLOR -MSGCZ142, //MSG_CHANGE_SUCCESS -MSGCZ143, //MSG_PRESS -MSGCZ144, //MSG_INSERT_FILAMENT -MSGCZ145, //MSG_CHANGING_FILAMENT -MSGCZ146, //MSG_SILENT_MODE_ON -MSGCZ147, //MSG_SILENT_MODE_OFF -MSGCZ148, //MSG_REBOOT -MSGCZ149, //MSG_TAKE_EFFECT -MSGCZ150, //MSG_Enqueing -MSGCZ151, //MSG_POWERUP -MSGCZ152, //MSG_EXTERNAL_RESET -MSGCZ153, //MSG_BROWNOUT_RESET -MSGCZ154, //MSG_WATCHDOG_RESET -MSGCZ155, //MSG_SOFTWARE_RESET -MSGCZ156, //MSG_AUTHOR -MSGCZ157, //MSG_CONFIGURATION_VER -MSGCZ158, //MSG_FREE_MEMORY -MSGCZ159, //MSG_PLANNER_BUFFER_BYTES -MSGCZ160, //MSG_OK -MSGCZ161, //MSG_FILE_SAVED -MSGCZ162, //MSG_ERR_LINE_NO -MSGCZ163, //MSG_ERR_CHECKSUM_MISMATCH -MSGCZ164, //MSG_ERR_NO_CHECKSUM -MSGCZ165, //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -MSGCZ166, //MSG_FILE_PRINTED -MSGCZ167, //MSG_BEGIN_FILE_LIST -MSGCZ168, //MSG_END_FILE_LIST -MSGCZ169, //MSG_M104_INVALID_EXTRUDER -MSGCZ170, //MSG_M105_INVALID_EXTRUDER -MSGCZ171, //MSG_M200_INVALID_EXTRUDER -MSGCZ172, //MSG_M218_INVALID_EXTRUDER -MSGCZ173, //MSG_M221_INVALID_EXTRUDER -MSGCZ174, //MSG_ERR_NO_THERMISTORS -MSGCZ175, //MSG_M109_INVALID_EXTRUDER -MSGCZ176, //MSG_HEATING -MSGCZ177, //MSG_HEATING_COMPLETE -MSGCZ178, //MSG_BED_HEATING -MSGCZ179, //MSG_BED_DONE -MSGCZ180, //MSG_M115_REPORT -MSGCZ181, //MSG_COUNT_X -MSGCZ182, //MSG_ERR_KILLED -MSGCZ183, //MSG_ERR_STOPPED -MSGCZ184, //MSG_RESEND -MSGCZ185, //MSG_UNKNOWN_COMMAND -MSGCZ186, //MSG_ACTIVE_EXTRUDER -MSGCZ187, //MSG_INVALID_EXTRUDER -MSGCZ188, //MSG_X_MIN -MSGCZ189, //MSG_X_MAX -MSGCZ190, //MSG_Y_MIN -MSGCZ191, //MSG_Y_MAX -MSGCZ192, //MSG_Z_MIN -MSGCZ193, //MSG_Z_MAX -MSGCZ194, //MSG_M119_REPORT -MSGCZ195, //MSG_ENDSTOP_HIT -MSGCZ196, //MSG_ENDSTOP_OPEN -MSGCZ197, //MSG_HOTEND_OFFSET -MSGCZ198, //MSG_SD_CANT_OPEN_SUBDIR -MSGCZ199, //MSG_SD_INIT_FAIL -MSGCZ200, //MSG_SD_VOL_INIT_FAIL -MSGCZ201, //MSG_SD_OPENROOT_FAIL -MSGCZ202, //MSG_SD_CARD_OK -MSGCZ203, //MSG_SD_WORKDIR_FAIL -MSGCZ204, //MSG_SD_OPEN_FILE_FAIL -MSGCZ205, //MSG_SD_FILE_OPENED -MSGCZ206, //MSG_SD_SIZE -MSGCZ207, //MSG_SD_FILE_SELECTED -MSGCZ208, //MSG_SD_WRITE_TO_FILE -MSGCZ209, //MSG_SD_PRINTING_BYTE -MSGCZ210, //MSG_SD_NOT_PRINTING -MSGCZ211, //MSG_SD_ERR_WRITE_TO_FILE -MSGCZ212, //MSG_SD_CANT_ENTER_SUBDIR -MSGCZ213, //MSG_STEPPER_TOO_HIGH -MSGCZ214, //MSG_ENDSTOPS_HIT -MSGCZ215, //MSG_ERR_COLD_EXTRUDE_STOP -MSGCZ216, //MSG_ERR_LONG_EXTRUDE_STOP -MSGCZ217, //MSG_BABYSTEPPING_X -MSGCZ218, //MSG_BABYSTEPPING_Y -MSGCZ219, //MSG_BABYSTEPPING_Z -MSGCZ220, //MSG_SERIAL_ERROR_MENU_STRUCTURE -MSGCZ221, //MSG_LANGUAGE_NAME -MSGCZ222, //MSG_LANGUAGE_SELECT -MSGCZ223, //MSG_PRUSA3D -MSGCZ224, //MSG_PRUSA3D_FORUM -MSGCZ225, //MSG_PRUSA3D_HOWTO -MSGCZ226, //MSG_SELFTEST_ERROR -MSGCZ227, //MSG_SELFTEST_PLEASECHECK -MSGCZ228, //MSG_SELFTEST_NOTCONNECTED -MSGCZ229, //MSG_SELFTEST_HEATERTHERMISTOR -MSGCZ230, //MSG_SELFTEST_BEDHEATER -MSGCZ231, //MSG_SELFTEST_WIRINGERROR -MSGCZ232, //MSG_SELFTEST_ENDSTOPS -MSGCZ233, //MSG_SELFTEST_MOTOR -MSGCZ234, //MSG_SELFTEST_ENDSTOP -MSGCZ235, //MSG_SELFTEST_ENDSTOP_NOTHIT -MSGCZ236, //MSG_SELFTEST_OK -MSGCZ237, //MSG_STATS_TOTALFILAMENT -MSGCZ238, //MSG_STATS_TOTALPRINTTIME -MSGCZ239, //MSG_STATS_FILAMENTUSED -MSGCZ240, //MSG_STATS_PRINTTIME -MSGCZ241, //MSG_SELFTEST_START -MSGCZ242, //MSG_SELFTEST_CHECK_ENDSTOPS -MSGCZ243, //MSG_SELFTEST_CHECK_HOTEND -MSGCZ244, //MSG_SELFTEST_CHECK_X -MSGCZ245, //MSG_SELFTEST_CHECK_Y -MSGCZ246, //MSG_SELFTEST_CHECK_Z -MSGCZ247, //MSG_SELFTEST_CHECK_BED -MSGCZ248, //MSG_SELFTEST_CHECK_ALLCORRECT -MSGCZ249, //MSG_SELFTEST -MSGCZ250, //MSG_SELFTEST_FAILED -MSGCZ251, //MSG_STATISTICS -MSGCZ252, //MSG_USB_PRINTING -}; -const char* MSGIT[] = {MSGIT0, //WELCOME_MSG -MSGIT1, //MSG_SD_INSERTED -MSGIT2, //MSG_SD_REMOVED -MSGIT3, //MSG_MAIN -MSGIT4, //MSG_AUTOSTART -MSGIT5, //MSG_DISABLE_STEPPERS -MSGIT6, //MSG_AUTO_HOME -MSGIT7, //MSG_SET_HOME_OFFSETS -MSGIT8, //MSG_SET_ORIGIN -MSGIT9, //MSG_PREHEAT_PLA -MSGIT10, //MSG_PREHEAT_PLA0 -MSGIT11, //MSG_PREHEAT_PLA1 -MSGIT12, //MSG_PREHEAT_PLA2 -MSGIT13, //MSG_PREHEAT_PLA012 -MSGIT14, //MSG_PREHEAT_PLA_BEDONLY -MSGIT15, //MSG_PREHEAT_PLA_SETTINGS -MSGIT16, //MSG_PREHEAT_ABS -MSGIT17, //MSG_PREHEAT_ABS0 -MSGIT18, //MSG_PREHEAT_ABS1 -MSGIT19, //MSG_PREHEAT_ABS2 -MSGIT20, //MSG_PREHEAT_ABS012 -MSGIT21, //MSG_PREHEAT_ABS_BEDONLY -MSGIT22, //MSG_PREHEAT_ABS_SETTINGS -MSGIT23, //MSG_COOLDOWN -MSGIT24, //MSG_SWITCH_PS_ON -MSGIT25, //MSG_SWITCH_PS_OFF -MSGIT26, //MSG_EXTRUDE -MSGIT27, //MSG_RETRACT -MSGIT28, //MSG_MOVE_AXIS -MSGIT29, //MSG_MOVE_X -MSGIT30, //MSG_MOVE_Y -MSGIT31, //MSG_MOVE_Z -MSGIT32, //MSG_MOVE_E -MSGIT33, //MSG_MOVE_E1 -MSGIT34, //MSG_MOVE_E2 -MSGIT35, //MSG_MOVE_01MM -MSGIT36, //MSG_MOVE_1MM -MSGIT37, //MSG_MOVE_10MM -MSGIT38, //MSG_SPEED -MSGIT39, //MSG_NOZZLE -MSGIT40, //MSG_NOZZLE1 -MSGIT41, //MSG_NOZZLE2 -MSGIT42, //MSG_BED -MSGIT43, //MSG_FAN_SPEED -MSGIT44, //MSG_FLOW -MSGIT45, //MSG_FLOW0 -MSGIT46, //MSG_FLOW1 -MSGIT47, //MSG_FLOW2 -MSGIT48, //MSG_CONTROL -MSGIT49, //MSG_MIN -MSGIT50, //MSG_MAX -MSGIT51, //MSG_FACTOR -MSGIT52, //MSG_AUTOTEMP -MSGIT53, //MSG_ON -MSGIT54, //MSG_OFF -MSGIT55, //MSG_PID_P -MSGIT56, //MSG_PID_I -MSGIT57, //MSG_PID_D -MSGIT58, //MSG_PID_C -MSGIT59, //MSG_ACC -MSGIT60, //MSG_VXY_JERK -MSGIT61, //MSG_VZ_JERK -MSGIT62, //MSG_VE_JERK -MSGIT63, //MSG_VMAX -MSGIT64, //MSG_X -MSGIT65, //MSG_Y -MSGIT66, //MSG_Z -MSGIT67, //MSG_E -MSGIT68, //MSG_VMIN -MSGIT69, //MSG_VTRAV_MIN -MSGIT70, //MSG_AMAX -MSGIT71, //MSG_A_RETRACT -MSGIT72, //MSG_XSTEPS -MSGIT73, //MSG_YSTEPS -MSGIT74, //MSG_ZSTEPS -MSGIT75, //MSG_ESTEPS -MSGIT76, //MSG_TEMPERATURE -MSGIT77, //MSG_MOTION -MSGIT78, //MSG_VOLUMETRIC -MSGIT79, //MSG_VOLUMETRIC_ENABLED -MSGIT80, //MSG_FILAMENT_SIZE_EXTRUDER_0 -MSGIT81, //MSG_FILAMENT_SIZE_EXTRUDER_1 -MSGIT82, //MSG_FILAMENT_SIZE_EXTRUDER_2 -MSGIT83, //MSG_CONTRAST -MSGIT84, //MSG_STORE_EPROM -MSGIT85, //MSG_LOAD_EPROM -MSGIT86, //MSG_RESTORE_FAILSAFE -MSGIT87, //MSG_REFRESH -MSGIT88, //MSG_WATCH -MSGIT89, //MSG_PREPARE -MSGIT90, //MSG_TUNE -MSGIT91, //MSG_PAUSE_PRINT -MSGIT92, //MSG_RESUME_PRINT -MSGIT93, //MSG_STOP_PRINT -MSGIT94, //MSG_CARD_MENU -MSGIT95, //MSG_NO_CARD -MSGIT96, //MSG_DWELL -MSGIT97, //MSG_USERWAIT -MSGIT98, //MSG_RESUMING -MSGIT99, //MSG_PRINT_ABORTED -MSGIT100, //MSG_NO_MOVE -MSGIT101, //MSG_KILLED -MSGIT102, //MSG_STOPPED -MSGIT103, //MSG_CONTROL_RETRACT -MSGIT104, //MSG_CONTROL_RETRACT_SWAP -MSGIT105, //MSG_CONTROL_RETRACTF -MSGIT106, //MSG_CONTROL_RETRACT_ZLIFT -MSGIT107, //MSG_CONTROL_RETRACT_RECOVER -MSGIT108, //MSG_CONTROL_RETRACT_RECOVER_SWAP -MSGIT109, //MSG_CONTROL_RETRACT_RECOVERF -MSGIT110, //MSG_AUTORETRACT -MSGIT111, //MSG_FILAMENTCHANGE -MSGIT112, //MSG_INIT_SDCARD -MSGIT113, //MSG_CNG_SDCARD -MSGIT114, //MSG_ZPROBE_OUT -MSGIT115, //MSG_POSITION_UNKNOWN -MSGIT116, //MSG_ZPROBE_ZOFFSET -MSGIT117, //MSG_BABYSTEP_X -MSGIT118, //MSG_BABYSTEP_Y -MSGIT119, //MSG_BABYSTEP_Z -MSGIT120, //MSG_ENDSTOP_ABORT -MSGIT121, //MSG_ADJUSTZ -MSGIT122, //MSG_PICK_Z -MSGIT123, //MSG_HOMEYZ -MSGIT124, //MSG_HOMEYZ_PROGRESS -MSGIT125, //MSG_HOMEYZ_DONE -MSGIT126, //MSG_SETTINGS -MSGIT127, //MSG_PREHEAT -MSGIT128, //MSG_UNLOAD_FILAMENT -MSGIT129, //MSG_LOAD_FILAMENT -MSGIT130, //MSG_RECTRACT -MSGIT131, //MSG_ERROR -MSGIT132, //MSG_PREHEAT_NOZZLE -MSGIT133, //MSG_SUPPORT -MSGIT134, //MSG_CORRECTLY -MSGIT135, //MSG_YES -MSGIT136, //MSG_NO -MSGIT137, //MSG_NOT_LOADED -MSGIT138, //MSG_NOT_COLOR -MSGIT139, //MSG_LOADING_FILAMENT -MSGIT140, //MSG_PLEASE_WAIT -MSGIT141, //MSG_LOADING_COLOR -MSGIT142, //MSG_CHANGE_SUCCESS -MSGIT143, //MSG_PRESS -MSGIT144, //MSG_INSERT_FILAMENT -MSGIT145, //MSG_CHANGING_FILAMENT -MSGIT146, //MSG_SILENT_MODE_ON -MSGIT147, //MSG_SILENT_MODE_OFF -MSGIT148, //MSG_REBOOT -MSGIT149, //MSG_TAKE_EFFECT -MSGIT150, //MSG_Enqueing -MSGIT151, //MSG_POWERUP -MSGIT152, //MSG_EXTERNAL_RESET -MSGIT153, //MSG_BROWNOUT_RESET -MSGIT154, //MSG_WATCHDOG_RESET -MSGIT155, //MSG_SOFTWARE_RESET -MSGIT156, //MSG_AUTHOR -MSGIT157, //MSG_CONFIGURATION_VER -MSGIT158, //MSG_FREE_MEMORY -MSGIT159, //MSG_PLANNER_BUFFER_BYTES -MSGIT160, //MSG_OK -MSGIT161, //MSG_FILE_SAVED -MSGIT162, //MSG_ERR_LINE_NO -MSGIT163, //MSG_ERR_CHECKSUM_MISMATCH -MSGIT164, //MSG_ERR_NO_CHECKSUM -MSGIT165, //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -MSGIT166, //MSG_FILE_PRINTED -MSGIT167, //MSG_BEGIN_FILE_LIST -MSGIT168, //MSG_END_FILE_LIST -MSGIT169, //MSG_M104_INVALID_EXTRUDER -MSGIT170, //MSG_M105_INVALID_EXTRUDER -MSGIT171, //MSG_M200_INVALID_EXTRUDER -MSGIT172, //MSG_M218_INVALID_EXTRUDER -MSGIT173, //MSG_M221_INVALID_EXTRUDER -MSGIT174, //MSG_ERR_NO_THERMISTORS -MSGIT175, //MSG_M109_INVALID_EXTRUDER -MSGIT176, //MSG_HEATING -MSGIT177, //MSG_HEATING_COMPLETE -MSGIT178, //MSG_BED_HEATING -MSGIT179, //MSG_BED_DONE -MSGIT180, //MSG_M115_REPORT -MSGIT181, //MSG_COUNT_X -MSGIT182, //MSG_ERR_KILLED -MSGIT183, //MSG_ERR_STOPPED -MSGIT184, //MSG_RESEND -MSGIT185, //MSG_UNKNOWN_COMMAND -MSGIT186, //MSG_ACTIVE_EXTRUDER -MSGIT187, //MSG_INVALID_EXTRUDER -MSGIT188, //MSG_X_MIN -MSGIT189, //MSG_X_MAX -MSGIT190, //MSG_Y_MIN -MSGIT191, //MSG_Y_MAX -MSGIT192, //MSG_Z_MIN -MSGIT193, //MSG_Z_MAX -MSGIT194, //MSG_M119_REPORT -MSGIT195, //MSG_ENDSTOP_HIT -MSGIT196, //MSG_ENDSTOP_OPEN -MSGIT197, //MSG_HOTEND_OFFSET -MSGIT198, //MSG_SD_CANT_OPEN_SUBDIR -MSGIT199, //MSG_SD_INIT_FAIL -MSGIT200, //MSG_SD_VOL_INIT_FAIL -MSGIT201, //MSG_SD_OPENROOT_FAIL -MSGIT202, //MSG_SD_CARD_OK -MSGIT203, //MSG_SD_WORKDIR_FAIL -MSGIT204, //MSG_SD_OPEN_FILE_FAIL -MSGIT205, //MSG_SD_FILE_OPENED -MSGIT206, //MSG_SD_SIZE -MSGIT207, //MSG_SD_FILE_SELECTED -MSGIT208, //MSG_SD_WRITE_TO_FILE -MSGIT209, //MSG_SD_PRINTING_BYTE -MSGIT210, //MSG_SD_NOT_PRINTING -MSGIT211, //MSG_SD_ERR_WRITE_TO_FILE -MSGIT212, //MSG_SD_CANT_ENTER_SUBDIR -MSGIT213, //MSG_STEPPER_TOO_HIGH -MSGIT214, //MSG_ENDSTOPS_HIT -MSGIT215, //MSG_ERR_COLD_EXTRUDE_STOP -MSGIT216, //MSG_ERR_LONG_EXTRUDE_STOP -MSGIT217, //MSG_BABYSTEPPING_X -MSGIT218, //MSG_BABYSTEPPING_Y -MSGIT219, //MSG_BABYSTEPPING_Z -MSGIT220, //MSG_SERIAL_ERROR_MENU_STRUCTURE -MSGIT221, //MSG_LANGUAGE_NAME -MSGIT222, //MSG_LANGUAGE_SELECT -MSGIT223, //MSG_PRUSA3D -MSGIT224, //MSG_PRUSA3D_FORUM -MSGIT225, //MSG_PRUSA3D_HOWTO -MSGIT226, //MSG_SELFTEST_ERROR -MSGIT227, //MSG_SELFTEST_PLEASECHECK -MSGIT228, //MSG_SELFTEST_NOTCONNECTED -MSGIT229, //MSG_SELFTEST_HEATERTHERMISTOR -MSGIT230, //MSG_SELFTEST_BEDHEATER -MSGIT231, //MSG_SELFTEST_WIRINGERROR -MSGIT232, //MSG_SELFTEST_ENDSTOPS -MSGIT233, //MSG_SELFTEST_MOTOR -MSGIT234, //MSG_SELFTEST_ENDSTOP -MSGIT235, //MSG_SELFTEST_ENDSTOP_NOTHIT -MSGIT236, //MSG_SELFTEST_OK -MSGIT237, //MSG_STATS_TOTALFILAMENT -MSGIT238, //MSG_STATS_TOTALPRINTTIME -MSGIT239, //MSG_STATS_FILAMENTUSED -MSGIT240, //MSG_STATS_PRINTTIME -MSGIT241, //MSG_SELFTEST_START -MSGIT242, //MSG_SELFTEST_CHECK_ENDSTOPS -MSGIT243, //MSG_SELFTEST_CHECK_HOTEND -MSGIT244, //MSG_SELFTEST_CHECK_X -MSGIT245, //MSG_SELFTEST_CHECK_Y -MSGIT246, //MSG_SELFTEST_CHECK_Z -MSGIT247, //MSG_SELFTEST_CHECK_BED -MSGIT248, //MSG_SELFTEST_CHECK_ALLCORRECT -MSGIT249, //MSG_SELFTEST -MSGIT250, //MSG_SELFTEST_FAILED -MSGIT251, //MSG_STATISTICS -MSGIT252, //MSG_USB_PRINTING -}; -const char* MSGES[] = {MSGES0, //WELCOME_MSG -MSGES1, //MSG_SD_INSERTED -MSGES2, //MSG_SD_REMOVED -MSGES3, //MSG_MAIN -MSGES4, //MSG_AUTOSTART -MSGES5, //MSG_DISABLE_STEPPERS -MSGES6, //MSG_AUTO_HOME -MSGES7, //MSG_SET_HOME_OFFSETS -MSGES8, //MSG_SET_ORIGIN -MSGES9, //MSG_PREHEAT_PLA -MSGES10, //MSG_PREHEAT_PLA0 -MSGES11, //MSG_PREHEAT_PLA1 -MSGES12, //MSG_PREHEAT_PLA2 -MSGES13, //MSG_PREHEAT_PLA012 -MSGES14, //MSG_PREHEAT_PLA_BEDONLY -MSGES15, //MSG_PREHEAT_PLA_SETTINGS -MSGES16, //MSG_PREHEAT_ABS -MSGES17, //MSG_PREHEAT_ABS0 -MSGES18, //MSG_PREHEAT_ABS1 -MSGES19, //MSG_PREHEAT_ABS2 -MSGES20, //MSG_PREHEAT_ABS012 -MSGES21, //MSG_PREHEAT_ABS_BEDONLY -MSGES22, //MSG_PREHEAT_ABS_SETTINGS -MSGES23, //MSG_COOLDOWN -MSGES24, //MSG_SWITCH_PS_ON -MSGES25, //MSG_SWITCH_PS_OFF -MSGES26, //MSG_EXTRUDE -MSGES27, //MSG_RETRACT -MSGES28, //MSG_MOVE_AXIS -MSGES29, //MSG_MOVE_X -MSGES30, //MSG_MOVE_Y -MSGES31, //MSG_MOVE_Z -MSGES32, //MSG_MOVE_E -MSGES33, //MSG_MOVE_E1 -MSGES34, //MSG_MOVE_E2 -MSGES35, //MSG_MOVE_01MM -MSGES36, //MSG_MOVE_1MM -MSGES37, //MSG_MOVE_10MM -MSGES38, //MSG_SPEED -MSGES39, //MSG_NOZZLE -MSGES40, //MSG_NOZZLE1 -MSGES41, //MSG_NOZZLE2 -MSGES42, //MSG_BED -MSGES43, //MSG_FAN_SPEED -MSGES44, //MSG_FLOW -MSGES45, //MSG_FLOW0 -MSGES46, //MSG_FLOW1 -MSGES47, //MSG_FLOW2 -MSGES48, //MSG_CONTROL -MSGES49, //MSG_MIN -MSGES50, //MSG_MAX -MSGES51, //MSG_FACTOR -MSGES52, //MSG_AUTOTEMP -MSGES53, //MSG_ON -MSGES54, //MSG_OFF -MSGES55, //MSG_PID_P -MSGES56, //MSG_PID_I -MSGES57, //MSG_PID_D -MSGES58, //MSG_PID_C -MSGES59, //MSG_ACC -MSGES60, //MSG_VXY_JERK -MSGES61, //MSG_VZ_JERK -MSGES62, //MSG_VE_JERK -MSGES63, //MSG_VMAX -MSGES64, //MSG_X -MSGES65, //MSG_Y -MSGES66, //MSG_Z -MSGES67, //MSG_E -MSGES68, //MSG_VMIN -MSGES69, //MSG_VTRAV_MIN -MSGES70, //MSG_AMAX -MSGES71, //MSG_A_RETRACT -MSGES72, //MSG_XSTEPS -MSGES73, //MSG_YSTEPS -MSGES74, //MSG_ZSTEPS -MSGES75, //MSG_ESTEPS -MSGES76, //MSG_TEMPERATURE -MSGES77, //MSG_MOTION -MSGES78, //MSG_VOLUMETRIC -MSGES79, //MSG_VOLUMETRIC_ENABLED -MSGES80, //MSG_FILAMENT_SIZE_EXTRUDER_0 -MSGES81, //MSG_FILAMENT_SIZE_EXTRUDER_1 -MSGES82, //MSG_FILAMENT_SIZE_EXTRUDER_2 -MSGES83, //MSG_CONTRAST -MSGES84, //MSG_STORE_EPROM -MSGES85, //MSG_LOAD_EPROM -MSGES86, //MSG_RESTORE_FAILSAFE -MSGES87, //MSG_REFRESH -MSGES88, //MSG_WATCH -MSGES89, //MSG_PREPARE -MSGES90, //MSG_TUNE -MSGES91, //MSG_PAUSE_PRINT -MSGES92, //MSG_RESUME_PRINT -MSGES93, //MSG_STOP_PRINT -MSGES94, //MSG_CARD_MENU -MSGES95, //MSG_NO_CARD -MSGES96, //MSG_DWELL -MSGES97, //MSG_USERWAIT -MSGES98, //MSG_RESUMING -MSGES99, //MSG_PRINT_ABORTED -MSGES100, //MSG_NO_MOVE -MSGES101, //MSG_KILLED -MSGES102, //MSG_STOPPED -MSGES103, //MSG_CONTROL_RETRACT -MSGES104, //MSG_CONTROL_RETRACT_SWAP -MSGES105, //MSG_CONTROL_RETRACTF -MSGES106, //MSG_CONTROL_RETRACT_ZLIFT -MSGES107, //MSG_CONTROL_RETRACT_RECOVER -MSGES108, //MSG_CONTROL_RETRACT_RECOVER_SWAP -MSGES109, //MSG_CONTROL_RETRACT_RECOVERF -MSGES110, //MSG_AUTORETRACT -MSGES111, //MSG_FILAMENTCHANGE -MSGES112, //MSG_INIT_SDCARD -MSGES113, //MSG_CNG_SDCARD -MSGES114, //MSG_ZPROBE_OUT -MSGES115, //MSG_POSITION_UNKNOWN -MSGES116, //MSG_ZPROBE_ZOFFSET -MSGES117, //MSG_BABYSTEP_X -MSGES118, //MSG_BABYSTEP_Y -MSGES119, //MSG_BABYSTEP_Z -MSGES120, //MSG_ENDSTOP_ABORT -MSGES121, //MSG_ADJUSTZ -MSGES122, //MSG_PICK_Z -MSGES123, //MSG_HOMEYZ -MSGES124, //MSG_HOMEYZ_PROGRESS -MSGES125, //MSG_HOMEYZ_DONE -MSGES126, //MSG_SETTINGS -MSGES127, //MSG_PREHEAT -MSGES128, //MSG_UNLOAD_FILAMENT -MSGES129, //MSG_LOAD_FILAMENT -MSGES130, //MSG_RECTRACT -MSGES131, //MSG_ERROR -MSGES132, //MSG_PREHEAT_NOZZLE -MSGES133, //MSG_SUPPORT -MSGES134, //MSG_CORRECTLY -MSGES135, //MSG_YES -MSGES136, //MSG_NO -MSGES137, //MSG_NOT_LOADED -MSGES138, //MSG_NOT_COLOR -MSGES139, //MSG_LOADING_FILAMENT -MSGES140, //MSG_PLEASE_WAIT -MSGES141, //MSG_LOADING_COLOR -MSGES142, //MSG_CHANGE_SUCCESS -MSGES143, //MSG_PRESS -MSGES144, //MSG_INSERT_FILAMENT -MSGES145, //MSG_CHANGING_FILAMENT -MSGES146, //MSG_SILENT_MODE_ON -MSGES147, //MSG_SILENT_MODE_OFF -MSGES148, //MSG_REBOOT -MSGES149, //MSG_TAKE_EFFECT -MSGES150, //MSG_Enqueing -MSGES151, //MSG_POWERUP -MSGES152, //MSG_EXTERNAL_RESET -MSGES153, //MSG_BROWNOUT_RESET -MSGES154, //MSG_WATCHDOG_RESET -MSGES155, //MSG_SOFTWARE_RESET -MSGES156, //MSG_AUTHOR -MSGES157, //MSG_CONFIGURATION_VER -MSGES158, //MSG_FREE_MEMORY -MSGES159, //MSG_PLANNER_BUFFER_BYTES -MSGES160, //MSG_OK -MSGES161, //MSG_FILE_SAVED -MSGES162, //MSG_ERR_LINE_NO -MSGES163, //MSG_ERR_CHECKSUM_MISMATCH -MSGES164, //MSG_ERR_NO_CHECKSUM -MSGES165, //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -MSGES166, //MSG_FILE_PRINTED -MSGES167, //MSG_BEGIN_FILE_LIST -MSGES168, //MSG_END_FILE_LIST -MSGES169, //MSG_M104_INVALID_EXTRUDER -MSGES170, //MSG_M105_INVALID_EXTRUDER -MSGES171, //MSG_M200_INVALID_EXTRUDER -MSGES172, //MSG_M218_INVALID_EXTRUDER -MSGES173, //MSG_M221_INVALID_EXTRUDER -MSGES174, //MSG_ERR_NO_THERMISTORS -MSGES175, //MSG_M109_INVALID_EXTRUDER -MSGES176, //MSG_HEATING -MSGES177, //MSG_HEATING_COMPLETE -MSGES178, //MSG_BED_HEATING -MSGES179, //MSG_BED_DONE -MSGES180, //MSG_M115_REPORT -MSGES181, //MSG_COUNT_X -MSGES182, //MSG_ERR_KILLED -MSGES183, //MSG_ERR_STOPPED -MSGES184, //MSG_RESEND -MSGES185, //MSG_UNKNOWN_COMMAND -MSGES186, //MSG_ACTIVE_EXTRUDER -MSGES187, //MSG_INVALID_EXTRUDER -MSGES188, //MSG_X_MIN -MSGES189, //MSG_X_MAX -MSGES190, //MSG_Y_MIN -MSGES191, //MSG_Y_MAX -MSGES192, //MSG_Z_MIN -MSGES193, //MSG_Z_MAX -MSGES194, //MSG_M119_REPORT -MSGES195, //MSG_ENDSTOP_HIT -MSGES196, //MSG_ENDSTOP_OPEN -MSGES197, //MSG_HOTEND_OFFSET -MSGES198, //MSG_SD_CANT_OPEN_SUBDIR -MSGES199, //MSG_SD_INIT_FAIL -MSGES200, //MSG_SD_VOL_INIT_FAIL -MSGES201, //MSG_SD_OPENROOT_FAIL -MSGES202, //MSG_SD_CARD_OK -MSGES203, //MSG_SD_WORKDIR_FAIL -MSGES204, //MSG_SD_OPEN_FILE_FAIL -MSGES205, //MSG_SD_FILE_OPENED -MSGES206, //MSG_SD_SIZE -MSGES207, //MSG_SD_FILE_SELECTED -MSGES208, //MSG_SD_WRITE_TO_FILE -MSGES209, //MSG_SD_PRINTING_BYTE -MSGES210, //MSG_SD_NOT_PRINTING -MSGES211, //MSG_SD_ERR_WRITE_TO_FILE -MSGES212, //MSG_SD_CANT_ENTER_SUBDIR -MSGES213, //MSG_STEPPER_TOO_HIGH -MSGES214, //MSG_ENDSTOPS_HIT -MSGES215, //MSG_ERR_COLD_EXTRUDE_STOP -MSGES216, //MSG_ERR_LONG_EXTRUDE_STOP -MSGES217, //MSG_BABYSTEPPING_X -MSGES218, //MSG_BABYSTEPPING_Y -MSGES219, //MSG_BABYSTEPPING_Z -MSGES220, //MSG_SERIAL_ERROR_MENU_STRUCTURE -MSGES221, //MSG_LANGUAGE_NAME -MSGES222, //MSG_LANGUAGE_SELECT -MSGES223, //MSG_PRUSA3D -MSGES224, //MSG_PRUSA3D_FORUM -MSGES225, //MSG_PRUSA3D_HOWTO -MSGES226, //MSG_SELFTEST_ERROR -MSGES227, //MSG_SELFTEST_PLEASECHECK -MSGES228, //MSG_SELFTEST_NOTCONNECTED -MSGES229, //MSG_SELFTEST_HEATERTHERMISTOR -MSGES230, //MSG_SELFTEST_BEDHEATER -MSGES231, //MSG_SELFTEST_WIRINGERROR -MSGES232, //MSG_SELFTEST_ENDSTOPS -MSGES233, //MSG_SELFTEST_MOTOR -MSGES234, //MSG_SELFTEST_ENDSTOP -MSGES235, //MSG_SELFTEST_ENDSTOP_NOTHIT -MSGES236, //MSG_SELFTEST_OK -MSGES237, //MSG_STATS_TOTALFILAMENT -MSGES238, //MSG_STATS_TOTALPRINTTIME -MSGES239, //MSG_STATS_FILAMENTUSED -MSGES240, //MSG_STATS_PRINTTIME -MSGES241, //MSG_SELFTEST_START -MSGES242, //MSG_SELFTEST_CHECK_ENDSTOPS -MSGES243, //MSG_SELFTEST_CHECK_HOTEND -MSGES244, //MSG_SELFTEST_CHECK_X -MSGES245, //MSG_SELFTEST_CHECK_Y -MSGES246, //MSG_SELFTEST_CHECK_Z -MSGES247, //MSG_SELFTEST_CHECK_BED -MSGES248, //MSG_SELFTEST_CHECK_ALLCORRECT -MSGES249, //MSG_SELFTEST -MSGES250, //MSG_SELFTEST_FAILED -MSGES251, //MSG_STATISTICS -MSGES252, //MSG_USB_PRINTING -}; -const char* MSGPL[] = {MSGPL0, //WELCOME_MSG -MSGPL1, //MSG_SD_INSERTED -MSGPL2, //MSG_SD_REMOVED -MSGPL3, //MSG_MAIN -MSGPL4, //MSG_AUTOSTART -MSGPL5, //MSG_DISABLE_STEPPERS -MSGPL6, //MSG_AUTO_HOME -MSGPL7, //MSG_SET_HOME_OFFSETS -MSGPL8, //MSG_SET_ORIGIN -MSGPL9, //MSG_PREHEAT_PLA -MSGPL10, //MSG_PREHEAT_PLA0 -MSGPL11, //MSG_PREHEAT_PLA1 -MSGPL12, //MSG_PREHEAT_PLA2 -MSGPL13, //MSG_PREHEAT_PLA012 -MSGPL14, //MSG_PREHEAT_PLA_BEDONLY -MSGPL15, //MSG_PREHEAT_PLA_SETTINGS -MSGPL16, //MSG_PREHEAT_ABS -MSGPL17, //MSG_PREHEAT_ABS0 -MSGPL18, //MSG_PREHEAT_ABS1 -MSGPL19, //MSG_PREHEAT_ABS2 -MSGPL20, //MSG_PREHEAT_ABS012 -MSGPL21, //MSG_PREHEAT_ABS_BEDONLY -MSGPL22, //MSG_PREHEAT_ABS_SETTINGS -MSGPL23, //MSG_COOLDOWN -MSGPL24, //MSG_SWITCH_PS_ON -MSGPL25, //MSG_SWITCH_PS_OFF -MSGPL26, //MSG_EXTRUDE -MSGPL27, //MSG_RETRACT -MSGPL28, //MSG_MOVE_AXIS -MSGPL29, //MSG_MOVE_X -MSGPL30, //MSG_MOVE_Y -MSGPL31, //MSG_MOVE_Z -MSGPL32, //MSG_MOVE_E -MSGPL33, //MSG_MOVE_E1 -MSGPL34, //MSG_MOVE_E2 -MSGPL35, //MSG_MOVE_01MM -MSGPL36, //MSG_MOVE_1MM -MSGPL37, //MSG_MOVE_10MM -MSGPL38, //MSG_SPEED -MSGPL39, //MSG_NOZZLE -MSGPL40, //MSG_NOZZLE1 -MSGPL41, //MSG_NOZZLE2 -MSGPL42, //MSG_BED -MSGPL43, //MSG_FAN_SPEED -MSGPL44, //MSG_FLOW -MSGPL45, //MSG_FLOW0 -MSGPL46, //MSG_FLOW1 -MSGPL47, //MSG_FLOW2 -MSGPL48, //MSG_CONTROL -MSGPL49, //MSG_MIN -MSGPL50, //MSG_MAX -MSGPL51, //MSG_FACTOR -MSGPL52, //MSG_AUTOTEMP -MSGPL53, //MSG_ON -MSGPL54, //MSG_OFF -MSGPL55, //MSG_PID_P -MSGPL56, //MSG_PID_I -MSGPL57, //MSG_PID_D -MSGPL58, //MSG_PID_C -MSGPL59, //MSG_ACC -MSGPL60, //MSG_VXY_JERK -MSGPL61, //MSG_VZ_JERK -MSGPL62, //MSG_VE_JERK -MSGPL63, //MSG_VMAX -MSGPL64, //MSG_X -MSGPL65, //MSG_Y -MSGPL66, //MSG_Z -MSGPL67, //MSG_E -MSGPL68, //MSG_VMIN -MSGPL69, //MSG_VTRAV_MIN -MSGPL70, //MSG_AMAX -MSGPL71, //MSG_A_RETRACT -MSGPL72, //MSG_XSTEPS -MSGPL73, //MSG_YSTEPS -MSGPL74, //MSG_ZSTEPS -MSGPL75, //MSG_ESTEPS -MSGPL76, //MSG_TEMPERATURE -MSGPL77, //MSG_MOTION -MSGPL78, //MSG_VOLUMETRIC -MSGPL79, //MSG_VOLUMETRIC_ENABLED -MSGPL80, //MSG_FILAMENT_SIZE_EXTRUDER_0 -MSGPL81, //MSG_FILAMENT_SIZE_EXTRUDER_1 -MSGPL82, //MSG_FILAMENT_SIZE_EXTRUDER_2 -MSGPL83, //MSG_CONTRAST -MSGPL84, //MSG_STORE_EPROM -MSGPL85, //MSG_LOAD_EPROM -MSGPL86, //MSG_RESTORE_FAILSAFE -MSGPL87, //MSG_REFRESH -MSGPL88, //MSG_WATCH -MSGPL89, //MSG_PREPARE -MSGPL90, //MSG_TUNE -MSGPL91, //MSG_PAUSE_PRINT -MSGPL92, //MSG_RESUME_PRINT -MSGPL93, //MSG_STOP_PRINT -MSGPL94, //MSG_CARD_MENU -MSGPL95, //MSG_NO_CARD -MSGPL96, //MSG_DWELL -MSGPL97, //MSG_USERWAIT -MSGPL98, //MSG_RESUMING -MSGPL99, //MSG_PRINT_ABORTED -MSGPL100, //MSG_NO_MOVE -MSGPL101, //MSG_KILLED -MSGPL102, //MSG_STOPPED -MSGPL103, //MSG_CONTROL_RETRACT -MSGPL104, //MSG_CONTROL_RETRACT_SWAP -MSGPL105, //MSG_CONTROL_RETRACTF -MSGPL106, //MSG_CONTROL_RETRACT_ZLIFT -MSGPL107, //MSG_CONTROL_RETRACT_RECOVER -MSGPL108, //MSG_CONTROL_RETRACT_RECOVER_SWAP -MSGPL109, //MSG_CONTROL_RETRACT_RECOVERF -MSGPL110, //MSG_AUTORETRACT -MSGPL111, //MSG_FILAMENTCHANGE -MSGPL112, //MSG_INIT_SDCARD -MSGPL113, //MSG_CNG_SDCARD -MSGPL114, //MSG_ZPROBE_OUT -MSGPL115, //MSG_POSITION_UNKNOWN -MSGPL116, //MSG_ZPROBE_ZOFFSET -MSGPL117, //MSG_BABYSTEP_X -MSGPL118, //MSG_BABYSTEP_Y -MSGPL119, //MSG_BABYSTEP_Z -MSGPL120, //MSG_ENDSTOP_ABORT -MSGPL121, //MSG_ADJUSTZ -MSGPL122, //MSG_PICK_Z -MSGPL123, //MSG_HOMEYZ -MSGPL124, //MSG_HOMEYZ_PROGRESS -MSGPL125, //MSG_HOMEYZ_DONE -MSGPL126, //MSG_SETTINGS -MSGPL127, //MSG_PREHEAT -MSGPL128, //MSG_UNLOAD_FILAMENT -MSGPL129, //MSG_LOAD_FILAMENT -MSGPL130, //MSG_RECTRACT -MSGPL131, //MSG_ERROR -MSGPL132, //MSG_PREHEAT_NOZZLE -MSGPL133, //MSG_SUPPORT -MSGPL134, //MSG_CORRECTLY -MSGPL135, //MSG_YES -MSGPL136, //MSG_NO -MSGPL137, //MSG_NOT_LOADED -MSGPL138, //MSG_NOT_COLOR -MSGPL139, //MSG_LOADING_FILAMENT -MSGPL140, //MSG_PLEASE_WAIT -MSGPL141, //MSG_LOADING_COLOR -MSGPL142, //MSG_CHANGE_SUCCESS -MSGPL143, //MSG_PRESS -MSGPL144, //MSG_INSERT_FILAMENT -MSGPL145, //MSG_CHANGING_FILAMENT -MSGPL146, //MSG_SILENT_MODE_ON -MSGPL147, //MSG_SILENT_MODE_OFF -MSGPL148, //MSG_REBOOT -MSGPL149, //MSG_TAKE_EFFECT -MSGPL150, //MSG_Enqueing -MSGPL151, //MSG_POWERUP -MSGPL152, //MSG_EXTERNAL_RESET -MSGPL153, //MSG_BROWNOUT_RESET -MSGPL154, //MSG_WATCHDOG_RESET -MSGPL155, //MSG_SOFTWARE_RESET -MSGPL156, //MSG_AUTHOR -MSGPL157, //MSG_CONFIGURATION_VER -MSGPL158, //MSG_FREE_MEMORY -MSGPL159, //MSG_PLANNER_BUFFER_BYTES -MSGPL160, //MSG_OK -MSGPL161, //MSG_FILE_SAVED -MSGPL162, //MSG_ERR_LINE_NO -MSGPL163, //MSG_ERR_CHECKSUM_MISMATCH -MSGPL164, //MSG_ERR_NO_CHECKSUM -MSGPL165, //MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM -MSGPL166, //MSG_FILE_PRINTED -MSGPL167, //MSG_BEGIN_FILE_LIST -MSGPL168, //MSG_END_FILE_LIST -MSGPL169, //MSG_M104_INVALID_EXTRUDER -MSGPL170, //MSG_M105_INVALID_EXTRUDER -MSGPL171, //MSG_M200_INVALID_EXTRUDER -MSGPL172, //MSG_M218_INVALID_EXTRUDER -MSGPL173, //MSG_M221_INVALID_EXTRUDER -MSGPL174, //MSG_ERR_NO_THERMISTORS -MSGPL175, //MSG_M109_INVALID_EXTRUDER -MSGPL176, //MSG_HEATING -MSGPL177, //MSG_HEATING_COMPLETE -MSGPL178, //MSG_BED_HEATING -MSGPL179, //MSG_BED_DONE -MSGPL180, //MSG_M115_REPORT -MSGPL181, //MSG_COUNT_X -MSGPL182, //MSG_ERR_KILLED -MSGPL183, //MSG_ERR_STOPPED -MSGPL184, //MSG_RESEND -MSGPL185, //MSG_UNKNOWN_COMMAND -MSGPL186, //MSG_ACTIVE_EXTRUDER -MSGPL187, //MSG_INVALID_EXTRUDER -MSGPL188, //MSG_X_MIN -MSGPL189, //MSG_X_MAX -MSGPL190, //MSG_Y_MIN -MSGPL191, //MSG_Y_MAX -MSGPL192, //MSG_Z_MIN -MSGPL193, //MSG_Z_MAX -MSGPL194, //MSG_M119_REPORT -MSGPL195, //MSG_ENDSTOP_HIT -MSGPL196, //MSG_ENDSTOP_OPEN -MSGPL197, //MSG_HOTEND_OFFSET -MSGPL198, //MSG_SD_CANT_OPEN_SUBDIR -MSGPL199, //MSG_SD_INIT_FAIL -MSGPL200, //MSG_SD_VOL_INIT_FAIL -MSGPL201, //MSG_SD_OPENROOT_FAIL -MSGPL202, //MSG_SD_CARD_OK -MSGPL203, //MSG_SD_WORKDIR_FAIL -MSGPL204, //MSG_SD_OPEN_FILE_FAIL -MSGPL205, //MSG_SD_FILE_OPENED -MSGPL206, //MSG_SD_SIZE -MSGPL207, //MSG_SD_FILE_SELECTED -MSGPL208, //MSG_SD_WRITE_TO_FILE -MSGPL209, //MSG_SD_PRINTING_BYTE -MSGPL210, //MSG_SD_NOT_PRINTING -MSGPL211, //MSG_SD_ERR_WRITE_TO_FILE -MSGPL212, //MSG_SD_CANT_ENTER_SUBDIR -MSGPL213, //MSG_STEPPER_TOO_HIGH -MSGPL214, //MSG_ENDSTOPS_HIT -MSGPL215, //MSG_ERR_COLD_EXTRUDE_STOP -MSGPL216, //MSG_ERR_LONG_EXTRUDE_STOP -MSGPL217, //MSG_BABYSTEPPING_X -MSGPL218, //MSG_BABYSTEPPING_Y -MSGPL219, //MSG_BABYSTEPPING_Z -MSGPL220, //MSG_SERIAL_ERROR_MENU_STRUCTURE -MSGPL221, //MSG_LANGUAGE_NAME -MSGPL222, //MSG_LANGUAGE_SELECT -MSGPL223, //MSG_PRUSA3D -MSGPL224, //MSG_PRUSA3D_FORUM -MSGPL225, //MSG_PRUSA3D_HOWTO -MSGPL226, //MSG_SELFTEST_ERROR -MSGPL227, //MSG_SELFTEST_PLEASECHECK -MSGPL228, //MSG_SELFTEST_NOTCONNECTED -MSGPL229, //MSG_SELFTEST_HEATERTHERMISTOR -MSGPL230, //MSG_SELFTEST_BEDHEATER -MSGPL231, //MSG_SELFTEST_WIRINGERROR -MSGPL232, //MSG_SELFTEST_ENDSTOPS -MSGPL233, //MSG_SELFTEST_MOTOR -MSGPL234, //MSG_SELFTEST_ENDSTOP -MSGPL235, //MSG_SELFTEST_ENDSTOP_NOTHIT -MSGPL236, //MSG_SELFTEST_OK -MSGPL237, //MSG_STATS_TOTALFILAMENT -MSGPL238, //MSG_STATS_TOTALPRINTTIME -MSGPL239, //MSG_STATS_FILAMENTUSED -MSGPL240, //MSG_STATS_PRINTTIME -MSGPL241, //MSG_SELFTEST_START -MSGPL242, //MSG_SELFTEST_CHECK_ENDSTOPS -MSGPL243, //MSG_SELFTEST_CHECK_HOTEND -MSGPL244, //MSG_SELFTEST_CHECK_X -MSGPL245, //MSG_SELFTEST_CHECK_Y -MSGPL246, //MSG_SELFTEST_CHECK_Z -MSGPL247, //MSG_SELFTEST_CHECK_BED -MSGPL248, //MSG_SELFTEST_CHECK_ALLCORRECT -MSGPL249, //MSG_SELFTEST -MSGPL250, //MSG_SELFTEST_FAILED -MSGPL251, //MSG_STATISTICS -MSGPL252, //MSG_USB_PRINTING -}; - - -const char** MSG_ALL[] = {MSGEN,MSGCZ,MSGIT,MSGES,MSGPL}; -char langbuffer[LCD_WIDTH+1]; -char* CAT2(const char *s1,const char *s2) { - unsigned char len=0; - strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); - len+=strlen_P(s1); - strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); - return langbuffer; -} -char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4) { - unsigned char len=0; - strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); - len+=strlen_P(s1); - strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); - len+=strlen_P(s2); - strncpy_P(langbuffer+len,s3,LCD_WIDTH-len); - len+=strlen_P(s3); - strncpy_P(langbuffer+len,s4,LCD_WIDTH-len); - return langbuffer; -} - - - +#include <avr/pgmspace.h> +#include "configuration_prusa.h" +#include "language_all.h" + +#define LCD_WIDTH 20 +extern unsigned char lang_selected; + +const char MSG_ACC_EN[] PROGMEM = "Accel"; +const char MSG_ACC_CZ[] PROGMEM = "Accel"; +const char MSG_ACC_IT[] PROGMEM = "Accel"; +const char MSG_ACC_ES[] PROGMEM = "Accel"; +const char MSG_ACC_PL[] PROGMEM = "Accel"; +const char * const MSG_ACC_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ACC_EN, + MSG_ACC_CZ, + MSG_ACC_IT, + MSG_ACC_ES, + MSG_ACC_PL +}; + +const char MSG_ACTIVE_EXTRUDER_EN[] PROGMEM = "Active Extruder: "; +const char MSG_ACTIVE_EXTRUDER_CZ[] PROGMEM = "Active Extruder: "; +const char MSG_ACTIVE_EXTRUDER_IT[] PROGMEM = "Active Extruder: "; +const char MSG_ACTIVE_EXTRUDER_ES[] PROGMEM = "Active Extruder: "; +const char MSG_ACTIVE_EXTRUDER_PL[] PROGMEM = "Active Extruder: "; +const char * const MSG_ACTIVE_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ACTIVE_EXTRUDER_EN, + MSG_ACTIVE_EXTRUDER_CZ, + MSG_ACTIVE_EXTRUDER_IT, + MSG_ACTIVE_EXTRUDER_ES, + MSG_ACTIVE_EXTRUDER_PL +}; + +const char MSG_ADJUSTZ_EN[] PROGMEM = "Auto adjust Z ?"; +const char MSG_ADJUSTZ_CZ[] PROGMEM = "Auto doladit Z ?"; +const char MSG_ADJUSTZ_IT[] PROGMEM = "Auto regolare Z ?"; +const char MSG_ADJUSTZ_ES[] PROGMEM = "Auto Micropaso Z?"; +const char MSG_ADJUSTZ_PL[] PROGMEM = "Autodostroic Z?"; +const char * const MSG_ADJUSTZ_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ADJUSTZ_EN, + MSG_ADJUSTZ_CZ, + MSG_ADJUSTZ_IT, + MSG_ADJUSTZ_ES, + MSG_ADJUSTZ_PL +}; + +const char MSG_AMAX_EN[] PROGMEM = "Amax "; +const char MSG_AMAX_CZ[] PROGMEM = "Amax "; +const char MSG_AMAX_IT[] PROGMEM = "Amax "; +const char MSG_AMAX_ES[] PROGMEM = "Amax "; +const char MSG_AMAX_PL[] PROGMEM = "Amax "; +const char * const MSG_AMAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AMAX_EN, + MSG_AMAX_CZ, + MSG_AMAX_IT, + MSG_AMAX_ES, + MSG_AMAX_PL +}; + +const char MSG_AUTHOR_EN[] PROGMEM = " | Author: "; +const char MSG_AUTHOR_CZ[] PROGMEM = " | Author: "; +const char MSG_AUTHOR_IT[] PROGMEM = " | Author: "; +const char MSG_AUTHOR_ES[] PROGMEM = " | Author: "; +const char MSG_AUTHOR_PL[] PROGMEM = " | Author: "; +const char * const MSG_AUTHOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTHOR_EN, + MSG_AUTHOR_CZ, + MSG_AUTHOR_IT, + MSG_AUTHOR_ES, + MSG_AUTHOR_PL +}; + +const char MSG_AUTORETRACT_EN[] PROGMEM = "AutoRetr."; +const char MSG_AUTORETRACT_CZ[] PROGMEM = "AutoRetr."; +const char MSG_AUTORETRACT_IT[] PROGMEM = "AutoRetr."; +const char MSG_AUTORETRACT_ES[] PROGMEM = "AutoRetr."; +const char MSG_AUTORETRACT_PL[] PROGMEM = "AutoRetr."; +const char * const MSG_AUTORETRACT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTORETRACT_EN, + MSG_AUTORETRACT_CZ, + MSG_AUTORETRACT_IT, + MSG_AUTORETRACT_ES, + MSG_AUTORETRACT_PL +}; + +const char MSG_AUTOSTART_EN[] PROGMEM = "Autostart"; +const char MSG_AUTOSTART_CZ[] PROGMEM = "Autostart"; +const char MSG_AUTOSTART_IT[] PROGMEM = "Autostart"; +const char MSG_AUTOSTART_ES[] PROGMEM = "Autostart"; +const char MSG_AUTOSTART_PL[] PROGMEM = "Autostart"; +const char * const MSG_AUTOSTART_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTOSTART_EN, + MSG_AUTOSTART_CZ, + MSG_AUTOSTART_IT, + MSG_AUTOSTART_ES, + MSG_AUTOSTART_PL +}; + +const char MSG_AUTOTEMP_EN[] PROGMEM = "Autotemp"; +const char MSG_AUTOTEMP_CZ[] PROGMEM = "Autotemp"; +const char MSG_AUTOTEMP_IT[] PROGMEM = "Autotemp"; +const char MSG_AUTOTEMP_ES[] PROGMEM = "Autotemp"; +const char MSG_AUTOTEMP_PL[] PROGMEM = "Autotemp"; +const char * const MSG_AUTOTEMP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTOTEMP_EN, + MSG_AUTOTEMP_CZ, + MSG_AUTOTEMP_IT, + MSG_AUTOTEMP_ES, + MSG_AUTOTEMP_PL +}; + +const char MSG_AUTO_HOME_EN[] PROGMEM = "Auto home"; +const char MSG_AUTO_HOME_CZ[] PROGMEM = "Auto home"; +const char MSG_AUTO_HOME_IT[] PROGMEM = "Auto Home"; +const char MSG_AUTO_HOME_ES[] PROGMEM = "Llevar al origen"; +const char MSG_AUTO_HOME_PL[] PROGMEM = "Auto home"; +const char * const MSG_AUTO_HOME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTO_HOME_EN, + MSG_AUTO_HOME_CZ, + MSG_AUTO_HOME_IT, + MSG_AUTO_HOME_ES, + MSG_AUTO_HOME_PL +}; + +const char MSG_A_RETRACT_EN[] PROGMEM = "A-retract"; +const char MSG_A_RETRACT_CZ[] PROGMEM = "A-retract"; +const char MSG_A_RETRACT_IT[] PROGMEM = "A-retract"; +const char MSG_A_RETRACT_ES[] PROGMEM = "A-retract"; +const char MSG_A_RETRACT_PL[] PROGMEM = "A-retract"; +const char * const MSG_A_RETRACT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_A_RETRACT_EN, + MSG_A_RETRACT_CZ, + MSG_A_RETRACT_IT, + MSG_A_RETRACT_ES, + MSG_A_RETRACT_PL +}; + +const char MSG_BABYSTEPPING_X_EN[] PROGMEM = "Babystepping X"; +const char MSG_BABYSTEPPING_X_CZ[] PROGMEM = "Babystepping X"; +const char MSG_BABYSTEPPING_X_IT[] PROGMEM = "Babystepping X"; +const char MSG_BABYSTEPPING_X_ES[] PROGMEM = "Babystepping X"; +const char MSG_BABYSTEPPING_X_PL[] PROGMEM = "Babystepping X"; +const char * const MSG_BABYSTEPPING_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEPPING_X_EN, + MSG_BABYSTEPPING_X_CZ, + MSG_BABYSTEPPING_X_IT, + MSG_BABYSTEPPING_X_ES, + MSG_BABYSTEPPING_X_PL +}; + +const char MSG_BABYSTEPPING_Y_EN[] PROGMEM = "Babystepping Y"; +const char MSG_BABYSTEPPING_Y_CZ[] PROGMEM = "Babystepping Y"; +const char MSG_BABYSTEPPING_Y_IT[] PROGMEM = "Babystepping Y"; +const char MSG_BABYSTEPPING_Y_ES[] PROGMEM = "Babystepping Y"; +const char MSG_BABYSTEPPING_Y_PL[] PROGMEM = "Babystepping Y"; +const char * const MSG_BABYSTEPPING_Y_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEPPING_Y_EN, + MSG_BABYSTEPPING_Y_CZ, + MSG_BABYSTEPPING_Y_IT, + MSG_BABYSTEPPING_Y_ES, + MSG_BABYSTEPPING_Y_PL +}; + +const char MSG_BABYSTEPPING_Z_EN[] PROGMEM = "Adjusting Z"; +const char MSG_BABYSTEPPING_Z_CZ[] PROGMEM = "Dostavovani Z"; +const char MSG_BABYSTEPPING_Z_IT[] PROGMEM = "Adjusting Z"; +const char MSG_BABYSTEPPING_Z_ES[] PROGMEM = "Adjusting Z"; +const char MSG_BABYSTEPPING_Z_PL[] PROGMEM = "Dostavovani Z"; +const char * const MSG_BABYSTEPPING_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEPPING_Z_EN, + MSG_BABYSTEPPING_Z_CZ, + MSG_BABYSTEPPING_Z_IT, + MSG_BABYSTEPPING_Z_ES, + MSG_BABYSTEPPING_Z_PL +}; + +const char MSG_BABYSTEP_X_EN[] PROGMEM = "Babystep X"; +const char MSG_BABYSTEP_X_CZ[] PROGMEM = "Babystep X"; +const char MSG_BABYSTEP_X_IT[] PROGMEM = "Babystep X"; +const char MSG_BABYSTEP_X_ES[] PROGMEM = "Babystep X"; +const char MSG_BABYSTEP_X_PL[] PROGMEM = "Babystep X"; +const char * const MSG_BABYSTEP_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEP_X_EN, + MSG_BABYSTEP_X_CZ, + MSG_BABYSTEP_X_IT, + MSG_BABYSTEP_X_ES, + MSG_BABYSTEP_X_PL +}; + +const char MSG_BABYSTEP_Y_EN[] PROGMEM = "Babystep Y"; +const char MSG_BABYSTEP_Y_CZ[] PROGMEM = "Babystep Y"; +const char MSG_BABYSTEP_Y_IT[] PROGMEM = "Babystep Y"; +const char MSG_BABYSTEP_Y_ES[] PROGMEM = "Babystep Y"; +const char MSG_BABYSTEP_Y_PL[] PROGMEM = "Babystep Y"; +const char * const MSG_BABYSTEP_Y_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEP_Y_EN, + MSG_BABYSTEP_Y_CZ, + MSG_BABYSTEP_Y_IT, + MSG_BABYSTEP_Y_ES, + MSG_BABYSTEP_Y_PL +}; + +const char MSG_BABYSTEP_Z_EN[] PROGMEM = "Live adjust Z"; +const char MSG_BABYSTEP_Z_CZ[] PROGMEM = "Doladeni osy Z"; +const char MSG_BABYSTEP_Z_IT[] PROGMEM = "Babystep Z"; +const char MSG_BABYSTEP_Z_ES[] PROGMEM = "Micropaso Z"; +const char MSG_BABYSTEP_Z_PL[] PROGMEM = "Dostrojenie osy Z"; +const char * const MSG_BABYSTEP_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEP_Z_EN, + MSG_BABYSTEP_Z_CZ, + MSG_BABYSTEP_Z_IT, + MSG_BABYSTEP_Z_ES, + MSG_BABYSTEP_Z_PL +}; + +const char MSG_BED_EN[] PROGMEM = "Bed"; +const char MSG_BED_CZ[] PROGMEM = "Bed"; +const char MSG_BED_IT[] PROGMEM = "Piatto"; +const char MSG_BED_ES[] PROGMEM = "Base"; +const char MSG_BED_PL[] PROGMEM = "Stolik"; +const char * const MSG_BED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_EN, + MSG_BED_CZ, + MSG_BED_IT, + MSG_BED_ES, + MSG_BED_PL +}; + +const char MSG_BED_DONE_EN[] PROGMEM = "Bed done"; +const char MSG_BED_DONE_CZ[] PROGMEM = "Bed OK."; +const char MSG_BED_DONE_IT[] PROGMEM = "Piatto fatto."; +const char MSG_BED_DONE_ES[] PROGMEM = "Base listo."; +const char MSG_BED_DONE_PL[] PROGMEM = "Stolik OK."; +const char * const MSG_BED_DONE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_DONE_EN, + MSG_BED_DONE_CZ, + MSG_BED_DONE_IT, + MSG_BED_DONE_ES, + MSG_BED_DONE_PL +}; + +const char MSG_BED_HEATING_EN[] PROGMEM = "Bed Heating"; +const char MSG_BED_HEATING_CZ[] PROGMEM = "Zahrivani bed"; +const char MSG_BED_HEATING_IT[] PROGMEM = "Piatto riscaldam."; +const char MSG_BED_HEATING_ES[] PROGMEM = "Base Calentando"; +const char MSG_BED_HEATING_PL[] PROGMEM = "Grzanie stolika.."; +const char * const MSG_BED_HEATING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_HEATING_EN, + MSG_BED_HEATING_CZ, + MSG_BED_HEATING_IT, + MSG_BED_HEATING_ES, + MSG_BED_HEATING_PL +}; + +const char MSG_BEGIN_FILE_LIST_EN[] PROGMEM = "Begin file list"; +const char MSG_BEGIN_FILE_LIST_CZ[] PROGMEM = "Begin file list"; +const char MSG_BEGIN_FILE_LIST_IT[] PROGMEM = "Begin file list"; +const char MSG_BEGIN_FILE_LIST_ES[] PROGMEM = "Begin file list"; +const char MSG_BEGIN_FILE_LIST_PL[] PROGMEM = "Begin file list"; +const char * const MSG_BEGIN_FILE_LIST_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BEGIN_FILE_LIST_EN, + MSG_BEGIN_FILE_LIST_CZ, + MSG_BEGIN_FILE_LIST_IT, + MSG_BEGIN_FILE_LIST_ES, + MSG_BEGIN_FILE_LIST_PL +}; + +const char MSG_BROWNOUT_RESET_EN[] PROGMEM = " Brown out Reset"; +const char MSG_BROWNOUT_RESET_CZ[] PROGMEM = " Brown out Reset"; +const char MSG_BROWNOUT_RESET_IT[] PROGMEM = " Brown out Reset"; +const char MSG_BROWNOUT_RESET_ES[] PROGMEM = " Brown out Reset"; +const char MSG_BROWNOUT_RESET_PL[] PROGMEM = " Brown out Reset"; +const char * const MSG_BROWNOUT_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BROWNOUT_RESET_EN, + MSG_BROWNOUT_RESET_CZ, + MSG_BROWNOUT_RESET_IT, + MSG_BROWNOUT_RESET_ES, + MSG_BROWNOUT_RESET_PL +}; + +const char MSG_CALIBRATE_BED_EN[] PROGMEM = "Calibrate bed"; +const char MSG_CALIBRATE_BED_CZ[] PROGMEM = "Calibrate bed"; +const char MSG_CALIBRATE_BED_IT[] PROGMEM = "Calibrate bed"; +const char MSG_CALIBRATE_BED_ES[] PROGMEM = "Calibrate bed"; +const char MSG_CALIBRATE_BED_PL[] PROGMEM = "Calibrate bed"; +const char * const MSG_CALIBRATE_BED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CALIBRATE_BED_EN, + MSG_CALIBRATE_BED_CZ, + MSG_CALIBRATE_BED_IT, + MSG_CALIBRATE_BED_ES, + MSG_CALIBRATE_BED_PL +}; + +const char MSG_CALIBRATE_BED_RESET_EN[] PROGMEM = "Reset bed calibration"; +const char MSG_CALIBRATE_BED_RESET_CZ[] PROGMEM = "Reset bed calibration"; +const char MSG_CALIBRATE_BED_RESET_IT[] PROGMEM = "Reset bed calibration"; +const char MSG_CALIBRATE_BED_RESET_ES[] PROGMEM = "Reset bed calibration"; +const char MSG_CALIBRATE_BED_RESET_PL[] PROGMEM = "Reset bed calibration"; +const char * const MSG_CALIBRATE_BED_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CALIBRATE_BED_RESET_EN, + MSG_CALIBRATE_BED_RESET_CZ, + MSG_CALIBRATE_BED_RESET_IT, + MSG_CALIBRATE_BED_RESET_ES, + MSG_CALIBRATE_BED_RESET_PL +}; + +const char MSG_CARD_MENU_EN[] PROGMEM = "Print from SD"; +const char MSG_CARD_MENU_CZ[] PROGMEM = "Tisk z SD"; +const char MSG_CARD_MENU_IT[] PROGMEM = "Menu SD Carta"; +const char MSG_CARD_MENU_ES[] PROGMEM = "Menu de SD"; +const char MSG_CARD_MENU_PL[] PROGMEM = "Druk z SD"; +const char * const MSG_CARD_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CARD_MENU_EN, + MSG_CARD_MENU_CZ, + MSG_CARD_MENU_IT, + MSG_CARD_MENU_ES, + MSG_CARD_MENU_PL +}; + +const char MSG_CHANGE_SUCCESS_EN[] PROGMEM = "Change success!"; +const char MSG_CHANGE_SUCCESS_CZ[] PROGMEM = "Zmena uspesna!"; +const char MSG_CHANGE_SUCCESS_IT[] PROGMEM = "Cambia. riuscito!"; +const char MSG_CHANGE_SUCCESS_ES[] PROGMEM = "Cambiar bien!"; +const char MSG_CHANGE_SUCCESS_PL[] PROGMEM = "Wymiana ok!"; +const char * const MSG_CHANGE_SUCCESS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CHANGE_SUCCESS_EN, + MSG_CHANGE_SUCCESS_CZ, + MSG_CHANGE_SUCCESS_IT, + MSG_CHANGE_SUCCESS_ES, + MSG_CHANGE_SUCCESS_PL +}; + +const char MSG_CHANGING_FILAMENT_EN[] PROGMEM = "Changing filament!"; +const char MSG_CHANGING_FILAMENT_CZ[] PROGMEM = "Vymena filamentu!"; +const char MSG_CHANGING_FILAMENT_IT[] PROGMEM = "Mutevole fil.!"; +const char MSG_CHANGING_FILAMENT_ES[] PROGMEM = "Cambiando fil.!"; +const char MSG_CHANGING_FILAMENT_PL[] PROGMEM = "Wymiana filamentu"; +const char * const MSG_CHANGING_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CHANGING_FILAMENT_EN, + MSG_CHANGING_FILAMENT_CZ, + MSG_CHANGING_FILAMENT_IT, + MSG_CHANGING_FILAMENT_ES, + MSG_CHANGING_FILAMENT_PL +}; + +const char MSG_CNG_SDCARD_EN[] PROGMEM = "Change SD card"; +const char MSG_CNG_SDCARD_CZ[] PROGMEM = "Vymenit SD"; +const char MSG_CNG_SDCARD_IT[] PROGMEM = "Change SD card"; +const char MSG_CNG_SDCARD_ES[] PROGMEM = "Change SD card"; +const char MSG_CNG_SDCARD_PL[] PROGMEM = "Vymenit SD"; +const char * const MSG_CNG_SDCARD_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CNG_SDCARD_EN, + MSG_CNG_SDCARD_CZ, + MSG_CNG_SDCARD_IT, + MSG_CNG_SDCARD_ES, + MSG_CNG_SDCARD_PL +}; + +const char MSG_CONFIGURATION_VER_EN[] PROGMEM = " Last Updated: "; +const char MSG_CONFIGURATION_VER_CZ[] PROGMEM = " Last Updated: "; +const char MSG_CONFIGURATION_VER_IT[] PROGMEM = " Last Updated: "; +const char MSG_CONFIGURATION_VER_ES[] PROGMEM = " Last Updated: "; +const char MSG_CONFIGURATION_VER_PL[] PROGMEM = " Last Updated: "; +const char * const MSG_CONFIGURATION_VER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIGURATION_VER_EN, + MSG_CONFIGURATION_VER_CZ, + MSG_CONFIGURATION_VER_IT, + MSG_CONFIGURATION_VER_ES, + MSG_CONFIGURATION_VER_PL +}; + +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_EN[] PROGMEM = "Are both left and right Z carriages"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_CZ[] PROGMEM = "Are both left and right Z carriages"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_IT[] PROGMEM = "Are both left and right Z carriages"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_ES[] PROGMEM = "Are both left and right Z carriages"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_PL[] PROGMEM = "Are both left and right Z carriages"; +const char * const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_EN, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_CZ, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_IT, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_ES, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_PL +}; + +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_EN[] PROGMEM = "touching the end stops?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_CZ[] PROGMEM = "touching the end stops?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_IT[] PROGMEM = "touching the end stops?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_ES[] PROGMEM = "touching the end stops?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_PL[] PROGMEM = "touching the end stops?"; +const char * const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_EN, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_CZ, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_IT, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_ES, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_PL +}; + +const char MSG_CONTRAST_EN[] PROGMEM = "LCD contrast"; +const char MSG_CONTRAST_CZ[] PROGMEM = "LCD contrast"; +const char MSG_CONTRAST_IT[] PROGMEM = "LCD contrast"; +const char MSG_CONTRAST_ES[] PROGMEM = "LCD contrast"; +const char MSG_CONTRAST_PL[] PROGMEM = "LCD contrast"; +const char * const MSG_CONTRAST_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTRAST_EN, + MSG_CONTRAST_CZ, + MSG_CONTRAST_IT, + MSG_CONTRAST_ES, + MSG_CONTRAST_PL +}; + +const char MSG_CONTROL_EN[] PROGMEM = "Control"; +const char MSG_CONTROL_CZ[] PROGMEM = "Kontrola"; +const char MSG_CONTROL_IT[] PROGMEM = "Control"; +const char MSG_CONTROL_ES[] PROGMEM = "Control"; +const char MSG_CONTROL_PL[] PROGMEM = "Kontrola"; +const char * const MSG_CONTROL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_EN, + MSG_CONTROL_CZ, + MSG_CONTROL_IT, + MSG_CONTROL_ES, + MSG_CONTROL_PL +}; + +const char MSG_CONTROL_RETRACT_EN[] PROGMEM = "Retract mm"; +const char MSG_CONTROL_RETRACT_CZ[] PROGMEM = "Retract mm"; +const char MSG_CONTROL_RETRACT_IT[] PROGMEM = "Retract mm"; +const char MSG_CONTROL_RETRACT_ES[] PROGMEM = "Retract mm"; +const char MSG_CONTROL_RETRACT_PL[] PROGMEM = "Retract mm"; +const char * const MSG_CONTROL_RETRACT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_EN, + MSG_CONTROL_RETRACT_CZ, + MSG_CONTROL_RETRACT_IT, + MSG_CONTROL_RETRACT_ES, + MSG_CONTROL_RETRACT_PL +}; + +const char MSG_CONTROL_RETRACTF_EN[] PROGMEM = "Retract V"; +const char MSG_CONTROL_RETRACTF_CZ[] PROGMEM = "Retract V"; +const char MSG_CONTROL_RETRACTF_IT[] PROGMEM = "Retract V"; +const char MSG_CONTROL_RETRACTF_ES[] PROGMEM = "Retract V"; +const char MSG_CONTROL_RETRACTF_PL[] PROGMEM = "Retract V"; +const char * const MSG_CONTROL_RETRACTF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACTF_EN, + MSG_CONTROL_RETRACTF_CZ, + MSG_CONTROL_RETRACTF_IT, + MSG_CONTROL_RETRACTF_ES, + MSG_CONTROL_RETRACTF_PL +}; + +const char MSG_CONTROL_RETRACT_RECOVER_EN[] PROGMEM = "UnRet +mm"; +const char MSG_CONTROL_RETRACT_RECOVER_CZ[] PROGMEM = "UnRet +mm"; +const char MSG_CONTROL_RETRACT_RECOVER_IT[] PROGMEM = "UnRet +mm"; +const char MSG_CONTROL_RETRACT_RECOVER_ES[] PROGMEM = "UnRet +mm"; +const char MSG_CONTROL_RETRACT_RECOVER_PL[] PROGMEM = "UnRet +mm"; +const char * const MSG_CONTROL_RETRACT_RECOVER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_RECOVER_EN, + MSG_CONTROL_RETRACT_RECOVER_CZ, + MSG_CONTROL_RETRACT_RECOVER_IT, + MSG_CONTROL_RETRACT_RECOVER_ES, + MSG_CONTROL_RETRACT_RECOVER_PL +}; + +const char MSG_CONTROL_RETRACT_RECOVERF_EN[] PROGMEM = "UnRet V"; +const char MSG_CONTROL_RETRACT_RECOVERF_CZ[] PROGMEM = "UnRet V"; +const char MSG_CONTROL_RETRACT_RECOVERF_IT[] PROGMEM = "UnRet V"; +const char MSG_CONTROL_RETRACT_RECOVERF_ES[] PROGMEM = "UnRet V"; +const char MSG_CONTROL_RETRACT_RECOVERF_PL[] PROGMEM = "UnRet V"; +const char * const MSG_CONTROL_RETRACT_RECOVERF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_RECOVERF_EN, + MSG_CONTROL_RETRACT_RECOVERF_CZ, + MSG_CONTROL_RETRACT_RECOVERF_IT, + MSG_CONTROL_RETRACT_RECOVERF_ES, + MSG_CONTROL_RETRACT_RECOVERF_PL +}; + +const char MSG_CONTROL_RETRACT_RECOVER_SWAP_EN[] PROGMEM = "S UnRet+mm"; +const char MSG_CONTROL_RETRACT_RECOVER_SWAP_CZ[] PROGMEM = "S UnRet+mm"; +const char MSG_CONTROL_RETRACT_RECOVER_SWAP_IT[] PROGMEM = "S UnRet+mm"; +const char MSG_CONTROL_RETRACT_RECOVER_SWAP_ES[] PROGMEM = "S UnRet+mm"; +const char MSG_CONTROL_RETRACT_RECOVER_SWAP_PL[] PROGMEM = "S UnRet+mm"; +const char * const MSG_CONTROL_RETRACT_RECOVER_SWAP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_RECOVER_SWAP_EN, + MSG_CONTROL_RETRACT_RECOVER_SWAP_CZ, + MSG_CONTROL_RETRACT_RECOVER_SWAP_IT, + MSG_CONTROL_RETRACT_RECOVER_SWAP_ES, + MSG_CONTROL_RETRACT_RECOVER_SWAP_PL +}; + +const char MSG_CONTROL_RETRACT_SWAP_EN[] PROGMEM = "Swap Re.mm"; +const char MSG_CONTROL_RETRACT_SWAP_CZ[] PROGMEM = "Swap Re.mm"; +const char MSG_CONTROL_RETRACT_SWAP_IT[] PROGMEM = "Swap Re.mm"; +const char MSG_CONTROL_RETRACT_SWAP_ES[] PROGMEM = "Swap Re.mm"; +const char MSG_CONTROL_RETRACT_SWAP_PL[] PROGMEM = "Swap Re.mm"; +const char * const MSG_CONTROL_RETRACT_SWAP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_SWAP_EN, + MSG_CONTROL_RETRACT_SWAP_CZ, + MSG_CONTROL_RETRACT_SWAP_IT, + MSG_CONTROL_RETRACT_SWAP_ES, + MSG_CONTROL_RETRACT_SWAP_PL +}; + +const char MSG_CONTROL_RETRACT_ZLIFT_EN[] PROGMEM = "Hop mm"; +const char MSG_CONTROL_RETRACT_ZLIFT_CZ[] PROGMEM = "Hop mm"; +const char MSG_CONTROL_RETRACT_ZLIFT_IT[] PROGMEM = "Hop mm"; +const char MSG_CONTROL_RETRACT_ZLIFT_ES[] PROGMEM = "Hop mm"; +const char MSG_CONTROL_RETRACT_ZLIFT_PL[] PROGMEM = "Hop mm"; +const char * const MSG_CONTROL_RETRACT_ZLIFT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONTROL_RETRACT_ZLIFT_EN, + MSG_CONTROL_RETRACT_ZLIFT_CZ, + MSG_CONTROL_RETRACT_ZLIFT_IT, + MSG_CONTROL_RETRACT_ZLIFT_ES, + MSG_CONTROL_RETRACT_ZLIFT_PL +}; + +const char MSG_COOLDOWN_EN[] PROGMEM = "Cooldown"; +const char MSG_COOLDOWN_CZ[] PROGMEM = "Zchladit"; +const char MSG_COOLDOWN_IT[] PROGMEM = "Raffredda"; +const char MSG_COOLDOWN_ES[] PROGMEM = "Enfriar"; +const char MSG_COOLDOWN_PL[] PROGMEM = "Wychlodzic"; +const char * const MSG_COOLDOWN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_COOLDOWN_EN, + MSG_COOLDOWN_CZ, + MSG_COOLDOWN_IT, + MSG_COOLDOWN_ES, + MSG_COOLDOWN_PL +}; + +const char MSG_CORRECTLY_EN[] PROGMEM = "Changed correctly?"; +const char MSG_CORRECTLY_CZ[] PROGMEM = "Vymena ok?"; +const char MSG_CORRECTLY_IT[] PROGMEM = "Cambiato corr.?"; +const char MSG_CORRECTLY_ES[] PROGMEM = "Cambiado correc.?"; +const char MSG_CORRECTLY_PL[] PROGMEM = "Wymiana ok?"; +const char * const MSG_CORRECTLY_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CORRECTLY_EN, + MSG_CORRECTLY_CZ, + MSG_CORRECTLY_IT, + MSG_CORRECTLY_ES, + MSG_CORRECTLY_PL +}; + +const char MSG_COUNT_X_EN[] PROGMEM = " Count X: "; +const char MSG_COUNT_X_CZ[] PROGMEM = " Count X: "; +const char MSG_COUNT_X_IT[] PROGMEM = " Count X: "; +const char MSG_COUNT_X_ES[] PROGMEM = " Count X: "; +const char MSG_COUNT_X_PL[] PROGMEM = " Count X: "; +const char * const MSG_COUNT_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_COUNT_X_EN, + MSG_COUNT_X_CZ, + MSG_COUNT_X_IT, + MSG_COUNT_X_ES, + MSG_COUNT_X_PL +}; + +const char MSG_DISABLE_STEPPERS_EN[] PROGMEM = "Disable steppers"; +const char MSG_DISABLE_STEPPERS_CZ[] PROGMEM = "Vypnout motory"; +const char MSG_DISABLE_STEPPERS_IT[] PROGMEM = "Disabilita Motori"; +const char MSG_DISABLE_STEPPERS_ES[] PROGMEM = "Apagar motores"; +const char MSG_DISABLE_STEPPERS_PL[] PROGMEM = "Wylaczyc silniki"; +const char * const MSG_DISABLE_STEPPERS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_DISABLE_STEPPERS_EN, + MSG_DISABLE_STEPPERS_CZ, + MSG_DISABLE_STEPPERS_IT, + MSG_DISABLE_STEPPERS_ES, + MSG_DISABLE_STEPPERS_PL +}; + +const char MSG_DWELL_EN[] PROGMEM = "Sleep..."; +const char MSG_DWELL_CZ[] PROGMEM = "Sleep..."; +const char MSG_DWELL_IT[] PROGMEM = "Sospensione..."; +const char MSG_DWELL_ES[] PROGMEM = "Reposo..."; +const char MSG_DWELL_PL[] PROGMEM = "Sleep..."; +const char * const MSG_DWELL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_DWELL_EN, + MSG_DWELL_CZ, + MSG_DWELL_IT, + MSG_DWELL_ES, + MSG_DWELL_PL +}; + +const char MSG_E_EN[] PROGMEM = "e"; +const char MSG_E_CZ[] PROGMEM = "e"; +const char MSG_E_IT[] PROGMEM = "e"; +const char MSG_E_ES[] PROGMEM = "e"; +const char MSG_E_PL[] PROGMEM = "e"; +const char * const MSG_E_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_E_EN, + MSG_E_CZ, + MSG_E_IT, + MSG_E_ES, + MSG_E_PL +}; + +const char MSG_ENDSTOPS_HIT_EN[] PROGMEM = "endstops hit: "; +const char MSG_ENDSTOPS_HIT_CZ[] PROGMEM = "endstops hit: "; +const char MSG_ENDSTOPS_HIT_IT[] PROGMEM = "endstops hit: "; +const char MSG_ENDSTOPS_HIT_ES[] PROGMEM = "endstops hit: "; +const char MSG_ENDSTOPS_HIT_PL[] PROGMEM = "endstops hit: "; +const char * const MSG_ENDSTOPS_HIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ENDSTOPS_HIT_EN, + MSG_ENDSTOPS_HIT_CZ, + MSG_ENDSTOPS_HIT_IT, + MSG_ENDSTOPS_HIT_ES, + MSG_ENDSTOPS_HIT_PL +}; + +const char MSG_ENDSTOP_ABORT_EN[] PROGMEM = "Endstop abort"; +const char MSG_ENDSTOP_ABORT_CZ[] PROGMEM = "Endstop abort"; +const char MSG_ENDSTOP_ABORT_IT[] PROGMEM = "Endstop abort"; +const char MSG_ENDSTOP_ABORT_ES[] PROGMEM = "Endstop abort"; +const char MSG_ENDSTOP_ABORT_PL[] PROGMEM = "Endstop abort"; +const char * const MSG_ENDSTOP_ABORT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ENDSTOP_ABORT_EN, + MSG_ENDSTOP_ABORT_CZ, + MSG_ENDSTOP_ABORT_IT, + MSG_ENDSTOP_ABORT_ES, + MSG_ENDSTOP_ABORT_PL +}; + +const char MSG_ENDSTOP_HIT_EN[] PROGMEM = "TRIGGERED"; +const char MSG_ENDSTOP_HIT_CZ[] PROGMEM = "TRIGGERED"; +const char MSG_ENDSTOP_HIT_IT[] PROGMEM = "TRIGGERED"; +const char MSG_ENDSTOP_HIT_ES[] PROGMEM = "TRIGGERED"; +const char MSG_ENDSTOP_HIT_PL[] PROGMEM = "TRIGGERED"; +const char * const MSG_ENDSTOP_HIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ENDSTOP_HIT_EN, + MSG_ENDSTOP_HIT_CZ, + MSG_ENDSTOP_HIT_IT, + MSG_ENDSTOP_HIT_ES, + MSG_ENDSTOP_HIT_PL +}; + +const char MSG_ENDSTOP_OPEN_EN[] PROGMEM = "open"; +const char MSG_ENDSTOP_OPEN_CZ[] PROGMEM = "open"; +const char MSG_ENDSTOP_OPEN_IT[] PROGMEM = "open"; +const char MSG_ENDSTOP_OPEN_ES[] PROGMEM = "open"; +const char MSG_ENDSTOP_OPEN_PL[] PROGMEM = "open"; +const char * const MSG_ENDSTOP_OPEN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ENDSTOP_OPEN_EN, + MSG_ENDSTOP_OPEN_CZ, + MSG_ENDSTOP_OPEN_IT, + MSG_ENDSTOP_OPEN_ES, + MSG_ENDSTOP_OPEN_PL +}; + +const char MSG_END_FILE_LIST_EN[] PROGMEM = "End file list"; +const char MSG_END_FILE_LIST_CZ[] PROGMEM = "End file list"; +const char MSG_END_FILE_LIST_IT[] PROGMEM = "End file list"; +const char MSG_END_FILE_LIST_ES[] PROGMEM = "End file list"; +const char MSG_END_FILE_LIST_PL[] PROGMEM = "End file list"; +const char * const MSG_END_FILE_LIST_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_END_FILE_LIST_EN, + MSG_END_FILE_LIST_CZ, + MSG_END_FILE_LIST_IT, + MSG_END_FILE_LIST_ES, + MSG_END_FILE_LIST_PL +}; + +const char MSG_ERROR_EN[] PROGMEM = "ERROR:"; +const char MSG_ERROR_CZ[] PROGMEM = "CHYBA:"; +const char MSG_ERROR_IT[] PROGMEM = "ERROR:"; +const char MSG_ERROR_ES[] PROGMEM = "ERROR:"; +const char MSG_ERROR_PL[] PROGMEM = "BLAD:"; +const char * const MSG_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERROR_EN, + MSG_ERROR_CZ, + MSG_ERROR_IT, + MSG_ERROR_ES, + MSG_ERROR_PL +}; + +const char MSG_ERR_CHECKSUM_MISMATCH_EN[] PROGMEM = "checksum mismatch, Last Line: "; +const char MSG_ERR_CHECKSUM_MISMATCH_CZ[] PROGMEM = "checksum mismatch, Last Line: "; +const char MSG_ERR_CHECKSUM_MISMATCH_IT[] PROGMEM = "checksum mismatch, Last Line: "; +const char MSG_ERR_CHECKSUM_MISMATCH_ES[] PROGMEM = "checksum mismatch, Last Line: "; +const char MSG_ERR_CHECKSUM_MISMATCH_PL[] PROGMEM = "checksum mismatch, Last Line: "; +const char * const MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_CHECKSUM_MISMATCH_EN, + MSG_ERR_CHECKSUM_MISMATCH_CZ, + MSG_ERR_CHECKSUM_MISMATCH_IT, + MSG_ERR_CHECKSUM_MISMATCH_ES, + MSG_ERR_CHECKSUM_MISMATCH_PL +}; + +const char MSG_ERR_COLD_EXTRUDE_STOP_EN[] PROGMEM = " cold extrusion prevented"; +const char MSG_ERR_COLD_EXTRUDE_STOP_CZ[] PROGMEM = " cold extrusion prevented"; +const char MSG_ERR_COLD_EXTRUDE_STOP_IT[] PROGMEM = " cold extrusion prevented"; +const char MSG_ERR_COLD_EXTRUDE_STOP_ES[] PROGMEM = " cold extrusion prevented"; +const char MSG_ERR_COLD_EXTRUDE_STOP_PL[] PROGMEM = " cold extrusion prevented"; +const char * const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_COLD_EXTRUDE_STOP_EN, + MSG_ERR_COLD_EXTRUDE_STOP_CZ, + MSG_ERR_COLD_EXTRUDE_STOP_IT, + MSG_ERR_COLD_EXTRUDE_STOP_ES, + MSG_ERR_COLD_EXTRUDE_STOP_PL +}; + +const char MSG_ERR_KILLED_EN[] PROGMEM = "Printer halted. kill() called!"; +const char MSG_ERR_KILLED_CZ[] PROGMEM = "Printer halted. kill() called!"; +const char MSG_ERR_KILLED_IT[] PROGMEM = "Printer halted. kill() called!"; +const char MSG_ERR_KILLED_ES[] PROGMEM = "Printer halted. kill() called!"; +const char MSG_ERR_KILLED_PL[] PROGMEM = "Printer halted. kill() called!"; +const char * const MSG_ERR_KILLED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_KILLED_EN, + MSG_ERR_KILLED_CZ, + MSG_ERR_KILLED_IT, + MSG_ERR_KILLED_ES, + MSG_ERR_KILLED_PL +}; + +const char MSG_ERR_LINE_NO_EN[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char MSG_ERR_LINE_NO_CZ[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char MSG_ERR_LINE_NO_IT[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char MSG_ERR_LINE_NO_ES[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char MSG_ERR_LINE_NO_PL[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char * const MSG_ERR_LINE_NO_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_LINE_NO_EN, + MSG_ERR_LINE_NO_CZ, + MSG_ERR_LINE_NO_IT, + MSG_ERR_LINE_NO_ES, + MSG_ERR_LINE_NO_PL +}; + +const char MSG_ERR_LONG_EXTRUDE_STOP_EN[] PROGMEM = " too long extrusion prevented"; +const char MSG_ERR_LONG_EXTRUDE_STOP_CZ[] PROGMEM = " too long extrusion prevented"; +const char MSG_ERR_LONG_EXTRUDE_STOP_IT[] PROGMEM = " too long extrusion prevented"; +const char MSG_ERR_LONG_EXTRUDE_STOP_ES[] PROGMEM = " too long extrusion prevented"; +const char MSG_ERR_LONG_EXTRUDE_STOP_PL[] PROGMEM = " too long extrusion prevented"; +const char * const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_LONG_EXTRUDE_STOP_EN, + MSG_ERR_LONG_EXTRUDE_STOP_CZ, + MSG_ERR_LONG_EXTRUDE_STOP_IT, + MSG_ERR_LONG_EXTRUDE_STOP_ES, + MSG_ERR_LONG_EXTRUDE_STOP_PL +}; + +const char MSG_ERR_NO_CHECKSUM_EN[] PROGMEM = "No Checksum with line number, Last Line: "; +const char MSG_ERR_NO_CHECKSUM_CZ[] PROGMEM = "No Checksum with line number, Last Line: "; +const char MSG_ERR_NO_CHECKSUM_IT[] PROGMEM = "No Checksum with line number, Last Line: "; +const char MSG_ERR_NO_CHECKSUM_ES[] PROGMEM = "No Checksum with line number, Last Line: "; +const char MSG_ERR_NO_CHECKSUM_PL[] PROGMEM = "No Checksum with line number, Last Line: "; +const char * const MSG_ERR_NO_CHECKSUM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_NO_CHECKSUM_EN, + MSG_ERR_NO_CHECKSUM_CZ, + MSG_ERR_NO_CHECKSUM_IT, + MSG_ERR_NO_CHECKSUM_ES, + MSG_ERR_NO_CHECKSUM_PL +}; + +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_CZ[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_IT[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_ES[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_PL[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char * const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN, + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_CZ, + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_IT, + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_ES, + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_PL +}; + +const char MSG_ERR_NO_THERMISTORS_EN[] PROGMEM = "No thermistors - no temperature"; +const char MSG_ERR_NO_THERMISTORS_CZ[] PROGMEM = "No thermistors - no temperature"; +const char MSG_ERR_NO_THERMISTORS_IT[] PROGMEM = "No thermistors - no temperature"; +const char MSG_ERR_NO_THERMISTORS_ES[] PROGMEM = "No thermistors - no temperature"; +const char MSG_ERR_NO_THERMISTORS_PL[] PROGMEM = "No thermistors - no temperature"; +const char * const MSG_ERR_NO_THERMISTORS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_NO_THERMISTORS_EN, + MSG_ERR_NO_THERMISTORS_CZ, + MSG_ERR_NO_THERMISTORS_IT, + MSG_ERR_NO_THERMISTORS_ES, + MSG_ERR_NO_THERMISTORS_PL +}; + +const char MSG_ERR_STOPPED_EN[] PROGMEM = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; +const char MSG_ERR_STOPPED_CZ[] PROGMEM = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; +const char MSG_ERR_STOPPED_IT[] PROGMEM = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; +const char MSG_ERR_STOPPED_ES[] PROGMEM = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; +const char MSG_ERR_STOPPED_PL[] PROGMEM = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; +const char * const MSG_ERR_STOPPED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERR_STOPPED_EN, + MSG_ERR_STOPPED_CZ, + MSG_ERR_STOPPED_IT, + MSG_ERR_STOPPED_ES, + MSG_ERR_STOPPED_PL +}; + +const char MSG_ESTEPS_EN[] PROGMEM = "Esteps/mm"; +const char MSG_ESTEPS_CZ[] PROGMEM = "Esteps/mm"; +const char MSG_ESTEPS_IT[] PROGMEM = "Esteps/mm"; +const char MSG_ESTEPS_ES[] PROGMEM = "Esteps/mm"; +const char MSG_ESTEPS_PL[] PROGMEM = "Esteps/mm"; +const char * const MSG_ESTEPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ESTEPS_EN, + MSG_ESTEPS_CZ, + MSG_ESTEPS_IT, + MSG_ESTEPS_ES, + MSG_ESTEPS_PL +}; + +const char MSG_EXTERNAL_RESET_EN[] PROGMEM = " External Reset"; +const char MSG_EXTERNAL_RESET_CZ[] PROGMEM = " External Reset"; +const char MSG_EXTERNAL_RESET_IT[] PROGMEM = " External Reset"; +const char MSG_EXTERNAL_RESET_ES[] PROGMEM = " External Reset"; +const char MSG_EXTERNAL_RESET_PL[] PROGMEM = " External Reset"; +const char * const MSG_EXTERNAL_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTERNAL_RESET_EN, + MSG_EXTERNAL_RESET_CZ, + MSG_EXTERNAL_RESET_IT, + MSG_EXTERNAL_RESET_ES, + MSG_EXTERNAL_RESET_PL +}; + +const char MSG_EXTRUDE_EN[] PROGMEM = "Extrude"; +const char MSG_EXTRUDE_CZ[] PROGMEM = "Extrudovat"; +const char MSG_EXTRUDE_IT[] PROGMEM = "Extrude"; +const char MSG_EXTRUDE_ES[] PROGMEM = "Extrude"; +const char MSG_EXTRUDE_PL[] PROGMEM = "Extrudovat"; +const char * const MSG_EXTRUDE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDE_EN, + MSG_EXTRUDE_CZ, + MSG_EXTRUDE_IT, + MSG_EXTRUDE_ES, + MSG_EXTRUDE_PL +}; + +const char MSG_Enqueing_EN[] PROGMEM = "enqueing \""; +const char MSG_Enqueing_CZ[] PROGMEM = "enqueing \""; +const char MSG_Enqueing_IT[] PROGMEM = "enqueing \""; +const char MSG_Enqueing_ES[] PROGMEM = "enqueing \""; +const char MSG_Enqueing_PL[] PROGMEM = "enqueing \""; +const char * const MSG_Enqueing_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Enqueing_EN, + MSG_Enqueing_CZ, + MSG_Enqueing_IT, + MSG_Enqueing_ES, + MSG_Enqueing_PL +}; + +const char MSG_FACTOR_EN[] PROGMEM = " \002 Fact"; +const char MSG_FACTOR_CZ[] PROGMEM = " \002 Fact"; +const char MSG_FACTOR_IT[] PROGMEM = " \002 Fact"; +const char MSG_FACTOR_ES[] PROGMEM = " \002 Fact"; +const char MSG_FACTOR_PL[] PROGMEM = " \002 Fact"; +const char * const MSG_FACTOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FACTOR_EN, + MSG_FACTOR_CZ, + MSG_FACTOR_IT, + MSG_FACTOR_ES, + MSG_FACTOR_PL +}; + +const char MSG_FAN_SPEED_EN[] PROGMEM = "Fan speed"; +const char MSG_FAN_SPEED_CZ[] PROGMEM = "Rychlost vent."; +const char MSG_FAN_SPEED_IT[] PROGMEM = "Ventola"; +const char MSG_FAN_SPEED_ES[] PROGMEM = "Ventilador"; +const char MSG_FAN_SPEED_PL[] PROGMEM = "Predkosc went."; +const char * const MSG_FAN_SPEED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FAN_SPEED_EN, + MSG_FAN_SPEED_CZ, + MSG_FAN_SPEED_IT, + MSG_FAN_SPEED_ES, + MSG_FAN_SPEED_PL +}; + +const char MSG_FILAMENTCHANGE_EN[] PROGMEM = "Change filament"; +const char MSG_FILAMENTCHANGE_CZ[] PROGMEM = "Vymenit filament"; +const char MSG_FILAMENTCHANGE_IT[] PROGMEM = "Cambiare filamento"; +const char MSG_FILAMENTCHANGE_ES[] PROGMEM = "Cambiar filamento"; +const char MSG_FILAMENTCHANGE_PL[] PROGMEM = "Wymienic filament"; +const char * const MSG_FILAMENTCHANGE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENTCHANGE_EN, + MSG_FILAMENTCHANGE_CZ, + MSG_FILAMENTCHANGE_IT, + MSG_FILAMENTCHANGE_ES, + MSG_FILAMENTCHANGE_PL +}; + +const char MSG_FILAMENT_SIZE_EXTRUDER_0_EN[] PROGMEM = "Fil. Dia. 1"; +const char MSG_FILAMENT_SIZE_EXTRUDER_0_CZ[] PROGMEM = "Fil. Dia. 1"; +const char MSG_FILAMENT_SIZE_EXTRUDER_0_IT[] PROGMEM = "Fil. Dia. 1"; +const char MSG_FILAMENT_SIZE_EXTRUDER_0_ES[] PROGMEM = "Fil. Dia. 1"; +const char MSG_FILAMENT_SIZE_EXTRUDER_0_PL[] PROGMEM = "Fil. Dia. 1"; +const char * const MSG_FILAMENT_SIZE_EXTRUDER_0_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_SIZE_EXTRUDER_0_EN, + MSG_FILAMENT_SIZE_EXTRUDER_0_CZ, + MSG_FILAMENT_SIZE_EXTRUDER_0_IT, + MSG_FILAMENT_SIZE_EXTRUDER_0_ES, + MSG_FILAMENT_SIZE_EXTRUDER_0_PL +}; + +const char MSG_FILAMENT_SIZE_EXTRUDER_1_EN[] PROGMEM = "Fil. Dia. 2"; +const char MSG_FILAMENT_SIZE_EXTRUDER_1_CZ[] PROGMEM = "Fil. Dia. 2"; +const char MSG_FILAMENT_SIZE_EXTRUDER_1_IT[] PROGMEM = "Fil. Dia. 2"; +const char MSG_FILAMENT_SIZE_EXTRUDER_1_ES[] PROGMEM = "Fil. Dia. 2"; +const char MSG_FILAMENT_SIZE_EXTRUDER_1_PL[] PROGMEM = "Fil. Dia. 2"; +const char * const MSG_FILAMENT_SIZE_EXTRUDER_1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_SIZE_EXTRUDER_1_EN, + MSG_FILAMENT_SIZE_EXTRUDER_1_CZ, + MSG_FILAMENT_SIZE_EXTRUDER_1_IT, + MSG_FILAMENT_SIZE_EXTRUDER_1_ES, + MSG_FILAMENT_SIZE_EXTRUDER_1_PL +}; + +const char MSG_FILAMENT_SIZE_EXTRUDER_2_EN[] PROGMEM = "Fil. Dia. 3"; +const char MSG_FILAMENT_SIZE_EXTRUDER_2_CZ[] PROGMEM = "Fil. Dia. 3"; +const char MSG_FILAMENT_SIZE_EXTRUDER_2_IT[] PROGMEM = "Fil. Dia. 3"; +const char MSG_FILAMENT_SIZE_EXTRUDER_2_ES[] PROGMEM = "Fil. Dia. 3"; +const char MSG_FILAMENT_SIZE_EXTRUDER_2_PL[] PROGMEM = "Fil. Dia. 3"; +const char * const MSG_FILAMENT_SIZE_EXTRUDER_2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_SIZE_EXTRUDER_2_EN, + MSG_FILAMENT_SIZE_EXTRUDER_2_CZ, + MSG_FILAMENT_SIZE_EXTRUDER_2_IT, + MSG_FILAMENT_SIZE_EXTRUDER_2_ES, + MSG_FILAMENT_SIZE_EXTRUDER_2_PL +}; + +const char MSG_FILE_PRINTED_EN[] PROGMEM = "Done printing file"; +const char MSG_FILE_PRINTED_CZ[] PROGMEM = "Done printing file"; +const char MSG_FILE_PRINTED_IT[] PROGMEM = "Done printing file"; +const char MSG_FILE_PRINTED_ES[] PROGMEM = "Done printing file"; +const char MSG_FILE_PRINTED_PL[] PROGMEM = "Done printing file"; +const char * const MSG_FILE_PRINTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILE_PRINTED_EN, + MSG_FILE_PRINTED_CZ, + MSG_FILE_PRINTED_IT, + MSG_FILE_PRINTED_ES, + MSG_FILE_PRINTED_PL +}; + +const char MSG_FILE_SAVED_EN[] PROGMEM = "Done saving file."; +const char MSG_FILE_SAVED_CZ[] PROGMEM = "Done saving file."; +const char MSG_FILE_SAVED_IT[] PROGMEM = "Done saving file."; +const char MSG_FILE_SAVED_ES[] PROGMEM = "Done saving file."; +const char MSG_FILE_SAVED_PL[] PROGMEM = "Done saving file."; +const char * const MSG_FILE_SAVED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILE_SAVED_EN, + MSG_FILE_SAVED_CZ, + MSG_FILE_SAVED_IT, + MSG_FILE_SAVED_ES, + MSG_FILE_SAVED_PL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Searching calibration"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Searching calibration"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Searching calibration"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Searching calibration"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Searching calibration"; +const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_IT, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = "point "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = "point "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = "point "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = "point "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = "point "; +const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_IT, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN[] PROGMEM = "of 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_CZ[] PROGMEM = "of 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_IT[] PROGMEM = "of 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_ES[] PROGMEM = "of 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_PL[] PROGMEM = "of 4"; +const char * const MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_EN, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_CZ, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_IT, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_ES, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_PL +}; + +const char MSG_FLOW_EN[] PROGMEM = "Flow"; +const char MSG_FLOW_CZ[] PROGMEM = "Prutok"; +const char MSG_FLOW_IT[] PROGMEM = "Flusso"; +const char MSG_FLOW_ES[] PROGMEM = "Flujo"; +const char MSG_FLOW_PL[] PROGMEM = "Przeplyw"; +const char * const MSG_FLOW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FLOW_EN, + MSG_FLOW_CZ, + MSG_FLOW_IT, + MSG_FLOW_ES, + MSG_FLOW_PL +}; + +const char MSG_FLOW0_EN[] PROGMEM = "Flow 0"; +const char MSG_FLOW0_CZ[] PROGMEM = "Prutok 0"; +const char MSG_FLOW0_IT[] PROGMEM = "Flow 0"; +const char MSG_FLOW0_ES[] PROGMEM = "Flow 0"; +const char MSG_FLOW0_PL[] PROGMEM = "Prutok 0"; +const char * const MSG_FLOW0_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FLOW0_EN, + MSG_FLOW0_CZ, + MSG_FLOW0_IT, + MSG_FLOW0_ES, + MSG_FLOW0_PL +}; + +const char MSG_FLOW1_EN[] PROGMEM = "Flow 1"; +const char MSG_FLOW1_CZ[] PROGMEM = "Prutok 1"; +const char MSG_FLOW1_IT[] PROGMEM = "Flow 1"; +const char MSG_FLOW1_ES[] PROGMEM = "Flow 1"; +const char MSG_FLOW1_PL[] PROGMEM = "Prutok 1"; +const char * const MSG_FLOW1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FLOW1_EN, + MSG_FLOW1_CZ, + MSG_FLOW1_IT, + MSG_FLOW1_ES, + MSG_FLOW1_PL +}; + +const char MSG_FLOW2_EN[] PROGMEM = "Flow 2"; +const char MSG_FLOW2_CZ[] PROGMEM = "Prutok 2"; +const char MSG_FLOW2_IT[] PROGMEM = "Flow 2"; +const char MSG_FLOW2_ES[] PROGMEM = "Flow 2"; +const char MSG_FLOW2_PL[] PROGMEM = "Prutok 2"; +const char * const MSG_FLOW2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FLOW2_EN, + MSG_FLOW2_CZ, + MSG_FLOW2_IT, + MSG_FLOW2_ES, + MSG_FLOW2_PL +}; + +const char MSG_FREE_MEMORY_EN[] PROGMEM = " Free Memory: "; +const char MSG_FREE_MEMORY_CZ[] PROGMEM = " Free Memory: "; +const char MSG_FREE_MEMORY_IT[] PROGMEM = " Free Memory: "; +const char MSG_FREE_MEMORY_ES[] PROGMEM = " Free Memory: "; +const char MSG_FREE_MEMORY_PL[] PROGMEM = " Free Memory: "; +const char * const MSG_FREE_MEMORY_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FREE_MEMORY_EN, + MSG_FREE_MEMORY_CZ, + MSG_FREE_MEMORY_IT, + MSG_FREE_MEMORY_ES, + MSG_FREE_MEMORY_PL +}; + +const char MSG_HEATING_EN[] PROGMEM = "Heating"; +const char MSG_HEATING_CZ[] PROGMEM = "Zahrivani"; +const char MSG_HEATING_IT[] PROGMEM = "Riscaldamento..."; +const char MSG_HEATING_ES[] PROGMEM = "Calentando..."; +const char MSG_HEATING_PL[] PROGMEM = "Grzanie..."; +const char * const MSG_HEATING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HEATING_EN, + MSG_HEATING_CZ, + MSG_HEATING_IT, + MSG_HEATING_ES, + MSG_HEATING_PL +}; + +const char MSG_HEATING_COMPLETE_EN[] PROGMEM = "Heating done."; +const char MSG_HEATING_COMPLETE_CZ[] PROGMEM = "Zahrivani OK."; +const char MSG_HEATING_COMPLETE_IT[] PROGMEM = "Riscaldamento fatto."; +const char MSG_HEATING_COMPLETE_ES[] PROGMEM = "Calentando listo."; +const char MSG_HEATING_COMPLETE_PL[] PROGMEM = "Grzanie OK."; +const char * const MSG_HEATING_COMPLETE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HEATING_COMPLETE_EN, + MSG_HEATING_COMPLETE_CZ, + MSG_HEATING_COMPLETE_IT, + MSG_HEATING_COMPLETE_ES, + MSG_HEATING_COMPLETE_PL +}; + +const char MSG_HOMEYZ_EN[] PROGMEM = "Calibrate Z"; +const char MSG_HOMEYZ_CZ[] PROGMEM = "Kalibrovat Z"; +const char MSG_HOMEYZ_IT[] PROGMEM = "Calibra Z"; +const char MSG_HOMEYZ_ES[] PROGMEM = "Calibrar Z"; +const char MSG_HOMEYZ_PL[] PROGMEM = "Kalibruj Z"; +const char * const MSG_HOMEYZ_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HOMEYZ_EN, + MSG_HOMEYZ_CZ, + MSG_HOMEYZ_IT, + MSG_HOMEYZ_ES, + MSG_HOMEYZ_PL +}; + +const char MSG_HOMEYZ_DONE_EN[] PROGMEM = "Calibration done"; +const char MSG_HOMEYZ_DONE_CZ[] PROGMEM = "Kalibrace OK"; +const char MSG_HOMEYZ_DONE_IT[] PROGMEM = "Calibratura OK"; +const char MSG_HOMEYZ_DONE_ES[] PROGMEM = "Calibraci\xF3n OK"; +const char MSG_HOMEYZ_DONE_PL[] PROGMEM = "Kalibracja OK"; +const char * const MSG_HOMEYZ_DONE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HOMEYZ_DONE_EN, + MSG_HOMEYZ_DONE_CZ, + MSG_HOMEYZ_DONE_IT, + MSG_HOMEYZ_DONE_ES, + MSG_HOMEYZ_DONE_PL +}; + +const char MSG_HOMEYZ_PROGRESS_EN[] PROGMEM = "Calibrating Z"; +const char MSG_HOMEYZ_PROGRESS_CZ[] PROGMEM = "Kalibruji Z"; +const char MSG_HOMEYZ_PROGRESS_IT[] PROGMEM = "Calibrando Z"; +const char MSG_HOMEYZ_PROGRESS_ES[] PROGMEM = "Calibrando Z"; +const char MSG_HOMEYZ_PROGRESS_PL[] PROGMEM = "Kalibruje Z"; +const char * const MSG_HOMEYZ_PROGRESS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HOMEYZ_PROGRESS_EN, + MSG_HOMEYZ_PROGRESS_CZ, + MSG_HOMEYZ_PROGRESS_IT, + MSG_HOMEYZ_PROGRESS_ES, + MSG_HOMEYZ_PROGRESS_PL +}; + +const char MSG_HOTEND_OFFSET_EN[] PROGMEM = "Hotend offsets:"; +const char MSG_HOTEND_OFFSET_CZ[] PROGMEM = "Hotend offsets:"; +const char MSG_HOTEND_OFFSET_IT[] PROGMEM = "Hotend offsets:"; +const char MSG_HOTEND_OFFSET_ES[] PROGMEM = "Hotend offsets:"; +const char MSG_HOTEND_OFFSET_PL[] PROGMEM = "Hotend offsets:"; +const char * const MSG_HOTEND_OFFSET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_HOTEND_OFFSET_EN, + MSG_HOTEND_OFFSET_CZ, + MSG_HOTEND_OFFSET_IT, + MSG_HOTEND_OFFSET_ES, + MSG_HOTEND_OFFSET_PL +}; + +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Improving calibration"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Improving calibration"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Improving calibration"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Improving calibration"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Improving calibration"; +const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_IT, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL +}; + +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = "point "; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = "point "; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = "point "; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = "point "; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = "point "; +const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_IT, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL +}; + +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN[] PROGMEM = "of 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_CZ[] PROGMEM = "of 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_IT[] PROGMEM = "of 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_ES[] PROGMEM = "of 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_PL[] PROGMEM = "of 9"; +const char * const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_EN, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_CZ, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_IT, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_ES, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_PL +}; + +const char MSG_INIT_SDCARD_EN[] PROGMEM = "Init. SD card"; +const char MSG_INIT_SDCARD_CZ[] PROGMEM = "Inic. SD"; +const char MSG_INIT_SDCARD_IT[] PROGMEM = "Init. SD card"; +const char MSG_INIT_SDCARD_ES[] PROGMEM = "Init. SD card"; +const char MSG_INIT_SDCARD_PL[] PROGMEM = "Inic. SD"; +const char * const MSG_INIT_SDCARD_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_INIT_SDCARD_EN, + MSG_INIT_SDCARD_CZ, + MSG_INIT_SDCARD_IT, + MSG_INIT_SDCARD_ES, + MSG_INIT_SDCARD_PL +}; + +const char MSG_INSERT_FILAMENT_EN[] PROGMEM = "Insert filament"; +const char MSG_INSERT_FILAMENT_CZ[] PROGMEM = "Vlozte filament"; +const char MSG_INSERT_FILAMENT_IT[] PROGMEM = "Inserire filamento"; +const char MSG_INSERT_FILAMENT_ES[] PROGMEM = "Inserta filamento"; +const char MSG_INSERT_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; +const char * const MSG_INSERT_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_INSERT_FILAMENT_EN, + MSG_INSERT_FILAMENT_CZ, + MSG_INSERT_FILAMENT_IT, + MSG_INSERT_FILAMENT_ES, + MSG_INSERT_FILAMENT_PL +}; + +const char MSG_INVALID_EXTRUDER_EN[] PROGMEM = "Invalid extruder"; +const char MSG_INVALID_EXTRUDER_CZ[] PROGMEM = "Invalid extruder"; +const char MSG_INVALID_EXTRUDER_IT[] PROGMEM = "Invalid extruder"; +const char MSG_INVALID_EXTRUDER_ES[] PROGMEM = "Invalid extruder"; +const char MSG_INVALID_EXTRUDER_PL[] PROGMEM = "Invalid extruder"; +const char * const MSG_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_INVALID_EXTRUDER_EN, + MSG_INVALID_EXTRUDER_CZ, + MSG_INVALID_EXTRUDER_IT, + MSG_INVALID_EXTRUDER_ES, + MSG_INVALID_EXTRUDER_PL +}; + +const char MSG_KILLED_EN[] PROGMEM = "KILLED. "; +const char MSG_KILLED_CZ[] PROGMEM = "KILLED. "; +const char MSG_KILLED_IT[] PROGMEM = "UCCISO "; +const char MSG_KILLED_ES[] PROGMEM = "PARADA DE EMERG."; +const char MSG_KILLED_PL[] PROGMEM = "KILLED. "; +const char * const MSG_KILLED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_KILLED_EN, + MSG_KILLED_CZ, + MSG_KILLED_IT, + MSG_KILLED_ES, + MSG_KILLED_PL +}; + +const char MSG_LANGUAGE_NAME_EN[] PROGMEM = "English"; +const char MSG_LANGUAGE_NAME_CZ[] PROGMEM = "Cestina"; +const char MSG_LANGUAGE_NAME_IT[] PROGMEM = "Italiano"; +const char MSG_LANGUAGE_NAME_ES[] PROGMEM = "Espanol"; +const char MSG_LANGUAGE_NAME_PL[] PROGMEM = "Polski"; +const char * const MSG_LANGUAGE_NAME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LANGUAGE_NAME_EN, + MSG_LANGUAGE_NAME_CZ, + MSG_LANGUAGE_NAME_IT, + MSG_LANGUAGE_NAME_ES, + MSG_LANGUAGE_NAME_PL +}; + +const char MSG_LANGUAGE_SELECT_EN[] PROGMEM = "Select language "; +const char MSG_LANGUAGE_SELECT_CZ[] PROGMEM = "Vyber jazyka "; +const char MSG_LANGUAGE_SELECT_IT[] PROGMEM = "Selez. la lingua"; +const char MSG_LANGUAGE_SELECT_ES[] PROGMEM = "Cambia la lengua "; +const char MSG_LANGUAGE_SELECT_PL[] PROGMEM = "Wybor jezyka "; +const char * const MSG_LANGUAGE_SELECT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LANGUAGE_SELECT_EN, + MSG_LANGUAGE_SELECT_CZ, + MSG_LANGUAGE_SELECT_IT, + MSG_LANGUAGE_SELECT_ES, + MSG_LANGUAGE_SELECT_PL +}; + +const char MSG_LOADING_COLOR_EN[] PROGMEM = "Loading color"; +const char MSG_LOADING_COLOR_CZ[] PROGMEM = "Cisteni barvy"; +const char MSG_LOADING_COLOR_IT[] PROGMEM = "Cargando color"; +const char MSG_LOADING_COLOR_ES[] PROGMEM = "Cargando color"; +const char MSG_LOADING_COLOR_PL[] PROGMEM = "Czyszcz. koloru"; +const char * const MSG_LOADING_COLOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOADING_COLOR_EN, + MSG_LOADING_COLOR_CZ, + MSG_LOADING_COLOR_IT, + MSG_LOADING_COLOR_ES, + MSG_LOADING_COLOR_PL +}; + +const char MSG_LOADING_FILAMENT_EN[] PROGMEM = "Loading filament"; +const char MSG_LOADING_FILAMENT_CZ[] PROGMEM = "Zavadeni filamentu"; +const char MSG_LOADING_FILAMENT_IT[] PROGMEM = "Cargando fil."; +const char MSG_LOADING_FILAMENT_ES[] PROGMEM = "Cargando fil."; +const char MSG_LOADING_FILAMENT_PL[] PROGMEM = "Wprow. filamentu"; +const char * const MSG_LOADING_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOADING_FILAMENT_EN, + MSG_LOADING_FILAMENT_CZ, + MSG_LOADING_FILAMENT_IT, + MSG_LOADING_FILAMENT_ES, + MSG_LOADING_FILAMENT_PL +}; + +const char MSG_LOAD_EPROM_EN[] PROGMEM = "Load memory"; +const char MSG_LOAD_EPROM_CZ[] PROGMEM = "Ulozit pamet"; +const char MSG_LOAD_EPROM_IT[] PROGMEM = "Load memory"; +const char MSG_LOAD_EPROM_ES[] PROGMEM = "Load memory"; +const char MSG_LOAD_EPROM_PL[] PROGMEM = "Ulozit pamet"; +const char * const MSG_LOAD_EPROM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_EPROM_EN, + MSG_LOAD_EPROM_CZ, + MSG_LOAD_EPROM_IT, + MSG_LOAD_EPROM_ES, + MSG_LOAD_EPROM_PL +}; + +const char MSG_LOAD_FILAMENT_EN[] PROGMEM = "Load filament"; +const char MSG_LOAD_FILAMENT_CZ[] PROGMEM = "Zavest filament"; +const char MSG_LOAD_FILAMENT_IT[] PROGMEM = "Caricare filamento"; +const char MSG_LOAD_FILAMENT_ES[] PROGMEM = "Introducir filamento"; +const char MSG_LOAD_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; +const char * const MSG_LOAD_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_FILAMENT_EN, + MSG_LOAD_FILAMENT_CZ, + MSG_LOAD_FILAMENT_IT, + MSG_LOAD_FILAMENT_ES, + MSG_LOAD_FILAMENT_PL +}; + +const char MSG_M104_INVALID_EXTRUDER_EN[] PROGMEM = "M104 Invalid extruder "; +const char MSG_M104_INVALID_EXTRUDER_CZ[] PROGMEM = "M104 Invalid extruder "; +const char MSG_M104_INVALID_EXTRUDER_IT[] PROGMEM = "M104 Invalid extruder "; +const char MSG_M104_INVALID_EXTRUDER_ES[] PROGMEM = "M104 Invalid extruder "; +const char MSG_M104_INVALID_EXTRUDER_PL[] PROGMEM = "M104 Invalid extruder "; +const char * const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M104_INVALID_EXTRUDER_EN, + MSG_M104_INVALID_EXTRUDER_CZ, + MSG_M104_INVALID_EXTRUDER_IT, + MSG_M104_INVALID_EXTRUDER_ES, + MSG_M104_INVALID_EXTRUDER_PL +}; + +const char MSG_M105_INVALID_EXTRUDER_EN[] PROGMEM = "M105 Invalid extruder "; +const char MSG_M105_INVALID_EXTRUDER_CZ[] PROGMEM = "M105 Invalid extruder "; +const char MSG_M105_INVALID_EXTRUDER_IT[] PROGMEM = "M105 Invalid extruder "; +const char MSG_M105_INVALID_EXTRUDER_ES[] PROGMEM = "M105 Invalid extruder "; +const char MSG_M105_INVALID_EXTRUDER_PL[] PROGMEM = "M105 Invalid extruder "; +const char * const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M105_INVALID_EXTRUDER_EN, + MSG_M105_INVALID_EXTRUDER_CZ, + MSG_M105_INVALID_EXTRUDER_IT, + MSG_M105_INVALID_EXTRUDER_ES, + MSG_M105_INVALID_EXTRUDER_PL +}; + +const char MSG_M109_INVALID_EXTRUDER_EN[] PROGMEM = "M109 Invalid extruder "; +const char MSG_M109_INVALID_EXTRUDER_CZ[] PROGMEM = "M109 Invalid extruder "; +const char MSG_M109_INVALID_EXTRUDER_IT[] PROGMEM = "M109 Invalid extruder "; +const char MSG_M109_INVALID_EXTRUDER_ES[] PROGMEM = "M109 Invalid extruder "; +const char MSG_M109_INVALID_EXTRUDER_PL[] PROGMEM = "M109 Invalid extruder "; +const char * const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M109_INVALID_EXTRUDER_EN, + MSG_M109_INVALID_EXTRUDER_CZ, + MSG_M109_INVALID_EXTRUDER_IT, + MSG_M109_INVALID_EXTRUDER_ES, + MSG_M109_INVALID_EXTRUDER_PL +}; + +const char MSG_M115_REPORT_EN[] PROGMEM = "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n"; +const char MSG_M115_REPORT_CZ[] PROGMEM = "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n"; +const char MSG_M115_REPORT_IT[] PROGMEM = "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n"; +const char MSG_M115_REPORT_ES[] PROGMEM = "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n"; +const char MSG_M115_REPORT_PL[] PROGMEM = "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:https://github.com/prusa3d/Prusa-i3-Plus/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:1 UUID:00000000-0000-0000-0000-000000000000\n"; +const char * const MSG_M115_REPORT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M115_REPORT_EN, + MSG_M115_REPORT_CZ, + MSG_M115_REPORT_IT, + MSG_M115_REPORT_ES, + MSG_M115_REPORT_PL +}; + +const char MSG_M119_REPORT_EN[] PROGMEM = "Reporting endstop status"; +const char MSG_M119_REPORT_CZ[] PROGMEM = "Reporting endstop status"; +const char MSG_M119_REPORT_IT[] PROGMEM = "Reporting endstop status"; +const char MSG_M119_REPORT_ES[] PROGMEM = "Reporting endstop status"; +const char MSG_M119_REPORT_PL[] PROGMEM = "Reporting endstop status"; +const char * const MSG_M119_REPORT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M119_REPORT_EN, + MSG_M119_REPORT_CZ, + MSG_M119_REPORT_IT, + MSG_M119_REPORT_ES, + MSG_M119_REPORT_PL +}; + +const char MSG_M200_INVALID_EXTRUDER_EN[] PROGMEM = "M200 Invalid extruder "; +const char MSG_M200_INVALID_EXTRUDER_CZ[] PROGMEM = "M200 Invalid extruder "; +const char MSG_M200_INVALID_EXTRUDER_IT[] PROGMEM = "M200 Invalid extruder "; +const char MSG_M200_INVALID_EXTRUDER_ES[] PROGMEM = "M200 Invalid extruder "; +const char MSG_M200_INVALID_EXTRUDER_PL[] PROGMEM = "M200 Invalid extruder "; +const char * const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M200_INVALID_EXTRUDER_EN, + MSG_M200_INVALID_EXTRUDER_CZ, + MSG_M200_INVALID_EXTRUDER_IT, + MSG_M200_INVALID_EXTRUDER_ES, + MSG_M200_INVALID_EXTRUDER_PL +}; + +const char MSG_M218_INVALID_EXTRUDER_EN[] PROGMEM = "M218 Invalid extruder "; +const char MSG_M218_INVALID_EXTRUDER_CZ[] PROGMEM = "M218 Invalid extruder "; +const char MSG_M218_INVALID_EXTRUDER_IT[] PROGMEM = "M218 Invalid extruder "; +const char MSG_M218_INVALID_EXTRUDER_ES[] PROGMEM = "M218 Invalid extruder "; +const char MSG_M218_INVALID_EXTRUDER_PL[] PROGMEM = "M218 Invalid extruder "; +const char * const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M218_INVALID_EXTRUDER_EN, + MSG_M218_INVALID_EXTRUDER_CZ, + MSG_M218_INVALID_EXTRUDER_IT, + MSG_M218_INVALID_EXTRUDER_ES, + MSG_M218_INVALID_EXTRUDER_PL +}; + +const char MSG_M221_INVALID_EXTRUDER_EN[] PROGMEM = "M221 Invalid extruder "; +const char MSG_M221_INVALID_EXTRUDER_CZ[] PROGMEM = "M221 Invalid extruder "; +const char MSG_M221_INVALID_EXTRUDER_IT[] PROGMEM = "M221 Invalid extruder "; +const char MSG_M221_INVALID_EXTRUDER_ES[] PROGMEM = "M221 Invalid extruder "; +const char MSG_M221_INVALID_EXTRUDER_PL[] PROGMEM = "M221 Invalid extruder "; +const char * const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_M221_INVALID_EXTRUDER_EN, + MSG_M221_INVALID_EXTRUDER_CZ, + MSG_M221_INVALID_EXTRUDER_IT, + MSG_M221_INVALID_EXTRUDER_ES, + MSG_M221_INVALID_EXTRUDER_PL +}; + +const char MSG_MAIN_EN[] PROGMEM = "Main"; +const char MSG_MAIN_CZ[] PROGMEM = "Hlavni nabidka"; +const char MSG_MAIN_IT[] PROGMEM = "Menu principale"; +const char MSG_MAIN_ES[] PROGMEM = "Menu principal"; +const char MSG_MAIN_PL[] PROGMEM = "Menu glowne"; +const char * const MSG_MAIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MAIN_EN, + MSG_MAIN_CZ, + MSG_MAIN_IT, + MSG_MAIN_ES, + MSG_MAIN_PL +}; + +const char MSG_MAX_EN[] PROGMEM = " \002 Max"; +const char MSG_MAX_CZ[] PROGMEM = " \002 Max"; +const char MSG_MAX_IT[] PROGMEM = " \002 Max"; +const char MSG_MAX_ES[] PROGMEM = " \002 Max"; +const char MSG_MAX_PL[] PROGMEM = " \002 Max"; +const char * const MSG_MAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MAX_EN, + MSG_MAX_CZ, + MSG_MAX_IT, + MSG_MAX_ES, + MSG_MAX_PL +}; + +const char MSG_MIN_EN[] PROGMEM = " \002 Min"; +const char MSG_MIN_CZ[] PROGMEM = " \002 Min"; +const char MSG_MIN_IT[] PROGMEM = " \002 Min"; +const char MSG_MIN_ES[] PROGMEM = " \002 Min"; +const char MSG_MIN_PL[] PROGMEM = " \002 Min"; +const char * const MSG_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MIN_EN, + MSG_MIN_CZ, + MSG_MIN_IT, + MSG_MIN_ES, + MSG_MIN_PL +}; + +const char MSG_MOTION_EN[] PROGMEM = "Motion"; +const char MSG_MOTION_CZ[] PROGMEM = "Pohyb"; +const char MSG_MOTION_IT[] PROGMEM = "Motion"; +const char MSG_MOTION_ES[] PROGMEM = "Motion"; +const char MSG_MOTION_PL[] PROGMEM = "Pohyb"; +const char * const MSG_MOTION_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOTION_EN, + MSG_MOTION_CZ, + MSG_MOTION_IT, + MSG_MOTION_ES, + MSG_MOTION_PL +}; + +const char MSG_MOVE_01MM_EN[] PROGMEM = "Move 0.1mm"; +const char MSG_MOVE_01MM_CZ[] PROGMEM = "Posunout o 0.1mm"; +const char MSG_MOVE_01MM_IT[] PROGMEM = "Move 0.1mm"; +const char MSG_MOVE_01MM_ES[] PROGMEM = "Move 0.1mm"; +const char MSG_MOVE_01MM_PL[] PROGMEM = "Posunout o 0.1mm"; +const char * const MSG_MOVE_01MM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_01MM_EN, + MSG_MOVE_01MM_CZ, + MSG_MOVE_01MM_IT, + MSG_MOVE_01MM_ES, + MSG_MOVE_01MM_PL +}; + +const char MSG_MOVE_10MM_EN[] PROGMEM = "Move 10mm"; +const char MSG_MOVE_10MM_CZ[] PROGMEM = "Posunout o 10mm"; +const char MSG_MOVE_10MM_IT[] PROGMEM = "Move 10mm"; +const char MSG_MOVE_10MM_ES[] PROGMEM = "Move 10mm"; +const char MSG_MOVE_10MM_PL[] PROGMEM = "Posunout o 10mm"; +const char * const MSG_MOVE_10MM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_10MM_EN, + MSG_MOVE_10MM_CZ, + MSG_MOVE_10MM_IT, + MSG_MOVE_10MM_ES, + MSG_MOVE_10MM_PL +}; + +const char MSG_MOVE_1MM_EN[] PROGMEM = "Move 1mm"; +const char MSG_MOVE_1MM_CZ[] PROGMEM = "Posunout o 1mm"; +const char MSG_MOVE_1MM_IT[] PROGMEM = "Move 1mm"; +const char MSG_MOVE_1MM_ES[] PROGMEM = "Move 1mm"; +const char MSG_MOVE_1MM_PL[] PROGMEM = "Posunout o 1mm"; +const char * const MSG_MOVE_1MM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_1MM_EN, + MSG_MOVE_1MM_CZ, + MSG_MOVE_1MM_IT, + MSG_MOVE_1MM_ES, + MSG_MOVE_1MM_PL +}; + +const char MSG_MOVE_AXIS_EN[] PROGMEM = "Move axis"; +const char MSG_MOVE_AXIS_CZ[] PROGMEM = "Posunout osu"; +const char MSG_MOVE_AXIS_IT[] PROGMEM = "Muovi Asse"; +const char MSG_MOVE_AXIS_ES[] PROGMEM = "Mover ejes"; +const char MSG_MOVE_AXIS_PL[] PROGMEM = "Ruch osi"; +const char * const MSG_MOVE_AXIS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_AXIS_EN, + MSG_MOVE_AXIS_CZ, + MSG_MOVE_AXIS_IT, + MSG_MOVE_AXIS_ES, + MSG_MOVE_AXIS_PL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_EN[] PROGMEM = "Calibrating the machine."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_CZ[] PROGMEM = "Calibrating the machine."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_IT[] PROGMEM = "Calibrating the machine."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_ES[] PROGMEM = "Calibrating the machine."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_PL[] PROGMEM = "Calibrating the machine."; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_PL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_EN[] PROGMEM = "Please move the Z carriage up"; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_CZ[] PROGMEM = "Please move the Z carriage up"; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_IT[] PROGMEM = "Please move the Z carriage up"; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_ES[] PROGMEM = "Please move the Z carriage up"; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_PL[] PROGMEM = "Please move the Z carriage up"; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_PL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_EN[] PROGMEM = "to the end stoppers."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_CZ[] PROGMEM = "to the end stoppers."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_IT[] PROGMEM = "to the end stoppers."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_ES[] PROGMEM = "to the end stoppers."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_PL[] PROGMEM = "to the end stoppers."; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_PL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_EN[] PROGMEM = "Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_CZ[] PROGMEM = "Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_IT[] PROGMEM = "Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_ES[] PROGMEM = "Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_PL[] PROGMEM = "Click when done."; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_PL +}; + +const char MSG_MOVE_E_EN[] PROGMEM = "Extruder"; +const char MSG_MOVE_E_CZ[] PROGMEM = "Extruder"; +const char MSG_MOVE_E_IT[] PROGMEM = "Estrusore"; +const char MSG_MOVE_E_ES[] PROGMEM = "Extrusor"; +const char MSG_MOVE_E_PL[] PROGMEM = "Extruder"; +const char * const MSG_MOVE_E_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_E_EN, + MSG_MOVE_E_CZ, + MSG_MOVE_E_IT, + MSG_MOVE_E_ES, + MSG_MOVE_E_PL +}; + +const char MSG_MOVE_E1_EN[] PROGMEM = "Extruder2"; +const char MSG_MOVE_E1_CZ[] PROGMEM = "Extruder2"; +const char MSG_MOVE_E1_IT[] PROGMEM = "Extruder2"; +const char MSG_MOVE_E1_ES[] PROGMEM = "Extruder2"; +const char MSG_MOVE_E1_PL[] PROGMEM = "Extruder2"; +const char * const MSG_MOVE_E1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_E1_EN, + MSG_MOVE_E1_CZ, + MSG_MOVE_E1_IT, + MSG_MOVE_E1_ES, + MSG_MOVE_E1_PL +}; + +const char MSG_MOVE_E2_EN[] PROGMEM = "Extruder3"; +const char MSG_MOVE_E2_CZ[] PROGMEM = "Extruder3"; +const char MSG_MOVE_E2_IT[] PROGMEM = "Extruder3"; +const char MSG_MOVE_E2_ES[] PROGMEM = "Extruder3"; +const char MSG_MOVE_E2_PL[] PROGMEM = "Extruder3"; +const char * const MSG_MOVE_E2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_E2_EN, + MSG_MOVE_E2_CZ, + MSG_MOVE_E2_IT, + MSG_MOVE_E2_ES, + MSG_MOVE_E2_PL +}; + +const char MSG_MOVE_X_EN[] PROGMEM = "Move X"; +const char MSG_MOVE_X_CZ[] PROGMEM = "Posunout X"; +const char MSG_MOVE_X_IT[] PROGMEM = "Muovi X"; +const char MSG_MOVE_X_ES[] PROGMEM = "Mover X"; +const char MSG_MOVE_X_PL[] PROGMEM = "Przesunac X"; +const char * const MSG_MOVE_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_X_EN, + MSG_MOVE_X_CZ, + MSG_MOVE_X_IT, + MSG_MOVE_X_ES, + MSG_MOVE_X_PL +}; + +const char MSG_MOVE_Y_EN[] PROGMEM = "Move Y"; +const char MSG_MOVE_Y_CZ[] PROGMEM = "Posunout Y"; +const char MSG_MOVE_Y_IT[] PROGMEM = "Muovi Y"; +const char MSG_MOVE_Y_ES[] PROGMEM = "Mover Y"; +const char MSG_MOVE_Y_PL[] PROGMEM = "Przesunac Y"; +const char * const MSG_MOVE_Y_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_Y_EN, + MSG_MOVE_Y_CZ, + MSG_MOVE_Y_IT, + MSG_MOVE_Y_ES, + MSG_MOVE_Y_PL +}; + +const char MSG_MOVE_Z_EN[] PROGMEM = "Move Z"; +const char MSG_MOVE_Z_CZ[] PROGMEM = "Posunout Z"; +const char MSG_MOVE_Z_IT[] PROGMEM = "Muovi Z"; +const char MSG_MOVE_Z_ES[] PROGMEM = "Mover Z"; +const char MSG_MOVE_Z_PL[] PROGMEM = "Przesunac Z"; +const char * const MSG_MOVE_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_Z_EN, + MSG_MOVE_Z_CZ, + MSG_MOVE_Z_IT, + MSG_MOVE_Z_ES, + MSG_MOVE_Z_PL +}; + +const char MSG_NO_EN[] PROGMEM = "No"; +const char MSG_NO_CZ[] PROGMEM = "Ne"; +const char MSG_NO_IT[] PROGMEM = "No"; +const char MSG_NO_ES[] PROGMEM = "No"; +const char MSG_NO_PL[] PROGMEM = "Nie"; +const char * const MSG_NO_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NO_EN, + MSG_NO_CZ, + MSG_NO_IT, + MSG_NO_ES, + MSG_NO_PL +}; + +const char MSG_NOT_COLOR_EN[] PROGMEM = "Color not clear"; +const char MSG_NOT_COLOR_CZ[] PROGMEM = "Barva neni cista"; +const char MSG_NOT_COLOR_IT[] PROGMEM = "Color no claro"; +const char MSG_NOT_COLOR_ES[] PROGMEM = "Color no claro"; +const char MSG_NOT_COLOR_PL[] PROGMEM = "Kolor zanieczysz."; +const char * const MSG_NOT_COLOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NOT_COLOR_EN, + MSG_NOT_COLOR_CZ, + MSG_NOT_COLOR_IT, + MSG_NOT_COLOR_ES, + MSG_NOT_COLOR_PL +}; + +const char MSG_NOT_LOADED_EN[] PROGMEM = "Filament not loaded"; +const char MSG_NOT_LOADED_CZ[] PROGMEM = "Filament nezaveden"; +const char MSG_NOT_LOADED_IT[] PROGMEM = "Fil. no cargado"; +const char MSG_NOT_LOADED_ES[] PROGMEM = "Fil. no cargado"; +const char MSG_NOT_LOADED_PL[] PROGMEM = "Brak filamentu"; +const char * const MSG_NOT_LOADED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NOT_LOADED_EN, + MSG_NOT_LOADED_CZ, + MSG_NOT_LOADED_IT, + MSG_NOT_LOADED_ES, + MSG_NOT_LOADED_PL +}; + +const char MSG_NOZZLE_EN[] PROGMEM = "Nozzle"; +const char MSG_NOZZLE_CZ[] PROGMEM = "Tryska"; +const char MSG_NOZZLE_IT[] PROGMEM = "Ugello"; +const char MSG_NOZZLE_ES[] PROGMEM = "Fusor"; +const char MSG_NOZZLE_PL[] PROGMEM = "Dysza"; +const char * const MSG_NOZZLE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NOZZLE_EN, + MSG_NOZZLE_CZ, + MSG_NOZZLE_IT, + MSG_NOZZLE_ES, + MSG_NOZZLE_PL +}; + +const char MSG_NOZZLE1_EN[] PROGMEM = "Nozzle2"; +const char MSG_NOZZLE1_CZ[] PROGMEM = "Tryska2"; +const char MSG_NOZZLE1_IT[] PROGMEM = "Nozzle2"; +const char MSG_NOZZLE1_ES[] PROGMEM = "Nozzle2"; +const char MSG_NOZZLE1_PL[] PROGMEM = "Tryska2"; +const char * const MSG_NOZZLE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NOZZLE1_EN, + MSG_NOZZLE1_CZ, + MSG_NOZZLE1_IT, + MSG_NOZZLE1_ES, + MSG_NOZZLE1_PL +}; + +const char MSG_NOZZLE2_EN[] PROGMEM = "Nozzle3"; +const char MSG_NOZZLE2_CZ[] PROGMEM = "Tryska3"; +const char MSG_NOZZLE2_IT[] PROGMEM = "Nozzle3"; +const char MSG_NOZZLE2_ES[] PROGMEM = "Nozzle3"; +const char MSG_NOZZLE2_PL[] PROGMEM = "Tryska3"; +const char * const MSG_NOZZLE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NOZZLE2_EN, + MSG_NOZZLE2_CZ, + MSG_NOZZLE2_IT, + MSG_NOZZLE2_ES, + MSG_NOZZLE2_PL +}; + +const char MSG_NO_CARD_EN[] PROGMEM = "No SD card"; +const char MSG_NO_CARD_CZ[] PROGMEM = "Zadna SD karta"; +const char MSG_NO_CARD_IT[] PROGMEM = "No SD Carta"; +const char MSG_NO_CARD_ES[] PROGMEM = "No hay tarjeta SD"; +const char MSG_NO_CARD_PL[] PROGMEM = "Brak karty SD"; +const char * const MSG_NO_CARD_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NO_CARD_EN, + MSG_NO_CARD_CZ, + MSG_NO_CARD_IT, + MSG_NO_CARD_ES, + MSG_NO_CARD_PL +}; + +const char MSG_NO_MOVE_EN[] PROGMEM = "No move."; +const char MSG_NO_MOVE_CZ[] PROGMEM = "No move."; +const char MSG_NO_MOVE_IT[] PROGMEM = "Nessun Movimento"; +const char MSG_NO_MOVE_ES[] PROGMEM = "Sin movimiento"; +const char MSG_NO_MOVE_PL[] PROGMEM = "No move."; +const char * const MSG_NO_MOVE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NO_MOVE_EN, + MSG_NO_MOVE_CZ, + MSG_NO_MOVE_IT, + MSG_NO_MOVE_ES, + MSG_NO_MOVE_PL +}; + +const char MSG_OFF_EN[] PROGMEM = "Off"; +const char MSG_OFF_CZ[] PROGMEM = "Off"; +const char MSG_OFF_IT[] PROGMEM = "Off"; +const char MSG_OFF_ES[] PROGMEM = "Off"; +const char MSG_OFF_PL[] PROGMEM = "Off"; +const char * const MSG_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_OFF_EN, + MSG_OFF_CZ, + MSG_OFF_IT, + MSG_OFF_ES, + MSG_OFF_PL +}; + +const char MSG_OK_EN[] PROGMEM = "ok"; +const char MSG_OK_CZ[] PROGMEM = "ok"; +const char MSG_OK_IT[] PROGMEM = "ok"; +const char MSG_OK_ES[] PROGMEM = "ok"; +const char MSG_OK_PL[] PROGMEM = "ok"; +const char * const MSG_OK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_OK_EN, + MSG_OK_CZ, + MSG_OK_IT, + MSG_OK_ES, + MSG_OK_PL +}; + +const char MSG_ON_EN[] PROGMEM = "On "; +const char MSG_ON_CZ[] PROGMEM = "On "; +const char MSG_ON_IT[] PROGMEM = "On "; +const char MSG_ON_ES[] PROGMEM = "On "; +const char MSG_ON_PL[] PROGMEM = "On "; +const char * const MSG_ON_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ON_EN, + MSG_ON_CZ, + MSG_ON_IT, + MSG_ON_ES, + MSG_ON_PL +}; + +const char MSG_PAUSE_PRINT_EN[] PROGMEM = "Pause print"; +const char MSG_PAUSE_PRINT_CZ[] PROGMEM = "Pozastavit tisk"; +const char MSG_PAUSE_PRINT_IT[] PROGMEM = "Pausa"; +const char MSG_PAUSE_PRINT_ES[] PROGMEM = "Pausar impresion"; +const char MSG_PAUSE_PRINT_PL[] PROGMEM = "Przerwac druk"; +const char * const MSG_PAUSE_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PAUSE_PRINT_EN, + MSG_PAUSE_PRINT_CZ, + MSG_PAUSE_PRINT_IT, + MSG_PAUSE_PRINT_ES, + MSG_PAUSE_PRINT_PL +}; + +const char MSG_PICK_Z_EN[] PROGMEM = "Pick print"; +const char MSG_PICK_Z_CZ[] PROGMEM = "Vyberte vytisk"; +const char MSG_PICK_Z_IT[] PROGMEM = "Vyberte vytisk"; +const char MSG_PICK_Z_ES[] PROGMEM = "Vyberte vytisk"; +const char MSG_PICK_Z_PL[] PROGMEM = "Vyberte vytisk"; +const char * const MSG_PICK_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PICK_Z_EN, + MSG_PICK_Z_CZ, + MSG_PICK_Z_IT, + MSG_PICK_Z_ES, + MSG_PICK_Z_PL +}; + +const char MSG_PID_C_EN[] PROGMEM = "PID-C"; +const char MSG_PID_C_CZ[] PROGMEM = "PID-C"; +const char MSG_PID_C_IT[] PROGMEM = "PID-C"; +const char MSG_PID_C_ES[] PROGMEM = "PID-C"; +const char MSG_PID_C_PL[] PROGMEM = "PID-C"; +const char * const MSG_PID_C_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_C_EN, + MSG_PID_C_CZ, + MSG_PID_C_IT, + MSG_PID_C_ES, + MSG_PID_C_PL +}; + +const char MSG_PID_D_EN[] PROGMEM = "PID-D"; +const char MSG_PID_D_CZ[] PROGMEM = "PID-D"; +const char MSG_PID_D_IT[] PROGMEM = "PID-D"; +const char MSG_PID_D_ES[] PROGMEM = "PID-D"; +const char MSG_PID_D_PL[] PROGMEM = "PID-D"; +const char * const MSG_PID_D_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_D_EN, + MSG_PID_D_CZ, + MSG_PID_D_IT, + MSG_PID_D_ES, + MSG_PID_D_PL +}; + +const char MSG_PID_I_EN[] PROGMEM = "PID-I"; +const char MSG_PID_I_CZ[] PROGMEM = "PID-I"; +const char MSG_PID_I_IT[] PROGMEM = "PID-I"; +const char MSG_PID_I_ES[] PROGMEM = "PID-I"; +const char MSG_PID_I_PL[] PROGMEM = "PID-I"; +const char * const MSG_PID_I_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_I_EN, + MSG_PID_I_CZ, + MSG_PID_I_IT, + MSG_PID_I_ES, + MSG_PID_I_PL +}; + +const char MSG_PID_P_EN[] PROGMEM = "PID-P"; +const char MSG_PID_P_CZ[] PROGMEM = "PID-P"; +const char MSG_PID_P_IT[] PROGMEM = "PID-P"; +const char MSG_PID_P_ES[] PROGMEM = "PID-P"; +const char MSG_PID_P_PL[] PROGMEM = "PID-P"; +const char * const MSG_PID_P_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_P_EN, + MSG_PID_P_CZ, + MSG_PID_P_IT, + MSG_PID_P_ES, + MSG_PID_P_PL +}; + +const char MSG_PLANNER_BUFFER_BYTES_EN[] PROGMEM = " PlannerBufferBytes: "; +const char MSG_PLANNER_BUFFER_BYTES_CZ[] PROGMEM = " PlannerBufferBytes: "; +const char MSG_PLANNER_BUFFER_BYTES_IT[] PROGMEM = " PlannerBufferBytes: "; +const char MSG_PLANNER_BUFFER_BYTES_ES[] PROGMEM = " PlannerBufferBytes: "; +const char MSG_PLANNER_BUFFER_BYTES_PL[] PROGMEM = " PlannerBufferBytes: "; +const char * const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PLANNER_BUFFER_BYTES_EN, + MSG_PLANNER_BUFFER_BYTES_CZ, + MSG_PLANNER_BUFFER_BYTES_IT, + MSG_PLANNER_BUFFER_BYTES_ES, + MSG_PLANNER_BUFFER_BYTES_PL +}; + +const char MSG_PLEASE_WAIT_EN[] PROGMEM = "Please wait"; +const char MSG_PLEASE_WAIT_CZ[] PROGMEM = "Prosim cekejte"; +const char MSG_PLEASE_WAIT_IT[] PROGMEM = "Aspetta"; +const char MSG_PLEASE_WAIT_ES[] PROGMEM = "Espera"; +const char MSG_PLEASE_WAIT_PL[] PROGMEM = "Prosze czekac"; +const char * const MSG_PLEASE_WAIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PLEASE_WAIT_EN, + MSG_PLEASE_WAIT_CZ, + MSG_PLEASE_WAIT_IT, + MSG_PLEASE_WAIT_ES, + MSG_PLEASE_WAIT_PL +}; + +const char MSG_POSITION_UNKNOWN_EN[] PROGMEM = "Home X/Y before Z"; +const char MSG_POSITION_UNKNOWN_CZ[] PROGMEM = "Home X/Y before Z"; +const char MSG_POSITION_UNKNOWN_IT[] PROGMEM = "Home X/Y before Z"; +const char MSG_POSITION_UNKNOWN_ES[] PROGMEM = "Home X/Y before Z"; +const char MSG_POSITION_UNKNOWN_PL[] PROGMEM = "Home X/Y before Z"; +const char * const MSG_POSITION_UNKNOWN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_POSITION_UNKNOWN_EN, + MSG_POSITION_UNKNOWN_CZ, + MSG_POSITION_UNKNOWN_IT, + MSG_POSITION_UNKNOWN_ES, + MSG_POSITION_UNKNOWN_PL +}; + +const char MSG_POWERUP_EN[] PROGMEM = "PowerUp"; +const char MSG_POWERUP_CZ[] PROGMEM = "PowerUp"; +const char MSG_POWERUP_IT[] PROGMEM = "PowerUp"; +const char MSG_POWERUP_ES[] PROGMEM = "PowerUp"; +const char MSG_POWERUP_PL[] PROGMEM = "PowerUp"; +const char * const MSG_POWERUP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_POWERUP_EN, + MSG_POWERUP_CZ, + MSG_POWERUP_IT, + MSG_POWERUP_ES, + MSG_POWERUP_PL +}; + +const char MSG_PREHEAT_EN[] PROGMEM = "Preheat"; +const char MSG_PREHEAT_CZ[] PROGMEM = "Predehrev"; +const char MSG_PREHEAT_IT[] PROGMEM = "Preriscalda"; +const char MSG_PREHEAT_ES[] PROGMEM = "Precalentar"; +const char MSG_PREHEAT_PL[] PROGMEM = "Grzanie"; +const char * const MSG_PREHEAT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_EN, + MSG_PREHEAT_CZ, + MSG_PREHEAT_IT, + MSG_PREHEAT_ES, + MSG_PREHEAT_PL +}; + +const char MSG_PREHEAT_ABS_EN[] PROGMEM = "Preheat ABS"; +const char MSG_PREHEAT_ABS_CZ[] PROGMEM = "Predehrev ABS"; +const char MSG_PREHEAT_ABS_IT[] PROGMEM = "Preheat ABS"; +const char MSG_PREHEAT_ABS_ES[] PROGMEM = "Preheat ABS"; +const char MSG_PREHEAT_ABS_PL[] PROGMEM = "Predehrev ABS"; +const char * const MSG_PREHEAT_ABS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS_EN, + MSG_PREHEAT_ABS_CZ, + MSG_PREHEAT_ABS_IT, + MSG_PREHEAT_ABS_ES, + MSG_PREHEAT_ABS_PL +}; + +const char MSG_PREHEAT_ABS0_EN[] PROGMEM = "Preheat ABS 1"; +const char MSG_PREHEAT_ABS0_CZ[] PROGMEM = "Predehrev ABS 1"; +const char MSG_PREHEAT_ABS0_IT[] PROGMEM = "Preheat ABS 1"; +const char MSG_PREHEAT_ABS0_ES[] PROGMEM = "Preheat ABS 1"; +const char MSG_PREHEAT_ABS0_PL[] PROGMEM = "Predehrev ABS 1"; +const char * const MSG_PREHEAT_ABS0_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS0_EN, + MSG_PREHEAT_ABS0_CZ, + MSG_PREHEAT_ABS0_IT, + MSG_PREHEAT_ABS0_ES, + MSG_PREHEAT_ABS0_PL +}; + +const char MSG_PREHEAT_ABS012_EN[] PROGMEM = "Preheat ABS All"; +const char MSG_PREHEAT_ABS012_CZ[] PROGMEM = "Predehrev ABS All"; +const char MSG_PREHEAT_ABS012_IT[] PROGMEM = "Preheat ABS All"; +const char MSG_PREHEAT_ABS012_ES[] PROGMEM = "Preheat ABS All"; +const char MSG_PREHEAT_ABS012_PL[] PROGMEM = "Predehrev ABS All"; +const char * const MSG_PREHEAT_ABS012_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS012_EN, + MSG_PREHEAT_ABS012_CZ, + MSG_PREHEAT_ABS012_IT, + MSG_PREHEAT_ABS012_ES, + MSG_PREHEAT_ABS012_PL +}; + +const char MSG_PREHEAT_ABS1_EN[] PROGMEM = "Preheat ABS 2"; +const char MSG_PREHEAT_ABS1_CZ[] PROGMEM = "Predehrev ABS 2"; +const char MSG_PREHEAT_ABS1_IT[] PROGMEM = "Preheat ABS 2"; +const char MSG_PREHEAT_ABS1_ES[] PROGMEM = "Preheat ABS 2"; +const char MSG_PREHEAT_ABS1_PL[] PROGMEM = "Predehrev ABS 2"; +const char * const MSG_PREHEAT_ABS1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS1_EN, + MSG_PREHEAT_ABS1_CZ, + MSG_PREHEAT_ABS1_IT, + MSG_PREHEAT_ABS1_ES, + MSG_PREHEAT_ABS1_PL +}; + +const char MSG_PREHEAT_ABS2_EN[] PROGMEM = "Preheat ABS 3"; +const char MSG_PREHEAT_ABS2_CZ[] PROGMEM = "Predehrev ABS 3"; +const char MSG_PREHEAT_ABS2_IT[] PROGMEM = "Preheat ABS 3"; +const char MSG_PREHEAT_ABS2_ES[] PROGMEM = "Preheat ABS 3"; +const char MSG_PREHEAT_ABS2_PL[] PROGMEM = "Predehrev ABS 3"; +const char * const MSG_PREHEAT_ABS2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS2_EN, + MSG_PREHEAT_ABS2_CZ, + MSG_PREHEAT_ABS2_IT, + MSG_PREHEAT_ABS2_ES, + MSG_PREHEAT_ABS2_PL +}; + +const char MSG_PREHEAT_ABS_BEDONLY_EN[] PROGMEM = "Preheat ABS Bed"; +const char MSG_PREHEAT_ABS_BEDONLY_CZ[] PROGMEM = "Predehrev ABS Bed"; +const char MSG_PREHEAT_ABS_BEDONLY_IT[] PROGMEM = "Preheat ABS Bed"; +const char MSG_PREHEAT_ABS_BEDONLY_ES[] PROGMEM = "Preheat ABS Bed"; +const char MSG_PREHEAT_ABS_BEDONLY_PL[] PROGMEM = "Predehrev ABS Bed"; +const char * const MSG_PREHEAT_ABS_BEDONLY_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS_BEDONLY_EN, + MSG_PREHEAT_ABS_BEDONLY_CZ, + MSG_PREHEAT_ABS_BEDONLY_IT, + MSG_PREHEAT_ABS_BEDONLY_ES, + MSG_PREHEAT_ABS_BEDONLY_PL +}; + +const char MSG_PREHEAT_ABS_SETTINGS_EN[] PROGMEM = "Preheat ABS conf"; +const char MSG_PREHEAT_ABS_SETTINGS_CZ[] PROGMEM = "Predehrev ABS conf"; +const char MSG_PREHEAT_ABS_SETTINGS_IT[] PROGMEM = "Preheat ABS conf"; +const char MSG_PREHEAT_ABS_SETTINGS_ES[] PROGMEM = "Preheat ABS conf"; +const char MSG_PREHEAT_ABS_SETTINGS_PL[] PROGMEM = "Predehrev ABS conf"; +const char * const MSG_PREHEAT_ABS_SETTINGS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_ABS_SETTINGS_EN, + MSG_PREHEAT_ABS_SETTINGS_CZ, + MSG_PREHEAT_ABS_SETTINGS_IT, + MSG_PREHEAT_ABS_SETTINGS_ES, + MSG_PREHEAT_ABS_SETTINGS_PL +}; + +const char MSG_PREHEAT_NOZZLE_EN[] PROGMEM = "Preheat the nozzle!"; +const char MSG_PREHEAT_NOZZLE_CZ[] PROGMEM = "Predehrejte trysku!"; +const char MSG_PREHEAT_NOZZLE_IT[] PROGMEM = "Preris. ugello!"; +const char MSG_PREHEAT_NOZZLE_ES[] PROGMEM = "Precal. extrusor!"; +const char MSG_PREHEAT_NOZZLE_PL[] PROGMEM = "Nagrzej dysze!"; +const char * const MSG_PREHEAT_NOZZLE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_NOZZLE_EN, + MSG_PREHEAT_NOZZLE_CZ, + MSG_PREHEAT_NOZZLE_IT, + MSG_PREHEAT_NOZZLE_ES, + MSG_PREHEAT_NOZZLE_PL +}; + +const char MSG_PREHEAT_PLA_EN[] PROGMEM = "Preheat PLA"; +const char MSG_PREHEAT_PLA_CZ[] PROGMEM = "Predehrev PLA"; +const char MSG_PREHEAT_PLA_IT[] PROGMEM = "Preheat PLA"; +const char MSG_PREHEAT_PLA_ES[] PROGMEM = "Preheat PLA"; +const char MSG_PREHEAT_PLA_PL[] PROGMEM = "Predehrev PLA"; +const char * const MSG_PREHEAT_PLA_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA_EN, + MSG_PREHEAT_PLA_CZ, + MSG_PREHEAT_PLA_IT, + MSG_PREHEAT_PLA_ES, + MSG_PREHEAT_PLA_PL +}; + +const char MSG_PREHEAT_PLA0_EN[] PROGMEM = "Preheat PLA 1"; +const char MSG_PREHEAT_PLA0_CZ[] PROGMEM = "Predehrev PLA 1"; +const char MSG_PREHEAT_PLA0_IT[] PROGMEM = "Preheat PLA 1"; +const char MSG_PREHEAT_PLA0_ES[] PROGMEM = "Preheat PLA 1"; +const char MSG_PREHEAT_PLA0_PL[] PROGMEM = "Predehrev PLA 1"; +const char * const MSG_PREHEAT_PLA0_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA0_EN, + MSG_PREHEAT_PLA0_CZ, + MSG_PREHEAT_PLA0_IT, + MSG_PREHEAT_PLA0_ES, + MSG_PREHEAT_PLA0_PL +}; + +const char MSG_PREHEAT_PLA012_EN[] PROGMEM = "Preheat PLA All"; +const char MSG_PREHEAT_PLA012_CZ[] PROGMEM = "Predehrev PLA All"; +const char MSG_PREHEAT_PLA012_IT[] PROGMEM = "Preheat PLA All"; +const char MSG_PREHEAT_PLA012_ES[] PROGMEM = "Preheat PLA All"; +const char MSG_PREHEAT_PLA012_PL[] PROGMEM = "Predehrev PLA All"; +const char * const MSG_PREHEAT_PLA012_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA012_EN, + MSG_PREHEAT_PLA012_CZ, + MSG_PREHEAT_PLA012_IT, + MSG_PREHEAT_PLA012_ES, + MSG_PREHEAT_PLA012_PL +}; + +const char MSG_PREHEAT_PLA1_EN[] PROGMEM = "Preheat PLA 2"; +const char MSG_PREHEAT_PLA1_CZ[] PROGMEM = "Predehrev PLA 2"; +const char MSG_PREHEAT_PLA1_IT[] PROGMEM = "Preheat PLA 2"; +const char MSG_PREHEAT_PLA1_ES[] PROGMEM = "Preheat PLA 2"; +const char MSG_PREHEAT_PLA1_PL[] PROGMEM = "Predehrev PLA 2"; +const char * const MSG_PREHEAT_PLA1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA1_EN, + MSG_PREHEAT_PLA1_CZ, + MSG_PREHEAT_PLA1_IT, + MSG_PREHEAT_PLA1_ES, + MSG_PREHEAT_PLA1_PL +}; + +const char MSG_PREHEAT_PLA2_EN[] PROGMEM = "Preheat PLA 3"; +const char MSG_PREHEAT_PLA2_CZ[] PROGMEM = "Predehrev PLA 3"; +const char MSG_PREHEAT_PLA2_IT[] PROGMEM = "Preheat PLA 3"; +const char MSG_PREHEAT_PLA2_ES[] PROGMEM = "Preheat PLA 3"; +const char MSG_PREHEAT_PLA2_PL[] PROGMEM = "Predehrev PLA 3"; +const char * const MSG_PREHEAT_PLA2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA2_EN, + MSG_PREHEAT_PLA2_CZ, + MSG_PREHEAT_PLA2_IT, + MSG_PREHEAT_PLA2_ES, + MSG_PREHEAT_PLA2_PL +}; + +const char MSG_PREHEAT_PLA_BEDONLY_EN[] PROGMEM = "Preheat PLA Bed"; +const char MSG_PREHEAT_PLA_BEDONLY_CZ[] PROGMEM = "Predehrev PLA Bed"; +const char MSG_PREHEAT_PLA_BEDONLY_IT[] PROGMEM = "Preheat PLA Bed"; +const char MSG_PREHEAT_PLA_BEDONLY_ES[] PROGMEM = "Preheat PLA Bed"; +const char MSG_PREHEAT_PLA_BEDONLY_PL[] PROGMEM = "Predehrev PLA Bed"; +const char * const MSG_PREHEAT_PLA_BEDONLY_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA_BEDONLY_EN, + MSG_PREHEAT_PLA_BEDONLY_CZ, + MSG_PREHEAT_PLA_BEDONLY_IT, + MSG_PREHEAT_PLA_BEDONLY_ES, + MSG_PREHEAT_PLA_BEDONLY_PL +}; + +const char MSG_PREHEAT_PLA_SETTINGS_EN[] PROGMEM = "Preheat PLA conf"; +const char MSG_PREHEAT_PLA_SETTINGS_CZ[] PROGMEM = "Predehrev PLA conf"; +const char MSG_PREHEAT_PLA_SETTINGS_IT[] PROGMEM = "Preheat PLA conf"; +const char MSG_PREHEAT_PLA_SETTINGS_ES[] PROGMEM = "Preheat PLA conf"; +const char MSG_PREHEAT_PLA_SETTINGS_PL[] PROGMEM = "Predehrev PLA conf"; +const char * const MSG_PREHEAT_PLA_SETTINGS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREHEAT_PLA_SETTINGS_EN, + MSG_PREHEAT_PLA_SETTINGS_CZ, + MSG_PREHEAT_PLA_SETTINGS_IT, + MSG_PREHEAT_PLA_SETTINGS_ES, + MSG_PREHEAT_PLA_SETTINGS_PL +}; + +const char MSG_PREPARE_EN[] PROGMEM = "Prepare"; +const char MSG_PREPARE_CZ[] PROGMEM = "Priprava"; +const char MSG_PREPARE_IT[] PROGMEM = "Prepare"; +const char MSG_PREPARE_ES[] PROGMEM = "Prepare"; +const char MSG_PREPARE_PL[] PROGMEM = "Priprava"; +const char * const MSG_PREPARE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREPARE_EN, + MSG_PREPARE_CZ, + MSG_PREPARE_IT, + MSG_PREPARE_ES, + MSG_PREPARE_PL +}; + +const char MSG_PRESS_EN[] PROGMEM = "And press the knob"; +const char MSG_PRESS_CZ[] PROGMEM = "A stisknete tlacitko"; +const char MSG_PRESS_IT[] PROGMEM = "Y pulse el mando"; +const char MSG_PRESS_ES[] PROGMEM = "Y pulse el mando"; +const char MSG_PRESS_PL[] PROGMEM = "Nacisnij przycisk"; +const char * const MSG_PRESS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRESS_EN, + MSG_PRESS_CZ, + MSG_PRESS_IT, + MSG_PRESS_ES, + MSG_PRESS_PL +}; + +const char MSG_PRINT_ABORTED_EN[] PROGMEM = "Print aborted"; +const char MSG_PRINT_ABORTED_CZ[] PROGMEM = "Tisk prerusen"; +const char MSG_PRINT_ABORTED_IT[] PROGMEM = "Stampa abortita"; +const char MSG_PRINT_ABORTED_ES[] PROGMEM = "Print aborted"; +const char MSG_PRINT_ABORTED_PL[] PROGMEM = "Druk przerwany"; +const char * const MSG_PRINT_ABORTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRINT_ABORTED_EN, + MSG_PRINT_ABORTED_CZ, + MSG_PRINT_ABORTED_IT, + MSG_PRINT_ABORTED_ES, + MSG_PRINT_ABORTED_PL +}; + +const char MSG_PRUSA3D_EN[] PROGMEM = "prusa3d.com"; +const char MSG_PRUSA3D_CZ[] PROGMEM = "prusa3d.cz"; +const char MSG_PRUSA3D_IT[] PROGMEM = "prusa3d.com"; +const char MSG_PRUSA3D_ES[] PROGMEM = "prusa3d.com"; +const char MSG_PRUSA3D_PL[] PROGMEM = "prusa3d.cz"; +const char * const MSG_PRUSA3D_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRUSA3D_EN, + MSG_PRUSA3D_CZ, + MSG_PRUSA3D_IT, + MSG_PRUSA3D_ES, + MSG_PRUSA3D_PL +}; + +const char MSG_PRUSA3D_FORUM_EN[] PROGMEM = "forum.prusa3d.com"; +const char MSG_PRUSA3D_FORUM_CZ[] PROGMEM = "forum.prusa3d.cz"; +const char MSG_PRUSA3D_FORUM_IT[] PROGMEM = "forum.prusa3d.com"; +const char MSG_PRUSA3D_FORUM_ES[] PROGMEM = "forum.prusa3d.com"; +const char MSG_PRUSA3D_FORUM_PL[] PROGMEM = "forum.prusa3d.cz"; +const char * const MSG_PRUSA3D_FORUM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRUSA3D_FORUM_EN, + MSG_PRUSA3D_FORUM_CZ, + MSG_PRUSA3D_FORUM_IT, + MSG_PRUSA3D_FORUM_ES, + MSG_PRUSA3D_FORUM_PL +}; + +const char MSG_PRUSA3D_HOWTO_EN[] PROGMEM = "howto.prusa3d.com"; +const char MSG_PRUSA3D_HOWTO_CZ[] PROGMEM = "howto.prusa3d.cz"; +const char MSG_PRUSA3D_HOWTO_IT[] PROGMEM = "howto.prusa3d.com"; +const char MSG_PRUSA3D_HOWTO_ES[] PROGMEM = "howto.prusa3d.com"; +const char MSG_PRUSA3D_HOWTO_PL[] PROGMEM = "howto.prusa3d.cz"; +const char * const MSG_PRUSA3D_HOWTO_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRUSA3D_HOWTO_EN, + MSG_PRUSA3D_HOWTO_CZ, + MSG_PRUSA3D_HOWTO_IT, + MSG_PRUSA3D_HOWTO_ES, + MSG_PRUSA3D_HOWTO_PL +}; + +const char MSG_REBOOT_EN[] PROGMEM = "Reboot the printer"; +const char MSG_REBOOT_CZ[] PROGMEM = "Restartujte tiskarnu"; +const char MSG_REBOOT_IT[] PROGMEM = "Riavvio la stamp."; +const char MSG_REBOOT_ES[] PROGMEM = "Reiniciar la imp."; +const char MSG_REBOOT_PL[] PROGMEM = "Restart drukarki"; +const char * const MSG_REBOOT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_REBOOT_EN, + MSG_REBOOT_CZ, + MSG_REBOOT_IT, + MSG_REBOOT_ES, + MSG_REBOOT_PL +}; + +const char MSG_RECTRACT_EN[] PROGMEM = "Rectract"; +const char MSG_RECTRACT_CZ[] PROGMEM = "Rectract"; +const char MSG_RECTRACT_IT[] PROGMEM = "Rectract"; +const char MSG_RECTRACT_ES[] PROGMEM = "Rectract"; +const char MSG_RECTRACT_PL[] PROGMEM = "Rectract"; +const char * const MSG_RECTRACT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RECTRACT_EN, + MSG_RECTRACT_CZ, + MSG_RECTRACT_IT, + MSG_RECTRACT_ES, + MSG_RECTRACT_PL +}; + +const char MSG_REFRESH_EN[] PROGMEM = "Refresh"; +const char MSG_REFRESH_CZ[] PROGMEM = "Obnovit"; +const char MSG_REFRESH_IT[] PROGMEM = "Refresh"; +const char MSG_REFRESH_ES[] PROGMEM = "Refresh"; +const char MSG_REFRESH_PL[] PROGMEM = "Obnovit"; +const char * const MSG_REFRESH_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_REFRESH_EN, + MSG_REFRESH_CZ, + MSG_REFRESH_IT, + MSG_REFRESH_ES, + MSG_REFRESH_PL +}; + +const char MSG_RESEND_EN[] PROGMEM = "Resend: "; +const char MSG_RESEND_CZ[] PROGMEM = "Resend: "; +const char MSG_RESEND_IT[] PROGMEM = "Resend: "; +const char MSG_RESEND_ES[] PROGMEM = "Resend: "; +const char MSG_RESEND_PL[] PROGMEM = "Resend: "; +const char * const MSG_RESEND_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RESEND_EN, + MSG_RESEND_CZ, + MSG_RESEND_IT, + MSG_RESEND_ES, + MSG_RESEND_PL +}; + +const char MSG_RESTORE_FAILSAFE_EN[] PROGMEM = "Restore failsafe"; +const char MSG_RESTORE_FAILSAFE_CZ[] PROGMEM = "Obnovit vychozi"; +const char MSG_RESTORE_FAILSAFE_IT[] PROGMEM = "Restore failsafe"; +const char MSG_RESTORE_FAILSAFE_ES[] PROGMEM = "Restore failsafe"; +const char MSG_RESTORE_FAILSAFE_PL[] PROGMEM = "Obnovit vychozi"; +const char * const MSG_RESTORE_FAILSAFE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RESTORE_FAILSAFE_EN, + MSG_RESTORE_FAILSAFE_CZ, + MSG_RESTORE_FAILSAFE_IT, + MSG_RESTORE_FAILSAFE_ES, + MSG_RESTORE_FAILSAFE_PL +}; + +const char MSG_RESUME_PRINT_EN[] PROGMEM = "Resume print"; +const char MSG_RESUME_PRINT_CZ[] PROGMEM = "Pokracovat"; +const char MSG_RESUME_PRINT_IT[] PROGMEM = "Riprendi stampa"; +const char MSG_RESUME_PRINT_ES[] PROGMEM = "Reanudar impres."; +const char MSG_RESUME_PRINT_PL[] PROGMEM = "Kontynuowac"; +const char * const MSG_RESUME_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RESUME_PRINT_EN, + MSG_RESUME_PRINT_CZ, + MSG_RESUME_PRINT_IT, + MSG_RESUME_PRINT_ES, + MSG_RESUME_PRINT_PL +}; + +const char MSG_RESUMING_EN[] PROGMEM = "Resuming print"; +const char MSG_RESUMING_CZ[] PROGMEM = "Obnoveni tisku"; +const char MSG_RESUMING_IT[] PROGMEM = "Riprendi Stampa"; +const char MSG_RESUMING_ES[] PROGMEM = "Resumiendo impre."; +const char MSG_RESUMING_PL[] PROGMEM = "Wznowienie druku"; +const char * const MSG_RESUMING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RESUMING_EN, + MSG_RESUMING_CZ, + MSG_RESUMING_IT, + MSG_RESUMING_ES, + MSG_RESUMING_PL +}; + +const char MSG_RETRACT_EN[] PROGMEM = "Retract"; +const char MSG_RETRACT_CZ[] PROGMEM = "Retract"; +const char MSG_RETRACT_IT[] PROGMEM = "Retract"; +const char MSG_RETRACT_ES[] PROGMEM = "Retract"; +const char MSG_RETRACT_PL[] PROGMEM = "Retract"; +const char * const MSG_RETRACT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RETRACT_EN, + MSG_RETRACT_CZ, + MSG_RETRACT_IT, + MSG_RETRACT_ES, + MSG_RETRACT_PL +}; + +const char MSG_SD_CANT_ENTER_SUBDIR_EN[] PROGMEM = "Cannot enter subdir: "; +const char MSG_SD_CANT_ENTER_SUBDIR_CZ[] PROGMEM = "Cannot enter subdir: "; +const char MSG_SD_CANT_ENTER_SUBDIR_IT[] PROGMEM = "Cannot enter subdir: "; +const char MSG_SD_CANT_ENTER_SUBDIR_ES[] PROGMEM = "Cannot enter subdir: "; +const char MSG_SD_CANT_ENTER_SUBDIR_PL[] PROGMEM = "Cannot enter subdir: "; +const char * const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_CANT_ENTER_SUBDIR_EN, + MSG_SD_CANT_ENTER_SUBDIR_CZ, + MSG_SD_CANT_ENTER_SUBDIR_IT, + MSG_SD_CANT_ENTER_SUBDIR_ES, + MSG_SD_CANT_ENTER_SUBDIR_PL +}; + +const char MSG_SD_CANT_OPEN_SUBDIR_EN[] PROGMEM = "Cannot open subdir"; +const char MSG_SD_CANT_OPEN_SUBDIR_CZ[] PROGMEM = "Cannot open subdir"; +const char MSG_SD_CANT_OPEN_SUBDIR_IT[] PROGMEM = "Cannot open subdir"; +const char MSG_SD_CANT_OPEN_SUBDIR_ES[] PROGMEM = "Cannot open subdir"; +const char MSG_SD_CANT_OPEN_SUBDIR_PL[] PROGMEM = "Cannot open subdir"; +const char * const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_CANT_OPEN_SUBDIR_EN, + MSG_SD_CANT_OPEN_SUBDIR_CZ, + MSG_SD_CANT_OPEN_SUBDIR_IT, + MSG_SD_CANT_OPEN_SUBDIR_ES, + MSG_SD_CANT_OPEN_SUBDIR_PL +}; + +const char MSG_SD_CARD_OK_EN[] PROGMEM = "SD card ok"; +const char MSG_SD_CARD_OK_CZ[] PROGMEM = "SD card ok"; +const char MSG_SD_CARD_OK_IT[] PROGMEM = "SD card ok"; +const char MSG_SD_CARD_OK_ES[] PROGMEM = "SD card ok"; +const char MSG_SD_CARD_OK_PL[] PROGMEM = "SD card ok"; +const char * const MSG_SD_CARD_OK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_CARD_OK_EN, + MSG_SD_CARD_OK_CZ, + MSG_SD_CARD_OK_IT, + MSG_SD_CARD_OK_ES, + MSG_SD_CARD_OK_PL +}; + +const char MSG_SD_ERR_WRITE_TO_FILE_EN[] PROGMEM = "error writing to file"; +const char MSG_SD_ERR_WRITE_TO_FILE_CZ[] PROGMEM = "error writing to file"; +const char MSG_SD_ERR_WRITE_TO_FILE_IT[] PROGMEM = "error writing to file"; +const char MSG_SD_ERR_WRITE_TO_FILE_ES[] PROGMEM = "error writing to file"; +const char MSG_SD_ERR_WRITE_TO_FILE_PL[] PROGMEM = "error writing to file"; +const char * const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_ERR_WRITE_TO_FILE_EN, + MSG_SD_ERR_WRITE_TO_FILE_CZ, + MSG_SD_ERR_WRITE_TO_FILE_IT, + MSG_SD_ERR_WRITE_TO_FILE_ES, + MSG_SD_ERR_WRITE_TO_FILE_PL +}; + +const char MSG_SD_FILE_OPENED_EN[] PROGMEM = "File opened: "; +const char MSG_SD_FILE_OPENED_CZ[] PROGMEM = "File opened: "; +const char MSG_SD_FILE_OPENED_IT[] PROGMEM = "File opened: "; +const char MSG_SD_FILE_OPENED_ES[] PROGMEM = "File opened: "; +const char MSG_SD_FILE_OPENED_PL[] PROGMEM = "File opened: "; +const char * const MSG_SD_FILE_OPENED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_FILE_OPENED_EN, + MSG_SD_FILE_OPENED_CZ, + MSG_SD_FILE_OPENED_IT, + MSG_SD_FILE_OPENED_ES, + MSG_SD_FILE_OPENED_PL +}; + +const char MSG_SD_FILE_SELECTED_EN[] PROGMEM = "File selected"; +const char MSG_SD_FILE_SELECTED_CZ[] PROGMEM = "File selected"; +const char MSG_SD_FILE_SELECTED_IT[] PROGMEM = "File selected"; +const char MSG_SD_FILE_SELECTED_ES[] PROGMEM = "File selected"; +const char MSG_SD_FILE_SELECTED_PL[] PROGMEM = "File selected"; +const char * const MSG_SD_FILE_SELECTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_FILE_SELECTED_EN, + MSG_SD_FILE_SELECTED_CZ, + MSG_SD_FILE_SELECTED_IT, + MSG_SD_FILE_SELECTED_ES, + MSG_SD_FILE_SELECTED_PL +}; + +const char MSG_SD_INIT_FAIL_EN[] PROGMEM = "SD init fail"; +const char MSG_SD_INIT_FAIL_CZ[] PROGMEM = "SD init fail"; +const char MSG_SD_INIT_FAIL_IT[] PROGMEM = "SD init fail"; +const char MSG_SD_INIT_FAIL_ES[] PROGMEM = "SD init fail"; +const char MSG_SD_INIT_FAIL_PL[] PROGMEM = "SD init fail"; +const char * const MSG_SD_INIT_FAIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_INIT_FAIL_EN, + MSG_SD_INIT_FAIL_CZ, + MSG_SD_INIT_FAIL_IT, + MSG_SD_INIT_FAIL_ES, + MSG_SD_INIT_FAIL_PL +}; + +const char MSG_SD_INSERTED_EN[] PROGMEM = "Card inserted"; +const char MSG_SD_INSERTED_CZ[] PROGMEM = "Karta vlozena"; +const char MSG_SD_INSERTED_IT[] PROGMEM = "SD Card inserita"; +const char MSG_SD_INSERTED_ES[] PROGMEM = "Tarjeta colocada"; +const char MSG_SD_INSERTED_PL[] PROGMEM = "Karta wlozona"; +const char * const MSG_SD_INSERTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_INSERTED_EN, + MSG_SD_INSERTED_CZ, + MSG_SD_INSERTED_IT, + MSG_SD_INSERTED_ES, + MSG_SD_INSERTED_PL +}; + +const char MSG_SD_NOT_PRINTING_EN[] PROGMEM = "Not SD printing"; +const char MSG_SD_NOT_PRINTING_CZ[] PROGMEM = "Not SD printing"; +const char MSG_SD_NOT_PRINTING_IT[] PROGMEM = "Not SD printing"; +const char MSG_SD_NOT_PRINTING_ES[] PROGMEM = "Not SD printing"; +const char MSG_SD_NOT_PRINTING_PL[] PROGMEM = "Not SD printing"; +const char * const MSG_SD_NOT_PRINTING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_NOT_PRINTING_EN, + MSG_SD_NOT_PRINTING_CZ, + MSG_SD_NOT_PRINTING_IT, + MSG_SD_NOT_PRINTING_ES, + MSG_SD_NOT_PRINTING_PL +}; + +const char MSG_SD_OPENROOT_FAIL_EN[] PROGMEM = "openRoot failed"; +const char MSG_SD_OPENROOT_FAIL_CZ[] PROGMEM = "openRoot failed"; +const char MSG_SD_OPENROOT_FAIL_IT[] PROGMEM = "openRoot failed"; +const char MSG_SD_OPENROOT_FAIL_ES[] PROGMEM = "openRoot failed"; +const char MSG_SD_OPENROOT_FAIL_PL[] PROGMEM = "openRoot failed"; +const char * const MSG_SD_OPENROOT_FAIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_OPENROOT_FAIL_EN, + MSG_SD_OPENROOT_FAIL_CZ, + MSG_SD_OPENROOT_FAIL_IT, + MSG_SD_OPENROOT_FAIL_ES, + MSG_SD_OPENROOT_FAIL_PL +}; + +const char MSG_SD_OPEN_FILE_FAIL_EN[] PROGMEM = "open failed, File: "; +const char MSG_SD_OPEN_FILE_FAIL_CZ[] PROGMEM = "open failed, File: "; +const char MSG_SD_OPEN_FILE_FAIL_IT[] PROGMEM = "open failed, File: "; +const char MSG_SD_OPEN_FILE_FAIL_ES[] PROGMEM = "open failed, File: "; +const char MSG_SD_OPEN_FILE_FAIL_PL[] PROGMEM = "open failed, File: "; +const char * const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_OPEN_FILE_FAIL_EN, + MSG_SD_OPEN_FILE_FAIL_CZ, + MSG_SD_OPEN_FILE_FAIL_IT, + MSG_SD_OPEN_FILE_FAIL_ES, + MSG_SD_OPEN_FILE_FAIL_PL +}; + +const char MSG_SD_PRINTING_BYTE_EN[] PROGMEM = "SD printing byte "; +const char MSG_SD_PRINTING_BYTE_CZ[] PROGMEM = "SD printing byte "; +const char MSG_SD_PRINTING_BYTE_IT[] PROGMEM = "SD printing byte "; +const char MSG_SD_PRINTING_BYTE_ES[] PROGMEM = "SD printing byte "; +const char MSG_SD_PRINTING_BYTE_PL[] PROGMEM = "SD printing byte "; +const char * const MSG_SD_PRINTING_BYTE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_PRINTING_BYTE_EN, + MSG_SD_PRINTING_BYTE_CZ, + MSG_SD_PRINTING_BYTE_IT, + MSG_SD_PRINTING_BYTE_ES, + MSG_SD_PRINTING_BYTE_PL +}; + +const char MSG_SD_REMOVED_EN[] PROGMEM = "Card removed"; +const char MSG_SD_REMOVED_CZ[] PROGMEM = "Karta vyjmuta"; +const char MSG_SD_REMOVED_IT[] PROGMEM = "SD Card rimossa"; +const char MSG_SD_REMOVED_ES[] PROGMEM = "Tarjeta retirada"; +const char MSG_SD_REMOVED_PL[] PROGMEM = "Karta wyjeta"; +const char * const MSG_SD_REMOVED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_REMOVED_EN, + MSG_SD_REMOVED_CZ, + MSG_SD_REMOVED_IT, + MSG_SD_REMOVED_ES, + MSG_SD_REMOVED_PL +}; + +const char MSG_SD_SIZE_EN[] PROGMEM = " Size: "; +const char MSG_SD_SIZE_CZ[] PROGMEM = " Size: "; +const char MSG_SD_SIZE_IT[] PROGMEM = " Size: "; +const char MSG_SD_SIZE_ES[] PROGMEM = " Size: "; +const char MSG_SD_SIZE_PL[] PROGMEM = " Size: "; +const char * const MSG_SD_SIZE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_SIZE_EN, + MSG_SD_SIZE_CZ, + MSG_SD_SIZE_IT, + MSG_SD_SIZE_ES, + MSG_SD_SIZE_PL +}; + +const char MSG_SD_VOL_INIT_FAIL_EN[] PROGMEM = "volume.init failed"; +const char MSG_SD_VOL_INIT_FAIL_CZ[] PROGMEM = "volume.init failed"; +const char MSG_SD_VOL_INIT_FAIL_IT[] PROGMEM = "volume.init failed"; +const char MSG_SD_VOL_INIT_FAIL_ES[] PROGMEM = "volume.init failed"; +const char MSG_SD_VOL_INIT_FAIL_PL[] PROGMEM = "volume.init failed"; +const char * const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_VOL_INIT_FAIL_EN, + MSG_SD_VOL_INIT_FAIL_CZ, + MSG_SD_VOL_INIT_FAIL_IT, + MSG_SD_VOL_INIT_FAIL_ES, + MSG_SD_VOL_INIT_FAIL_PL +}; + +const char MSG_SD_WORKDIR_FAIL_EN[] PROGMEM = "workDir open failed"; +const char MSG_SD_WORKDIR_FAIL_CZ[] PROGMEM = "workDir open failed"; +const char MSG_SD_WORKDIR_FAIL_IT[] PROGMEM = "workDir open failed"; +const char MSG_SD_WORKDIR_FAIL_ES[] PROGMEM = "workDir open failed"; +const char MSG_SD_WORKDIR_FAIL_PL[] PROGMEM = "workDir open failed"; +const char * const MSG_SD_WORKDIR_FAIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_WORKDIR_FAIL_EN, + MSG_SD_WORKDIR_FAIL_CZ, + MSG_SD_WORKDIR_FAIL_IT, + MSG_SD_WORKDIR_FAIL_ES, + MSG_SD_WORKDIR_FAIL_PL +}; + +const char MSG_SD_WRITE_TO_FILE_EN[] PROGMEM = "Writing to file: "; +const char MSG_SD_WRITE_TO_FILE_CZ[] PROGMEM = "Writing to file: "; +const char MSG_SD_WRITE_TO_FILE_IT[] PROGMEM = "Writing to file: "; +const char MSG_SD_WRITE_TO_FILE_ES[] PROGMEM = "Writing to file: "; +const char MSG_SD_WRITE_TO_FILE_PL[] PROGMEM = "Writing to file: "; +const char * const MSG_SD_WRITE_TO_FILE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SD_WRITE_TO_FILE_EN, + MSG_SD_WRITE_TO_FILE_CZ, + MSG_SD_WRITE_TO_FILE_IT, + MSG_SD_WRITE_TO_FILE_ES, + MSG_SD_WRITE_TO_FILE_PL +}; + +const char MSG_SELFTEST_EN[] PROGMEM = "Selftest "; +const char MSG_SELFTEST_CZ[] PROGMEM = "Selftest "; +const char MSG_SELFTEST_IT[] PROGMEM = "Autotest"; +const char MSG_SELFTEST_ES[] PROGMEM = "Autotest"; +const char MSG_SELFTEST_PL[] PROGMEM = "Selftest "; +const char * const MSG_SELFTEST_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_EN, + MSG_SELFTEST_CZ, + MSG_SELFTEST_IT, + MSG_SELFTEST_ES, + MSG_SELFTEST_PL +}; + +const char MSG_SELFTEST_BEDHEATER_EN[] PROGMEM = "Bed / Heater"; +const char MSG_SELFTEST_BEDHEATER_CZ[] PROGMEM = "Bed / Heater"; +const char MSG_SELFTEST_BEDHEATER_IT[] PROGMEM = "Piastra/Riscaldatore"; +const char MSG_SELFTEST_BEDHEATER_ES[] PROGMEM = "Cama/Calentador"; +const char MSG_SELFTEST_BEDHEATER_PL[] PROGMEM = "Bed / Heater"; +const char * const MSG_SELFTEST_BEDHEATER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_BEDHEATER_EN, + MSG_SELFTEST_BEDHEATER_CZ, + MSG_SELFTEST_BEDHEATER_IT, + MSG_SELFTEST_BEDHEATER_ES, + MSG_SELFTEST_BEDHEATER_PL +}; + +const char MSG_SELFTEST_CHECK_ALLCORRECT_EN[] PROGMEM = "All correct "; +const char MSG_SELFTEST_CHECK_ALLCORRECT_CZ[] PROGMEM = "Vse OK "; +const char MSG_SELFTEST_CHECK_ALLCORRECT_IT[] PROGMEM = "Nessun errore"; +const char MSG_SELFTEST_CHECK_ALLCORRECT_ES[] PROGMEM = "Todo bie "; +const char MSG_SELFTEST_CHECK_ALLCORRECT_PL[] PROGMEM = "Wszystko OK "; +const char * const MSG_SELFTEST_CHECK_ALLCORRECT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_ALLCORRECT_EN, + MSG_SELFTEST_CHECK_ALLCORRECT_CZ, + MSG_SELFTEST_CHECK_ALLCORRECT_IT, + MSG_SELFTEST_CHECK_ALLCORRECT_ES, + MSG_SELFTEST_CHECK_ALLCORRECT_PL +}; + +const char MSG_SELFTEST_CHECK_BED_EN[] PROGMEM = "Checking bed "; +const char MSG_SELFTEST_CHECK_BED_CZ[] PROGMEM = "Kontrola bed "; +const char MSG_SELFTEST_CHECK_BED_IT[] PROGMEM = "Verifica piastra"; +const char MSG_SELFTEST_CHECK_BED_ES[] PROGMEM = "Control de cama"; +const char MSG_SELFTEST_CHECK_BED_PL[] PROGMEM = "Kontrola bed "; +const char * const MSG_SELFTEST_CHECK_BED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_BED_EN, + MSG_SELFTEST_CHECK_BED_CZ, + MSG_SELFTEST_CHECK_BED_IT, + MSG_SELFTEST_CHECK_BED_ES, + MSG_SELFTEST_CHECK_BED_PL +}; + +const char MSG_SELFTEST_CHECK_ENDSTOPS_EN[] PROGMEM = "Checking endstops"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_CZ[] PROGMEM = "Kontrola endstops"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_IT[] PROGMEM = "Verifica limiti"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_ES[] PROGMEM = "Cont. topes final"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_PL[] PROGMEM = "Kontrola endstops"; +const char * const MSG_SELFTEST_CHECK_ENDSTOPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_ENDSTOPS_EN, + MSG_SELFTEST_CHECK_ENDSTOPS_CZ, + MSG_SELFTEST_CHECK_ENDSTOPS_IT, + MSG_SELFTEST_CHECK_ENDSTOPS_ES, + MSG_SELFTEST_CHECK_ENDSTOPS_PL +}; + +const char MSG_SELFTEST_CHECK_HOTEND_EN[] PROGMEM = "Checking hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_CZ[] PROGMEM = "Kontrola hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_IT[] PROGMEM = "Verifica lim temp"; +const char MSG_SELFTEST_CHECK_HOTEND_ES[] PROGMEM = "Control hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_PL[] PROGMEM = "Kontrola hotend "; +const char * const MSG_SELFTEST_CHECK_HOTEND_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_HOTEND_EN, + MSG_SELFTEST_CHECK_HOTEND_CZ, + MSG_SELFTEST_CHECK_HOTEND_IT, + MSG_SELFTEST_CHECK_HOTEND_ES, + MSG_SELFTEST_CHECK_HOTEND_PL +}; + +const char MSG_SELFTEST_CHECK_X_EN[] PROGMEM = "Checking X axis "; +const char MSG_SELFTEST_CHECK_X_CZ[] PROGMEM = "Kontrola X axis "; +const char MSG_SELFTEST_CHECK_X_IT[] PROGMEM = "Verifica asse X"; +const char MSG_SELFTEST_CHECK_X_ES[] PROGMEM = "Control del eje X"; +const char MSG_SELFTEST_CHECK_X_PL[] PROGMEM = "Kontrola X axis "; +const char * const MSG_SELFTEST_CHECK_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_X_EN, + MSG_SELFTEST_CHECK_X_CZ, + MSG_SELFTEST_CHECK_X_IT, + MSG_SELFTEST_CHECK_X_ES, + MSG_SELFTEST_CHECK_X_PL +}; + +const char MSG_SELFTEST_CHECK_Y_EN[] PROGMEM = "Checking Y axis "; +const char MSG_SELFTEST_CHECK_Y_CZ[] PROGMEM = "Kontrola Y axis "; +const char MSG_SELFTEST_CHECK_Y_IT[] PROGMEM = "Verifica asse Y"; +const char MSG_SELFTEST_CHECK_Y_ES[] PROGMEM = "Control del eje Y"; +const char MSG_SELFTEST_CHECK_Y_PL[] PROGMEM = "Kontrola Y axis "; +const char * const MSG_SELFTEST_CHECK_Y_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_Y_EN, + MSG_SELFTEST_CHECK_Y_CZ, + MSG_SELFTEST_CHECK_Y_IT, + MSG_SELFTEST_CHECK_Y_ES, + MSG_SELFTEST_CHECK_Y_PL +}; + +const char MSG_SELFTEST_CHECK_Z_EN[] PROGMEM = "Checking Z axis "; +const char MSG_SELFTEST_CHECK_Z_CZ[] PROGMEM = "Kontrola Z axis "; +const char MSG_SELFTEST_CHECK_Z_IT[] PROGMEM = "Verifica asse Z"; +const char MSG_SELFTEST_CHECK_Z_ES[] PROGMEM = "Control del eje Z"; +const char MSG_SELFTEST_CHECK_Z_PL[] PROGMEM = "Kontrola Z axis "; +const char * const MSG_SELFTEST_CHECK_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_CHECK_Z_EN, + MSG_SELFTEST_CHECK_Z_CZ, + MSG_SELFTEST_CHECK_Z_IT, + MSG_SELFTEST_CHECK_Z_ES, + MSG_SELFTEST_CHECK_Z_PL +}; + +const char MSG_SELFTEST_ENDSTOP_EN[] PROGMEM = "Endstop"; +const char MSG_SELFTEST_ENDSTOP_CZ[] PROGMEM = "Endstop"; +const char MSG_SELFTEST_ENDSTOP_IT[] PROGMEM = "Limite corsa"; +const char MSG_SELFTEST_ENDSTOP_ES[] PROGMEM = "Tope final"; +const char MSG_SELFTEST_ENDSTOP_PL[] PROGMEM = "Endstop"; +const char * const MSG_SELFTEST_ENDSTOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOP_EN, + MSG_SELFTEST_ENDSTOP_CZ, + MSG_SELFTEST_ENDSTOP_IT, + MSG_SELFTEST_ENDSTOP_ES, + MSG_SELFTEST_ENDSTOP_PL +}; + +const char MSG_SELFTEST_ENDSTOPS_EN[] PROGMEM = "Endstops"; +const char MSG_SELFTEST_ENDSTOPS_CZ[] PROGMEM = "Endstops"; +const char MSG_SELFTEST_ENDSTOPS_IT[] PROGMEM = "Limiti corsa"; +const char MSG_SELFTEST_ENDSTOPS_ES[] PROGMEM = "Topes final"; +const char MSG_SELFTEST_ENDSTOPS_PL[] PROGMEM = "Endstops"; +const char * const MSG_SELFTEST_ENDSTOPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOPS_EN, + MSG_SELFTEST_ENDSTOPS_CZ, + MSG_SELFTEST_ENDSTOPS_IT, + MSG_SELFTEST_ENDSTOPS_ES, + MSG_SELFTEST_ENDSTOPS_PL +}; + +const char MSG_SELFTEST_ENDSTOP_NOTHIT_EN[] PROGMEM = "Endstop not hit"; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_CZ[] PROGMEM = "Endstop not hit"; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_IT[] PROGMEM = "Lim. fuoriportata"; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_ES[] PROGMEM = "Tope fin. no toc."; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_PL[] PROGMEM = "Endstop not hit"; +const char * const MSG_SELFTEST_ENDSTOP_NOTHIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOP_NOTHIT_EN, + MSG_SELFTEST_ENDSTOP_NOTHIT_CZ, + MSG_SELFTEST_ENDSTOP_NOTHIT_IT, + MSG_SELFTEST_ENDSTOP_NOTHIT_ES, + MSG_SELFTEST_ENDSTOP_NOTHIT_PL +}; + +const char MSG_SELFTEST_ERROR_EN[] PROGMEM = "Selftest error !"; +const char MSG_SELFTEST_ERROR_CZ[] PROGMEM = "Selftest error !"; +const char MSG_SELFTEST_ERROR_IT[] PROGMEM = "Autotest negativo"; +const char MSG_SELFTEST_ERROR_ES[] PROGMEM = "\xA1Autotest error!"; +const char MSG_SELFTEST_ERROR_PL[] PROGMEM = "Selftest error !"; +const char * const MSG_SELFTEST_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ERROR_EN, + MSG_SELFTEST_ERROR_CZ, + MSG_SELFTEST_ERROR_IT, + MSG_SELFTEST_ERROR_ES, + MSG_SELFTEST_ERROR_PL +}; + +const char MSG_SELFTEST_FAILED_EN[] PROGMEM = "Selftest failed "; +const char MSG_SELFTEST_FAILED_CZ[] PROGMEM = "Selftest selhal "; +const char MSG_SELFTEST_FAILED_IT[] PROGMEM = "Autotest fallito"; +const char MSG_SELFTEST_FAILED_ES[] PROGMEM = "Autotest fallado"; +const char MSG_SELFTEST_FAILED_PL[] PROGMEM = "Selftest nieudany"; +const char * const MSG_SELFTEST_FAILED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_FAILED_EN, + MSG_SELFTEST_FAILED_CZ, + MSG_SELFTEST_FAILED_IT, + MSG_SELFTEST_FAILED_ES, + MSG_SELFTEST_FAILED_PL +}; + +const char MSG_SELFTEST_HEATERTHERMISTOR_EN[] PROGMEM = "Heater/Thermistor"; +const char MSG_SELFTEST_HEATERTHERMISTOR_CZ[] PROGMEM = "Heater/Thermistor"; +const char MSG_SELFTEST_HEATERTHERMISTOR_IT[] PROGMEM = "Riscald./Termistore"; +const char MSG_SELFTEST_HEATERTHERMISTOR_ES[] PROGMEM = "Calent./Termistor"; +const char MSG_SELFTEST_HEATERTHERMISTOR_PL[] PROGMEM = "Heater/Thermistor"; +const char * const MSG_SELFTEST_HEATERTHERMISTOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_HEATERTHERMISTOR_EN, + MSG_SELFTEST_HEATERTHERMISTOR_CZ, + MSG_SELFTEST_HEATERTHERMISTOR_IT, + MSG_SELFTEST_HEATERTHERMISTOR_ES, + MSG_SELFTEST_HEATERTHERMISTOR_PL +}; + +const char MSG_SELFTEST_MOTOR_EN[] PROGMEM = "Motor"; +const char MSG_SELFTEST_MOTOR_CZ[] PROGMEM = "Motor"; +const char MSG_SELFTEST_MOTOR_IT[] PROGMEM = "Motore"; +const char MSG_SELFTEST_MOTOR_ES[] PROGMEM = "Motor"; +const char MSG_SELFTEST_MOTOR_PL[] PROGMEM = "Silnik"; +const char * const MSG_SELFTEST_MOTOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_MOTOR_EN, + MSG_SELFTEST_MOTOR_CZ, + MSG_SELFTEST_MOTOR_IT, + MSG_SELFTEST_MOTOR_ES, + MSG_SELFTEST_MOTOR_PL +}; + +const char MSG_SELFTEST_NOTCONNECTED_EN[] PROGMEM = "Not connected"; +const char MSG_SELFTEST_NOTCONNECTED_CZ[] PROGMEM = "Nezapojeno "; +const char MSG_SELFTEST_NOTCONNECTED_IT[] PROGMEM = "Non connesso"; +const char MSG_SELFTEST_NOTCONNECTED_ES[] PROGMEM = "No hay conexion "; +const char MSG_SELFTEST_NOTCONNECTED_PL[] PROGMEM = "Nie podlaczono "; +const char * const MSG_SELFTEST_NOTCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_NOTCONNECTED_EN, + MSG_SELFTEST_NOTCONNECTED_CZ, + MSG_SELFTEST_NOTCONNECTED_IT, + MSG_SELFTEST_NOTCONNECTED_ES, + MSG_SELFTEST_NOTCONNECTED_PL +}; + +const char MSG_SELFTEST_OK_EN[] PROGMEM = "Self test OK"; +const char MSG_SELFTEST_OK_CZ[] PROGMEM = "Self test OK"; +const char MSG_SELFTEST_OK_IT[] PROGMEM = "Autotest OK"; +const char MSG_SELFTEST_OK_ES[] PROGMEM = "Self test OK"; +const char MSG_SELFTEST_OK_PL[] PROGMEM = "Self test OK"; +const char * const MSG_SELFTEST_OK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_OK_EN, + MSG_SELFTEST_OK_CZ, + MSG_SELFTEST_OK_IT, + MSG_SELFTEST_OK_ES, + MSG_SELFTEST_OK_PL +}; + +const char MSG_SELFTEST_PLEASECHECK_EN[] PROGMEM = "Please check :"; +const char MSG_SELFTEST_PLEASECHECK_CZ[] PROGMEM = "Zkontrolujte :"; +const char MSG_SELFTEST_PLEASECHECK_IT[] PROGMEM = "Verifica:"; +const char MSG_SELFTEST_PLEASECHECK_ES[] PROGMEM = "Controla :"; +const char MSG_SELFTEST_PLEASECHECK_PL[] PROGMEM = "Skontroluj :"; +const char * const MSG_SELFTEST_PLEASECHECK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_PLEASECHECK_EN, + MSG_SELFTEST_PLEASECHECK_CZ, + MSG_SELFTEST_PLEASECHECK_IT, + MSG_SELFTEST_PLEASECHECK_ES, + MSG_SELFTEST_PLEASECHECK_PL +}; + +const char MSG_SELFTEST_START_EN[] PROGMEM = "Self test start "; +const char MSG_SELFTEST_START_CZ[] PROGMEM = "Self test start "; +const char MSG_SELFTEST_START_IT[] PROGMEM = "Inizia autotest"; +const char MSG_SELFTEST_START_ES[] PROGMEM = "Autotest salida"; +const char MSG_SELFTEST_START_PL[] PROGMEM = "Self test start "; +const char * const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_START_EN, + MSG_SELFTEST_START_CZ, + MSG_SELFTEST_START_IT, + MSG_SELFTEST_START_ES, + MSG_SELFTEST_START_PL +}; + +const char MSG_SELFTEST_WIRINGERROR_EN[] PROGMEM = "Wiring error"; +const char MSG_SELFTEST_WIRINGERROR_CZ[] PROGMEM = "Chyba zapojeni"; +const char MSG_SELFTEST_WIRINGERROR_IT[] PROGMEM = "Errore cablaggio"; +const char MSG_SELFTEST_WIRINGERROR_ES[] PROGMEM = "Error de conexi\xF3n"; +const char MSG_SELFTEST_WIRINGERROR_PL[] PROGMEM = "Blad polaczenia"; +const char * const MSG_SELFTEST_WIRINGERROR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_WIRINGERROR_EN, + MSG_SELFTEST_WIRINGERROR_CZ, + MSG_SELFTEST_WIRINGERROR_IT, + MSG_SELFTEST_WIRINGERROR_ES, + MSG_SELFTEST_WIRINGERROR_PL +}; + +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_EN[] PROGMEM = "Error in menu structure"; +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_CZ[] PROGMEM = "Error in menu structure"; +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_IT[] PROGMEM = "Error in menu structure"; +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_ES[] PROGMEM = "Error in menu structure"; +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_PL[] PROGMEM = "Error in menu structure"; +const char * const MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SERIAL_ERROR_MENU_STRUCTURE_EN, + MSG_SERIAL_ERROR_MENU_STRUCTURE_CZ, + MSG_SERIAL_ERROR_MENU_STRUCTURE_IT, + MSG_SERIAL_ERROR_MENU_STRUCTURE_ES, + MSG_SERIAL_ERROR_MENU_STRUCTURE_PL +}; + +const char MSG_SETTINGS_EN[] PROGMEM = "Settings"; +const char MSG_SETTINGS_CZ[] PROGMEM = "Nastaveni"; +const char MSG_SETTINGS_IT[] PROGMEM = "Impostazioni"; +const char MSG_SETTINGS_ES[] PROGMEM = "Ajuste"; +const char MSG_SETTINGS_PL[] PROGMEM = "Ustawienia"; +const char * const MSG_SETTINGS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SETTINGS_EN, + MSG_SETTINGS_CZ, + MSG_SETTINGS_IT, + MSG_SETTINGS_ES, + MSG_SETTINGS_PL +}; + +const char MSG_SET_HOME_OFFSETS_EN[] PROGMEM = "Set home offsets"; +const char MSG_SET_HOME_OFFSETS_CZ[] PROGMEM = "Nastav pocatek home"; +const char MSG_SET_HOME_OFFSETS_IT[] PROGMEM = "Set home offsets"; +const char MSG_SET_HOME_OFFSETS_ES[] PROGMEM = "Set home offsets"; +const char MSG_SET_HOME_OFFSETS_PL[] PROGMEM = "Nastav pocatek home"; +const char * const MSG_SET_HOME_OFFSETS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SET_HOME_OFFSETS_EN, + MSG_SET_HOME_OFFSETS_CZ, + MSG_SET_HOME_OFFSETS_IT, + MSG_SET_HOME_OFFSETS_ES, + MSG_SET_HOME_OFFSETS_PL +}; + +const char MSG_SET_ORIGIN_EN[] PROGMEM = "Set origin"; +const char MSG_SET_ORIGIN_CZ[] PROGMEM = "Nastav pocatek"; +const char MSG_SET_ORIGIN_IT[] PROGMEM = "Set origin"; +const char MSG_SET_ORIGIN_ES[] PROGMEM = "Set origin"; +const char MSG_SET_ORIGIN_PL[] PROGMEM = "Nastav pocatek"; +const char * const MSG_SET_ORIGIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SET_ORIGIN_EN, + MSG_SET_ORIGIN_CZ, + MSG_SET_ORIGIN_IT, + MSG_SET_ORIGIN_ES, + MSG_SET_ORIGIN_PL +}; + +const char MSG_SILENT_MODE_OFF_EN[] PROGMEM = "Mode [high power]"; +const char MSG_SILENT_MODE_OFF_CZ[] PROGMEM = "Mod [vys. vykon]"; +const char MSG_SILENT_MODE_OFF_IT[] PROGMEM = "Modo [piu forza]"; +const char MSG_SILENT_MODE_OFF_ES[] PROGMEM = "Modo [mas fuerza]"; +const char MSG_SILENT_MODE_OFF_PL[] PROGMEM = "Mod [w wydajnosc]"; +const char * const MSG_SILENT_MODE_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SILENT_MODE_OFF_EN, + MSG_SILENT_MODE_OFF_CZ, + MSG_SILENT_MODE_OFF_IT, + MSG_SILENT_MODE_OFF_ES, + MSG_SILENT_MODE_OFF_PL +}; + +const char MSG_SILENT_MODE_ON_EN[] PROGMEM = "Mode [silent]"; +const char MSG_SILENT_MODE_ON_CZ[] PROGMEM = "Mod [tichy]"; +const char MSG_SILENT_MODE_ON_IT[] PROGMEM = "Modo [silenzioso]"; +const char MSG_SILENT_MODE_ON_ES[] PROGMEM = "Modo [silencio]"; +const char MSG_SILENT_MODE_ON_PL[] PROGMEM = "Mod [cichy]"; +const char * const MSG_SILENT_MODE_ON_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SILENT_MODE_ON_EN, + MSG_SILENT_MODE_ON_CZ, + MSG_SILENT_MODE_ON_IT, + MSG_SILENT_MODE_ON_ES, + MSG_SILENT_MODE_ON_PL +}; + +const char MSG_SOFTWARE_RESET_EN[] PROGMEM = " Software Reset"; +const char MSG_SOFTWARE_RESET_CZ[] PROGMEM = " Software Reset"; +const char MSG_SOFTWARE_RESET_IT[] PROGMEM = " Software Reset"; +const char MSG_SOFTWARE_RESET_ES[] PROGMEM = " Software Reset"; +const char MSG_SOFTWARE_RESET_PL[] PROGMEM = " Software Reset"; +const char * const MSG_SOFTWARE_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SOFTWARE_RESET_EN, + MSG_SOFTWARE_RESET_CZ, + MSG_SOFTWARE_RESET_IT, + MSG_SOFTWARE_RESET_ES, + MSG_SOFTWARE_RESET_PL +}; + +const char MSG_SPEED_EN[] PROGMEM = "Speed"; +const char MSG_SPEED_CZ[] PROGMEM = "Rychlost"; +const char MSG_SPEED_IT[] PROGMEM = "Velcit�"; +const char MSG_SPEED_ES[] PROGMEM = "Velocidad"; +const char MSG_SPEED_PL[] PROGMEM = "Predkosc"; +const char * const MSG_SPEED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SPEED_EN, + MSG_SPEED_CZ, + MSG_SPEED_IT, + MSG_SPEED_ES, + MSG_SPEED_PL +}; + +const char MSG_STATISTICS_EN[] PROGMEM = "Statistics "; +const char MSG_STATISTICS_CZ[] PROGMEM = "Statistika "; +const char MSG_STATISTICS_IT[] PROGMEM = "Statistiche"; +const char MSG_STATISTICS_ES[] PROGMEM = "Estadistica "; +const char MSG_STATISTICS_PL[] PROGMEM = "Statystyka "; +const char * const MSG_STATISTICS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STATISTICS_EN, + MSG_STATISTICS_CZ, + MSG_STATISTICS_IT, + MSG_STATISTICS_ES, + MSG_STATISTICS_PL +}; + +const char MSG_STATS_FILAMENTUSED_EN[] PROGMEM = "Filament used: "; +const char MSG_STATS_FILAMENTUSED_CZ[] PROGMEM = "Filament : "; +const char MSG_STATS_FILAMENTUSED_IT[] PROGMEM = "Filamento:"; +const char MSG_STATS_FILAMENTUSED_ES[] PROGMEM = "Filamento : "; +const char MSG_STATS_FILAMENTUSED_PL[] PROGMEM = "Filament : "; +const char * const MSG_STATS_FILAMENTUSED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STATS_FILAMENTUSED_EN, + MSG_STATS_FILAMENTUSED_CZ, + MSG_STATS_FILAMENTUSED_IT, + MSG_STATS_FILAMENTUSED_ES, + MSG_STATS_FILAMENTUSED_PL +}; + +const char MSG_STATS_PRINTTIME_EN[] PROGMEM = "Print time: "; +const char MSG_STATS_PRINTTIME_CZ[] PROGMEM = "Cas tisku : "; +const char MSG_STATS_PRINTTIME_IT[] PROGMEM = "Tempo stampa:"; +const char MSG_STATS_PRINTTIME_ES[] PROGMEM = "Tiempo de imp.:"; +const char MSG_STATS_PRINTTIME_PL[] PROGMEM = "Czas druku : "; +const char * const MSG_STATS_PRINTTIME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STATS_PRINTTIME_EN, + MSG_STATS_PRINTTIME_CZ, + MSG_STATS_PRINTTIME_IT, + MSG_STATS_PRINTTIME_ES, + MSG_STATS_PRINTTIME_PL +}; + +const char MSG_STATS_TOTALFILAMENT_EN[] PROGMEM = "Total filament :"; +const char MSG_STATS_TOTALFILAMENT_CZ[] PROGMEM = "Filament celkem :"; +const char MSG_STATS_TOTALFILAMENT_IT[] PROGMEM = "Filamento tot:"; +const char MSG_STATS_TOTALFILAMENT_ES[] PROGMEM = "Filamento total:"; +const char MSG_STATS_TOTALFILAMENT_PL[] PROGMEM = "Filament lacznie :"; +const char * const MSG_STATS_TOTALFILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STATS_TOTALFILAMENT_EN, + MSG_STATS_TOTALFILAMENT_CZ, + MSG_STATS_TOTALFILAMENT_IT, + MSG_STATS_TOTALFILAMENT_ES, + MSG_STATS_TOTALFILAMENT_PL +}; + +const char MSG_STATS_TOTALPRINTTIME_EN[] PROGMEM = "Total print time :"; +const char MSG_STATS_TOTALPRINTTIME_CZ[] PROGMEM = "Celkovy cas :"; +const char MSG_STATS_TOTALPRINTTIME_IT[] PROGMEM = "Tempo stampa tot:"; +const char MSG_STATS_TOTALPRINTTIME_ES[] PROGMEM = "Tiempo total :"; +const char MSG_STATS_TOTALPRINTTIME_PL[] PROGMEM = "Czas calkowity :"; +const char * const MSG_STATS_TOTALPRINTTIME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STATS_TOTALPRINTTIME_EN, + MSG_STATS_TOTALPRINTTIME_CZ, + MSG_STATS_TOTALPRINTTIME_IT, + MSG_STATS_TOTALPRINTTIME_ES, + MSG_STATS_TOTALPRINTTIME_PL +}; + +const char MSG_STEPPER_TOO_HIGH_EN[] PROGMEM = "Steprate too high: "; +const char MSG_STEPPER_TOO_HIGH_CZ[] PROGMEM = "Steprate too high: "; +const char MSG_STEPPER_TOO_HIGH_IT[] PROGMEM = "Steprate too high: "; +const char MSG_STEPPER_TOO_HIGH_ES[] PROGMEM = "Steprate too high: "; +const char MSG_STEPPER_TOO_HIGH_PL[] PROGMEM = "Steprate too high: "; +const char * const MSG_STEPPER_TOO_HIGH_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STEPPER_TOO_HIGH_EN, + MSG_STEPPER_TOO_HIGH_CZ, + MSG_STEPPER_TOO_HIGH_IT, + MSG_STEPPER_TOO_HIGH_ES, + MSG_STEPPER_TOO_HIGH_PL +}; + +const char MSG_STOPPED_EN[] PROGMEM = "STOPPED. "; +const char MSG_STOPPED_CZ[] PROGMEM = "STOPPED. "; +const char MSG_STOPPED_IT[] PROGMEM = "ARRESTATO "; +const char MSG_STOPPED_ES[] PROGMEM = "PARADA"; +const char MSG_STOPPED_PL[] PROGMEM = "STOPPED. "; +const char * const MSG_STOPPED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STOPPED_EN, + MSG_STOPPED_CZ, + MSG_STOPPED_IT, + MSG_STOPPED_ES, + MSG_STOPPED_PL +}; + +const char MSG_STOP_PRINT_EN[] PROGMEM = "Stop print"; +const char MSG_STOP_PRINT_CZ[] PROGMEM = "Zastavit tisk"; +const char MSG_STOP_PRINT_IT[] PROGMEM = "Arresta stampa"; +const char MSG_STOP_PRINT_ES[] PROGMEM = "Detener impresion"; +const char MSG_STOP_PRINT_PL[] PROGMEM = "Zatrzymac druk"; +const char * const MSG_STOP_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STOP_PRINT_EN, + MSG_STOP_PRINT_CZ, + MSG_STOP_PRINT_IT, + MSG_STOP_PRINT_ES, + MSG_STOP_PRINT_PL +}; + +const char MSG_STORE_EPROM_EN[] PROGMEM = "Store memory"; +const char MSG_STORE_EPROM_CZ[] PROGMEM = "Store memory"; +const char MSG_STORE_EPROM_IT[] PROGMEM = "Store memory"; +const char MSG_STORE_EPROM_ES[] PROGMEM = "Store memory"; +const char MSG_STORE_EPROM_PL[] PROGMEM = "Store memory"; +const char * const MSG_STORE_EPROM_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STORE_EPROM_EN, + MSG_STORE_EPROM_CZ, + MSG_STORE_EPROM_IT, + MSG_STORE_EPROM_ES, + MSG_STORE_EPROM_PL +}; + +const char MSG_SUPPORT_EN[] PROGMEM = "Support"; +const char MSG_SUPPORT_CZ[] PROGMEM = "Podpora"; +const char MSG_SUPPORT_IT[] PROGMEM = "Support"; +const char MSG_SUPPORT_ES[] PROGMEM = "Support"; +const char MSG_SUPPORT_PL[] PROGMEM = "Pomoc"; +const char * const MSG_SUPPORT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SUPPORT_EN, + MSG_SUPPORT_CZ, + MSG_SUPPORT_IT, + MSG_SUPPORT_ES, + MSG_SUPPORT_PL +}; + +const char MSG_SWITCH_PS_OFF_EN[] PROGMEM = "Switch power off"; +const char MSG_SWITCH_PS_OFF_CZ[] PROGMEM = "Zapnout zdroj"; +const char MSG_SWITCH_PS_OFF_IT[] PROGMEM = "Switch power off"; +const char MSG_SWITCH_PS_OFF_ES[] PROGMEM = "Switch power off"; +const char MSG_SWITCH_PS_OFF_PL[] PROGMEM = "Zapnout zdroj"; +const char * const MSG_SWITCH_PS_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SWITCH_PS_OFF_EN, + MSG_SWITCH_PS_OFF_CZ, + MSG_SWITCH_PS_OFF_IT, + MSG_SWITCH_PS_OFF_ES, + MSG_SWITCH_PS_OFF_PL +}; + +const char MSG_SWITCH_PS_ON_EN[] PROGMEM = "Switch power on"; +const char MSG_SWITCH_PS_ON_CZ[] PROGMEM = "Vypnout zdroj"; +const char MSG_SWITCH_PS_ON_IT[] PROGMEM = "Switch power on"; +const char MSG_SWITCH_PS_ON_ES[] PROGMEM = "Switch power on"; +const char MSG_SWITCH_PS_ON_PL[] PROGMEM = "Vypnout zdroj"; +const char * const MSG_SWITCH_PS_ON_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SWITCH_PS_ON_EN, + MSG_SWITCH_PS_ON_CZ, + MSG_SWITCH_PS_ON_IT, + MSG_SWITCH_PS_ON_ES, + MSG_SWITCH_PS_ON_PL +}; + +const char MSG_TAKE_EFFECT_EN[] PROGMEM = " for take effect"; +const char MSG_TAKE_EFFECT_CZ[] PROGMEM = " pro projeveni zmen"; +const char MSG_TAKE_EFFECT_IT[] PROGMEM = " per mostrare i camb."; +const char MSG_TAKE_EFFECT_ES[] PROGMEM = "para tomar efecto"; +const char MSG_TAKE_EFFECT_PL[] PROGMEM = "wprow. zmian"; +const char * const MSG_TAKE_EFFECT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TAKE_EFFECT_EN, + MSG_TAKE_EFFECT_CZ, + MSG_TAKE_EFFECT_IT, + MSG_TAKE_EFFECT_ES, + MSG_TAKE_EFFECT_PL +}; + +const char MSG_TEMPERATURE_EN[] PROGMEM = "Temperature"; +const char MSG_TEMPERATURE_CZ[] PROGMEM = "Teplota"; +const char MSG_TEMPERATURE_IT[] PROGMEM = "Temperatura"; +const char MSG_TEMPERATURE_ES[] PROGMEM = "Temperatura"; +const char MSG_TEMPERATURE_PL[] PROGMEM = "Temperatura"; +const char * const MSG_TEMPERATURE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TEMPERATURE_EN, + MSG_TEMPERATURE_CZ, + MSG_TEMPERATURE_IT, + MSG_TEMPERATURE_ES, + MSG_TEMPERATURE_PL +}; + +const char MSG_TUNE_EN[] PROGMEM = "Tune"; +const char MSG_TUNE_CZ[] PROGMEM = "Ladit"; +const char MSG_TUNE_IT[] PROGMEM = "Adatta"; +const char MSG_TUNE_ES[] PROGMEM = "Ajustar"; +const char MSG_TUNE_PL[] PROGMEM = "Nastroic"; +const char * const MSG_TUNE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TUNE_EN, + MSG_TUNE_CZ, + MSG_TUNE_IT, + MSG_TUNE_ES, + MSG_TUNE_PL +}; + +const char MSG_UNKNOWN_COMMAND_EN[] PROGMEM = "Unknown command: \""; +const char MSG_UNKNOWN_COMMAND_CZ[] PROGMEM = "Unknown command: \""; +const char MSG_UNKNOWN_COMMAND_IT[] PROGMEM = "Unknown command: \""; +const char MSG_UNKNOWN_COMMAND_ES[] PROGMEM = "Unknown command: \""; +const char MSG_UNKNOWN_COMMAND_PL[] PROGMEM = "Unknown command: \""; +const char * const MSG_UNKNOWN_COMMAND_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNKNOWN_COMMAND_EN, + MSG_UNKNOWN_COMMAND_CZ, + MSG_UNKNOWN_COMMAND_IT, + MSG_UNKNOWN_COMMAND_ES, + MSG_UNKNOWN_COMMAND_PL +}; + +const char MSG_UNLOAD_FILAMENT_EN[] PROGMEM = "Unload filament"; +const char MSG_UNLOAD_FILAMENT_CZ[] PROGMEM = "Vyjmout filament"; +const char MSG_UNLOAD_FILAMENT_IT[] PROGMEM = "Scaricare fil."; +const char MSG_UNLOAD_FILAMENT_ES[] PROGMEM = "Sacar filamento"; +const char MSG_UNLOAD_FILAMENT_PL[] PROGMEM = "Wyjac filament"; +const char * const MSG_UNLOAD_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_FILAMENT_EN, + MSG_UNLOAD_FILAMENT_CZ, + MSG_UNLOAD_FILAMENT_IT, + MSG_UNLOAD_FILAMENT_ES, + MSG_UNLOAD_FILAMENT_PL +}; + +const char MSG_USB_PRINTING_EN[] PROGMEM = "USB printing "; +const char MSG_USB_PRINTING_CZ[] PROGMEM = "Tisk z USB "; +const char MSG_USB_PRINTING_IT[] PROGMEM = "Stampa da USB"; +const char MSG_USB_PRINTING_ES[] PROGMEM = "Impresion de USB "; +const char MSG_USB_PRINTING_PL[] PROGMEM = "Druk z USB "; +const char * const MSG_USB_PRINTING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_USB_PRINTING_EN, + MSG_USB_PRINTING_CZ, + MSG_USB_PRINTING_IT, + MSG_USB_PRINTING_ES, + MSG_USB_PRINTING_PL +}; + +const char MSG_USERWAIT_EN[] PROGMEM = "Wait for user..."; +const char MSG_USERWAIT_CZ[] PROGMEM = "Wait for user..."; +const char MSG_USERWAIT_IT[] PROGMEM = "Attendi Utente..."; +const char MSG_USERWAIT_ES[] PROGMEM = "Esperando ordenes"; +const char MSG_USERWAIT_PL[] PROGMEM = "Wait for user..."; +const char * const MSG_USERWAIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_USERWAIT_EN, + MSG_USERWAIT_CZ, + MSG_USERWAIT_IT, + MSG_USERWAIT_ES, + MSG_USERWAIT_PL +}; + +const char MSG_VE_JERK_EN[] PROGMEM = "Ve-jerk"; +const char MSG_VE_JERK_CZ[] PROGMEM = "Ve-jerk"; +const char MSG_VE_JERK_IT[] PROGMEM = "Ve-jerk"; +const char MSG_VE_JERK_ES[] PROGMEM = "Ve-jerk"; +const char MSG_VE_JERK_PL[] PROGMEM = "Ve-jerk"; +const char * const MSG_VE_JERK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VE_JERK_EN, + MSG_VE_JERK_CZ, + MSG_VE_JERK_IT, + MSG_VE_JERK_ES, + MSG_VE_JERK_PL +}; + +const char MSG_VMAX_EN[] PROGMEM = "Vmax "; +const char MSG_VMAX_CZ[] PROGMEM = "Vmax "; +const char MSG_VMAX_IT[] PROGMEM = "Vmax "; +const char MSG_VMAX_ES[] PROGMEM = "Vmax "; +const char MSG_VMAX_PL[] PROGMEM = "Vmax "; +const char * const MSG_VMAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VMAX_EN, + MSG_VMAX_CZ, + MSG_VMAX_IT, + MSG_VMAX_ES, + MSG_VMAX_PL +}; + +const char MSG_VMIN_EN[] PROGMEM = "Vmin"; +const char MSG_VMIN_CZ[] PROGMEM = "Vmin"; +const char MSG_VMIN_IT[] PROGMEM = "Vmin"; +const char MSG_VMIN_ES[] PROGMEM = "Vmin"; +const char MSG_VMIN_PL[] PROGMEM = "Vmin"; +const char * const MSG_VMIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VMIN_EN, + MSG_VMIN_CZ, + MSG_VMIN_IT, + MSG_VMIN_ES, + MSG_VMIN_PL +}; + +const char MSG_VOLUMETRIC_EN[] PROGMEM = "Filament"; +const char MSG_VOLUMETRIC_CZ[] PROGMEM = "Filament"; +const char MSG_VOLUMETRIC_IT[] PROGMEM = "Filament"; +const char MSG_VOLUMETRIC_ES[] PROGMEM = "Filament"; +const char MSG_VOLUMETRIC_PL[] PROGMEM = "Filament"; +const char * const MSG_VOLUMETRIC_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VOLUMETRIC_EN, + MSG_VOLUMETRIC_CZ, + MSG_VOLUMETRIC_IT, + MSG_VOLUMETRIC_ES, + MSG_VOLUMETRIC_PL +}; + +const char MSG_VOLUMETRIC_ENABLED_EN[] PROGMEM = "E in mm3"; +const char MSG_VOLUMETRIC_ENABLED_CZ[] PROGMEM = "E in mm3"; +const char MSG_VOLUMETRIC_ENABLED_IT[] PROGMEM = "E in mm3"; +const char MSG_VOLUMETRIC_ENABLED_ES[] PROGMEM = "E in mm3"; +const char MSG_VOLUMETRIC_ENABLED_PL[] PROGMEM = "E in mm3"; +const char * const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VOLUMETRIC_ENABLED_EN, + MSG_VOLUMETRIC_ENABLED_CZ, + MSG_VOLUMETRIC_ENABLED_IT, + MSG_VOLUMETRIC_ENABLED_ES, + MSG_VOLUMETRIC_ENABLED_PL +}; + +const char MSG_VTRAV_MIN_EN[] PROGMEM = "VTrav min"; +const char MSG_VTRAV_MIN_CZ[] PROGMEM = "VTrav min"; +const char MSG_VTRAV_MIN_IT[] PROGMEM = "VTrav min"; +const char MSG_VTRAV_MIN_ES[] PROGMEM = "VTrav min"; +const char MSG_VTRAV_MIN_PL[] PROGMEM = "VTrav min"; +const char * const MSG_VTRAV_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VTRAV_MIN_EN, + MSG_VTRAV_MIN_CZ, + MSG_VTRAV_MIN_IT, + MSG_VTRAV_MIN_ES, + MSG_VTRAV_MIN_PL +}; + +const char MSG_VXY_JERK_EN[] PROGMEM = "Vxy-jerk"; +const char MSG_VXY_JERK_CZ[] PROGMEM = "Vxy-jerk"; +const char MSG_VXY_JERK_IT[] PROGMEM = "Vxy-jerk"; +const char MSG_VXY_JERK_ES[] PROGMEM = "Vxy-jerk"; +const char MSG_VXY_JERK_PL[] PROGMEM = "Vxy-jerk"; +const char * const MSG_VXY_JERK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VXY_JERK_EN, + MSG_VXY_JERK_CZ, + MSG_VXY_JERK_IT, + MSG_VXY_JERK_ES, + MSG_VXY_JERK_PL +}; + +const char MSG_VZ_JERK_EN[] PROGMEM = "Vz-jerk"; +const char MSG_VZ_JERK_CZ[] PROGMEM = "Vz-jerk"; +const char MSG_VZ_JERK_IT[] PROGMEM = "Vz-jerk"; +const char MSG_VZ_JERK_ES[] PROGMEM = "Vz-jerk"; +const char MSG_VZ_JERK_PL[] PROGMEM = "Vz-jerk"; +const char * const MSG_VZ_JERK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_VZ_JERK_EN, + MSG_VZ_JERK_CZ, + MSG_VZ_JERK_IT, + MSG_VZ_JERK_ES, + MSG_VZ_JERK_PL +}; + +const char MSG_WATCH_EN[] PROGMEM = "Info screen"; +const char MSG_WATCH_CZ[] PROGMEM = "Informace"; +const char MSG_WATCH_IT[] PROGMEM = "Guarda"; +const char MSG_WATCH_ES[] PROGMEM = "Monitorizar"; +const char MSG_WATCH_PL[] PROGMEM = "Informacje"; +const char * const MSG_WATCH_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_WATCH_EN, + MSG_WATCH_CZ, + MSG_WATCH_IT, + MSG_WATCH_ES, + MSG_WATCH_PL +}; + +const char MSG_WATCHDOG_RESET_EN[] PROGMEM = " Watchdog Reset"; +const char MSG_WATCHDOG_RESET_CZ[] PROGMEM = " Watchdog Reset"; +const char MSG_WATCHDOG_RESET_IT[] PROGMEM = " Watchdog Reset"; +const char MSG_WATCHDOG_RESET_ES[] PROGMEM = " Watchdog Reset"; +const char MSG_WATCHDOG_RESET_PL[] PROGMEM = " Watchdog Reset"; +const char * const MSG_WATCHDOG_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_WATCHDOG_RESET_EN, + MSG_WATCHDOG_RESET_CZ, + MSG_WATCHDOG_RESET_IT, + MSG_WATCHDOG_RESET_ES, + MSG_WATCHDOG_RESET_PL +}; + +const char MSG_X_EN[] PROGMEM = "x"; +const char MSG_X_CZ[] PROGMEM = "x"; +const char MSG_X_IT[] PROGMEM = "x"; +const char MSG_X_ES[] PROGMEM = "x"; +const char MSG_X_PL[] PROGMEM = "x"; +const char * const MSG_X_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_X_EN, + MSG_X_CZ, + MSG_X_IT, + MSG_X_ES, + MSG_X_PL +}; + +const char MSG_XSTEPS_EN[] PROGMEM = "Xsteps/mm"; +const char MSG_XSTEPS_CZ[] PROGMEM = "Xsteps/mm"; +const char MSG_XSTEPS_IT[] PROGMEM = "Xsteps/mm"; +const char MSG_XSTEPS_ES[] PROGMEM = "Xsteps/mm"; +const char MSG_XSTEPS_PL[] PROGMEM = "Xsteps/mm"; +const char * const MSG_XSTEPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_XSTEPS_EN, + MSG_XSTEPS_CZ, + MSG_XSTEPS_IT, + MSG_XSTEPS_ES, + MSG_XSTEPS_PL +}; + +const char MSG_X_MAX_EN[] PROGMEM = "x_max: "; +const char MSG_X_MAX_CZ[] PROGMEM = "x_max: "; +const char MSG_X_MAX_IT[] PROGMEM = "x_max: "; +const char MSG_X_MAX_ES[] PROGMEM = "x_max: "; +const char MSG_X_MAX_PL[] PROGMEM = "x_max: "; +const char * const MSG_X_MAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_X_MAX_EN, + MSG_X_MAX_CZ, + MSG_X_MAX_IT, + MSG_X_MAX_ES, + MSG_X_MAX_PL +}; + +const char MSG_X_MIN_EN[] PROGMEM = "x_min: "; +const char MSG_X_MIN_CZ[] PROGMEM = "x_min: "; +const char MSG_X_MIN_IT[] PROGMEM = "x_min: "; +const char MSG_X_MIN_ES[] PROGMEM = "x_min: "; +const char MSG_X_MIN_PL[] PROGMEM = "x_min: "; +const char * const MSG_X_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_X_MIN_EN, + MSG_X_MIN_CZ, + MSG_X_MIN_IT, + MSG_X_MIN_ES, + MSG_X_MIN_PL +}; + +const char MSG_Y_EN[] PROGMEM = "y"; +const char MSG_Y_CZ[] PROGMEM = "y"; +const char MSG_Y_IT[] PROGMEM = "y"; +const char MSG_Y_ES[] PROGMEM = "y"; +const char MSG_Y_PL[] PROGMEM = "y"; +const char * const MSG_Y_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Y_EN, + MSG_Y_CZ, + MSG_Y_IT, + MSG_Y_ES, + MSG_Y_PL +}; + +const char MSG_YES_EN[] PROGMEM = "Yes"; +const char MSG_YES_CZ[] PROGMEM = "Ano"; +const char MSG_YES_IT[] PROGMEM = "Si"; +const char MSG_YES_ES[] PROGMEM = "Si"; +const char MSG_YES_PL[] PROGMEM = "Tak"; +const char * const MSG_YES_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_YES_EN, + MSG_YES_CZ, + MSG_YES_IT, + MSG_YES_ES, + MSG_YES_PL +}; + +const char MSG_YSTEPS_EN[] PROGMEM = "Ysteps/mm"; +const char MSG_YSTEPS_CZ[] PROGMEM = "Ysteps/mm"; +const char MSG_YSTEPS_IT[] PROGMEM = "Ysteps/mm"; +const char MSG_YSTEPS_ES[] PROGMEM = "Ysteps/mm"; +const char MSG_YSTEPS_PL[] PROGMEM = "Ysteps/mm"; +const char * const MSG_YSTEPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_YSTEPS_EN, + MSG_YSTEPS_CZ, + MSG_YSTEPS_IT, + MSG_YSTEPS_ES, + MSG_YSTEPS_PL +}; + +const char MSG_Y_MAX_EN[] PROGMEM = "y_max: "; +const char MSG_Y_MAX_CZ[] PROGMEM = "y_max: "; +const char MSG_Y_MAX_IT[] PROGMEM = "y_max: "; +const char MSG_Y_MAX_ES[] PROGMEM = "y_max: "; +const char MSG_Y_MAX_PL[] PROGMEM = "y_max: "; +const char * const MSG_Y_MAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Y_MAX_EN, + MSG_Y_MAX_CZ, + MSG_Y_MAX_IT, + MSG_Y_MAX_ES, + MSG_Y_MAX_PL +}; + +const char MSG_Y_MIN_EN[] PROGMEM = "y_min: "; +const char MSG_Y_MIN_CZ[] PROGMEM = "y_min: "; +const char MSG_Y_MIN_IT[] PROGMEM = "y_min: "; +const char MSG_Y_MIN_ES[] PROGMEM = "y_min: "; +const char MSG_Y_MIN_PL[] PROGMEM = "y_min: "; +const char * const MSG_Y_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Y_MIN_EN, + MSG_Y_MIN_CZ, + MSG_Y_MIN_IT, + MSG_Y_MIN_ES, + MSG_Y_MIN_PL +}; + +const char MSG_Z_EN[] PROGMEM = "z"; +const char MSG_Z_CZ[] PROGMEM = "z"; +const char MSG_Z_IT[] PROGMEM = "z"; +const char MSG_Z_ES[] PROGMEM = "z"; +const char MSG_Z_PL[] PROGMEM = "z"; +const char * const MSG_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Z_EN, + MSG_Z_CZ, + MSG_Z_IT, + MSG_Z_ES, + MSG_Z_PL +}; + +const char MSG_ZPROBE_OUT_EN[] PROGMEM = "Z probe out. bed"; +const char MSG_ZPROBE_OUT_CZ[] PROGMEM = "Z probe out. bed"; +const char MSG_ZPROBE_OUT_IT[] PROGMEM = "Z probe out. bed"; +const char MSG_ZPROBE_OUT_ES[] PROGMEM = "Z probe out. bed"; +const char MSG_ZPROBE_OUT_PL[] PROGMEM = "Z probe out. bed"; +const char * const MSG_ZPROBE_OUT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ZPROBE_OUT_EN, + MSG_ZPROBE_OUT_CZ, + MSG_ZPROBE_OUT_IT, + MSG_ZPROBE_OUT_ES, + MSG_ZPROBE_OUT_PL +}; + +const char MSG_ZPROBE_ZOFFSET_EN[] PROGMEM = "Z Offset"; +const char MSG_ZPROBE_ZOFFSET_CZ[] PROGMEM = "Z Offset"; +const char MSG_ZPROBE_ZOFFSET_IT[] PROGMEM = "Z Offset"; +const char MSG_ZPROBE_ZOFFSET_ES[] PROGMEM = "Z Offset"; +const char MSG_ZPROBE_ZOFFSET_PL[] PROGMEM = "Z Offset"; +const char * const MSG_ZPROBE_ZOFFSET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ZPROBE_ZOFFSET_EN, + MSG_ZPROBE_ZOFFSET_CZ, + MSG_ZPROBE_ZOFFSET_IT, + MSG_ZPROBE_ZOFFSET_ES, + MSG_ZPROBE_ZOFFSET_PL +}; + +const char MSG_ZSTEPS_EN[] PROGMEM = "Zsteps/mm"; +const char MSG_ZSTEPS_CZ[] PROGMEM = "Zsteps/mm"; +const char MSG_ZSTEPS_IT[] PROGMEM = "Zsteps/mm"; +const char MSG_ZSTEPS_ES[] PROGMEM = "Zsteps/mm"; +const char MSG_ZSTEPS_PL[] PROGMEM = "Zsteps/mm"; +const char * const MSG_ZSTEPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ZSTEPS_EN, + MSG_ZSTEPS_CZ, + MSG_ZSTEPS_IT, + MSG_ZSTEPS_ES, + MSG_ZSTEPS_PL +}; + +const char MSG_Z_MAX_EN[] PROGMEM = "z_max: "; +const char MSG_Z_MAX_CZ[] PROGMEM = "z_max: "; +const char MSG_Z_MAX_IT[] PROGMEM = "z_max: "; +const char MSG_Z_MAX_ES[] PROGMEM = "z_max: "; +const char MSG_Z_MAX_PL[] PROGMEM = "z_max: "; +const char * const MSG_Z_MAX_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Z_MAX_EN, + MSG_Z_MAX_CZ, + MSG_Z_MAX_IT, + MSG_Z_MAX_ES, + MSG_Z_MAX_PL +}; + +const char MSG_Z_MIN_EN[] PROGMEM = "z_min: "; +const char MSG_Z_MIN_CZ[] PROGMEM = "z_min: "; +const char MSG_Z_MIN_IT[] PROGMEM = "z_min: "; +const char MSG_Z_MIN_ES[] PROGMEM = "z_min: "; +const char MSG_Z_MIN_PL[] PROGMEM = "z_min: "; +const char * const MSG_Z_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Z_MIN_EN, + MSG_Z_MIN_CZ, + MSG_Z_MIN_IT, + MSG_Z_MIN_ES, + MSG_Z_MIN_PL +}; + +const char WELCOME_MSG_EN[] PROGMEM = CUSTOM_MENDEL_NAME " ready."; +const char WELCOME_MSG_CZ[] PROGMEM = CUSTOM_MENDEL_NAME " ok"; +const char WELCOME_MSG_IT[] PROGMEM = CUSTOM_MENDEL_NAME " pronto."; +const char WELCOME_MSG_ES[] PROGMEM = CUSTOM_MENDEL_NAME " lista"; +const char WELCOME_MSG_PL[] PROGMEM = CUSTOM_MENDEL_NAME " gotowa"; +const char * const WELCOME_MSG_LANG_TABLE[LANG_NUM] PROGMEM = { + WELCOME_MSG_EN, + WELCOME_MSG_CZ, + WELCOME_MSG_IT, + WELCOME_MSG_ES, + WELCOME_MSG_PL +}; + + +char langbuffer[LCD_WIDTH+1]; +char* CAT2(const char *s1,const char *s2) { + unsigned char len=0; + strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); + len+=strlen_P(s1); + strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); + return langbuffer; +} +char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4) { + unsigned char len=0; + strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); + len+=strlen_P(s1); + strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); + len+=strlen_P(s2); + strncpy_P(langbuffer+len,s3,LCD_WIDTH-len); + len+=strlen_P(s3); + strncpy_P(langbuffer+len,s4,LCD_WIDTH-len); + return langbuffer; +} diff --git a/Firmware/language_all.h b/Firmware/language_all.h index f05119b4..ce599414 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -1,267 +1,551 @@ -#ifndef LANGUAGE_ALL_H -#define LANGUAGE_ALL_H - -extern unsigned char lang_selected; -extern const char** MSG_ALL[]; -#define WELCOME_MSG MSG_ALL[lang_selected][0] -#define MSG_SD_INSERTED MSG_ALL[lang_selected][1] -#define MSG_SD_REMOVED MSG_ALL[lang_selected][2] -#define MSG_MAIN MSG_ALL[lang_selected][3] -#define MSG_AUTOSTART MSG_ALL[lang_selected][4] -#define MSG_DISABLE_STEPPERS MSG_ALL[lang_selected][5] -#define MSG_AUTO_HOME MSG_ALL[lang_selected][6] -#define MSG_SET_HOME_OFFSETS MSG_ALL[lang_selected][7] -#define MSG_SET_ORIGIN MSG_ALL[lang_selected][8] -#define MSG_PREHEAT_PLA MSG_ALL[lang_selected][9] -#define MSG_PREHEAT_PLA0 MSG_ALL[lang_selected][10] -#define MSG_PREHEAT_PLA1 MSG_ALL[lang_selected][11] -#define MSG_PREHEAT_PLA2 MSG_ALL[lang_selected][12] -#define MSG_PREHEAT_PLA012 MSG_ALL[lang_selected][13] -#define MSG_PREHEAT_PLA_BEDONLY MSG_ALL[lang_selected][14] -#define MSG_PREHEAT_PLA_SETTINGS MSG_ALL[lang_selected][15] -#define MSG_PREHEAT_ABS MSG_ALL[lang_selected][16] -#define MSG_PREHEAT_ABS0 MSG_ALL[lang_selected][17] -#define MSG_PREHEAT_ABS1 MSG_ALL[lang_selected][18] -#define MSG_PREHEAT_ABS2 MSG_ALL[lang_selected][19] -#define MSG_PREHEAT_ABS012 MSG_ALL[lang_selected][20] -#define MSG_PREHEAT_ABS_BEDONLY MSG_ALL[lang_selected][21] -#define MSG_PREHEAT_ABS_SETTINGS MSG_ALL[lang_selected][22] -#define MSG_COOLDOWN MSG_ALL[lang_selected][23] -#define MSG_SWITCH_PS_ON MSG_ALL[lang_selected][24] -#define MSG_SWITCH_PS_OFF MSG_ALL[lang_selected][25] -#define MSG_EXTRUDE MSG_ALL[lang_selected][26] -#define MSG_RETRACT MSG_ALL[lang_selected][27] -#define MSG_MOVE_AXIS MSG_ALL[lang_selected][28] -#define MSG_MOVE_X MSG_ALL[lang_selected][29] -#define MSG_MOVE_Y MSG_ALL[lang_selected][30] -#define MSG_MOVE_Z MSG_ALL[lang_selected][31] -#define MSG_MOVE_E MSG_ALL[lang_selected][32] -#define MSG_MOVE_E1 MSG_ALL[lang_selected][33] -#define MSG_MOVE_E2 MSG_ALL[lang_selected][34] -#define MSG_MOVE_01MM MSG_ALL[lang_selected][35] -#define MSG_MOVE_1MM MSG_ALL[lang_selected][36] -#define MSG_MOVE_10MM MSG_ALL[lang_selected][37] -#define MSG_SPEED MSG_ALL[lang_selected][38] -#define MSG_NOZZLE MSG_ALL[lang_selected][39] -#define MSG_NOZZLE1 MSG_ALL[lang_selected][40] -#define MSG_NOZZLE2 MSG_ALL[lang_selected][41] -#define MSG_BED MSG_ALL[lang_selected][42] -#define MSG_FAN_SPEED MSG_ALL[lang_selected][43] -#define MSG_FLOW MSG_ALL[lang_selected][44] -#define MSG_FLOW0 MSG_ALL[lang_selected][45] -#define MSG_FLOW1 MSG_ALL[lang_selected][46] -#define MSG_FLOW2 MSG_ALL[lang_selected][47] -#define MSG_CONTROL MSG_ALL[lang_selected][48] -#define MSG_MIN MSG_ALL[lang_selected][49] -#define MSG_MAX MSG_ALL[lang_selected][50] -#define MSG_FACTOR MSG_ALL[lang_selected][51] -#define MSG_AUTOTEMP MSG_ALL[lang_selected][52] -#define MSG_ON MSG_ALL[lang_selected][53] -#define MSG_OFF MSG_ALL[lang_selected][54] -#define MSG_PID_P MSG_ALL[lang_selected][55] -#define MSG_PID_I MSG_ALL[lang_selected][56] -#define MSG_PID_D MSG_ALL[lang_selected][57] -#define MSG_PID_C MSG_ALL[lang_selected][58] -#define MSG_ACC MSG_ALL[lang_selected][59] -#define MSG_VXY_JERK MSG_ALL[lang_selected][60] -#define MSG_VZ_JERK MSG_ALL[lang_selected][61] -#define MSG_VE_JERK MSG_ALL[lang_selected][62] -#define MSG_VMAX MSG_ALL[lang_selected][63] -#define MSG_X MSG_ALL[lang_selected][64] -#define MSG_Y MSG_ALL[lang_selected][65] -#define MSG_Z MSG_ALL[lang_selected][66] -#define MSG_E MSG_ALL[lang_selected][67] -#define MSG_VMIN MSG_ALL[lang_selected][68] -#define MSG_VTRAV_MIN MSG_ALL[lang_selected][69] -#define MSG_AMAX MSG_ALL[lang_selected][70] -#define MSG_A_RETRACT MSG_ALL[lang_selected][71] -#define MSG_XSTEPS MSG_ALL[lang_selected][72] -#define MSG_YSTEPS MSG_ALL[lang_selected][73] -#define MSG_ZSTEPS MSG_ALL[lang_selected][74] -#define MSG_ESTEPS MSG_ALL[lang_selected][75] -#define MSG_TEMPERATURE MSG_ALL[lang_selected][76] -#define MSG_MOTION MSG_ALL[lang_selected][77] -#define MSG_VOLUMETRIC MSG_ALL[lang_selected][78] -#define MSG_VOLUMETRIC_ENABLED MSG_ALL[lang_selected][79] -#define MSG_FILAMENT_SIZE_EXTRUDER_0 MSG_ALL[lang_selected][80] -#define MSG_FILAMENT_SIZE_EXTRUDER_1 MSG_ALL[lang_selected][81] -#define MSG_FILAMENT_SIZE_EXTRUDER_2 MSG_ALL[lang_selected][82] -#define MSG_CONTRAST MSG_ALL[lang_selected][83] -#define MSG_STORE_EPROM MSG_ALL[lang_selected][84] -#define MSG_LOAD_EPROM MSG_ALL[lang_selected][85] -#define MSG_RESTORE_FAILSAFE MSG_ALL[lang_selected][86] -#define MSG_REFRESH MSG_ALL[lang_selected][87] -#define MSG_WATCH MSG_ALL[lang_selected][88] -#define MSG_PREPARE MSG_ALL[lang_selected][89] -#define MSG_TUNE MSG_ALL[lang_selected][90] -#define MSG_PAUSE_PRINT MSG_ALL[lang_selected][91] -#define MSG_RESUME_PRINT MSG_ALL[lang_selected][92] -#define MSG_STOP_PRINT MSG_ALL[lang_selected][93] -#define MSG_CARD_MENU MSG_ALL[lang_selected][94] -#define MSG_NO_CARD MSG_ALL[lang_selected][95] -#define MSG_DWELL MSG_ALL[lang_selected][96] -#define MSG_USERWAIT MSG_ALL[lang_selected][97] -#define MSG_RESUMING MSG_ALL[lang_selected][98] -#define MSG_PRINT_ABORTED MSG_ALL[lang_selected][99] -#define MSG_NO_MOVE MSG_ALL[lang_selected][100] -#define MSG_KILLED MSG_ALL[lang_selected][101] -#define MSG_STOPPED MSG_ALL[lang_selected][102] -#define MSG_CONTROL_RETRACT MSG_ALL[lang_selected][103] -#define MSG_CONTROL_RETRACT_SWAP MSG_ALL[lang_selected][104] -#define MSG_CONTROL_RETRACTF MSG_ALL[lang_selected][105] -#define MSG_CONTROL_RETRACT_ZLIFT MSG_ALL[lang_selected][106] -#define MSG_CONTROL_RETRACT_RECOVER MSG_ALL[lang_selected][107] -#define MSG_CONTROL_RETRACT_RECOVER_SWAP MSG_ALL[lang_selected][108] -#define MSG_CONTROL_RETRACT_RECOVERF MSG_ALL[lang_selected][109] -#define MSG_AUTORETRACT MSG_ALL[lang_selected][110] -#define MSG_FILAMENTCHANGE MSG_ALL[lang_selected][111] -#define MSG_INIT_SDCARD MSG_ALL[lang_selected][112] -#define MSG_CNG_SDCARD MSG_ALL[lang_selected][113] -#define MSG_ZPROBE_OUT MSG_ALL[lang_selected][114] -#define MSG_POSITION_UNKNOWN MSG_ALL[lang_selected][115] -#define MSG_ZPROBE_ZOFFSET MSG_ALL[lang_selected][116] -#define MSG_BABYSTEP_X MSG_ALL[lang_selected][117] -#define MSG_BABYSTEP_Y MSG_ALL[lang_selected][118] -#define MSG_BABYSTEP_Z MSG_ALL[lang_selected][119] -#define MSG_ENDSTOP_ABORT MSG_ALL[lang_selected][120] -#define MSG_ADJUSTZ MSG_ALL[lang_selected][121] -#define MSG_PICK_Z MSG_ALL[lang_selected][122] -#define MSG_HOMEYZ MSG_ALL[lang_selected][123] -#define MSG_HOMEYZ_PROGRESS MSG_ALL[lang_selected][124] -#define MSG_HOMEYZ_DONE MSG_ALL[lang_selected][125] -#define MSG_SETTINGS MSG_ALL[lang_selected][126] -#define MSG_PREHEAT MSG_ALL[lang_selected][127] -#define MSG_UNLOAD_FILAMENT MSG_ALL[lang_selected][128] -#define MSG_LOAD_FILAMENT MSG_ALL[lang_selected][129] -#define MSG_RECTRACT MSG_ALL[lang_selected][130] -#define MSG_ERROR MSG_ALL[lang_selected][131] -#define MSG_PREHEAT_NOZZLE MSG_ALL[lang_selected][132] -#define MSG_SUPPORT MSG_ALL[lang_selected][133] -#define MSG_CORRECTLY MSG_ALL[lang_selected][134] -#define MSG_YES MSG_ALL[lang_selected][135] -#define MSG_NO MSG_ALL[lang_selected][136] -#define MSG_NOT_LOADED MSG_ALL[lang_selected][137] -#define MSG_NOT_COLOR MSG_ALL[lang_selected][138] -#define MSG_LOADING_FILAMENT MSG_ALL[lang_selected][139] -#define MSG_PLEASE_WAIT MSG_ALL[lang_selected][140] -#define MSG_LOADING_COLOR MSG_ALL[lang_selected][141] -#define MSG_CHANGE_SUCCESS MSG_ALL[lang_selected][142] -#define MSG_PRESS MSG_ALL[lang_selected][143] -#define MSG_INSERT_FILAMENT MSG_ALL[lang_selected][144] -#define MSG_CHANGING_FILAMENT MSG_ALL[lang_selected][145] -#define MSG_SILENT_MODE_ON MSG_ALL[lang_selected][146] -#define MSG_SILENT_MODE_OFF MSG_ALL[lang_selected][147] -#define MSG_REBOOT MSG_ALL[lang_selected][148] -#define MSG_TAKE_EFFECT MSG_ALL[lang_selected][149] -#define MSG_Enqueing MSG_ALL[lang_selected][150] -#define MSG_POWERUP MSG_ALL[lang_selected][151] -#define MSG_EXTERNAL_RESET MSG_ALL[lang_selected][152] -#define MSG_BROWNOUT_RESET MSG_ALL[lang_selected][153] -#define MSG_WATCHDOG_RESET MSG_ALL[lang_selected][154] -#define MSG_SOFTWARE_RESET MSG_ALL[lang_selected][155] -#define MSG_AUTHOR MSG_ALL[lang_selected][156] -#define MSG_CONFIGURATION_VER MSG_ALL[lang_selected][157] -#define MSG_FREE_MEMORY MSG_ALL[lang_selected][158] -#define MSG_PLANNER_BUFFER_BYTES MSG_ALL[lang_selected][159] -#define MSG_OK MSG_ALL[lang_selected][160] -#define MSG_FILE_SAVED MSG_ALL[lang_selected][161] -#define MSG_ERR_LINE_NO MSG_ALL[lang_selected][162] -#define MSG_ERR_CHECKSUM_MISMATCH MSG_ALL[lang_selected][163] -#define MSG_ERR_NO_CHECKSUM MSG_ALL[lang_selected][164] -#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM MSG_ALL[lang_selected][165] -#define MSG_FILE_PRINTED MSG_ALL[lang_selected][166] -#define MSG_BEGIN_FILE_LIST MSG_ALL[lang_selected][167] -#define MSG_END_FILE_LIST MSG_ALL[lang_selected][168] -#define MSG_M104_INVALID_EXTRUDER MSG_ALL[lang_selected][169] -#define MSG_M105_INVALID_EXTRUDER MSG_ALL[lang_selected][170] -#define MSG_M200_INVALID_EXTRUDER MSG_ALL[lang_selected][171] -#define MSG_M218_INVALID_EXTRUDER MSG_ALL[lang_selected][172] -#define MSG_M221_INVALID_EXTRUDER MSG_ALL[lang_selected][173] -#define MSG_ERR_NO_THERMISTORS MSG_ALL[lang_selected][174] -#define MSG_M109_INVALID_EXTRUDER MSG_ALL[lang_selected][175] -#define MSG_HEATING MSG_ALL[lang_selected][176] -#define MSG_HEATING_COMPLETE MSG_ALL[lang_selected][177] -#define MSG_BED_HEATING MSG_ALL[lang_selected][178] -#define MSG_BED_DONE MSG_ALL[lang_selected][179] -#define MSG_M115_REPORT MSG_ALL[lang_selected][180] -#define MSG_COUNT_X MSG_ALL[lang_selected][181] -#define MSG_ERR_KILLED MSG_ALL[lang_selected][182] -#define MSG_ERR_STOPPED MSG_ALL[lang_selected][183] -#define MSG_RESEND MSG_ALL[lang_selected][184] -#define MSG_UNKNOWN_COMMAND MSG_ALL[lang_selected][185] -#define MSG_ACTIVE_EXTRUDER MSG_ALL[lang_selected][186] -#define MSG_INVALID_EXTRUDER MSG_ALL[lang_selected][187] -#define MSG_X_MIN MSG_ALL[lang_selected][188] -#define MSG_X_MAX MSG_ALL[lang_selected][189] -#define MSG_Y_MIN MSG_ALL[lang_selected][190] -#define MSG_Y_MAX MSG_ALL[lang_selected][191] -#define MSG_Z_MIN MSG_ALL[lang_selected][192] -#define MSG_Z_MAX MSG_ALL[lang_selected][193] -#define MSG_M119_REPORT MSG_ALL[lang_selected][194] -#define MSG_ENDSTOP_HIT MSG_ALL[lang_selected][195] -#define MSG_ENDSTOP_OPEN MSG_ALL[lang_selected][196] -#define MSG_HOTEND_OFFSET MSG_ALL[lang_selected][197] -#define MSG_SD_CANT_OPEN_SUBDIR MSG_ALL[lang_selected][198] -#define MSG_SD_INIT_FAIL MSG_ALL[lang_selected][199] -#define MSG_SD_VOL_INIT_FAIL MSG_ALL[lang_selected][200] -#define MSG_SD_OPENROOT_FAIL MSG_ALL[lang_selected][201] -#define MSG_SD_CARD_OK MSG_ALL[lang_selected][202] -#define MSG_SD_WORKDIR_FAIL MSG_ALL[lang_selected][203] -#define MSG_SD_OPEN_FILE_FAIL MSG_ALL[lang_selected][204] -#define MSG_SD_FILE_OPENED MSG_ALL[lang_selected][205] -#define MSG_SD_SIZE MSG_ALL[lang_selected][206] -#define MSG_SD_FILE_SELECTED MSG_ALL[lang_selected][207] -#define MSG_SD_WRITE_TO_FILE MSG_ALL[lang_selected][208] -#define MSG_SD_PRINTING_BYTE MSG_ALL[lang_selected][209] -#define MSG_SD_NOT_PRINTING MSG_ALL[lang_selected][210] -#define MSG_SD_ERR_WRITE_TO_FILE MSG_ALL[lang_selected][211] -#define MSG_SD_CANT_ENTER_SUBDIR MSG_ALL[lang_selected][212] -#define MSG_STEPPER_TOO_HIGH MSG_ALL[lang_selected][213] -#define MSG_ENDSTOPS_HIT MSG_ALL[lang_selected][214] -#define MSG_ERR_COLD_EXTRUDE_STOP MSG_ALL[lang_selected][215] -#define MSG_ERR_LONG_EXTRUDE_STOP MSG_ALL[lang_selected][216] -#define MSG_BABYSTEPPING_X MSG_ALL[lang_selected][217] -#define MSG_BABYSTEPPING_Y MSG_ALL[lang_selected][218] -#define MSG_BABYSTEPPING_Z MSG_ALL[lang_selected][219] -#define MSG_SERIAL_ERROR_MENU_STRUCTURE MSG_ALL[lang_selected][220] -#define MSG_LANGUAGE_NAME MSG_ALL[lang_selected][221] -#define MSG_LANGUAGE_SELECT MSG_ALL[lang_selected][222] -#define MSG_PRUSA3D MSG_ALL[lang_selected][223] -#define MSG_PRUSA3D_FORUM MSG_ALL[lang_selected][224] -#define MSG_PRUSA3D_HOWTO MSG_ALL[lang_selected][225] -#define MSG_SELFTEST_ERROR MSG_ALL[lang_selected][226] -#define MSG_SELFTEST_PLEASECHECK MSG_ALL[lang_selected][227] -#define MSG_SELFTEST_NOTCONNECTED MSG_ALL[lang_selected][228] -#define MSG_SELFTEST_HEATERTHERMISTOR MSG_ALL[lang_selected][229] -#define MSG_SELFTEST_BEDHEATER MSG_ALL[lang_selected][230] -#define MSG_SELFTEST_WIRINGERROR MSG_ALL[lang_selected][231] -#define MSG_SELFTEST_ENDSTOPS MSG_ALL[lang_selected][232] -#define MSG_SELFTEST_MOTOR MSG_ALL[lang_selected][233] -#define MSG_SELFTEST_ENDSTOP MSG_ALL[lang_selected][234] -#define MSG_SELFTEST_ENDSTOP_NOTHIT MSG_ALL[lang_selected][235] -#define MSG_SELFTEST_OK MSG_ALL[lang_selected][236] -#define MSG_STATS_TOTALFILAMENT MSG_ALL[lang_selected][237] -#define MSG_STATS_TOTALPRINTTIME MSG_ALL[lang_selected][238] -#define MSG_STATS_FILAMENTUSED MSG_ALL[lang_selected][239] -#define MSG_STATS_PRINTTIME MSG_ALL[lang_selected][240] -#define MSG_SELFTEST_START MSG_ALL[lang_selected][241] -#define MSG_SELFTEST_CHECK_ENDSTOPS MSG_ALL[lang_selected][242] -#define MSG_SELFTEST_CHECK_HOTEND MSG_ALL[lang_selected][243] -#define MSG_SELFTEST_CHECK_X MSG_ALL[lang_selected][244] -#define MSG_SELFTEST_CHECK_Y MSG_ALL[lang_selected][245] -#define MSG_SELFTEST_CHECK_Z MSG_ALL[lang_selected][246] -#define MSG_SELFTEST_CHECK_BED MSG_ALL[lang_selected][247] -#define MSG_SELFTEST_CHECK_ALLCORRECT MSG_ALL[lang_selected][248] -#define MSG_SELFTEST MSG_ALL[lang_selected][249] -#define MSG_SELFTEST_FAILED MSG_ALL[lang_selected][250] -#define MSG_STATISTICS MSG_ALL[lang_selected][251] -#define MSG_USB_PRINTING MSG_ALL[lang_selected][252] -#define LANGUAGE_NAME 221 -#define LANGUAGE_SELECT 222 -#define LANG_NUM 5 -char* CAT2(const char *s1,const char *s2); -char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4); - - - -#endif //LANGUAGE_ALL.H \ No newline at end of file +#ifndef LANGUAGE_ALL_H +#define LANGUAGE_ALL_H + +#define LANG_NUM (5) + +extern unsigned char lang_selected; + +#define LANG_TABLE_SELECT_EXPLICIT(TABLE, LANG) ((const char*)(pgm_read_ptr(TABLE + (LANG)))) +#define LANG_TABLE_SELECT(TABLE) LANG_TABLE_SELECT_EXPLICIT(TABLE, lang_selected) + +extern const char* const MSG_ACC_LANG_TABLE[LANG_NUM]; +#define MSG_ACC LANG_TABLE_SELECT(MSG_ACC_LANG_TABLE) +extern const char* const MSG_ACTIVE_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_ACTIVE_EXTRUDER LANG_TABLE_SELECT(MSG_ACTIVE_EXTRUDER_LANG_TABLE) +extern const char* const MSG_ADJUSTZ_LANG_TABLE[LANG_NUM]; +#define MSG_ADJUSTZ LANG_TABLE_SELECT(MSG_ADJUSTZ_LANG_TABLE) +extern const char* const MSG_AMAX_LANG_TABLE[LANG_NUM]; +#define MSG_AMAX LANG_TABLE_SELECT(MSG_AMAX_LANG_TABLE) +extern const char* const MSG_AUTHOR_LANG_TABLE[LANG_NUM]; +#define MSG_AUTHOR LANG_TABLE_SELECT(MSG_AUTHOR_LANG_TABLE) +extern const char* const MSG_AUTORETRACT_LANG_TABLE[LANG_NUM]; +#define MSG_AUTORETRACT LANG_TABLE_SELECT(MSG_AUTORETRACT_LANG_TABLE) +extern const char* const MSG_AUTOSTART_LANG_TABLE[LANG_NUM]; +#define MSG_AUTOSTART LANG_TABLE_SELECT(MSG_AUTOSTART_LANG_TABLE) +extern const char* const MSG_AUTOTEMP_LANG_TABLE[LANG_NUM]; +#define MSG_AUTOTEMP LANG_TABLE_SELECT(MSG_AUTOTEMP_LANG_TABLE) +extern const char* const MSG_AUTO_HOME_LANG_TABLE[LANG_NUM]; +#define MSG_AUTO_HOME LANG_TABLE_SELECT(MSG_AUTO_HOME_LANG_TABLE) +extern const char* const MSG_A_RETRACT_LANG_TABLE[LANG_NUM]; +#define MSG_A_RETRACT LANG_TABLE_SELECT(MSG_A_RETRACT_LANG_TABLE) +extern const char* const MSG_BABYSTEPPING_X_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEPPING_X LANG_TABLE_SELECT(MSG_BABYSTEPPING_X_LANG_TABLE) +extern const char* const MSG_BABYSTEPPING_Y_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEPPING_Y LANG_TABLE_SELECT(MSG_BABYSTEPPING_Y_LANG_TABLE) +extern const char* const MSG_BABYSTEPPING_Z_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEPPING_Z LANG_TABLE_SELECT(MSG_BABYSTEPPING_Z_LANG_TABLE) +extern const char* const MSG_BABYSTEP_X_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEP_X LANG_TABLE_SELECT(MSG_BABYSTEP_X_LANG_TABLE) +extern const char* const MSG_BABYSTEP_Y_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEP_Y LANG_TABLE_SELECT(MSG_BABYSTEP_Y_LANG_TABLE) +extern const char* const MSG_BABYSTEP_Z_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEP_Z LANG_TABLE_SELECT(MSG_BABYSTEP_Z_LANG_TABLE) +extern const char* const MSG_BED_LANG_TABLE[LANG_NUM]; +#define MSG_BED LANG_TABLE_SELECT(MSG_BED_LANG_TABLE) +extern const char* const MSG_BED_DONE_LANG_TABLE[LANG_NUM]; +#define MSG_BED_DONE LANG_TABLE_SELECT(MSG_BED_DONE_LANG_TABLE) +extern const char* const MSG_BED_HEATING_LANG_TABLE[LANG_NUM]; +#define MSG_BED_HEATING LANG_TABLE_SELECT(MSG_BED_HEATING_LANG_TABLE) +extern const char* const MSG_BEGIN_FILE_LIST_LANG_TABLE[LANG_NUM]; +#define MSG_BEGIN_FILE_LIST LANG_TABLE_SELECT(MSG_BEGIN_FILE_LIST_LANG_TABLE) +extern const char* const MSG_BROWNOUT_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_BROWNOUT_RESET LANG_TABLE_SELECT(MSG_BROWNOUT_RESET_LANG_TABLE) +extern const char* const MSG_CALIBRATE_BED_LANG_TABLE[LANG_NUM]; +#define MSG_CALIBRATE_BED LANG_TABLE_SELECT(MSG_CALIBRATE_BED_LANG_TABLE) +extern const char* const MSG_CALIBRATE_BED_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_CALIBRATE_BED_RESET LANG_TABLE_SELECT(MSG_CALIBRATE_BED_RESET_LANG_TABLE) +extern const char* const MSG_CARD_MENU_LANG_TABLE[LANG_NUM]; +#define MSG_CARD_MENU LANG_TABLE_SELECT(MSG_CARD_MENU_LANG_TABLE) +extern const char* const MSG_CHANGE_SUCCESS_LANG_TABLE[LANG_NUM]; +#define MSG_CHANGE_SUCCESS LANG_TABLE_SELECT(MSG_CHANGE_SUCCESS_LANG_TABLE) +extern const char* const MSG_CHANGING_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_CHANGING_FILAMENT LANG_TABLE_SELECT(MSG_CHANGING_FILAMENT_LANG_TABLE) +extern const char* const MSG_CNG_SDCARD_LANG_TABLE[LANG_NUM]; +#define MSG_CNG_SDCARD LANG_TABLE_SELECT(MSG_CNG_SDCARD_LANG_TABLE) +extern const char* const MSG_CONFIGURATION_VER_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIGURATION_VER LANG_TABLE_SELECT(MSG_CONFIGURATION_VER_LANG_TABLE) +extern const char* const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1 LANG_TABLE_SELECT(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1_LANG_TABLE) +extern const char* const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2 LANG_TABLE_SELECT(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2_LANG_TABLE) +extern const char* const MSG_CONTRAST_LANG_TABLE[LANG_NUM]; +#define MSG_CONTRAST LANG_TABLE_SELECT(MSG_CONTRAST_LANG_TABLE) +extern const char* const MSG_CONTROL_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL LANG_TABLE_SELECT(MSG_CONTROL_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACTF_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACTF LANG_TABLE_SELECT(MSG_CONTROL_RETRACTF_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_RECOVER_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT_RECOVER LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_RECOVER_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_RECOVERF_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT_RECOVERF LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_RECOVERF_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_RECOVER_SWAP_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT_RECOVER_SWAP LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_RECOVER_SWAP_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_SWAP_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT_SWAP LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_SWAP_LANG_TABLE) +extern const char* const MSG_CONTROL_RETRACT_ZLIFT_LANG_TABLE[LANG_NUM]; +#define MSG_CONTROL_RETRACT_ZLIFT LANG_TABLE_SELECT(MSG_CONTROL_RETRACT_ZLIFT_LANG_TABLE) +extern const char* const MSG_COOLDOWN_LANG_TABLE[LANG_NUM]; +#define MSG_COOLDOWN LANG_TABLE_SELECT(MSG_COOLDOWN_LANG_TABLE) +extern const char* const MSG_CORRECTLY_LANG_TABLE[LANG_NUM]; +#define MSG_CORRECTLY LANG_TABLE_SELECT(MSG_CORRECTLY_LANG_TABLE) +extern const char* const MSG_COUNT_X_LANG_TABLE[LANG_NUM]; +#define MSG_COUNT_X LANG_TABLE_SELECT(MSG_COUNT_X_LANG_TABLE) +extern const char* const MSG_DISABLE_STEPPERS_LANG_TABLE[LANG_NUM]; +#define MSG_DISABLE_STEPPERS LANG_TABLE_SELECT(MSG_DISABLE_STEPPERS_LANG_TABLE) +extern const char* const MSG_DWELL_LANG_TABLE[LANG_NUM]; +#define MSG_DWELL LANG_TABLE_SELECT(MSG_DWELL_LANG_TABLE) +extern const char* const MSG_E_LANG_TABLE[LANG_NUM]; +#define MSG_E LANG_TABLE_SELECT(MSG_E_LANG_TABLE) +extern const char* const MSG_ENDSTOPS_HIT_LANG_TABLE[LANG_NUM]; +#define MSG_ENDSTOPS_HIT LANG_TABLE_SELECT(MSG_ENDSTOPS_HIT_LANG_TABLE) +extern const char* const MSG_ENDSTOP_ABORT_LANG_TABLE[LANG_NUM]; +#define MSG_ENDSTOP_ABORT LANG_TABLE_SELECT(MSG_ENDSTOP_ABORT_LANG_TABLE) +extern const char* const MSG_ENDSTOP_HIT_LANG_TABLE[LANG_NUM]; +#define MSG_ENDSTOP_HIT LANG_TABLE_SELECT(MSG_ENDSTOP_HIT_LANG_TABLE) +extern const char* const MSG_ENDSTOP_OPEN_LANG_TABLE[LANG_NUM]; +#define MSG_ENDSTOP_OPEN LANG_TABLE_SELECT(MSG_ENDSTOP_OPEN_LANG_TABLE) +extern const char* const MSG_END_FILE_LIST_LANG_TABLE[LANG_NUM]; +#define MSG_END_FILE_LIST LANG_TABLE_SELECT(MSG_END_FILE_LIST_LANG_TABLE) +extern const char* const MSG_ERROR_LANG_TABLE[LANG_NUM]; +#define MSG_ERROR LANG_TABLE_SELECT(MSG_ERROR_LANG_TABLE) +extern const char* const MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_CHECKSUM_MISMATCH LANG_TABLE_SELECT(MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE) +extern const char* const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_COLD_EXTRUDE_STOP LANG_TABLE_SELECT(MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE) +extern const char* const MSG_ERR_KILLED_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_KILLED LANG_TABLE_SELECT(MSG_ERR_KILLED_LANG_TABLE) +extern const char* const MSG_ERR_LINE_NO_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_LINE_NO LANG_TABLE_SELECT(MSG_ERR_LINE_NO_LANG_TABLE) +extern const char* const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_LONG_EXTRUDE_STOP LANG_TABLE_SELECT(MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE) +extern const char* const MSG_ERR_NO_CHECKSUM_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_NO_CHECKSUM LANG_TABLE_SELECT(MSG_ERR_NO_CHECKSUM_LANG_TABLE) +extern const char* const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM LANG_TABLE_SELECT(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE) +extern const char* const MSG_ERR_NO_THERMISTORS_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_NO_THERMISTORS LANG_TABLE_SELECT(MSG_ERR_NO_THERMISTORS_LANG_TABLE) +extern const char* const MSG_ERR_STOPPED_LANG_TABLE[LANG_NUM]; +#define MSG_ERR_STOPPED LANG_TABLE_SELECT(MSG_ERR_STOPPED_LANG_TABLE) +extern const char* const MSG_ESTEPS_LANG_TABLE[LANG_NUM]; +#define MSG_ESTEPS LANG_TABLE_SELECT(MSG_ESTEPS_LANG_TABLE) +extern const char* const MSG_EXTERNAL_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_EXTERNAL_RESET LANG_TABLE_SELECT(MSG_EXTERNAL_RESET_LANG_TABLE) +extern const char* const MSG_EXTRUDE_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDE LANG_TABLE_SELECT(MSG_EXTRUDE_LANG_TABLE) +extern const char* const MSG_Enqueing_LANG_TABLE[LANG_NUM]; +#define MSG_Enqueing LANG_TABLE_SELECT(MSG_Enqueing_LANG_TABLE) +extern const char* const MSG_FACTOR_LANG_TABLE[LANG_NUM]; +#define MSG_FACTOR LANG_TABLE_SELECT(MSG_FACTOR_LANG_TABLE) +extern const char* const MSG_FAN_SPEED_LANG_TABLE[LANG_NUM]; +#define MSG_FAN_SPEED LANG_TABLE_SELECT(MSG_FAN_SPEED_LANG_TABLE) +extern const char* const MSG_FILAMENTCHANGE_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENTCHANGE LANG_TABLE_SELECT(MSG_FILAMENTCHANGE_LANG_TABLE) +extern const char* const MSG_FILAMENT_SIZE_EXTRUDER_0_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_SIZE_EXTRUDER_0 LANG_TABLE_SELECT(MSG_FILAMENT_SIZE_EXTRUDER_0_LANG_TABLE) +extern const char* const MSG_FILAMENT_SIZE_EXTRUDER_1_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_SIZE_EXTRUDER_1 LANG_TABLE_SELECT(MSG_FILAMENT_SIZE_EXTRUDER_1_LANG_TABLE) +extern const char* const MSG_FILAMENT_SIZE_EXTRUDER_2_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_SIZE_EXTRUDER_2 LANG_TABLE_SELECT(MSG_FILAMENT_SIZE_EXTRUDER_2_LANG_TABLE) +extern const char* const MSG_FILE_PRINTED_LANG_TABLE[LANG_NUM]; +#define MSG_FILE_PRINTED LANG_TABLE_SELECT(MSG_FILE_PRINTED_LANG_TABLE) +extern const char* const MSG_FILE_SAVED_LANG_TABLE[LANG_NUM]; +#define MSG_FILE_SAVED LANG_TABLE_SELECT(MSG_FILE_SAVED_LANG_TABLE) +extern const char* const MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM]; +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 LANG_TABLE_SELECT(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE) +extern const char* const MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM]; +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 LANG_TABLE_SELECT(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE) +extern const char* const MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM]; +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE3 LANG_TABLE_SELECT(MSG_FIND_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE) +extern const char* const MSG_FLOW_LANG_TABLE[LANG_NUM]; +#define MSG_FLOW LANG_TABLE_SELECT(MSG_FLOW_LANG_TABLE) +extern const char* const MSG_FLOW0_LANG_TABLE[LANG_NUM]; +#define MSG_FLOW0 LANG_TABLE_SELECT(MSG_FLOW0_LANG_TABLE) +extern const char* const MSG_FLOW1_LANG_TABLE[LANG_NUM]; +#define MSG_FLOW1 LANG_TABLE_SELECT(MSG_FLOW1_LANG_TABLE) +extern const char* const MSG_FLOW2_LANG_TABLE[LANG_NUM]; +#define MSG_FLOW2 LANG_TABLE_SELECT(MSG_FLOW2_LANG_TABLE) +extern const char* const MSG_FREE_MEMORY_LANG_TABLE[LANG_NUM]; +#define MSG_FREE_MEMORY LANG_TABLE_SELECT(MSG_FREE_MEMORY_LANG_TABLE) +extern const char* const MSG_HEATING_LANG_TABLE[LANG_NUM]; +#define MSG_HEATING LANG_TABLE_SELECT(MSG_HEATING_LANG_TABLE) +extern const char* const MSG_HEATING_COMPLETE_LANG_TABLE[LANG_NUM]; +#define MSG_HEATING_COMPLETE LANG_TABLE_SELECT(MSG_HEATING_COMPLETE_LANG_TABLE) +extern const char* const MSG_HOMEYZ_LANG_TABLE[LANG_NUM]; +#define MSG_HOMEYZ LANG_TABLE_SELECT(MSG_HOMEYZ_LANG_TABLE) +extern const char* const MSG_HOMEYZ_DONE_LANG_TABLE[LANG_NUM]; +#define MSG_HOMEYZ_DONE LANG_TABLE_SELECT(MSG_HOMEYZ_DONE_LANG_TABLE) +extern const char* const MSG_HOMEYZ_PROGRESS_LANG_TABLE[LANG_NUM]; +#define MSG_HOMEYZ_PROGRESS LANG_TABLE_SELECT(MSG_HOMEYZ_PROGRESS_LANG_TABLE) +extern const char* const MSG_HOTEND_OFFSET_LANG_TABLE[LANG_NUM]; +#define MSG_HOTEND_OFFSET LANG_TABLE_SELECT(MSG_HOTEND_OFFSET_LANG_TABLE) +extern const char* const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE[LANG_NUM]; +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 LANG_TABLE_SELECT(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_LANG_TABLE) +extern const char* const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE[LANG_NUM]; +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 LANG_TABLE_SELECT(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_LANG_TABLE) +extern const char* const MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE[LANG_NUM]; +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3 LANG_TABLE_SELECT(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3_LANG_TABLE) +extern const char* const MSG_INIT_SDCARD_LANG_TABLE[LANG_NUM]; +#define MSG_INIT_SDCARD LANG_TABLE_SELECT(MSG_INIT_SDCARD_LANG_TABLE) +extern const char* const MSG_INSERT_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_INSERT_FILAMENT LANG_TABLE_SELECT(MSG_INSERT_FILAMENT_LANG_TABLE) +extern const char* const MSG_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_KILLED_LANG_TABLE[LANG_NUM]; +#define MSG_KILLED LANG_TABLE_SELECT(MSG_KILLED_LANG_TABLE) +extern const char* const MSG_LANGUAGE_NAME_LANG_TABLE[LANG_NUM]; +#define MSG_LANGUAGE_NAME LANG_TABLE_SELECT(MSG_LANGUAGE_NAME_LANG_TABLE) +#define MSG_LANGUAGE_NAME_EXPLICIT(LANG) LANG_TABLE_SELECT_EXPLICIT(MSG_LANGUAGE_NAME_LANG_TABLE, LANG) +extern const char* const MSG_LANGUAGE_SELECT_LANG_TABLE[LANG_NUM]; +#define MSG_LANGUAGE_SELECT LANG_TABLE_SELECT(MSG_LANGUAGE_SELECT_LANG_TABLE) +#define MSG_LANGUAGE_SELECT_EXPLICIT(LANG) LANG_TABLE_SELECT_EXPLICIT(MSG_LANGUAGE_SELECT_LANG_TABLE, LANG) +extern const char* const MSG_LOADING_COLOR_LANG_TABLE[LANG_NUM]; +#define MSG_LOADING_COLOR LANG_TABLE_SELECT(MSG_LOADING_COLOR_LANG_TABLE) +extern const char* const MSG_LOADING_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_LOADING_FILAMENT LANG_TABLE_SELECT(MSG_LOADING_FILAMENT_LANG_TABLE) +extern const char* const MSG_LOAD_EPROM_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_EPROM LANG_TABLE_SELECT(MSG_LOAD_EPROM_LANG_TABLE) +extern const char* const MSG_LOAD_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_FILAMENT LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_LANG_TABLE) +extern const char* const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M104_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M104_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M105_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M105_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M109_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M109_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_M115_REPORT_LANG_TABLE[LANG_NUM]; +#define MSG_M115_REPORT LANG_TABLE_SELECT(MSG_M115_REPORT_LANG_TABLE) +extern const char* const MSG_M119_REPORT_LANG_TABLE[LANG_NUM]; +#define MSG_M119_REPORT LANG_TABLE_SELECT(MSG_M119_REPORT_LANG_TABLE) +extern const char* const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M200_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M200_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M218_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M218_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_M221_INVALID_EXTRUDER LANG_TABLE_SELECT(MSG_M221_INVALID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_MAIN_LANG_TABLE[LANG_NUM]; +#define MSG_MAIN LANG_TABLE_SELECT(MSG_MAIN_LANG_TABLE) +extern const char* const MSG_MAX_LANG_TABLE[LANG_NUM]; +#define MSG_MAX LANG_TABLE_SELECT(MSG_MAX_LANG_TABLE) +extern const char* const MSG_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_MIN LANG_TABLE_SELECT(MSG_MIN_LANG_TABLE) +extern const char* const MSG_MOTION_LANG_TABLE[LANG_NUM]; +#define MSG_MOTION LANG_TABLE_SELECT(MSG_MOTION_LANG_TABLE) +extern const char* const MSG_MOVE_01MM_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_01MM LANG_TABLE_SELECT(MSG_MOVE_01MM_LANG_TABLE) +extern const char* const MSG_MOVE_10MM_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_10MM LANG_TABLE_SELECT(MSG_MOVE_10MM_LANG_TABLE) +extern const char* const MSG_MOVE_1MM_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_1MM LANG_TABLE_SELECT(MSG_MOVE_1MM_LANG_TABLE) +extern const char* const MSG_MOVE_AXIS_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_AXIS LANG_TABLE_SELECT(MSG_MOVE_AXIS_LANG_TABLE) +extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1 LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1_LANG_TABLE) +extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2 LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2_LANG_TABLE) +extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3 LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3_LANG_TABLE) +extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4 LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4_LANG_TABLE) +extern const char* const MSG_MOVE_E_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_E LANG_TABLE_SELECT(MSG_MOVE_E_LANG_TABLE) +extern const char* const MSG_MOVE_E1_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_E1 LANG_TABLE_SELECT(MSG_MOVE_E1_LANG_TABLE) +extern const char* const MSG_MOVE_E2_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_E2 LANG_TABLE_SELECT(MSG_MOVE_E2_LANG_TABLE) +extern const char* const MSG_MOVE_X_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_X LANG_TABLE_SELECT(MSG_MOVE_X_LANG_TABLE) +extern const char* const MSG_MOVE_Y_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_Y LANG_TABLE_SELECT(MSG_MOVE_Y_LANG_TABLE) +extern const char* const MSG_MOVE_Z_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_Z LANG_TABLE_SELECT(MSG_MOVE_Z_LANG_TABLE) +extern const char* const MSG_NO_LANG_TABLE[LANG_NUM]; +#define MSG_NO LANG_TABLE_SELECT(MSG_NO_LANG_TABLE) +extern const char* const MSG_NOT_COLOR_LANG_TABLE[LANG_NUM]; +#define MSG_NOT_COLOR LANG_TABLE_SELECT(MSG_NOT_COLOR_LANG_TABLE) +extern const char* const MSG_NOT_LOADED_LANG_TABLE[LANG_NUM]; +#define MSG_NOT_LOADED LANG_TABLE_SELECT(MSG_NOT_LOADED_LANG_TABLE) +extern const char* const MSG_NOZZLE_LANG_TABLE[LANG_NUM]; +#define MSG_NOZZLE LANG_TABLE_SELECT(MSG_NOZZLE_LANG_TABLE) +extern const char* const MSG_NOZZLE1_LANG_TABLE[LANG_NUM]; +#define MSG_NOZZLE1 LANG_TABLE_SELECT(MSG_NOZZLE1_LANG_TABLE) +extern const char* const MSG_NOZZLE2_LANG_TABLE[LANG_NUM]; +#define MSG_NOZZLE2 LANG_TABLE_SELECT(MSG_NOZZLE2_LANG_TABLE) +extern const char* const MSG_NO_CARD_LANG_TABLE[LANG_NUM]; +#define MSG_NO_CARD LANG_TABLE_SELECT(MSG_NO_CARD_LANG_TABLE) +extern const char* const MSG_NO_MOVE_LANG_TABLE[LANG_NUM]; +#define MSG_NO_MOVE LANG_TABLE_SELECT(MSG_NO_MOVE_LANG_TABLE) +extern const char* const MSG_OFF_LANG_TABLE[LANG_NUM]; +#define MSG_OFF LANG_TABLE_SELECT(MSG_OFF_LANG_TABLE) +extern const char* const MSG_OK_LANG_TABLE[LANG_NUM]; +#define MSG_OK LANG_TABLE_SELECT(MSG_OK_LANG_TABLE) +extern const char* const MSG_ON_LANG_TABLE[LANG_NUM]; +#define MSG_ON LANG_TABLE_SELECT(MSG_ON_LANG_TABLE) +extern const char* const MSG_PAUSE_PRINT_LANG_TABLE[LANG_NUM]; +#define MSG_PAUSE_PRINT LANG_TABLE_SELECT(MSG_PAUSE_PRINT_LANG_TABLE) +extern const char* const MSG_PICK_Z_LANG_TABLE[LANG_NUM]; +#define MSG_PICK_Z LANG_TABLE_SELECT(MSG_PICK_Z_LANG_TABLE) +extern const char* const MSG_PID_C_LANG_TABLE[LANG_NUM]; +#define MSG_PID_C LANG_TABLE_SELECT(MSG_PID_C_LANG_TABLE) +extern const char* const MSG_PID_D_LANG_TABLE[LANG_NUM]; +#define MSG_PID_D LANG_TABLE_SELECT(MSG_PID_D_LANG_TABLE) +extern const char* const MSG_PID_I_LANG_TABLE[LANG_NUM]; +#define MSG_PID_I LANG_TABLE_SELECT(MSG_PID_I_LANG_TABLE) +extern const char* const MSG_PID_P_LANG_TABLE[LANG_NUM]; +#define MSG_PID_P LANG_TABLE_SELECT(MSG_PID_P_LANG_TABLE) +extern const char* const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[LANG_NUM]; +#define MSG_PLANNER_BUFFER_BYTES LANG_TABLE_SELECT(MSG_PLANNER_BUFFER_BYTES_LANG_TABLE) +extern const char* const MSG_PLEASE_WAIT_LANG_TABLE[LANG_NUM]; +#define MSG_PLEASE_WAIT LANG_TABLE_SELECT(MSG_PLEASE_WAIT_LANG_TABLE) +extern const char* const MSG_POSITION_UNKNOWN_LANG_TABLE[LANG_NUM]; +#define MSG_POSITION_UNKNOWN LANG_TABLE_SELECT(MSG_POSITION_UNKNOWN_LANG_TABLE) +extern const char* const MSG_POWERUP_LANG_TABLE[LANG_NUM]; +#define MSG_POWERUP LANG_TABLE_SELECT(MSG_POWERUP_LANG_TABLE) +extern const char* const MSG_PREHEAT_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT LANG_TABLE_SELECT(MSG_PREHEAT_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS LANG_TABLE_SELECT(MSG_PREHEAT_ABS_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS0_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS0 LANG_TABLE_SELECT(MSG_PREHEAT_ABS0_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS012_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS012 LANG_TABLE_SELECT(MSG_PREHEAT_ABS012_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS1_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS1 LANG_TABLE_SELECT(MSG_PREHEAT_ABS1_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS2_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS2 LANG_TABLE_SELECT(MSG_PREHEAT_ABS2_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS_BEDONLY_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS_BEDONLY LANG_TABLE_SELECT(MSG_PREHEAT_ABS_BEDONLY_LANG_TABLE) +extern const char* const MSG_PREHEAT_ABS_SETTINGS_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_ABS_SETTINGS LANG_TABLE_SELECT(MSG_PREHEAT_ABS_SETTINGS_LANG_TABLE) +extern const char* const MSG_PREHEAT_NOZZLE_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_NOZZLE LANG_TABLE_SELECT(MSG_PREHEAT_NOZZLE_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA LANG_TABLE_SELECT(MSG_PREHEAT_PLA_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA0_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA0 LANG_TABLE_SELECT(MSG_PREHEAT_PLA0_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA012_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA012 LANG_TABLE_SELECT(MSG_PREHEAT_PLA012_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA1_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA1 LANG_TABLE_SELECT(MSG_PREHEAT_PLA1_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA2_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA2 LANG_TABLE_SELECT(MSG_PREHEAT_PLA2_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA_BEDONLY_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA_BEDONLY LANG_TABLE_SELECT(MSG_PREHEAT_PLA_BEDONLY_LANG_TABLE) +extern const char* const MSG_PREHEAT_PLA_SETTINGS_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_PLA_SETTINGS LANG_TABLE_SELECT(MSG_PREHEAT_PLA_SETTINGS_LANG_TABLE) +extern const char* const MSG_PREPARE_LANG_TABLE[LANG_NUM]; +#define MSG_PREPARE LANG_TABLE_SELECT(MSG_PREPARE_LANG_TABLE) +extern const char* const MSG_PRESS_LANG_TABLE[LANG_NUM]; +#define MSG_PRESS LANG_TABLE_SELECT(MSG_PRESS_LANG_TABLE) +extern const char* const MSG_PRINT_ABORTED_LANG_TABLE[LANG_NUM]; +#define MSG_PRINT_ABORTED LANG_TABLE_SELECT(MSG_PRINT_ABORTED_LANG_TABLE) +extern const char* const MSG_PRUSA3D_LANG_TABLE[LANG_NUM]; +#define MSG_PRUSA3D LANG_TABLE_SELECT(MSG_PRUSA3D_LANG_TABLE) +extern const char* const MSG_PRUSA3D_FORUM_LANG_TABLE[LANG_NUM]; +#define MSG_PRUSA3D_FORUM LANG_TABLE_SELECT(MSG_PRUSA3D_FORUM_LANG_TABLE) +extern const char* const MSG_PRUSA3D_HOWTO_LANG_TABLE[LANG_NUM]; +#define MSG_PRUSA3D_HOWTO LANG_TABLE_SELECT(MSG_PRUSA3D_HOWTO_LANG_TABLE) +extern const char* const MSG_REBOOT_LANG_TABLE[LANG_NUM]; +#define MSG_REBOOT LANG_TABLE_SELECT(MSG_REBOOT_LANG_TABLE) +extern const char* const MSG_RECTRACT_LANG_TABLE[LANG_NUM]; +#define MSG_RECTRACT LANG_TABLE_SELECT(MSG_RECTRACT_LANG_TABLE) +extern const char* const MSG_REFRESH_LANG_TABLE[LANG_NUM]; +#define MSG_REFRESH LANG_TABLE_SELECT(MSG_REFRESH_LANG_TABLE) +extern const char* const MSG_RESEND_LANG_TABLE[LANG_NUM]; +#define MSG_RESEND LANG_TABLE_SELECT(MSG_RESEND_LANG_TABLE) +extern const char* const MSG_RESTORE_FAILSAFE_LANG_TABLE[LANG_NUM]; +#define MSG_RESTORE_FAILSAFE LANG_TABLE_SELECT(MSG_RESTORE_FAILSAFE_LANG_TABLE) +extern const char* const MSG_RESUME_PRINT_LANG_TABLE[LANG_NUM]; +#define MSG_RESUME_PRINT LANG_TABLE_SELECT(MSG_RESUME_PRINT_LANG_TABLE) +extern const char* const MSG_RESUMING_LANG_TABLE[LANG_NUM]; +#define MSG_RESUMING LANG_TABLE_SELECT(MSG_RESUMING_LANG_TABLE) +extern const char* const MSG_RETRACT_LANG_TABLE[LANG_NUM]; +#define MSG_RETRACT LANG_TABLE_SELECT(MSG_RETRACT_LANG_TABLE) +extern const char* const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[LANG_NUM]; +#define MSG_SD_CANT_ENTER_SUBDIR LANG_TABLE_SELECT(MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE) +extern const char* const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[LANG_NUM]; +#define MSG_SD_CANT_OPEN_SUBDIR LANG_TABLE_SELECT(MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE) +extern const char* const MSG_SD_CARD_OK_LANG_TABLE[LANG_NUM]; +#define MSG_SD_CARD_OK LANG_TABLE_SELECT(MSG_SD_CARD_OK_LANG_TABLE) +extern const char* const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[LANG_NUM]; +#define MSG_SD_ERR_WRITE_TO_FILE LANG_TABLE_SELECT(MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE) +extern const char* const MSG_SD_FILE_OPENED_LANG_TABLE[LANG_NUM]; +#define MSG_SD_FILE_OPENED LANG_TABLE_SELECT(MSG_SD_FILE_OPENED_LANG_TABLE) +extern const char* const MSG_SD_FILE_SELECTED_LANG_TABLE[LANG_NUM]; +#define MSG_SD_FILE_SELECTED LANG_TABLE_SELECT(MSG_SD_FILE_SELECTED_LANG_TABLE) +extern const char* const MSG_SD_INIT_FAIL_LANG_TABLE[LANG_NUM]; +#define MSG_SD_INIT_FAIL LANG_TABLE_SELECT(MSG_SD_INIT_FAIL_LANG_TABLE) +extern const char* const MSG_SD_INSERTED_LANG_TABLE[LANG_NUM]; +#define MSG_SD_INSERTED LANG_TABLE_SELECT(MSG_SD_INSERTED_LANG_TABLE) +extern const char* const MSG_SD_NOT_PRINTING_LANG_TABLE[LANG_NUM]; +#define MSG_SD_NOT_PRINTING LANG_TABLE_SELECT(MSG_SD_NOT_PRINTING_LANG_TABLE) +extern const char* const MSG_SD_OPENROOT_FAIL_LANG_TABLE[LANG_NUM]; +#define MSG_SD_OPENROOT_FAIL LANG_TABLE_SELECT(MSG_SD_OPENROOT_FAIL_LANG_TABLE) +extern const char* const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[LANG_NUM]; +#define MSG_SD_OPEN_FILE_FAIL LANG_TABLE_SELECT(MSG_SD_OPEN_FILE_FAIL_LANG_TABLE) +extern const char* const MSG_SD_PRINTING_BYTE_LANG_TABLE[LANG_NUM]; +#define MSG_SD_PRINTING_BYTE LANG_TABLE_SELECT(MSG_SD_PRINTING_BYTE_LANG_TABLE) +extern const char* const MSG_SD_REMOVED_LANG_TABLE[LANG_NUM]; +#define MSG_SD_REMOVED LANG_TABLE_SELECT(MSG_SD_REMOVED_LANG_TABLE) +extern const char* const MSG_SD_SIZE_LANG_TABLE[LANG_NUM]; +#define MSG_SD_SIZE LANG_TABLE_SELECT(MSG_SD_SIZE_LANG_TABLE) +extern const char* const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[LANG_NUM]; +#define MSG_SD_VOL_INIT_FAIL LANG_TABLE_SELECT(MSG_SD_VOL_INIT_FAIL_LANG_TABLE) +extern const char* const MSG_SD_WORKDIR_FAIL_LANG_TABLE[LANG_NUM]; +#define MSG_SD_WORKDIR_FAIL LANG_TABLE_SELECT(MSG_SD_WORKDIR_FAIL_LANG_TABLE) +extern const char* const MSG_SD_WRITE_TO_FILE_LANG_TABLE[LANG_NUM]; +#define MSG_SD_WRITE_TO_FILE LANG_TABLE_SELECT(MSG_SD_WRITE_TO_FILE_LANG_TABLE) +extern const char* const MSG_SELFTEST_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST LANG_TABLE_SELECT(MSG_SELFTEST_LANG_TABLE) +extern const char* const MSG_SELFTEST_BEDHEATER_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_BEDHEATER LANG_TABLE_SELECT(MSG_SELFTEST_BEDHEATER_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_ALLCORRECT_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_ALLCORRECT LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_ALLCORRECT_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_BED_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_BED LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_BED_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_ENDSTOPS_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_ENDSTOPS LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_ENDSTOPS_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_HOTEND_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_HOTEND LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_HOTEND_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_X_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_X LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_X_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_Y_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_Y LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_Y_LANG_TABLE) +extern const char* const MSG_SELFTEST_CHECK_Z_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_CHECK_Z LANG_TABLE_SELECT(MSG_SELFTEST_CHECK_Z_LANG_TABLE) +extern const char* const MSG_SELFTEST_ENDSTOP_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_ENDSTOP LANG_TABLE_SELECT(MSG_SELFTEST_ENDSTOP_LANG_TABLE) +extern const char* const MSG_SELFTEST_ENDSTOPS_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_ENDSTOPS LANG_TABLE_SELECT(MSG_SELFTEST_ENDSTOPS_LANG_TABLE) +extern const char* const MSG_SELFTEST_ENDSTOP_NOTHIT_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_ENDSTOP_NOTHIT LANG_TABLE_SELECT(MSG_SELFTEST_ENDSTOP_NOTHIT_LANG_TABLE) +extern const char* const MSG_SELFTEST_ERROR_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_ERROR LANG_TABLE_SELECT(MSG_SELFTEST_ERROR_LANG_TABLE) +extern const char* const MSG_SELFTEST_FAILED_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_FAILED LANG_TABLE_SELECT(MSG_SELFTEST_FAILED_LANG_TABLE) +extern const char* const MSG_SELFTEST_HEATERTHERMISTOR_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_HEATERTHERMISTOR LANG_TABLE_SELECT(MSG_SELFTEST_HEATERTHERMISTOR_LANG_TABLE) +extern const char* const MSG_SELFTEST_MOTOR_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_MOTOR LANG_TABLE_SELECT(MSG_SELFTEST_MOTOR_LANG_TABLE) +extern const char* const MSG_SELFTEST_NOTCONNECTED_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_NOTCONNECTED LANG_TABLE_SELECT(MSG_SELFTEST_NOTCONNECTED_LANG_TABLE) +extern const char* const MSG_SELFTEST_OK_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_OK LANG_TABLE_SELECT(MSG_SELFTEST_OK_LANG_TABLE) +extern const char* const MSG_SELFTEST_PLEASECHECK_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_PLEASECHECK LANG_TABLE_SELECT(MSG_SELFTEST_PLEASECHECK_LANG_TABLE) +extern const char* const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_START LANG_TABLE_SELECT(MSG_SELFTEST_START_LANG_TABLE) +extern const char* const MSG_SELFTEST_WIRINGERROR_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_WIRINGERROR LANG_TABLE_SELECT(MSG_SELFTEST_WIRINGERROR_LANG_TABLE) +extern const char* const MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE[LANG_NUM]; +#define MSG_SERIAL_ERROR_MENU_STRUCTURE LANG_TABLE_SELECT(MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE) +extern const char* const MSG_SETTINGS_LANG_TABLE[LANG_NUM]; +#define MSG_SETTINGS LANG_TABLE_SELECT(MSG_SETTINGS_LANG_TABLE) +extern const char* const MSG_SET_HOME_OFFSETS_LANG_TABLE[LANG_NUM]; +#define MSG_SET_HOME_OFFSETS LANG_TABLE_SELECT(MSG_SET_HOME_OFFSETS_LANG_TABLE) +extern const char* const MSG_SET_ORIGIN_LANG_TABLE[LANG_NUM]; +#define MSG_SET_ORIGIN LANG_TABLE_SELECT(MSG_SET_ORIGIN_LANG_TABLE) +extern const char* const MSG_SILENT_MODE_OFF_LANG_TABLE[LANG_NUM]; +#define MSG_SILENT_MODE_OFF LANG_TABLE_SELECT(MSG_SILENT_MODE_OFF_LANG_TABLE) +extern const char* const MSG_SILENT_MODE_ON_LANG_TABLE[LANG_NUM]; +#define MSG_SILENT_MODE_ON LANG_TABLE_SELECT(MSG_SILENT_MODE_ON_LANG_TABLE) +extern const char* const MSG_SOFTWARE_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_SOFTWARE_RESET LANG_TABLE_SELECT(MSG_SOFTWARE_RESET_LANG_TABLE) +extern const char* const MSG_SPEED_LANG_TABLE[LANG_NUM]; +#define MSG_SPEED LANG_TABLE_SELECT(MSG_SPEED_LANG_TABLE) +extern const char* const MSG_STATISTICS_LANG_TABLE[LANG_NUM]; +#define MSG_STATISTICS LANG_TABLE_SELECT(MSG_STATISTICS_LANG_TABLE) +extern const char* const MSG_STATS_FILAMENTUSED_LANG_TABLE[LANG_NUM]; +#define MSG_STATS_FILAMENTUSED LANG_TABLE_SELECT(MSG_STATS_FILAMENTUSED_LANG_TABLE) +extern const char* const MSG_STATS_PRINTTIME_LANG_TABLE[LANG_NUM]; +#define MSG_STATS_PRINTTIME LANG_TABLE_SELECT(MSG_STATS_PRINTTIME_LANG_TABLE) +extern const char* const MSG_STATS_TOTALFILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_STATS_TOTALFILAMENT LANG_TABLE_SELECT(MSG_STATS_TOTALFILAMENT_LANG_TABLE) +extern const char* const MSG_STATS_TOTALPRINTTIME_LANG_TABLE[LANG_NUM]; +#define MSG_STATS_TOTALPRINTTIME LANG_TABLE_SELECT(MSG_STATS_TOTALPRINTTIME_LANG_TABLE) +extern const char* const MSG_STEPPER_TOO_HIGH_LANG_TABLE[LANG_NUM]; +#define MSG_STEPPER_TOO_HIGH LANG_TABLE_SELECT(MSG_STEPPER_TOO_HIGH_LANG_TABLE) +extern const char* const MSG_STOPPED_LANG_TABLE[LANG_NUM]; +#define MSG_STOPPED LANG_TABLE_SELECT(MSG_STOPPED_LANG_TABLE) +extern const char* const MSG_STOP_PRINT_LANG_TABLE[LANG_NUM]; +#define MSG_STOP_PRINT LANG_TABLE_SELECT(MSG_STOP_PRINT_LANG_TABLE) +extern const char* const MSG_STORE_EPROM_LANG_TABLE[LANG_NUM]; +#define MSG_STORE_EPROM LANG_TABLE_SELECT(MSG_STORE_EPROM_LANG_TABLE) +extern const char* const MSG_SUPPORT_LANG_TABLE[LANG_NUM]; +#define MSG_SUPPORT LANG_TABLE_SELECT(MSG_SUPPORT_LANG_TABLE) +extern const char* const MSG_SWITCH_PS_OFF_LANG_TABLE[LANG_NUM]; +#define MSG_SWITCH_PS_OFF LANG_TABLE_SELECT(MSG_SWITCH_PS_OFF_LANG_TABLE) +extern const char* const MSG_SWITCH_PS_ON_LANG_TABLE[LANG_NUM]; +#define MSG_SWITCH_PS_ON LANG_TABLE_SELECT(MSG_SWITCH_PS_ON_LANG_TABLE) +extern const char* const MSG_TAKE_EFFECT_LANG_TABLE[LANG_NUM]; +#define MSG_TAKE_EFFECT LANG_TABLE_SELECT(MSG_TAKE_EFFECT_LANG_TABLE) +extern const char* const MSG_TEMPERATURE_LANG_TABLE[LANG_NUM]; +#define MSG_TEMPERATURE LANG_TABLE_SELECT(MSG_TEMPERATURE_LANG_TABLE) +extern const char* const MSG_TUNE_LANG_TABLE[LANG_NUM]; +#define MSG_TUNE LANG_TABLE_SELECT(MSG_TUNE_LANG_TABLE) +extern const char* const MSG_UNKNOWN_COMMAND_LANG_TABLE[LANG_NUM]; +#define MSG_UNKNOWN_COMMAND LANG_TABLE_SELECT(MSG_UNKNOWN_COMMAND_LANG_TABLE) +extern const char* const MSG_UNLOAD_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_FILAMENT LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_LANG_TABLE) +extern const char* const MSG_USB_PRINTING_LANG_TABLE[LANG_NUM]; +#define MSG_USB_PRINTING LANG_TABLE_SELECT(MSG_USB_PRINTING_LANG_TABLE) +extern const char* const MSG_USERWAIT_LANG_TABLE[LANG_NUM]; +#define MSG_USERWAIT LANG_TABLE_SELECT(MSG_USERWAIT_LANG_TABLE) +extern const char* const MSG_VE_JERK_LANG_TABLE[LANG_NUM]; +#define MSG_VE_JERK LANG_TABLE_SELECT(MSG_VE_JERK_LANG_TABLE) +extern const char* const MSG_VMAX_LANG_TABLE[LANG_NUM]; +#define MSG_VMAX LANG_TABLE_SELECT(MSG_VMAX_LANG_TABLE) +extern const char* const MSG_VMIN_LANG_TABLE[LANG_NUM]; +#define MSG_VMIN LANG_TABLE_SELECT(MSG_VMIN_LANG_TABLE) +extern const char* const MSG_VOLUMETRIC_LANG_TABLE[LANG_NUM]; +#define MSG_VOLUMETRIC LANG_TABLE_SELECT(MSG_VOLUMETRIC_LANG_TABLE) +extern const char* const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[LANG_NUM]; +#define MSG_VOLUMETRIC_ENABLED LANG_TABLE_SELECT(MSG_VOLUMETRIC_ENABLED_LANG_TABLE) +extern const char* const MSG_VTRAV_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_VTRAV_MIN LANG_TABLE_SELECT(MSG_VTRAV_MIN_LANG_TABLE) +extern const char* const MSG_VXY_JERK_LANG_TABLE[LANG_NUM]; +#define MSG_VXY_JERK LANG_TABLE_SELECT(MSG_VXY_JERK_LANG_TABLE) +extern const char* const MSG_VZ_JERK_LANG_TABLE[LANG_NUM]; +#define MSG_VZ_JERK LANG_TABLE_SELECT(MSG_VZ_JERK_LANG_TABLE) +extern const char* const MSG_WATCH_LANG_TABLE[LANG_NUM]; +#define MSG_WATCH LANG_TABLE_SELECT(MSG_WATCH_LANG_TABLE) +extern const char* const MSG_WATCHDOG_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_WATCHDOG_RESET LANG_TABLE_SELECT(MSG_WATCHDOG_RESET_LANG_TABLE) +extern const char* const MSG_X_LANG_TABLE[LANG_NUM]; +#define MSG_X LANG_TABLE_SELECT(MSG_X_LANG_TABLE) +extern const char* const MSG_XSTEPS_LANG_TABLE[LANG_NUM]; +#define MSG_XSTEPS LANG_TABLE_SELECT(MSG_XSTEPS_LANG_TABLE) +extern const char* const MSG_X_MAX_LANG_TABLE[LANG_NUM]; +#define MSG_X_MAX LANG_TABLE_SELECT(MSG_X_MAX_LANG_TABLE) +extern const char* const MSG_X_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_X_MIN LANG_TABLE_SELECT(MSG_X_MIN_LANG_TABLE) +extern const char* const MSG_Y_LANG_TABLE[LANG_NUM]; +#define MSG_Y LANG_TABLE_SELECT(MSG_Y_LANG_TABLE) +extern const char* const MSG_YES_LANG_TABLE[LANG_NUM]; +#define MSG_YES LANG_TABLE_SELECT(MSG_YES_LANG_TABLE) +extern const char* const MSG_YSTEPS_LANG_TABLE[LANG_NUM]; +#define MSG_YSTEPS LANG_TABLE_SELECT(MSG_YSTEPS_LANG_TABLE) +extern const char* const MSG_Y_MAX_LANG_TABLE[LANG_NUM]; +#define MSG_Y_MAX LANG_TABLE_SELECT(MSG_Y_MAX_LANG_TABLE) +extern const char* const MSG_Y_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_Y_MIN LANG_TABLE_SELECT(MSG_Y_MIN_LANG_TABLE) +extern const char* const MSG_Z_LANG_TABLE[LANG_NUM]; +#define MSG_Z LANG_TABLE_SELECT(MSG_Z_LANG_TABLE) +extern const char* const MSG_ZPROBE_OUT_LANG_TABLE[LANG_NUM]; +#define MSG_ZPROBE_OUT LANG_TABLE_SELECT(MSG_ZPROBE_OUT_LANG_TABLE) +extern const char* const MSG_ZPROBE_ZOFFSET_LANG_TABLE[LANG_NUM]; +#define MSG_ZPROBE_ZOFFSET LANG_TABLE_SELECT(MSG_ZPROBE_ZOFFSET_LANG_TABLE) +extern const char* const MSG_ZSTEPS_LANG_TABLE[LANG_NUM]; +#define MSG_ZSTEPS LANG_TABLE_SELECT(MSG_ZSTEPS_LANG_TABLE) +extern const char* const MSG_Z_MAX_LANG_TABLE[LANG_NUM]; +#define MSG_Z_MAX LANG_TABLE_SELECT(MSG_Z_MAX_LANG_TABLE) +extern const char* const MSG_Z_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_Z_MIN LANG_TABLE_SELECT(MSG_Z_MIN_LANG_TABLE) +extern const char* const WELCOME_MSG_LANG_TABLE[LANG_NUM]; +#define WELCOME_MSG LANG_TABLE_SELECT(WELCOME_MSG_LANG_TABLE) + +extern char* CAT2(const char *s1,const char *s2); +extern char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4); + +#endif //LANGUAGE_ALL.H diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 0f13f7fb..6c256f9c 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -271,6 +271,22 @@ #define MSG_HOMEYZ_PROGRESS "Calibrating Z" #define MSG_HOMEYZ_DONE "Calibration done" - +#define MSG_CALIBRATE_BED "Calibrate bed" +#define MSG_CALIBRATE_BED_RESET "Reset bed calibration" + +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1 "Calibrating the machine." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2 "Please move the Z carriage up" +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3 "to the end stoppers." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4 "Click when done." + +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1 "Are both left and right Z carriages" +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2 "touching the end stops?" + +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Searching calibration" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 "point " +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE3 "of 4" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Improving calibration" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 "point " +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3 "of 9" #endif // LANGUAGE_EN_H diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp new file mode 100644 index 00000000..f76d3ec4 --- /dev/null +++ b/Firmware/mesh_bed_calibration.cpp @@ -0,0 +1,761 @@ +#include "Marlin.h" +#include "Configuration.h" +#include "language_all.h" +#include "mesh_bed_calibration.h" +#include "mesh_bed_leveling.h" +#include "stepper.h" +#include "ultralcd.h" +// #include "qr_solve.h" + +extern float home_retract_mm_ext(int axis); + +static inline void go_xyz(float x, float y, float z, float fr) +{ + plan_buffer_line(x, y, z, current_position[E_AXIS], fr, active_extruder); + st_synchronize(); +} + +static inline void go_xy(float x, float y, float fr) +{ + plan_buffer_line(x, y, current_position[Z_AXIS], current_position[E_AXIS], fr, active_extruder); + st_synchronize(); +} + +static inline void go_to_current(float fr) +{ + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr, active_extruder); + st_synchronize(); +} + +static inline void update_current_position_xyz() +{ + current_position[X_AXIS] = st_get_position_mm(X_AXIS); + current_position[Y_AXIS] = st_get_position_mm(Y_AXIS); + current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); + plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); +} + +// At the current position, find the Z stop. +inline void find_bed_induction_sensor_point_z() +{ + bool endstops_enabled = enable_endstops(true); + bool endstop_z_enabled = enable_z_endstop(false); + + // move down until you find the bed + current_position[Z_AXIS] = -10; + go_to_current(homing_feedrate[Z_AXIS]/60); + // we have to let the planner know where we are right now as it is not where we said to go. + update_current_position_xyz(); + + // move up the retract distance + current_position[Z_AXIS] += home_retract_mm_ext(Z_AXIS); + go_to_current(homing_feedrate[Z_AXIS]/60); + + // move back down slowly to find bed + current_position[Z_AXIS] -= home_retract_mm_ext(Z_AXIS) * 2; + go_to_current(homing_feedrate[Z_AXIS]/(4*60)); + // we have to let the planner know where we are right now as it is not where we said to go. + update_current_position_xyz(); + + enable_endstops(endstops_enabled); + enable_z_endstop(endstop_z_enabled); +} + +// Search around the current_position[X,Y], +// look for the induction sensor response. +// Adjust the current_position[X,Y,Z] to the center of the target dot and its response Z coordinate. +#define FIND_BED_INDUCTION_SENSOR_POINT_X_RADIUS (8.f) +#define FIND_BED_INDUCTION_SENSOR_POINT_Y_RADIUS (6.f) +#define FIND_BED_INDUCTION_SENSOR_POINT_XY_STEP (1.f) +#define FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP (0.5f) +inline bool find_bed_induction_sensor_point_xy() +{ + float feedrate = homing_feedrate[X_AXIS] / 60.f; + bool found = false; + + { + float x0 = current_position[X_AXIS] - FIND_BED_INDUCTION_SENSOR_POINT_X_RADIUS; + float x1 = current_position[X_AXIS] + FIND_BED_INDUCTION_SENSOR_POINT_X_RADIUS; + float y0 = current_position[Y_AXIS] - FIND_BED_INDUCTION_SENSOR_POINT_Y_RADIUS; + float y1 = current_position[Y_AXIS] + FIND_BED_INDUCTION_SENSOR_POINT_Y_RADIUS; + uint8_t nsteps_y; + uint8_t i; + if (x0 < X_MIN_POS) + x0 = X_MIN_POS; + if (x1 > X_MAX_POS) + x1 = X_MAX_POS; + if (y0 < Y_MIN_POS) + y0 = Y_MIN_POS; + if (y1 > Y_MAX_POS) + y1 = Y_MAX_POS; + nsteps_y = int(ceil((y1 - y0) / FIND_BED_INDUCTION_SENSOR_POINT_XY_STEP)); + + enable_endstops(false); + bool dir_positive = true; + +// go_xyz(current_position[X_AXIS], current_position[Y_AXIS], MESH_HOME_Z_SEARCH, homing_feedrate[Z_AXIS]/60); + go_xyz(x0, y0, current_position[Z_AXIS], feedrate); + // Continously lower the Z axis. + endstops_hit_on_purpose(); + enable_z_endstop(true); + while (current_position[Z_AXIS] > -10.f) { + // Do nsteps_y zig-zag movements. + current_position[Y_AXIS] = y0; + for (i = 0; i < nsteps_y; current_position[Y_AXIS] += (y1 - y0) / float(nsteps_y - 1), ++ i) { + // Run with a slightly decreasing Z axis, zig-zag movement. Stop at the Z end-stop. + current_position[Z_AXIS] -= FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP / float(nsteps_y); + go_xyz(dir_positive ? x1 : x0, current_position[Y_AXIS], current_position[Z_AXIS], feedrate); + dir_positive = ! dir_positive; + if (endstop_z_hit_on_purpose()) + goto endloop; + } + for (i = 0; i < nsteps_y; current_position[Y_AXIS] -= (y1 - y0) / float(nsteps_y - 1), ++ i) { + // Run with a slightly decreasing Z axis, zig-zag movement. Stop at the Z end-stop. + current_position[Z_AXIS] -= FIND_BED_INDUCTION_SENSOR_POINT_Z_STEP / float(nsteps_y); + go_xyz(dir_positive ? x1 : x0, current_position[Y_AXIS], current_position[Z_AXIS], feedrate); + dir_positive = ! dir_positive; + if (endstop_z_hit_on_purpose()) + goto endloop; + } + } + endloop: +// SERIAL_ECHOLN("First hit"); + + // we have to let the planner know where we are right now as it is not where we said to go. + update_current_position_xyz(); + + // Search in this plane for the first hit. Zig-zag first in X, then in Y axis. + for (int8_t iter = 0; iter < 3; ++ iter) { + if (iter > 0) { + // Slightly lower the Z axis to get a reliable trigger. + current_position[Z_AXIS] -= 0.02f; + go_xyz(current_position[X_AXIS], current_position[Y_AXIS], MESH_HOME_Z_SEARCH, homing_feedrate[Z_AXIS]/60); + } + + // Do nsteps_y zig-zag movements. + float a, b; + enable_endstops(false); + enable_z_endstop(false); + current_position[Y_AXIS] = y0; + go_xy(x0, current_position[Y_AXIS], feedrate); + enable_z_endstop(true); + found = false; + for (i = 0, dir_positive = true; i < nsteps_y; current_position[Y_AXIS] += (y1 - y0) / float(nsteps_y - 1), ++ i, dir_positive = ! dir_positive) { + go_xy(dir_positive ? x1 : x0, current_position[Y_AXIS], feedrate); + if (endstop_z_hit_on_purpose()) { + found = true; + break; + } + } + update_current_position_xyz(); + if (! found) { +// SERIAL_ECHOLN("Search in Y - not found"); + continue; + } +// SERIAL_ECHOLN("Search in Y - found"); + a = current_position[Y_AXIS]; + + enable_z_endstop(false); + current_position[Y_AXIS] = y1; + go_xy(x0, current_position[Y_AXIS], feedrate); + enable_z_endstop(true); + found = false; + for (i = 0, dir_positive = true; i < nsteps_y; current_position[Y_AXIS] -= (y1 - y0) / float(nsteps_y - 1), ++ i, dir_positive = ! dir_positive) { + go_xy(dir_positive ? x1 : x0, current_position[Y_AXIS], feedrate); + if (endstop_z_hit_on_purpose()) { + found = true; + break; + } + } + update_current_position_xyz(); + if (! found) { +// SERIAL_ECHOLN("Search in Y2 - not found"); + continue; + } +// SERIAL_ECHOLN("Search in Y2 - found"); + b = current_position[Y_AXIS]; + current_position[Y_AXIS] = 0.5f * (a + b); + + // Search in the X direction along a cross. + found = false; + enable_z_endstop(false); + go_xy(x0, current_position[Y_AXIS], feedrate); + enable_z_endstop(true); + go_xy(x1, current_position[Y_AXIS], feedrate); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) { +// SERIAL_ECHOLN("Search X span 0 - not found"); + continue; + } +// SERIAL_ECHOLN("Search X span 0 - found"); + a = current_position[X_AXIS]; + enable_z_endstop(false); + go_xy(x1, current_position[Y_AXIS], feedrate); + enable_z_endstop(true); + go_xy(x0, current_position[Y_AXIS], feedrate); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) { +// SERIAL_ECHOLN("Search X span 1 - not found"); + continue; + } +// SERIAL_ECHOLN("Search X span 1 - found"); + b = current_position[X_AXIS]; + // Go to the center. + enable_z_endstop(false); + current_position[X_AXIS] = 0.5f * (a + b); + go_xy(current_position[X_AXIS], current_position[Y_AXIS], feedrate); + found = true; + +#if 1 + // Search in the Y direction along a cross. + found = false; + enable_z_endstop(false); + go_xy(current_position[X_AXIS], y0, feedrate); + enable_z_endstop(true); + go_xy(current_position[X_AXIS], y1, feedrate); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) { +// SERIAL_ECHOLN("Search Y2 span 0 - not found"); + continue; + } +// SERIAL_ECHOLN("Search Y2 span 0 - found"); + a = current_position[Y_AXIS]; + enable_z_endstop(false); + go_xy(current_position[X_AXIS], y1, feedrate); + enable_z_endstop(true); + go_xy(current_position[X_AXIS], y0, feedrate); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) { +// SERIAL_ECHOLN("Search Y2 span 1 - not found"); + continue; + } +// SERIAL_ECHOLN("Search Y2 span 1 - found"); + b = current_position[Y_AXIS]; + // Go to the center. + enable_z_endstop(false); + current_position[Y_AXIS] = 0.5f * (a + b); + go_xy(current_position[X_AXIS], current_position[Y_AXIS], feedrate); + found = true; +#endif + break; + } + } + + enable_z_endstop(false); + return found; +} + +// Search around the current_position[X,Y,Z]. +// It is expected, that the induction sensor is switched on at the current position. +// Look around this center point by painting a star around the point. +inline bool improve_bed_induction_sensor_point() +{ + static const float search_radius = 8.f; + + bool endstops_enabled = enable_endstops(false); + bool endstop_z_enabled = enable_z_endstop(false); + bool found = false; + float feedrate = homing_feedrate[X_AXIS] / 60.f; + float center_old_x = current_position[X_AXIS]; + float center_old_y = current_position[Y_AXIS]; + float center_x = 0.f; + float center_y = 0.f; + + for (uint8_t iter = 0; iter < 4; ++ iter) { + switch (iter) { + case 0: + destination[X_AXIS] = center_old_x - search_radius * 0.707; + destination[Y_AXIS] = center_old_y - search_radius * 0.707; + break; + case 1: + destination[X_AXIS] = center_old_x + search_radius * 0.707; + destination[Y_AXIS] = center_old_y + search_radius * 0.707; + break; + case 2: + destination[X_AXIS] = center_old_x + search_radius * 0.707; + destination[Y_AXIS] = center_old_y - search_radius * 0.707; + break; + case 3: + default: + destination[X_AXIS] = center_old_x - search_radius * 0.707; + destination[Y_AXIS] = center_old_y + search_radius * 0.707; + break; + } + + // Trim the vector from center_old_[x,y] to destination[x,y] by the bed dimensions. + float vx = destination[X_AXIS] - center_old_x; + float vy = destination[Y_AXIS] - center_old_y; + float l = sqrt(vx*vx+vy*vy); + float t; + if (destination[X_AXIS] < X_MIN_POS) { + // Exiting the bed at xmin. + t = (center_x - X_MIN_POS) / l; + destination[X_AXIS] = X_MIN_POS; + destination[Y_AXIS] = center_old_y + t * vy; + } else if (destination[X_AXIS] > X_MAX_POS) { + // Exiting the bed at xmax. + t = (X_MAX_POS - center_x) / l; + destination[X_AXIS] = X_MAX_POS; + destination[Y_AXIS] = center_old_y + t * vy; + } + if (destination[Y_AXIS] < Y_MIN_POS) { + // Exiting the bed at ymin. + t = (center_y - Y_MIN_POS) / l; + destination[X_AXIS] = center_old_x + t * vx; + destination[Y_AXIS] = Y_MIN_POS; + } else if (destination[Y_AXIS] > Y_MAX_POS) { + // Exiting the bed at xmax. + t = (Y_MAX_POS - center_y) / l; + destination[X_AXIS] = center_old_x + t * vx; + destination[Y_AXIS] = Y_MAX_POS; + } + + // Move away from the measurement point. + enable_endstops(false); + go_xy(destination[X_AXIS], destination[Y_AXIS], feedrate); + // Move towards the measurement point, until the induction sensor triggers. + enable_endstops(true); + go_xy(center_old_x, center_old_y, feedrate); + update_current_position_xyz(); + center_x += current_position[X_AXIS]; + center_y += current_position[Y_AXIS]; + } + + // Calculate the new center, move to the new center. + center_x /= 4.f; + center_y /= 4.f; + current_position[X_AXIS] = center_x; + current_position[Y_AXIS] = center_y; + enable_endstops(false); + go_xy(current_position[X_AXIS], current_position[Y_AXIS], feedrate); + + enable_endstops(endstops_enabled); + enable_z_endstop(endstop_z_enabled); + return found; +} + +// Search around the current_position[X,Y,Z]. +// It is expected, that the induction sensor is switched on at the current position. +// Look around this center point by painting a star around the point. +#define IMPROVE_BED_INDUCTION_SENSOR_SEARCH_RADIUS (8.f) +inline bool improve_bed_induction_sensor_point2(bool lift_z_on_min_y) +{ + float center_old_x = current_position[X_AXIS]; + float center_old_y = current_position[Y_AXIS]; + float a, b; + + enable_endstops(false); + + { + float x0 = center_old_x - IMPROVE_BED_INDUCTION_SENSOR_SEARCH_RADIUS; + float x1 = center_old_x + IMPROVE_BED_INDUCTION_SENSOR_SEARCH_RADIUS; + if (x0 < X_MIN_POS) + x0 = X_MIN_POS; + if (x1 > X_MAX_POS) + x1 = X_MAX_POS; + + // Search in the X direction along a cross. + enable_z_endstop(false); + go_xy(x0, current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + enable_z_endstop(true); + go_xy(x1, current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) + return false; + a = current_position[X_AXIS]; + enable_z_endstop(false); + go_xy(x1, current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + enable_z_endstop(true); + go_xy(x0, current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) + return false; + b = current_position[X_AXIS]; + + // Go to the center. + enable_z_endstop(false); + current_position[X_AXIS] = 0.5f * (a + b); + go_xy(current_position[X_AXIS], current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + } + + { + float y0 = center_old_y - IMPROVE_BED_INDUCTION_SENSOR_SEARCH_RADIUS; + float y1 = center_old_y + IMPROVE_BED_INDUCTION_SENSOR_SEARCH_RADIUS; + if (y0 < Y_MIN_POS) + y0 = Y_MIN_POS; + if (y1 > Y_MAX_POS) + y1 = Y_MAX_POS; + + // Search in the Y direction along a cross. + enable_z_endstop(false); + go_xy(current_position[X_AXIS], y0, homing_feedrate[X_AXIS] / 60.f); + if (lift_z_on_min_y) { + // The first row of points are very close to the end stop. + // Lift the sensor to disengage the trigger. This is necessary because of the sensor hysteresis. + go_xyz(current_position[X_AXIS], y0, current_position[Z_AXIS]+5.f, homing_feedrate[Z_AXIS] / 60.f); + // and go back. + go_xyz(current_position[X_AXIS], y0, current_position[Z_AXIS], homing_feedrate[Z_AXIS] / 60.f); + } + if (lift_z_on_min_y && (READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING) == 1) { + // Already triggering before we started the move. + // Shift the trigger point slightly outwards. + a = current_position[Y_AXIS] - 1.5f; + } else { + enable_z_endstop(true); + go_xy(current_position[X_AXIS], y1, homing_feedrate[X_AXIS] / 60.f); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) + return false; + a = current_position[Y_AXIS]; + } + enable_z_endstop(false); + go_xy(current_position[X_AXIS], y1, homing_feedrate[X_AXIS] / 60.f); + enable_z_endstop(true); + go_xy(current_position[X_AXIS], y0, homing_feedrate[X_AXIS] / 60.f); + update_current_position_xyz(); + if (! endstop_z_hit_on_purpose()) + return false; + b = current_position[Y_AXIS]; + + // Go to the center. + enable_z_endstop(false); + current_position[Y_AXIS] = 0.5f * (a + b); + go_xy(current_position[X_AXIS], current_position[Y_AXIS], homing_feedrate[X_AXIS] / 60.f); + } + + return true; +} + +#define MESH_BED_CALIBRATION_SHOW_LCD + +bool find_bed_offset_and_skew() +{ + // Reusing the z_values memory for the measurement cache. + // 7x7=49 floats, good for 16 (x,y,z) vectors. + float *pts = &mbl.z_values[0][0]; + float *vec_x = pts + 3 * 4; + float *vec_y = vec_x + 3; + float *cntr = vec_y + 3; + memset(pts, 0, sizeof(float) * 7 * 7); + +#ifdef MESH_BED_CALIBRATION_SHOW_LCD + lcd_implementation_clear(); + lcd_print_at_PGM(0, 0, MSG_FIND_BED_OFFSET_AND_SKEW_LINE1); +#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ + + // Collect the rear 2x3 points. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + for (int k = 0; k < 4; ++ k) { +#ifdef MESH_BED_CALIBRATION_SHOW_LCD + lcd_print_at_PGM(0, 1, MSG_FIND_BED_OFFSET_AND_SKEW_LINE2); + lcd_implementation_print(k+1); + lcd_print_at_PGM(0, 2, MSG_FIND_BED_OFFSET_AND_SKEW_LINE3); +#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ + + int i, j; + switch (k) { + case 0: i = 1; j = 0; break; + case 1: i = 2; j = 1; break; + case 2: i = 1; j = 2; break; + case 3: i = 0; j = 1; break; + } + float *pt = pts + k * 3; + // Go up to z_initial. + go_to_current(homing_feedrate[Z_AXIS] / 60.f); + // Go to the measurement point position. + mbl.get_meas_xy(i, j, current_position[X_AXIS], current_position[Y_AXIS], true); // use default, uncorrected coordinates + go_to_current(homing_feedrate[X_AXIS] / 60.f); + if (! find_bed_induction_sensor_point_xy()) + return false; + find_bed_induction_sensor_point_z(); + pt[0] = current_position[X_AXIS]; + pt[1] = current_position[Y_AXIS]; + pt[2] = current_position[Z_AXIS]; + // Start searching for the other points at 3mm above the last point. + current_position[Z_AXIS] += 3.f; + cntr[0] += pt[0]; + cntr[1] += pt[1]; + cntr[2] += pt[2]; + } + + // Average the X and Y vectors. They may not be perpendicular, if the printer is built incorrectly. + { + float len; + // Average the center point. + cntr[0] *= 1.f/4.f; + cntr[1] *= 1.f/4.f; + cntr[2] *= 1.f/4.f; + // Average the X vector. + vec_x[0] = (pts[3 * 1 + 0] - pts[3 * 3 + 0]) / 2.f; + vec_x[1] = (pts[3 * 1 + 1] - pts[3 * 3 + 1]) / 2.f; + len = sqrt(vec_x[0]*vec_x[0] + vec_x[1]*vec_x[1]); + if (0) { + // if (len < MEAS_NUM_X_DIST) { + // Scale the vector up to MEAS_NUM_X_DIST lenght. + float factor = MEAS_NUM_X_DIST / len; + vec_x[0] *= factor; + vec_x[0] *= factor; + } else { + // The vector is longer than MEAS_NUM_X_DIST. The X/Y axes are skewed. + // Verify the maximum skew? + } + // Average the Y vector. + vec_y[0] = (pts[3 * 2 + 0] - pts[3 * 0 + 0]) / 2.f; + vec_y[1] = (pts[3 * 2 + 1] - pts[3 * 0 + 1]) / 2.f; + len = sqrt(vec_y[0]*vec_y[0] + vec_y[1]*vec_y[1]); + if (0) { + // if (len < MEAS_NUM_Y_DIST) { + // Scale the vector up to MEAS_NUM_X_DIST lenght. + float factor = MEAS_NUM_Y_DIST / len; + vec_y[1] *= factor; + vec_y[1] *= factor; + } else { + // The vector is longer than MEAS_NUM_X_DIST. The X/Y axes are skewed. + // Verify the maximum skew? + } + + // Fearlessly store the calibration values into the eeprom. + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0), cntr [0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4), cntr [1]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +0), vec_x[0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +4), vec_x[1]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0), vec_y[0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4), vec_y[1]); + +#if 0 + SERIAL_ECHOLN("Calibration done."); + SERIAL_ECHO("Center: "); + SERIAL_ECHO(cntr[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(cntr[1]); + SERIAL_ECHO(", x: "); + SERIAL_ECHO(vec_x[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_x[1]); + SERIAL_ECHO(", y: "); + SERIAL_ECHO(vec_y[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_y[1]); + SERIAL_ECHOLN(""); +#endif + } + return true; +} + +bool improve_bed_offset_and_skew(int8_t method) +{ + // Reusing the z_values memory for the measurement cache. + // 7x7=49 floats, good for 16 (x,y,z) vectors. + float *pts = &mbl.z_values[0][0]; + float *vec_x = pts + 2 * 9; + float *vec_y = vec_x + 2; + float *cntr = vec_y + 2; + memset(pts, 0, sizeof(float) * 7 * 7); + + bool endstops_enabled = enable_endstops(false); + bool endstop_z_enabled = enable_z_endstop(false); + +#ifdef MESH_BED_CALIBRATION_SHOW_LCD + lcd_implementation_clear(); + lcd_print_at_PGM(0, 0, MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1); +#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ + + // Collect a matrix of 9x9 points. + for (int8_t mesh_point = 0; mesh_point < 9; ++ mesh_point) { + int ix = mesh_point % MESH_MEAS_NUM_X_POINTS; + int iy = mesh_point / MESH_MEAS_NUM_X_POINTS; + if (iy & 1) ix = (MESH_MEAS_NUM_X_POINTS - 1) - ix; // Zig zag + // Print the decrasing ID of the measurement point. +#ifdef MESH_BED_CALIBRATION_SHOW_LCD + lcd_print_at_PGM(0, 1, MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2); + lcd_implementation_print_at(7, 1, mesh_point+1); + lcd_print_at_PGM(0, 2, MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE3); +#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ + + // Move up. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + enable_endstops(false); + enable_z_endstop(false); + go_to_current(homing_feedrate[Z_AXIS]/60); + // Go to the measurement point. + // Use the coorrected coordinate, which is a result of find_bed_offset_and_skew(). + mbl.get_meas_xy(ix, iy, current_position[X_AXIS], current_position[Y_AXIS], false); + go_to_current(homing_feedrate[X_AXIS]/60); + // Find its Z position by running the normal vertical search. +// delay_keep_alive(3000); + find_bed_induction_sensor_point_z(); +// delay_keep_alive(3000); + // Improve the point position by searching its center in a current plane. + int8_t n_errors = 3; + for (int8_t iter = 0; iter < 4; ++ iter) { + bool found = false; + switch (method) { + case 0: found = improve_bed_induction_sensor_point(); break; + case 1: found = improve_bed_induction_sensor_point2(iy == 0); break; + default: break; + } + if (! found) { + if (n_errors -- == 0) { + // Give up. + goto canceled; + } else { + // Try to move the Z axis down a bit to increase a chance of the sensor to trigger. + current_position[Z_AXIS] -= 0.025f; + enable_endstops(false); + enable_z_endstop(false); + go_to_current(homing_feedrate[Z_AXIS]); + } + } + } +// delay_keep_alive(3000); + float *pt = pts + 2 * (ix + iy * 3); + pt[0] = current_position[X_AXIS]; + pt[1] = current_position[Y_AXIS]; + cntr[0] += pt[0]; + cntr[1] += pt[1]; + } + + // Average the X and Y vectors. They may not be perpendicular, if the printer is built incorrectly. + // Average the center point. + cntr[0] *= 1.f/9.f; + cntr[1] *= 1.f/9.f; + // Average the X vector. + vec_x[0] = (pts[2 * 2 + 0] - pts[2 * 0 + 0] + pts[2 * 5 + 0] - pts[2 * 3 + 0] + pts[2 * 8 + 0] - pts[2 * 6 + 0]) / 6.f; + vec_x[1] = (pts[2 * 2 + 1] - pts[2 * 0 + 1] + pts[2 * 5 + 1] - pts[2 * 3 + 1] + pts[2 * 8 + 1] - pts[2 * 6 + 1]) / 6.f; + // Average the Y vector. + vec_y[0] = (pts[2 * 6 + 0] - pts[2 * 0 + 0] + pts[2 * 7 + 0] - pts[2 * 1 + 0] + pts[2 * 8 + 0] - pts[2 * 2 + 0]) / 6.f; + vec_y[1] = (pts[2 * 6 + 1] - pts[2 * 0 + 1] + pts[2 * 7 + 1] - pts[2 * 1 + 1] + pts[2 * 8 + 1] - pts[2 * 2 + 1]) / 6.f; + +#if 1 + // Fearlessly store the calibration values into the eeprom. + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0), cntr [0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4), cntr [1]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +0), vec_x[0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +4), vec_x[1]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0), vec_y[0]); + eeprom_update_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4), vec_y[1]); +#endif + +#if 0 + // and let us know the result. + SERIAL_ECHOLN("Calibration done."); + SERIAL_ECHO("Center: "); + SERIAL_ECHO(cntr[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(cntr[1]); + SERIAL_ECHO(", x: "); + SERIAL_ECHO(vec_x[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_x[1]); + SERIAL_ECHO(", y: "); + SERIAL_ECHO(vec_y[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_y[1]); + SERIAL_ECHOLN(""); +#endif + + enable_endstops(endstops_enabled); + enable_z_endstop(endstop_z_enabled); + return true; + +canceled: + enable_endstops(endstops_enabled); + enable_z_endstop(endstop_z_enabled); + return false; +} + +void reset_bed_offset_and_skew() +{ + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_CENTER+0), 0x0FFFFFFFF); + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_CENTER+4), 0x0FFFFFFFF); + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_VEC_X +0), 0x0FFFFFFFF); + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_VEC_X +4), 0x0FFFFFFFF); + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_VEC_Y +0), 0x0FFFFFFFF); + eeprom_update_dword((uint32_t*)(EEPROM_BED_CALIBRATION_VEC_Y +4), 0x0FFFFFFFF); +} + +static const float[9][2] PROGMEM bed_points = { +}; + +bool calculate_machine_skew_and_offset_LS( + // Matrix of 9 2D points (18 floats) + float *pts, + // Resulting correction matrix. + float *vec_x, + float *vec_y, + float *cntr, + // Temporary values, 49-18-(2*3)=25 floats + float *temp +{ + { + // Create covariance matrix for A, collect the right hand side b. + float A[3][3] = { 0.f }; + float b[3] = { 0.f }; + float acc; + for (uint8_t r = 0; r < 3; ++ r) { + for (uint8_t c = 0; c < 3; ++ c) { + acc = 0; + for (uint8_t i = 0; i < 9; ++ i) { + float a = (r == 2) ? 1.f : pts[2 * i + r]; + float b = (c == 2) ? 1.f : pts[2 * i + c]; + acc += a * b; + } + A[r][c] = acc; + } + acc = 0.f; + for (uint8_t i = 0; i < 9; ++ i) { + float a = (r == 2) ? 1.f : pts[2 * i + r]; + float b = pgm_read_float(&coeff2[i][0]); + acc += a * b; + } + b[r] = acc; + } + // Solve the linear equation for ax, bx, cx. + float x[3] = { 0.f }; + for (uint8_t iter = 0; iter < 100; ++ iter) { + x[0] = (b[0] - A[1] * x[1] - A[2] * x[2]) / A[0]; + x[1] = (b[1] - A[0] * x[0] - A[2] * x[2]) / A[1]; + x[2] = (b[2] - A[0] * x[0] - A[1] * x[1]) / A[2]; + } + // Store the result to the output variables. + vec_x[0] = x[0]; + vec_y[0] = x[1]; + cntr[0] = x[2]; + + // Recalculate b for the y values. + for (uint8_t r = 0; r < 3; ++ r) { + acc = 0.f; + for (uint8_t i = 0; i < 9; ++ i) { + float a = (r == 2) ? 1.f : pts[2 * i + r]; + float b = pgm_read_float(&coeff2[i][1]); + acc += a * b; + } + b[r] = acc; + } + // Solve the linear equation for ay, by, cy. + x[0] = 0.f, x[1] = 0.f; x[2] = 0.f; + for (uint8_t iter = 0; iter < 100; ++ iter) { + x[0] = (b[0] - A[1] * x[1] - A[2] * x[2]) / A[0]; + x[1] = (b[1] - A[0] * x[0] - A[2] * x[2]) / A[1]; + x[2] = (b[2] - A[0] * x[0] - A[1] * x[1]) / A[2]; + } + // Store the result to the output variables. + vec_x[1] = x[0]; + vec_y[1] = x[1]; + cntr[1] = x[2]; + } + + // Normalize the vectors. We expect, that the machine axes may be skewed a bit, but the distances are correct. + // l shall be very close to 1 already. + float l = sqrt(vec_x[0]*vec_x[0] + vec_x[1] * vec_x[1]); + vec_x[0] /= l; + vec_x[1] /= l; + l = sqrt(vec_y[0]*vec_y[0] + vec_y[1] * vec_y[1]); + vec_y[0] /= l; + vec_y[1] /= l; + + + + // Invert the transformation matrix made of vec_x, vec_y and cntr. + +} diff --git a/Firmware/mesh_bed_calibration.h b/Firmware/mesh_bed_calibration.h new file mode 100644 index 00000000..08dc358d --- /dev/null +++ b/Firmware/mesh_bed_calibration.h @@ -0,0 +1,11 @@ +#ifndef MESH_BED_CALIBRATION_H +#define MESH_BED_CALIBRATION_H + +extern void find_bed_induction_sensor_point_z(); +extern bool find_bed_induction_sensor_point_xy(); + +extern bool find_bed_offset_and_skew(); +extern bool improve_bed_offset_and_skew(int8_t method); +extern void reset_bed_offset_and_skew(); + +#endif /* MESH_BED_CALIBRATION_H */ diff --git a/Firmware/mesh_bed_leveling.cpp b/Firmware/mesh_bed_leveling.cpp index 254cff12..b0717ce3 100644 --- a/Firmware/mesh_bed_leveling.cpp +++ b/Firmware/mesh_bed_leveling.cpp @@ -1,4 +1,5 @@ #include "mesh_bed_leveling.h" +#include "Configuration.h" #ifdef MESH_BED_LEVELING @@ -13,6 +14,77 @@ void mesh_bed_leveling::reset() { z_values[y][x] = 0; } +static inline bool vec_undef(const float v[2]) +{ + const uint32_t *vx = (const uint32_t*)v; + return vx[0] == 0x0FFFFFFFF || vx[1] == 0x0FFFFFFFF; +} + +void mesh_bed_leveling::get_meas_xy(int ix, int iy, float &x, float &y, bool use_default) +{ + float cntr[2] = { + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+0)), + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_CENTER+4)) + }; + float vec_x[2] = { + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +0)), + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_X +4)) + }; + float vec_y[2] = { + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +0)), + eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y +4)) + }; + + if (use_default || vec_undef(cntr) || vec_undef(vec_x) || vec_undef(vec_y)) { + // Default, uncorrected positions of the calibration points. Works well for correctly built printers. + x = float(MESH_MIN_X) + float(MEAS_NUM_X_DIST) * float(ix) - X_PROBE_OFFSET_FROM_EXTRUDER; + //FIXME + //x -= 5.f; + y = float(MESH_MIN_Y) + float(MEAS_NUM_Y_DIST) * float(iy) - Y_PROBE_OFFSET_FROM_EXTRUDER; + } else { +#if 0 + SERIAL_ECHO("Running bed leveling. Calibration data: "); + SERIAL_ECHO(cntr[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(cntr[1]); + SERIAL_ECHO(", x: "); + SERIAL_ECHO(vec_x[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_x[1]); + SERIAL_ECHO(", y: "); + SERIAL_ECHO(vec_y[0]); + SERIAL_ECHO(","); + SERIAL_ECHO(vec_y[1]); + SERIAL_ECHOLN(""); +#endif + + x = cntr[0]; + y = cntr[1]; + if (ix < 1) { + x -= vec_x[0]; + y -= vec_x[1]; + } else if (ix > 1) { + x += vec_x[0]; + y += vec_x[1]; + } + if (iy < 1) { + x -= vec_y[0]; + y -= vec_y[1]; + } else if (iy > 1) { + x += vec_y[0]; + y += vec_y[1]; + } + +#if 0 + SERIAL_ECHO("Calibration point position: "); + SERIAL_ECHO(x); + SERIAL_ECHO(","); + SERIAL_ECHO(y); + SERIAL_ECHOLN(""); +#endif + } +} + #if MESH_NUM_X_POINTS>=5 && MESH_NUM_Y_POINTS>=5 && (MESH_NUM_X_POINTS&1)==1 && (MESH_NUM_Y_POINTS&1)==1 // Works for an odd number of MESH_NUM_X_POINTS and MESH_NUM_Y_POINTS void mesh_bed_leveling::upsample_3x3() diff --git a/Firmware/mesh_bed_leveling.h b/Firmware/mesh_bed_leveling.h index 519698a0..bf372955 100644 --- a/Firmware/mesh_bed_leveling.h +++ b/Firmware/mesh_bed_leveling.h @@ -21,11 +21,13 @@ public: void upsample_3x3(); #endif - float get_x(int i) { return float(MESH_MIN_X) + float(MESH_X_DIST) * float(i); } - float get_y(int i) { return float(MESH_MIN_Y) + float(MESH_Y_DIST) * float(i); } + static float get_x(int i) { return float(MESH_MIN_X) + float(MESH_X_DIST) * float(i); } + static float get_y(int i) { return float(MESH_MIN_Y) + float(MESH_Y_DIST) * float(i); } - float get_meas_x(int i) { return float(MESH_MIN_X) + float(MEAS_NUM_X_DIST) * float(i); } - float get_meas_y(int i) { return float(MESH_MIN_Y) + float(MEAS_NUM_Y_DIST) * float(i); } + // Measurement point for the Z probe. + // If use_default=true, then the default positions for a correctly built printer are used. + // Otherwise a correction matrix is pulled from the EEPROM if available. + static void get_meas_xy(int ix, int iy, float &x, float &y, bool use_default); void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; } diff --git a/Firmware/pins.h b/Firmware/pins.h index 82ee55ac..be5deace 100644 --- a/Firmware/pins.h +++ b/Firmware/pins.h @@ -23,7 +23,7 @@ * Rambo Pin Assignments 1.3 ******************************************************************/ #if MOTHERBOARD == 302 - #define MINI-RAMBO + #define MINI_RAMBO #endif #if MOTHERBOARD == 301 || MOTHERBOARD == 302 @@ -109,7 +109,7 @@ #else #define HEATER_2_PIN -1 #endif - #ifdef MINI-RAMBO + #ifdef MINI_RAMBO #define ELECTRONICS "RAMBo13a" diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index d5425b09..faf0426f 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -86,6 +86,7 @@ static bool old_z_min_endstop=false; static bool old_z_max_endstop=false; static bool check_endstops = true; +static bool check_z_endstop = false; int8_t SilentMode; @@ -209,16 +210,35 @@ void checkHitEndstops() } } -void endstops_hit_on_purpose() +bool endstops_hit_on_purpose() { + bool hit = endstop_x_hit || endstop_y_hit || endstop_z_hit; endstop_x_hit=false; endstop_y_hit=false; endstop_z_hit=false; + return hit; } -void enable_endstops(bool check) +bool endstop_z_hit_on_purpose() { + bool hit = endstop_z_hit; + endstop_z_hit=false; + return hit; +} + +bool enable_endstops(bool check) +{ + bool old = check_endstops; check_endstops = check; + return old; +} + +bool enable_z_endstop(bool check) +{ + bool old = check_z_endstop; + check_z_endstop = check; + endstop_z_hit=false; + return old; } // __________________________ @@ -496,7 +516,7 @@ ISR(TIMER1_COMPA_vect) #endif count_direction[Z_AXIS]=-1; - CHECK_ENDSTOPS + if(check_endstops && ! check_z_endstop) { #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); @@ -531,6 +551,21 @@ ISR(TIMER1_COMPA_vect) } } + // Supporting stopping on a trigger of the Z-stop induction sensor, not only for the Z-minus movements. + #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 + if(check_z_endstop) { + // Check the Z min end-stop no matter what. + // Good for searching for the center of an induction target. + bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); + if(z_min_endstop && old_z_min_endstop) { + endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; + endstop_z_hit=true; + step_events_completed = current_block->step_event_count; + } + old_z_min_endstop = z_min_endstop; + } + #endif + #ifndef ADVANCE if ((out_bits & (1<<E_AXIS)) != 0) { // -direction REV_E_DIR(); diff --git a/Firmware/stepper.h b/Firmware/stepper.h index 1dd51aa0..75caa4dd 100644 --- a/Firmware/stepper.h +++ b/Firmware/stepper.h @@ -72,9 +72,12 @@ void st_wake_up(); void checkHitEndstops(); //call from somewhere to create an serial error message with the locations the endstops where hit, in case they were triggered -void endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homing and before a routine call of checkHitEndstops(); +bool endstops_hit_on_purpose(); //avoid creation of the message, i.e. after homing and before a routine call of checkHitEndstops(); +bool endstop_z_hit_on_purpose(); -void enable_endstops(bool check); // Enable/disable endstop checking + +bool enable_endstops(bool check); // Enable/disable endstop checking. Return the old value. +bool enable_z_endstop(bool check); void checkStepperErrors(); //Print errors detected by the stepper diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 975068fc..c4ebb664 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1,3053 +1,3204 @@ -#include "temperature.h" -#include "ultralcd.h" -#ifdef ULTRA_LCD -#include "Marlin.h" -#include "language.h" -#include "cardreader.h" -#include "temperature.h" -#include "stepper.h" -#include "ConfigurationStore.h" -#include <string.h> -//#include "Configuration.h" - - - -#define _STRINGIFY(s) #s - - -int8_t encoderDiff; /* encoderDiff is updated from interrupt context and added to encoderPosition every LCD update */ - -extern int lcd_change_fil_state; - -int babystepMem[3]; -float babystepMemMM[3]; - -union Data -{ - byte b[2]; - int value; -}; - -int8_t ReInitLCD = 0; - -int8_t SDscrool = 0; - -int8_t SilentModeMenu = 0; - -int lcd_commands_type=0; -int lcd_commands_step=0; -bool isPrintPaused = false; - -/* Configuration settings */ -int plaPreheatHotendTemp; -int plaPreheatHPBTemp; -int plaPreheatFanSpeed; - -int absPreheatHotendTemp; -int absPreheatHPBTemp; -int absPreheatFanSpeed; - -int ppPreheatHotendTemp = PP_PREHEAT_HOTEND_TEMP; -int ppPreheatHPBTemp = PP_PREHEAT_HPB_TEMP; -int ppPreheatFanSpeed = PP_PREHEAT_FAN_SPEED; - -int petPreheatHotendTemp = PET_PREHEAT_HOTEND_TEMP; -int petPreheatHPBTemp = PET_PREHEAT_HPB_TEMP; -int petPreheatFanSpeed = PET_PREHEAT_FAN_SPEED; - -int hipsPreheatHotendTemp = HIPS_PREHEAT_HOTEND_TEMP; -int hipsPreheatHPBTemp = HIPS_PREHEAT_HPB_TEMP; -int hipsPreheatFanSpeed = HIPS_PREHEAT_FAN_SPEED; - -int flexPreheatHotendTemp = FLEX_PREHEAT_HOTEND_TEMP; -int flexPreheatHPBTemp = FLEX_PREHEAT_HPB_TEMP; -int flexPreheatFanSpeed = FLEX_PREHEAT_FAN_SPEED; - - - -#ifdef FILAMENT_LCD_DISPLAY -unsigned long message_millis = 0; -#endif - -#ifdef ULTIPANEL -static float manual_feedrate[] = MANUAL_FEEDRATE; -#endif // ULTIPANEL - -/* !Configuration settings */ - -//Function pointer to menu functions. -typedef void (*menuFunc_t)(); - -uint8_t lcd_status_message_level; -char lcd_status_message[LCD_WIDTH + 1] = ""; //////WELCOME! -unsigned char firstrun = 1; - -#ifdef DOGLCD -#include "dogm_lcd_implementation.h" -#else -#include "ultralcd_implementation_hitachi_HD44780.h" -#endif - -/** forward declarations **/ - -void copy_and_scalePID_i(); -void copy_and_scalePID_d(); - -/* Different menus */ -static void lcd_status_screen(); -#ifdef ULTIPANEL -extern bool powersupply; -static void lcd_main_menu(); -static void lcd_tune_menu(); -static void lcd_prepare_menu(); -static void lcd_move_menu(); -static void lcd_control_menu(); -static void lcd_settings_menu(); -static void lcd_language_menu(); -static void lcd_control_temperature_menu(); -static void lcd_control_temperature_preheat_pla_settings_menu(); -static void lcd_control_temperature_preheat_abs_settings_menu(); -static void lcd_control_motion_menu(); -static void lcd_control_volumetric_menu(); - -#ifdef DOGLCD -static void lcd_set_contrast(); -#endif -static void lcd_control_retract_menu(); -static void lcd_sdcard_menu(); - -#ifdef DELTA_CALIBRATION_MENU -static void lcd_delta_calibrate_menu(); -#endif // DELTA_CALIBRATION_MENU - -static void lcd_quick_feedback();//Cause an LCD refresh, and give the user visual or audible feedback that something has happened - -/* Different types of actions that can be used in menu items. */ -static void menu_action_back(menuFunc_t data); -static void menu_action_submenu(menuFunc_t data); -static void menu_action_gcode(const char* pgcode); -static void menu_action_function(menuFunc_t data); -static void menu_action_setlang(unsigned char lang); -static void menu_action_sdfile(const char* filename, char* longFilename); -static void menu_action_sddirectory(const char* filename, char* longFilename); -static void menu_action_setting_edit_bool(const char* pstr, bool* ptr); -static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); -static void menu_action_setting_edit_float3(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_float32(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_float43(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_float5(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_float51(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_float52(const char* pstr, float* ptr, float minValue, float maxValue); -static void menu_action_setting_edit_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue); -static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_int3(const char* pstr, int* ptr, int minValue, int maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float3(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float32(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float43(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float5(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float51(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_float52(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); -static void menu_action_setting_edit_callback_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue, menuFunc_t callbackFunc); - -#define ENCODER_FEEDRATE_DEADZONE 10 - -#if !defined(LCD_I2C_VIKI) -#ifndef ENCODER_STEPS_PER_MENU_ITEM -#define ENCODER_STEPS_PER_MENU_ITEM 5 -#endif -#ifndef ENCODER_PULSES_PER_STEP -#define ENCODER_PULSES_PER_STEP 1 -#endif -#else -#ifndef ENCODER_STEPS_PER_MENU_ITEM -#define ENCODER_STEPS_PER_MENU_ITEM 2 // VIKI LCD rotary encoder uses a different number of steps per rotation -#endif -#ifndef ENCODER_PULSES_PER_STEP -#define ENCODER_PULSES_PER_STEP 1 -#endif -#endif - - -/* Helper macros for menus */ -#define START_MENU() do { \ - if (encoderPosition > 0x8000) encoderPosition = 0; \ - if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM < currentMenuViewOffset) currentMenuViewOffset = encoderPosition / ENCODER_STEPS_PER_MENU_ITEM;\ - uint8_t _lineNr = currentMenuViewOffset, _menuItemNr; \ - bool wasClicked = LCD_CLICKED;\ - for(uint8_t _drawLineNr = 0; _drawLineNr < LCD_HEIGHT; _drawLineNr++, _lineNr++) { \ - _menuItemNr = 0; - -#define MENU_ITEM(type, label, args...) do { \ - if (_menuItemNr == _lineNr) { \ - if (lcdDrawUpdate) { \ - const char* _label_pstr = (label); \ - if ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) { \ - lcd_implementation_drawmenu_ ## type ## _selected (_drawLineNr, _label_pstr , ## args ); \ - }else{\ - lcd_implementation_drawmenu_ ## type (_drawLineNr, _label_pstr , ## args ); \ - }\ - }\ - if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) {\ - lcd_quick_feedback(); \ - menu_action_ ## type ( args ); \ - return;\ - }\ - }\ - _menuItemNr++;\ - } while(0) - -#define MENU_ITEM_DUMMY() do { _menuItemNr++; } while(0) -#define MENU_ITEM_EDIT(type, label, args...) MENU_ITEM(setting_edit_ ## type, label, (label) , ## args ) -#define MENU_ITEM_EDIT_CALLBACK(type, label, args...) MENU_ITEM(setting_edit_callback_ ## type, label, (label) , ## args ) -#define END_MENU() \ - if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM >= _menuItemNr) encoderPosition = _menuItemNr * ENCODER_STEPS_PER_MENU_ITEM - 1; \ - if ((uint8_t)(encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) >= currentMenuViewOffset + LCD_HEIGHT) { currentMenuViewOffset = (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) - LCD_HEIGHT + 1; lcdDrawUpdate = 1; _lineNr = currentMenuViewOffset - 1; _drawLineNr = -1; } \ - } } while(0) - -/** Used variables to keep track of the menu */ -#ifndef REPRAPWORLD_KEYPAD -volatile uint8_t buttons;//Contains the bits of the currently pressed buttons. -#else -volatile uint8_t buttons_reprapworld_keypad; // to store the reprapworld_keypad shift register values -#endif -#ifdef LCD_HAS_SLOW_BUTTONS -volatile uint8_t slow_buttons;//Contains the bits of the currently pressed buttons. -#endif -uint8_t currentMenuViewOffset; /* scroll offset in the current menu */ -uint32_t blocking_enc; -uint8_t lastEncoderBits; -uint32_t encoderPosition; -#if (SDCARDDETECT > 0) -bool lcd_oldcardstatus; -#endif -#endif //ULTIPANEL - -menuFunc_t currentMenu = lcd_status_screen; /* function pointer to the currently active menu */ -uint32_t lcd_next_update_millis; -uint8_t lcd_status_update_delay; -bool ignore_click = false; -bool wait_for_unclick; -uint8_t lcdDrawUpdate = 2; /* Set to none-zero when the LCD needs to draw, decreased after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) */ - -//prevMenu and prevEncoderPosition are used to store the previous menu location when editing settings. -menuFunc_t prevMenu = NULL; -uint16_t prevEncoderPosition; -//Variables used when editing values. -const char* editLabel; -void* editValue; -int32_t minEditValue, maxEditValue; -menuFunc_t callbackFunc; - -// place-holders for Ki and Kd edits -float raw_Ki, raw_Kd; - -static void lcd_goto_menu(menuFunc_t menu, const uint32_t encoder = 0, const bool feedback = true) { - if (currentMenu != menu) { - currentMenu = menu; - encoderPosition = encoder; - if (feedback) lcd_quick_feedback(); - - // For LCD_PROGRESS_BAR re-initialize the custom characters -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - lcd_set_custom_characters(menu == lcd_status_screen); -#endif - } -} - -/* Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent */ -/* -extern char langbuffer[]; -void lcd_printPGM(const char *s1) { - strncpy_P(langbuffer,s1,LCD_WIDTH); - lcd.print(langbuffer); -} -*/ -unsigned char langsel; - -void set_language_from_EEPROM() { - unsigned char eep = eeprom_read_byte((unsigned char*)EEPROM_LANG); - if (eep < LANG_NUM) - { - lang_selected = eep; - langsel = 0; - } - else - { - lang_selected = 1; - langsel = 1; - } -} - -void lcd_mylang(); -static void lcd_status_screen() -{ - - if (firstrun == 1) - { - firstrun = 0; - set_language_from_EEPROM(); - strncpy_P(lcd_status_message, WELCOME_MSG, LCD_WIDTH); - - 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); - } - - if (langsel) { - //strncpy_P(lcd_status_message, PSTR(">>>>>>>>>>>> PRESS v"), LCD_WIDTH); - lcd_mylang(); - } - } - - - if (lcd_status_update_delay) - lcd_status_update_delay--; - else - lcdDrawUpdate = 1; - if (lcdDrawUpdate) - { - ReInitLCD++; - - - if (ReInitLCD == 30) { - lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - currentMenu == lcd_status_screen -#endif - ); - ReInitLCD = 0 ; - } else { - - if ((ReInitLCD % 10) == 0) { - //lcd_implementation_nodisplay(); - lcd_implementation_init_noclear( // to maybe revive the LCD if static electricity killed it. -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - currentMenu == lcd_status_screen -#endif - ); - - } - - } - - - //lcd_implementation_display(); - lcd_implementation_status_screen(); - //lcd_implementation_clear(); - - - - - - - - lcd_status_update_delay = 10; /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */ - if (lcd_commands_type != 0) - { - lcd_commands(); - } - - - } -#ifdef ULTIPANEL - - bool current_click = LCD_CLICKED; - - if (ignore_click) { - if (wait_for_unclick) { - if (!current_click) { - ignore_click = wait_for_unclick = false; - } - else { - current_click = false; - } - } - else if (current_click) { - lcd_quick_feedback(); - wait_for_unclick = true; - current_click = false; - } - } - - - //if (--langsel ==0) {langsel=1;current_click=true;} - - if (current_click) - { - - lcd_goto_menu(lcd_main_menu); - lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - currentMenu == lcd_status_screen -#endif - ); -#ifdef FILAMENT_LCD_DISPLAY - message_millis = millis(); // get status message to show up for a while -#endif - } - -#ifdef ULTIPANEL_FEEDMULTIPLY - // Dead zone at 100% feedrate - if ((feedmultiply < 100 && (feedmultiply + int(encoderPosition)) > 100) || - (feedmultiply > 100 && (feedmultiply + int(encoderPosition)) < 100)) - { - encoderPosition = 0; - feedmultiply = 100; - } - - if (feedmultiply == 100 && int(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) - { - feedmultiply += int(encoderPosition) - ENCODER_FEEDRATE_DEADZONE; - encoderPosition = 0; - } - else if (feedmultiply == 100 && int(encoderPosition) < -ENCODER_FEEDRATE_DEADZONE) - { - feedmultiply += int(encoderPosition) + ENCODER_FEEDRATE_DEADZONE; - encoderPosition = 0; - } - else if (feedmultiply != 100) - { - feedmultiply += int(encoderPosition); - encoderPosition = 0; - } -#endif //ULTIPANEL_FEEDMULTIPLY - - if (feedmultiply < 10) - feedmultiply = 10; - else if (feedmultiply > 999) - feedmultiply = 999; -#endif //ULTIPANEL -} - -#ifdef ULTIPANEL - -void lcd_commands() -{ - if (lcd_commands_type == 1) //// load filament sequence - { - if (lcd_commands_step == 0) { lcd_commands_step = 5; custom_message = true; } - if (lcd_commands_step == 1 && !blocks_queued()) - { - lcd_commands_step = 0; - lcd_commands_type = 0; - lcd_setstatuspgm(WELCOME_MSG); - disable_z(); - custom_message = false; - custom_message_type = 0; - } - if (lcd_commands_step == 2 && !blocks_queued()) - { - lcd_setstatuspgm(MSG_LOADING_FILAMENT); - enquecommand_P(PSTR(LOAD_FILAMENT_2)); - lcd_commands_step = 1; - } - if (lcd_commands_step == 3 && !blocks_queued()) - { - enquecommand_P(PSTR(LOAD_FILAMENT_1)); - lcd_commands_step = 2; - } - if (lcd_commands_step == 4 && !blocks_queued()) - { - lcd_setstatuspgm(MSG_INSERT_FILAMENT); - enquecommand_P(PSTR(LOAD_FILAMENT_0)); - lcd_commands_step = 3; - } - if (lcd_commands_step == 5 && !blocks_queued()) - { - lcd_setstatuspgm(MSG_PLEASE_WAIT); - enable_z(); - custom_message = true; - custom_message_type = 2; - lcd_commands_step = 4; - } - - - - - - } - - if (lcd_commands_type == 2) /// stop print - { - - if (lcd_commands_step == 0) { lcd_commands_step = 6; custom_message = true; } - - if (lcd_commands_step == 1 && !blocks_queued()) - { - lcd_commands_step = 0; - lcd_commands_type = 0; - lcd_setstatuspgm(WELCOME_MSG); - custom_message = false; - } - if (lcd_commands_step == 2 && !blocks_queued()) - { - setTargetBed(0); - setTargetHotend(0, 0); - setTargetHotend(0, 1); - setTargetHotend(0, 2); - manage_heater(); - lcd_setstatuspgm(WELCOME_MSG); - cancel_heatup = false; - lcd_commands_step = 1; - } - if (lcd_commands_step == 3 && !blocks_queued()) - { - enquecommand_P(PSTR("M84")); - autotempShutdown(); - lcd_commands_step = 2; - } - if (lcd_commands_step == 4 && !blocks_queued()) - { - enquecommand_P(PSTR("G90")); - #ifdef X_CANCEL_POS - enquecommand_P(PSTR("G1 X" STRINGIFY(X_CANCEL_POS) " Y" STRINGIFY(Y_CANCEL_POS) " E0 F7000")); - #else - enquecommand_P(PSTR("G1 X50 Y" STRINGIFY(Y_MAX_POS) " E0 F7000")); - #endif - lcd_ignore_click(false); - lcd_commands_step = 3; - } - if (lcd_commands_step == 5 && !blocks_queued()) - { - lcd_setstatuspgm(MSG_PRINT_ABORTED); - enquecommand_P(PSTR("G91")); - enquecommand_P(PSTR("G1 Z15 F1500")); - lcd_commands_step = 4; - } - if (lcd_commands_step == 6 && !blocks_queued()) - { - lcd_setstatuspgm(MSG_PRINT_ABORTED); - cancel_heatup = true; - setTargetBed(0); - setTargetHotend(0, 0); - setTargetHotend(0, 1); - setTargetHotend(0, 2); - manage_heater(); - lcd_commands_step = 5; - } - - } - - if (lcd_commands_type == 3) - { - lcd_commands_type = 0; - } - -} - -static void lcd_return_to_status() { - lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - currentMenu == lcd_status_screen -#endif - ); - - lcd_goto_menu(lcd_status_screen, 0, false); -} - -static void lcd_sdcard_pause() { - card.pauseSDPrint(); - isPrintPaused = true; - lcdDrawUpdate = 3; -} - -static void lcd_sdcard_resume() { - card.startFileprint(); - isPrintPaused = false; - lcdDrawUpdate = 3; -} - -float move_menu_scale; -static void lcd_move_menu_axis(); - - - -/* Menu implementation */ - - -void lcd_preheat_pla() -{ - setTargetHotend0(plaPreheatHotendTemp); - setTargetBed(plaPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - -void lcd_preheat_abs() -{ - setTargetHotend0(absPreheatHotendTemp); - setTargetBed(absPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - -void lcd_preheat_pp() -{ - setTargetHotend0(ppPreheatHotendTemp); - setTargetBed(ppPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - -void lcd_preheat_pet() -{ - setTargetHotend0(petPreheatHotendTemp); - setTargetBed(petPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - -void lcd_preheat_hips() -{ - setTargetHotend0(hipsPreheatHotendTemp); - setTargetBed(hipsPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - -void lcd_preheat_flex() -{ - setTargetHotend0(flexPreheatHotendTemp); - setTargetBed(flexPreheatHPBTemp); - fanSpeed = 0; - lcd_return_to_status(); - setWatch(); // heater sanity check timer -} - - -void lcd_cooldown() -{ - setTargetHotend0(0); - setTargetHotend1(0); - setTargetHotend2(0); - setTargetBed(0); - fanSpeed = 0; - lcd_return_to_status(); -} - - - -static void lcd_preheat_menu() -{ - START_MENU(); - - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); - - MENU_ITEM(function, PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)), lcd_preheat_abs); - MENU_ITEM(function, PSTR("PLA - " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)), lcd_preheat_pla); - MENU_ITEM(function, PSTR("PET - " STRINGIFY(PET_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)), lcd_preheat_pet); - MENU_ITEM(function, PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), lcd_preheat_hips); - MENU_ITEM(function, PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PP_PREHEAT_HPB_TEMP)), lcd_preheat_pp); - MENU_ITEM(function, PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), lcd_preheat_flex); - - MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); - - END_MENU(); -} - -static void lcd_support_menu() -{ - START_MENU(); - - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); - - MENU_ITEM(back, PSTR(MSG_FW_VERSION " - " FW_version), lcd_main_menu); - MENU_ITEM(back, MSG_PRUSA3D, lcd_main_menu); - MENU_ITEM(back, MSG_PRUSA3D_FORUM, lcd_main_menu); - MENU_ITEM(back, MSG_PRUSA3D_HOWTO, lcd_main_menu); - MENU_ITEM(back, PSTR("------------"), lcd_main_menu); - MENU_ITEM(back, PSTR(FILAMENT_SIZE), lcd_main_menu); - MENU_ITEM(back, PSTR(ELECTRONICS),lcd_main_menu); - MENU_ITEM(back, PSTR(NOZZLE_TYPE),lcd_main_menu); - MENU_ITEM(back, PSTR("------------"), lcd_main_menu); - MENU_ITEM(back, PSTR("Date: "), lcd_main_menu); - MENU_ITEM(back, PSTR(__DATE__), lcd_main_menu); - - END_MENU(); -} - -void lcd_unLoadFilament() -{ - - if (degHotend0() > EXTRUDE_MINTEMP) { - - enquecommand_P(PSTR(UNLOAD_FILAMENT_0)); - enquecommand_P(PSTR(UNLOAD_FILAMENT_1)); - - } else { - - lcd_implementation_clear(); - lcd.setCursor(0, 0); - lcd_printPGM(MSG_ERROR); - lcd.setCursor(0, 2); - lcd_printPGM(MSG_PREHEAT_NOZZLE); - - delay(2000); - lcd_implementation_clear(); - } - - lcd_return_to_status(); -} - -void lcd_change_filament() { - - lcd_implementation_clear(); - - lcd.setCursor(0, 1); - - lcd_printPGM(MSG_CHANGING_FILAMENT); - - -} - - -void lcd_wait_interact() { - - lcd_implementation_clear(); - - lcd.setCursor(0, 1); - - lcd_printPGM(MSG_INSERT_FILAMENT); - lcd.setCursor(0, 2); - lcd_printPGM(MSG_PRESS); - -} - - -void lcd_change_success() { - - lcd_implementation_clear(); - - lcd.setCursor(0, 2); - - lcd_printPGM(MSG_CHANGE_SUCCESS); - - -} - - -void lcd_loading_color() { - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - - lcd_printPGM(MSG_LOADING_COLOR); - lcd.setCursor(0, 2); - lcd_printPGM(MSG_PLEASE_WAIT); - - - for (int i = 0; i < 20; i++) { - - lcd.setCursor(i, 3); - lcd.print("."); - for (int j = 0; j < 10 ; j++) { - manage_heater(); - manage_inactivity(true); - delay(85); - - } - - - } - -} - - -void lcd_loading_filament() { - - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - - lcd_printPGM(MSG_LOADING_FILAMENT); - lcd.setCursor(0, 2); - lcd_printPGM(MSG_PLEASE_WAIT); - - - for (int i = 0; i < 20; i++) { - - lcd.setCursor(i, 3); - lcd.print("."); - for (int j = 0; j < 10 ; j++) { - manage_heater(); - manage_inactivity(true); - delay(110); - - } - - - } - -} - -void lcd_alright() { - int enc_dif = 0; - int cursor_pos = 1; - - - - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - - lcd_printPGM(MSG_CORRECTLY); - - lcd.setCursor(1, 1); - - lcd_printPGM(MSG_YES); - - lcd.setCursor(1, 2); - - lcd_printPGM(MSG_NOT_LOADED); - - - lcd.setCursor(1, 3); - lcd_printPGM(MSG_NOT_COLOR); - - - lcd.setCursor(0, 1); - - lcd.print(">"); - - - enc_dif = encoderDiff; - - while (lcd_change_fil_state == 0) { - - manage_heater(); - manage_inactivity(true); - - if ( abs((enc_dif - encoderDiff)) > 4 ) { - - if ( (abs(enc_dif - encoderDiff)) > 1 ) { - if (enc_dif > encoderDiff ) { - cursor_pos --; - } - - if (enc_dif < encoderDiff ) { - cursor_pos ++; - } - - if (cursor_pos > 3) { - cursor_pos = 3; - } - - if (cursor_pos < 1) { - cursor_pos = 1; - } - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(0, 2); - lcd.print(" "); - lcd.setCursor(0, 3); - lcd.print(" "); - lcd.setCursor(0, cursor_pos); - lcd.print(">"); - enc_dif = encoderDiff; - delay(100); - } - - } - - - if (lcd_clicked()) { - - lcd_change_fil_state = cursor_pos; - delay(500); - - } - - - - }; - - - lcd_implementation_clear(); - lcd_return_to_status(); - -} - - - -void lcd_LoadFilament() -{ - if (degHotend0() > EXTRUDE_MINTEMP) - { - custom_message = true; - lcd_commands_type = 1; - SERIAL_ECHOLN("Loading filament"); - // commands() will handle the rest - } - else - { - - lcd_implementation_clear(); - lcd.setCursor(0, 0); - lcd_printPGM(MSG_ERROR); - lcd.setCursor(0, 2); - lcd_printPGM(MSG_PREHEAT_NOZZLE); - delay(2000); - lcd_implementation_clear(); - } - lcd_return_to_status(); -} - - -static void lcd_menu_statistics() -{ - - if (IS_SD_PRINTING) - { - int _met = total_filament_used / 100000; - int _cm = (total_filament_used - (_met * 100000))/10; - - int _t = (millis() - starttime) / 1000; - - int _h = _t / 3600; - int _m = (_t - (_h * 60)) / 60; - int _s = _t - ((_h * 3600) + (_m * 60)); - - lcd.setCursor(0, 0); - lcd_printPGM(MSG_STATS_FILAMENTUSED); - - lcd.setCursor(6, 1); - lcd.print(itostr3(_met)); - lcd.print("m "); - lcd.print(ftostr32ns(_cm)); - lcd.print("cm"); - - lcd.setCursor(0, 2); - lcd_printPGM(MSG_STATS_PRINTTIME); - - lcd.setCursor(8, 3); - lcd.print(itostr2(_h)); - lcd.print("h "); - lcd.print(itostr2(_m)); - lcd.print("m "); - lcd.print(itostr2(_s)); - lcd.print("s"); - - if (lcd_clicked()) - { - lcd_quick_feedback(); - lcd_return_to_status(); - } - } - else - { - unsigned long _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); - unsigned long _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); - uint8_t _days, _hours, _minutes; - - float _filament_m = (float)_filament; - int _filament_km = (_filament >= 100000) ? _filament / 100000 : 0; - if (_filament_km > 0) _filament_m = _filament - (_filament_km * 100000); - - _days = _time / 1440; - _hours = (_time - (_days * 1440)) / 60; - _minutes = _time - ((_days * 1440) + (_hours * 60)); - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - lcd_printPGM(MSG_STATS_TOTALFILAMENT); - lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)), 1); - lcd.print(ftostr32ns(_filament_m)); - - if (_filament_km > 0) - { - lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)) - 3, 1); - lcd.print("km"); - lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)) - 8, 1); - lcd.print(itostr4(_filament_km)); - } - - - lcd.setCursor(18, 1); - lcd.print("m"); - - lcd.setCursor(0, 2); - lcd_printPGM(MSG_STATS_TOTALPRINTTIME);; - - lcd.setCursor(18, 3); - lcd.print("m"); - lcd.setCursor(14, 3); - lcd.print(itostr3(_minutes)); - - lcd.setCursor(14, 3); - lcd.print(":"); - - lcd.setCursor(12, 3); - lcd.print("h"); - lcd.setCursor(9, 3); - lcd.print(itostr3(_hours)); - - lcd.setCursor(9, 3); - lcd.print(":"); - - lcd.setCursor(7, 3); - lcd.print("d"); - lcd.setCursor(4, 3); - lcd.print(itostr3(_days)); - - - - while (!lcd_clicked()) - { - manage_heater(); - manage_inactivity(true); - delay(100); - } - - lcd_quick_feedback(); - lcd_return_to_status(); - } -} - - -static void _lcd_move(const char *name, int axis, int min, int max) { - if (encoderPosition != 0) { - refresh_cmd_timeout(); - current_position[axis] += float((int)encoderPosition) * 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; - encoderPosition = 0; -#ifdef DELTA - calculate_delta(current_position); - plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis] / 60, active_extruder); -#else - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis] / 60, active_extruder); -#endif - lcdDrawUpdate = 1; - } - if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis])); - if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); -} - - -static void lcd_move_e() -{ - if (encoderPosition != 0) - { - current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale; - encoderPosition = 0; -#ifdef DELTA - calculate_delta(current_position); - plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS] / 60, active_extruder); -#else - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS] / 60, active_extruder); -#endif - lcdDrawUpdate = 1; - } - if (lcdDrawUpdate) - { - lcd_implementation_drawedit(PSTR("Extruder"), ftostr31(current_position[E_AXIS])); - } - if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); -} - - -void EEPROM_save_B(int pos, int* value) -{ - union Data data; - data.value = *value; - - eeprom_write_byte((unsigned char*)pos, data.b[0]); - eeprom_write_byte((unsigned char*)pos + 1, data.b[1]); - - -} - -void EEPROM_read_B(int pos, int* value) -{ - union Data data; - data.b[0] = eeprom_read_byte((unsigned char*)pos); - data.b[1] = eeprom_read_byte((unsigned char*)pos + 1); - *value = data.value; - -} - - - -static void lcd_move_x() { - _lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS); -} -static void lcd_move_y() { - _lcd_move(PSTR("Y"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); -} -static void lcd_move_z() { - _lcd_move(PSTR("Z"), Z_AXIS, Z_MIN_POS, Z_MAX_POS); -} - - - -static void _lcd_babystep(int axis, const char *msg) { - if (encoderPosition != 0) - { - babystepsTodo[axis] += (int)encoderPosition; - babystepMem[axis] += (int)encoderPosition; - babystepMemMM[axis] = babystepMem[axis]/axis_steps_per_unit[Z_AXIS]; - delay(50); - encoderPosition = 0; - lcdDrawUpdate = 1; - } - if (lcdDrawUpdate) lcd_implementation_drawedit_2(msg, ftostr13ns(babystepMemMM[axis])); - if (LCD_CLICKED) lcd_goto_menu(lcd_main_menu); - EEPROM_save_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_save_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_save_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); -} - -static void lcd_babystep_x() { - _lcd_babystep(X_AXIS, (MSG_BABYSTEPPING_X)); -} -static void lcd_babystep_y() { - _lcd_babystep(Y_AXIS, (MSG_BABYSTEPPING_Y)); -} - - -static void lcd_babystep_z() { - _lcd_babystep(Z_AXIS, (MSG_BABYSTEPPING_Z)); -} - - -void lcd_adjust_z() { - int enc_dif = 0; - int cursor_pos = 1; - int fsm = 0; - - - - - lcd_implementation_clear(); - lcd.setCursor(0, 0); - lcd_printPGM(MSG_ADJUSTZ); - lcd.setCursor(1, 1); - lcd_printPGM(MSG_YES); - - lcd.setCursor(1, 2); - - lcd_printPGM(MSG_NO); - - lcd.setCursor(0, 1); - - lcd.print(">"); - - - enc_dif = encoderDiff; - - while (fsm == 0) { - - manage_heater(); - manage_inactivity(true); - - if ( abs((enc_dif - encoderDiff)) > 4 ) { - - if ( (abs(enc_dif - encoderDiff)) > 1 ) { - if (enc_dif > encoderDiff ) { - cursor_pos --; - } - - if (enc_dif < encoderDiff ) { - cursor_pos ++; - } - - if (cursor_pos > 2) { - cursor_pos = 2; - } - - if (cursor_pos < 1) { - cursor_pos = 1; - } - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(0, 2); - lcd.print(" "); - lcd.setCursor(0, cursor_pos); - lcd.print(">"); - enc_dif = encoderDiff; - delay(100); - } - - } - - - if (lcd_clicked()) { - fsm = cursor_pos; - if (fsm == 1) { - EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); - babystepsTodo[Z_AXIS] = babystepMem[2]; - } else { - babystepMem[0] = 0; - babystepMem[1] = 0; - babystepMem[2] = 0; - - EEPROM_save_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_save_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_save_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); - } - delay(500); - } - }; - - lcd_implementation_clear(); - lcd_return_to_status(); - -} - -void lcd_calibration() { -} - - - -void lcd_pick_babystep(){ - int enc_dif = 0; - int cursor_pos = 1; - int fsm = 0; - - - - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - - lcd_printPGM(MSG_PICK_Z); - - - lcd.setCursor(3, 2); - - lcd.print("1"); - - lcd.setCursor(3, 3); - - lcd.print("2"); - - lcd.setCursor(12, 2); - - lcd.print("3"); - - lcd.setCursor(12, 3); - - lcd.print("4"); - - lcd.setCursor(1, 2); - - lcd.print(">"); - - - enc_dif = encoderDiff; - - while (fsm == 0) { - - manage_heater(); - manage_inactivity(true); - - if ( abs((enc_dif - encoderDiff)) > 4 ) { - - if ( (abs(enc_dif - encoderDiff)) > 1 ) { - if (enc_dif > encoderDiff ) { - cursor_pos --; - } - - if (enc_dif < encoderDiff ) { - cursor_pos ++; - } - - if (cursor_pos > 4) { - cursor_pos = 4; - } - - if (cursor_pos < 1) { - cursor_pos = 1; - } - - - lcd.setCursor(1, 2); - lcd.print(" "); - lcd.setCursor(1, 3); - lcd.print(" "); - lcd.setCursor(10, 2); - lcd.print(" "); - lcd.setCursor(10, 3); - lcd.print(" "); - - if (cursor_pos < 3) { - lcd.setCursor(1, cursor_pos+1); - lcd.print(">"); - }else{ - lcd.setCursor(10, cursor_pos-1); - lcd.print(">"); - } - - - enc_dif = encoderDiff; - delay(100); - } - - } - - - if (lcd_clicked()) { - fsm = cursor_pos; - - EEPROM_read_B(EEPROM_BABYSTEP_Z0+((fsm-1)*2),&babystepMem[2]); - EEPROM_save_B(EEPROM_BABYSTEP_Z,&babystepMem[2]); - eeprom_write_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET, 0x01); - delay(500); - - } - - - - }; - - - lcd_implementation_clear(); - lcd_return_to_status(); -} - -void lcd_move_menu_axis() -{ - START_MENU(); - MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); - MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x); - MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y); - if (move_menu_scale < 10.0) - { - if (!isPrintPaused) - { - MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z); - } - MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e); - } - END_MENU(); -} - -static void lcd_move_menu_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); -} - - - -static void lcd_silent_mode_set() { - SilentModeMenu = !SilentModeMenu; - EEPROM_save(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); - digipot_init(); - lcd_goto_menu(lcd_settings_menu, 7); -} -static void lcd_set_lang(unsigned char lang) { - lang_selected = lang; - firstrun = 1; - eeprom_write_byte((unsigned char *)EEPROM_LANG, lang);/*langsel=0;*/if (langsel == 1)langsel = 2; -} - -void lcd_force_language_selection() { - eeprom_write_byte((unsigned char *)EEPROM_LANG, 255); -} - -static void lcd_language_menu() -{ - START_MENU(); - if (!langsel) { - MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); - } - if (langsel == 2) { - MENU_ITEM(back, MSG_WATCH, lcd_status_screen); - } - for (int i=0;i<LANG_NUM;i++){ - MENU_ITEM(setlang, MSG_ALL[i][LANGUAGE_NAME], i); - } - //MENU_ITEM(setlang, MSG_ALL[1][LANGUAGE_NAME], 1); - END_MENU(); -} - -void lcd_mesh_bedleveling() -{ - - enquecommand_P(PSTR("G80")); - lcd_return_to_status(); -} - - -static void lcd_settings_menu() -{ - EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); - START_MENU(); - - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); - - MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); - MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu_1mm); - - if (!isPrintPaused) - { -#ifndef MESH_BED_LEVELING - MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z")); -#else - MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_bedleveling); -#endif - } - - if (!isPrintPaused) - { - MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); - MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); - } - - if (SilentModeMenu == 0) { - MENU_ITEM(function, MSG_SILENT_MODE_OFF, lcd_silent_mode_set); - } else { - MENU_ITEM(function, MSG_SILENT_MODE_ON, lcd_silent_mode_set); - } - - EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); - babystepMemMM[2] = babystepMem[2]/axis_steps_per_unit[Z_AXIS]; - - if (!isPrintPaused) - { - MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8 - } - MENU_ITEM(submenu, MSG_LANGUAGE_SELECT, lcd_language_menu); - if (!isPrintPaused) - { - MENU_ITEM(submenu, MSG_SELFTEST, lcd_selftest); - } - - END_MENU(); -} -/* -void lcd_mylang_top(int hlaska) { - lcd.setCursor(0,0); - lcd.print(" "); - lcd.setCursor(0,0); - lcd_printPGM(MSG_ALL[hlaska-1][LANGUAGE_SELECT]); -} - -void lcd_mylang_drawmenu(int cursor) { - int first = 0; - if (cursor>2) first = cursor-2; - if (cursor==LANG_NUM) first = LANG_NUM-3; - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(1, 1); - lcd_printPGM(MSG_ALL[first][LANGUAGE_NAME]); - - lcd.setCursor(0, 2); - lcd.print(" "); - lcd.setCursor(1, 2); - lcd_printPGM(MSG_ALL[first+1][LANGUAGE_NAME]); - - lcd.setCursor(0, 3); - lcd.print(" "); - lcd.setCursor(1, 3); - lcd_printPGM(MSG_ALL[first+2][LANGUAGE_NAME]); - - if (cursor==1) lcd.setCursor(0, 1); - if (cursor>1 && cursor<LANG_NUM) lcd.setCursor(0, 2); - if (cursor==LANG_NUM) lcd.setCursor(0, 3); - - lcd.print(">"); - - if (cursor<LANG_NUM-1) { - lcd.setCursor(19,3); - lcd.print("\x01"); - } - if (cursor>2) { - lcd.setCursor(19,1); - lcd.print("^"); - } -} -*/ - -void lcd_mylang_drawmenu(int cursor) { - int first = 0; - if (cursor>3) first = cursor-3; - if (cursor==LANG_NUM && LANG_NUM>4) first = LANG_NUM-4; - if (cursor==LANG_NUM && LANG_NUM==4) first = LANG_NUM-4; - - - lcd.setCursor(0, 0); - lcd.print(" "); - lcd.setCursor(1, 0); - lcd_printPGM(MSG_ALL[first+0][LANGUAGE_NAME]); - - lcd.setCursor(0, 1); - lcd.print(" "); - lcd.setCursor(1, 1); - lcd_printPGM(MSG_ALL[first+1][LANGUAGE_NAME]); - - lcd.setCursor(0, 2); - lcd.print(" "); - - if (LANG_NUM > 2){ - lcd.setCursor(1, 2); - lcd_printPGM(MSG_ALL[first+2][LANGUAGE_NAME]); - } - - lcd.setCursor(0, 3); - lcd.print(" "); - if (LANG_NUM>3) { - lcd.setCursor(1, 3); - lcd_printPGM(MSG_ALL[first+3][LANGUAGE_NAME]); - } - - if (cursor==1) lcd.setCursor(0, 0); - if (cursor==2) lcd.setCursor(0, 1); - if (cursor>2) lcd.setCursor(0, 2); - if (cursor==LANG_NUM && LANG_NUM>3) lcd.setCursor(0, 3); - - lcd.print(">"); - - if (cursor<LANG_NUM-1 && LANG_NUM>4) { - lcd.setCursor(19,3); - lcd.print("\x01"); - } - if (cursor>3 && LANG_NUM>4) { - lcd.setCursor(19,0); - lcd.print("^"); - } -} - -void lcd_set_custom_characters_arrows(); -void lcd_set_custom_characters_degree(); - -void lcd_mylang_drawcursor(int cursor) { - - if (cursor==1) lcd.setCursor(0, 1); - if (cursor>1 && cursor<LANG_NUM) lcd.setCursor(0, 2); - if (cursor==LANG_NUM) lcd.setCursor(0, 3); - - lcd.print(">"); - -} - -void lcd_mylang() { - int enc_dif = 0; - int cursor_pos = 1; - lang_selected=255; - int hlaska=1; - int counter=0; - lcd_set_custom_characters_arrows(); - - lcd_implementation_clear(); - - //lcd_mylang_top(hlaska); - - lcd_mylang_drawmenu(cursor_pos); - - - enc_dif = encoderDiff; - - while ( (lang_selected == 255) && (MYSERIAL.available() < 2) ) { - - manage_heater(); - manage_inactivity(true); - - if ( abs((enc_dif - encoderDiff)) > 4 ) { - - //if ( (abs(enc_dif - encoderDiff)) > 1 ) { - if (enc_dif > encoderDiff ) { - cursor_pos --; - } - - if (enc_dif < encoderDiff ) { - cursor_pos ++; - } - - if (cursor_pos > LANG_NUM) { - cursor_pos = LANG_NUM; - } - - if (cursor_pos < 1) { - cursor_pos = 1; - } - - lcd_mylang_drawmenu(cursor_pos); - enc_dif = encoderDiff; - delay(100); - //} - - } else delay(20); - - - if (lcd_clicked()) { - - lcd_set_lang(cursor_pos-1); - delay(500); - - } - /* - if (++counter == 80) { - hlaska++; - if(hlaska>LANG_NUM) hlaska=1; - lcd_mylang_top(hlaska); - lcd_mylang_drawcursor(cursor_pos); - counter=0; - } - */ - }; - - if(MYSERIAL.available() > 1){ - lang_selected = 0; - firstrun = 0; - } - - lcd_set_custom_characters_degree(); - lcd_implementation_clear(); - lcd_return_to_status(); - -} - - - - -static void lcd_main_menu() -{ - - SDscrool = 0; - /* - if (langsel == 1) - { - lcd_goto_menu(lcd_language_menu); - } - */ - START_MENU(); - - // Majkl superawesome menu - - - MENU_ITEM(back, MSG_WATCH, lcd_status_screen); - - if ( ( IS_SD_PRINTING || is_usb_printing ) && (current_position[Z_AXIS] < 0.5) ) - { - EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); - EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); - EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); - - MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8 - } - - - if ( movesplanned() || IS_SD_PRINTING || is_usb_printing ) - { - MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); - } else - { - MENU_ITEM(submenu, MSG_PREHEAT, lcd_preheat_menu); - } - -#ifdef SDSUPPORT - if (card.cardOK) - { - if (card.isFileOpen()) - { - if (card.sdprinting) - { - MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause); - } - else - { - MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); - } - MENU_ITEM(submenu, MSG_STOP_PRINT, lcd_sdcard_stop); - } - else - { - if (!is_usb_printing) - { - MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); - } -#if SDCARDDETECT < 1 - MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21")); // SD-card changed by user -#endif - } - } else - { - MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu); -#if SDCARDDETECT < 1 - MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface -#endif - } -#endif - - - if (IS_SD_PRINTING || is_usb_printing) - { - } - else - { - MENU_ITEM(function, MSG_LOAD_FILAMENT, lcd_LoadFilament); - MENU_ITEM(function, MSG_UNLOAD_FILAMENT, lcd_unLoadFilament); - MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu); - } - - if (!is_usb_printing) - { - MENU_ITEM(submenu, MSG_STATISTICS, lcd_menu_statistics); - } - MENU_ITEM(submenu, MSG_SUPPORT, lcd_support_menu); - - END_MENU(); -} - - - -#ifdef SDSUPPORT -static void lcd_autostart_sd() -{ - card.lastnr = 0; - card.setroot(); - card.checkautostart(true); -} -#endif - - - -static void lcd_silent_mode_set_tune() { - SilentModeMenu = !SilentModeMenu; - EEPROM_save(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); - digipot_init(); - lcd_goto_menu(lcd_tune_menu, 9); -} - -static void lcd_tune_menu() -{ - EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); - - - - START_MENU(); - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); //1 - MENU_ITEM_EDIT(int3, MSG_SPEED, &feedmultiply, 10, 999);//2 - - MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3 - MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 10);//4 - - MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);//5 - MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999);//6 -#ifdef FILAMENTCHANGEENABLE - MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600"));//7 -#endif - - if (SilentModeMenu == 0) { - MENU_ITEM(function, MSG_SILENT_MODE_OFF, lcd_silent_mode_set_tune); - } else { - MENU_ITEM(function, MSG_SILENT_MODE_ON, lcd_silent_mode_set_tune); - } - END_MENU(); -} - - - - -static void lcd_move_menu_01mm() -{ - move_menu_scale = 0.1; - lcd_move_menu_axis(); -} - -static void lcd_control_temperature_menu() -{ -#ifdef PIDTEMP - // set up temp variables - undo the default scaling - raw_Ki = unscalePID_i(Ki); - raw_Kd = unscalePID_d(Kd); -#endif - - START_MENU(); - MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); - //MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); -#if TEMP_SENSOR_0 != 0 - MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10); -#endif -#if TEMP_SENSOR_1 != 0 - MENU_ITEM_EDIT(int3, MSG_NOZZLE1, &target_temperature[1], 0, HEATER_1_MAXTEMP - 10); -#endif -#if TEMP_SENSOR_2 != 0 - MENU_ITEM_EDIT(int3, MSG_NOZZLE2, &target_temperature[2], 0, HEATER_2_MAXTEMP - 10); -#endif -#if TEMP_SENSOR_BED != 0 - MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 3); -#endif - MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); -#if defined AUTOTEMP && (TEMP_SENSOR_0 != 0) - MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &autotemp_enabled); - MENU_ITEM_EDIT(float3, MSG_MIN, &autotemp_min, 0, HEATER_0_MAXTEMP - 10); - MENU_ITEM_EDIT(float3, MSG_MAX, &autotemp_max, 0, HEATER_0_MAXTEMP - 10); - MENU_ITEM_EDIT(float32, MSG_FACTOR, &autotemp_factor, 0.0, 1.0); -#endif - - END_MENU(); -} - - -#if SDCARDDETECT == -1 -static void lcd_sd_refresh() -{ - card.initsd(); - currentMenuViewOffset = 0; -} -#endif -static void lcd_sd_updir() -{ - SDscrool = 0; - card.updir(); - currentMenuViewOffset = 0; -} - - -void lcd_sdcard_stop() -{ - - lcd.setCursor(0, 0); - lcd_printPGM(MSG_STOP_PRINT); - lcd.setCursor(2, 2); - lcd_printPGM(MSG_NO); - lcd.setCursor(2, 3); - lcd_printPGM(MSG_YES); - lcd.setCursor(0, 2); lcd.print(" "); - lcd.setCursor(0, 3); lcd.print(" "); - - if ((int32_t)encoderPosition > 2) { encoderPosition = 2; } - if ((int32_t)encoderPosition < 1) { encoderPosition = 1; } - - lcd.setCursor(0, 1 + encoderPosition); - lcd.print(">"); - - if (lcd_clicked()) - { - if ((int32_t)encoderPosition == 1) - { - lcd_return_to_status(); - } - if ((int32_t)encoderPosition == 2) - { - cancel_heatup = true; - quickStop(); - lcd_setstatuspgm(MSG_PRINT_ABORTED); - card.sdprinting = false; - card.closefile(); - - stoptime = millis(); - unsigned long t = (stoptime - starttime) / 1000; - save_statistics(total_filament_used, t); - - lcd_return_to_status(); - lcd_ignore_click(true); - lcd_commands_type = 2; - } - } - -} - -void lcd_sdcard_menu() -{ - - int tempScrool = 0; - if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) - //delay(100); - return; // nothing to do (so don't thrash the SD card) - uint16_t fileCnt = card.getnrfilenames(); - - START_MENU(); - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); - card.getWorkDirName(); - if (card.filename[0] == '/') - { -#if SDCARDDETECT == -1 - MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); -#endif - } else { - MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); - } - - for (uint16_t i = 0; i < fileCnt; i++) - { - if (_menuItemNr == _lineNr) - { -#ifndef SDCARD_RATHERRECENTFIRST - card.getfilename(i); -#else - card.getfilename(fileCnt - 1 - i); -#endif - if (card.filenameIsDir) - { - MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); - } else { - - MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); - - - - - } - } else { - MENU_ITEM_DUMMY(); - } - } - END_MENU(); -} - -#define menu_edit_type(_type, _name, _strFunc, scale) \ - void menu_edit_ ## _name () \ - { \ - if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ - if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ - if (lcdDrawUpdate) \ - lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \ - if (LCD_CLICKED) \ - { \ - *((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \ - lcd_goto_menu(prevMenu, prevEncoderPosition); \ - } \ - } \ - void menu_edit_callback_ ## _name () { \ - menu_edit_ ## _name (); \ - if (LCD_CLICKED) (*callbackFunc)(); \ - } \ - static void menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) \ - { \ - prevMenu = currentMenu; \ - prevEncoderPosition = encoderPosition; \ - \ - lcdDrawUpdate = 2; \ - currentMenu = menu_edit_ ## _name; \ - \ - editLabel = pstr; \ - editValue = ptr; \ - minEditValue = minValue * scale; \ - maxEditValue = maxValue * scale - minEditValue; \ - encoderPosition = (*ptr) * scale - minEditValue; \ - }\ - static void menu_action_setting_edit_callback_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue, menuFunc_t callback) \ - { \ - prevMenu = currentMenu; \ - prevEncoderPosition = encoderPosition; \ - \ - lcdDrawUpdate = 2; \ - currentMenu = menu_edit_callback_ ## _name; \ - \ - editLabel = pstr; \ - editValue = ptr; \ - minEditValue = minValue * scale; \ - maxEditValue = maxValue * scale - minEditValue; \ - encoderPosition = (*ptr) * scale - minEditValue; \ - callbackFunc = callback;\ - } -menu_edit_type(int, int3, itostr3, 1) -menu_edit_type(float, float3, ftostr3, 1) -menu_edit_type(float, float32, ftostr32, 100) -menu_edit_type(float, float43, ftostr43, 1000) -menu_edit_type(float, float5, ftostr5, 0.01) -menu_edit_type(float, float51, ftostr51, 10) -menu_edit_type(float, float52, ftostr52, 100) -menu_edit_type(unsigned long, long5, ftostr5, 0.01) - - -static void lcd_selftest() -{ - int _progress = 0; - bool _result = false; - - _progress = lcd_selftest_screen(-1, _progress, 4, true, 2000); - - _progress = lcd_selftest_screen(0, _progress, 3, true, 2000); - _result = lcd_selfcheck_endstops(); - - if (_result) - { - _progress = lcd_selftest_screen(1, _progress, 3, true, 1000); - _result = lcd_selfcheck_check_heater(false); - } - - if (_result) - { - _progress = lcd_selftest_screen(2, _progress, 3, true, 2000); - _result = lcd_selfcheck_axis(0, X_MAX_POS); - } - - if (_result) - { - _progress = lcd_selftest_screen(3, _progress, 3, true, 1500); - _result = lcd_selfcheck_axis(1, Y_MAX_POS); - } - - if (_result) - { - current_position[X_AXIS] = current_position[X_AXIS] - 3; - current_position[Y_AXIS] = current_position[Y_AXIS] - 14; - _progress = lcd_selftest_screen(4, _progress, 3, true, 1500); - _result = lcd_selfcheck_axis(2, Z_MAX_POS); - } - - if (_result) - { - _progress = lcd_selftest_screen(5, _progress, 3, true, 2000); - _result = lcd_selfcheck_check_heater(true); - } - if (_result) - { - _progress = lcd_selftest_screen(6, _progress, 3, true, 5000); - } - else - { - _progress = lcd_selftest_screen(7, _progress, 3, true, 5000); - } - - lcd_implementation_clear(); - lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; - - if (_result) - { - LCD_ALERTMESSAGERPGM(MSG_SELFTEST_OK); - } - else - { - LCD_ALERTMESSAGERPGM(MSG_SELFTEST_FAILED); - } -} -static bool lcd_selfcheck_endstops() -{ - bool _result = true; - - if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) - { - current_position[0] = (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? current_position[0] = current_position[0] + 10 : current_position[0]; - current_position[1] = (READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? current_position[1] = current_position[1] + 10 : current_position[1]; - current_position[2] = (READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? current_position[2] = current_position[2] + 10 : current_position[2]; - } - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[0] / 60, active_extruder); - delay(500); - - if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) - { - _result = false; - String _error = String((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? "X" : "") + - String((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? "Y" : "") + - String((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? "Z" : ""); - lcd_selftest_error(3, _error.c_str(), ""); - } - manage_heater(); - manage_inactivity(); - return _result; -} -static bool lcd_selfcheck_axis(int _axis, int _travel) -{ - 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); - - do { - - if (_axis == 2) - { - current_position[_axis] = current_position[_axis] - 1; - } - else - { - current_position[_axis] = current_position[_axis] - 3; - } - - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); - st_synchronize(); - - if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) - { - if (_axis == 0) - { - _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; - disable_x(); - } - if (_axis == 1) - { - _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; - disable_y(); - } - if (_axis == 2) - { - _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; - disable_z(); - } - _stepdone = true; - } - - if (_lcd_refresh < 6) - { - _lcd_refresh++; - } - else - { - _progress = lcd_selftest_screen(2 + _axis, _progress, 3, false, 0); - _lcd_refresh = 0; - } - - manage_heater(); - manage_inactivity(); - - delay(100); - (_travel_done <= _travel) ? _travel_done++ : _stepdone = true; - - } while (!_stepdone); - - - current_position[_axis] = current_position[_axis] + 15; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); - - 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"; - - if (_travel_done >= _travel) - { - lcd_selftest_error(5, _error_1, _error_2); - } - else - { - lcd_selftest_error(4, _error_1, _error_2); - } - } - - return _stepresult; -} -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(); - int _cycles = (_isbed) ? 120 : 30; - - target_temperature[0] = (_isbed) ? 0 : 100; - target_temperature_bed = (_isbed) ? 100 : 0; - manage_heater(); - manage_inactivity(); - - do { - _counter++; - (_counter < _cycles) ? _docycle = true : _docycle = false; - - manage_heater(); - manage_inactivity(); - _progress = (_isbed) ? lcd_selftest_screen(5, _progress, 2, false, 400) : lcd_selftest_screen(1, _progress, 2, false, 400); - - } while (_docycle); - - 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; - - if (_opposite_result < (_isbed) ? 10 : 3) - { - if (_checked_result >= (_isbed) ? 3 : 10) - { - _stepresult = true; - } - else - { - lcd_selftest_error(1, "", ""); - } - } - else - { - lcd_selftest_error(2, "", ""); - } - - manage_heater(); - manage_inactivity(); - return _stepresult; - -} -static void lcd_selftest_error(int _error_no, const char *_error_1, const char *_error_2) -{ - lcd_implementation_quick_feedback(); - - target_temperature[0] = 0; - target_temperature_bed = 0; - manage_heater(); - manage_inactivity(); - - lcd_implementation_clear(); - - lcd.setCursor(0, 0); - lcd_printPGM(MSG_SELFTEST_ERROR); - lcd.setCursor(0, 1); - lcd_printPGM(MSG_SELFTEST_PLEASECHECK); - - switch (_error_no) - { - case 1: - lcd.setCursor(0, 2); - lcd_printPGM(MSG_SELFTEST_HEATERTHERMISTOR); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_SELFTEST_NOTCONNECTED); - break; - case 2: - lcd.setCursor(0, 2); - lcd_printPGM(MSG_SELFTEST_BEDHEATER); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_SELFTEST_WIRINGERROR); - break; - case 3: - lcd.setCursor(0, 2); - lcd_printPGM(MSG_SELFTEST_ENDSTOPS); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_SELFTEST_WIRINGERROR); - lcd.setCursor(17, 3); - lcd.print(_error_1); - break; - case 4: - lcd.setCursor(0, 2); - lcd_printPGM(MSG_SELFTEST_MOTOR); - lcd.setCursor(18, 2); - lcd.print(_error_1); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_SELFTEST_ENDSTOP); - lcd.setCursor(18, 3); - lcd.print(_error_2); - break; - case 5: - lcd.setCursor(0, 2); - lcd_printPGM(MSG_SELFTEST_ENDSTOP_NOTHIT); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_SELFTEST_MOTOR); - lcd.setCursor(18, 3); - lcd.print(_error_1); - break; - - } - - delay(1000); - lcd_implementation_quick_feedback(); - - do { - delay(100); - manage_heater(); - manage_inactivity(); - } while (!lcd_clicked()); - - LCD_ALERTMESSAGERPGM(MSG_SELFTEST_FAILED); - lcd_return_to_status(); - -} -static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bool _clear, int _delay) -{ - lcd_next_update_millis = millis() + (LCD_UPDATE_INTERVAL * 10000); - - int _step_block = 0; - const char *_indicator = (_progress > _progress_scale) ? "-" : "|"; - - if (_clear) lcd_implementation_clear(); - - - lcd.setCursor(0, 0); - - if (_step == -1) lcd_printPGM(MSG_SELFTEST_START); - if (_step == 0) lcd_printPGM(MSG_SELFTEST_CHECK_ENDSTOPS); - if (_step == 1) lcd_printPGM(MSG_SELFTEST_CHECK_HOTEND); - if (_step == 2) lcd_printPGM(MSG_SELFTEST_CHECK_X); - if (_step == 3) lcd_printPGM(MSG_SELFTEST_CHECK_Y); - if (_step == 4) lcd_printPGM(MSG_SELFTEST_CHECK_Z); - if (_step == 5) lcd_printPGM(MSG_SELFTEST_CHECK_BED); - if (_step == 6) lcd_printPGM(MSG_SELFTEST_CHECK_ALLCORRECT); - if (_step == 7) lcd_printPGM(MSG_SELFTEST_FAILED); - - lcd.setCursor(0, 1); - lcd.print("--------------------"); - - _step_block = 1; - lcd_selftest_screen_step(3, 9, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Hotend", _indicator); - - _step_block = 2; - lcd_selftest_screen_step(2, 2, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "X", _indicator); - - _step_block = 3; - lcd_selftest_screen_step(2, 8, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Y", _indicator); - - _step_block = 4; - lcd_selftest_screen_step(2, 14, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Z", _indicator); - - _step_block = 5; - lcd_selftest_screen_step(3, 0, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Bed", _indicator); - - - if (_delay > 0) delay(_delay); - _progress++; - - return (_progress > _progress_scale * 2) ? 0 : _progress; -} -static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator) -{ - lcd.setCursor(_col, _row); - - switch (_state) - { - case 1: - lcd.print(_name); - lcd.setCursor(_col + strlen(_name), _row); - lcd.print(":"); - lcd.setCursor(_col + strlen(_name) + 1, _row); - lcd.print(_indicator); - break; - case 2: - lcd.print(_name); - lcd.setCursor(_col + strlen(_name), _row); - lcd.print(":"); - lcd.setCursor(_col + strlen(_name) + 1, _row); - lcd.print("OK"); - break; - default: - lcd.print(_name); - } -} - - -/** End of menus **/ - -static void lcd_quick_feedback() -{ - lcdDrawUpdate = 2; - blocking_enc = millis() + 500; - lcd_implementation_quick_feedback(); -} - -/** Menu action functions **/ -static void menu_action_back(menuFunc_t data) { - lcd_goto_menu(data); -} -static void menu_action_submenu(menuFunc_t data) { - lcd_goto_menu(data); -} -static void menu_action_gcode(const char* pgcode) { - enquecommand_P(pgcode); -} -static void menu_action_setlang(unsigned char lang) { - lcd_set_lang(lang); -} -static void menu_action_function(menuFunc_t data) { - (*data)(); -} -static void menu_action_sdfile(const char* filename, char* longFilename) -{ - char cmd[30]; - char* c; - sprintf_P(cmd, PSTR("M23 %s"), filename); - for (c = &cmd[4]; *c; c++) - *c = tolower(*c); - enquecommand(cmd); - enquecommand_P(PSTR("M24")); - lcd_return_to_status(); -} -static void menu_action_sddirectory(const char* filename, char* longFilename) -{ - card.chdir(filename); - encoderPosition = 0; -} -static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) -{ - *ptr = !(*ptr); -} -static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) -{ - menu_action_setting_edit_bool(pstr, ptr); - (*callback)(); -} -#endif//ULTIPANEL - -/** LCD API **/ -void lcd_init() -{ - lcd_implementation_init(); - -#ifdef NEWPANEL - 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 -#ifdef REPRAPWORLD_KEYPAD - pinMode(SHIFT_CLK, OUTPUT); - pinMode(SHIFT_LD, OUTPUT); - pinMode(SHIFT_OUT, INPUT); - WRITE(SHIFT_OUT, HIGH); - WRITE(SHIFT_LD, HIGH); -#endif -#else // Not NEWPANEL -#ifdef SR_LCD_2W_NL // Non latching 2 wire shift register - pinMode (SR_DATA_PIN, OUTPUT); - pinMode (SR_CLK_PIN, OUTPUT); -#elif defined(SHIFT_CLK) - pinMode(SHIFT_CLK, OUTPUT); - pinMode(SHIFT_LD, OUTPUT); - pinMode(SHIFT_EN, OUTPUT); - pinMode(SHIFT_OUT, INPUT); - WRITE(SHIFT_OUT, HIGH); - WRITE(SHIFT_LD, HIGH); - WRITE(SHIFT_EN, LOW); -#else -#ifdef ULTIPANEL -#error ULTIPANEL requires an encoder -#endif -#endif // SR_LCD_2W_NL -#endif//!NEWPANEL - -#if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) - pinMode(SDCARDDETECT, INPUT); - WRITE(SDCARDDETECT, HIGH); - lcd_oldcardstatus = IS_SD_INSERTED; -#endif//(SDCARDDETECT > 0) -#ifdef LCD_HAS_SLOW_BUTTONS - slow_buttons = 0; -#endif - lcd_buttons_update(); -#ifdef ULTIPANEL - encoderDiff = 0; -#endif -} - - - - -//#include <avr/pgmspace.h> - - -void lcd_update() -{ - static unsigned long timeoutToStatus = 0; - - -#ifdef LCD_HAS_SLOW_BUTTONS - slow_buttons = lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context -#endif - - lcd_buttons_update(); - -#if (SDCARDDETECT > 0) - if ((IS_SD_INSERTED != lcd_oldcardstatus && lcd_detected())) - { - lcdDrawUpdate = 2; - lcd_oldcardstatus = IS_SD_INSERTED; - lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - currentMenu == lcd_status_screen -#endif - ); - - if (lcd_oldcardstatus) - { - card.initsd(); - LCD_MESSAGERPGM(MSG_SD_INSERTED); - } - else - { - card.release(); - LCD_MESSAGERPGM(MSG_SD_REMOVED); - } - } -#endif//CARDINSERTED - - if (lcd_next_update_millis < millis()) - { -#ifdef ULTIPANEL -#ifdef REPRAPWORLD_KEYPAD - if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) { - reprapworld_keypad_move_z_up(); - } - if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) { - reprapworld_keypad_move_z_down(); - } - if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) { - reprapworld_keypad_move_x_left(); - } - if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) { - reprapworld_keypad_move_x_right(); - } - if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) { - reprapworld_keypad_move_y_down(); - } - if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) { - reprapworld_keypad_move_y_up(); - } - if (REPRAPWORLD_KEYPAD_MOVE_HOME) { - reprapworld_keypad_move_home(); - } -#endif - if (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP) - { - lcdDrawUpdate = 1; - encoderPosition += encoderDiff / ENCODER_PULSES_PER_STEP; - encoderDiff = 0; - timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; - } - if (LCD_CLICKED) - timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; -#endif//ULTIPANEL - -#ifdef DOGLCD // Changes due to different driver architecture of the DOGM display - blink++; // Variable for fan animation and alive dot - u8g.firstPage(); - do - { - u8g.setFont(u8g_font_6x10_marlin); - u8g.setPrintPos(125, 0); - if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot - u8g.drawPixel(127, 63); // draw alive dot - u8g.setColorIndex(1); // black on white - (*currentMenu)(); - if (!lcdDrawUpdate) break; // Terminate display update, when nothing new to draw. This must be done before the last dogm.next() - } while (u8g.nextPage()); -#else - (*currentMenu)(); -#endif - -#ifdef LCD_HAS_STATUS_INDICATORS - lcd_implementation_update_indicators(); -#endif - -#ifdef ULTIPANEL - if (timeoutToStatus < millis() && currentMenu != lcd_status_screen) - { - lcd_return_to_status(); - lcdDrawUpdate = 2; - } -#endif//ULTIPANEL - if (lcdDrawUpdate == 2) lcd_implementation_clear(); - if (lcdDrawUpdate) lcdDrawUpdate--; - lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; - } - -} - -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'; -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) -#if PROGRESS_MSG_EXPIRE > 0 - messageTick = -#endif - progressBarTick = millis(); -#endif - lcdDrawUpdate = 2; - -#ifdef FILAMENT_LCD_DISPLAY - message_millis = millis(); //get status message to show up for a while -#endif -} -void lcd_setstatus(const char* message) -{ - if (lcd_status_message_level > 0) - return; - strncpy(lcd_status_message, message, LCD_WIDTH); - lcd_finishstatus(); -} -void lcd_setstatuspgm(const char* message) -{ - if (lcd_status_message_level > 0) - return; - strncpy_P(lcd_status_message, message, LCD_WIDTH); - lcd_finishstatus(); -} -void lcd_setalertstatuspgm(const char* message) -{ - lcd_setstatuspgm(message); - lcd_status_message_level = 1; -#ifdef ULTIPANEL - lcd_return_to_status(); -#endif//ULTIPANEL -} -void lcd_reset_alert_level() -{ - lcd_status_message_level = 0; -} - -#ifdef DOGLCD -void lcd_setcontrast(uint8_t value) -{ - lcd_contrast = value & 63; - u8g.setContrast(lcd_contrast); -} -#endif - -#ifdef ULTIPANEL -/* Warning: This function is called from interrupt context */ -void lcd_buttons_update() -{ -#ifdef NEWPANEL - uint8_t newbutton = 0; - if (READ(BTN_EN1) == 0) newbutton |= EN_A; - if (READ(BTN_EN2) == 0) newbutton |= EN_B; -#if BTN_ENC > 0 - if ((blocking_enc < millis()) && (READ(BTN_ENC) == 0)) - newbutton |= EN_C; -#endif - buttons = newbutton; -#ifdef LCD_HAS_SLOW_BUTTONS - buttons |= slow_buttons; -#endif -#ifdef REPRAPWORLD_KEYPAD - // for the reprapworld_keypad - uint8_t newbutton_reprapworld_keypad = 0; - WRITE(SHIFT_LD, LOW); - WRITE(SHIFT_LD, HIGH); - for (int8_t i = 0; i < 8; i++) { - newbutton_reprapworld_keypad = newbutton_reprapworld_keypad >> 1; - if (READ(SHIFT_OUT)) - newbutton_reprapworld_keypad |= (1 << 7); - WRITE(SHIFT_CLK, HIGH); - WRITE(SHIFT_CLK, LOW); - } - buttons_reprapworld_keypad = ~newbutton_reprapworld_keypad; //invert it, because a pressed switch produces a logical 0 -#endif -#else //read it from the shift register - uint8_t newbutton = 0; - WRITE(SHIFT_LD, LOW); - WRITE(SHIFT_LD, HIGH); - unsigned char tmp_buttons = 0; - for (int8_t i = 0; i < 8; i++) - { - newbutton = newbutton >> 1; - if (READ(SHIFT_OUT)) - newbutton |= (1 << 7); - WRITE(SHIFT_CLK, HIGH); - WRITE(SHIFT_CLK, LOW); - } - buttons = ~newbutton; //invert it, because a pressed switch produces a logical 0 -#endif//!NEWPANEL - - //manage encoder rotation - uint8_t enc = 0; - if (buttons & EN_A) enc |= B01; - if (buttons & EN_B) enc |= B10; - if (enc != lastEncoderBits) - { - switch (enc) - { - case encrot0: - if (lastEncoderBits == encrot3) - encoderDiff++; - else if (lastEncoderBits == encrot1) - encoderDiff--; - break; - case encrot1: - if (lastEncoderBits == encrot0) - encoderDiff++; - else if (lastEncoderBits == encrot2) - encoderDiff--; - break; - case encrot2: - if (lastEncoderBits == encrot1) - encoderDiff++; - else if (lastEncoderBits == encrot3) - encoderDiff--; - break; - case encrot3: - if (lastEncoderBits == encrot2) - encoderDiff++; - else if (lastEncoderBits == encrot0) - encoderDiff--; - break; - } - } - lastEncoderBits = enc; -} - -bool lcd_detected(void) -{ -#if (defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008)) && defined(DETECT_DEVICE) - return lcd.LcdDetected() == 1; -#else - return true; -#endif -} - -void lcd_buzz(long duration, uint16_t freq) -{ -#ifdef LCD_USE_I2C_BUZZER - lcd.buzz(duration, freq); -#endif -} - -bool lcd_clicked() -{ - return LCD_CLICKED; -} -#endif//ULTIPANEL - -/********************************/ -/** Float conversion utilities **/ -/********************************/ -// convert float to string with +123.4 format -char conv[8]; -char *ftostr3(const float &x) -{ - return itostr3((int)x); -} - -char *itostr2(const uint8_t &x) -{ - //sprintf(conv,"%5.1f",x); - int xx = x; - conv[0] = (xx / 10) % 10 + '0'; - conv[1] = (xx) % 10 + '0'; - conv[2] = 0; - return conv; -} - -// Convert float to string with 123.4 format, dropping sign -char *ftostr31(const float &x) -{ - int xx = x * 10; - conv[0] = (xx >= 0) ? '+' : '-'; - xx = abs(xx); - conv[1] = (xx / 1000) % 10 + '0'; - conv[2] = (xx / 100) % 10 + '0'; - conv[3] = (xx / 10) % 10 + '0'; - conv[4] = '.'; - conv[5] = (xx) % 10 + '0'; - conv[6] = 0; - return conv; -} - -// Convert float to string with 123.4 format -char *ftostr31ns(const float &x) -{ - int xx = x * 10; - //conv[0]=(xx>=0)?'+':'-'; - xx = abs(xx); - conv[0] = (xx / 1000) % 10 + '0'; - conv[1] = (xx / 100) % 10 + '0'; - conv[2] = (xx / 10) % 10 + '0'; - conv[3] = '.'; - conv[4] = (xx) % 10 + '0'; - conv[5] = 0; - return conv; -} - -char *ftostr32(const float &x) -{ - long xx = x * 100; - if (xx >= 0) - conv[0] = (xx / 10000) % 10 + '0'; - else - conv[0] = '-'; - xx = abs(xx); - conv[1] = (xx / 1000) % 10 + '0'; - conv[2] = (xx / 100) % 10 + '0'; - conv[3] = '.'; - conv[4] = (xx / 10) % 10 + '0'; - conv[5] = (xx) % 10 + '0'; - conv[6] = 0; - return conv; -} - -//// Convert float to rj string with 123.45 format -char *ftostr32ns(const float &x) { - long xx = abs(x); - conv[0] = xx >= 10000 ? (xx / 10000) % 10 + '0' : ' '; - conv[1] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; - conv[2] = xx >= 100 ? (xx / 100) % 10 + '0' : '0'; - conv[3] = '.'; - conv[4] = (xx / 10) % 10 + '0'; - conv[5] = xx % 10 + '0'; - return conv; -} - - -// Convert float to string with 1.234 format -char *ftostr43(const float &x) -{ - long xx = x * 1000; - if (xx >= 0) - conv[0] = (xx / 1000) % 10 + '0'; - else - conv[0] = '-'; - xx = abs(xx); - conv[1] = '.'; - conv[2] = (xx / 100) % 10 + '0'; - conv[3] = (xx / 10) % 10 + '0'; - conv[4] = (xx) % 10 + '0'; - conv[5] = 0; - return conv; -} - -//Float to string with 1.23 format -char *ftostr12ns(const float &x) -{ - long xx = x * 100; - - xx = abs(xx); - conv[0] = (xx / 100) % 10 + '0'; - conv[1] = '.'; - conv[2] = (xx / 10) % 10 + '0'; - conv[3] = (xx) % 10 + '0'; - conv[4] = 0; - return conv; -} - -//Float to string with 1.234 format -char *ftostr13ns(const float &x) -{ - long xx = x * 1000; - if (xx >= 0) - conv[0] = ' '; - else - conv[0] = '-'; - xx = abs(xx); - conv[1] = (xx / 1000) % 10 + '0'; - conv[2] = '.'; - conv[3] = (xx / 100) % 10 + '0'; - conv[4] = (xx / 10) % 10 + '0'; - conv[5] = (xx) % 10 + '0'; - conv[6] = 0; - return conv; -} - -// convert float to space-padded string with -_23.4_ format -char *ftostr32sp(const float &x) { - long xx = abs(x * 100); - uint8_t dig; - - if (x < 0) { // negative val = -_0 - conv[0] = '-'; - dig = (xx / 1000) % 10; - conv[1] = dig ? '0' + dig : ' '; - } - else { // positive val = __0 - dig = (xx / 10000) % 10; - if (dig) { - conv[0] = '0' + dig; - conv[1] = '0' + (xx / 1000) % 10; - } - else { - conv[0] = ' '; - dig = (xx / 1000) % 10; - conv[1] = dig ? '0' + dig : ' '; - } - } - - conv[2] = '0' + (xx / 100) % 10; // lsd always - - dig = xx % 10; - if (dig) { // 2 decimal places - conv[5] = '0' + dig; - conv[4] = '0' + (xx / 10) % 10; - conv[3] = '.'; - } - else { // 1 or 0 decimal place - dig = (xx / 10) % 10; - if (dig) { - conv[4] = '0' + dig; - conv[3] = '.'; - } - else { - conv[3] = conv[4] = ' '; - } - conv[5] = ' '; - } - conv[6] = '\0'; - return conv; -} - -char *itostr31(const int &xx) -{ - conv[0] = (xx >= 0) ? '+' : '-'; - conv[1] = (xx / 1000) % 10 + '0'; - conv[2] = (xx / 100) % 10 + '0'; - conv[3] = (xx / 10) % 10 + '0'; - conv[4] = '.'; - conv[5] = (xx) % 10 + '0'; - conv[6] = 0; - return conv; -} - -// Convert int to rj string with 123 or -12 format -char *itostr3(const int &x) -{ - int xx = x; - if (xx < 0) { - conv[0] = '-'; - xx = -xx; - } else if (xx >= 100) - conv[0] = (xx / 100) % 10 + '0'; - else - conv[0] = ' '; - if (xx >= 10) - conv[1] = (xx / 10) % 10 + '0'; - else - conv[1] = ' '; - conv[2] = (xx) % 10 + '0'; - conv[3] = 0; - return conv; -} - -// Convert int to lj string with 123 format -char *itostr3left(const int &xx) -{ - if (xx >= 100) - { - conv[0] = (xx / 100) % 10 + '0'; - conv[1] = (xx / 10) % 10 + '0'; - conv[2] = (xx) % 10 + '0'; - conv[3] = 0; - } - else if (xx >= 10) - { - conv[0] = (xx / 10) % 10 + '0'; - conv[1] = (xx) % 10 + '0'; - conv[2] = 0; - } - else - { - conv[0] = (xx) % 10 + '0'; - conv[1] = 0; - } - return conv; -} - -// Convert int to rj string with 1234 format -char *itostr4(const int &xx) { - conv[0] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; - conv[1] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; - conv[2] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; - conv[3] = xx % 10 + '0'; - conv[4] = 0; - return conv; -} - -// Convert float to rj string with 12345 format -char *ftostr5(const float &x) { - long xx = abs(x); - conv[0] = xx >= 10000 ? (xx / 10000) % 10 + '0' : ' '; - conv[1] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; - conv[2] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; - conv[3] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; - conv[4] = xx % 10 + '0'; - conv[5] = 0; - return conv; -} - -// Convert float to string with +1234.5 format -char *ftostr51(const float &x) -{ - long xx = x * 10; - conv[0] = (xx >= 0) ? '+' : '-'; - xx = abs(xx); - conv[1] = (xx / 10000) % 10 + '0'; - conv[2] = (xx / 1000) % 10 + '0'; - conv[3] = (xx / 100) % 10 + '0'; - conv[4] = (xx / 10) % 10 + '0'; - conv[5] = '.'; - conv[6] = (xx) % 10 + '0'; - conv[7] = 0; - return conv; -} - -// Convert float to string with +123.45 format -char *ftostr52(const float &x) -{ - long xx = x * 100; - conv[0] = (xx >= 0) ? '+' : '-'; - xx = abs(xx); - conv[1] = (xx / 10000) % 10 + '0'; - conv[2] = (xx / 1000) % 10 + '0'; - conv[3] = (xx / 100) % 10 + '0'; - conv[4] = '.'; - conv[5] = (xx / 10) % 10 + '0'; - conv[6] = (xx) % 10 + '0'; - conv[7] = 0; - return conv; -} - -// Callback for after editing PID i value -// grab the PID i value out of the temp variable; scale it; then update the PID driver -void copy_and_scalePID_i() -{ -#ifdef PIDTEMP - Ki = scalePID_i(raw_Ki); - updatePID(); -#endif -} - -// Callback for after editing PID d value -// grab the PID d value out of the temp variable; scale it; then update the PID driver -void copy_and_scalePID_d() -{ -#ifdef PIDTEMP - Kd = scalePID_d(raw_Kd); - updatePID(); -#endif -} - +#include "temperature.h" +#include "ultralcd.h" +#ifdef ULTRA_LCD +#include "Marlin.h" +#include "language.h" +#include "cardreader.h" +#include "temperature.h" +#include "stepper.h" +#include "ConfigurationStore.h" +#include <string.h> +//#include "Configuration.h" + + + +#define _STRINGIFY(s) #s + + +int8_t encoderDiff; /* encoderDiff is updated from interrupt context and added to encoderPosition every LCD update */ + +extern int lcd_change_fil_state; + +int babystepMem[3]; +float babystepMemMM[3]; + +union Data +{ + byte b[2]; + int value; +}; + +int8_t ReInitLCD = 0; + +int8_t SDscrool = 0; + +int8_t SilentModeMenu = 0; + +int lcd_commands_type=0; +int lcd_commands_step=0; +bool isPrintPaused = false; + +/* Configuration settings */ +int plaPreheatHotendTemp; +int plaPreheatHPBTemp; +int plaPreheatFanSpeed; + +int absPreheatHotendTemp; +int absPreheatHPBTemp; +int absPreheatFanSpeed; + +int ppPreheatHotendTemp = PP_PREHEAT_HOTEND_TEMP; +int ppPreheatHPBTemp = PP_PREHEAT_HPB_TEMP; +int ppPreheatFanSpeed = PP_PREHEAT_FAN_SPEED; + +int petPreheatHotendTemp = PET_PREHEAT_HOTEND_TEMP; +int petPreheatHPBTemp = PET_PREHEAT_HPB_TEMP; +int petPreheatFanSpeed = PET_PREHEAT_FAN_SPEED; + +int hipsPreheatHotendTemp = HIPS_PREHEAT_HOTEND_TEMP; +int hipsPreheatHPBTemp = HIPS_PREHEAT_HPB_TEMP; +int hipsPreheatFanSpeed = HIPS_PREHEAT_FAN_SPEED; + +int flexPreheatHotendTemp = FLEX_PREHEAT_HOTEND_TEMP; +int flexPreheatHPBTemp = FLEX_PREHEAT_HPB_TEMP; +int flexPreheatFanSpeed = FLEX_PREHEAT_FAN_SPEED; + + + +#ifdef FILAMENT_LCD_DISPLAY +unsigned long message_millis = 0; +#endif + +#ifdef ULTIPANEL +static float manual_feedrate[] = MANUAL_FEEDRATE; +#endif // ULTIPANEL + +/* !Configuration settings */ + +//Function pointer to menu functions. +typedef void (*menuFunc_t)(); + +uint8_t lcd_status_message_level; +char lcd_status_message[LCD_WIDTH + 1] = ""; //////WELCOME! +unsigned char firstrun = 1; + +#ifdef DOGLCD +#include "dogm_lcd_implementation.h" +#else +#include "ultralcd_implementation_hitachi_HD44780.h" +#endif + +/** forward declarations **/ + +void copy_and_scalePID_i(); +void copy_and_scalePID_d(); + +/* Different menus */ +static void lcd_status_screen(); +#ifdef ULTIPANEL +extern bool powersupply; +static void lcd_main_menu(); +static void lcd_tune_menu(); +static void lcd_prepare_menu(); +static void lcd_move_menu(); +static void lcd_control_menu(); +static void lcd_settings_menu(); +static void lcd_language_menu(); +static void lcd_control_temperature_menu(); +static void lcd_control_temperature_preheat_pla_settings_menu(); +static void lcd_control_temperature_preheat_abs_settings_menu(); +static void lcd_control_motion_menu(); +static void lcd_control_volumetric_menu(); + +#ifdef DOGLCD +static void lcd_set_contrast(); +#endif +static void lcd_control_retract_menu(); +static void lcd_sdcard_menu(); + +#ifdef DELTA_CALIBRATION_MENU +static void lcd_delta_calibrate_menu(); +#endif // DELTA_CALIBRATION_MENU + +static void lcd_quick_feedback();//Cause an LCD refresh, and give the user visual or audible feedback that something has happened + +/* Different types of actions that can be used in menu items. */ +static void menu_action_back(menuFunc_t data); +static void menu_action_submenu(menuFunc_t data); +static void menu_action_gcode(const char* pgcode); +static void menu_action_function(menuFunc_t data); +static void menu_action_setlang(unsigned char lang); +static void menu_action_sdfile(const char* filename, char* longFilename); +static void menu_action_sddirectory(const char* filename, char* longFilename); +static void menu_action_setting_edit_bool(const char* pstr, bool* ptr); +static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); +static void menu_action_setting_edit_float3(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_float32(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_float43(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_float5(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_float51(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_float52(const char* pstr, float* ptr, float minValue, float maxValue); +static void menu_action_setting_edit_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue); +static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_int3(const char* pstr, int* ptr, int minValue, int maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float3(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float32(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float43(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float5(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float51(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_float52(const char* pstr, float* ptr, float minValue, float maxValue, menuFunc_t callbackFunc); +static void menu_action_setting_edit_callback_long5(const char* pstr, unsigned long* ptr, unsigned long minValue, unsigned long maxValue, menuFunc_t callbackFunc); + +#define ENCODER_FEEDRATE_DEADZONE 10 + +#if !defined(LCD_I2C_VIKI) +#ifndef ENCODER_STEPS_PER_MENU_ITEM +#define ENCODER_STEPS_PER_MENU_ITEM 5 +#endif +#ifndef ENCODER_PULSES_PER_STEP +#define ENCODER_PULSES_PER_STEP 1 +#endif +#else +#ifndef ENCODER_STEPS_PER_MENU_ITEM +#define ENCODER_STEPS_PER_MENU_ITEM 2 // VIKI LCD rotary encoder uses a different number of steps per rotation +#endif +#ifndef ENCODER_PULSES_PER_STEP +#define ENCODER_PULSES_PER_STEP 1 +#endif +#endif + + +/* Helper macros for menus */ +#define START_MENU() do { \ + if (encoderPosition > 0x8000) encoderPosition = 0; \ + if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM < currentMenuViewOffset) currentMenuViewOffset = encoderPosition / ENCODER_STEPS_PER_MENU_ITEM;\ + uint8_t _lineNr = currentMenuViewOffset, _menuItemNr; \ + bool wasClicked = LCD_CLICKED;\ + for(uint8_t _drawLineNr = 0; _drawLineNr < LCD_HEIGHT; _drawLineNr++, _lineNr++) { \ + _menuItemNr = 0; + +#define MENU_ITEM(type, label, args...) do { \ + if (_menuItemNr == _lineNr) { \ + if (lcdDrawUpdate) { \ + const char* _label_pstr = (label); \ + if ((encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) { \ + lcd_implementation_drawmenu_ ## type ## _selected (_drawLineNr, _label_pstr , ## args ); \ + }else{\ + lcd_implementation_drawmenu_ ## type (_drawLineNr, _label_pstr , ## args ); \ + }\ + }\ + if (wasClicked && (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) == _menuItemNr) {\ + lcd_quick_feedback(); \ + menu_action_ ## type ( args ); \ + return;\ + }\ + }\ + _menuItemNr++;\ + } while(0) + +#define MENU_ITEM_DUMMY() do { _menuItemNr++; } while(0) +#define MENU_ITEM_EDIT(type, label, args...) MENU_ITEM(setting_edit_ ## type, label, (label) , ## args ) +#define MENU_ITEM_EDIT_CALLBACK(type, label, args...) MENU_ITEM(setting_edit_callback_ ## type, label, (label) , ## args ) +#define END_MENU() \ + if (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM >= _menuItemNr) encoderPosition = _menuItemNr * ENCODER_STEPS_PER_MENU_ITEM - 1; \ + if ((uint8_t)(encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) >= currentMenuViewOffset + LCD_HEIGHT) { currentMenuViewOffset = (encoderPosition / ENCODER_STEPS_PER_MENU_ITEM) - LCD_HEIGHT + 1; lcdDrawUpdate = 1; _lineNr = currentMenuViewOffset - 1; _drawLineNr = -1; } \ + } } while(0) + +/** Used variables to keep track of the menu */ +#ifndef REPRAPWORLD_KEYPAD +volatile uint8_t buttons;//Contains the bits of the currently pressed buttons. +#else +volatile uint8_t buttons_reprapworld_keypad; // to store the reprapworld_keypad shift register values +#endif +#ifdef LCD_HAS_SLOW_BUTTONS +volatile uint8_t slow_buttons;//Contains the bits of the currently pressed buttons. +#endif +uint8_t currentMenuViewOffset; /* scroll offset in the current menu */ +uint32_t blocking_enc; +uint8_t lastEncoderBits; +uint32_t encoderPosition; +#if (SDCARDDETECT > 0) +bool lcd_oldcardstatus; +#endif +#endif //ULTIPANEL + +menuFunc_t currentMenu = lcd_status_screen; /* function pointer to the currently active menu */ +uint32_t lcd_next_update_millis; +uint8_t lcd_status_update_delay; +bool ignore_click = false; +bool wait_for_unclick; +uint8_t lcdDrawUpdate = 2; /* Set to none-zero when the LCD needs to draw, decreased after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial) */ + +//prevMenu and prevEncoderPosition are used to store the previous menu location when editing settings. +menuFunc_t prevMenu = NULL; +uint16_t prevEncoderPosition; +//Variables used when editing values. +const char* editLabel; +void* editValue; +int32_t minEditValue, maxEditValue; +menuFunc_t callbackFunc; + +// place-holders for Ki and Kd edits +float raw_Ki, raw_Kd; + +static void lcd_goto_menu(menuFunc_t menu, const uint32_t encoder = 0, const bool feedback = true) { + if (currentMenu != menu) { + currentMenu = menu; + encoderPosition = encoder; + if (feedback) lcd_quick_feedback(); + + // For LCD_PROGRESS_BAR re-initialize the custom characters +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + lcd_set_custom_characters(menu == lcd_status_screen); +#endif + } +} + +/* Main status screen. It's up to the implementation specific part to show what is needed. As this is very display dependent */ +/* +extern char langbuffer[]; +void lcd_printPGM(const char *s1) { + strncpy_P(langbuffer,s1,LCD_WIDTH); + lcd.print(langbuffer); +} +*/ +unsigned char langsel; + +void set_language_from_EEPROM() { + unsigned char eep = eeprom_read_byte((unsigned char*)EEPROM_LANG); + if (eep < LANG_NUM) + { + lang_selected = eep; + langsel = 0; + } + else + { + lang_selected = 1; + langsel = 1; + } +} + +void lcd_mylang(); +static void lcd_status_screen() +{ + + if (firstrun == 1) + { + firstrun = 0; + set_language_from_EEPROM(); + strncpy_P(lcd_status_message, WELCOME_MSG, LCD_WIDTH); + + 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); + } + + if (langsel) { + //strncpy_P(lcd_status_message, PSTR(">>>>>>>>>>>> PRESS v"), LCD_WIDTH); + lcd_mylang(); + } + } + + + if (lcd_status_update_delay) + lcd_status_update_delay--; + else + lcdDrawUpdate = 1; + if (lcdDrawUpdate) + { + ReInitLCD++; + + + if (ReInitLCD == 30) { + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + currentMenu == lcd_status_screen +#endif + ); + ReInitLCD = 0 ; + } else { + + if ((ReInitLCD % 10) == 0) { + //lcd_implementation_nodisplay(); + lcd_implementation_init_noclear( // to maybe revive the LCD if static electricity killed it. +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + currentMenu == lcd_status_screen +#endif + ); + + } + + } + + + //lcd_implementation_display(); + lcd_implementation_status_screen(); + //lcd_implementation_clear(); + + + + + + + + lcd_status_update_delay = 10; /* redraw the main screen every second. This is easier then trying keep track of all things that change on the screen */ + if (lcd_commands_type != 0) + { + lcd_commands(); + } + + + } +#ifdef ULTIPANEL + + bool current_click = LCD_CLICKED; + + if (ignore_click) { + if (wait_for_unclick) { + if (!current_click) { + ignore_click = wait_for_unclick = false; + } + else { + current_click = false; + } + } + else if (current_click) { + lcd_quick_feedback(); + wait_for_unclick = true; + current_click = false; + } + } + + + //if (--langsel ==0) {langsel=1;current_click=true;} + + if (current_click) + { + + lcd_goto_menu(lcd_main_menu); + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + currentMenu == lcd_status_screen +#endif + ); +#ifdef FILAMENT_LCD_DISPLAY + message_millis = millis(); // get status message to show up for a while +#endif + } + +#ifdef ULTIPANEL_FEEDMULTIPLY + // Dead zone at 100% feedrate + if ((feedmultiply < 100 && (feedmultiply + int(encoderPosition)) > 100) || + (feedmultiply > 100 && (feedmultiply + int(encoderPosition)) < 100)) + { + encoderPosition = 0; + feedmultiply = 100; + } + + if (feedmultiply == 100 && int(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) + { + feedmultiply += int(encoderPosition) - ENCODER_FEEDRATE_DEADZONE; + encoderPosition = 0; + } + else if (feedmultiply == 100 && int(encoderPosition) < -ENCODER_FEEDRATE_DEADZONE) + { + feedmultiply += int(encoderPosition) + ENCODER_FEEDRATE_DEADZONE; + encoderPosition = 0; + } + else if (feedmultiply != 100) + { + feedmultiply += int(encoderPosition); + encoderPosition = 0; + } +#endif //ULTIPANEL_FEEDMULTIPLY + + if (feedmultiply < 10) + feedmultiply = 10; + else if (feedmultiply > 999) + feedmultiply = 999; +#endif //ULTIPANEL +} + +#ifdef ULTIPANEL + +void lcd_commands() +{ + if (lcd_commands_type == 1) //// load filament sequence + { + if (lcd_commands_step == 0) { lcd_commands_step = 5; custom_message = true; } + if (lcd_commands_step == 1 && !blocks_queued()) + { + lcd_commands_step = 0; + lcd_commands_type = 0; + lcd_setstatuspgm(WELCOME_MSG); + disable_z(); + custom_message = false; + custom_message_type = 0; + } + if (lcd_commands_step == 2 && !blocks_queued()) + { + lcd_setstatuspgm(MSG_LOADING_FILAMENT); + enquecommand_P(PSTR(LOAD_FILAMENT_2)); + lcd_commands_step = 1; + } + if (lcd_commands_step == 3 && !blocks_queued()) + { + enquecommand_P(PSTR(LOAD_FILAMENT_1)); + lcd_commands_step = 2; + } + if (lcd_commands_step == 4 && !blocks_queued()) + { + lcd_setstatuspgm(MSG_INSERT_FILAMENT); + enquecommand_P(PSTR(LOAD_FILAMENT_0)); + lcd_commands_step = 3; + } + if (lcd_commands_step == 5 && !blocks_queued()) + { + lcd_setstatuspgm(MSG_PLEASE_WAIT); + enable_z(); + custom_message = true; + custom_message_type = 2; + lcd_commands_step = 4; + } + + + + + + } + + if (lcd_commands_type == 2) /// stop print + { + + if (lcd_commands_step == 0) { lcd_commands_step = 6; custom_message = true; } + + if (lcd_commands_step == 1 && !blocks_queued()) + { + lcd_commands_step = 0; + lcd_commands_type = 0; + lcd_setstatuspgm(WELCOME_MSG); + custom_message = false; + } + if (lcd_commands_step == 2 && !blocks_queued()) + { + setTargetBed(0); + setTargetHotend(0, 0); + setTargetHotend(0, 1); + setTargetHotend(0, 2); + manage_heater(); + lcd_setstatuspgm(WELCOME_MSG); + cancel_heatup = false; + lcd_commands_step = 1; + } + if (lcd_commands_step == 3 && !blocks_queued()) + { + enquecommand_P(PSTR("M84")); + autotempShutdown(); + lcd_commands_step = 2; + } + if (lcd_commands_step == 4 && !blocks_queued()) + { + enquecommand_P(PSTR("G90")); + #ifdef X_CANCEL_POS + enquecommand_P(PSTR("G1 X" STRINGIFY(X_CANCEL_POS) " Y" STRINGIFY(Y_CANCEL_POS) " E0 F7000")); + #else + enquecommand_P(PSTR("G1 X50 Y" STRINGIFY(Y_MAX_POS) " E0 F7000")); + #endif + lcd_ignore_click(false); + lcd_commands_step = 3; + } + if (lcd_commands_step == 5 && !blocks_queued()) + { + lcd_setstatuspgm(MSG_PRINT_ABORTED); + enquecommand_P(PSTR("G91")); + enquecommand_P(PSTR("G1 Z15 F1500")); + lcd_commands_step = 4; + } + if (lcd_commands_step == 6 && !blocks_queued()) + { + lcd_setstatuspgm(MSG_PRINT_ABORTED); + cancel_heatup = true; + setTargetBed(0); + setTargetHotend(0, 0); + setTargetHotend(0, 1); + setTargetHotend(0, 2); + manage_heater(); + lcd_commands_step = 5; + } + + } + + if (lcd_commands_type == 3) + { + lcd_commands_type = 0; + } + +} + +static void lcd_return_to_status() { + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + currentMenu == lcd_status_screen +#endif + ); + + lcd_goto_menu(lcd_status_screen, 0, false); +} + +static void lcd_sdcard_pause() { + card.pauseSDPrint(); + isPrintPaused = true; + lcdDrawUpdate = 3; +} + +static void lcd_sdcard_resume() { + card.startFileprint(); + isPrintPaused = false; + lcdDrawUpdate = 3; +} + +float move_menu_scale; +static void lcd_move_menu_axis(); + + + +/* Menu implementation */ + + +void lcd_preheat_pla() +{ + setTargetHotend0(plaPreheatHotendTemp); + setTargetBed(plaPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + +void lcd_preheat_abs() +{ + setTargetHotend0(absPreheatHotendTemp); + setTargetBed(absPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + +void lcd_preheat_pp() +{ + setTargetHotend0(ppPreheatHotendTemp); + setTargetBed(ppPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + +void lcd_preheat_pet() +{ + setTargetHotend0(petPreheatHotendTemp); + setTargetBed(petPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + +void lcd_preheat_hips() +{ + setTargetHotend0(hipsPreheatHotendTemp); + setTargetBed(hipsPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + +void lcd_preheat_flex() +{ + setTargetHotend0(flexPreheatHotendTemp); + setTargetBed(flexPreheatHPBTemp); + fanSpeed = 0; + lcd_return_to_status(); + setWatch(); // heater sanity check timer +} + + +void lcd_cooldown() +{ + setTargetHotend0(0); + setTargetHotend1(0); + setTargetHotend2(0); + setTargetBed(0); + fanSpeed = 0; + lcd_return_to_status(); +} + + + +static void lcd_preheat_menu() +{ + START_MENU(); + + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + + MENU_ITEM(function, PSTR("ABS - " STRINGIFY(ABS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(ABS_PREHEAT_HPB_TEMP)), lcd_preheat_abs); + MENU_ITEM(function, PSTR("PLA - " STRINGIFY(PLA_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PLA_PREHEAT_HPB_TEMP)), lcd_preheat_pla); + MENU_ITEM(function, PSTR("PET - " STRINGIFY(PET_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PET_PREHEAT_HPB_TEMP)), lcd_preheat_pet); + MENU_ITEM(function, PSTR("HIPS - " STRINGIFY(HIPS_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(HIPS_PREHEAT_HPB_TEMP)), lcd_preheat_hips); + MENU_ITEM(function, PSTR("PP - " STRINGIFY(PP_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(PP_PREHEAT_HPB_TEMP)), lcd_preheat_pp); + MENU_ITEM(function, PSTR("FLEX - " STRINGIFY(FLEX_PREHEAT_HOTEND_TEMP) "/" STRINGIFY(FLEX_PREHEAT_HPB_TEMP)), lcd_preheat_flex); + + MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); + + END_MENU(); +} + +static void lcd_support_menu() +{ + START_MENU(); + + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + + MENU_ITEM(back, PSTR(MSG_FW_VERSION " - " FW_version), lcd_main_menu); + MENU_ITEM(back, MSG_PRUSA3D, lcd_main_menu); + MENU_ITEM(back, MSG_PRUSA3D_FORUM, lcd_main_menu); + MENU_ITEM(back, MSG_PRUSA3D_HOWTO, lcd_main_menu); + MENU_ITEM(back, PSTR("------------"), lcd_main_menu); + MENU_ITEM(back, PSTR(FILAMENT_SIZE), lcd_main_menu); + MENU_ITEM(back, PSTR(ELECTRONICS),lcd_main_menu); + MENU_ITEM(back, PSTR(NOZZLE_TYPE),lcd_main_menu); + MENU_ITEM(back, PSTR("------------"), lcd_main_menu); + MENU_ITEM(back, PSTR("Date: "), lcd_main_menu); + MENU_ITEM(back, PSTR(__DATE__), lcd_main_menu); + + END_MENU(); +} + +void lcd_unLoadFilament() +{ + + if (degHotend0() > EXTRUDE_MINTEMP) { + + enquecommand_P(PSTR(UNLOAD_FILAMENT_0)); + enquecommand_P(PSTR(UNLOAD_FILAMENT_1)); + + } else { + + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_ERROR); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PREHEAT_NOZZLE); + + delay(2000); + lcd_implementation_clear(); + } + + lcd_return_to_status(); +} + +void lcd_change_filament() { + + lcd_implementation_clear(); + + lcd.setCursor(0, 1); + + lcd_printPGM(MSG_CHANGING_FILAMENT); + + +} + + +void lcd_wait_interact() { + + lcd_implementation_clear(); + + lcd.setCursor(0, 1); + + lcd_printPGM(MSG_INSERT_FILAMENT); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PRESS); + +} + + +void lcd_change_success() { + + lcd_implementation_clear(); + + lcd.setCursor(0, 2); + + lcd_printPGM(MSG_CHANGE_SUCCESS); + + +} + + +void lcd_loading_color() { + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + + lcd_printPGM(MSG_LOADING_COLOR); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PLEASE_WAIT); + + + for (int i = 0; i < 20; i++) { + + lcd.setCursor(i, 3); + lcd.print("."); + for (int j = 0; j < 10 ; j++) { + manage_heater(); + manage_inactivity(true); + delay(85); + + } + + + } + +} + + +void lcd_loading_filament() { + + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + + lcd_printPGM(MSG_LOADING_FILAMENT); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PLEASE_WAIT); + + + for (int i = 0; i < 20; i++) { + + lcd.setCursor(i, 3); + lcd.print("."); + for (int j = 0; j < 10 ; j++) { + manage_heater(); + manage_inactivity(true); + delay(110); + + } + + + } + +} + +void lcd_alright() { + int enc_dif = 0; + int cursor_pos = 1; + + + + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + + lcd_printPGM(MSG_CORRECTLY); + + lcd.setCursor(1, 1); + + lcd_printPGM(MSG_YES); + + lcd.setCursor(1, 2); + + lcd_printPGM(MSG_NOT_LOADED); + + + lcd.setCursor(1, 3); + lcd_printPGM(MSG_NOT_COLOR); + + + lcd.setCursor(0, 1); + + lcd.print(">"); + + + enc_dif = encoderDiff; + + while (lcd_change_fil_state == 0) { + + manage_heater(); + manage_inactivity(true); + + if ( abs((enc_dif - encoderDiff)) > 4 ) { + + if ( (abs(enc_dif - encoderDiff)) > 1 ) { + if (enc_dif > encoderDiff ) { + cursor_pos --; + } + + if (enc_dif < encoderDiff ) { + cursor_pos ++; + } + + if (cursor_pos > 3) { + cursor_pos = 3; + } + + if (cursor_pos < 1) { + cursor_pos = 1; + } + lcd.setCursor(0, 1); + lcd.print(" "); + lcd.setCursor(0, 2); + lcd.print(" "); + lcd.setCursor(0, 3); + lcd.print(" "); + lcd.setCursor(0, cursor_pos); + lcd.print(">"); + enc_dif = encoderDiff; + delay(100); + } + + } + + + if (lcd_clicked()) { + + lcd_change_fil_state = cursor_pos; + delay(500); + + } + + + + }; + + + lcd_implementation_clear(); + lcd_return_to_status(); + +} + + + +void lcd_LoadFilament() +{ + if (degHotend0() > EXTRUDE_MINTEMP) + { + custom_message = true; + lcd_commands_type = 1; + SERIAL_ECHOLN("Loading filament"); + // commands() will handle the rest + } + else + { + + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_ERROR); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_PREHEAT_NOZZLE); + delay(2000); + lcd_implementation_clear(); + } + lcd_return_to_status(); +} + + +static void lcd_menu_statistics() +{ + + if (IS_SD_PRINTING) + { + int _met = total_filament_used / 100000; + int _cm = (total_filament_used - (_met * 100000))/10; + + int _t = (millis() - starttime) / 1000; + + int _h = _t / 3600; + int _m = (_t - (_h * 60)) / 60; + int _s = _t - ((_h * 3600) + (_m * 60)); + + lcd.setCursor(0, 0); + lcd_printPGM(MSG_STATS_FILAMENTUSED); + + lcd.setCursor(6, 1); + lcd.print(itostr3(_met)); + lcd.print("m "); + lcd.print(ftostr32ns(_cm)); + lcd.print("cm"); + + lcd.setCursor(0, 2); + lcd_printPGM(MSG_STATS_PRINTTIME); + + lcd.setCursor(8, 3); + lcd.print(itostr2(_h)); + lcd.print("h "); + lcd.print(itostr2(_m)); + lcd.print("m "); + lcd.print(itostr2(_s)); + lcd.print("s"); + + if (lcd_clicked()) + { + lcd_quick_feedback(); + lcd_return_to_status(); + } + } + else + { + unsigned long _filament = eeprom_read_dword((uint32_t *)EEPROM_FILAMENTUSED); + unsigned long _time = eeprom_read_dword((uint32_t *)EEPROM_TOTALTIME); + uint8_t _days, _hours, _minutes; + + float _filament_m = (float)_filament; + int _filament_km = (_filament >= 100000) ? _filament / 100000 : 0; + if (_filament_km > 0) _filament_m = _filament - (_filament_km * 100000); + + _days = _time / 1440; + _hours = (_time - (_days * 1440)) / 60; + _minutes = _time - ((_days * 1440) + (_hours * 60)); + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + lcd_printPGM(MSG_STATS_TOTALFILAMENT); + lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)), 1); + lcd.print(ftostr32ns(_filament_m)); + + if (_filament_km > 0) + { + lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)) - 3, 1); + lcd.print("km"); + lcd.setCursor(17 - strlen(ftostr32ns(_filament_m)) - 8, 1); + lcd.print(itostr4(_filament_km)); + } + + + lcd.setCursor(18, 1); + lcd.print("m"); + + lcd.setCursor(0, 2); + lcd_printPGM(MSG_STATS_TOTALPRINTTIME);; + + lcd.setCursor(18, 3); + lcd.print("m"); + lcd.setCursor(14, 3); + lcd.print(itostr3(_minutes)); + + lcd.setCursor(14, 3); + lcd.print(":"); + + lcd.setCursor(12, 3); + lcd.print("h"); + lcd.setCursor(9, 3); + lcd.print(itostr3(_hours)); + + lcd.setCursor(9, 3); + lcd.print(":"); + + lcd.setCursor(7, 3); + lcd.print("d"); + lcd.setCursor(4, 3); + lcd.print(itostr3(_days)); + + + + while (!lcd_clicked()) + { + manage_heater(); + manage_inactivity(true); + delay(100); + } + + lcd_quick_feedback(); + lcd_return_to_status(); + } +} + + +static void _lcd_move(const char *name, int axis, int min, int max) { + if (encoderPosition != 0) { + refresh_cmd_timeout(); + current_position[axis] += float((int)encoderPosition) * 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; + encoderPosition = 0; +#ifdef DELTA + calculate_delta(current_position); + plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis] / 60, active_extruder); +#else + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis] / 60, active_extruder); +#endif + lcdDrawUpdate = 1; + } + if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis])); + if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); +} + + +static void lcd_move_e() +{ + if (encoderPosition != 0) + { + current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale; + encoderPosition = 0; +#ifdef DELTA + calculate_delta(current_position); + plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS] / 60, active_extruder); +#else + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[E_AXIS] / 60, active_extruder); +#endif + lcdDrawUpdate = 1; + } + if (lcdDrawUpdate) + { + lcd_implementation_drawedit(PSTR("Extruder"), ftostr31(current_position[E_AXIS])); + } + if (LCD_CLICKED) lcd_goto_menu(lcd_move_menu_axis); +} + + +void EEPROM_save_B(int pos, int* value) +{ + union Data data; + data.value = *value; + + eeprom_write_byte((unsigned char*)pos, data.b[0]); + eeprom_write_byte((unsigned char*)pos + 1, data.b[1]); + + +} + +void EEPROM_read_B(int pos, int* value) +{ + union Data data; + data.b[0] = eeprom_read_byte((unsigned char*)pos); + data.b[1] = eeprom_read_byte((unsigned char*)pos + 1); + *value = data.value; + +} + + + +static void lcd_move_x() { + _lcd_move(PSTR("X"), X_AXIS, X_MIN_POS, X_MAX_POS); +} +static void lcd_move_y() { + _lcd_move(PSTR("Y"), Y_AXIS, Y_MIN_POS, Y_MAX_POS); +} +static void lcd_move_z() { + _lcd_move(PSTR("Z"), Z_AXIS, Z_MIN_POS, Z_MAX_POS); +} + + + +static void _lcd_babystep(int axis, const char *msg) { + if (encoderPosition != 0) + { + babystepsTodo[axis] += (int)encoderPosition; + babystepMem[axis] += (int)encoderPosition; + babystepMemMM[axis] = babystepMem[axis]/axis_steps_per_unit[Z_AXIS]; + delay(50); + encoderPosition = 0; + lcdDrawUpdate = 1; + } + if (lcdDrawUpdate) lcd_implementation_drawedit_2(msg, ftostr13ns(babystepMemMM[axis])); + if (LCD_CLICKED) lcd_goto_menu(lcd_main_menu); + EEPROM_save_B(EEPROM_BABYSTEP_X, &babystepMem[0]); + EEPROM_save_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); + EEPROM_save_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); +} + +static void lcd_babystep_x() { + _lcd_babystep(X_AXIS, (MSG_BABYSTEPPING_X)); +} +static void lcd_babystep_y() { + _lcd_babystep(Y_AXIS, (MSG_BABYSTEPPING_Y)); +} +static void lcd_babystep_z() { + _lcd_babystep(Z_AXIS, (MSG_BABYSTEPPING_Z)); +} + + +void lcd_adjust_z() { + int enc_dif = 0; + int cursor_pos = 1; + int fsm = 0; + + + + + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_ADJUSTZ); + lcd.setCursor(1, 1); + lcd_printPGM(MSG_YES); + + lcd.setCursor(1, 2); + + lcd_printPGM(MSG_NO); + + lcd.setCursor(0, 1); + + lcd.print(">"); + + + enc_dif = encoderDiff; + + while (fsm == 0) { + + manage_heater(); + manage_inactivity(true); + + if ( abs((enc_dif - encoderDiff)) > 4 ) { + + if ( (abs(enc_dif - encoderDiff)) > 1 ) { + if (enc_dif > encoderDiff ) { + cursor_pos --; + } + + if (enc_dif < encoderDiff ) { + cursor_pos ++; + } + + if (cursor_pos > 2) { + cursor_pos = 2; + } + + if (cursor_pos < 1) { + cursor_pos = 1; + } + lcd.setCursor(0, 1); + lcd.print(" "); + lcd.setCursor(0, 2); + lcd.print(" "); + lcd.setCursor(0, cursor_pos); + lcd.print(">"); + enc_dif = encoderDiff; + delay(100); + } + + } + + + if (lcd_clicked()) { + fsm = cursor_pos; + if (fsm == 1) { + EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); + EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); + EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); + babystepsTodo[Z_AXIS] = babystepMem[2]; + } else { + babystepMem[0] = 0; + babystepMem[1] = 0; + babystepMem[2] = 0; + + EEPROM_save_B(EEPROM_BABYSTEP_X, &babystepMem[0]); + EEPROM_save_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); + EEPROM_save_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); + } + delay(500); + } + }; + + lcd_implementation_clear(); + lcd_return_to_status(); + +} + +// 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. +bool lcd_calibrate_z_end_stop_manual() +{ + const unsigned long max_inactive_time = 60 * 1000; // 60 seconds + unsigned long previous_millis_cmd = millis(); + int8_t cursor_pos; + int8_t enc_dif = 0; + + // Until confirmed by the confirmation dialog. + for (;;) { + previous_millis_cmd = millis(); + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE1); + lcd.setCursor(0, 1); + lcd_printPGM(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE2); + lcd.setCursor(0, 2); + lcd_printPGM(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE3); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_MOVE_CARRIAGE_TO_THE_TOP_LINE4); + // Until the user finishes the z up movement. + enc_dif = encoderDiff; + for (;;) { + if (millis() - previous_millis_cmd > max_inactive_time) + goto canceled; + manage_heater(); + manage_inactivity(true); + if (abs((enc_dif - encoderDiff)) > 4) { + if (abs(enc_dif - encoderDiff) > 1) { + previous_millis_cmd = millis(); + // Only move up, whatever the user does. + current_position[Z_AXIS] += fabs(enc_dif - encoderDiff); + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[Z_AXIS] / 60, active_extruder); + // delay(10); + enc_dif = encoderDiff; + } + } + if (lcd_clicked()) { + // Wait until the Z up movement is finished. + st_synchronize(); + while (lcd_clicked()) ; + delay(10); + while (lcd_clicked()) ; + break; + } + } + + // Let the user confirm, that the Z carriage is at the top end stoppers. + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE1); + lcd.setCursor(0, 1); + lcd_printPGM(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LINE2); + lcd.setCursor(1, 2); + lcd_printPGM(MSG_YES); + lcd.setCursor(1, 3); + lcd_printPGM(MSG_NO); + cursor_pos = 3; + lcd.setCursor(0, cursor_pos); + lcd_printPGM(PSTR(">")); + + previous_millis_cmd = millis(); + enc_dif = encoderDiff; + for (;;) { + if (millis() - previous_millis_cmd > max_inactive_time) + goto canceled; + manage_heater(); + manage_inactivity(true); + if (abs((enc_dif - encoderDiff)) > 4) { + if (abs(enc_dif - encoderDiff) > 1) { + lcd.setCursor(0, 2); + if (enc_dif > encoderDiff && cursor_pos == 4) { + lcd_printPGM((PSTR(" "))); + lcd.setCursor(0, 3); + lcd_printPGM((PSTR(">"))); + -- cursor_pos; + } else if (enc_dif < encoderDiff && cursor_pos == 3) { + ++ cursor_pos; + lcd_printPGM((PSTR(">"))); + lcd.setCursor(0, 3); + lcd_printPGM((PSTR(" "))); + } + enc_dif = encoderDiff; + } + } + if (lcd_clicked()) { + while (lcd_clicked()) ; + delay(10); + while (lcd_clicked()) ; + if (cursor_pos == 3) { + // Perform another round of the Z up dialog. + break; + } + goto calibrated; + } + } + } + +calibrated: + current_position[Z_AXIS] = Z_MAX_POS; + plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); + return true; + +canceled: + return false; +} + +// 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() +{ + int enc_dif = encoderDiff; + lcd_implementation_clear(); + lcd.setCursor(0, 0); + lcd_printPGM((PSTR("End stops diag"))); + for (;;) { + manage_heater(); + manage_inactivity(true); + lcd.setCursor(0, 1); + lcd_printPGM((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("X1")) : (PSTR("X0"))); + lcd.setCursor(0, 2); + lcd_printPGM((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Y1")) : (PSTR("Y0"))); + lcd.setCursor(0, 3); + lcd_printPGM((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? (PSTR("Z1")) : (PSTR("Z0"))); + if (lcd_clicked()) { + while (lcd_clicked()) ; + delay(10); + while (lcd_clicked()) ; + break; + } + } + lcd_implementation_clear(); + lcd_return_to_status(); +} + +void lcd_pick_babystep(){ + int enc_dif = 0; + int cursor_pos = 1; + int fsm = 0; + + + + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + + lcd_printPGM(MSG_PICK_Z); + + + lcd.setCursor(3, 2); + + lcd.print("1"); + + lcd.setCursor(3, 3); + + lcd.print("2"); + + lcd.setCursor(12, 2); + + lcd.print("3"); + + lcd.setCursor(12, 3); + + lcd.print("4"); + + lcd.setCursor(1, 2); + + lcd.print(">"); + + + enc_dif = encoderDiff; + + while (fsm == 0) { + + manage_heater(); + manage_inactivity(true); + + if ( abs((enc_dif - encoderDiff)) > 4 ) { + + if ( (abs(enc_dif - encoderDiff)) > 1 ) { + if (enc_dif > encoderDiff ) { + cursor_pos --; + } + + if (enc_dif < encoderDiff ) { + cursor_pos ++; + } + + if (cursor_pos > 4) { + cursor_pos = 4; + } + + if (cursor_pos < 1) { + cursor_pos = 1; + } + + + lcd.setCursor(1, 2); + lcd.print(" "); + lcd.setCursor(1, 3); + lcd.print(" "); + lcd.setCursor(10, 2); + lcd.print(" "); + lcd.setCursor(10, 3); + lcd.print(" "); + + if (cursor_pos < 3) { + lcd.setCursor(1, cursor_pos+1); + lcd.print(">"); + }else{ + lcd.setCursor(10, cursor_pos-1); + lcd.print(">"); + } + + + enc_dif = encoderDiff; + delay(100); + } + + } + + + if (lcd_clicked()) { + fsm = cursor_pos; + + EEPROM_read_B(EEPROM_BABYSTEP_Z0+((fsm-1)*2),&babystepMem[2]); + EEPROM_save_B(EEPROM_BABYSTEP_Z,&babystepMem[2]); + eeprom_write_byte((unsigned char*)EEPROM_BABYSTEP_Z_SET, 0x01); + delay(500); + + } + + + + }; + + + lcd_implementation_clear(); + lcd_return_to_status(); +} + +void lcd_move_menu_axis() +{ + START_MENU(); + MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); + MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x); + MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y); + if (move_menu_scale < 10.0) + { + if (!isPrintPaused) + { + MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z); + } + MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e); + } + END_MENU(); +} + +static void lcd_move_menu_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); +} + + + +static void lcd_silent_mode_set() { + SilentModeMenu = !SilentModeMenu; + EEPROM_save(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); + digipot_init(); + lcd_goto_menu(lcd_settings_menu, 7); +} +static void lcd_set_lang(unsigned char lang) { + lang_selected = lang; + firstrun = 1; + eeprom_write_byte((unsigned char *)EEPROM_LANG, lang);/*langsel=0;*/if (langsel == 1)langsel = 2; +} + +void lcd_force_language_selection() { + eeprom_write_byte((unsigned char *)EEPROM_LANG, 255); +} + +static void lcd_language_menu() +{ + START_MENU(); + if (!langsel) { + MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); + } + if (langsel == 2) { + MENU_ITEM(back, MSG_WATCH, lcd_status_screen); + } + for (int i=0;i<LANG_NUM;i++){ + MENU_ITEM(setlang, MSG_LANGUAGE_NAME_EXPLICIT(i), i); + } + //MENU_ITEM(setlang, MSG_LANGUAGE_NAME_EXPLICIT(1), 1); + END_MENU(); +} + +void lcd_mesh_bedleveling() +{ + + enquecommand_P(PSTR("G80")); + lcd_return_to_status(); +} + +void lcd_mesh_calibration() +{ + enquecommand_P(PSTR("M46")); + lcd_return_to_status(); +} + +void lcd_mesh_calibration_reset() +{ + enquecommand_P(PSTR("M44")); + lcd_return_to_status(); +} + +static void lcd_settings_menu() +{ + EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); + START_MENU(); + + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + + MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); + MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu_1mm); + + if (!isPrintPaused) + { +#ifndef MESH_BED_LEVELING + MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z")); +#else + MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_bedleveling); +#endif + } + + if (!isPrintPaused) + { + MENU_ITEM(gcode, MSG_DISABLE_STEPPERS, PSTR("M84")); + MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28")); + } + + if (SilentModeMenu == 0) { + MENU_ITEM(function, MSG_SILENT_MODE_OFF, lcd_silent_mode_set); + } else { + MENU_ITEM(function, MSG_SILENT_MODE_ON, lcd_silent_mode_set); + } + + EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); + EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); + EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); + babystepMemMM[2] = babystepMem[2]/axis_steps_per_unit[Z_AXIS]; + + if (!isPrintPaused) + { + MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8 + } + MENU_ITEM(submenu, MSG_LANGUAGE_SELECT, lcd_language_menu); + if (!isPrintPaused) + { + MENU_ITEM(submenu, MSG_SELFTEST, lcd_selftest); + MENU_ITEM(submenu, MSG_CALIBRATE_BED, lcd_mesh_calibration); + MENU_ITEM(submenu, MSG_CALIBRATE_BED_RESET, lcd_mesh_calibration_reset); + } + + END_MENU(); +} +/* +void lcd_mylang_top(int hlaska) { + lcd.setCursor(0,0); + lcd.print(" "); + lcd.setCursor(0,0); + lcd_printPGM(MSG_ALL[hlaska-1][LANGUAGE_SELECT]); +} + +void lcd_mylang_drawmenu(int cursor) { + int first = 0; + if (cursor>2) first = cursor-2; + if (cursor==LANG_NUM) first = LANG_NUM-3; + lcd.setCursor(0, 1); + lcd.print(" "); + lcd.setCursor(1, 1); + lcd_printPGM(MSG_ALL[first][LANGUAGE_NAME]); + + lcd.setCursor(0, 2); + lcd.print(" "); + lcd.setCursor(1, 2); + lcd_printPGM(MSG_ALL[first+1][LANGUAGE_NAME]); + + lcd.setCursor(0, 3); + lcd.print(" "); + lcd.setCursor(1, 3); + lcd_printPGM(MSG_ALL[first+2][LANGUAGE_NAME]); + + if (cursor==1) lcd.setCursor(0, 1); + if (cursor>1 && cursor<LANG_NUM) lcd.setCursor(0, 2); + if (cursor==LANG_NUM) lcd.setCursor(0, 3); + + lcd.print(">"); + + if (cursor<LANG_NUM-1) { + lcd.setCursor(19,3); + lcd.print("\x01"); + } + if (cursor>2) { + lcd.setCursor(19,1); + lcd.print("^"); + } +} +*/ + +void lcd_mylang_drawmenu(int cursor) { + int first = 0; + if (cursor>3) first = cursor-3; + if (cursor==LANG_NUM && LANG_NUM>4) first = LANG_NUM-4; + if (cursor==LANG_NUM && LANG_NUM==4) first = LANG_NUM-4; + + + lcd.setCursor(0, 0); + lcd.print(" "); + lcd.setCursor(1, 0); + lcd_printPGM(MSG_LANGUAGE_NAME_EXPLICIT(first+0)); + + lcd.setCursor(0, 1); + lcd.print(" "); + lcd.setCursor(1, 1); + lcd_printPGM(MSG_LANGUAGE_NAME_EXPLICIT(first+1)); + + lcd.setCursor(0, 2); + lcd.print(" "); + + if (LANG_NUM > 2){ + lcd.setCursor(1, 2); + lcd_printPGM(MSG_LANGUAGE_NAME_EXPLICIT(first+2)); + } + + lcd.setCursor(0, 3); + lcd.print(" "); + if (LANG_NUM>3) { + lcd.setCursor(1, 3); + lcd_printPGM(MSG_LANGUAGE_NAME_EXPLICIT(first+3)); + } + + if (cursor==1) lcd.setCursor(0, 0); + if (cursor==2) lcd.setCursor(0, 1); + if (cursor>2) lcd.setCursor(0, 2); + if (cursor==LANG_NUM && LANG_NUM>3) lcd.setCursor(0, 3); + + lcd.print(">"); + + if (cursor<LANG_NUM-1 && LANG_NUM>4) { + lcd.setCursor(19,3); + lcd.print("\x01"); + } + if (cursor>3 && LANG_NUM>4) { + lcd.setCursor(19,0); + lcd.print("^"); + } +} + +void lcd_set_custom_characters_arrows(); +void lcd_set_custom_characters_degree(); + +void lcd_mylang_drawcursor(int cursor) { + + if (cursor==1) lcd.setCursor(0, 1); + if (cursor>1 && cursor<LANG_NUM) lcd.setCursor(0, 2); + if (cursor==LANG_NUM) lcd.setCursor(0, 3); + + lcd.print(">"); + +} + +void lcd_mylang() { + int enc_dif = 0; + int cursor_pos = 1; + lang_selected=255; + int hlaska=1; + int counter=0; + lcd_set_custom_characters_arrows(); + + lcd_implementation_clear(); + + //lcd_mylang_top(hlaska); + + lcd_mylang_drawmenu(cursor_pos); + + + enc_dif = encoderDiff; + + while ( (lang_selected == 255) && (MYSERIAL.available() < 2) ) { + + manage_heater(); + manage_inactivity(true); + + if ( abs((enc_dif - encoderDiff)) > 4 ) { + + //if ( (abs(enc_dif - encoderDiff)) > 1 ) { + if (enc_dif > encoderDiff ) { + cursor_pos --; + } + + if (enc_dif < encoderDiff ) { + cursor_pos ++; + } + + if (cursor_pos > LANG_NUM) { + cursor_pos = LANG_NUM; + } + + if (cursor_pos < 1) { + cursor_pos = 1; + } + + lcd_mylang_drawmenu(cursor_pos); + enc_dif = encoderDiff; + delay(100); + //} + + } else delay(20); + + + if (lcd_clicked()) { + + lcd_set_lang(cursor_pos-1); + delay(500); + + } + /* + if (++counter == 80) { + hlaska++; + if(hlaska>LANG_NUM) hlaska=1; + lcd_mylang_top(hlaska); + lcd_mylang_drawcursor(cursor_pos); + counter=0; + } + */ + }; + + if(MYSERIAL.available() > 1){ + lang_selected = 0; + firstrun = 0; + } + + lcd_set_custom_characters_degree(); + lcd_implementation_clear(); + lcd_return_to_status(); + +} + + + + +static void lcd_main_menu() +{ + + SDscrool = 0; + /* + if (langsel == 1) + { + lcd_goto_menu(lcd_language_menu); + } + */ + START_MENU(); + + // Majkl superawesome menu + + + MENU_ITEM(back, MSG_WATCH, lcd_status_screen); + + if ( ( IS_SD_PRINTING || is_usb_printing ) && (current_position[Z_AXIS] < 0.5) ) + { + EEPROM_read_B(EEPROM_BABYSTEP_X, &babystepMem[0]); + EEPROM_read_B(EEPROM_BABYSTEP_Y, &babystepMem[1]); + EEPROM_read_B(EEPROM_BABYSTEP_Z, &babystepMem[2]); + MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8 + } + + + if ( movesplanned() || IS_SD_PRINTING || is_usb_printing ) + { + MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu); + } else + { + MENU_ITEM(submenu, MSG_PREHEAT, lcd_preheat_menu); + } + +#ifdef SDSUPPORT + if (card.cardOK) + { + if (card.isFileOpen()) + { + if (card.sdprinting) + { + MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause); + } + else + { + MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); + } + MENU_ITEM(submenu, MSG_STOP_PRINT, lcd_sdcard_stop); + } + else + { + if (!is_usb_printing) + { + MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); + } +#if SDCARDDETECT < 1 + MENU_ITEM(gcode, MSG_CNG_SDCARD, PSTR("M21")); // SD-card changed by user +#endif + } + } else + { + MENU_ITEM(submenu, MSG_NO_CARD, lcd_sdcard_menu); +#if SDCARDDETECT < 1 + MENU_ITEM(gcode, MSG_INIT_SDCARD, PSTR("M21")); // Manually initialize the SD-card via user interface +#endif + } +#endif + + + if (IS_SD_PRINTING || is_usb_printing) + { + } + else + { + MENU_ITEM(function, MSG_LOAD_FILAMENT, lcd_LoadFilament); + MENU_ITEM(function, MSG_UNLOAD_FILAMENT, lcd_unLoadFilament); + MENU_ITEM(submenu, MSG_SETTINGS, lcd_settings_menu); + } + + if (!is_usb_printing) + { + MENU_ITEM(submenu, MSG_STATISTICS, lcd_menu_statistics); + } + MENU_ITEM(submenu, MSG_SUPPORT, lcd_support_menu); + + END_MENU(); +} + + + +#ifdef SDSUPPORT +static void lcd_autostart_sd() +{ + card.lastnr = 0; + card.setroot(); + card.checkautostart(true); +} +#endif + + + +static void lcd_silent_mode_set_tune() { + SilentModeMenu = !SilentModeMenu; + EEPROM_save(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); + digipot_init(); + lcd_goto_menu(lcd_tune_menu, 9); +} + +static void lcd_tune_menu() +{ + EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); + + + + START_MENU(); + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); //1 + MENU_ITEM_EDIT(int3, MSG_SPEED, &feedmultiply, 10, 999);//2 + + MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10);//3 + MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 10);//4 + + MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);//5 + MENU_ITEM_EDIT(int3, MSG_FLOW, &extrudemultiply, 10, 999);//6 +#ifdef FILAMENTCHANGEENABLE + MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600"));//7 +#endif + + if (SilentModeMenu == 0) { + MENU_ITEM(function, MSG_SILENT_MODE_OFF, lcd_silent_mode_set_tune); + } else { + MENU_ITEM(function, MSG_SILENT_MODE_ON, lcd_silent_mode_set_tune); + } + END_MENU(); +} + + + + +static void lcd_move_menu_01mm() +{ + move_menu_scale = 0.1; + lcd_move_menu_axis(); +} + +static void lcd_control_temperature_menu() +{ +#ifdef PIDTEMP + // set up temp variables - undo the default scaling + raw_Ki = unscalePID_i(Ki); + raw_Kd = unscalePID_d(Kd); +#endif + + START_MENU(); + MENU_ITEM(back, MSG_SETTINGS, lcd_settings_menu); + //MENU_ITEM(back, MSG_CONTROL, lcd_control_menu); +#if TEMP_SENSOR_0 != 0 + MENU_ITEM_EDIT(int3, MSG_NOZZLE, &target_temperature[0], 0, HEATER_0_MAXTEMP - 10); +#endif +#if TEMP_SENSOR_1 != 0 + MENU_ITEM_EDIT(int3, MSG_NOZZLE1, &target_temperature[1], 0, HEATER_1_MAXTEMP - 10); +#endif +#if TEMP_SENSOR_2 != 0 + MENU_ITEM_EDIT(int3, MSG_NOZZLE2, &target_temperature[2], 0, HEATER_2_MAXTEMP - 10); +#endif +#if TEMP_SENSOR_BED != 0 + MENU_ITEM_EDIT(int3, MSG_BED, &target_temperature_bed, 0, BED_MAXTEMP - 3); +#endif + MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); +#if defined AUTOTEMP && (TEMP_SENSOR_0 != 0) + MENU_ITEM_EDIT(bool, MSG_AUTOTEMP, &autotemp_enabled); + MENU_ITEM_EDIT(float3, MSG_MIN, &autotemp_min, 0, HEATER_0_MAXTEMP - 10); + MENU_ITEM_EDIT(float3, MSG_MAX, &autotemp_max, 0, HEATER_0_MAXTEMP - 10); + MENU_ITEM_EDIT(float32, MSG_FACTOR, &autotemp_factor, 0.0, 1.0); +#endif + + END_MENU(); +} + + +#if SDCARDDETECT == -1 +static void lcd_sd_refresh() +{ + card.initsd(); + currentMenuViewOffset = 0; +} +#endif +static void lcd_sd_updir() +{ + SDscrool = 0; + card.updir(); + currentMenuViewOffset = 0; +} + + +void lcd_sdcard_stop() +{ + + lcd.setCursor(0, 0); + lcd_printPGM(MSG_STOP_PRINT); + lcd.setCursor(2, 2); + lcd_printPGM(MSG_NO); + lcd.setCursor(2, 3); + lcd_printPGM(MSG_YES); + lcd.setCursor(0, 2); lcd.print(" "); + lcd.setCursor(0, 3); lcd.print(" "); + + if ((int32_t)encoderPosition > 2) { encoderPosition = 2; } + if ((int32_t)encoderPosition < 1) { encoderPosition = 1; } + + lcd.setCursor(0, 1 + encoderPosition); + lcd.print(">"); + + if (lcd_clicked()) + { + if ((int32_t)encoderPosition == 1) + { + lcd_return_to_status(); + } + if ((int32_t)encoderPosition == 2) + { + cancel_heatup = true; + quickStop(); + lcd_setstatuspgm(MSG_PRINT_ABORTED); + card.sdprinting = false; + card.closefile(); + + stoptime = millis(); + unsigned long t = (stoptime - starttime) / 1000; + save_statistics(total_filament_used, t); + + lcd_return_to_status(); + lcd_ignore_click(true); + lcd_commands_type = 2; + } + } + +} + +void lcd_sdcard_menu() +{ + + int tempScrool = 0; + if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) + //delay(100); + return; // nothing to do (so don't thrash the SD card) + uint16_t fileCnt = card.getnrfilenames(); + + START_MENU(); + MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + card.getWorkDirName(); + if (card.filename[0] == '/') + { +#if SDCARDDETECT == -1 + MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh); +#endif + } else { + MENU_ITEM(function, LCD_STR_FOLDER "..", lcd_sd_updir); + } + + for (uint16_t i = 0; i < fileCnt; i++) + { + if (_menuItemNr == _lineNr) + { +#ifndef SDCARD_RATHERRECENTFIRST + card.getfilename(i); +#else + card.getfilename(fileCnt - 1 - i); +#endif + if (card.filenameIsDir) + { + MENU_ITEM(sddirectory, MSG_CARD_MENU, card.filename, card.longFilename); + } else { + + MENU_ITEM(sdfile, MSG_CARD_MENU, card.filename, card.longFilename); + + + + + } + } else { + MENU_ITEM_DUMMY(); + } + } + END_MENU(); +} + +#define menu_edit_type(_type, _name, _strFunc, scale) \ + void menu_edit_ ## _name () \ + { \ + if ((int32_t)encoderPosition < 0) encoderPosition = 0; \ + if ((int32_t)encoderPosition > maxEditValue) encoderPosition = maxEditValue; \ + if (lcdDrawUpdate) \ + lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \ + if (LCD_CLICKED) \ + { \ + *((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \ + lcd_goto_menu(prevMenu, prevEncoderPosition); \ + } \ + } \ + void menu_edit_callback_ ## _name () { \ + menu_edit_ ## _name (); \ + if (LCD_CLICKED) (*callbackFunc)(); \ + } \ + static void menu_action_setting_edit_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue) \ + { \ + prevMenu = currentMenu; \ + prevEncoderPosition = encoderPosition; \ + \ + lcdDrawUpdate = 2; \ + currentMenu = menu_edit_ ## _name; \ + \ + editLabel = pstr; \ + editValue = ptr; \ + minEditValue = minValue * scale; \ + maxEditValue = maxValue * scale - minEditValue; \ + encoderPosition = (*ptr) * scale - minEditValue; \ + }\ + static void menu_action_setting_edit_callback_ ## _name (const char* pstr, _type* ptr, _type minValue, _type maxValue, menuFunc_t callback) \ + { \ + prevMenu = currentMenu; \ + prevEncoderPosition = encoderPosition; \ + \ + lcdDrawUpdate = 2; \ + currentMenu = menu_edit_callback_ ## _name; \ + \ + editLabel = pstr; \ + editValue = ptr; \ + minEditValue = minValue * scale; \ + maxEditValue = maxValue * scale - minEditValue; \ + encoderPosition = (*ptr) * scale - minEditValue; \ + callbackFunc = callback;\ + } +menu_edit_type(int, int3, itostr3, 1) +menu_edit_type(float, float3, ftostr3, 1) +menu_edit_type(float, float32, ftostr32, 100) +menu_edit_type(float, float43, ftostr43, 1000) +menu_edit_type(float, float5, ftostr5, 0.01) +menu_edit_type(float, float51, ftostr51, 10) +menu_edit_type(float, float52, ftostr52, 100) +menu_edit_type(unsigned long, long5, ftostr5, 0.01) + + +static void lcd_selftest() +{ + int _progress = 0; + bool _result = false; + + _progress = lcd_selftest_screen(-1, _progress, 4, true, 2000); + + _progress = lcd_selftest_screen(0, _progress, 3, true, 2000); + _result = lcd_selfcheck_endstops(); + + if (_result) + { + _progress = lcd_selftest_screen(1, _progress, 3, true, 1000); + _result = lcd_selfcheck_check_heater(false); + } + + if (_result) + { + _progress = lcd_selftest_screen(2, _progress, 3, true, 2000); + _result = lcd_selfcheck_axis(0, X_MAX_POS); + } + + if (_result) + { + _progress = lcd_selftest_screen(3, _progress, 3, true, 1500); + _result = lcd_selfcheck_axis(1, Y_MAX_POS); + } + + if (_result) + { + current_position[X_AXIS] = current_position[X_AXIS] - 3; + current_position[Y_AXIS] = current_position[Y_AXIS] - 14; + _progress = lcd_selftest_screen(4, _progress, 3, true, 1500); + _result = lcd_selfcheck_axis(2, Z_MAX_POS); + } + + if (_result) + { + _progress = lcd_selftest_screen(5, _progress, 3, true, 2000); + _result = lcd_selfcheck_check_heater(true); + } + if (_result) + { + _progress = lcd_selftest_screen(6, _progress, 3, true, 5000); + } + else + { + _progress = lcd_selftest_screen(7, _progress, 3, true, 5000); + } + + lcd_implementation_clear(); + lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; + + if (_result) + { + LCD_ALERTMESSAGERPGM(MSG_SELFTEST_OK); + } + else + { + LCD_ALERTMESSAGERPGM(MSG_SELFTEST_FAILED); + } +} +static bool lcd_selfcheck_endstops() +{ + bool _result = true; + + if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) + { + current_position[0] = (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? current_position[0] = current_position[0] + 10 : current_position[0]; + current_position[1] = (READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? current_position[1] = current_position[1] + 10 : current_position[1]; + current_position[2] = (READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? current_position[2] = current_position[2] + 10 : current_position[2]; + } + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[0] / 60, active_extruder); + delay(500); + + if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) + { + _result = false; + String _error = String((READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1) ? "X" : "") + + String((READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1) ? "Y" : "") + + String((READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) ? "Z" : ""); + lcd_selftest_error(3, _error.c_str(), ""); + } + manage_heater(); + manage_inactivity(); + return _result; +} +static bool lcd_selfcheck_axis(int _axis, int _travel) +{ + 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); + + do { + + if (_axis == 2) + { + current_position[_axis] = current_position[_axis] - 1; + } + else + { + current_position[_axis] = current_position[_axis] - 3; + } + + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + st_synchronize(); + + if (READ(X_MIN_PIN) ^ X_MIN_ENDSTOP_INVERTING == 1 || READ(Y_MIN_PIN) ^ Y_MIN_ENDSTOP_INVERTING == 1 || READ(Z_MIN_PIN) ^ Z_MIN_ENDSTOP_INVERTING == 1) + { + if (_axis == 0) + { + _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; + disable_x(); + } + if (_axis == 1) + { + _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; + disable_y(); + } + if (_axis == 2) + { + _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; + disable_z(); + } + _stepdone = true; + } + + if (_lcd_refresh < 6) + { + _lcd_refresh++; + } + else + { + _progress = lcd_selftest_screen(2 + _axis, _progress, 3, false, 0); + _lcd_refresh = 0; + } + + manage_heater(); + manage_inactivity(); + + delay(100); + (_travel_done <= _travel) ? _travel_done++ : _stepdone = true; + + } while (!_stepdone); + + + current_position[_axis] = current_position[_axis] + 15; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[3], manual_feedrate[0] / 60, active_extruder); + + 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"; + + if (_travel_done >= _travel) + { + lcd_selftest_error(5, _error_1, _error_2); + } + else + { + lcd_selftest_error(4, _error_1, _error_2); + } + } + + return _stepresult; +} +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(); + int _cycles = (_isbed) ? 120 : 30; + + target_temperature[0] = (_isbed) ? 0 : 100; + target_temperature_bed = (_isbed) ? 100 : 0; + manage_heater(); + manage_inactivity(); + + do { + _counter++; + (_counter < _cycles) ? _docycle = true : _docycle = false; + + manage_heater(); + manage_inactivity(); + _progress = (_isbed) ? lcd_selftest_screen(5, _progress, 2, false, 400) : lcd_selftest_screen(1, _progress, 2, false, 400); + + } while (_docycle); + + 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; + + if (_opposite_result < (_isbed) ? 10 : 3) + { + if (_checked_result >= (_isbed) ? 3 : 10) + { + _stepresult = true; + } + else + { + lcd_selftest_error(1, "", ""); + } + } + else + { + lcd_selftest_error(2, "", ""); + } + + manage_heater(); + manage_inactivity(); + return _stepresult; + +} +static void lcd_selftest_error(int _error_no, const char *_error_1, const char *_error_2) +{ + lcd_implementation_quick_feedback(); + + target_temperature[0] = 0; + target_temperature_bed = 0; + manage_heater(); + manage_inactivity(); + + lcd_implementation_clear(); + + lcd.setCursor(0, 0); + lcd_printPGM(MSG_SELFTEST_ERROR); + lcd.setCursor(0, 1); + lcd_printPGM(MSG_SELFTEST_PLEASECHECK); + + switch (_error_no) + { + case 1: + lcd.setCursor(0, 2); + lcd_printPGM(MSG_SELFTEST_HEATERTHERMISTOR); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_SELFTEST_NOTCONNECTED); + break; + case 2: + lcd.setCursor(0, 2); + lcd_printPGM(MSG_SELFTEST_BEDHEATER); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_SELFTEST_WIRINGERROR); + break; + case 3: + lcd.setCursor(0, 2); + lcd_printPGM(MSG_SELFTEST_ENDSTOPS); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_SELFTEST_WIRINGERROR); + lcd.setCursor(17, 3); + lcd.print(_error_1); + break; + case 4: + lcd.setCursor(0, 2); + lcd_printPGM(MSG_SELFTEST_MOTOR); + lcd.setCursor(18, 2); + lcd.print(_error_1); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_SELFTEST_ENDSTOP); + lcd.setCursor(18, 3); + lcd.print(_error_2); + break; + case 5: + lcd.setCursor(0, 2); + lcd_printPGM(MSG_SELFTEST_ENDSTOP_NOTHIT); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_SELFTEST_MOTOR); + lcd.setCursor(18, 3); + lcd.print(_error_1); + break; + + } + + delay(1000); + lcd_implementation_quick_feedback(); + + do { + delay(100); + manage_heater(); + manage_inactivity(); + } while (!lcd_clicked()); + + LCD_ALERTMESSAGERPGM(MSG_SELFTEST_FAILED); + lcd_return_to_status(); + +} +static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bool _clear, int _delay) +{ + lcd_next_update_millis = millis() + (LCD_UPDATE_INTERVAL * 10000); + + int _step_block = 0; + const char *_indicator = (_progress > _progress_scale) ? "-" : "|"; + + if (_clear) lcd_implementation_clear(); + + + lcd.setCursor(0, 0); + + if (_step == -1) lcd_printPGM(MSG_SELFTEST_START); + if (_step == 0) lcd_printPGM(MSG_SELFTEST_CHECK_ENDSTOPS); + if (_step == 1) lcd_printPGM(MSG_SELFTEST_CHECK_HOTEND); + if (_step == 2) lcd_printPGM(MSG_SELFTEST_CHECK_X); + if (_step == 3) lcd_printPGM(MSG_SELFTEST_CHECK_Y); + if (_step == 4) lcd_printPGM(MSG_SELFTEST_CHECK_Z); + if (_step == 5) lcd_printPGM(MSG_SELFTEST_CHECK_BED); + if (_step == 6) lcd_printPGM(MSG_SELFTEST_CHECK_ALLCORRECT); + if (_step == 7) lcd_printPGM(MSG_SELFTEST_FAILED); + + lcd.setCursor(0, 1); + lcd.print("--------------------"); + + _step_block = 1; + lcd_selftest_screen_step(3, 9, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Hotend", _indicator); + + _step_block = 2; + lcd_selftest_screen_step(2, 2, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "X", _indicator); + + _step_block = 3; + lcd_selftest_screen_step(2, 8, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Y", _indicator); + + _step_block = 4; + lcd_selftest_screen_step(2, 14, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Z", _indicator); + + _step_block = 5; + lcd_selftest_screen_step(3, 0, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Bed", _indicator); + + + if (_delay > 0) delay(_delay); + _progress++; + + return (_progress > _progress_scale * 2) ? 0 : _progress; +} +static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator) +{ + lcd.setCursor(_col, _row); + + switch (_state) + { + case 1: + lcd.print(_name); + lcd.setCursor(_col + strlen(_name), _row); + lcd.print(":"); + lcd.setCursor(_col + strlen(_name) + 1, _row); + lcd.print(_indicator); + break; + case 2: + lcd.print(_name); + lcd.setCursor(_col + strlen(_name), _row); + lcd.print(":"); + lcd.setCursor(_col + strlen(_name) + 1, _row); + lcd.print("OK"); + break; + default: + lcd.print(_name); + } +} + + +/** End of menus **/ + +static void lcd_quick_feedback() +{ + lcdDrawUpdate = 2; + blocking_enc = millis() + 500; + lcd_implementation_quick_feedback(); +} + +/** Menu action functions **/ +static void menu_action_back(menuFunc_t data) { + lcd_goto_menu(data); +} +static void menu_action_submenu(menuFunc_t data) { + lcd_goto_menu(data); +} +static void menu_action_gcode(const char* pgcode) { + enquecommand_P(pgcode); +} +static void menu_action_setlang(unsigned char lang) { + lcd_set_lang(lang); +} +static void menu_action_function(menuFunc_t data) { + (*data)(); +} +static void menu_action_sdfile(const char* filename, char* longFilename) +{ + char cmd[30]; + char* c; + sprintf_P(cmd, PSTR("M23 %s"), filename); + for (c = &cmd[4]; *c; c++) + *c = tolower(*c); + enquecommand(cmd); + enquecommand_P(PSTR("M24")); + lcd_return_to_status(); +} +static void menu_action_sddirectory(const char* filename, char* longFilename) +{ + card.chdir(filename); + encoderPosition = 0; +} +static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) +{ + *ptr = !(*ptr); +} +static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) +{ + menu_action_setting_edit_bool(pstr, ptr); + (*callback)(); +} +#endif//ULTIPANEL + +/** LCD API **/ +void lcd_init() +{ + lcd_implementation_init(); + +#ifdef NEWPANEL + 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 +#ifdef REPRAPWORLD_KEYPAD + pinMode(SHIFT_CLK, OUTPUT); + pinMode(SHIFT_LD, OUTPUT); + pinMode(SHIFT_OUT, INPUT); + WRITE(SHIFT_OUT, HIGH); + WRITE(SHIFT_LD, HIGH); +#endif +#else // Not NEWPANEL +#ifdef SR_LCD_2W_NL // Non latching 2 wire shift register + pinMode (SR_DATA_PIN, OUTPUT); + pinMode (SR_CLK_PIN, OUTPUT); +#elif defined(SHIFT_CLK) + pinMode(SHIFT_CLK, OUTPUT); + pinMode(SHIFT_LD, OUTPUT); + pinMode(SHIFT_EN, OUTPUT); + pinMode(SHIFT_OUT, INPUT); + WRITE(SHIFT_OUT, HIGH); + WRITE(SHIFT_LD, HIGH); + WRITE(SHIFT_EN, LOW); +#else +#ifdef ULTIPANEL +#error ULTIPANEL requires an encoder +#endif +#endif // SR_LCD_2W_NL +#endif//!NEWPANEL + +#if defined (SDSUPPORT) && defined(SDCARDDETECT) && (SDCARDDETECT > 0) + pinMode(SDCARDDETECT, INPUT); + WRITE(SDCARDDETECT, HIGH); + lcd_oldcardstatus = IS_SD_INSERTED; +#endif//(SDCARDDETECT > 0) +#ifdef LCD_HAS_SLOW_BUTTONS + slow_buttons = 0; +#endif + lcd_buttons_update(); +#ifdef ULTIPANEL + encoderDiff = 0; +#endif +} + + + + +//#include <avr/pgmspace.h> + +static volatile bool lcd_update_enabled = true; + +void lcd_update_enable(bool enabled) +{ + lcd_update_enabled = enabled; +} + +void lcd_update() +{ + static unsigned long timeoutToStatus = 0; + + if (! lcd_update_enabled) + return; + +#ifdef LCD_HAS_SLOW_BUTTONS + slow_buttons = lcd_implementation_read_slow_buttons(); // buttons which take too long to read in interrupt context +#endif + + lcd_buttons_update(); + +#if (SDCARDDETECT > 0) + if ((IS_SD_INSERTED != lcd_oldcardstatus && lcd_detected())) + { + lcdDrawUpdate = 2; + lcd_oldcardstatus = IS_SD_INSERTED; + lcd_implementation_init( // to maybe revive the LCD if static electricity killed it. +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + currentMenu == lcd_status_screen +#endif + ); + + if (lcd_oldcardstatus) + { + card.initsd(); + LCD_MESSAGERPGM(MSG_SD_INSERTED); + } + else + { + card.release(); + LCD_MESSAGERPGM(MSG_SD_REMOVED); + } + } +#endif//CARDINSERTED + + if (lcd_next_update_millis < millis()) + { +#ifdef ULTIPANEL +#ifdef REPRAPWORLD_KEYPAD + if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) { + reprapworld_keypad_move_z_up(); + } + if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) { + reprapworld_keypad_move_z_down(); + } + if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) { + reprapworld_keypad_move_x_left(); + } + if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) { + reprapworld_keypad_move_x_right(); + } + if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) { + reprapworld_keypad_move_y_down(); + } + if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) { + reprapworld_keypad_move_y_up(); + } + if (REPRAPWORLD_KEYPAD_MOVE_HOME) { + reprapworld_keypad_move_home(); + } +#endif + if (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP) + { + lcdDrawUpdate = 1; + encoderPosition += encoderDiff / ENCODER_PULSES_PER_STEP; + encoderDiff = 0; + timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + } + if (LCD_CLICKED) + timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; +#endif//ULTIPANEL + +#ifdef DOGLCD // Changes due to different driver architecture of the DOGM display + blink++; // Variable for fan animation and alive dot + u8g.firstPage(); + do + { + u8g.setFont(u8g_font_6x10_marlin); + u8g.setPrintPos(125, 0); + if (blink % 2) u8g.setColorIndex(1); else u8g.setColorIndex(0); // Set color for the alive dot + u8g.drawPixel(127, 63); // draw alive dot + u8g.setColorIndex(1); // black on white + (*currentMenu)(); + if (!lcdDrawUpdate) break; // Terminate display update, when nothing new to draw. This must be done before the last dogm.next() + } while (u8g.nextPage()); +#else + (*currentMenu)(); +#endif + +#ifdef LCD_HAS_STATUS_INDICATORS + lcd_implementation_update_indicators(); +#endif + +#ifdef ULTIPANEL + if (timeoutToStatus < millis() && currentMenu != lcd_status_screen) + { + lcd_return_to_status(); + lcdDrawUpdate = 2; + } +#endif//ULTIPANEL + if (lcdDrawUpdate == 2) lcd_implementation_clear(); + if (lcdDrawUpdate) lcdDrawUpdate--; + lcd_next_update_millis = millis() + LCD_UPDATE_INTERVAL; + } + +} + +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'; +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) +#if PROGRESS_MSG_EXPIRE > 0 + messageTick = +#endif + progressBarTick = millis(); +#endif + lcdDrawUpdate = 2; + +#ifdef FILAMENT_LCD_DISPLAY + message_millis = millis(); //get status message to show up for a while +#endif +} +void lcd_setstatus(const char* message) +{ + if (lcd_status_message_level > 0) + return; + strncpy(lcd_status_message, message, LCD_WIDTH); + lcd_finishstatus(); +} +void lcd_setstatuspgm(const char* message) +{ + if (lcd_status_message_level > 0) + return; + strncpy_P(lcd_status_message, message, LCD_WIDTH); + lcd_finishstatus(); +} +void lcd_setalertstatuspgm(const char* message) +{ + lcd_setstatuspgm(message); + lcd_status_message_level = 1; +#ifdef ULTIPANEL + lcd_return_to_status(); +#endif//ULTIPANEL +} +void lcd_reset_alert_level() +{ + lcd_status_message_level = 0; +} + +#ifdef DOGLCD +void lcd_setcontrast(uint8_t value) +{ + lcd_contrast = value & 63; + u8g.setContrast(lcd_contrast); +} +#endif + +#ifdef ULTIPANEL +/* Warning: This function is called from interrupt context */ +void lcd_buttons_update() +{ +#ifdef NEWPANEL + uint8_t newbutton = 0; + if (READ(BTN_EN1) == 0) newbutton |= EN_A; + if (READ(BTN_EN2) == 0) newbutton |= EN_B; +#if BTN_ENC > 0 + if ((blocking_enc < millis()) && (READ(BTN_ENC) == 0)) + newbutton |= EN_C; +#endif + buttons = newbutton; +#ifdef LCD_HAS_SLOW_BUTTONS + buttons |= slow_buttons; +#endif +#ifdef REPRAPWORLD_KEYPAD + // for the reprapworld_keypad + uint8_t newbutton_reprapworld_keypad = 0; + WRITE(SHIFT_LD, LOW); + WRITE(SHIFT_LD, HIGH); + for (int8_t i = 0; i < 8; i++) { + newbutton_reprapworld_keypad = newbutton_reprapworld_keypad >> 1; + if (READ(SHIFT_OUT)) + newbutton_reprapworld_keypad |= (1 << 7); + WRITE(SHIFT_CLK, HIGH); + WRITE(SHIFT_CLK, LOW); + } + buttons_reprapworld_keypad = ~newbutton_reprapworld_keypad; //invert it, because a pressed switch produces a logical 0 +#endif +#else //read it from the shift register + uint8_t newbutton = 0; + WRITE(SHIFT_LD, LOW); + WRITE(SHIFT_LD, HIGH); + unsigned char tmp_buttons = 0; + for (int8_t i = 0; i < 8; i++) + { + newbutton = newbutton >> 1; + if (READ(SHIFT_OUT)) + newbutton |= (1 << 7); + WRITE(SHIFT_CLK, HIGH); + WRITE(SHIFT_CLK, LOW); + } + buttons = ~newbutton; //invert it, because a pressed switch produces a logical 0 +#endif//!NEWPANEL + + //manage encoder rotation + uint8_t enc = 0; + if (buttons & EN_A) enc |= B01; + if (buttons & EN_B) enc |= B10; + if (enc != lastEncoderBits) + { + switch (enc) + { + case encrot0: + if (lastEncoderBits == encrot3) + encoderDiff++; + else if (lastEncoderBits == encrot1) + encoderDiff--; + break; + case encrot1: + if (lastEncoderBits == encrot0) + encoderDiff++; + else if (lastEncoderBits == encrot2) + encoderDiff--; + break; + case encrot2: + if (lastEncoderBits == encrot1) + encoderDiff++; + else if (lastEncoderBits == encrot3) + encoderDiff--; + break; + case encrot3: + if (lastEncoderBits == encrot2) + encoderDiff++; + else if (lastEncoderBits == encrot0) + encoderDiff--; + break; + } + } + lastEncoderBits = enc; +} + +bool lcd_detected(void) +{ +#if (defined(LCD_I2C_TYPE_MCP23017) || defined(LCD_I2C_TYPE_MCP23008)) && defined(DETECT_DEVICE) + return lcd.LcdDetected() == 1; +#else + return true; +#endif +} + +void lcd_buzz(long duration, uint16_t freq) +{ +#ifdef LCD_USE_I2C_BUZZER + lcd.buzz(duration, freq); +#endif +} + +bool lcd_clicked() +{ + return LCD_CLICKED; +} +#endif//ULTIPANEL + +/********************************/ +/** Float conversion utilities **/ +/********************************/ +// convert float to string with +123.4 format +char conv[8]; +char *ftostr3(const float &x) +{ + return itostr3((int)x); +} + +char *itostr2(const uint8_t &x) +{ + //sprintf(conv,"%5.1f",x); + int xx = x; + conv[0] = (xx / 10) % 10 + '0'; + conv[1] = (xx) % 10 + '0'; + conv[2] = 0; + return conv; +} + +// Convert float to string with 123.4 format, dropping sign +char *ftostr31(const float &x) +{ + int xx = x * 10; + conv[0] = (xx >= 0) ? '+' : '-'; + xx = abs(xx); + conv[1] = (xx / 1000) % 10 + '0'; + conv[2] = (xx / 100) % 10 + '0'; + conv[3] = (xx / 10) % 10 + '0'; + conv[4] = '.'; + conv[5] = (xx) % 10 + '0'; + conv[6] = 0; + return conv; +} + +// Convert float to string with 123.4 format +char *ftostr31ns(const float &x) +{ + int xx = x * 10; + //conv[0]=(xx>=0)?'+':'-'; + xx = abs(xx); + conv[0] = (xx / 1000) % 10 + '0'; + conv[1] = (xx / 100) % 10 + '0'; + conv[2] = (xx / 10) % 10 + '0'; + conv[3] = '.'; + conv[4] = (xx) % 10 + '0'; + conv[5] = 0; + return conv; +} + +char *ftostr32(const float &x) +{ + long xx = x * 100; + if (xx >= 0) + conv[0] = (xx / 10000) % 10 + '0'; + else + conv[0] = '-'; + xx = abs(xx); + conv[1] = (xx / 1000) % 10 + '0'; + conv[2] = (xx / 100) % 10 + '0'; + conv[3] = '.'; + conv[4] = (xx / 10) % 10 + '0'; + conv[5] = (xx) % 10 + '0'; + conv[6] = 0; + return conv; +} + +//// Convert float to rj string with 123.45 format +char *ftostr32ns(const float &x) { + long xx = abs(x); + conv[0] = xx >= 10000 ? (xx / 10000) % 10 + '0' : ' '; + conv[1] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; + conv[2] = xx >= 100 ? (xx / 100) % 10 + '0' : '0'; + conv[3] = '.'; + conv[4] = (xx / 10) % 10 + '0'; + conv[5] = xx % 10 + '0'; + return conv; +} + + +// Convert float to string with 1.234 format +char *ftostr43(const float &x) +{ + long xx = x * 1000; + if (xx >= 0) + conv[0] = (xx / 1000) % 10 + '0'; + else + conv[0] = '-'; + xx = abs(xx); + conv[1] = '.'; + conv[2] = (xx / 100) % 10 + '0'; + conv[3] = (xx / 10) % 10 + '0'; + conv[4] = (xx) % 10 + '0'; + conv[5] = 0; + return conv; +} + +//Float to string with 1.23 format +char *ftostr12ns(const float &x) +{ + long xx = x * 100; + + xx = abs(xx); + conv[0] = (xx / 100) % 10 + '0'; + conv[1] = '.'; + conv[2] = (xx / 10) % 10 + '0'; + conv[3] = (xx) % 10 + '0'; + conv[4] = 0; + return conv; +} + +//Float to string with 1.234 format +char *ftostr13ns(const float &x) +{ + long xx = x * 1000; + if (xx >= 0) + conv[0] = ' '; + else + conv[0] = '-'; + xx = abs(xx); + conv[1] = (xx / 1000) % 10 + '0'; + conv[2] = '.'; + conv[3] = (xx / 100) % 10 + '0'; + conv[4] = (xx / 10) % 10 + '0'; + conv[5] = (xx) % 10 + '0'; + conv[6] = 0; + return conv; +} + +// convert float to space-padded string with -_23.4_ format +char *ftostr32sp(const float &x) { + long xx = abs(x * 100); + uint8_t dig; + + if (x < 0) { // negative val = -_0 + conv[0] = '-'; + dig = (xx / 1000) % 10; + conv[1] = dig ? '0' + dig : ' '; + } + else { // positive val = __0 + dig = (xx / 10000) % 10; + if (dig) { + conv[0] = '0' + dig; + conv[1] = '0' + (xx / 1000) % 10; + } + else { + conv[0] = ' '; + dig = (xx / 1000) % 10; + conv[1] = dig ? '0' + dig : ' '; + } + } + + conv[2] = '0' + (xx / 100) % 10; // lsd always + + dig = xx % 10; + if (dig) { // 2 decimal places + conv[5] = '0' + dig; + conv[4] = '0' + (xx / 10) % 10; + conv[3] = '.'; + } + else { // 1 or 0 decimal place + dig = (xx / 10) % 10; + if (dig) { + conv[4] = '0' + dig; + conv[3] = '.'; + } + else { + conv[3] = conv[4] = ' '; + } + conv[5] = ' '; + } + conv[6] = '\0'; + return conv; +} + +char *itostr31(const int &xx) +{ + conv[0] = (xx >= 0) ? '+' : '-'; + conv[1] = (xx / 1000) % 10 + '0'; + conv[2] = (xx / 100) % 10 + '0'; + conv[3] = (xx / 10) % 10 + '0'; + conv[4] = '.'; + conv[5] = (xx) % 10 + '0'; + conv[6] = 0; + return conv; +} + +// Convert int to rj string with 123 or -12 format +char *itostr3(const int &x) +{ + int xx = x; + if (xx < 0) { + conv[0] = '-'; + xx = -xx; + } else if (xx >= 100) + conv[0] = (xx / 100) % 10 + '0'; + else + conv[0] = ' '; + if (xx >= 10) + conv[1] = (xx / 10) % 10 + '0'; + else + conv[1] = ' '; + conv[2] = (xx) % 10 + '0'; + conv[3] = 0; + return conv; +} + +// Convert int to lj string with 123 format +char *itostr3left(const int &xx) +{ + if (xx >= 100) + { + conv[0] = (xx / 100) % 10 + '0'; + conv[1] = (xx / 10) % 10 + '0'; + conv[2] = (xx) % 10 + '0'; + conv[3] = 0; + } + else if (xx >= 10) + { + conv[0] = (xx / 10) % 10 + '0'; + conv[1] = (xx) % 10 + '0'; + conv[2] = 0; + } + else + { + conv[0] = (xx) % 10 + '0'; + conv[1] = 0; + } + return conv; +} + +// Convert int to rj string with 1234 format +char *itostr4(const int &xx) { + conv[0] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; + conv[1] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; + conv[2] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; + conv[3] = xx % 10 + '0'; + conv[4] = 0; + return conv; +} + +// Convert float to rj string with 12345 format +char *ftostr5(const float &x) { + long xx = abs(x); + conv[0] = xx >= 10000 ? (xx / 10000) % 10 + '0' : ' '; + conv[1] = xx >= 1000 ? (xx / 1000) % 10 + '0' : ' '; + conv[2] = xx >= 100 ? (xx / 100) % 10 + '0' : ' '; + conv[3] = xx >= 10 ? (xx / 10) % 10 + '0' : ' '; + conv[4] = xx % 10 + '0'; + conv[5] = 0; + return conv; +} + +// Convert float to string with +1234.5 format +char *ftostr51(const float &x) +{ + long xx = x * 10; + conv[0] = (xx >= 0) ? '+' : '-'; + xx = abs(xx); + conv[1] = (xx / 10000) % 10 + '0'; + conv[2] = (xx / 1000) % 10 + '0'; + conv[3] = (xx / 100) % 10 + '0'; + conv[4] = (xx / 10) % 10 + '0'; + conv[5] = '.'; + conv[6] = (xx) % 10 + '0'; + conv[7] = 0; + return conv; +} + +// Convert float to string with +123.45 format +char *ftostr52(const float &x) +{ + long xx = x * 100; + conv[0] = (xx >= 0) ? '+' : '-'; + xx = abs(xx); + conv[1] = (xx / 10000) % 10 + '0'; + conv[2] = (xx / 1000) % 10 + '0'; + conv[3] = (xx / 100) % 10 + '0'; + conv[4] = '.'; + conv[5] = (xx / 10) % 10 + '0'; + conv[6] = (xx) % 10 + '0'; + conv[7] = 0; + return conv; +} + +// Callback for after editing PID i value +// grab the PID i value out of the temp variable; scale it; then update the PID driver +void copy_and_scalePID_i() +{ +#ifdef PIDTEMP + Ki = scalePID_i(raw_Ki); + updatePID(); +#endif +} + +// Callback for after editing PID d value +// grab the PID d value out of the temp variable; scale it; then update the PID driver +void copy_and_scalePID_d() +{ +#ifdef PIDTEMP + Kd = scalePID_d(raw_Kd); + updatePID(); +#endif +} + #endif //ULTRA_LCD \ No newline at end of file diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index cf6d6463..9ab3a253 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -6,6 +6,8 @@ #ifdef ULTRA_LCD void lcd_update(); + // Call with a false parameter to suppress the LCD update from various places like the planner or the temp control. + void lcd_update_enable(bool enable); void lcd_init(); void lcd_setstatus(const char* message); void lcd_setstatuspgm(const char* message); @@ -23,7 +25,6 @@ void lcd_loading_color(); void lcd_force_language_selection(); void lcd_sdcard_stop(); - void lcd_calibration(); bool lcd_detected(void); @@ -36,6 +37,9 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *_error_2); static void lcd_menu_statistics(); + extern bool lcd_calibrate_z_end_stop_manual(); + extern void lcd_diag_show_end_stops(); + #ifdef DOGLCD extern int lcd_contrast; void lcd_setcontrast(uint8_t value); @@ -154,4 +158,16 @@ char *ftostr5(const float &x); char *ftostr51(const float &x); char *ftostr52(const float &x); + +extern void lcd_implementation_clear(); +extern void lcd_printPGM(const char* str); +extern void lcd_print_at_PGM(uint8_t x, uint8_t y, const char* str); +extern void lcd_implementation_print(const char *str); +extern void lcd_implementation_print(int8_t i); +extern void lcd_implementation_print_at(uint8_t x, uint8_t y, int8_t i); +extern void lcd_implementation_print(int i); +extern void lcd_implementation_print_at(uint8_t x, uint8_t y, int i); +extern void lcd_implementation_print(float f); +extern void lcd_implementation_print_at(uint8_t x, uint8_t y, const char *str); + #endif //ULTRALCD_H diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index 0bd35a66..94601e4a 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -567,12 +567,12 @@ static void lcd_implementation_display() lcd.display(); } -static void lcd_implementation_clear() +void lcd_implementation_clear() { lcd.clear(); } /* Arduino < 1.0.0 is missing a function to print PROGMEM strings, so we need to implement our own */ -static void lcd_printPGM(const char* str) +void lcd_printPGM(const char* str) { char c; while((c = pgm_read_byte(str++)) != '\0') @@ -580,6 +580,55 @@ static void lcd_printPGM(const char* str) lcd.write(c); } } + +void lcd_print_at_PGM(uint8_t x, uint8_t y, const char* str) +{ + lcd.setCursor(x, y); + char c; + while((c = pgm_read_byte(str++)) != '\0') + { + lcd.write(c); + } +} + +void lcd_implementation_print(int8_t i) +{ + lcd.print(i); +} + +void lcd_implementation_print_at(uint8_t x, uint8_t y, int8_t i) +{ + lcd.setCursor(x, y); + lcd.print(i); +} + +void lcd_implementation_print(int i) +{ + lcd.print(i); +} + +void lcd_implementation_print_at(uint8_t x, uint8_t y, int i) +{ + lcd.setCursor(x, y); + lcd.print(i); +} + +void lcd_implementation_print(float f) +{ + lcd.print(f); +} + +void lcd_implementation_print(const char *str) +{ + lcd.print(str); +} + +void lcd_implementation_print_at(uint8_t x, uint8_t y, const char *str) +{ + lcd.setCursor(x, y); + lcd.print(str); +} + /* 20x4 |01234567890123456789|