From e55a1cdd9f842e380a370621273b84c507ff2b56 Mon Sep 17 00:00:00 2001 From: 3d-gussner <3d-gussner@users.noreply.github.com> Date: Tue, 11 Jul 2017 23:30:39 +0200 Subject: [PATCH] Roll back to 3.0.12 DENL... ...-250k_baud-FR_SENS_24-PID_BED --- Firmware/Configuration.h | 1463 ++- Firmware/ConfigurationStore.cpp | 884 +- Firmware/Configuration_adv.h | 877 +- Firmware/Marlin.h | 6 +- Firmware/Marlin_main.cpp | 102 +- Firmware/cardreader.h | 213 +- Firmware/language_all.cpp | 8022 ++++++++--------- Firmware/language_all.h | 1336 +-- Firmware/language_cz.h | 624 +- Firmware/language_de.h | 652 +- Firmware/language_en.h | 638 +- Firmware/language_es.h | 612 +- Firmware/language_nl.h | 650 +- Firmware/language_pl.h | 618 +- Firmware/pins.h | 768 +- Firmware/planner.cpp | 2523 +++--- Firmware/planner.h | 425 +- Firmware/stepper.cpp | 2457 +++-- Firmware/stepper.h | 204 +- Firmware/ultralcd.cpp | 4 - .../ultralcd_implementation_hitachi_HD44780.h | 2741 +++--- 21 files changed, 12730 insertions(+), 13089 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 72e14daef..6a930833f 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -1,733 +1,730 @@ -#ifndef CONFIGURATION_H -#define CONFIGURATION_H - -#include "boards.h" -#include "Configuration_prusa.h" - -// Firmware version -#define FW_version "3.0.12" - -#define FW_PRUSA3D_MAGIC "PRUSA3DFW" -#define FW_PRUSA3D_MAGIC_LEN 10 -// The total size of the EEPROM is -// 4096 for the Atmega2560 -#define EEPROM_TOP 4096 -#define EEPROM_SILENT 4095 -#define EEPROM_LANG 4094 -#define EEPROM_BABYSTEP_X 4092 -#define EEPROM_BABYSTEP_Y 4090 -#define EEPROM_BABYSTEP_Z 4088 -#define EEPROM_CALIBRATION_STATUS 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) - -// Offsets of the Z heiths of the calibration points from the first point. -// The offsets are saved as 16bit signed int, scaled to tenths of microns. -#define EEPROM_BED_CALIBRATION_Z_JITTER (EEPROM_BED_CALIBRATION_VEC_Y-2*8) -#define EEPROM_FARM_MODE (EEPROM_BED_CALIBRATION_Z_JITTER-1) -#define EEPROM_FARM_NUMBER (EEPROM_FARM_MODE-3) - -// Correction of the bed leveling, in micrometers. -// Maximum 50 micrometers allowed. -// Bed correction is valid if set to 1. If set to zero or 255, the successive 4 bytes are invalid. -#define EEPROM_BED_CORRECTION_VALID (EEPROM_FARM_NUMBER-1) -#define EEPROM_BED_CORRECTION_LEFT (EEPROM_BED_CORRECTION_VALID-1) -#define EEPROM_BED_CORRECTION_RIGHT (EEPROM_BED_CORRECTION_LEFT-1) -#define EEPROM_BED_CORRECTION_FRONT (EEPROM_BED_CORRECTION_RIGHT-1) -#define EEPROM_BED_CORRECTION_REAR (EEPROM_BED_CORRECTION_FRONT-1) -#define EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY (EEPROM_BED_CORRECTION_REAR-1) -#define EEPROM_PRINT_FLAG (EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY-1) -#define EEPROM_PROBE_TEMP_SHIFT (EEPROM_PRINT_FLAG - 2*5) //5 x int for storing pinda probe temp shift relative to 50 C; unit: motor steps -#define EEPROM_TEMP_CAL_ACTIVE (EEPROM_PROBE_TEMP_SHIFT - 1) -#define EEPROM_BOWDEN_LENGTH (EEPROM_TEMP_CAL_ACTIVE - 2*4) //4 x int for bowden lengths for multimaterial -#define EEPROM_CALIBRATION_STATUS_PINDA (EEPROM_BOWDEN_LENGTH - 1) //0 - not calibrated; 1 - calibrated - -#define EEPROM_FILENAME (EEPROM_CALIBRATION_STATUS_PINDA - 8) //8chars to store filename without extension -#define EEPROM_FILE_POSITION (EEPROM_FILENAME - 4) //32 bit for uint32_t file position - -// Currently running firmware, each digit stored as uint16_t. -// The flavor differentiates a dev, alpha, beta, release candidate or a release version. -#define EEPROM_FIRMWARE_VERSION_END (FW_PRUSA3D_MAGIC_LEN+8) -#define EEPROM_FIRMWARE_VERSION_FLAVOR (FW_PRUSA3D_MAGIC_LEN+6) -#define EEPROM_FIRMWARE_VERSION_REVISION (FW_PRUSA3D_MAGIC_LEN+4) -#define EEPROM_FIRMWARE_VERSION_MINOR (FW_PRUSA3D_MAGIC_LEN+2) -#define EEPROM_FIRMWARE_VERSION_MAJOR FW_PRUSA3D_MAGIC_LEN -// Magic string, indicating that the current or the previous firmware running was the Prusa3D firmware. -#define EEPROM_FIRMWARE_PRUSA_MAGIC 0 - - -// This configuration file contains the basic settings. -// Advanced settings can be found in Configuration_adv.h -// BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration - -// User-specified version info of this build to display in [Pronterface, etc] terminal window during -// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this -// build by the user have been successfully uploaded into firmware. - -//#define STRING_VERSION "1.0.2" - -#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ // build date and time -#define STRING_CONFIG_H_AUTHOR "3D-gussner, Test" // Who made the changes. - -// SERIAL_PORT selects which serial port should be used for communication with the host. -// This allows the connection of wireless adapters (for instance) to non-default port pins. -// Serial port 0 is still used by the Arduino bootloader regardless of this setting. -#define SERIAL_PORT 0 - -// This determines the communication speed of the printer -//#define BAUDRATE 115200 -#define BAUDRATE 250000 - -// This enables the serial port associated to the Bluetooth interface -//#define BTENABLED // Enable BT interface on AT90USB devices - -// The following define selects which electronics board you have. -// Please choose the name from boards.h that matches your setup - - - - - - - -// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) -// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) -// #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" - -// This defines the number of extruders -#define EXTRUDERS 1 - -//// The following define selects which power supply you have. Please choose the one that matches your setup -// 1 = ATX -// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) - -#define POWER_SUPPLY 1 - - - - - -// Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it. -// #define PS_DEFAULT_OFF - - - -// This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted. -//#define TEMP_SENSOR_1_AS_REDUNDANT -#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 - -// Actual temperature must be close to target for this long before M109 returns success -#define TEMP_RESIDENCY_TIME 3 // (seconds) -#define TEMP_HYSTERESIS 5 // (degC) range of +/- temperatures considered "close" to the target one -#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. - - - -// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the -// average current. The value should be an integer and the heat bed will be turned on for 1 interval of -// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. -//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 - -// If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS -//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R -//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R - -// PID settings: -// Comment the following line to disable PID and enable bang-bang. -#define PIDTEMP -#define BANG_MAX 255 // limits current to nozzle while in bang-bang mode; 255=full current -#define PID_MAX BANG_MAX // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current -#ifdef PIDTEMP - //#define PID_DEBUG // Sends debug data to the serial port. - //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX - //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay - #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature - // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. - #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term - #define K1 0.95 //smoothing factor within the PID - #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine - -// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it -// Ultimaker - - -// MakerGear -// #define DEFAULT_Kp 7.0 -// #define DEFAULT_Ki 0.1 -// #define DEFAULT_Kd 12 - -// Mendel Parts V9 on 12V -// #define DEFAULT_Kp 63.0 -// #define DEFAULT_Ki 2.25 -// #define DEFAULT_Kd 440 -#endif // PIDTEMP - - -//this prevents dangerous Extruder moves, i.e. if the temperature is under the limit -//can be software-disabled for whatever purposes by -#define PREVENT_DANGEROUS_EXTRUDE -//if PREVENT_DANGEROUS_EXTRUDE is on, you can still disable (uncomment) very long bits of extrusion separately. -#define PREVENT_LENGTHY_EXTRUDE - - -#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH) //prevent extrusion of very large distances. - -/*================== Thermal Runaway Protection ============================== -This is a feature to protect your printer from burn up in flames if it has -a thermistor coming off place (this happened to a friend of mine recently and -motivated me writing this feature). - -The issue: If a thermistor come off, it will read a lower temperature than actual. -The system will turn the heater on forever, burning up the filament and anything -else around. - -After the temperature reaches the target for the first time, this feature will -start measuring for how long the current temperature stays below the target -minus _HYSTERESIS (set_temperature - THERMAL_RUNAWAY_PROTECTION_HYSTERESIS). - -If it stays longer than _PERIOD, it means the thermistor temperature -cannot catch up with the target, so something *may be* wrong. Then, to be on the -safe side, the system will he halt. - -Bear in mind the count down will just start AFTER the first time the -thermistor temperature is over the target, so you will have no problem if -your extruder heater takes 2 minutes to hit the target on heating. - -*/ -// If you want to enable this feature for all your extruder heaters, -// uncomment the 2 defines below: - -// Parameters for all extruder heaters -//#define THERMAL_RUNAWAY_PROTECTION_PERIOD 40 //in seconds -//#define THERMAL_RUNAWAY_PROTECTION_HYSTERESIS 4 // in degree Celsius - -// If you want to enable this feature for your bed heater, -// uncomment the 2 defines below: - -// Parameters for the bed heater -//#define THERMAL_RUNAWAY_PROTECTION_BED_PERIOD 20 //in seconds -//#define THERMAL_RUNAWAY_PROTECTION_BED_HYSTERESIS 2 // in degree Celsius -//=========================================================================== - - -//=========================================================================== -//=============================Mechanical Settings=========================== -//=========================================================================== - -// Uncomment the following line to enable CoreXY kinematics -// #define COREXY - -// coarse Endstop Settings -#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors - -#ifndef ENDSTOPPULLUPS - // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined - // #define ENDSTOPPULLUP_XMAX - // #define ENDSTOPPULLUP_YMAX - // #define ENDSTOPPULLUP_ZMAX - // #define ENDSTOPPULLUP_XMIN - // #define ENDSTOPPULLUP_YMIN - // #define ENDSTOPPULLUP_ZMIN -#endif - -#ifdef ENDSTOPPULLUPS - #define ENDSTOPPULLUP_XMAX - #define ENDSTOPPULLUP_YMAX - #define ENDSTOPPULLUP_ZMAX - #define ENDSTOPPULLUP_XMIN - #define ENDSTOPPULLUP_YMIN - #define ENDSTOPPULLUP_ZMIN -#endif - -// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins. - -const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. -//#define DISABLE_MAX_ENDSTOPS -//#define DISABLE_MIN_ENDSTOPS - -// Disable max endstops for compatibility with endstop checking routine -#if defined(COREXY) && !defined(DISABLE_MAX_ENDSTOPS) - #define DISABLE_MAX_ENDSTOPS -#endif - -// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 -#define X_ENABLE_ON 0 -#define Y_ENABLE_ON 0 -#define Z_ENABLE_ON 0 -#define E_ENABLE_ON 0 // For all extruders - -// Disables axis when it's not being used. -#define DISABLE_X false -#define DISABLE_Y false -#define DISABLE_Z false -#define DISABLE_E false // For all extruders -#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled - -#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false -#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true -#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false -#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false - -// ENDSTOP SETTINGS: -// Sets direction of endstops when homing; 1=MAX, -1=MIN -#define X_HOME_DIR -1 -#define Y_HOME_DIR -1 -#define Z_HOME_DIR -1 - -#define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS. -#define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. - - - -#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) -#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) -#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) - -#define Z_HEIGHT_HIDE_LIVE_ADJUST_MENU 2.0f - -//============================= Bed Auto Leveling =========================== - -//#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line) -#define Z_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. - -#ifdef ENABLE_AUTO_BED_LEVELING - -// There are 2 different ways to pick the X and Y locations to probe: - -// - "grid" mode -// Probe every point in a rectangular grid -// You must specify the rectangle, and the density of sample points -// This mode is preferred because there are more measurements. -// It used to be called ACCURATE_BED_LEVELING but "grid" is more descriptive - -// - "3-point" mode -// Probe 3 arbitrary points on the bed (that aren't colinear) -// You must specify the X & Y coordinates of all 3 points - - #define AUTO_BED_LEVELING_GRID - // with AUTO_BED_LEVELING_GRID, the bed is sampled in a - // AUTO_BED_LEVELING_GRID_POINTSxAUTO_BED_LEVELING_GRID_POINTS grid - // and least squares solution is calculated - // Note: this feature occupies 10'206 byte - #ifdef AUTO_BED_LEVELING_GRID - - // set the rectangle in which to probe - #define LEFT_PROBE_BED_POSITION 15 - #define RIGHT_PROBE_BED_POSITION 170 - #define BACK_PROBE_BED_POSITION 180 - #define FRONT_PROBE_BED_POSITION 20 - - // set the number of grid points per dimension - // I wouldn't see a reason to go above 3 (=9 probing points on the bed) - #define AUTO_BED_LEVELING_GRID_POINTS 2 - - - #else // not AUTO_BED_LEVELING_GRID - // with no grid, just probe 3 arbitrary points. A simple cross-product - // is used to esimate the plane of the print bed - - #define ABL_PROBE_PT_1_X 15 - #define ABL_PROBE_PT_1_Y 180 - #define ABL_PROBE_PT_2_X 15 - #define ABL_PROBE_PT_2_Y 20 - #define ABL_PROBE_PT_3_X 170 - #define ABL_PROBE_PT_3_Y 20 - - #endif // AUTO_BED_LEVELING_GRID - - - // these are the offsets to the probe relative to the extruder tip (Hotend - Probe) - // X and Y offsets must be integers - #define X_PROBE_OFFSET_FROM_EXTRUDER -25 - #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 - #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 - - #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z before homing (G28) for Probe Clearance. - // Be sure you have this distance over your Z_MAX_POS in case - - #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min - - #define Z_RAISE_BEFORE_PROBING 15 //How much the extruder will be raised before traveling to the first probing point. - #define Z_RAISE_BETWEEN_PROBINGS 5 //How much the extruder will be raised when traveling from between next probing points - - //#define Z_PROBE_SLED // turn on if you have a z-probe mounted on a sled like those designed by Charles Bell - //#define SLED_DOCKING_OFFSET 5 // the extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. - - //If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk - //The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it. - // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile. - -// #define PROBE_SERVO_DEACTIVATION_DELAY 300 - - -//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing, -//it is highly recommended you let this Z_SAFE_HOMING enabled! - - //#define Z_SAFE_HOMING // This feature is meant to avoid Z homing with probe outside the bed area. - // When defined, it will: - // - Allow Z homing only after X and Y homing AND stepper drivers still enabled - // - If stepper drivers timeout, it will need X and Y homing again before Z homing - // - Position the probe in a defined XY point before Z Homing when homing all axis (G28) - // - Block Z homing only when the probe is outside bed area. - - #ifdef Z_SAFE_HOMING - - #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2) // X point for Z homing when homing all axis (G28) - #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2) // Y point for Z homing when homing all axis (G28) - - #endif - - #ifdef AUTO_BED_LEVELING_GRID // Check if Probe_Offset * Grid Points is greater than Probing Range - #if X_PROBE_OFFSET_FROM_EXTRUDER < 0 - #if (-(X_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION)) - #error "The X axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" - #endif - #else - #if ((X_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION)) - #error "The X axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" - #endif - #endif - #if Y_PROBE_OFFSET_FROM_EXTRUDER < 0 - #if (-(Y_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION)) - #error "The Y axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" - #endif - #else - #if ((Y_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION)) - #error "The Y axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" - #endif - #endif - - - #endif - -#endif // ENABLE_AUTO_BED_LEVELING - - -// The position of the homing switches -//#define MANUAL_HOME_POSITIONS // If defined, MANUAL_*_HOME_POS below will be used -//#define BED_CENTER_AT_0_0 // If defined, the center of the bed is at (X=0, Y=0) - -//Manual homing switch locations: -// For deltabots this means top and center of the Cartesian print volume. - - -// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). -// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). -// For the other hotends it is their distance from the extruder 0 hotend. -// #define EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis -// #define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis - -// The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) -#define DEFAULT_XJERK 10.0 // (mm/sec) -#define DEFAULT_YJERK 10.0 // (mm/sec) -#define DEFAULT_ZJERK 0.2 // (mm/sec) -#define DEFAULT_EJERK 2.5 // (mm/sec) - -//=========================================================================== -//=============================Additional Features=========================== -//=========================================================================== - -// Custom M code points -#define CUSTOM_M_CODES -#ifdef CUSTOM_M_CODES - #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 - #define Z_PROBE_OFFSET_RANGE_MIN -15 - #define Z_PROBE_OFFSET_RANGE_MAX -5 -#endif - - -// EEPROM -// The microcontroller can store settings in the EEPROM, e.g. max velocity... -// M500 - stores parameters in EEPROM -// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). -// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. -//define this to enable EEPROM support -//#define EEPROM_SETTINGS -//to disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: -// please keep turned on if you can. -//#define EEPROM_CHITCHAT - - - -//LCD and SD support -#define ULTRA_LCD //general LCD support, also 16x2 -//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) -#define SDSUPPORT // Enable SD Card Support in Hardware Console -//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) -#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication -#define ENCODER_PULSES_PER_STEP 4 // Increase if you have a high resolution encoder -#define ENCODER_STEPS_PER_MENU_ITEM 1 // Set according to ENCODER_PULSES_PER_STEP or your liking -//#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. -//#define ULTIPANEL //the UltiPanel as on Thingiverse -//#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click -//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click - -// The MaKr3d Makr-Panel with graphic controller and SD support -// http://reprap.org/wiki/MaKr3d_MaKrPanel -//#define MAKRPANEL - -// The RepRapDiscount Smart Controller (white PCB) -// http://reprap.org/wiki/RepRapDiscount_Smart_Controller -#define REPRAP_DISCOUNT_SMART_CONTROLLER - -// The GADGETS3D G3D LCD/SD Controller (blue PCB) -// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel -//#define G3D_PANEL - -// The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) -// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller -// -// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib -//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER - -// The RepRapWorld REPRAPWORLD_KEYPAD v1.1 -// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 -//#define REPRAPWORLD_KEYPAD -//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // how much should be moved when a key is pressed, eg 10.0 means 10mm per click - -// The Elefu RA Board Control Panel -// http://www.elefu.com/index.php?route=product/product&product_id=53 -// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C -//#define RA_CONTROL_PANEL - -//automatic expansion -#if defined (MAKRPANEL) - #define DOGLCD - #define SDSUPPORT - #define ULTIPANEL - #define NEWPANEL - #define DEFAULT_LCD_CONTRAST 17 -#endif - -#if defined (REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define DOGLCD - #define U8GLIB_ST7920 - #define REPRAP_DISCOUNT_SMART_CONTROLLER -#endif - -#if defined(ULTIMAKERCONTROLLER) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER) || defined(G3D_PANEL) - #define ULTIPANEL - #define NEWPANEL -#endif - -#if defined(REPRAPWORLD_KEYPAD) - #define NEWPANEL - #define ULTIPANEL -#endif -#if defined(RA_CONTROL_PANEL) - #define ULTIPANEL - #define NEWPANEL - #define LCD_I2C_TYPE_PCA8574 - #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander -#endif - -//I2C PANELS - -//#define LCD_I2C_SAINSMART_YWROBOT -#ifdef LCD_I2C_SAINSMART_YWROBOT - // This uses the LiquidCrystal_I2C library ( https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home ) - // Make sure it is placed in the Arduino libraries directory. - #define LCD_I2C_TYPE_PCF8575 - #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander - #define NEWPANEL - #define ULTIPANEL -#endif - -// PANELOLU2 LCD with status LEDs, separate encoder and click inputs -//#define LCD_I2C_PANELOLU2 -#ifdef LCD_I2C_PANELOLU2 - // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) - // Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. - // (v1.2.3 no longer requires you to define PANELOLU in the LiquidTWI2.h library header file) - // Note: The PANELOLU2 encoder click input can either be directly connected to a pin - // (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). - #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander - #define LCD_USE_I2C_BUZZER //comment out to disable buzzer on LCD - #define NEWPANEL - #define ULTIPANEL - - #ifndef ENCODER_PULSES_PER_STEP - #define ENCODER_PULSES_PER_STEP 4 - #endif - - #ifndef ENCODER_STEPS_PER_MENU_ITEM - #define ENCODER_STEPS_PER_MENU_ITEM 2 - #endif - - - #ifdef LCD_USE_I2C_BUZZER - #define LCD_FEEDBACK_FREQUENCY_HZ 1000 - #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 - #endif - -#endif - -// Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs -//#define LCD_I2C_VIKI -#ifdef LCD_I2C_VIKI - // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) - // Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. - // Note: The pause/stop/resume LCD button pin should be connected to the Arduino - // BTN_ENC pin (or set BTN_ENC to -1 if not used) - #define LCD_I2C_TYPE_MCP23017 - #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander - #define LCD_USE_I2C_BUZZER //comment out to disable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) - #define NEWPANEL - #define ULTIPANEL -#endif - -// Shift register panels -// --------------------- -// 2 wire Non-latching LCD SR from: -// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection - -//#define SAV_3DLCD -#ifdef SAV_3DLCD - #define SR_LCD_2W_NL // Non latching 2 wire shiftregister - #define NEWPANEL - #define ULTIPANEL -#endif - - -#ifdef ULTIPANEL -// #define NEWPANEL //enable this if you have a click-encoder panel - #define SDSUPPORT - #define ULTRA_LCD - #ifdef DOGLCD // Change number of lines to match the DOG graphic display - #define LCD_WIDTH 20 - #define LCD_HEIGHT 5 - #else - #define LCD_WIDTH 20 - #define LCD_HEIGHT 4 - #endif -#else //no panel but just LCD - #ifdef ULTRA_LCD - #ifdef DOGLCD // Change number of lines to match the 128x64 graphics display - #define LCD_WIDTH 20 - #define LCD_HEIGHT 5 - #else - #define LCD_WIDTH 16 - #define LCD_HEIGHT 2 - #endif - #endif -#endif - -// default LCD contrast for dogm-like LCD displays -#ifdef DOGLCD -# ifndef DEFAULT_LCD_CONTRAST -# define DEFAULT_LCD_CONTRAST 32 -# endif -#endif - -// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino -//#define FAST_PWM_FAN - -// Temperature status LEDs that display the hotend and bet temperature. -// If all hotends and bed temperature and temperature setpoint are < 54C then the BLUE led is on. -// Otherwise the RED led is on. There is 1C hysteresis. -//#define TEMP_STAT_LEDS - -// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency -// which is not ass annoying as with the hardware PWM. On the other hand, if this frequency -// is too low, you should also increment SOFT_PWM_SCALE. -//#define FAN_SOFT_PWM - -// Incrementing this by 1 will double the software PWM frequency, -// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. -// However, control resolution will be halved for each increment; -// at zero value, there are 128 effective control positions. -#define SOFT_PWM_SCALE 0 - -// M240 Triggers a camera by emulating a Canon RC-1 Remote -// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ -// #define PHOTOGRAPH_PIN 23 - -// SF send wrong arc g-codes when using Arc Point as fillet procedure -//#define SF_ARC_FIX - -//define BlinkM/CyzRgb Support -//#define BLINKM - -/*********************************************************************\ -* R/C SERVO support -* Sponsored by TrinityLabs, Reworked by codexmas -**********************************************************************/ - -// Number of servos -// -// If you select a configuration below, this will receive a default value and does not need to be set manually -// set it manually if you have more servos than extruders and wish to manually control some -// leaving it undefined or defining as 0 will disable the servo subsystem -// If unsure, leave commented / disabled -// -//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command - -/**********************************************************************\ - * Support for a filament diameter sensor - * Also allows adjustment of diameter at print time (vs at slicing) - * Single extruder only at this point (extruder 0) - * - * Motherboards - * 34 - RAMPS1.4 - uses Analog input 5 on the AUX2 connector - * 81 - Printrboard - Uses Analog input 2 on the Exp1 connector (version B,C,D,E) - * 301 - Rambo - uses Analog input 3 - * Note may require analog pins to be defined for different motherboards - **********************************************************************/ -// Uncomment below to enable -//#define FILAMENT_SENSOR - -#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) -#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel - -#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation -#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm -#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm -#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) - -//defines used in the code -#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially - -//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. -//#define FILAMENT_LCD_DISPLAY - - -// Calibration status of the machine, to be stored into the EEPROM, -// (unsigned char*)EEPROM_CALIBRATION_STATUS -enum CalibrationStatus -{ - // Freshly assembled, needs to peform a self-test and the XYZ calibration. - CALIBRATION_STATUS_ASSEMBLED = 255, - - // For the wizard: self test has been performed, now the XYZ calibration is needed. - // CALIBRATION_STATUS_XYZ_CALIBRATION = 250, - - // For the wizard: factory assembled, needs to run Z calibration. - CALIBRATION_STATUS_Z_CALIBRATION = 240, - - // The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode. - CALIBRATION_STATUS_LIVE_ADJUST = 230, - - // Calibrated, ready to print. - CALIBRATION_STATUS_CALIBRATED = 1, - - // Legacy: resetted by issuing a G86 G-code. - // This value can only be expected after an upgrade from the initial MK2 firmware releases. - // Currently the G86 sets the calibration status to - CALIBRATION_STATUS_UNKNOWN = 0, -}; - -#include "Configuration_adv.h" -#include "thermistortables.h" - -#endif //__CONFIGURATION_H +#ifndef CONFIGURATION_H +#define CONFIGURATION_H + +#include "boards.h" +#include "Configuration_prusa.h" + +// Firmware version +#define FW_version "3.0.12" + +#define FW_PRUSA3D_MAGIC "PRUSA3DFW" +#define FW_PRUSA3D_MAGIC_LEN 10 +// The total size of the EEPROM is +// 4096 for the Atmega2560 +#define EEPROM_TOP 4096 +#define EEPROM_SILENT 4095 +#define EEPROM_LANG 4094 +#define EEPROM_BABYSTEP_X 4092 +#define EEPROM_BABYSTEP_Y 4090 +#define EEPROM_BABYSTEP_Z 4088 +#define EEPROM_CALIBRATION_STATUS 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) + +// Offsets of the Z heiths of the calibration points from the first point. +// The offsets are saved as 16bit signed int, scaled to tenths of microns. +#define EEPROM_BED_CALIBRATION_Z_JITTER (EEPROM_BED_CALIBRATION_VEC_Y-2*8) +#define EEPROM_FARM_MODE (EEPROM_BED_CALIBRATION_Z_JITTER-1) +#define EEPROM_FARM_NUMBER (EEPROM_FARM_MODE-3) + +// Correction of the bed leveling, in micrometers. +// Maximum 50 micrometers allowed. +// Bed correction is valid if set to 1. If set to zero or 255, the successive 4 bytes are invalid. +#define EEPROM_BED_CORRECTION_VALID (EEPROM_FARM_NUMBER-1) +#define EEPROM_BED_CORRECTION_LEFT (EEPROM_BED_CORRECTION_VALID-1) +#define EEPROM_BED_CORRECTION_RIGHT (EEPROM_BED_CORRECTION_LEFT-1) +#define EEPROM_BED_CORRECTION_FRONT (EEPROM_BED_CORRECTION_RIGHT-1) +#define EEPROM_BED_CORRECTION_REAR (EEPROM_BED_CORRECTION_FRONT-1) +#define EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY (EEPROM_BED_CORRECTION_REAR-1) +#define EEPROM_PRINT_FLAG (EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY-1) +#define EEPROM_PROBE_TEMP_SHIFT (EEPROM_PRINT_FLAG - 2*5) //5 x int for storing pinda probe temp shift relative to 50 C; unit: motor steps +#define EEPROM_TEMP_CAL_ACTIVE (EEPROM_PROBE_TEMP_SHIFT - 1) +#define EEPROM_BOWDEN_LENGTH (EEPROM_TEMP_CAL_ACTIVE - 2*4) //4 x int for bowden lengths for multimaterial +#define EEPROM_CALIBRATION_STATUS_PINDA (EEPROM_BOWDEN_LENGTH - 1) //0 - not calibrated; 1 - calibrated + +// Currently running firmware, each digit stored as uint16_t. +// The flavor differentiates a dev, alpha, beta, release candidate or a release version. +#define EEPROM_FIRMWARE_VERSION_END (FW_PRUSA3D_MAGIC_LEN+8) +#define EEPROM_FIRMWARE_VERSION_FLAVOR (FW_PRUSA3D_MAGIC_LEN+6) +#define EEPROM_FIRMWARE_VERSION_REVISION (FW_PRUSA3D_MAGIC_LEN+4) +#define EEPROM_FIRMWARE_VERSION_MINOR (FW_PRUSA3D_MAGIC_LEN+2) +#define EEPROM_FIRMWARE_VERSION_MAJOR FW_PRUSA3D_MAGIC_LEN +// Magic string, indicating that the current or the previous firmware running was the Prusa3D firmware. +#define EEPROM_FIRMWARE_PRUSA_MAGIC 0 + + +// This configuration file contains the basic settings. +// Advanced settings can be found in Configuration_adv.h +// BASIC SETTINGS: select your board type, temperature sensor type, axis scaling, and endstop configuration + +// User-specified version info of this build to display in [Pronterface, etc] terminal window during +// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this +// build by the user have been successfully uploaded into firmware. + +//#define STRING_VERSION "1.0.2" + +#define STRING_VERSION_CONFIG_H __DATE__ " " __TIME__ // build date and time +#define STRING_CONFIG_H_AUTHOR "3D-gussner, Test" // Who made the changes. + +// SERIAL_PORT selects which serial port should be used for communication with the host. +// This allows the connection of wireless adapters (for instance) to non-default port pins. +// Serial port 0 is still used by the Arduino bootloader regardless of this setting. +#define SERIAL_PORT 0 + +// This determines the communication speed of the printer +//#define BAUDRATE 115200 +#define BAUDRATE 250000 + +// This enables the serial port associated to the Bluetooth interface +//#define BTENABLED // Enable BT interface on AT90USB devices + +// The following define selects which electronics board you have. +// Please choose the name from boards.h that matches your setup + + + + + + + +// Define this to set a unique identifier for this printer, (Used by some programs to differentiate between machines) +// You can use an online service to generate a random UUID. (eg http://www.uuidgenerator.net/version4) +// #define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// This defines the number of extruders +#define EXTRUDERS 1 + +//// The following define selects which power supply you have. Please choose the one that matches your setup +// 1 = ATX +// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC) + +#define POWER_SUPPLY 1 + + + + + +// Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it. +// #define PS_DEFAULT_OFF + + + +// This makes temp sensor 1 a redundant sensor for sensor 0. If the temperatures difference between these sensors is to high the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +// Actual temperature must be close to target for this long before M109 returns success +#define TEMP_RESIDENCY_TIME 3 // (seconds) +#define TEMP_HYSTERESIS 5 // (degC) range of +/- temperatures considered "close" to the target one +#define TEMP_WINDOW 1 // (degC) Window around target to start the residency timer x degC early. + + + +// If your bed has low resistance e.g. .6 ohm and throws the fuse you can duty cycle it to reduce the +// average current. The value should be an integer and the heat bed will be turned on for 1 interval of +// HEATER_BED_DUTY_CYCLE_DIVIDER intervals. +//#define HEATER_BED_DUTY_CYCLE_DIVIDER 4 + +// If you want the M105 heater power reported in watts, define the BED_WATTS, and (shared for all extruders) EXTRUDER_WATTS +//#define EXTRUDER_WATTS (12.0*12.0/6.7) // P=I^2/R +//#define BED_WATTS (12.0*12.0/1.1) // P=I^2/R + +// PID settings: +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#ifdef PIDTEMP + //#define PID_DEBUG // Sends debug data to the serial port. + //#define PID_OPENLOOP 1 // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more then PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. + #define PID_INTEGRAL_DRIVE_MAX PID_MAX //limit for the integral term + #define K1 0.95 //smoothing factor within the PID + #define PID_dT ((OVERSAMPLENR * 10.0)/(F_CPU / 64.0 / 256.0)) //sampling period of the temperature routine + +// If you are using a pre-configured hotend then you can use one of the value sets by uncommenting it +// Ultimaker + + +// MakerGear +// #define DEFAULT_Kp 7.0 +// #define DEFAULT_Ki 0.1 +// #define DEFAULT_Kd 12 + +// Mendel Parts V9 on 12V +// #define DEFAULT_Kp 63.0 +// #define DEFAULT_Ki 2.25 +// #define DEFAULT_Kd 440 +#endif // PIDTEMP + + +//this prevents dangerous Extruder moves, i.e. if the temperature is under the limit +//can be software-disabled for whatever purposes by +#define PREVENT_DANGEROUS_EXTRUDE +//if PREVENT_DANGEROUS_EXTRUDE is on, you can still disable (uncomment) very long bits of extrusion separately. +#define PREVENT_LENGTHY_EXTRUDE + + +#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH) //prevent extrusion of very large distances. + +/*================== Thermal Runaway Protection ============================== +This is a feature to protect your printer from burn up in flames if it has +a thermistor coming off place (this happened to a friend of mine recently and +motivated me writing this feature). + +The issue: If a thermistor come off, it will read a lower temperature than actual. +The system will turn the heater on forever, burning up the filament and anything +else around. + +After the temperature reaches the target for the first time, this feature will +start measuring for how long the current temperature stays below the target +minus _HYSTERESIS (set_temperature - THERMAL_RUNAWAY_PROTECTION_HYSTERESIS). + +If it stays longer than _PERIOD, it means the thermistor temperature +cannot catch up with the target, so something *may be* wrong. Then, to be on the +safe side, the system will he halt. + +Bear in mind the count down will just start AFTER the first time the +thermistor temperature is over the target, so you will have no problem if +your extruder heater takes 2 minutes to hit the target on heating. + +*/ +// If you want to enable this feature for all your extruder heaters, +// uncomment the 2 defines below: + +// Parameters for all extruder heaters +//#define THERMAL_RUNAWAY_PROTECTION_PERIOD 40 //in seconds +//#define THERMAL_RUNAWAY_PROTECTION_HYSTERESIS 4 // in degree Celsius + +// If you want to enable this feature for your bed heater, +// uncomment the 2 defines below: + +// Parameters for the bed heater +//#define THERMAL_RUNAWAY_PROTECTION_BED_PERIOD 20 //in seconds +//#define THERMAL_RUNAWAY_PROTECTION_BED_HYSTERESIS 2 // in degree Celsius +//=========================================================================== + + +//=========================================================================== +//=============================Mechanical Settings=========================== +//=========================================================================== + +// Uncomment the following line to enable CoreXY kinematics +// #define COREXY + +// coarse Endstop Settings +#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors + +#ifndef ENDSTOPPULLUPS + // fine endstop settings: Individual pullups. will be ignored if ENDSTOPPULLUPS is defined + // #define ENDSTOPPULLUP_XMAX + // #define ENDSTOPPULLUP_YMAX + // #define ENDSTOPPULLUP_ZMAX + // #define ENDSTOPPULLUP_XMIN + // #define ENDSTOPPULLUP_YMIN + // #define ENDSTOPPULLUP_ZMIN +#endif + +#ifdef ENDSTOPPULLUPS + #define ENDSTOPPULLUP_XMAX + #define ENDSTOPPULLUP_YMAX + #define ENDSTOPPULLUP_ZMAX + #define ENDSTOPPULLUP_XMIN + #define ENDSTOPPULLUP_YMIN + #define ENDSTOPPULLUP_ZMIN +#endif + +// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins. + +const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop. +//#define DISABLE_MAX_ENDSTOPS +//#define DISABLE_MIN_ENDSTOPS + +// Disable max endstops for compatibility with endstop checking routine +#if defined(COREXY) && !defined(DISABLE_MAX_ENDSTOPS) + #define DISABLE_MAX_ENDSTOPS +#endif + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disables axis when it's not being used. +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false +#define DISABLE_E false // For all extruders +#define DISABLE_INACTIVE_EXTRUDER true //disable only inactive extruders and keep active extruder enabled + +#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true +#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false +#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true +#define INVERT_E0_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false +#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false + +// ENDSTOP SETTINGS: +// Sets direction of endstops when homing; 1=MAX, -1=MIN +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +#define min_software_endstops true // If true, axis won't move to coordinates less than HOME_POS. +#define max_software_endstops true // If true, axis won't move to coordinates greater than the defined lengths below. + + + +#define X_MAX_LENGTH (X_MAX_POS - X_MIN_POS) +#define Y_MAX_LENGTH (Y_MAX_POS - Y_MIN_POS) +#define Z_MAX_LENGTH (Z_MAX_POS - Z_MIN_POS) + +#define Z_HEIGHT_HIDE_LIVE_ADJUST_MENU 2.0f + +//============================= Bed Auto Leveling =========================== + +//#define ENABLE_AUTO_BED_LEVELING // Delete the comment to enable (remove // at the start of the line) +#define Z_PROBE_REPEATABILITY_TEST // If not commented out, Z-Probe Repeatability test will be included if Auto Bed Leveling is Enabled. + +#ifdef ENABLE_AUTO_BED_LEVELING + +// There are 2 different ways to pick the X and Y locations to probe: + +// - "grid" mode +// Probe every point in a rectangular grid +// You must specify the rectangle, and the density of sample points +// This mode is preferred because there are more measurements. +// It used to be called ACCURATE_BED_LEVELING but "grid" is more descriptive + +// - "3-point" mode +// Probe 3 arbitrary points on the bed (that aren't colinear) +// You must specify the X & Y coordinates of all 3 points + + #define AUTO_BED_LEVELING_GRID + // with AUTO_BED_LEVELING_GRID, the bed is sampled in a + // AUTO_BED_LEVELING_GRID_POINTSxAUTO_BED_LEVELING_GRID_POINTS grid + // and least squares solution is calculated + // Note: this feature occupies 10'206 byte + #ifdef AUTO_BED_LEVELING_GRID + + // set the rectangle in which to probe + #define LEFT_PROBE_BED_POSITION 15 + #define RIGHT_PROBE_BED_POSITION 170 + #define BACK_PROBE_BED_POSITION 180 + #define FRONT_PROBE_BED_POSITION 20 + + // set the number of grid points per dimension + // I wouldn't see a reason to go above 3 (=9 probing points on the bed) + #define AUTO_BED_LEVELING_GRID_POINTS 2 + + + #else // not AUTO_BED_LEVELING_GRID + // with no grid, just probe 3 arbitrary points. A simple cross-product + // is used to esimate the plane of the print bed + + #define ABL_PROBE_PT_1_X 15 + #define ABL_PROBE_PT_1_Y 180 + #define ABL_PROBE_PT_2_X 15 + #define ABL_PROBE_PT_2_Y 20 + #define ABL_PROBE_PT_3_X 170 + #define ABL_PROBE_PT_3_Y 20 + + #endif // AUTO_BED_LEVELING_GRID + + + // these are the offsets to the probe relative to the extruder tip (Hotend - Probe) + // X and Y offsets must be integers + #define X_PROBE_OFFSET_FROM_EXTRUDER -25 + #define Y_PROBE_OFFSET_FROM_EXTRUDER -29 + #define Z_PROBE_OFFSET_FROM_EXTRUDER -12.35 + + #define Z_RAISE_BEFORE_HOMING 4 // (in mm) Raise Z before homing (G28) for Probe Clearance. + // Be sure you have this distance over your Z_MAX_POS in case + + #define XY_TRAVEL_SPEED 8000 // X and Y axis travel speed between probes, in mm/min + + #define Z_RAISE_BEFORE_PROBING 15 //How much the extruder will be raised before traveling to the first probing point. + #define Z_RAISE_BETWEEN_PROBINGS 5 //How much the extruder will be raised when traveling from between next probing points + + //#define Z_PROBE_SLED // turn on if you have a z-probe mounted on a sled like those designed by Charles Bell + //#define SLED_DOCKING_OFFSET 5 // the extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + + //If defined, the Probe servo will be turned on only during movement and then turned off to avoid jerk + //The value is the delay to turn the servo off after powered on - depends on the servo speed; 300ms is good value, but you can try lower it. + // You MUST HAVE the SERVO_ENDSTOPS defined to use here a value higher than zero otherwise your code will not compile. + +// #define PROBE_SERVO_DEACTIVATION_DELAY 300 + + +//If you have enabled the Bed Auto Leveling and are using the same Z Probe for Z Homing, +//it is highly recommended you let this Z_SAFE_HOMING enabled! + + //#define Z_SAFE_HOMING // This feature is meant to avoid Z homing with probe outside the bed area. + // When defined, it will: + // - Allow Z homing only after X and Y homing AND stepper drivers still enabled + // - If stepper drivers timeout, it will need X and Y homing again before Z homing + // - Position the probe in a defined XY point before Z Homing when homing all axis (G28) + // - Block Z homing only when the probe is outside bed area. + + #ifdef Z_SAFE_HOMING + + #define Z_SAFE_HOMING_X_POINT (X_MAX_LENGTH/2) // X point for Z homing when homing all axis (G28) + #define Z_SAFE_HOMING_Y_POINT (Y_MAX_LENGTH/2) // Y point for Z homing when homing all axis (G28) + + #endif + + #ifdef AUTO_BED_LEVELING_GRID // Check if Probe_Offset * Grid Points is greater than Probing Range + #if X_PROBE_OFFSET_FROM_EXTRUDER < 0 + #if (-(X_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION)) + #error "The X axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" + #endif + #else + #if ((X_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION)) + #error "The X axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" + #endif + #endif + #if Y_PROBE_OFFSET_FROM_EXTRUDER < 0 + #if (-(Y_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION)) + #error "The Y axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" + #endif + #else + #if ((Y_PROBE_OFFSET_FROM_EXTRUDER * AUTO_BED_LEVELING_GRID_POINTS) >= (BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION)) + #error "The Y axis probing range is not enough to fit all the points defined in AUTO_BED_LEVELING_GRID_POINTS" + #endif + #endif + + + #endif + +#endif // ENABLE_AUTO_BED_LEVELING + + +// The position of the homing switches +//#define MANUAL_HOME_POSITIONS // If defined, MANUAL_*_HOME_POS below will be used +//#define BED_CENTER_AT_0_0 // If defined, the center of the bed is at (X=0, Y=0) + +//Manual homing switch locations: +// For deltabots this means top and center of the Cartesian print volume. + + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +// #define EXTRUDER_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis +// #define EXTRUDER_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis + +// The speed change that does not require acceleration (i.e. the software might assume it can be done instantaneously) +#define DEFAULT_XJERK 10.0 // (mm/sec) +#define DEFAULT_YJERK 10.0 // (mm/sec) +#define DEFAULT_ZJERK 0.2 // (mm/sec) +#define DEFAULT_EJERK 2.5 // (mm/sec) + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// Custom M code points +#define CUSTOM_M_CODES +#ifdef CUSTOM_M_CODES + #define CUSTOM_M_CODE_SET_Z_PROBE_OFFSET 851 + #define Z_PROBE_OFFSET_RANGE_MIN -15 + #define Z_PROBE_OFFSET_RANGE_MAX -5 +#endif + + +// EEPROM +// The microcontroller can store settings in the EEPROM, e.g. max velocity... +// M500 - stores parameters in EEPROM +// M501 - reads parameters from EEPROM (if you need reset them after you changed them temporarily). +// M502 - reverts to the default "factory settings". You still need to store them in EEPROM afterwards if you want to. +//define this to enable EEPROM support +//#define EEPROM_SETTINGS +//to disable EEPROM Serial responses and decrease program space by ~1700 byte: comment this out: +// please keep turned on if you can. +//#define EEPROM_CHITCHAT + + + +//LCD and SD support +#define ULTRA_LCD //general LCD support, also 16x2 +//#define DOGLCD // Support for SPI LCD 128x64 (Controller ST7565R graphic Display Family) +#define SDSUPPORT // Enable SD Card Support in Hardware Console +//#define SDSLOW // Use slower SD transfer mode (not normally needed - uncomment if you're getting volume init error) +#define SD_CHECK_AND_RETRY // Use CRC checks and retries on the SD communication +#define ENCODER_PULSES_PER_STEP 4 // Increase if you have a high resolution encoder +#define ENCODER_STEPS_PER_MENU_ITEM 1 // Set according to ENCODER_PULSES_PER_STEP or your liking +//#define ULTIMAKERCONTROLLER //as available from the Ultimaker online store. +//#define ULTIPANEL //the UltiPanel as on Thingiverse +//#define LCD_FEEDBACK_FREQUENCY_HZ 1000 // this is the tone frequency the buzzer plays when on UI feedback. ie Screen Click +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 // the duration the buzzer plays the UI feedback sound. ie Screen Click + +// The MaKr3d Makr-Panel with graphic controller and SD support +// http://reprap.org/wiki/MaKr3d_MaKrPanel +//#define MAKRPANEL + +// The RepRapDiscount Smart Controller (white PCB) +// http://reprap.org/wiki/RepRapDiscount_Smart_Controller +#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// The GADGETS3D G3D LCD/SD Controller (blue PCB) +// http://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +//#define G3D_PANEL + +// The RepRapDiscount FULL GRAPHIC Smart Controller (quadratic white PCB) +// http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +// ==> REMEMBER TO INSTALL U8glib to your ARDUINO library folder: http://code.google.com/p/u8glib/wiki/u8glib +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// The RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// http://reprapworld.com/?products_details&products_id=202&cPath=1591_1626 +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // how much should be moved when a key is pressed, eg 10.0 means 10mm per click + +// The Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// REMEMBER TO INSTALL LiquidCrystal_I2C.h in your ARDUINO library folder: https://github.com/kiyoshigawa/LiquidCrystal_I2C +//#define RA_CONTROL_PANEL + +//automatic expansion +#if defined (MAKRPANEL) + #define DOGLCD + #define SDSUPPORT + #define ULTIPANEL + #define NEWPANEL + #define DEFAULT_LCD_CONTRAST 17 +#endif + +#if defined (REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) + #define DOGLCD + #define U8GLIB_ST7920 + #define REPRAP_DISCOUNT_SMART_CONTROLLER +#endif + +#if defined(ULTIMAKERCONTROLLER) || defined(REPRAP_DISCOUNT_SMART_CONTROLLER) || defined(G3D_PANEL) + #define ULTIPANEL + #define NEWPANEL +#endif + +#if defined(REPRAPWORLD_KEYPAD) + #define NEWPANEL + #define ULTIPANEL +#endif +#if defined(RA_CONTROL_PANEL) + #define ULTIPANEL + #define NEWPANEL + #define LCD_I2C_TYPE_PCA8574 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander +#endif + +//I2C PANELS + +//#define LCD_I2C_SAINSMART_YWROBOT +#ifdef LCD_I2C_SAINSMART_YWROBOT + // This uses the LiquidCrystal_I2C library ( https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home ) + // Make sure it is placed in the Arduino libraries directory. + #define LCD_I2C_TYPE_PCF8575 + #define LCD_I2C_ADDRESS 0x27 // I2C Address of the port expander + #define NEWPANEL + #define ULTIPANEL +#endif + +// PANELOLU2 LCD with status LEDs, separate encoder and click inputs +//#define LCD_I2C_PANELOLU2 +#ifdef LCD_I2C_PANELOLU2 + // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) + // Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. + // (v1.2.3 no longer requires you to define PANELOLU in the LiquidTWI2.h library header file) + // Note: The PANELOLU2 encoder click input can either be directly connected to a pin + // (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER //comment out to disable buzzer on LCD + #define NEWPANEL + #define ULTIPANEL + + #ifndef ENCODER_PULSES_PER_STEP + #define ENCODER_PULSES_PER_STEP 4 + #endif + + #ifndef ENCODER_STEPS_PER_MENU_ITEM + #define ENCODER_STEPS_PER_MENU_ITEM 2 + #endif + + + #ifdef LCD_USE_I2C_BUZZER + #define LCD_FEEDBACK_FREQUENCY_HZ 1000 + #define LCD_FEEDBACK_FREQUENCY_DURATION_MS 100 + #endif + +#endif + +// Panucatt VIKI LCD with status LEDs, integrated click & L/R/U/P buttons, separate encoder inputs +//#define LCD_I2C_VIKI +#ifdef LCD_I2C_VIKI + // This uses the LiquidTWI2 library v1.2.3 or later ( https://github.com/lincomatic/LiquidTWI2 ) + // Make sure the LiquidTWI2 directory is placed in the Arduino or Sketchbook libraries subdirectory. + // Note: The pause/stop/resume LCD button pin should be connected to the Arduino + // BTN_ENC pin (or set BTN_ENC to -1 if not used) + #define LCD_I2C_TYPE_MCP23017 + #define LCD_I2C_ADDRESS 0x20 // I2C Address of the port expander + #define LCD_USE_I2C_BUZZER //comment out to disable buzzer on LCD (requires LiquidTWI2 v1.2.3 or later) + #define NEWPANEL + #define ULTIPANEL +#endif + +// Shift register panels +// --------------------- +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection + +//#define SAV_3DLCD +#ifdef SAV_3DLCD + #define SR_LCD_2W_NL // Non latching 2 wire shiftregister + #define NEWPANEL + #define ULTIPANEL +#endif + + +#ifdef ULTIPANEL +// #define NEWPANEL //enable this if you have a click-encoder panel + #define SDSUPPORT + #define ULTRA_LCD + #ifdef DOGLCD // Change number of lines to match the DOG graphic display + #define LCD_WIDTH 20 + #define LCD_HEIGHT 5 + #else + #define LCD_WIDTH 20 + #define LCD_HEIGHT 4 + #endif +#else //no panel but just LCD + #ifdef ULTRA_LCD + #ifdef DOGLCD // Change number of lines to match the 128x64 graphics display + #define LCD_WIDTH 20 + #define LCD_HEIGHT 5 + #else + #define LCD_WIDTH 16 + #define LCD_HEIGHT 2 + #endif + #endif +#endif + +// default LCD contrast for dogm-like LCD displays +#ifdef DOGLCD +# ifndef DEFAULT_LCD_CONTRAST +# define DEFAULT_LCD_CONTRAST 32 +# endif +#endif + +// Increase the FAN pwm frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Temperature status LEDs that display the hotend and bet temperature. +// If all hotends and bed temperature and temperature setpoint are < 54C then the BLUE led is on. +// Otherwise the RED led is on. There is 1C hysteresis. +//#define TEMP_STAT_LEDS + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not ass annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +#define SOFT_PWM_SCALE 0 + +// M240 Triggers a camera by emulating a Canon RC-1 Remote +// Data from: http://www.doc-diy.net/photo/rc-1_hacked/ +// #define PHOTOGRAPH_PIN 23 + +// SF send wrong arc g-codes when using Arc Point as fillet procedure +//#define SF_ARC_FIX + +//define BlinkM/CyzRgb Support +//#define BLINKM + +/*********************************************************************\ +* R/C SERVO support +* Sponsored by TrinityLabs, Reworked by codexmas +**********************************************************************/ + +// Number of servos +// +// If you select a configuration below, this will receive a default value and does not need to be set manually +// set it manually if you have more servos than extruders and wish to manually control some +// leaving it undefined or defining as 0 will disable the servo subsystem +// If unsure, leave commented / disabled +// +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +/**********************************************************************\ + * Support for a filament diameter sensor + * Also allows adjustment of diameter at print time (vs at slicing) + * Single extruder only at this point (extruder 0) + * + * Motherboards + * 34 - RAMPS1.4 - uses Analog input 5 on the AUX2 connector + * 81 - Printrboard - Uses Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 - Rambo - uses Analog input 3 + * Note may require analog pins to be defined for different motherboards + **********************************************************************/ +// Uncomment below to enable +//#define FILAMENT_SENSOR + +#define FILAMENT_SENSOR_EXTRUDER_NUM 0 //The number of the extruder that has the filament sensor (0,1,2) +#define MEASUREMENT_DELAY_CM 14 //measurement delay in cm. This is the distance from filament sensor to middle of barrel + +#define DEFAULT_NOMINAL_FILAMENT_DIA 3.0 //Enter the diameter (in mm) of the filament generally used (3.0 mm or 1.75 mm) - this is then used in the slicer software. Used for sensor reading validation +#define MEASURED_UPPER_LIMIT 3.30 //upper limit factor used for sensor reading validation in mm +#define MEASURED_LOWER_LIMIT 1.90 //lower limit factor for sensor reading validation in mm +#define MAX_MEASUREMENT_DELAY 20 //delay buffer size in bytes (1 byte = 1cm)- limits maximum measurement delay allowable (must be larger than MEASUREMENT_DELAY_CM and lower number saves RAM) + +//defines used in the code +#define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA //set measured to nominal initially + +//When using an LCD, uncomment the line below to display the Filament sensor data on the last line instead of status. Status will appear for 5 sec. +//#define FILAMENT_LCD_DISPLAY + + +// Calibration status of the machine, to be stored into the EEPROM, +// (unsigned char*)EEPROM_CALIBRATION_STATUS +enum CalibrationStatus +{ + // Freshly assembled, needs to peform a self-test and the XYZ calibration. + CALIBRATION_STATUS_ASSEMBLED = 255, + + // For the wizard: self test has been performed, now the XYZ calibration is needed. + // CALIBRATION_STATUS_XYZ_CALIBRATION = 250, + + // For the wizard: factory assembled, needs to run Z calibration. + CALIBRATION_STATUS_Z_CALIBRATION = 240, + + // The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode. + CALIBRATION_STATUS_LIVE_ADJUST = 230, + + // Calibrated, ready to print. + CALIBRATION_STATUS_CALIBRATED = 1, + + // Legacy: resetted by issuing a G86 G-code. + // This value can only be expected after an upgrade from the initial MK2 firmware releases. + // Currently the G86 sets the calibration status to + CALIBRATION_STATUS_UNKNOWN = 0, +}; + +#include "Configuration_adv.h" +#include "thermistortables.h" + +#endif //__CONFIGURATION_H diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index 5586ee3d3..fdb355a05 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -1,442 +1,442 @@ -#include "Marlin.h" -#include "planner.h" -#include "temperature.h" -#include "ultralcd.h" -#include "ConfigurationStore.h" -#include "Configuration_prusa.h" - -#ifdef MESH_BED_LEVELING -#include "mesh_bed_leveling.h" -#endif - -void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size) -{ - do - { - eeprom_write_byte((unsigned char*)pos, *value); - pos++; - value++; - }while(--size); -} -#define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value)) -void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) -{ - do - { - *value = eeprom_read_byte((unsigned char*)pos); - pos++; - value++; - }while(--size); -} -#define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value)) -//====================================================================================== - - - - -#define EEPROM_OFFSET 20 - - -// IMPORTANT: Whenever there are changes made to the variables stored in EEPROM -// in the functions below, also increment the version number. This makes sure that -// the default values are used whenever there is a change to the data, to prevent -// wrong data being written to the variables. -// ALSO: always make sure the variables in the Store and retrieve sections are in the same order. - -#define EEPROM_VERSION "V1" - -#ifdef EEPROM_SETTINGS -void Config_StoreSettings() -{ - char ver[4]= "000"; - int i=EEPROM_OFFSET; - EEPROM_WRITE_VAR(i,ver); // invalidate data first - EEPROM_WRITE_VAR(i,axis_steps_per_unit); - EEPROM_WRITE_VAR(i,max_feedrate); - EEPROM_WRITE_VAR(i,max_acceleration_units_per_sq_second); - EEPROM_WRITE_VAR(i,acceleration); - EEPROM_WRITE_VAR(i,retract_acceleration); - EEPROM_WRITE_VAR(i,minimumfeedrate); - EEPROM_WRITE_VAR(i,mintravelfeedrate); - EEPROM_WRITE_VAR(i,minsegmenttime); - EEPROM_WRITE_VAR(i,max_jerk[X_AXIS]); - EEPROM_WRITE_VAR(i,max_jerk[Y_AXIS]); - EEPROM_WRITE_VAR(i,max_jerk[Z_AXIS]); - EEPROM_WRITE_VAR(i,max_jerk[E_AXIS]); - EEPROM_WRITE_VAR(i,add_homing); - #ifndef ULTIPANEL - int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED; - int absPreheatHotendTemp = ABS_PREHEAT_HOTEND_TEMP, absPreheatHPBTemp = ABS_PREHEAT_HPB_TEMP, absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED; - - - - #endif -/* EEPROM_WRITE_VAR(i,plaPreheatHotendTemp); - EEPROM_WRITE_VAR(i,plaPreheatHPBTemp); - EEPROM_WRITE_VAR(i,plaPreheatFanSpeed); - EEPROM_WRITE_VAR(i,absPreheatHotendTemp); - EEPROM_WRITE_VAR(i,absPreheatHPBTemp); - EEPROM_WRITE_VAR(i,absPreheatFanSpeed); -*/ - - EEPROM_WRITE_VAR(i,zprobe_zoffset); - #ifdef PIDTEMP - EEPROM_WRITE_VAR(i,Kp); - EEPROM_WRITE_VAR(i,Ki); - EEPROM_WRITE_VAR(i,Kd); - #else - float dummy = 3000.0f; - EEPROM_WRITE_VAR(i,dummy); - dummy = 0.0f; - EEPROM_WRITE_VAR(i,dummy); - EEPROM_WRITE_VAR(i,dummy); - #endif - #ifdef PIDTEMPBED - EEPROM_WRITE_VAR(i, bedKp); - EEPROM_WRITE_VAR(i, bedKi); - EEPROM_WRITE_VAR(i, bedKd); - #endif - #ifndef DOGLCD - int lcd_contrast = 32; - #endif - EEPROM_WRITE_VAR(i,lcd_contrast); - #ifdef FWRETRACT - EEPROM_WRITE_VAR(i,autoretract_enabled); - EEPROM_WRITE_VAR(i,retract_length); - #if EXTRUDERS > 1 - EEPROM_WRITE_VAR(i,retract_length_swap); - #endif - EEPROM_WRITE_VAR(i,retract_feedrate); - EEPROM_WRITE_VAR(i,retract_zlift); - EEPROM_WRITE_VAR(i,retract_recover_length); - #if EXTRUDERS > 1 - EEPROM_WRITE_VAR(i,retract_recover_length_swap); - #endif - EEPROM_WRITE_VAR(i,retract_recover_feedrate); - #endif - - // Save filament sizes - EEPROM_WRITE_VAR(i, volumetric_enabled); - EEPROM_WRITE_VAR(i, filament_size[0]); - #if EXTRUDERS > 1 - EEPROM_WRITE_VAR(i, filament_size[1]); - #if EXTRUDERS > 2 - EEPROM_WRITE_VAR(i, filament_size[2]); - #endif - #endif - /*MYSERIAL.print("Top address used:\n"); - MYSERIAL.print(i); - MYSERIAL.print("\n"); - */ - char ver2[4]=EEPROM_VERSION; - i=EEPROM_OFFSET; - EEPROM_WRITE_VAR(i,ver2); // validate data - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Settings Stored"); -} -#endif //EEPROM_SETTINGS - - -#ifndef DISABLE_M503 -void Config_PrintSettings() -{ // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Steps per unit:"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M92 X",axis_steps_per_unit[X_AXIS]); - SERIAL_ECHOPAIR(" Y",axis_steps_per_unit[Y_AXIS]); - SERIAL_ECHOPAIR(" Z",axis_steps_per_unit[Z_AXIS]); - SERIAL_ECHOPAIR(" E",axis_steps_per_unit[E_AXIS]); - SERIAL_ECHOLN(""); - - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Maximum feedrates (mm/s):"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M203 X", max_feedrate[X_AXIS]); - SERIAL_ECHOPAIR(" Y", max_feedrate[Y_AXIS]); - SERIAL_ECHOPAIR(" Z", max_feedrate[Z_AXIS]); - SERIAL_ECHOPAIR(" E", max_feedrate[E_AXIS]); - SERIAL_ECHOLN(""); - - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Maximum Acceleration (mm/s2):"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M201 X" ,max_acceleration_units_per_sq_second[X_AXIS] ); - SERIAL_ECHOPAIR(" Y" , max_acceleration_units_per_sq_second[Y_AXIS] ); - SERIAL_ECHOPAIR(" Z" ,max_acceleration_units_per_sq_second[Z_AXIS] ); - SERIAL_ECHOPAIR(" E" ,max_acceleration_units_per_sq_second[E_AXIS]); - SERIAL_ECHOLN(""); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Acceleration: S=acceleration, T=retract acceleration"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M204 S",acceleration ); - SERIAL_ECHOPAIR(" T" ,retract_acceleration); - SERIAL_ECHOLN(""); - - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M205 S",minimumfeedrate ); - SERIAL_ECHOPAIR(" T" ,mintravelfeedrate ); - SERIAL_ECHOPAIR(" B" ,minsegmenttime ); - SERIAL_ECHOPAIR(" X" ,max_jerk[X_AXIS] ); - SERIAL_ECHOPAIR(" Y" ,max_jerk[Y_AXIS] ); - SERIAL_ECHOPAIR(" Z" ,max_jerk[Z_AXIS] ); - SERIAL_ECHOPAIR(" E" ,max_jerk[E_AXIS] ); - SERIAL_ECHOLN(""); - - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Home offset (mm):"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M206 X",add_homing[X_AXIS] ); - SERIAL_ECHOPAIR(" Y" ,add_homing[Y_AXIS] ); - SERIAL_ECHOPAIR(" Z" ,add_homing[Z_AXIS] ); - SERIAL_ECHOLN(""); -#ifdef PIDTEMP - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("PID settings:"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M301 P",Kp); - SERIAL_ECHOPAIR(" I" ,unscalePID_i(Ki)); - SERIAL_ECHOPAIR(" D" ,unscalePID_d(Kd)); - SERIAL_ECHOLN(""); -#endif -#ifdef PIDTEMPBED - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("PID heatbed settings:"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M304 P", bedKp); - SERIAL_ECHOPAIR(" I", unscalePID_i(bedKi)); - SERIAL_ECHOPAIR(" D", unscalePID_d(bedKd)); - SERIAL_ECHOLN(""); -#endif -#ifdef FWRETRACT - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Retract: S=Length (mm) F:Speed (mm/m) Z: ZLift (mm)"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M207 S",retract_length); - SERIAL_ECHOPAIR(" F" ,retract_feedrate*60); - SERIAL_ECHOPAIR(" Z" ,retract_zlift); - SERIAL_ECHOLN(""); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Recover: S=Extra length (mm) F:Speed (mm/m)"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M208 S",retract_recover_length); - SERIAL_ECHOPAIR(" F", retract_recover_feedrate*60); - SERIAL_ECHOLN(""); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Auto-Retract: S=0 to disable, 1 to interpret extrude-only moves as retracts or recoveries"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M209 S", (unsigned long)(autoretract_enabled ? 1 : 0)); - SERIAL_ECHOLN(""); -#if EXTRUDERS > 1 - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Multi-extruder settings:"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" Swap retract length (mm): ", retract_length_swap); - SERIAL_ECHOLN(""); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" Swap rec. addl. length (mm): ", retract_recover_length_swap); - SERIAL_ECHOLN(""); -#endif - SERIAL_ECHO_START; - if (volumetric_enabled) { - SERIAL_ECHOLNPGM("Filament settings:"); - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M200 D", filament_size[0]); - SERIAL_ECHOLN(""); -#if EXTRUDERS > 1 - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M200 T1 D", filament_size[1]); - SERIAL_ECHOLN(""); -#if EXTRUDERS > 2 - SERIAL_ECHO_START; - SERIAL_ECHOPAIR(" M200 T2 D", filament_size[2]); - SERIAL_ECHOLN(""); -#endif -#endif - } else { - SERIAL_ECHOLNPGM("Filament settings: Disabled"); - } -#endif -} -#endif - - -#ifdef EEPROM_SETTINGS -void Config_RetrieveSettings() -{ - int i=EEPROM_OFFSET; - char stored_ver[4]; - char ver[4]=EEPROM_VERSION; - EEPROM_READ_VAR(i,stored_ver); //read stored version - // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]"); - if (strncmp(ver,stored_ver,3) == 0) - { - // version number match - EEPROM_READ_VAR(i,axis_steps_per_unit); - EEPROM_READ_VAR(i,max_feedrate); - EEPROM_READ_VAR(i,max_acceleration_units_per_sq_second); - - // steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner) - reset_acceleration_rates(); - - EEPROM_READ_VAR(i,acceleration); - EEPROM_READ_VAR(i,retract_acceleration); - EEPROM_READ_VAR(i,minimumfeedrate); - EEPROM_READ_VAR(i,mintravelfeedrate); - EEPROM_READ_VAR(i,minsegmenttime); - EEPROM_READ_VAR(i,max_jerk[X_AXIS]); - EEPROM_READ_VAR(i,max_jerk[Y_AXIS]); - EEPROM_READ_VAR(i,max_jerk[Z_AXIS]); - EEPROM_READ_VAR(i,max_jerk[E_AXIS]); - EEPROM_READ_VAR(i,add_homing); - #ifndef ULTIPANEL - int plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed; - int absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed; - - #endif - /* - EEPROM_READ_VAR(i,plaPreheatHotendTemp); - EEPROM_READ_VAR(i,plaPreheatHPBTemp); - EEPROM_READ_VAR(i,plaPreheatFanSpeed); - EEPROM_READ_VAR(i,absPreheatHotendTemp); - EEPROM_READ_VAR(i,absPreheatHPBTemp); - EEPROM_READ_VAR(i,absPreheatFanSpeed); - */ - - - EEPROM_READ_VAR(i,zprobe_zoffset); - #ifndef PIDTEMP - float Kp,Ki,Kd; - #endif - // do not need to scale PID values as the values in EEPROM are already scaled - EEPROM_READ_VAR(i,Kp); - EEPROM_READ_VAR(i,Ki); - EEPROM_READ_VAR(i,Kd); - #ifdef PIDTEMPBED - EEPROM_READ_VAR(i, bedKp); - EEPROM_READ_VAR(i, bedKi); - EEPROM_READ_VAR(i, bedKd); - #endif - #ifndef DOGLCD - int lcd_contrast; - #endif - EEPROM_READ_VAR(i,lcd_contrast); - - #ifdef FWRETRACT - EEPROM_READ_VAR(i,autoretract_enabled); - EEPROM_READ_VAR(i,retract_length); - #if EXTRUDERS > 1 - EEPROM_READ_VAR(i,retract_length_swap); - #endif - EEPROM_READ_VAR(i,retract_feedrate); - EEPROM_READ_VAR(i,retract_zlift); - EEPROM_READ_VAR(i,retract_recover_length); - #if EXTRUDERS > 1 - EEPROM_READ_VAR(i,retract_recover_length_swap); - #endif - EEPROM_READ_VAR(i,retract_recover_feedrate); - #endif - - EEPROM_READ_VAR(i, volumetric_enabled); - EEPROM_READ_VAR(i, filament_size[0]); -#if EXTRUDERS > 1 - EEPROM_READ_VAR(i, filament_size[1]); -#if EXTRUDERS > 2 - EEPROM_READ_VAR(i, filament_size[2]); -#endif -#endif - calculate_volumetric_multipliers(); - // Call updatePID (similar to when we have processed M301) - updatePID(); - float tmp1[] = DEFAULT_AXIS_STEPS_PER_UNIT; - axis_steps_per_unit[3] = tmp1[3]; - - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM("Stored settings retrieved"); - } - else - { - Config_ResetDefault(); - } - #ifdef EEPROM_CHITCHAT - Config_PrintSettings(); - #endif -} -#endif - -void Config_ResetDefault() -{ - float tmp1[]=DEFAULT_AXIS_STEPS_PER_UNIT; - float tmp2[]=DEFAULT_MAX_FEEDRATE; - long tmp3[]=DEFAULT_MAX_ACCELERATION; - for (short i=0;i<4;i++) - { - axis_steps_per_unit[i]=tmp1[i]; - max_feedrate[i]=tmp2[i]; - max_acceleration_units_per_sq_second[i]=tmp3[i]; - } - - // steps per sq second need to be updated to agree with the units per sq second - reset_acceleration_rates(); - - acceleration=DEFAULT_ACCELERATION; - retract_acceleration=DEFAULT_RETRACT_ACCELERATION; - minimumfeedrate=DEFAULT_MINIMUMFEEDRATE; - minsegmenttime=DEFAULT_MINSEGMENTTIME; - mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE; - max_jerk[X_AXIS] = DEFAULT_XJERK; - max_jerk[Y_AXIS] = DEFAULT_YJERK; - max_jerk[Z_AXIS] = DEFAULT_ZJERK; - max_jerk[E_AXIS] = DEFAULT_EJERK; - add_homing[X_AXIS] = add_homing[Y_AXIS] = add_homing[Z_AXIS] = 0; - -#ifdef ENABLE_AUTO_BED_LEVELING - zprobe_zoffset = -Z_PROBE_OFFSET_FROM_EXTRUDER; -#endif -#ifdef DOGLCD - lcd_contrast = DEFAULT_LCD_CONTRAST; -#endif -#ifdef PIDTEMP - Kp = DEFAULT_Kp; - Ki = scalePID_i(DEFAULT_Ki); - Kd = scalePID_d(DEFAULT_Kd); - - // call updatePID (similar to when we have processed M301) - updatePID(); - -#ifdef PID_ADD_EXTRUSION_RATE - Kc = DEFAULT_Kc; -#endif//PID_ADD_EXTRUSION_RATE -#endif//PIDTEMP - -#ifdef FWRETRACT - autoretract_enabled = false; - retract_length = RETRACT_LENGTH; -#if EXTRUDERS > 1 - retract_length_swap = RETRACT_LENGTH_SWAP; -#endif - retract_feedrate = RETRACT_FEEDRATE; - retract_zlift = RETRACT_ZLIFT; - retract_recover_length = RETRACT_RECOVER_LENGTH; -#if EXTRUDERS > 1 - retract_recover_length_swap = RETRACT_RECOVER_LENGTH_SWAP; -#endif - retract_recover_feedrate = RETRACT_RECOVER_FEEDRATE; -#endif - - volumetric_enabled = false; - filament_size[0] = DEFAULT_NOMINAL_FILAMENT_DIA; -#if EXTRUDERS > 1 - filament_size[1] = DEFAULT_NOMINAL_FILAMENT_DIA; -#if EXTRUDERS > 2 - filament_size[2] = DEFAULT_NOMINAL_FILAMENT_DIA; -#endif -#endif - calculate_volumetric_multipliers(); - -SERIAL_ECHO_START; -SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded"); - -} +#include "Marlin.h" +#include "planner.h" +#include "temperature.h" +#include "ultralcd.h" +#include "ConfigurationStore.h" +#include "Configuration_prusa.h" + +#ifdef MESH_BED_LEVELING +#include "mesh_bed_leveling.h" +#endif + +void _EEPROM_writeData(int &pos, uint8_t* value, uint8_t size) +{ + do + { + eeprom_write_byte((unsigned char*)pos, *value); + pos++; + value++; + }while(--size); +} +#define EEPROM_WRITE_VAR(pos, value) _EEPROM_writeData(pos, (uint8_t*)&value, sizeof(value)) +void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) +{ + do + { + *value = eeprom_read_byte((unsigned char*)pos); + pos++; + value++; + }while(--size); +} +#define EEPROM_READ_VAR(pos, value) _EEPROM_readData(pos, (uint8_t*)&value, sizeof(value)) +//====================================================================================== + + + + +#define EEPROM_OFFSET 20 + + +// IMPORTANT: Whenever there are changes made to the variables stored in EEPROM +// in the functions below, also increment the version number. This makes sure that +// the default values are used whenever there is a change to the data, to prevent +// wrong data being written to the variables. +// ALSO: always make sure the variables in the Store and retrieve sections are in the same order. + +#define EEPROM_VERSION "V1" + +#ifdef EEPROM_SETTINGS +void Config_StoreSettings() +{ + char ver[4]= "000"; + int i=EEPROM_OFFSET; + EEPROM_WRITE_VAR(i,ver); // invalidate data first + EEPROM_WRITE_VAR(i,axis_steps_per_unit); + EEPROM_WRITE_VAR(i,max_feedrate); + EEPROM_WRITE_VAR(i,max_acceleration_units_per_sq_second); + EEPROM_WRITE_VAR(i,acceleration); + EEPROM_WRITE_VAR(i,retract_acceleration); + EEPROM_WRITE_VAR(i,minimumfeedrate); + EEPROM_WRITE_VAR(i,mintravelfeedrate); + EEPROM_WRITE_VAR(i,minsegmenttime); + EEPROM_WRITE_VAR(i,max_jerk[X_AXIS]); + EEPROM_WRITE_VAR(i,max_jerk[Y_AXIS]); + EEPROM_WRITE_VAR(i,max_jerk[Z_AXIS]); + EEPROM_WRITE_VAR(i,max_jerk[E_AXIS]); + EEPROM_WRITE_VAR(i,add_homing); + #ifndef ULTIPANEL + int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED; + int absPreheatHotendTemp = ABS_PREHEAT_HOTEND_TEMP, absPreheatHPBTemp = ABS_PREHEAT_HPB_TEMP, absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED; + + + + #endif +/* EEPROM_WRITE_VAR(i,plaPreheatHotendTemp); + EEPROM_WRITE_VAR(i,plaPreheatHPBTemp); + EEPROM_WRITE_VAR(i,plaPreheatFanSpeed); + EEPROM_WRITE_VAR(i,absPreheatHotendTemp); + EEPROM_WRITE_VAR(i,absPreheatHPBTemp); + EEPROM_WRITE_VAR(i,absPreheatFanSpeed); +*/ + + EEPROM_WRITE_VAR(i,zprobe_zoffset); + #ifdef PIDTEMP + EEPROM_WRITE_VAR(i,Kp); + EEPROM_WRITE_VAR(i,Ki); + EEPROM_WRITE_VAR(i,Kd); + #else + float dummy = 3000.0f; + EEPROM_WRITE_VAR(i,dummy); + dummy = 0.0f; + EEPROM_WRITE_VAR(i,dummy); + EEPROM_WRITE_VAR(i,dummy); + #endif + #ifdef PIDTEMPBED + EEPROM_WRITE_VAR(i, bedKp); + EEPROM_WRITE_VAR(i, bedKi); + EEPROM_WRITE_VAR(i, bedKd); + #endif + #ifndef DOGLCD + int lcd_contrast = 32; + #endif + EEPROM_WRITE_VAR(i,lcd_contrast); + #ifdef FWRETRACT + EEPROM_WRITE_VAR(i,autoretract_enabled); + EEPROM_WRITE_VAR(i,retract_length); + #if EXTRUDERS > 1 + EEPROM_WRITE_VAR(i,retract_length_swap); + #endif + EEPROM_WRITE_VAR(i,retract_feedrate); + EEPROM_WRITE_VAR(i,retract_zlift); + EEPROM_WRITE_VAR(i,retract_recover_length); + #if EXTRUDERS > 1 + EEPROM_WRITE_VAR(i,retract_recover_length_swap); + #endif + EEPROM_WRITE_VAR(i,retract_recover_feedrate); + #endif + + // Save filament sizes + EEPROM_WRITE_VAR(i, volumetric_enabled); + EEPROM_WRITE_VAR(i, filament_size[0]); + #if EXTRUDERS > 1 + EEPROM_WRITE_VAR(i, filament_size[1]); + #if EXTRUDERS > 2 + EEPROM_WRITE_VAR(i, filament_size[2]); + #endif + #endif + /*MYSERIAL.print("Top address used:\n"); + MYSERIAL.print(i); + MYSERIAL.print("\n"); + */ + char ver2[4]=EEPROM_VERSION; + i=EEPROM_OFFSET; + EEPROM_WRITE_VAR(i,ver2); // validate data + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Settings Stored"); +} +#endif //EEPROM_SETTINGS + + +#ifndef DISABLE_M503 +void Config_PrintSettings() +{ // Always have this function, even with EEPROM_SETTINGS disabled, the current values will be shown + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Steps per unit:"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M92 X",axis_steps_per_unit[X_AXIS]); + SERIAL_ECHOPAIR(" Y",axis_steps_per_unit[Y_AXIS]); + SERIAL_ECHOPAIR(" Z",axis_steps_per_unit[Z_AXIS]); + SERIAL_ECHOPAIR(" E",axis_steps_per_unit[E_AXIS]); + SERIAL_ECHOLN(""); + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Maximum feedrates (mm/s):"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M203 X", max_feedrate[X_AXIS]); + SERIAL_ECHOPAIR(" Y", max_feedrate[Y_AXIS]); + SERIAL_ECHOPAIR(" Z", max_feedrate[Z_AXIS]); + SERIAL_ECHOPAIR(" E", max_feedrate[E_AXIS]); + SERIAL_ECHOLN(""); + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Maximum Acceleration (mm/s2):"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M201 X" ,max_acceleration_units_per_sq_second[X_AXIS] ); + SERIAL_ECHOPAIR(" Y" , max_acceleration_units_per_sq_second[Y_AXIS] ); + SERIAL_ECHOPAIR(" Z" ,max_acceleration_units_per_sq_second[Z_AXIS] ); + SERIAL_ECHOPAIR(" E" ,max_acceleration_units_per_sq_second[E_AXIS]); + SERIAL_ECHOLN(""); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Acceleration: S=acceleration, T=retract acceleration"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M204 S",acceleration ); + SERIAL_ECHOPAIR(" T" ,retract_acceleration); + SERIAL_ECHOLN(""); + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Advanced variables: S=Min feedrate (mm/s), T=Min travel feedrate (mm/s), B=minimum segment time (ms), X=maximum XY jerk (mm/s), Z=maximum Z jerk (mm/s), E=maximum E jerk (mm/s)"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M205 S",minimumfeedrate ); + SERIAL_ECHOPAIR(" T" ,mintravelfeedrate ); + SERIAL_ECHOPAIR(" B" ,minsegmenttime ); + SERIAL_ECHOPAIR(" X" ,max_jerk[X_AXIS] ); + SERIAL_ECHOPAIR(" Y" ,max_jerk[Y_AXIS] ); + SERIAL_ECHOPAIR(" Z" ,max_jerk[Z_AXIS] ); + SERIAL_ECHOPAIR(" E" ,max_jerk[E_AXIS] ); + SERIAL_ECHOLN(""); + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Home offset (mm):"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M206 X",add_homing[X_AXIS] ); + SERIAL_ECHOPAIR(" Y" ,add_homing[Y_AXIS] ); + SERIAL_ECHOPAIR(" Z" ,add_homing[Z_AXIS] ); + SERIAL_ECHOLN(""); +#ifdef PIDTEMP + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("PID settings:"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M301 P",Kp); + SERIAL_ECHOPAIR(" I" ,unscalePID_i(Ki)); + SERIAL_ECHOPAIR(" D" ,unscalePID_d(Kd)); + SERIAL_ECHOLN(""); +#endif +#ifdef PIDTEMPBED + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("PID heatbed settings:"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M304 P", bedKp); + SERIAL_ECHOPAIR(" I", unscalePID_i(bedKi)); + SERIAL_ECHOPAIR(" D", unscalePID_d(bedKd)); + SERIAL_ECHOLN(""); +#endif +#ifdef FWRETRACT + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Retract: S=Length (mm) F:Speed (mm/m) Z: ZLift (mm)"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M207 S",retract_length); + SERIAL_ECHOPAIR(" F" ,retract_feedrate*60); + SERIAL_ECHOPAIR(" Z" ,retract_zlift); + SERIAL_ECHOLN(""); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Recover: S=Extra length (mm) F:Speed (mm/m)"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M208 S",retract_recover_length); + SERIAL_ECHOPAIR(" F", retract_recover_feedrate*60); + SERIAL_ECHOLN(""); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Auto-Retract: S=0 to disable, 1 to interpret extrude-only moves as retracts or recoveries"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M209 S", (unsigned long)(autoretract_enabled ? 1 : 0)); + SERIAL_ECHOLN(""); +#if EXTRUDERS > 1 + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Multi-extruder settings:"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" Swap retract length (mm): ", retract_length_swap); + SERIAL_ECHOLN(""); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" Swap rec. addl. length (mm): ", retract_recover_length_swap); + SERIAL_ECHOLN(""); +#endif + SERIAL_ECHO_START; + if (volumetric_enabled) { + SERIAL_ECHOLNPGM("Filament settings:"); + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M200 D", filament_size[0]); + SERIAL_ECHOLN(""); +#if EXTRUDERS > 1 + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M200 T1 D", filament_size[1]); + SERIAL_ECHOLN(""); +#if EXTRUDERS > 2 + SERIAL_ECHO_START; + SERIAL_ECHOPAIR(" M200 T2 D", filament_size[2]); + SERIAL_ECHOLN(""); +#endif +#endif + } else { + SERIAL_ECHOLNPGM("Filament settings: Disabled"); + } +#endif +} +#endif + + +#ifdef EEPROM_SETTINGS +void Config_RetrieveSettings() +{ + int i=EEPROM_OFFSET; + char stored_ver[4]; + char ver[4]=EEPROM_VERSION; + EEPROM_READ_VAR(i,stored_ver); //read stored version + // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]"); + if (strncmp(ver,stored_ver,3) == 0) + { + // version number match + EEPROM_READ_VAR(i,axis_steps_per_unit); + EEPROM_READ_VAR(i,max_feedrate); + EEPROM_READ_VAR(i,max_acceleration_units_per_sq_second); + + // steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner) + reset_acceleration_rates(); + + EEPROM_READ_VAR(i,acceleration); + EEPROM_READ_VAR(i,retract_acceleration); + EEPROM_READ_VAR(i,minimumfeedrate); + EEPROM_READ_VAR(i,mintravelfeedrate); + EEPROM_READ_VAR(i,minsegmenttime); + EEPROM_READ_VAR(i,max_jerk[X_AXIS]); + EEPROM_READ_VAR(i,max_jerk[Y_AXIS]); + EEPROM_READ_VAR(i,max_jerk[Z_AXIS]); + EEPROM_READ_VAR(i,max_jerk[E_AXIS]); + EEPROM_READ_VAR(i,add_homing); + #ifndef ULTIPANEL + int plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed; + int absPreheatHotendTemp, absPreheatHPBTemp, absPreheatFanSpeed; + + #endif + /* + EEPROM_READ_VAR(i,plaPreheatHotendTemp); + EEPROM_READ_VAR(i,plaPreheatHPBTemp); + EEPROM_READ_VAR(i,plaPreheatFanSpeed); + EEPROM_READ_VAR(i,absPreheatHotendTemp); + EEPROM_READ_VAR(i,absPreheatHPBTemp); + EEPROM_READ_VAR(i,absPreheatFanSpeed); + */ + + + EEPROM_READ_VAR(i,zprobe_zoffset); + #ifndef PIDTEMP + float Kp,Ki,Kd; + #endif + // do not need to scale PID values as the values in EEPROM are already scaled + EEPROM_READ_VAR(i,Kp); + EEPROM_READ_VAR(i,Ki); + EEPROM_READ_VAR(i,Kd); + #ifdef PIDTEMPBED + EEPROM_READ_VAR(i, bedKp); + EEPROM_READ_VAR(i, bedKi); + EEPROM_READ_VAR(i, bedKd); + #endif + #ifndef DOGLCD + int lcd_contrast; + #endif + EEPROM_READ_VAR(i,lcd_contrast); + + #ifdef FWRETRACT + EEPROM_READ_VAR(i,autoretract_enabled); + EEPROM_READ_VAR(i,retract_length); + #if EXTRUDERS > 1 + EEPROM_READ_VAR(i,retract_length_swap); + #endif + EEPROM_READ_VAR(i,retract_feedrate); + EEPROM_READ_VAR(i,retract_zlift); + EEPROM_READ_VAR(i,retract_recover_length); + #if EXTRUDERS > 1 + EEPROM_READ_VAR(i,retract_recover_length_swap); + #endif + EEPROM_READ_VAR(i,retract_recover_feedrate); + #endif + + EEPROM_READ_VAR(i, volumetric_enabled); + EEPROM_READ_VAR(i, filament_size[0]); +#if EXTRUDERS > 1 + EEPROM_READ_VAR(i, filament_size[1]); +#if EXTRUDERS > 2 + EEPROM_READ_VAR(i, filament_size[2]); +#endif +#endif + calculate_volumetric_multipliers(); + // Call updatePID (similar to when we have processed M301) + updatePID(); + float tmp1[] = DEFAULT_AXIS_STEPS_PER_UNIT; + axis_steps_per_unit[3] = tmp1[3]; + + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("Stored settings retrieved"); + } + else + { + Config_ResetDefault(); + } + #ifdef EEPROM_CHITCHAT + Config_PrintSettings(); + #endif +} +#endif + +void Config_ResetDefault() +{ + float tmp1[]=DEFAULT_AXIS_STEPS_PER_UNIT; + float tmp2[]=DEFAULT_MAX_FEEDRATE; + long tmp3[]=DEFAULT_MAX_ACCELERATION; + for (short i=0;i<4;i++) + { + axis_steps_per_unit[i]=tmp1[i]; + max_feedrate[i]=tmp2[i]; + max_acceleration_units_per_sq_second[i]=tmp3[i]; + } + + // steps per sq second need to be updated to agree with the units per sq second + reset_acceleration_rates(); + + acceleration=DEFAULT_ACCELERATION; + retract_acceleration=DEFAULT_RETRACT_ACCELERATION; + minimumfeedrate=DEFAULT_MINIMUMFEEDRATE; + minsegmenttime=DEFAULT_MINSEGMENTTIME; + mintravelfeedrate=DEFAULT_MINTRAVELFEEDRATE; + max_jerk[X_AXIS] = DEFAULT_XJERK; + max_jerk[Y_AXIS] = DEFAULT_YJERK; + max_jerk[Z_AXIS] = DEFAULT_ZJERK; + max_jerk[E_AXIS] = DEFAULT_EJERK; + add_homing[X_AXIS] = add_homing[Y_AXIS] = add_homing[Z_AXIS] = 0; + +#ifdef ENABLE_AUTO_BED_LEVELING + zprobe_zoffset = -Z_PROBE_OFFSET_FROM_EXTRUDER; +#endif +#ifdef DOGLCD + lcd_contrast = DEFAULT_LCD_CONTRAST; +#endif +#ifdef PIDTEMP + Kp = DEFAULT_Kp; + Ki = scalePID_i(DEFAULT_Ki); + Kd = scalePID_d(DEFAULT_Kd); + + // call updatePID (similar to when we have processed M301) + updatePID(); + +#ifdef PID_ADD_EXTRUSION_RATE + Kc = DEFAULT_Kc; +#endif//PID_ADD_EXTRUSION_RATE +#endif//PIDTEMP + +#ifdef FWRETRACT + autoretract_enabled = false; + retract_length = RETRACT_LENGTH; +#if EXTRUDERS > 1 + retract_length_swap = RETRACT_LENGTH_SWAP; +#endif + retract_feedrate = RETRACT_FEEDRATE; + retract_zlift = RETRACT_ZLIFT; + retract_recover_length = RETRACT_RECOVER_LENGTH; +#if EXTRUDERS > 1 + retract_recover_length_swap = RETRACT_RECOVER_LENGTH_SWAP; +#endif + retract_recover_feedrate = RETRACT_RECOVER_FEEDRATE; +#endif + + volumetric_enabled = false; + filament_size[0] = DEFAULT_NOMINAL_FILAMENT_DIA; +#if EXTRUDERS > 1 + filament_size[1] = DEFAULT_NOMINAL_FILAMENT_DIA; +#if EXTRUDERS > 2 + filament_size[2] = DEFAULT_NOMINAL_FILAMENT_DIA; +#endif +#endif + calculate_volumetric_multipliers(); + +SERIAL_ECHO_START; +SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded"); + +} diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 4936de47c..b3b40bdb5 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -1,449 +1,428 @@ -#ifndef CONFIGURATION_ADV_H -#define CONFIGURATION_ADV_H - -//=========================================================================== -//=============================Thermal Settings ============================ -//=========================================================================== - -#ifdef BED_LIMIT_SWITCHING - #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS -#endif -#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control - -//// Heating sanity check: -// This waits for the watch period in milliseconds whenever an M104 or M109 increases the target temperatureLCD_PROGRESS_BAR -// If the temperature has not increased at the end of that period, the target temperature is set to zero. -// It can be reset with another M104/M109. This check is also only triggered if the target temperature and the current temperature -// differ by at least 2x WATCH_TEMP_INCREASE -//#define WATCH_TEMP_PERIOD 40000 //40 seconds -//#define WATCH_TEMP_INCREASE 10 //Heat up at least 10 degree in 20 seconds - -#ifdef PIDTEMP - // this adds an experimental additional term to the heating power, proportional to the extrusion speed. - // if Kc is chosen well, the additional required power due to increased melting should be compensated. - #define PID_ADD_EXTRUSION_RATE - #ifdef PID_ADD_EXTRUSION_RATE - #define DEFAULT_Kc (1) //heating power=Kc*(e_speed) - #endif -#endif - - -//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. -//The maximum buffered steps/sec of the extruder motor are called "se". -//You enter the autotemp mode by a M109 S B F -// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp -// you exit the value by any M109 without F* -// Also, if the temperature is set to a value 1 && defined TEMP_SENSOR_1_AS_REDUNDANT - #error "You cannot use TEMP_SENSOR_1_AS_REDUNDANT if EXTRUDERS > 1" -#endif - -#if EXTRUDERS > 1 && defined HEATERS_PARALLEL - #error "You cannot use HEATERS_PARALLEL if EXTRUDERS > 1" -#endif - -#if TEMP_SENSOR_0 > 0 - #define THERMISTORHEATER_0 TEMP_SENSOR_0 - #define HEATER_0_USES_THERMISTOR -#endif -#if TEMP_SENSOR_1 > 0 - #define THERMISTORHEATER_1 TEMP_SENSOR_1 - #define HEATER_1_USES_THERMISTOR -#endif -#if TEMP_SENSOR_2 > 0 - #define THERMISTORHEATER_2 TEMP_SENSOR_2 - #define HEATER_2_USES_THERMISTOR -#endif -#if TEMP_SENSOR_BED > 0 - #define THERMISTORBED TEMP_SENSOR_BED - #define BED_USES_THERMISTOR -#endif -#if TEMP_SENSOR_0 == -1 - #define HEATER_0_USES_AD595 -#endif -#if TEMP_SENSOR_1 == -1 - #define HEATER_1_USES_AD595 -#endif -#if TEMP_SENSOR_2 == -1 - #define HEATER_2_USES_AD595 -#endif -#if TEMP_SENSOR_BED == -1 - #define BED_USES_AD595 -#endif -#if TEMP_SENSOR_0 == -2 - #define HEATER_0_USES_MAX6675 -#endif -#if TEMP_SENSOR_0 == 0 - #undef HEATER_0_MINTEMP - #undef HEATER_0_MAXTEMP -#endif -#if TEMP_SENSOR_1 == 0 - #undef HEATER_1_MINTEMP - #undef HEATER_1_MAXTEMP -#endif -#if TEMP_SENSOR_2 == 0 - #undef HEATER_2_MINTEMP - #undef HEATER_2_MAXTEMP -#endif -#if TEMP_SENSOR_BED == 0 - #undef BED_MINTEMP - #undef BED_MAXTEMP -#endif - - -#endif //__CONFIGURATION_ADV_H +#ifndef CONFIGURATION_ADV_H +#define CONFIGURATION_ADV_H + +//=========================================================================== +//=============================Thermal Settings ============================ +//=========================================================================== + +#ifdef BED_LIMIT_SWITCHING + #define BED_HYSTERESIS 2 //only disable heating if T>target+BED_HYSTERESIS and enable heating if T>target-BED_HYSTERESIS +#endif +#define BED_CHECK_INTERVAL 5000 //ms between checks in bang-bang control + +//// Heating sanity check: +// This waits for the watch period in milliseconds whenever an M104 or M109 increases the target temperatureLCD_PROGRESS_BAR +// If the temperature has not increased at the end of that period, the target temperature is set to zero. +// It can be reset with another M104/M109. This check is also only triggered if the target temperature and the current temperature +// differ by at least 2x WATCH_TEMP_INCREASE +//#define WATCH_TEMP_PERIOD 40000 //40 seconds +//#define WATCH_TEMP_INCREASE 10 //Heat up at least 10 degree in 20 seconds + +#ifdef PIDTEMP + // this adds an experimental additional term to the heating power, proportional to the extrusion speed. + // if Kc is chosen well, the additional required power due to increased melting should be compensated. + #define PID_ADD_EXTRUSION_RATE + #ifdef PID_ADD_EXTRUSION_RATE + #define DEFAULT_Kc (1) //heating power=Kc*(e_speed) + #endif +#endif + + +//automatic temperature: The hot end target temperature is calculated by all the buffered lines of gcode. +//The maximum buffered steps/sec of the extruder motor are called "se". +//You enter the autotemp mode by a M109 S B F +// the target temperature is set to mintemp+factor*se[steps/sec] and limited by mintemp and maxtemp +// you exit the value by any M109 without F* +// Also, if the temperature is set to a value 1 && defined TEMP_SENSOR_1_AS_REDUNDANT + #error "You cannot use TEMP_SENSOR_1_AS_REDUNDANT if EXTRUDERS > 1" +#endif + +#if EXTRUDERS > 1 && defined HEATERS_PARALLEL + #error "You cannot use HEATERS_PARALLEL if EXTRUDERS > 1" +#endif + +#if TEMP_SENSOR_0 > 0 + #define THERMISTORHEATER_0 TEMP_SENSOR_0 + #define HEATER_0_USES_THERMISTOR +#endif +#if TEMP_SENSOR_1 > 0 + #define THERMISTORHEATER_1 TEMP_SENSOR_1 + #define HEATER_1_USES_THERMISTOR +#endif +#if TEMP_SENSOR_2 > 0 + #define THERMISTORHEATER_2 TEMP_SENSOR_2 + #define HEATER_2_USES_THERMISTOR +#endif +#if TEMP_SENSOR_BED > 0 + #define THERMISTORBED TEMP_SENSOR_BED + #define BED_USES_THERMISTOR +#endif +#if TEMP_SENSOR_0 == -1 + #define HEATER_0_USES_AD595 +#endif +#if TEMP_SENSOR_1 == -1 + #define HEATER_1_USES_AD595 +#endif +#if TEMP_SENSOR_2 == -1 + #define HEATER_2_USES_AD595 +#endif +#if TEMP_SENSOR_BED == -1 + #define BED_USES_AD595 +#endif +#if TEMP_SENSOR_0 == -2 + #define HEATER_0_USES_MAX6675 +#endif +#if TEMP_SENSOR_0 == 0 + #undef HEATER_0_MINTEMP + #undef HEATER_0_MAXTEMP +#endif +#if TEMP_SENSOR_1 == 0 + #undef HEATER_1_MINTEMP + #undef HEATER_1_MAXTEMP +#endif +#if TEMP_SENSOR_2 == 0 + #undef HEATER_2_MINTEMP + #undef HEATER_2_MAXTEMP +#endif +#if TEMP_SENSOR_BED == 0 + #undef BED_MINTEMP + #undef BED_MAXTEMP +#endif + + +#endif //__CONFIGURATION_ADV_H diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 32d2df74f..a5c7ffa2a 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -348,8 +348,4 @@ float temp_comp_interpolation(float temperature); void temp_compensation_apply(); void temp_compensation_start(); void wait_for_heater(long codenum); -void serialecho_temperatures(); - -extern void save_print_to_eeprom(); -extern void restore_print_from_eeprom(); -extern void position_menu(); \ No newline at end of file +void serialecho_temperatures(); \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d8919b9dc..d15db7bc1 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -199,7 +199,6 @@ // M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) // M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] // M605 - Set dual x-carriage movement mode: S [ X R ] -// M900 - Set LIN_ADVANCE options, if enabled. See Configuration_adv.h for details. // M907 - Set digital trimpot motor current using axis codes. // M908 - Control digital trimpot directly. // M350 - Set microstepping mode. @@ -1380,6 +1379,7 @@ void get_command() continue; if(serial_char == '\n' || serial_char == '\r' || + (serial_char == ':' && comment_mode == false) || serial_count >= (MAX_CMD_SIZE - 1) ) { if(!serial_count) { //if empty line @@ -1610,15 +1610,6 @@ static inline long code_value_long() { return strtol(strchr_pointer+1, NUL static inline int16_t code_value_short() { return int16_t(strtol(strchr_pointer+1, NULL, 10)); }; static inline uint8_t code_value_uint8() { return uint8_t(strtol(strchr_pointer+1, NULL, 10)); }; -static inline float code_value_float() { - char* e = strchr(strchr_pointer, 'E'); - if (!e) return strtod(strchr_pointer + 1, NULL); - *e = 0; - float ret = strtod(strchr_pointer + 1, NULL); - *e = 'E'; - return ret; -} - #define DEFINE_PGM_READ_ANY(type, reader) \ static inline type pgm_read_any(const type *p) \ { return pgm_read_##reader##_near(p); } @@ -1804,39 +1795,6 @@ static float probe_pt(float x, float y, float z_before) { #endif // #ifdef ENABLE_AUTO_BED_LEVELING -#ifdef LIN_ADVANCE - /** - * M900: Set and/or Get advance K factor and WH/D ratio - * - * K Set advance K factor - * R Set ratio directly (overrides WH/D) - * W H D Set ratio from WH/D - */ - inline void gcode_M900() { - st_synchronize(); - - const float newK = code_seen('K') ? code_value_float() : -1; - if (newK >= 0) extruder_advance_k = newK; - - float newR = code_seen('R') ? code_value_float() : -1; - if (newR < 0) { - const float newD = code_seen('D') ? code_value_float() : -1, - newW = code_seen('W') ? code_value_float() : -1, - newH = code_seen('H') ? code_value_float() : -1; - if (newD >= 0 && newW >= 0 && newH >= 0) - newR = newD ? (newW * newH) / (sq(newD * 0.5) * M_PI) : 0; - } - if (newR >= 0) advance_ed_ratio = newR; - - SERIAL_ECHO_START; - SERIAL_ECHOPGM("Advance K="); - SERIAL_ECHOLN(extruder_advance_k); - SERIAL_ECHOPGM(" E/D="); - const float ratio = advance_ed_ratio; - if (ratio) SERIAL_ECHOLN(ratio); else SERIAL_ECHOLNPGM("Auto"); - } -#endif // LIN_ADVANCE - void homeaxis(int axis) { #define HOMEAXIS_DO(LETTER) \ ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) @@ -3490,7 +3448,6 @@ void process_commands() starttime=millis(); break; case 25: //M25 - Pause SD print - save_print_to_eeprom(); card.pauseSDPrint(); break; case 26: //M26 - Set SD index @@ -4379,12 +4336,6 @@ Sigma_Exit: } } break; - case 110: // M110 - reset line pos - if (code_seen('N')) - gcode_LastN = code_value_long(); - else - gcode_LastN = 0; - break; case 115: // M115 if (code_seen('V')) { // Report the Prusa version number. @@ -5399,12 +5350,6 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } break; - #ifdef LIN_ADVANCE - case 900: // M900: Set LIN_ADVANCE options. - gcode_M900(); - break; - #endif - case 907: // M907 Set digital trimpot motor current using axis codes. { #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 @@ -5556,12 +5501,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } snmm_filaments_used |= (1 << tmp_extruder); //for stop print #ifdef SNMM - #ifdef LIN_ADVANCE - if (snmm_extruder != tmp_extruder) - clear_current_adv_vars(); //Check if the selected extruder is not the active one and reset LIN_ADVANCE variables if so. - #endif - - snmm_extruder = tmp_extruder; + snmm_extruder = tmp_extruder; st_synchronize(); delay(100); @@ -6659,41 +6599,3 @@ void serialecho_temperatures() { SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(""); } - - -void save_print_to_eeprom() { - - eeprom_update_dword((uint32_t*)(EEPROM_FILE_POSITION), card.get_sdpos()); - } - - void restore_print_from_eeprom() { - char cmd[30]; - char* c; - char filename[13]; - char str[5] = ".gco"; - for (int i = 0; i < 8; i++) { - filename[i] = eeprom_read_byte((uint8_t*)EEPROM_FILENAME + i); - } - filename[8] = '\0'; - MYSERIAL.print(filename); - strcat(filename, str); - sprintf_P(cmd, PSTR("M23 %s"), filename); - for (c = &cmd[4]; *c; c++) - *c = tolower(*c); - enquecommand(cmd); - uint32_t position = eeprom_read_dword((uint32_t*)(EEPROM_FILE_POSITION)); - SERIAL_ECHOPGM("Position read from eeprom:"); - MYSERIAL.println(position); - - card.setIndex(position); - enquecommand_P(PSTR("M24")); - sprintf_P(cmd, PSTR("M26 S%d"), position); - enquecommand(cmd); - } - - void position_menu() { - SERIAL_ECHOPGM("Percent done:"); - MYSERIAL.println(card.percentDone()); - SERIAL_ECHOPGM("sdpos:"); - MYSERIAL.println(card.get_sdpos()); - } \ No newline at end of file diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index ec7f3e7c5..08109366b 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -1,107 +1,106 @@ -#ifndef CARDREADER_H -#define CARDREADER_H - -#ifdef SDSUPPORT - -#define MAX_DIR_DEPTH 10 - -#include "SdFile.h" -enum LsAction {LS_SerialPrint,LS_Count,LS_GetFilename}; -class CardReader -{ -public: - CardReader(); - - void initsd(); - void write_command(char *buf); - void write_command_no_newline(char *buf); - //files auto[0-9].g on the sd card are performed in a row - //this is to delay autostart and hence the initialisaiton of the sd card to some seconds after the normal init, so the device is available quick after a reset - - void checkautostart(bool x); - void openFile(char* name,bool read,bool replace_current=true); - void openLogFile(char* name); - void removeFile(char* name); - void closefile(bool store_location=false); - void release(); - void startFileprint(); - void pauseSDPrint(); - void getStatus(); - void printingHasFinished(); - - void getfilename(uint16_t nr, const char* const match=NULL); - uint16_t getnrfilenames(); - - void getAbsFilename(char *t); - - - void ls(); - void chdir(const char * relpath); - void updir(); - void setroot(); - - - FORCE_INLINE bool isFileOpen() { return file.isOpen(); } - FORCE_INLINE bool eof() { return sdpos>=filesize ;}; - FORCE_INLINE int16_t get() { sdpos = file.curPosition();return (int16_t)file.read();}; - FORCE_INLINE void setIndex(long index) {sdpos = index;file.seekSet(index);}; - FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; - FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; - FORCE_INLINE uint32_t get_sdpos() { if (!isFileOpen()) return 0; else return(sdpos); }; - - bool ToshibaFlashAir_isEnabled() const { return card.getFlashAirCompatible(); } - void ToshibaFlashAir_enable(bool enable) { card.setFlashAirCompatible(enable); } - bool ToshibaFlashAir_GetIP(uint8_t *ip); - -public: - bool saving; - bool logging; - bool sdprinting ; - bool cardOK ; - char filename[13]; - char longFilename[LONG_FILENAME_LENGTH]; - bool filenameIsDir; - int lastnr; //last number of the autostart; -private: - SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; - uint16_t workDirDepth; - Sd2Card card; - SdVolume volume; - SdFile file; - #define SD_PROCEDURE_DEPTH 1 - #define MAXPATHNAMELENGTH (13*MAX_DIR_DEPTH+MAX_DIR_DEPTH+1) - uint8_t file_subcall_ctr; - uint32_t filespos[SD_PROCEDURE_DEPTH]; - char filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; - uint32_t filesize; - //int16_t n; - unsigned long autostart_atmillis; - uint32_t sdpos ; - - bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. - - LsAction lsAction; //stored for recursion. - int16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. - char* diveDirName; - void lsDive(const char *prepend, SdFile parent, const char * const match=NULL); -}; -extern CardReader card; -#define IS_SD_PRINTING (card.sdprinting) - -#if (SDCARDDETECT > -1) -# ifdef SDCARDDETECTINVERTED -# define IS_SD_INSERTED (READ(SDCARDDETECT)!=0) -# else -# define IS_SD_INSERTED (READ(SDCARDDETECT)==0) -# endif //SDCARDTETECTINVERTED -#else -//If we don't have a card detect line, aways asume the card is inserted -# define IS_SD_INSERTED true -#endif - -#else - -#define IS_SD_PRINTING (false) - -#endif //SDSUPPORT -#endif +#ifndef CARDREADER_H +#define CARDREADER_H + +#ifdef SDSUPPORT + +#define MAX_DIR_DEPTH 10 + +#include "SdFile.h" +enum LsAction {LS_SerialPrint,LS_Count,LS_GetFilename}; +class CardReader +{ +public: + CardReader(); + + void initsd(); + void write_command(char *buf); + void write_command_no_newline(char *buf); + //files auto[0-9].g on the sd card are performed in a row + //this is to delay autostart and hence the initialisaiton of the sd card to some seconds after the normal init, so the device is available quick after a reset + + void checkautostart(bool x); + void openFile(char* name,bool read,bool replace_current=true); + void openLogFile(char* name); + void removeFile(char* name); + void closefile(bool store_location=false); + void release(); + void startFileprint(); + void pauseSDPrint(); + void getStatus(); + void printingHasFinished(); + + void getfilename(uint16_t nr, const char* const match=NULL); + uint16_t getnrfilenames(); + + void getAbsFilename(char *t); + + + void ls(); + void chdir(const char * relpath); + void updir(); + void setroot(); + + + FORCE_INLINE bool isFileOpen() { return file.isOpen(); } + FORCE_INLINE bool eof() { return sdpos>=filesize ;}; + FORCE_INLINE int16_t get() { sdpos = file.curPosition();return (int16_t)file.read();}; + FORCE_INLINE void setIndex(long index) {sdpos = index;file.seekSet(index);}; + FORCE_INLINE uint8_t percentDone(){if(!isFileOpen()) return 0; if(filesize) return sdpos/((filesize+99)/100); else return 0;}; + FORCE_INLINE char* getWorkDirName(){workDir.getFilename(filename);return filename;}; + + bool ToshibaFlashAir_isEnabled() const { return card.getFlashAirCompatible(); } + void ToshibaFlashAir_enable(bool enable) { card.setFlashAirCompatible(enable); } + bool ToshibaFlashAir_GetIP(uint8_t *ip); + +public: + bool saving; + bool logging; + bool sdprinting ; + bool cardOK ; + char filename[13]; + char longFilename[LONG_FILENAME_LENGTH]; + bool filenameIsDir; + int lastnr; //last number of the autostart; +private: + SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; + uint16_t workDirDepth; + Sd2Card card; + SdVolume volume; + SdFile file; + #define SD_PROCEDURE_DEPTH 1 + #define MAXPATHNAMELENGTH (13*MAX_DIR_DEPTH+MAX_DIR_DEPTH+1) + uint8_t file_subcall_ctr; + uint32_t filespos[SD_PROCEDURE_DEPTH]; + char filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; + uint32_t filesize; + //int16_t n; + unsigned long autostart_atmillis; + uint32_t sdpos ; + + bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. + + LsAction lsAction; //stored for recursion. + int16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. + char* diveDirName; + void lsDive(const char *prepend, SdFile parent, const char * const match=NULL); +}; +extern CardReader card; +#define IS_SD_PRINTING (card.sdprinting) + +#if (SDCARDDETECT > -1) +# ifdef SDCARDDETECTINVERTED +# define IS_SD_INSERTED (READ(SDCARDDETECT)!=0) +# else +# define IS_SD_INSERTED (READ(SDCARDDETECT)==0) +# endif //SDCARDTETECTINVERTED +#else +//If we don't have a card detect line, aways asume the card is inserted +# define IS_SD_INSERTED true +#endif + +#else + +#define IS_SD_PRINTING (false) + +#endif //SDSUPPORT +#endif diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 0599299ed..59cbc3743 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -1,4011 +1,4011 @@ - -#include "Configuration_prusa.h" -#include "language_all.h" - -#define LCD_WIDTH 20 -extern unsigned char lang_selected; - -const char MSG_ACTIVE_EXTRUDER_EN[] PROGMEM = "Active Extruder: "; -const char * const MSG_ACTIVE_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_ACTIVE_EXTRUDER_EN -}; - -const char MSG_ADJUSTZ_EN[] PROGMEM = "Auto adjust Z?"; -const char MSG_ADJUSTZ_CZ[] PROGMEM = "Auto doladit Z ?"; -const char MSG_ADJUSTZ_IT[] PROGMEM = "Autoregolare Z?"; -const char MSG_ADJUSTZ_ES[] PROGMEM = "Ajustar Eje Z"; -const char MSG_ADJUSTZ_PL[] PROGMEM = "Autodostroic Z?"; -const char MSG_ADJUSTZ_DE[] PROGMEM = "Auto Z einstellen?"; -const char MSG_ADJUSTZ_NL[] PROGMEM = "Auto instellen 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, - MSG_ADJUSTZ_DE, - MSG_ADJUSTZ_NL -}; - -const char MSG_ALL_EN[] PROGMEM = "All"; -const char MSG_ALL_CZ[] PROGMEM = "Vse"; -const char MSG_ALL_IT[] PROGMEM = "Tutti"; -const char MSG_ALL_ES[] PROGMEM = "Todos"; -const char MSG_ALL_PL[] PROGMEM = "Wszystko"; -const char MSG_ALL_DE[] PROGMEM = "Alle"; -const char MSG_ALL_NL[] PROGMEM = "Alle"; -const char * const MSG_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_ALL_EN, - MSG_ALL_CZ, - MSG_ALL_IT, - MSG_ALL_ES, - MSG_ALL_PL, - MSG_ALL_DE, - MSG_ALL_NL -}; - -const char MSG_AMAX_EN[] PROGMEM = "Amax "; -const char * const MSG_AMAX_LANG_TABLE[1] PROGMEM = { - MSG_AMAX_EN -}; - -const char MSG_AUTHOR_EN[] PROGMEM = " | Author: "; -const char * const MSG_AUTHOR_LANG_TABLE[1] PROGMEM = { - MSG_AUTHOR_EN -}; - -const char MSG_AUTO_HOME_EN[] PROGMEM = "Auto home"; -const char MSG_AUTO_HOME_IT[] PROGMEM = "Trova origine"; -const char MSG_AUTO_HOME_ES[] PROGMEM = "Llevar al origen"; -const char MSG_AUTO_HOME_DE[] PROGMEM = "Startposition"; -const char MSG_AUTO_HOME_NL[] PROGMEM = "Startpositie"; -const char * const MSG_AUTO_HOME_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_AUTO_HOME_EN, - MSG_AUTO_HOME_EN, - MSG_AUTO_HOME_IT, - MSG_AUTO_HOME_ES, - MSG_AUTO_HOME_EN, - MSG_AUTO_HOME_DE, - MSG_AUTO_HOME_NL -}; - -const char MSG_A_RETRACT_EN[] PROGMEM = "A-retract"; -const char * const MSG_A_RETRACT_LANG_TABLE[1] PROGMEM = { - MSG_A_RETRACT_EN -}; - -const char MSG_BABYSTEPPING_X_EN[] PROGMEM = "Babystepping X"; -const char * const MSG_BABYSTEPPING_X_LANG_TABLE[1] PROGMEM = { - MSG_BABYSTEPPING_X_EN -}; - -const char MSG_BABYSTEPPING_Y_EN[] PROGMEM = "Babystepping Y"; -const char * const MSG_BABYSTEPPING_Y_LANG_TABLE[1] PROGMEM = { - MSG_BABYSTEPPING_Y_EN -}; - -const char MSG_BABYSTEPPING_Z_EN[] PROGMEM = "Adjusting Z"; -const char * const MSG_BABYSTEPPING_Z_LANG_TABLE[1] PROGMEM = { - MSG_BABYSTEPPING_Z_EN -}; - -const char MSG_BABYSTEP_X_EN[] PROGMEM = "Babystep X"; -const char * const MSG_BABYSTEP_X_LANG_TABLE[1] PROGMEM = { - MSG_BABYSTEP_X_EN -}; - -const char MSG_BABYSTEP_Y_EN[] PROGMEM = "Babystep Y"; -const char * const MSG_BABYSTEP_Y_LANG_TABLE[1] PROGMEM = { - MSG_BABYSTEP_Y_EN -}; - -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 = "Compensazione Z"; -const char MSG_BABYSTEP_Z_ES[] PROGMEM = "Micropaso Eje Z"; -const char MSG_BABYSTEP_Z_PL[] PROGMEM = "Dostrojenie osy Z"; -const char MSG_BABYSTEP_Z_DE[] PROGMEM = "Live Z einstellen"; -const char MSG_BABYSTEP_Z_NL[] PROGMEM = "Live Z aanpassen"; -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, - MSG_BABYSTEP_Z_DE, - MSG_BABYSTEP_Z_NL -}; - -const char MSG_BABYSTEP_Z_NOT_SET_EN[] PROGMEM = "Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."; -const char MSG_BABYSTEP_Z_NOT_SET_CZ[] PROGMEM = "Neni zkalibrovana vzdalenost trysky od tiskove podlozky. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy."; -const char MSG_BABYSTEP_Z_NOT_SET_IT[] PROGMEM = "Distanza tra la punta dell'ugello e la superficie del letto non ancora imposta. Si prega di seguire il manuale, capitolo First steps, sezione First layer calibration."; -const char MSG_BABYSTEP_Z_NOT_SET_ES[] PROGMEM = "Distancia entre la punta de la boquilla y la superficie de la cama no fijada aun. Por favor siga el manual, capitulo First steps, seccion First layer calibration."; -const char MSG_BABYSTEP_Z_NOT_SET_PL[] PROGMEM = "Odleglosc dyszy od podkladki nie jest skalibrowana. Postepuj zgodnie z instrukcja rozdzial Zaczynamy, podrozdzial Kalibracja pierwszej warstwy."; -const char MSG_BABYSTEP_Z_NOT_SET_DE[] PROGMEM = "Der Abstand zwischen der Spitze der Duese und der Druckoberflaeche / Bett ist noch nicht eingestellt. Bitte folgen Sie dem Handbuch, First steps, Abschnitt First layer calibration."; -const char MSG_BABYSTEP_Z_NOT_SET_NL[] PROGMEM = "Afstand tussen tip van het tuit en het print oppervlak nog niet vastgesteld. Volg de handleiding, First steps, sectie First layer calibration."; -const char * const MSG_BABYSTEP_Z_NOT_SET_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BABYSTEP_Z_NOT_SET_EN, - MSG_BABYSTEP_Z_NOT_SET_CZ, - MSG_BABYSTEP_Z_NOT_SET_IT, - MSG_BABYSTEP_Z_NOT_SET_ES, - MSG_BABYSTEP_Z_NOT_SET_PL, - MSG_BABYSTEP_Z_NOT_SET_DE, - MSG_BABYSTEP_Z_NOT_SET_NL -}; - -const char MSG_BED_EN[] PROGMEM = "Bed"; -const char MSG_BED_IT[] PROGMEM = "Letto"; -const char MSG_BED_ES[] PROGMEM = "Base"; -const char MSG_BED_PL[] PROGMEM = "Stolik"; -const char MSG_BED_DE[] PROGMEM = "Bett"; -const char * const MSG_BED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_EN, - MSG_BED_EN, - MSG_BED_IT, - MSG_BED_ES, - MSG_BED_PL, - MSG_BED_DE, - MSG_BED_EN -}; - -const char MSG_BED_CORRECTION_FRONT_EN[] PROGMEM = "Front side[um]"; -const char MSG_BED_CORRECTION_FRONT_CZ[] PROGMEM = "Vpredu [um]"; -const char MSG_BED_CORRECTION_FRONT_IT[] PROGMEM = "Fronte [um]"; -const char MSG_BED_CORRECTION_FRONT_ES[] PROGMEM = "Adelante [um]"; -const char MSG_BED_CORRECTION_FRONT_PL[] PROGMEM = "Do przodu [um]"; -const char MSG_BED_CORRECTION_FRONT_DE[] PROGMEM = "Vorne [um]"; -const char MSG_BED_CORRECTION_FRONT_NL[] PROGMEM = "Voorruit [um]"; -const char * const MSG_BED_CORRECTION_FRONT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_FRONT_EN, - MSG_BED_CORRECTION_FRONT_CZ, - MSG_BED_CORRECTION_FRONT_IT, - MSG_BED_CORRECTION_FRONT_ES, - MSG_BED_CORRECTION_FRONT_PL, - MSG_BED_CORRECTION_FRONT_DE, - MSG_BED_CORRECTION_FRONT_NL -}; - -const char MSG_BED_CORRECTION_LEFT_EN[] PROGMEM = "Left side [um]"; -const char MSG_BED_CORRECTION_LEFT_CZ[] PROGMEM = "Vlevo [um]"; -const char MSG_BED_CORRECTION_LEFT_IT[] PROGMEM = "Sinistra [um]"; -const char MSG_BED_CORRECTION_LEFT_ES[] PROGMEM = "Izquierda [um]"; -const char MSG_BED_CORRECTION_LEFT_PL[] PROGMEM = "W lewo [um]"; -const char MSG_BED_CORRECTION_LEFT_DE[] PROGMEM = "Links [um]"; -const char MSG_BED_CORRECTION_LEFT_NL[] PROGMEM = "Links [um]"; -const char * const MSG_BED_CORRECTION_LEFT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_LEFT_EN, - MSG_BED_CORRECTION_LEFT_CZ, - MSG_BED_CORRECTION_LEFT_IT, - MSG_BED_CORRECTION_LEFT_ES, - MSG_BED_CORRECTION_LEFT_PL, - MSG_BED_CORRECTION_LEFT_DE, - MSG_BED_CORRECTION_LEFT_NL -}; - -const char MSG_BED_CORRECTION_MENU_EN[] PROGMEM = "Bed level correct"; -const char MSG_BED_CORRECTION_MENU_CZ[] PROGMEM = "Korekce podlozky"; -const char MSG_BED_CORRECTION_MENU_IT[] PROGMEM = "Correz. liv.letto"; -const char MSG_BED_CORRECTION_MENU_ES[] PROGMEM = "Corr. de la cama"; -const char MSG_BED_CORRECTION_MENU_PL[] PROGMEM = "Korekta podkladki"; -const char MSG_BED_CORRECTION_MENU_DE[] PROGMEM = "Bett level korrekt"; -const char MSG_BED_CORRECTION_MENU_NL[] PROGMEM = "Bed juist"; -const char * const MSG_BED_CORRECTION_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_MENU_EN, - MSG_BED_CORRECTION_MENU_CZ, - MSG_BED_CORRECTION_MENU_IT, - MSG_BED_CORRECTION_MENU_ES, - MSG_BED_CORRECTION_MENU_PL, - MSG_BED_CORRECTION_MENU_DE, - MSG_BED_CORRECTION_MENU_NL -}; - -const char MSG_BED_CORRECTION_REAR_EN[] PROGMEM = "Rear side [um]"; -const char MSG_BED_CORRECTION_REAR_CZ[] PROGMEM = "Vzadu [um]"; -const char MSG_BED_CORRECTION_REAR_IT[] PROGMEM = "Retro [um]"; -const char MSG_BED_CORRECTION_REAR_ES[] PROGMEM = "Atras [um]"; -const char MSG_BED_CORRECTION_REAR_PL[] PROGMEM = "Do tylu [um]"; -const char MSG_BED_CORRECTION_REAR_DE[] PROGMEM = "Hinten [um]"; -const char MSG_BED_CORRECTION_REAR_NL[] PROGMEM = "Achter [um]"; -const char * const MSG_BED_CORRECTION_REAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_REAR_EN, - MSG_BED_CORRECTION_REAR_CZ, - MSG_BED_CORRECTION_REAR_IT, - MSG_BED_CORRECTION_REAR_ES, - MSG_BED_CORRECTION_REAR_PL, - MSG_BED_CORRECTION_REAR_DE, - MSG_BED_CORRECTION_REAR_NL -}; - -const char MSG_BED_CORRECTION_RESET_EN[] PROGMEM = "Reset"; -const char MSG_BED_CORRECTION_RESET_DE[] PROGMEM = "Zuruecksetzen"; -const char * const MSG_BED_CORRECTION_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_RESET_EN, - MSG_BED_CORRECTION_RESET_EN, - MSG_BED_CORRECTION_RESET_EN, - MSG_BED_CORRECTION_RESET_EN, - MSG_BED_CORRECTION_RESET_EN, - MSG_BED_CORRECTION_RESET_DE, - MSG_BED_CORRECTION_RESET_EN -}; - -const char MSG_BED_CORRECTION_RIGHT_EN[] PROGMEM = "Right side[um]"; -const char MSG_BED_CORRECTION_RIGHT_CZ[] PROGMEM = "Vpravo [um]"; -const char MSG_BED_CORRECTION_RIGHT_IT[] PROGMEM = "Destra [um]"; -const char MSG_BED_CORRECTION_RIGHT_ES[] PROGMEM = "Derecha [um]"; -const char MSG_BED_CORRECTION_RIGHT_PL[] PROGMEM = "W prawo [um]"; -const char MSG_BED_CORRECTION_RIGHT_DE[] PROGMEM = "Rechts [um]"; -const char MSG_BED_CORRECTION_RIGHT_NL[] PROGMEM = "Rechts [um]"; -const char * const MSG_BED_CORRECTION_RIGHT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_CORRECTION_RIGHT_EN, - MSG_BED_CORRECTION_RIGHT_CZ, - MSG_BED_CORRECTION_RIGHT_IT, - MSG_BED_CORRECTION_RIGHT_ES, - MSG_BED_CORRECTION_RIGHT_PL, - MSG_BED_CORRECTION_RIGHT_DE, - MSG_BED_CORRECTION_RIGHT_NL -}; - -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 preparada"; -const char MSG_BED_DONE_PL[] PROGMEM = "Stolik OK."; -const char MSG_BED_DONE_DE[] PROGMEM = "Bett OK"; -const char MSG_BED_DONE_NL[] PROGMEM = "Bed 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, - MSG_BED_DONE_DE, - MSG_BED_DONE_NL -}; - -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 = "Riscald. letto"; -const char MSG_BED_HEATING_ES[] PROGMEM = "Calentando Base"; -const char MSG_BED_HEATING_PL[] PROGMEM = "Grzanie stolika.."; -const char MSG_BED_HEATING_DE[] PROGMEM = "Bett aufheizen"; -const char MSG_BED_HEATING_NL[] PROGMEM = "Bed opwarmen"; -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, - MSG_BED_HEATING_DE, - MSG_BED_HEATING_NL -}; - -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_EN[] PROGMEM = "Bed leveling failed. Sensor triggered too high. Waiting for reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_IT[] PROGMEM = "Livellamento letto fallito.Risp sensore troppo prestoIn attesa di reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_ES[] PROGMEM = "Nivelacion fallada. Sensor funciona demasiado temprano. Esperando reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_PL[] PROGMEM = "Kalibracja Z nieudana. Sensor dotk. za wysoko. Czekam na reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor wurde zu hoch ausgeloest. Warte auf Reset."; -const char MSG_BED_LEVELING_FAILED_POINT_HIGH_NL[] PROGMEM = "Bed nivellering mislukt. Een sensor heeft te hoog getriggerd. Wacht op reset."; -const char * const MSG_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_LEVELING_FAILED_POINT_HIGH_EN, - MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ, - MSG_BED_LEVELING_FAILED_POINT_HIGH_IT, - MSG_BED_LEVELING_FAILED_POINT_HIGH_ES, - MSG_BED_LEVELING_FAILED_POINT_HIGH_PL, - MSG_BED_LEVELING_FAILED_POINT_HIGH_DE, - MSG_BED_LEVELING_FAILED_POINT_HIGH_NL -}; - -const char MSG_BED_LEVELING_FAILED_POINT_LOW_EN[] PROGMEM = "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_IT[] PROGMEM = "Livellamento letto fallito.NoRispSensor Residui su ugello? In attesa di reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_ES[] PROGMEM = "Nivelacion fallada. Sensor no funciona. Escombros en Boqui.? Esperando reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_PL[] PROGMEM = "Kalibracja nieudana. Sensor nie dotknal. Zanieczysz. dysza? Czekam na reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor wurde nicht ausgeloest. Schmutzige Duese? Warte auf Reset."; -const char MSG_BED_LEVELING_FAILED_POINT_LOW_NL[] PROGMEM = "Bed nivellering mislukt. Sensor was niet geactiveerd. Vuil op nozzle? Wacht op reset."; -const char * const MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_LEVELING_FAILED_POINT_LOW_EN, - MSG_BED_LEVELING_FAILED_POINT_LOW_CZ, - MSG_BED_LEVELING_FAILED_POINT_LOW_IT, - MSG_BED_LEVELING_FAILED_POINT_LOW_ES, - MSG_BED_LEVELING_FAILED_POINT_LOW_PL, - MSG_BED_LEVELING_FAILED_POINT_LOW_DE, - MSG_BED_LEVELING_FAILED_POINT_LOW_NL -}; - -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN[] PROGMEM = "Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_IT[] PROGMEM = "Livellamento letto fallito. Sensore discon. o Cavo Dann. In attesa di reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES[] PROGMEM = "Nivelacion fallada. Sensor desconectado o cables danados. Esperando reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL[] PROGMEM = "Kalibracja nieudana. Sensor odlaczony lub uszkodz. kabel. Czekam na reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor nicht angeschlossen oder Kabel defekt. Warte auf Reset."; -const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_NL[] PROGMEM = "Bed nivellering mislukt.Sensor niet aangesloten of kabel gebroken.Wacht op reset"; -const char * const MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_IT, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_DE, - MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration failed. Front calibration points not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delanteros no alcanzables."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Przed. punkty kalibr. zbyt do przodu. Wyrownac drukarke."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Voorzijde kalibratiepunten niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration failed. Left front calibration point not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punto anteriore sinistro non raggiungibile."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Lewy przedni punkt zbyt do przodu. Wyrownac drukarke."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Linker voderer Kalibrierpunkt nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Linksvoor kalibratiepunt niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration failed. Right front calibration point not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero derecho no alcanzable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Prawy przedni punkt zbyt do przodu. Wyrownac drukarke."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Rechtsvoor kalibratiepunt niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN[] PROGMEM = "XYZ calibration failed. Please consult the manual."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ[] PROGMEM = "Kalibrace XYZ selhala. Nahlednete do manualu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_IT[] PROGMEM = "Calibrazione XYZ fallita. Si prega di consultare il manuale."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES[] PROGMEM = "Calibracion XYZ fallada. Consultar el manual por favor."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."; -const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_NL[] PROGMEM = "XYZ kalibratie mislukt. Raadpleeg de handleiding."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_IT, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_DE, - MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN[] PROGMEM = "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_CZ[] PROGMEM = "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_IT[] PROGMEM = "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES[] PROGMEM = "Calibracion XYZ ok. Ejes X/Y perpendiculares. Felicitaciones!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL[] PROGMEM = "Kalibracja XYZ ok. Osie X/Y sa prostopadle. Gratulacje!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander. Glueckwunsch!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen staan perpendiculair. Gefeliciteerd!"; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_IT, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_DE, - MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN[] PROGMEM = "XYZ calibration failed. Bed calibration point was not found."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ[] PROGMEM = "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_IT[] PROGMEM = "Calibrazione XYZ fallita. Il punto di calibrazione sul letto non e' stato trovato."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES[] PROGMEM = "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL[] PROGMEM = "Kalibr. XYZ nieudana. Kalibracyjny punkt podkladki nieznaleziony."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."; -const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_NL[] PROGMEM = "XYZ kalibratie mislukt. Bed kalibratiepunt niet gevonden."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_IT, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_DE, - MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN[] PROGMEM = "XYZ calibration all right. Skew will be corrected automatically."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ[] PROGMEM = "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_IT[] PROGMEM = "Calibrazion XYZ corretta. La distorsione verra' automaticamente compensata."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES[] PROGMEM = "Calibracion XYZ correcta. La inclinacion se corregira automaticamente."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL[] PROGMEM = "Kalibracja XYZ prawidlowa. Skosy beda automatycznie wyrownane przy druku."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind sehr schief. Schiefheit wird automatisch korrigiert."; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen zijn heel scheef. Scheefheid wordt automatisch gecorrigeerd."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_IT, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_DE, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN[] PROGMEM = "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ[] PROGMEM = "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_IT[] PROGMEM = "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES[] PROGMEM = "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL[] PROGMEM = "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind etwas schief. Schiefheit wird automatisch korrigiert. Gut gemacht!"; -const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen zijn iets scheef. Scheefheid wordt automatisch gecorrigeerd. Goed gedaan!"; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_IT, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_DE, - MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration compromised. Front calibration points not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delanteros no alcanzables."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibr. XYZ niedokladna. Przednie punkty kalibr. Zbyt wys. do przodu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Vordere Kalibrierpunkte nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Voorzijde kalibratiepunten niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Left front calibration point not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Levy predni bod moc vpredu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punto anteriore sinistro non raggiungibile."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Linker vorderer Kalibrierpunkt nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Linksvoor kalibratiepunt niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_NL -}; - -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Right front calibration point not reachable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Rechter vorderer Kalibrierpunkt nicht erreichbar."; -const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Rechtsvoor kalibratiepunt niet bereikbaar."; -const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_IT, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_DE, - MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_NL -}; - -const char MSG_BEGIN_FILE_LIST_EN[] PROGMEM = "Begin file list"; -const char * const MSG_BEGIN_FILE_LIST_LANG_TABLE[1] PROGMEM = { - MSG_BEGIN_FILE_LIST_EN -}; - -const char MSG_BROWNOUT_RESET_EN[] PROGMEM = " Brown out Reset"; -const char * const MSG_BROWNOUT_RESET_LANG_TABLE[1] PROGMEM = { - MSG_BROWNOUT_RESET_EN -}; - -const char MSG_CALIBRATE_BED_EN[] PROGMEM = "Calibrate XYZ"; -const char MSG_CALIBRATE_BED_CZ[] PROGMEM = "Kalibrace XYZ"; -const char MSG_CALIBRATE_BED_IT[] PROGMEM = "Calibra XYZ"; -const char MSG_CALIBRATE_BED_ES[] PROGMEM = "Calibra XYZ"; -const char MSG_CALIBRATE_BED_PL[] PROGMEM = "Kalibracja XYZ"; -const char MSG_CALIBRATE_BED_DE[] PROGMEM = "Kalibrierung XYZ"; -const char MSG_CALIBRATE_BED_NL[] PROGMEM = "Kalibratie XYZ"; -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, - MSG_CALIBRATE_BED_DE, - MSG_CALIBRATE_BED_NL -}; - -const char MSG_CALIBRATE_BED_RESET_EN[] PROGMEM = "Reset XYZ calibr."; -const char MSG_CALIBRATE_BED_RESET_CZ[] PROGMEM = "Reset XYZ kalibr."; -const char MSG_CALIBRATE_BED_RESET_PL[] PROGMEM = "Reset kalibr. XYZ"; -const char MSG_CALIBRATE_BED_RESET_DE[] PROGMEM = "Reset XYZ Kalibr."; -const char MSG_CALIBRATE_BED_RESET_NL[] PROGMEM = "Reset XYZ kalibr."; -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_EN, - MSG_CALIBRATE_BED_RESET_EN, - MSG_CALIBRATE_BED_RESET_PL, - MSG_CALIBRATE_BED_RESET_DE, - MSG_CALIBRATE_BED_RESET_NL -}; - -const char MSG_CALIBRATE_E_EN[] PROGMEM = "Calibrate E"; -const char MSG_CALIBRATE_E_CZ[] PROGMEM = "Kalibrovat E"; -const char MSG_CALIBRATE_E_IT[] PROGMEM = "Calibra E"; -const char MSG_CALIBRATE_E_ES[] PROGMEM = "Calibrar E"; -const char MSG_CALIBRATE_E_PL[] PROGMEM = "Kalibruj E"; -const char MSG_CALIBRATE_E_DE[] PROGMEM = "Kalibriere E"; -const char MSG_CALIBRATE_E_NL[] PROGMEM = "Kalibratie E"; -const char * const MSG_CALIBRATE_E_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CALIBRATE_E_EN, - MSG_CALIBRATE_E_CZ, - MSG_CALIBRATE_E_IT, - MSG_CALIBRATE_E_ES, - MSG_CALIBRATE_E_PL, - MSG_CALIBRATE_E_DE, - MSG_CALIBRATE_E_NL -}; - -const char MSG_CALIBRATE_PINDA_EN[] PROGMEM = "PINDA Temp. cal."; -const char MSG_CALIBRATE_PINDA_CZ[] PROGMEM = "Zkalibrovat"; -const char MSG_CALIBRATE_PINDA_IT[] PROGMEM = "Calibrare"; -const char MSG_CALIBRATE_PINDA_ES[] PROGMEM = "Calibrar"; -const char MSG_CALIBRATE_PINDA_PL[] PROGMEM = "Skalibrowac"; -const char MSG_CALIBRATE_PINDA_DE[] PROGMEM = "PINDA Temp. Kal."; -const char MSG_CALIBRATE_PINDA_NL[] PROGMEM = "PINDA Temp. kal."; -const char * const MSG_CALIBRATE_PINDA_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CALIBRATE_PINDA_EN, - MSG_CALIBRATE_PINDA_CZ, - MSG_CALIBRATE_PINDA_IT, - MSG_CALIBRATE_PINDA_ES, - MSG_CALIBRATE_PINDA_PL, - MSG_CALIBRATE_PINDA_DE, - MSG_CALIBRATE_PINDA_NL -}; - -const char MSG_CALIBRATION_PINDA_MENU_EN[] PROGMEM = "PINDA Temp. cal."; -const char MSG_CALIBRATION_PINDA_MENU_CZ[] PROGMEM = "Teplot. kalibrace"; -const char MSG_CALIBRATION_PINDA_MENU_IT[] PROGMEM = "Taratura temp."; -const char MSG_CALIBRATION_PINDA_MENU_ES[] PROGMEM = "Calibracion temp."; -const char MSG_CALIBRATION_PINDA_MENU_PL[] PROGMEM = "Cieplna kalibr."; -const char MSG_CALIBRATION_PINDA_MENU_DE[] PROGMEM = "PINDA Temp. Kal."; -const char MSG_CALIBRATION_PINDA_MENU_NL[] PROGMEM = "PINDA Temp. kal."; -const char * const MSG_CALIBRATION_PINDA_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CALIBRATION_PINDA_MENU_EN, - MSG_CALIBRATION_PINDA_MENU_CZ, - MSG_CALIBRATION_PINDA_MENU_IT, - MSG_CALIBRATION_PINDA_MENU_ES, - MSG_CALIBRATION_PINDA_MENU_PL, - MSG_CALIBRATION_PINDA_MENU_DE, - MSG_CALIBRATION_PINDA_MENU_NL -}; - -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 = "Stampa da SD"; -const char MSG_CARD_MENU_ES[] PROGMEM = "Menu tarjeta SD"; -const char MSG_CARD_MENU_PL[] PROGMEM = "Druk z SD"; -const char MSG_CARD_MENU_DE[] PROGMEM = "Drucken von SD"; -const char MSG_CARD_MENU_NL[] PROGMEM = "Print van 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, - MSG_CARD_MENU_DE, - MSG_CARD_MENU_NL -}; - -const char MSG_CENTER_EN[] PROGMEM = "Center:"; -const char MSG_CENTER_CZ[] PROGMEM = "Stred:"; -const char MSG_CENTER_IT[] PROGMEM = "Centro:"; -const char MSG_CENTER_ES[] PROGMEM = "Centro:"; -const char MSG_CENTER_PL[] PROGMEM = "Srodek:"; -const char MSG_CENTER_DE[] PROGMEM = "Mitte:"; -const char MSG_CENTER_NL[] PROGMEM = "Centrum:"; -const char * const MSG_CENTER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CENTER_EN, - MSG_CENTER_CZ, - MSG_CENTER_IT, - MSG_CENTER_ES, - MSG_CENTER_PL, - MSG_CENTER_DE, - MSG_CENTER_NL -}; - -const char MSG_CHANGE_EXTR_EN[] PROGMEM = "Change extruder"; -const char MSG_CHANGE_EXTR_CZ[] PROGMEM = "Zmenit extruder"; -const char MSG_CHANGE_EXTR_IT[] PROGMEM = "Cambio estrusore."; -const char MSG_CHANGE_EXTR_ES[] PROGMEM = "Cambiar extrusor."; -const char MSG_CHANGE_EXTR_PL[] PROGMEM = "Zmienic ekstruder"; -const char MSG_CHANGE_EXTR_DE[] PROGMEM = "Wechsel extruder"; -const char MSG_CHANGE_EXTR_NL[] PROGMEM = "Wissel extruder"; -const char * const MSG_CHANGE_EXTR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CHANGE_EXTR_EN, - MSG_CHANGE_EXTR_CZ, - MSG_CHANGE_EXTR_IT, - MSG_CHANGE_EXTR_ES, - MSG_CHANGE_EXTR_PL, - MSG_CHANGE_EXTR_DE, - MSG_CHANGE_EXTR_NL -}; - -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 = "Cambio riuscito!"; -const char MSG_CHANGE_SUCCESS_ES[] PROGMEM = "Cambio correcto"; -const char MSG_CHANGE_SUCCESS_PL[] PROGMEM = "Wymiana ok!"; -const char MSG_CHANGE_SUCCESS_DE[] PROGMEM = "Wechsel erfolgreich!"; -const char MSG_CHANGE_SUCCESS_NL[] PROGMEM = "Wissel succesvol!"; -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, - MSG_CHANGE_SUCCESS_DE, - MSG_CHANGE_SUCCESS_NL -}; - -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 = "Cambiando filam."; -const char MSG_CHANGING_FILAMENT_ES[] PROGMEM = "Cambiando filamento"; -const char MSG_CHANGING_FILAMENT_PL[] PROGMEM = "Wymiana filamentu"; -const char MSG_CHANGING_FILAMENT_DE[] PROGMEM = "Filament-Wechsel!"; -const char MSG_CHANGING_FILAMENT_NL[] PROGMEM = "Wissel filament!"; -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, - MSG_CHANGING_FILAMENT_DE, - MSG_CHANGING_FILAMENT_NL -}; - -const char MSG_CHOOSE_EXTRUDER_EN[] PROGMEM = "Choose extruder:"; -const char MSG_CHOOSE_EXTRUDER_CZ[] PROGMEM = "Vyberte extruder:"; -const char MSG_CHOOSE_EXTRUDER_IT[] PROGMEM = "Seleziona estrusore:"; -const char MSG_CHOOSE_EXTRUDER_ES[] PROGMEM = "Elegir extrusor:"; -const char MSG_CHOOSE_EXTRUDER_PL[] PROGMEM = "Wybierz ekstruder"; -const char MSG_CHOOSE_EXTRUDER_DE[] PROGMEM = "Waehlen Sie Extruder"; -const char MSG_CHOOSE_EXTRUDER_NL[] PROGMEM = "Kies Extruder"; -const char * const MSG_CHOOSE_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CHOOSE_EXTRUDER_EN, - MSG_CHOOSE_EXTRUDER_CZ, - MSG_CHOOSE_EXTRUDER_IT, - MSG_CHOOSE_EXTRUDER_ES, - MSG_CHOOSE_EXTRUDER_PL, - MSG_CHOOSE_EXTRUDER_DE, - MSG_CHOOSE_EXTRUDER_NL -}; - -const char MSG_CLEAN_NOZZLE_E_EN[] PROGMEM = "E calibration finished. Please clean the nozzle. Click when done."; -const char MSG_CLEAN_NOZZLE_E_CZ[] PROGMEM = "E kalibrace ukoncena. Prosim ocistete trysku. Po te potvrdte tlacitkem."; -const char MSG_CLEAN_NOZZLE_E_IT[] PROGMEM = "Calibrazione E terminata. Si prega di pulire l'ugello. Click per continuare."; -const char MSG_CLEAN_NOZZLE_E_ES[] PROGMEM = "E calibrado. Limpiar la boquilla. Haga clic una vez terminado."; -const char MSG_CLEAN_NOZZLE_E_PL[] PROGMEM = "Kalibracja E skonczona. Prosze oczyscic dysze. Potem potwierdzic przyciskiem. "; -const char MSG_CLEAN_NOZZLE_E_DE[] PROGMEM = "E-Kalibrierung beendet. Bitte reinigen Sie die Duese. Klicken wenn fertig."; -const char MSG_CLEAN_NOZZLE_E_NL[] PROGMEM = "E kalibratie voltooid. Reinig het tuit. Klik op als klaar."; -const char * const MSG_CLEAN_NOZZLE_E_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CLEAN_NOZZLE_E_EN, - MSG_CLEAN_NOZZLE_E_CZ, - MSG_CLEAN_NOZZLE_E_IT, - MSG_CLEAN_NOZZLE_E_ES, - MSG_CLEAN_NOZZLE_E_PL, - MSG_CLEAN_NOZZLE_E_DE, - MSG_CLEAN_NOZZLE_E_NL -}; - -const char MSG_CNG_SDCARD_EN[] PROGMEM = "Change SD card"; -const char * const MSG_CNG_SDCARD_LANG_TABLE[1] PROGMEM = { - MSG_CNG_SDCARD_EN -}; - -const char MSG_CONFIGURATION_VER_EN[] PROGMEM = " Last Updated: "; -const char * const MSG_CONFIGURATION_VER_LANG_TABLE[1] PROGMEM = { - MSG_CONFIGURATION_VER_EN -}; - -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN[] PROGMEM = "Are left and right Z~carriages all up?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ[] PROGMEM = "Dojely oba Z voziky k~hornimu dorazu?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_IT[] PROGMEM = "I carrelli Z sin/des sono altezza max?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES[] PROGMEM = "Carros Z izq./der. estan arriba maximo?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL[] PROGMEM = "Oba wozki dojechaly do gornej ramy?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_DE[] PROGMEM = "Sind beide Z Schlitten ganz oben?"; -const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_NL[] PROGMEM = "Zijn beide Z wagen heelemaal boven?"; -const char * const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_IT, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_DE, - MSG_CONFIRM_CARRIAGE_AT_THE_TOP_NL -}; - -const char MSG_CONFIRM_NOZZLE_CLEAN_EN[] PROGMEM = "Please clean the nozzle for calibration. Click when done."; -const char MSG_CONFIRM_NOZZLE_CLEAN_CZ[] PROGMEM = "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."; -const char MSG_CONFIRM_NOZZLE_CLEAN_IT[] PROGMEM = "Pulire l'ugello per la calibrazione, poi fare click."; -const char MSG_CONFIRM_NOZZLE_CLEAN_ES[] PROGMEM = "Limpiar boquilla para calibracion. Click cuando acabes."; -const char MSG_CONFIRM_NOZZLE_CLEAN_PL[] PROGMEM = "Dla prawidl. kalibracji prosze oczyscic dysze. Potw. guzikiem."; -const char MSG_CONFIRM_NOZZLE_CLEAN_DE[] PROGMEM = "Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber."; -const char MSG_CONFIRM_NOZZLE_CLEAN_NL[] PROGMEM = "Reinig het tuit voor de kalibratie aub. Klik als klaar."; -const char * const MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CONFIRM_NOZZLE_CLEAN_EN, - MSG_CONFIRM_NOZZLE_CLEAN_CZ, - MSG_CONFIRM_NOZZLE_CLEAN_IT, - MSG_CONFIRM_NOZZLE_CLEAN_ES, - MSG_CONFIRM_NOZZLE_CLEAN_PL, - MSG_CONFIRM_NOZZLE_CLEAN_DE, - MSG_CONFIRM_NOZZLE_CLEAN_NL -}; - -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_EN[] PROGMEM = "Filaments are now adjusted. Please clean the nozzle for calibration. Click when done."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_CZ[] PROGMEM = "Filamenty jsou srovnany. Pro uspesnou kalibraci prosim ocistete trysku. Po te potvrdte tlacitkem."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_IT[] PROGMEM = "I filamenti sono regolati. Si prega di pulire l'ugello per la calibrazione. Click per continuare."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_ES[] PROGMEM = "Filamentos ajustados. Limpie la boquilla para calibracion. Haga clic una vez terminado."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_PL[] PROGMEM = "Dla prawidlowej kalibracji prosze oczyscic dysze. Potem potwierdzic przyciskiem."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_DE[] PROGMEM = "Filamente sind jetzt eingestellt. Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber."; -const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_NL[] PROGMEM = "Filamenten zijn nu ingesteld. Reinig het tuit voor de kalibratie. Klik als klaar."; -const char * const MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_EN, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_CZ, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_IT, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_ES, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_PL, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_DE, - MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_NL -}; - -const char MSG_CONTROL_EN[] PROGMEM = "Control"; -const char * const MSG_CONTROL_LANG_TABLE[1] PROGMEM = { - MSG_CONTROL_EN -}; - -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 MSG_COOLDOWN_DE[] PROGMEM = "Abkuehlen"; -const char MSG_COOLDOWN_NL[] PROGMEM = "Afkoelen"; -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, - MSG_COOLDOWN_DE, - MSG_COOLDOWN_NL -}; - -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 correct.?"; -const char MSG_CORRECTLY_PL[] PROGMEM = "Wymiana ok?"; -const char MSG_CORRECTLY_DE[] PROGMEM = "Wechsel ok?"; -const char MSG_CORRECTLY_NL[] PROGMEM = "Wissel 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, - MSG_CORRECTLY_DE, - MSG_CORRECTLY_NL -}; - -const char MSG_COUNT_X_EN[] PROGMEM = " Count X: "; -const char * const MSG_COUNT_X_LANG_TABLE[1] PROGMEM = { - MSG_COUNT_X_EN -}; - -const char MSG_CURRENT_EN[] PROGMEM = "Current"; -const char MSG_CURRENT_CZ[] PROGMEM = "Pouze aktualni"; -const char MSG_CURRENT_IT[] PROGMEM = "Attuale"; -const char MSG_CURRENT_ES[] PROGMEM = "Actual"; -const char MSG_CURRENT_PL[] PROGMEM = "Tylko aktualne"; -const char MSG_CURRENT_DE[] PROGMEM = "Aktuelles"; -const char MSG_CURRENT_NL[] PROGMEM = "Actueel"; -const char * const MSG_CURRENT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_CURRENT_EN, - MSG_CURRENT_CZ, - MSG_CURRENT_IT, - MSG_CURRENT_ES, - MSG_CURRENT_PL, - MSG_CURRENT_DE, - MSG_CURRENT_NL -}; - -const char MSG_DATE_EN[] PROGMEM = "Date:"; -const char MSG_DATE_CZ[] PROGMEM = "Datum:"; -const char MSG_DATE_IT[] PROGMEM = "Data"; -const char MSG_DATE_ES[] PROGMEM = "Fecha:"; -const char MSG_DATE_PL[] PROGMEM = "Data:"; -const char MSG_DATE_DE[] PROGMEM = "Datum:"; -const char MSG_DATE_NL[] PROGMEM = "Datum:"; -const char * const MSG_DATE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_DATE_EN, - MSG_DATE_CZ, - MSG_DATE_IT, - MSG_DATE_ES, - MSG_DATE_PL, - MSG_DATE_DE, - MSG_DATE_NL -}; - -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 = "Disabilit motori"; -const char MSG_DISABLE_STEPPERS_ES[] PROGMEM = "Apagar motores"; -const char MSG_DISABLE_STEPPERS_PL[] PROGMEM = "Wylaczyc silniki"; -const char MSG_DISABLE_STEPPERS_DE[] PROGMEM = "Motoren aus"; -const char MSG_DISABLE_STEPPERS_NL[] PROGMEM = "Motoren uit"; -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, - MSG_DISABLE_STEPPERS_DE, - MSG_DISABLE_STEPPERS_NL -}; - -const char MSG_DWELL_EN[] PROGMEM = "Sleep..."; -const char MSG_DWELL_IT[] PROGMEM = "Sospensione..."; -const char MSG_DWELL_ES[] PROGMEM = "En espera"; -const char MSG_DWELL_DE[] PROGMEM = "Warten..."; -const char MSG_DWELL_NL[] PROGMEM = "Slapen..."; -const char * const MSG_DWELL_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_DWELL_EN, - MSG_DWELL_EN, - MSG_DWELL_IT, - MSG_DWELL_ES, - MSG_DWELL_EN, - MSG_DWELL_DE, - MSG_DWELL_NL -}; - -const char MSG_ENDSTOPS_HIT_EN[] PROGMEM = "endstops hit: "; -const char * const MSG_ENDSTOPS_HIT_LANG_TABLE[1] PROGMEM = { - MSG_ENDSTOPS_HIT_EN -}; - -const char MSG_ENDSTOP_HIT_EN[] PROGMEM = "TRIGGERED"; -const char * const MSG_ENDSTOP_HIT_LANG_TABLE[1] PROGMEM = { - MSG_ENDSTOP_HIT_EN -}; - -const char MSG_ENDSTOP_OPEN_EN[] PROGMEM = "open"; -const char * const MSG_ENDSTOP_OPEN_LANG_TABLE[1] PROGMEM = { - MSG_ENDSTOP_OPEN_EN -}; - -const char MSG_END_FILE_LIST_EN[] PROGMEM = "End file list"; -const char * const MSG_END_FILE_LIST_LANG_TABLE[1] PROGMEM = { - MSG_END_FILE_LIST_EN -}; - -const char MSG_ERROR_EN[] PROGMEM = "ERROR:"; -const char MSG_ERROR_CZ[] PROGMEM = "CHYBA:"; -const char MSG_ERROR_IT[] PROGMEM = "ERRORE:"; -const char MSG_ERROR_PL[] PROGMEM = "BLAD:"; -const char MSG_ERROR_DE[] PROGMEM = "FEHLER:"; -const char MSG_ERROR_NL[] PROGMEM = "FOUT:"; -const char * const MSG_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_ERROR_EN, - MSG_ERROR_CZ, - MSG_ERROR_IT, - MSG_ERROR_EN, - MSG_ERROR_PL, - MSG_ERROR_DE, - MSG_ERROR_NL -}; - -const char MSG_ERR_CHECKSUM_MISMATCH_EN[] PROGMEM = "checksum mismatch, Last Line: "; -const char * const MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE[1] PROGMEM = { - MSG_ERR_CHECKSUM_MISMATCH_EN -}; - -const char MSG_ERR_COLD_EXTRUDE_STOP_EN[] PROGMEM = " cold extrusion prevented"; -const char * const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[1] PROGMEM = { - MSG_ERR_COLD_EXTRUDE_STOP_EN -}; - -const char MSG_ERR_KILLED_EN[] PROGMEM = "Printer halted. kill() called!"; -const char * const MSG_ERR_KILLED_LANG_TABLE[1] PROGMEM = { - MSG_ERR_KILLED_EN -}; - -const char MSG_ERR_LINE_NO_EN[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; -const char * const MSG_ERR_LINE_NO_LANG_TABLE[1] PROGMEM = { - MSG_ERR_LINE_NO_EN -}; - -const char MSG_ERR_LONG_EXTRUDE_STOP_EN[] PROGMEM = " too long extrusion prevented"; -const char * const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[1] PROGMEM = { - MSG_ERR_LONG_EXTRUDE_STOP_EN -}; - -const char MSG_ERR_NO_CHECKSUM_EN[] PROGMEM = "No Checksum with line number, Last Line: "; -const char * const MSG_ERR_NO_CHECKSUM_LANG_TABLE[1] PROGMEM = { - MSG_ERR_NO_CHECKSUM_EN -}; - -const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN[] PROGMEM = "No Line Number with checksum, Last Line: "; -const char * const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[1] PROGMEM = { - MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN -}; - -const char MSG_ERR_NO_THERMISTORS_EN[] PROGMEM = "No thermistors - no temperature"; -const char * const MSG_ERR_NO_THERMISTORS_LANG_TABLE[1] PROGMEM = { - MSG_ERR_NO_THERMISTORS_EN -}; - -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 * const MSG_ERR_STOPPED_LANG_TABLE[1] PROGMEM = { - MSG_ERR_STOPPED_EN -}; - -const char MSG_EXTERNAL_RESET_EN[] PROGMEM = " External Reset"; -const char * const MSG_EXTERNAL_RESET_LANG_TABLE[1] PROGMEM = { - MSG_EXTERNAL_RESET_EN -}; - -const char MSG_EXTRUDER_EN[] PROGMEM = "Extruder"; -const char MSG_EXTRUDER_IT[] PROGMEM = "Estrusore"; -const char MSG_EXTRUDER_ES[] PROGMEM = "Extrusor"; -const char MSG_EXTRUDER_PL[] PROGMEM = "Ekstruder"; -const char * const MSG_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_EXTRUDER_EN, - MSG_EXTRUDER_EN, - MSG_EXTRUDER_IT, - MSG_EXTRUDER_ES, - MSG_EXTRUDER_PL, - MSG_EXTRUDER_EN, - MSG_EXTRUDER_EN -}; - -const char MSG_EXTRUDER_1_EN[] PROGMEM = "Extruder 1"; -const char MSG_EXTRUDER_1_IT[] PROGMEM = "Estrusore 1"; -const char MSG_EXTRUDER_1_ES[] PROGMEM = "Extrusor 1"; -const char MSG_EXTRUDER_1_PL[] PROGMEM = "Ekstruder 1"; -const char * const MSG_EXTRUDER_1_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_EXTRUDER_1_EN, - MSG_EXTRUDER_1_EN, - MSG_EXTRUDER_1_IT, - MSG_EXTRUDER_1_ES, - MSG_EXTRUDER_1_PL, - MSG_EXTRUDER_1_EN, - MSG_EXTRUDER_1_EN -}; - -const char MSG_EXTRUDER_2_EN[] PROGMEM = "Extruder 2"; -const char MSG_EXTRUDER_2_IT[] PROGMEM = "Estrusore 2"; -const char MSG_EXTRUDER_2_ES[] PROGMEM = "Extrusor 2"; -const char MSG_EXTRUDER_2_PL[] PROGMEM = "Ekstruder 2"; -const char * const MSG_EXTRUDER_2_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_EXTRUDER_2_EN, - MSG_EXTRUDER_2_EN, - MSG_EXTRUDER_2_IT, - MSG_EXTRUDER_2_ES, - MSG_EXTRUDER_2_PL, - MSG_EXTRUDER_2_EN, - MSG_EXTRUDER_2_EN -}; - -const char MSG_EXTRUDER_3_EN[] PROGMEM = "Extruder 3"; -const char MSG_EXTRUDER_3_IT[] PROGMEM = "Estrusore 3"; -const char MSG_EXTRUDER_3_ES[] PROGMEM = "Extrusor 3"; -const char MSG_EXTRUDER_3_PL[] PROGMEM = "Ekstruder 3"; -const char * const MSG_EXTRUDER_3_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_EXTRUDER_3_EN, - MSG_EXTRUDER_3_EN, - MSG_EXTRUDER_3_IT, - MSG_EXTRUDER_3_ES, - MSG_EXTRUDER_3_PL, - MSG_EXTRUDER_3_EN, - MSG_EXTRUDER_3_EN -}; - -const char MSG_EXTRUDER_4_EN[] PROGMEM = "Extruder 4"; -const char MSG_EXTRUDER_4_IT[] PROGMEM = "Estrusore 4"; -const char MSG_EXTRUDER_4_ES[] PROGMEM = "Extrusor 4"; -const char MSG_EXTRUDER_4_PL[] PROGMEM = "Ekstruder 4"; -const char * const MSG_EXTRUDER_4_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_EXTRUDER_4_EN, - MSG_EXTRUDER_4_EN, - MSG_EXTRUDER_4_IT, - MSG_EXTRUDER_4_ES, - MSG_EXTRUDER_4_PL, - MSG_EXTRUDER_4_EN, - MSG_EXTRUDER_4_EN -}; - -const char MSG_E_CAL_KNOB_EN[] PROGMEM = "Rotate knob until mark reaches extruder body. Click when done."; -const char MSG_E_CAL_KNOB_CZ[] PROGMEM = "Otacejte tlacitkem dokud znacka nedosahne tela extruderu. Potvrdte tlacitkem."; -const char MSG_E_CAL_KNOB_IT[] PROGMEM = "Girare la manopola affinche' il segno raggiunga il corpo dell'estrusore. Click per continuare."; -const char MSG_E_CAL_KNOB_ES[] PROGMEM = "Rotar el mando hasta que la marca llegue al cuerpo del extrusor. Haga clic una vez terminado."; -const char MSG_E_CAL_KNOB_PL[] PROGMEM = "Prosze otaczac przycisk poki znacznik nie dosiegnie ciala ekstrudera. Potwierdzic przyciskiem."; -const char MSG_E_CAL_KNOB_DE[] PROGMEM = "Knopf drehen bis die Filamentmarkierung erreicht ist. Klicken wenn fertig."; -const char MSG_E_CAL_KNOB_NL[] PROGMEM = "Draai knop tot mark extruder bereikt is. Klik als klaar."; -const char * const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_E_CAL_KNOB_EN, - MSG_E_CAL_KNOB_CZ, - MSG_E_CAL_KNOB_IT, - MSG_E_CAL_KNOB_ES, - MSG_E_CAL_KNOB_PL, - MSG_E_CAL_KNOB_DE, - MSG_E_CAL_KNOB_NL -}; - -const char MSG_Enqueing_EN[] PROGMEM = "enqueing \""; -const char * const MSG_Enqueing_LANG_TABLE[1] PROGMEM = { - MSG_Enqueing_EN -}; - -const char MSG_FACTOR_EN[] PROGMEM = " \002 Fact"; -const char * const MSG_FACTOR_LANG_TABLE[1] PROGMEM = { - MSG_FACTOR_EN -}; - -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 = "Velocita vent."; -const char MSG_FAN_SPEED_ES[] PROGMEM = "Velocidad Vent."; -const char MSG_FAN_SPEED_PL[] PROGMEM = "Predkosc went."; -const char MSG_FAN_SPEED_DE[] PROGMEM = "Luefter-Tempo"; -const char MSG_FAN_SPEED_NL[] PROGMEM = "Fan snelheid"; -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, - MSG_FAN_SPEED_DE, - MSG_FAN_SPEED_NL -}; - -const char MSG_FARM_CARD_MENU_EN[] PROGMEM = "Farm mode print"; -const char * const MSG_FARM_CARD_MENU_LANG_TABLE[1] PROGMEM = { - MSG_FARM_CARD_MENU_EN -}; - -const char MSG_FILAMENTCHANGE_EN[] PROGMEM = "Change filament"; -const char MSG_FILAMENTCHANGE_CZ[] PROGMEM = "Vymenit filament"; -const char MSG_FILAMENTCHANGE_IT[] PROGMEM = "Camb. filamento"; -const char MSG_FILAMENTCHANGE_ES[] PROGMEM = "Cambiar filamento"; -const char MSG_FILAMENTCHANGE_PL[] PROGMEM = "Wymienic filament"; -const char MSG_FILAMENTCHANGE_DE[] PROGMEM = "Filament-Wechsel"; -const char MSG_FILAMENTCHANGE_NL[] PROGMEM = "Wissel 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, - MSG_FILAMENTCHANGE_DE, - MSG_FILAMENTCHANGE_NL -}; - -const char MSG_FILAMENT_CLEAN_EN[] PROGMEM = "Is color clear?"; -const char MSG_FILAMENT_CLEAN_CZ[] PROGMEM = "Je barva cista?"; -const char MSG_FILAMENT_CLEAN_IT[] PROGMEM = "Il colore e' nitido?"; -const char MSG_FILAMENT_CLEAN_ES[] PROGMEM = "Es el nuevo color nitido?"; -const char MSG_FILAMENT_CLEAN_PL[] PROGMEM = "Czy kolor jest czysty?"; -const char MSG_FILAMENT_CLEAN_DE[] PROGMEM = "Ist Farbe rein?"; -const char MSG_FILAMENT_CLEAN_NL[] PROGMEM = "Is kleur zuiver?"; -const char * const MSG_FILAMENT_CLEAN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FILAMENT_CLEAN_EN, - MSG_FILAMENT_CLEAN_CZ, - MSG_FILAMENT_CLEAN_IT, - MSG_FILAMENT_CLEAN_ES, - MSG_FILAMENT_CLEAN_PL, - MSG_FILAMENT_CLEAN_DE, - MSG_FILAMENT_CLEAN_NL -}; - -const char MSG_FILAMENT_LOADING_T0_EN[] PROGMEM = "Insert filament into extruder 1. Click when done."; -const char MSG_FILAMENT_LOADING_T0_CZ[] PROGMEM = "Vlozte filament do extruderu 1. Potvrdte tlacitkem."; -const char MSG_FILAMENT_LOADING_T0_IT[] PROGMEM = "Inserire filamento nell'estrusore 1. Click per continuare."; -const char MSG_FILAMENT_LOADING_T0_ES[] PROGMEM = "Insertar filamento en el extrusor 1. Haga clic una vez terminado."; -const char MSG_FILAMENT_LOADING_T0_PL[] PROGMEM = "Wloz filament do ekstrudera 1. Potwierdz przyciskiem."; -const char MSG_FILAMENT_LOADING_T0_DE[] PROGMEM = "Filament in extruder 1 einlegen. Klicken wenn fertig."; -const char MSG_FILAMENT_LOADING_T0_NL[] PROGMEM = "Steek filament in de extruder 1. Klik als klaar."; -const char * const MSG_FILAMENT_LOADING_T0_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FILAMENT_LOADING_T0_EN, - MSG_FILAMENT_LOADING_T0_CZ, - MSG_FILAMENT_LOADING_T0_IT, - MSG_FILAMENT_LOADING_T0_ES, - MSG_FILAMENT_LOADING_T0_PL, - MSG_FILAMENT_LOADING_T0_DE, - MSG_FILAMENT_LOADING_T0_NL -}; - -const char MSG_FILAMENT_LOADING_T1_EN[] PROGMEM = "Insert filament into extruder 2. Click when done."; -const char MSG_FILAMENT_LOADING_T1_CZ[] PROGMEM = "Vlozte filament do extruderu 2. Potvrdte tlacitkem."; -const char MSG_FILAMENT_LOADING_T1_IT[] PROGMEM = "Inserire filamento nell'estrusore 2. Click per continuare."; -const char MSG_FILAMENT_LOADING_T1_ES[] PROGMEM = "Insertar filamento en el extrusor 2. Haga clic una vez terminado."; -const char MSG_FILAMENT_LOADING_T1_PL[] PROGMEM = "Wloz filament do ekstrudera 2. Potwierdz przyciskiem."; -const char MSG_FILAMENT_LOADING_T1_DE[] PROGMEM = "Filament in extruder 2 einlegen. Klicken wenn fertig."; -const char MSG_FILAMENT_LOADING_T1_NL[] PROGMEM = "Steek filament in de extruder 2. Klik als klaar."; -const char * const MSG_FILAMENT_LOADING_T1_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FILAMENT_LOADING_T1_EN, - MSG_FILAMENT_LOADING_T1_CZ, - MSG_FILAMENT_LOADING_T1_IT, - MSG_FILAMENT_LOADING_T1_ES, - MSG_FILAMENT_LOADING_T1_PL, - MSG_FILAMENT_LOADING_T1_DE, - MSG_FILAMENT_LOADING_T1_NL -}; - -const char MSG_FILAMENT_LOADING_T2_EN[] PROGMEM = "Insert filament into extruder 3. Click when done."; -const char MSG_FILAMENT_LOADING_T2_CZ[] PROGMEM = "Vlozte filament do extruderu 3. Potvrdte tlacitkem."; -const char MSG_FILAMENT_LOADING_T2_IT[] PROGMEM = "Inserire filamento nell'estrusore 3. Click per continuare."; -const char MSG_FILAMENT_LOADING_T2_ES[] PROGMEM = "Insertar filamento en el extrusor 3. Haga clic una vez terminado."; -const char MSG_FILAMENT_LOADING_T2_PL[] PROGMEM = "Wloz filament do ekstrudera 3. Potwierdz przyciskiem."; -const char MSG_FILAMENT_LOADING_T2_DE[] PROGMEM = "Filament in extruder 3 einlegen. Klicken wenn fertig."; -const char MSG_FILAMENT_LOADING_T2_NL[] PROGMEM = "Steek filament in de extruder 3. Klik als klaar."; -const char * const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FILAMENT_LOADING_T2_EN, - MSG_FILAMENT_LOADING_T2_CZ, - MSG_FILAMENT_LOADING_T2_IT, - MSG_FILAMENT_LOADING_T2_ES, - MSG_FILAMENT_LOADING_T2_PL, - MSG_FILAMENT_LOADING_T2_DE, - MSG_FILAMENT_LOADING_T2_NL -}; - -const char MSG_FILAMENT_LOADING_T3_EN[] PROGMEM = "Insert filament into extruder 4. Click when done."; -const char MSG_FILAMENT_LOADING_T3_CZ[] PROGMEM = "Vlozte filament do extruderu 4. Potvrdte tlacitkem."; -const char MSG_FILAMENT_LOADING_T3_IT[] PROGMEM = "Inserire filamento nell'estrusore 4. Click per continuare."; -const char MSG_FILAMENT_LOADING_T3_ES[] PROGMEM = "Insertar filamento en el extrusor 4. Haga clic una vez terminado."; -const char MSG_FILAMENT_LOADING_T3_PL[] PROGMEM = "Wloz filament do ekstrudera 4. Potwierdz przyciskiem."; -const char MSG_FILAMENT_LOADING_T3_DE[] PROGMEM = "Filament in extruder 4 einlegen. Klicken wenn fertig."; -const char MSG_FILAMENT_LOADING_T3_NL[] PROGMEM = "Steek filament in de extruder 4. Klik als klaar."; -const char * const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FILAMENT_LOADING_T3_EN, - MSG_FILAMENT_LOADING_T3_CZ, - MSG_FILAMENT_LOADING_T3_IT, - MSG_FILAMENT_LOADING_T3_ES, - MSG_FILAMENT_LOADING_T3_PL, - MSG_FILAMENT_LOADING_T3_DE, - MSG_FILAMENT_LOADING_T3_NL -}; - -const char MSG_FILE_PRINTED_EN[] PROGMEM = "Done printing file"; -const char * const MSG_FILE_PRINTED_LANG_TABLE[1] PROGMEM = { - MSG_FILE_PRINTED_EN -}; - -const char MSG_FILE_SAVED_EN[] PROGMEM = "Done saving file."; -const char * const MSG_FILE_SAVED_LANG_TABLE[1] PROGMEM = { - MSG_FILE_SAVED_EN -}; - -const char MSG_FIL_ADJUSTING_EN[] PROGMEM = "Adjusting filaments. Please wait."; -const char MSG_FIL_ADJUSTING_CZ[] PROGMEM = "Probiha srovnani filamentu. Prosim cekejte."; -const char MSG_FIL_ADJUSTING_IT[] PROGMEM = "Filamento in fase di regolazione. Attendere prego."; -const char MSG_FIL_ADJUSTING_ES[] PROGMEM = "Ajustando filamentos. Esperar por favor."; -const char MSG_FIL_ADJUSTING_PL[] PROGMEM = "Przebiega wyrownanie filamentow. Prosze czekac."; -const char MSG_FIL_ADJUSTING_DE[] PROGMEM = "Einstellen Filament. Bitte warten."; -const char MSG_FIL_ADJUSTING_NL[] PROGMEM = "Aanpassen filamenten. Even geduld aub."; -const char * const MSG_FIL_ADJUSTING_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FIL_ADJUSTING_EN, - MSG_FIL_ADJUSTING_CZ, - MSG_FIL_ADJUSTING_IT, - MSG_FIL_ADJUSTING_ES, - MSG_FIL_ADJUSTING_PL, - MSG_FIL_ADJUSTING_DE, - MSG_FIL_ADJUSTING_NL -}; - -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_EN[] PROGMEM = "Iteration "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_CZ[] PROGMEM = "Iterace "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_IT[] PROGMEM = "Reiterazione "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_ES[] PROGMEM = "Reiteracion "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_PL[] PROGMEM = "Iteracja "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_DE[] PROGMEM = "Wiederholung "; -const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_NL[] PROGMEM = "Herhaling "; -const char * const MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_EN, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_CZ, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_IT, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_ES, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_PL, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_DE, - MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_NL -}; - -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Searching bed calibration point"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Hledam kalibracni bod podlozky"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Ricerca del letto punto di calibraz."; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Buscando cama punto de calibracion"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Szukam punktu kalibracyjnego podkladki"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_DE[] PROGMEM = "Suche Bett Kalibrierpunkt"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_NL[] PROGMEM = "Zoeke bed kalibratiepunt"; -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, - MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_DE, - MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_NL -}; - -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = " of 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = " z 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = " su 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = " de 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = " z 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_DE[] PROGMEM = " von 4"; -const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_NL[] PROGMEM = " van 4"; -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, - MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_DE, - MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_NL -}; - -const char MSG_FINISHING_MOVEMENTS_EN[] PROGMEM = "Finishing movements"; -const char MSG_FINISHING_MOVEMENTS_CZ[] PROGMEM = "Dokoncovani pohybu"; -const char MSG_FINISHING_MOVEMENTS_IT[] PROGMEM = "Arresto in corso"; -const char MSG_FINISHING_MOVEMENTS_ES[] PROGMEM = "Term. movimientos"; -const char MSG_FINISHING_MOVEMENTS_PL[] PROGMEM = "Konczenie druku"; -const char MSG_FINISHING_MOVEMENTS_DE[] PROGMEM = "Bewegungen beenden"; -const char MSG_FINISHING_MOVEMENTS_NL[] PROGMEM = "Bewegingen afwerken"; -const char * const MSG_FINISHING_MOVEMENTS_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FINISHING_MOVEMENTS_EN, - MSG_FINISHING_MOVEMENTS_CZ, - MSG_FINISHING_MOVEMENTS_IT, - MSG_FINISHING_MOVEMENTS_ES, - MSG_FINISHING_MOVEMENTS_PL, - MSG_FINISHING_MOVEMENTS_DE, - MSG_FINISHING_MOVEMENTS_NL -}; - -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 MSG_FLOW_DE[] PROGMEM = "Durchfluss"; -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, - MSG_FLOW_DE, - MSG_FLOW_EN -}; - -const char MSG_FLOW0_EN[] PROGMEM = "Flow 0"; -const char * const MSG_FLOW0_LANG_TABLE[1] PROGMEM = { - MSG_FLOW0_EN -}; - -const char MSG_FLOW1_EN[] PROGMEM = "Flow 1"; -const char * const MSG_FLOW1_LANG_TABLE[1] PROGMEM = { - MSG_FLOW1_EN -}; - -const char MSG_FLOW2_EN[] PROGMEM = "Flow 2"; -const char * const MSG_FLOW2_LANG_TABLE[1] PROGMEM = { - MSG_FLOW2_EN -}; - -const char MSG_FOLLOW_CALIBRATION_FLOW_EN[] PROGMEM = "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."; -const char MSG_FOLLOW_CALIBRATION_FLOW_CZ[] PROGMEM = "Tiskarna nebyla jeste zkalibrovana. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Postup kalibrace."; -const char MSG_FOLLOW_CALIBRATION_FLOW_IT[] PROGMEM = "Stampante ancora non calibrata. Si prega di seguire il manuale, capitolo PRIMI PASSI, sezione della calibrazione."; -const char MSG_FOLLOW_CALIBRATION_FLOW_ES[] PROGMEM = "Impresora no esta calibrada todavia. Por favor usar el manual, el capitulo First steps, seleccion Calibration flow."; -const char MSG_FOLLOW_CALIBRATION_FLOW_PL[] PROGMEM = "Drukarka nie zostala jeszcze skalibrowana. Prosze kierowac sie instrukcja, rozdzial Zaczynamy, podrozdzial Selftest."; -const char MSG_FOLLOW_CALIBRATION_FLOW_DE[] PROGMEM = "Der Drucker wurde noch nicht kalibriert. Bitte folgen Sie dem Handbuch, Kapitel First steps, Abschnitt Calibration flow."; -const char MSG_FOLLOW_CALIBRATION_FLOW_NL[] PROGMEM = "Printer is nog niet gekalibreerd. Volg de handleiding, hoofdstuk First steps, sectie Calibration flow."; -const char * const MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_FOLLOW_CALIBRATION_FLOW_EN, - MSG_FOLLOW_CALIBRATION_FLOW_CZ, - MSG_FOLLOW_CALIBRATION_FLOW_IT, - MSG_FOLLOW_CALIBRATION_FLOW_ES, - MSG_FOLLOW_CALIBRATION_FLOW_PL, - MSG_FOLLOW_CALIBRATION_FLOW_DE, - MSG_FOLLOW_CALIBRATION_FLOW_NL -}; - -const char MSG_FREE_MEMORY_EN[] PROGMEM = " Free Memory: "; -const char * const MSG_FREE_MEMORY_LANG_TABLE[1] PROGMEM = { - MSG_FREE_MEMORY_EN -}; - -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 MSG_HEATING_DE[] PROGMEM = "Aufheizen"; -const char MSG_HEATING_NL[] PROGMEM = "Opwarmen"; -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, - MSG_HEATING_DE, - MSG_HEATING_NL -}; - -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 = "Riscald. completo"; -const char MSG_HEATING_COMPLETE_ES[] PROGMEM = "Calentamiento final."; -const char MSG_HEATING_COMPLETE_PL[] PROGMEM = "Grzanie OK."; -const char MSG_HEATING_COMPLETE_DE[] PROGMEM = "Aufgeheizen klar."; -const char MSG_HEATING_COMPLETE_NL[] PROGMEM = "Opwarmen klaar."; -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, - MSG_HEATING_COMPLETE_DE, - MSG_HEATING_COMPLETE_NL -}; - -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 MSG_HOMEYZ_DE[] PROGMEM = "Kalibrieren Z"; -const char MSG_HOMEYZ_NL[] PROGMEM = "Kalibreren 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, - MSG_HOMEYZ_DE, - MSG_HOMEYZ_NL -}; - -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 = "Calibrazione OK"; -const char MSG_HOMEYZ_DONE_ES[] PROGMEM = "Calibracion OK"; -const char MSG_HOMEYZ_DONE_PL[] PROGMEM = "Kalibracja OK"; -const char MSG_HOMEYZ_DONE_DE[] PROGMEM = "Kalibrierung OK"; -const char MSG_HOMEYZ_DONE_NL[] PROGMEM = "Kalbibratie 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, - MSG_HOMEYZ_DONE_DE, - MSG_HOMEYZ_DONE_NL -}; - -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 MSG_HOMEYZ_PROGRESS_DE[] PROGMEM = "Kalibriere Z"; -const char MSG_HOMEYZ_PROGRESS_NL[] PROGMEM = "Kalibreren 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, - MSG_HOMEYZ_PROGRESS_DE, - MSG_HOMEYZ_PROGRESS_NL -}; - -const char MSG_HOTEND_OFFSET_EN[] PROGMEM = "Hotend offsets:"; -const char * const MSG_HOTEND_OFFSET_LANG_TABLE[1] PROGMEM = { - MSG_HOTEND_OFFSET_EN -}; - -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Improving bed calibration point"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Zlepsuji presnost kalibracniho bodu"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Perfezion. il letto punto di calibraz."; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Mejorando cama punto de calibracion"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Poprawiam precyzyjnosc punktu kalibracyjnego"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_DE[] PROGMEM = "Genauigkeit verbessern bei Kalibrierpunkt"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_NL[] PROGMEM = "Nauwkeurigheid verbeteren bij kalibratiepunt"; -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, - MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_DE, - MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_NL -}; - -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = " of 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = " z 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = " su 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = " de 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = " z 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_DE[] PROGMEM = " von 9"; -const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_NL[] PROGMEM = " van 9"; -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, - MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_DE, - MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_NL -}; - -const char MSG_INIT_SDCARD_EN[] PROGMEM = "Init. SD card"; -const char * const MSG_INIT_SDCARD_LANG_TABLE[1] PROGMEM = { - MSG_INIT_SDCARD_EN -}; - -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 = "Introducir filamento"; -const char MSG_INSERT_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; -const char MSG_INSERT_FILAMENT_DE[] PROGMEM = "Filament einlegen"; -const char MSG_INSERT_FILAMENT_NL[] PROGMEM = "Filament insteken"; -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, - MSG_INSERT_FILAMENT_DE, - MSG_INSERT_FILAMENT_NL -}; - -const char MSG_INVALID_EXTRUDER_EN[] PROGMEM = "Invalid extruder"; -const char * const MSG_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_INVALID_EXTRUDER_EN -}; - -const char MSG_KILLED_EN[] PROGMEM = "KILLED. "; -const char MSG_KILLED_IT[] PROGMEM = "IN TILT."; -const char MSG_KILLED_ES[] PROGMEM = "PARADA DE EMERGENCIA"; -const char MSG_KILLED_DE[] PROGMEM = "ABGEBROCHEN. "; -const char MSG_KILLED_NL[] PROGMEM = "NOODSTOP/KILLED. "; -const char * const MSG_KILLED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_KILLED_EN, - MSG_KILLED_EN, - MSG_KILLED_IT, - MSG_KILLED_ES, - MSG_KILLED_EN, - MSG_KILLED_DE, - MSG_KILLED_NL -}; - -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 MSG_LANGUAGE_NAME_DE[] PROGMEM = "Deutsch"; -const char MSG_LANGUAGE_NAME_NL[] PROGMEM = "Nederlands"; -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, - MSG_LANGUAGE_NAME_DE, - MSG_LANGUAGE_NAME_NL -}; - -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 = "Seleziona lingua"; -const char MSG_LANGUAGE_SELECT_ES[] PROGMEM = "Cambiae el idioma"; -const char MSG_LANGUAGE_SELECT_PL[] PROGMEM = "Wybor jezyka"; -const char MSG_LANGUAGE_SELECT_DE[] PROGMEM = "Waehle Sprache"; -const char MSG_LANGUAGE_SELECT_NL[] PROGMEM = "Kies taal"; -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, - MSG_LANGUAGE_SELECT_DE, - MSG_LANGUAGE_SELECT_NL -}; - -const char MSG_LEFT_EN[] PROGMEM = "Left:"; -const char MSG_LEFT_CZ[] PROGMEM = "Levy:"; -const char MSG_LEFT_IT[] PROGMEM = "Sinistra:"; -const char MSG_LEFT_ES[] PROGMEM = "Izquierda:"; -const char MSG_LEFT_PL[] PROGMEM = "Lewy:"; -const char MSG_LEFT_DE[] PROGMEM = "Links:"; -const char MSG_LEFT_NL[] PROGMEM = "Links:"; -const char * const MSG_LEFT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LEFT_EN, - MSG_LEFT_CZ, - MSG_LEFT_IT, - MSG_LEFT_ES, - MSG_LEFT_PL, - MSG_LEFT_DE, - MSG_LEFT_NL -}; - -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 = "Caricando colore"; -const char MSG_LOADING_COLOR_ES[] PROGMEM = "Cambiando color"; -const char MSG_LOADING_COLOR_PL[] PROGMEM = "Czyszcz. koloru"; -const char MSG_LOADING_COLOR_DE[] PROGMEM = "Lade Farbe"; -const char MSG_LOADING_COLOR_NL[] PROGMEM = "Laade kleur"; -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, - MSG_LOADING_COLOR_DE, - MSG_LOADING_COLOR_NL -}; - -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 = "Caricando filam."; -const char MSG_LOADING_FILAMENT_ES[] PROGMEM = "Introduciendo filam."; -const char MSG_LOADING_FILAMENT_PL[] PROGMEM = "Wprow. filamentu"; -const char MSG_LOADING_FILAMENT_DE[] PROGMEM = "Filament laedt"; -const char MSG_LOADING_FILAMENT_NL[] PROGMEM = "Laade Filament"; -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, - MSG_LOADING_FILAMENT_DE, - MSG_LOADING_FILAMENT_NL -}; - -const char MSG_LOAD_ALL_EN[] PROGMEM = "Load all"; -const char MSG_LOAD_ALL_CZ[] PROGMEM = "Zavest vse"; -const char MSG_LOAD_ALL_IT[] PROGMEM = "Caricare tutti"; -const char MSG_LOAD_ALL_ES[] PROGMEM = "Intr. todos fil."; -const char MSG_LOAD_ALL_PL[] PROGMEM = "Zalad. wszystkie"; -const char MSG_LOAD_ALL_DE[] PROGMEM = "Alle laden"; -const char MSG_LOAD_ALL_NL[] PROGMEM = "Alle laden"; -const char * const MSG_LOAD_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOAD_ALL_EN, - MSG_LOAD_ALL_CZ, - MSG_LOAD_ALL_IT, - MSG_LOAD_ALL_ES, - MSG_LOAD_ALL_PL, - MSG_LOAD_ALL_DE, - MSG_LOAD_ALL_NL -}; - -const char MSG_LOAD_EPROM_EN[] PROGMEM = "Load memory"; -const char * const MSG_LOAD_EPROM_LANG_TABLE[1] PROGMEM = { - MSG_LOAD_EPROM_EN -}; - -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 = "Carica filamento"; -const char MSG_LOAD_FILAMENT_ES[] PROGMEM = "Introducir filam."; -const char MSG_LOAD_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; -const char MSG_LOAD_FILAMENT_DE[] PROGMEM = "Filament laden"; -const char MSG_LOAD_FILAMENT_NL[] PROGMEM = "Filament laden"; -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, - MSG_LOAD_FILAMENT_DE, - MSG_LOAD_FILAMENT_NL -}; - -const char MSG_LOAD_FILAMENT_1_EN[] PROGMEM = "Load filament 1"; -const char MSG_LOAD_FILAMENT_1_CZ[] PROGMEM = "Zavest filament 1"; -const char MSG_LOAD_FILAMENT_1_IT[] PROGMEM = "Caricare fil. 1"; -const char MSG_LOAD_FILAMENT_1_ES[] PROGMEM = "Introducir fil. 1"; -const char MSG_LOAD_FILAMENT_1_PL[] PROGMEM = "Zaladowac fil. 1"; -const char MSG_LOAD_FILAMENT_1_DE[] PROGMEM = "Filament 1 laden"; -const char MSG_LOAD_FILAMENT_1_NL[] PROGMEM = "Filament 1 laden"; -const char * const MSG_LOAD_FILAMENT_1_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOAD_FILAMENT_1_EN, - MSG_LOAD_FILAMENT_1_CZ, - MSG_LOAD_FILAMENT_1_IT, - MSG_LOAD_FILAMENT_1_ES, - MSG_LOAD_FILAMENT_1_PL, - MSG_LOAD_FILAMENT_1_DE, - MSG_LOAD_FILAMENT_1_NL -}; - -const char MSG_LOAD_FILAMENT_2_EN[] PROGMEM = "Load filament 2"; -const char MSG_LOAD_FILAMENT_2_CZ[] PROGMEM = "Zavest filament 2"; -const char MSG_LOAD_FILAMENT_2_IT[] PROGMEM = "Caricare fil. 2"; -const char MSG_LOAD_FILAMENT_2_ES[] PROGMEM = "Introducir fil. 2"; -const char MSG_LOAD_FILAMENT_2_PL[] PROGMEM = "Zaladowac fil. 2"; -const char MSG_LOAD_FILAMENT_2_DE[] PROGMEM = "Filament 2 laden"; -const char MSG_LOAD_FILAMENT_2_NL[] PROGMEM = "Filament 2 laden"; -const char * const MSG_LOAD_FILAMENT_2_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOAD_FILAMENT_2_EN, - MSG_LOAD_FILAMENT_2_CZ, - MSG_LOAD_FILAMENT_2_IT, - MSG_LOAD_FILAMENT_2_ES, - MSG_LOAD_FILAMENT_2_PL, - MSG_LOAD_FILAMENT_2_DE, - MSG_LOAD_FILAMENT_2_NL -}; - -const char MSG_LOAD_FILAMENT_3_EN[] PROGMEM = "Load filament 3"; -const char MSG_LOAD_FILAMENT_3_CZ[] PROGMEM = "Zavest filament 3"; -const char MSG_LOAD_FILAMENT_3_IT[] PROGMEM = "Caricare fil. 3"; -const char MSG_LOAD_FILAMENT_3_ES[] PROGMEM = "Introducir fil. 3"; -const char MSG_LOAD_FILAMENT_3_PL[] PROGMEM = "Zaladowac fil. 3"; -const char MSG_LOAD_FILAMENT_3_DE[] PROGMEM = "Filament 3 laden"; -const char MSG_LOAD_FILAMENT_3_NL[] PROGMEM = "Filament 3 laden"; -const char * const MSG_LOAD_FILAMENT_3_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOAD_FILAMENT_3_EN, - MSG_LOAD_FILAMENT_3_CZ, - MSG_LOAD_FILAMENT_3_IT, - MSG_LOAD_FILAMENT_3_ES, - MSG_LOAD_FILAMENT_3_PL, - MSG_LOAD_FILAMENT_3_DE, - MSG_LOAD_FILAMENT_3_NL -}; - -const char MSG_LOAD_FILAMENT_4_EN[] PROGMEM = "Load filament 4"; -const char MSG_LOAD_FILAMENT_4_CZ[] PROGMEM = "Zavest filament 4"; -const char MSG_LOAD_FILAMENT_4_IT[] PROGMEM = "Caricare fil. 4"; -const char MSG_LOAD_FILAMENT_4_ES[] PROGMEM = "Introducir fil. 4"; -const char MSG_LOAD_FILAMENT_4_PL[] PROGMEM = "Zaladowac fil. 4"; -const char MSG_LOAD_FILAMENT_4_DE[] PROGMEM = "Filament 4 laden"; -const char MSG_LOAD_FILAMENT_4_NL[] PROGMEM = "Filament 4 laden"; -const char * const MSG_LOAD_FILAMENT_4_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOAD_FILAMENT_4_EN, - MSG_LOAD_FILAMENT_4_CZ, - MSG_LOAD_FILAMENT_4_IT, - MSG_LOAD_FILAMENT_4_ES, - MSG_LOAD_FILAMENT_4_PL, - MSG_LOAD_FILAMENT_4_DE, - MSG_LOAD_FILAMENT_4_NL -}; - -const char MSG_LOOSE_PULLEY_EN[] PROGMEM = "Loose pulley"; -const char MSG_LOOSE_PULLEY_CZ[] PROGMEM = "Uvolnena remenicka"; -const char MSG_LOOSE_PULLEY_IT[] PROGMEM = "Puleggia lenta"; -const char MSG_LOOSE_PULLEY_ES[] PROGMEM = "Polea suelta"; -const char MSG_LOOSE_PULLEY_PL[] PROGMEM = "Kolo pasowe"; -const char MSG_LOOSE_PULLEY_DE[] PROGMEM = "Loser pulley"; -const char * const MSG_LOOSE_PULLEY_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_LOOSE_PULLEY_EN, - MSG_LOOSE_PULLEY_CZ, - MSG_LOOSE_PULLEY_IT, - MSG_LOOSE_PULLEY_ES, - MSG_LOOSE_PULLEY_PL, - MSG_LOOSE_PULLEY_DE, - MSG_LOOSE_PULLEY_EN -}; - -const char MSG_M104_INVALID_EXTRUDER_EN[] PROGMEM = "M104 Invalid extruder "; -const char * const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M104_INVALID_EXTRUDER_EN -}; - -const char MSG_M105_INVALID_EXTRUDER_EN[] PROGMEM = "M105 Invalid extruder "; -const char * const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M105_INVALID_EXTRUDER_EN -}; - -const char MSG_M109_INVALID_EXTRUDER_EN[] PROGMEM = "M109 Invalid extruder "; -const char * const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M109_INVALID_EXTRUDER_EN -}; - -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 * const MSG_M115_REPORT_LANG_TABLE[1] PROGMEM = { - MSG_M115_REPORT_EN -}; - -const char MSG_M119_REPORT_EN[] PROGMEM = "Reporting endstop status"; -const char * const MSG_M119_REPORT_LANG_TABLE[1] PROGMEM = { - MSG_M119_REPORT_EN -}; - -const char MSG_M200_INVALID_EXTRUDER_EN[] PROGMEM = "M200 Invalid extruder "; -const char * const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M200_INVALID_EXTRUDER_EN -}; - -const char MSG_M218_INVALID_EXTRUDER_EN[] PROGMEM = "M218 Invalid extruder "; -const char * const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M218_INVALID_EXTRUDER_EN -}; - -const char MSG_M221_INVALID_EXTRUDER_EN[] PROGMEM = "M221 Invalid extruder "; -const char * const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { - MSG_M221_INVALID_EXTRUDER_EN -}; - -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 MSG_MAIN_DE[] PROGMEM = "Hauptmenue"; -const char MSG_MAIN_NL[] PROGMEM = "Hoofdmenu"; -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, - MSG_MAIN_DE, - MSG_MAIN_NL -}; - -const char MSG_MARK_FIL_EN[] PROGMEM = "Mark filament 100mm from extruder body. Click when done."; -const char MSG_MARK_FIL_CZ[] PROGMEM = "Oznacte filament 100 mm od tela extruderu a po te potvrdte tlacitkem."; -const char MSG_MARK_FIL_IT[] PROGMEM = "Segnare il filamento a 100 mm di distanza dal corpo dell'estrusore. Click per continuare."; -const char MSG_MARK_FIL_ES[] PROGMEM = "Marque el filamento 100 mm por encima del final del extrusor. Hacer clic una vez terminado."; -const char MSG_MARK_FIL_PL[] PROGMEM = "Prosze oznaczyc filament 100 mm od ciala ekstrudera. Potwierdzic przyciskiem."; -const char MSG_MARK_FIL_DE[] PROGMEM = "Filament 100mm vom Extrudergehaeuse markieren. Klicken wenn Fertig."; -const char MSG_MARK_FIL_NL[] PROGMEM = "Mark filament 100mm van extruder body. Klik als klaar."; -const char * const MSG_MARK_FIL_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MARK_FIL_EN, - MSG_MARK_FIL_CZ, - MSG_MARK_FIL_IT, - MSG_MARK_FIL_ES, - MSG_MARK_FIL_PL, - MSG_MARK_FIL_DE, - MSG_MARK_FIL_NL -}; - -const char MSG_MAX_EN[] PROGMEM = " \002 Max"; -const char * const MSG_MAX_LANG_TABLE[1] PROGMEM = { - MSG_MAX_EN -}; - -const char MSG_MEASURED_SKEW_EN[] PROGMEM = "Measured skew:"; -const char MSG_MEASURED_SKEW_CZ[] PROGMEM = "Merene zkoseni:"; -const char MSG_MEASURED_SKEW_IT[] PROGMEM = "Incl. misurata:"; -const char MSG_MEASURED_SKEW_ES[] PROGMEM = "Inclin. medida:"; -const char MSG_MEASURED_SKEW_PL[] PROGMEM = "Zmier. sciecie:"; -const char MSG_MEASURED_SKEW_DE[] PROGMEM = "Symmetrie:"; -const char MSG_MEASURED_SKEW_NL[] PROGMEM = "Symmetrie:"; -const char * const MSG_MEASURED_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MEASURED_SKEW_EN, - MSG_MEASURED_SKEW_CZ, - MSG_MEASURED_SKEW_IT, - MSG_MEASURED_SKEW_ES, - MSG_MEASURED_SKEW_PL, - MSG_MEASURED_SKEW_DE, - MSG_MEASURED_SKEW_NL -}; - -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_EN[] PROGMEM = "Measuring reference height of calibration point"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_CZ[] PROGMEM = "Merim referencni vysku kalibracniho bodu"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_IT[] PROGMEM = "Misurare l'altezza di riferimento del punto di calibrazione"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_ES[] PROGMEM = "Medir la altura del punto de la calibracion"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_PL[] PROGMEM = "Okreslam wysokosc odniesienia punktu kalibracyjnego"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_DE[] PROGMEM = "Messen der Referenzhoehe des Kalibrierpunktes"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_NL[] PROGMEM = "Meten van reference hoogte van de kalibratiepunt"; -const char * const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_EN, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_CZ, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_IT, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_ES, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_PL, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_DE, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_NL -}; - -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_EN[] PROGMEM = " of 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_CZ[] PROGMEM = " z 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_IT[] PROGMEM = " su 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_ES[] PROGMEM = " de 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_PL[] PROGMEM = " z 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_DE[] PROGMEM = " von 9"; -const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_NL[] PROGMEM = " van 9"; -const char * const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_EN, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_CZ, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_IT, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_ES, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_PL, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_DE, - MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_NL -}; - -const char MSG_MENU_CALIBRATION_EN[] PROGMEM = "Calibration"; -const char MSG_MENU_CALIBRATION_CZ[] PROGMEM = "Kalibrace"; -const char MSG_MENU_CALIBRATION_IT[] PROGMEM = "Calibrazione"; -const char MSG_MENU_CALIBRATION_ES[] PROGMEM = "Calibracion"; -const char MSG_MENU_CALIBRATION_PL[] PROGMEM = "Kalibracja"; -const char MSG_MENU_CALIBRATION_DE[] PROGMEM = "Kalibrierung"; -const char MSG_MENU_CALIBRATION_NL[] PROGMEM = "Kalibratie"; -const char * const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MENU_CALIBRATION_EN, - MSG_MENU_CALIBRATION_CZ, - MSG_MENU_CALIBRATION_IT, - MSG_MENU_CALIBRATION_ES, - MSG_MENU_CALIBRATION_PL, - MSG_MENU_CALIBRATION_DE, - MSG_MENU_CALIBRATION_NL -}; - -const char MSG_MESH_BED_LEVELING_EN[] PROGMEM = "Mesh Bed Leveling"; -const char MSG_MESH_BED_LEVELING_IT[] PROGMEM = "Mesh livel. letto"; -const char * const MSG_MESH_BED_LEVELING_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MESH_BED_LEVELING_EN, - MSG_MESH_BED_LEVELING_EN, - MSG_MESH_BED_LEVELING_IT, - MSG_MESH_BED_LEVELING_EN, - MSG_MESH_BED_LEVELING_EN, - MSG_MESH_BED_LEVELING_EN, - MSG_MESH_BED_LEVELING_EN -}; - -const char MSG_MIN_EN[] PROGMEM = " \002 Min"; -const char * const MSG_MIN_LANG_TABLE[1] PROGMEM = { - MSG_MIN_EN -}; - -const char MSG_MOTION_EN[] PROGMEM = "Motion"; -const char * const MSG_MOTION_LANG_TABLE[1] PROGMEM = { - MSG_MOTION_EN -}; - -const char MSG_MOVE_01MM_EN[] PROGMEM = "Move 0.1mm"; -const char * const MSG_MOVE_01MM_LANG_TABLE[1] PROGMEM = { - MSG_MOVE_01MM_EN -}; - -const char MSG_MOVE_10MM_EN[] PROGMEM = "Move 10mm"; -const char * const MSG_MOVE_10MM_LANG_TABLE[1] PROGMEM = { - MSG_MOVE_10MM_EN -}; - -const char MSG_MOVE_1MM_EN[] PROGMEM = "Move 1mm"; -const char * const MSG_MOVE_1MM_LANG_TABLE[1] PROGMEM = { - MSG_MOVE_1MM_EN -}; - -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 MSG_MOVE_AXIS_DE[] PROGMEM = "Bewege Achse"; -const char MSG_MOVE_AXIS_NL[] PROGMEM = "As verplaatsen"; -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, - MSG_MOVE_AXIS_DE, - MSG_MOVE_AXIS_NL -}; - -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_EN[] PROGMEM = "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ[] PROGMEM = "Kalibrace XYZ. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_IT[] PROGMEM = "Calibrazione XYZ. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_ES[] PROGMEM = "Calibrando XYZ. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_PL[] PROGMEM = "Kalibracja XYZ. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_DE[] PROGMEM = "Kalibrieren von XYZ. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_NL[] PROGMEM = "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar."; -const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MOVE_CARRIAGE_TO_THE_TOP_EN, - MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ, - MSG_MOVE_CARRIAGE_TO_THE_TOP_IT, - MSG_MOVE_CARRIAGE_TO_THE_TOP_ES, - MSG_MOVE_CARRIAGE_TO_THE_TOP_PL, - MSG_MOVE_CARRIAGE_TO_THE_TOP_DE, - MSG_MOVE_CARRIAGE_TO_THE_TOP_NL -}; - -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_EN[] PROGMEM = "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_CZ[] PROGMEM = "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_IT[] PROGMEM = "Calibrazione Z. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_ES[] PROGMEM = "Calibrando Z. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_PL[] PROGMEM = "Kalibracja Z. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_DE[] PROGMEM = "Kalibrieren von Z. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind."; -const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_NL[] PROGMEM = "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar."; -const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_EN, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_CZ, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_IT, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_ES, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_PL, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_DE, - MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_NL -}; - -const char MSG_MOVE_E_EN[] PROGMEM = "Extruder"; -const char MSG_MOVE_E_IT[] PROGMEM = "Muovi Estrusore"; -const char MSG_MOVE_E_ES[] PROGMEM = "Extruir"; -const char * const MSG_MOVE_E_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_MOVE_E_EN, - MSG_MOVE_E_EN, - MSG_MOVE_E_IT, - MSG_MOVE_E_ES, - MSG_MOVE_E_EN, - MSG_MOVE_E_EN, - MSG_MOVE_E_EN -}; - -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 MSG_MOVE_X_DE[] PROGMEM = "Bewege X"; -const char MSG_MOVE_X_NL[] PROGMEM = "Verplaats 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, - MSG_MOVE_X_DE, - MSG_MOVE_X_NL -}; - -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 MSG_MOVE_Y_DE[] PROGMEM = "Bewege Y"; -const char MSG_MOVE_Y_NL[] PROGMEM = "Verplaats 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, - MSG_MOVE_Y_DE, - MSG_MOVE_Y_NL -}; - -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 MSG_MOVE_Z_DE[] PROGMEM = "Bewege Z"; -const char MSG_MOVE_Z_NL[] PROGMEM = "Verplaats 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, - MSG_MOVE_Z_DE, - MSG_MOVE_Z_NL -}; - -const char MSG_NEW_FIRMWARE_AVAILABLE_EN[] PROGMEM = "New firmware version available:"; -const char MSG_NEW_FIRMWARE_AVAILABLE_CZ[] PROGMEM = "Vysla nova verze firmware:"; -const char MSG_NEW_FIRMWARE_AVAILABLE_IT[] PROGMEM = "Nuova versione del firmware disponibile"; -const char MSG_NEW_FIRMWARE_AVAILABLE_ES[] PROGMEM = "Nuevo firmware disponible:"; -const char MSG_NEW_FIRMWARE_AVAILABLE_PL[] PROGMEM = "Wyszla nowa wersja firmware:"; -const char MSG_NEW_FIRMWARE_AVAILABLE_DE[] PROGMEM = "Neue Firmware Version verfuegbar:"; -const char MSG_NEW_FIRMWARE_AVAILABLE_NL[] PROGMEM = "Nieuwe firmware versie beschikbaar:"; -const char * const MSG_NEW_FIRMWARE_AVAILABLE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_NEW_FIRMWARE_AVAILABLE_EN, - MSG_NEW_FIRMWARE_AVAILABLE_CZ, - MSG_NEW_FIRMWARE_AVAILABLE_IT, - MSG_NEW_FIRMWARE_AVAILABLE_ES, - MSG_NEW_FIRMWARE_AVAILABLE_PL, - MSG_NEW_FIRMWARE_AVAILABLE_DE, - MSG_NEW_FIRMWARE_AVAILABLE_NL -}; - -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN[] PROGMEM = "Please upgrade."; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ[] PROGMEM = "Prosim aktualizujte."; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_IT[] PROGMEM = "Prega aggiorna."; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES[] PROGMEM = "Actualizar por favor"; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL[] PROGMEM = "Prosze zaktualizowac"; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_DE[] PROGMEM = "Bitte aktualisieren."; -const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_NL[] PROGMEM = "Upgraden aub."; -const char * const MSG_NEW_FIRMWARE_PLEASE_UPGRADE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_IT, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_DE, - MSG_NEW_FIRMWARE_PLEASE_UPGRADE_NL -}; - -const char MSG_NO_EN[] PROGMEM = "No"; -const char MSG_NO_CZ[] PROGMEM = "Ne"; -const char MSG_NO_PL[] PROGMEM = "Nie"; -const char MSG_NO_DE[] PROGMEM = "Nein"; -const char MSG_NO_NL[] PROGMEM = "Nee"; -const char * const MSG_NO_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_NO_EN, - MSG_NO_CZ, - MSG_NO_EN, - MSG_NO_EN, - MSG_NO_PL, - MSG_NO_DE, - MSG_NO_NL -}; - -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 = "Colore non puro"; -const char MSG_NOT_COLOR_ES[] PROGMEM = "Color no homogeneo"; -const char MSG_NOT_COLOR_PL[] PROGMEM = "Kolor zanieczysz."; -const char MSG_NOT_COLOR_DE[] PROGMEM = "Farbe nicht klar."; -const char MSG_NOT_COLOR_NL[] PROGMEM = "Kleur niet duidelijk"; -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, - MSG_NOT_COLOR_DE, - MSG_NOT_COLOR_NL -}; - -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. non caricato"; -const char MSG_NOT_LOADED_ES[] PROGMEM = "Fil. no introducido"; -const char MSG_NOT_LOADED_PL[] PROGMEM = "Brak filamentu"; -const char MSG_NOT_LOADED_DE[] PROGMEM = "Fil. nicht geladen"; -const char MSG_NOT_LOADED_NL[] PROGMEM = "Fil. niet geladen"; -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, - MSG_NOT_LOADED_DE, - MSG_NOT_LOADED_NL -}; - -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 = "Boquilla"; -const char MSG_NOZZLE_PL[] PROGMEM = "Dysza"; -const char MSG_NOZZLE_DE[] PROGMEM = "Duese"; -const char MSG_NOZZLE_NL[] PROGMEM = "Tuit"; -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, - MSG_NOZZLE_DE, - MSG_NOZZLE_NL -}; - -const char MSG_NOZZLE1_EN[] PROGMEM = "Nozzle2"; -const char * const MSG_NOZZLE1_LANG_TABLE[1] PROGMEM = { - MSG_NOZZLE1_EN -}; - -const char MSG_NOZZLE2_EN[] PROGMEM = "Nozzle3"; -const char * const MSG_NOZZLE2_LANG_TABLE[1] PROGMEM = { - MSG_NOZZLE2_EN -}; - -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 = "Nessuna SD"; -const char MSG_NO_CARD_ES[] PROGMEM = "No hay tarjeta SD"; -const char MSG_NO_CARD_PL[] PROGMEM = "Brak karty SD"; -const char MSG_NO_CARD_DE[] PROGMEM = "Keine SD Karte"; -const char MSG_NO_CARD_NL[] PROGMEM = "Geen SD kaart"; -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, - MSG_NO_CARD_DE, - MSG_NO_CARD_NL -}; - -const char MSG_NO_MOVE_EN[] 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_DE[] PROGMEM = "Keine Bewegung."; -const char MSG_NO_MOVE_NL[] PROGMEM = "Geen beweging."; -const char * const MSG_NO_MOVE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_NO_MOVE_EN, - MSG_NO_MOVE_EN, - MSG_NO_MOVE_IT, - MSG_NO_MOVE_ES, - MSG_NO_MOVE_EN, - MSG_NO_MOVE_DE, - MSG_NO_MOVE_NL -}; - -const char MSG_OFF_EN[] PROGMEM = "Off"; -const char * const MSG_OFF_LANG_TABLE[1] PROGMEM = { - MSG_OFF_EN -}; - -const char MSG_OK_EN[] PROGMEM = "ok"; -const char * const MSG_OK_LANG_TABLE[1] PROGMEM = { - MSG_OK_EN -}; - -const char MSG_ON_EN[] PROGMEM = "On "; -const char * const MSG_ON_LANG_TABLE[1] PROGMEM = { - MSG_ON_EN -}; - -const char MSG_PAPER_EN[] PROGMEM = "Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."; -const char MSG_PAPER_CZ[] PROGMEM = "Umistete list papiru na podlozku a udrzujte jej pod tryskou behem mereni prvnich 4 bodu. Pokud tryska zachyti papir, vypnete tiskarnu."; -const char MSG_PAPER_IT[] PROGMEM = "Porre un foglio sotto l'ugello durante la calibrazione dei primi 4 punti. In caso l'ugello muova il foglio spegnere prontamente la stampante."; -const char MSG_PAPER_ES[] PROGMEM = "Colocar una hoja de papel sobre la superficie de impresion durante la calibracion de los primeros 4 puntos. Si la boquilla mueve el papel, apagar impresora inmediatamente."; -const char MSG_PAPER_PL[] PROGMEM = "Umiesc kartke papieru na podkladce i trzymaj pod dysza podczas pomiaru pierwszych 4 punktow. Jesli dysza zahaczy o papier, wylacz drukarke."; -const char MSG_PAPER_DE[] PROGMEM = "Lege waehrend der Kalibrierung der ersten 4 Punkte ein Blatt Papier unter die Duese. Wenn die Duese das Papier bewegt, Drucker sofort ausschalten!"; -const char MSG_PAPER_NL[] PROGMEM = "Leg een vel papier onder het tuit tijdens de kalibratie van de eerste 4 punten. Als het tuit het papier vangt, Printer onmiddellijk uitschakelen."; -const char * const MSG_PAPER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PAPER_EN, - MSG_PAPER_CZ, - MSG_PAPER_IT, - MSG_PAPER_ES, - MSG_PAPER_PL, - MSG_PAPER_DE, - MSG_PAPER_NL -}; - -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 = "Metti in pausa"; -const char MSG_PAUSE_PRINT_ES[] PROGMEM = "Pausar impresion"; -const char MSG_PAUSE_PRINT_PL[] PROGMEM = "Przerwac druk"; -const char MSG_PAUSE_PRINT_DE[] PROGMEM = "Pause"; -const char MSG_PAUSE_PRINT_NL[] PROGMEM = "Print pauzeren"; -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, - MSG_PAUSE_PRINT_DE, - MSG_PAUSE_PRINT_NL -}; - -const char MSG_PICK_Z_EN[] PROGMEM = "Pick print"; -const char MSG_PICK_Z_CZ[] PROGMEM = "Vyberte vytisk"; -const char MSG_PICK_Z_ES[] PROGMEM = "Esc. Modelo Adecuado"; -const char MSG_PICK_Z_PL[] PROGMEM = "Vyberte vytisk"; -const char MSG_PICK_Z_DE[] PROGMEM = "Waehle Druck"; -const char * const MSG_PICK_Z_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PICK_Z_EN, - MSG_PICK_Z_CZ, - MSG_PICK_Z_EN, - MSG_PICK_Z_ES, - MSG_PICK_Z_PL, - MSG_PICK_Z_DE, - MSG_PICK_Z_EN -}; - -const char MSG_PID_BED_EN[] PROGMEM = "PID bed cal. "; -const char MSG_PID_BED_DE[] PROGMEM = "PID Bett Kalibrier. "; -const char MSG_PID_BED_NL[] PROGMEM = "PID bed kalibratie "; -const char * const MSG_PID_BED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_BED_EN, - MSG_PID_BED_EN, - MSG_PID_BED_EN, - MSG_PID_BED_EN, - MSG_PID_BED_EN, - MSG_PID_BED_DE, - MSG_PID_BED_NL -}; - -const char MSG_PID_BED_FINISHED_EN[] PROGMEM = "PID bed cal. done "; -const char MSG_PID_BED_FINISHED_DE[] PROGMEM = "PID Bett Kal. fertig"; -const char MSG_PID_BED_FINISHED_NL[] PROGMEM = "PID bed kal. klaar "; -const char * const MSG_PID_BED_FINISHED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_BED_FINISHED_EN, - MSG_PID_BED_FINISHED_EN, - MSG_PID_BED_FINISHED_EN, - MSG_PID_BED_FINISHED_EN, - MSG_PID_BED_FINISHED_EN, - MSG_PID_BED_FINISHED_DE, - MSG_PID_BED_FINISHED_NL -}; - -const char MSG_PID_BED_RUNNING_EN[] PROGMEM = "PID bed cal. "; -const char MSG_PID_BED_RUNNING_DE[] PROGMEM = "PID Bett Kal."; -const char MSG_PID_BED_RUNNING_NL[] PROGMEM = "PID bed kal. "; -const char * const MSG_PID_BED_RUNNING_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_BED_RUNNING_EN, - MSG_PID_BED_RUNNING_EN, - MSG_PID_BED_RUNNING_EN, - MSG_PID_BED_RUNNING_EN, - MSG_PID_BED_RUNNING_EN, - MSG_PID_BED_RUNNING_DE, - MSG_PID_BED_RUNNING_NL -}; - -const char MSG_PID_EXTRUDER_EN[] PROGMEM = "PID calibration"; -const char MSG_PID_EXTRUDER_CZ[] PROGMEM = "PID kalibrace"; -const char MSG_PID_EXTRUDER_IT[] PROGMEM = "Calibrazione PID"; -const char MSG_PID_EXTRUDER_ES[] PROGMEM = "Calibracion PID"; -const char MSG_PID_EXTRUDER_PL[] PROGMEM = "Kalibracja PID"; -const char MSG_PID_EXTRUDER_DE[] PROGMEM = "PID Kalibrierung"; -const char MSG_PID_EXTRUDER_NL[] PROGMEM = "PID kalibratie"; -const char * const MSG_PID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_EXTRUDER_EN, - MSG_PID_EXTRUDER_CZ, - MSG_PID_EXTRUDER_IT, - MSG_PID_EXTRUDER_ES, - MSG_PID_EXTRUDER_PL, - MSG_PID_EXTRUDER_DE, - MSG_PID_EXTRUDER_NL -}; - -const char MSG_PID_FINISHED_EN[] PROGMEM = "PID cal. finished "; -const char MSG_PID_FINISHED_CZ[] PROGMEM = "PID kal. ukoncena"; -const char MSG_PID_FINISHED_IT[] PROGMEM = "Cal. PID completa"; -const char MSG_PID_FINISHED_ES[] PROGMEM = "Cal. PID terminada"; -const char MSG_PID_FINISHED_PL[] PROGMEM = "Kal. PID zakonczona"; -const char MSG_PID_FINISHED_DE[] PROGMEM = "PID Kal. fertig "; -const char MSG_PID_FINISHED_NL[] PROGMEM = "PID kal. klaar "; -const char * const MSG_PID_FINISHED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_FINISHED_EN, - MSG_PID_FINISHED_CZ, - MSG_PID_FINISHED_IT, - MSG_PID_FINISHED_ES, - MSG_PID_FINISHED_PL, - MSG_PID_FINISHED_DE, - MSG_PID_FINISHED_NL -}; - -const char MSG_PID_RUNNING_EN[] PROGMEM = "PID cal. "; -const char MSG_PID_RUNNING_CZ[] PROGMEM = "PID kal. "; -const char MSG_PID_RUNNING_IT[] PROGMEM = "Cal. PID"; -const char MSG_PID_RUNNING_ES[] PROGMEM = "Cal. PID "; -const char MSG_PID_RUNNING_PL[] PROGMEM = "Kal. PID"; -const char MSG_PID_RUNNING_DE[] PROGMEM = "PID Kal. "; -const char MSG_PID_RUNNING_NL[] PROGMEM = "PID kal. "; -const char * const MSG_PID_RUNNING_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PID_RUNNING_EN, - MSG_PID_RUNNING_CZ, - MSG_PID_RUNNING_IT, - MSG_PID_RUNNING_ES, - MSG_PID_RUNNING_PL, - MSG_PID_RUNNING_DE, - MSG_PID_RUNNING_NL -}; - -const char MSG_PINDA_NOT_CALIBRATED_EN[] PROGMEM = "PINDA temperature calibration has not been run yet"; -const char MSG_PINDA_NOT_CALIBRATED_CZ[] PROGMEM = "Tiskarna nebyla teplotne zkalibrovana"; -const char MSG_PINDA_NOT_CALIBRATED_IT[] PROGMEM = "Taratura della temperatura non ancora eseguita"; -const char MSG_PINDA_NOT_CALIBRATED_ES[] PROGMEM = "La temperatura de calibracion no ha sido ajustada"; -const char MSG_PINDA_NOT_CALIBRATED_PL[] PROGMEM = "Cieplna kalibracja nie byla przeprowadzona"; -const char MSG_PINDA_NOT_CALIBRATED_DE[] PROGMEM = "PINDA Temperatur Kalibrierung wurde noch nicht ausgefuehrt"; -const char MSG_PINDA_NOT_CALIBRATED_NL[] PROGMEM = "PINDA temperatuur calibratie was nog niet uitgevoerd"; -const char * const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PINDA_NOT_CALIBRATED_EN, - MSG_PINDA_NOT_CALIBRATED_CZ, - MSG_PINDA_NOT_CALIBRATED_IT, - MSG_PINDA_NOT_CALIBRATED_ES, - MSG_PINDA_NOT_CALIBRATED_PL, - MSG_PINDA_NOT_CALIBRATED_DE, - MSG_PINDA_NOT_CALIBRATED_NL -}; - -const char MSG_PINDA_PREHEAT_EN[] PROGMEM = "PINDA Heating"; -const char MSG_PINDA_PREHEAT_CZ[] PROGMEM = "Nahrivani PINDA"; -const char MSG_PINDA_PREHEAT_IT[] PROGMEM = "Riscald. PINDA"; -const char MSG_PINDA_PREHEAT_ES[] PROGMEM = "Calentando PINDA"; -const char MSG_PINDA_PREHEAT_PL[] PROGMEM = "Grzanie PINDA"; -const char MSG_PINDA_PREHEAT_DE[] PROGMEM = "PINDA aufwaremen"; -const char MSG_PINDA_PREHEAT_NL[] PROGMEM = "PINDA warmt op"; -const char * const MSG_PINDA_PREHEAT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PINDA_PREHEAT_EN, - MSG_PINDA_PREHEAT_CZ, - MSG_PINDA_PREHEAT_IT, - MSG_PINDA_PREHEAT_ES, - MSG_PINDA_PREHEAT_PL, - MSG_PINDA_PREHEAT_DE, - MSG_PINDA_PREHEAT_NL -}; - -const char MSG_PLANNER_BUFFER_BYTES_EN[] PROGMEM = " PlannerBufferBytes: "; -const char * const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1] PROGMEM = { - MSG_PLANNER_BUFFER_BYTES_EN -}; - -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 = "Por Favor Esperar"; -const char MSG_PLEASE_WAIT_PL[] PROGMEM = "Prosze czekac"; -const char MSG_PLEASE_WAIT_DE[] PROGMEM = "Bitte warten"; -const char MSG_PLEASE_WAIT_NL[] PROGMEM = "Wacht aub"; -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, - MSG_PLEASE_WAIT_DE, - MSG_PLEASE_WAIT_NL -}; - -const char MSG_POSITION_UNKNOWN_EN[] PROGMEM = "Home X/Y before Z"; -const char * const MSG_POSITION_UNKNOWN_LANG_TABLE[1] PROGMEM = { - MSG_POSITION_UNKNOWN_EN -}; - -const char MSG_POWERUP_EN[] PROGMEM = "PowerUp"; -const char * const MSG_POWERUP_LANG_TABLE[1] PROGMEM = { - MSG_POWERUP_EN -}; - -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 MSG_PREHEAT_DE[] PROGMEM = "Vorheizen"; -const char MSG_PREHEAT_NL[] PROGMEM = "Voorverwarmen"; -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, - MSG_PREHEAT_DE, - MSG_PREHEAT_NL -}; - -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 = "Precalentar extrusor"; -const char MSG_PREHEAT_NOZZLE_PL[] PROGMEM = "Nagrzej dysze!"; -const char MSG_PREHEAT_NOZZLE_DE[] PROGMEM = "Duese vorheizen!"; -const char MSG_PREHEAT_NOZZLE_NL[] PROGMEM = "Tuit voorverwarmen!"; -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, - MSG_PREHEAT_NOZZLE_DE, - MSG_PREHEAT_NOZZLE_NL -}; - -const char MSG_PREPARE_FILAMENT_EN[] PROGMEM = "Prepare new filament"; -const char MSG_PREPARE_FILAMENT_CZ[] PROGMEM = "Pripravte filament"; -const char MSG_PREPARE_FILAMENT_IT[] PROGMEM = "Preparare filamento"; -const char MSG_PREPARE_FILAMENT_ES[] PROGMEM = "Preparar filamento"; -const char MSG_PREPARE_FILAMENT_PL[] PROGMEM = "Przygotuj filament"; -const char MSG_PREPARE_FILAMENT_DE[] PROGMEM = "Filam. bereithalten"; -const char MSG_PREPARE_FILAMENT_NL[] PROGMEM = "Filam. voorbereiden"; -const char * const MSG_PREPARE_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PREPARE_FILAMENT_EN, - MSG_PREPARE_FILAMENT_CZ, - MSG_PREPARE_FILAMENT_IT, - MSG_PREPARE_FILAMENT_ES, - MSG_PREPARE_FILAMENT_PL, - MSG_PREPARE_FILAMENT_DE, - MSG_PREPARE_FILAMENT_NL -}; - -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 = "e cliccare manopola"; -const char MSG_PRESS_ES[] PROGMEM = "Pulsar el mando"; -const char MSG_PRESS_PL[] PROGMEM = "Nacisnij przycisk"; -const char MSG_PRESS_DE[] PROGMEM = "und Knopf druecken"; -const char MSG_PRESS_NL[] PROGMEM = "en druk op knop"; -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, - MSG_PRESS_DE, - MSG_PRESS_NL -}; - -const char MSG_PRINTER_DISCONNECTED_EN[] PROGMEM = "Printer disconnected"; -const char MSG_PRINTER_DISCONNECTED_DE[] PROGMEM = "Drucker getrent"; -const char MSG_PRINTER_DISCONNECTED_NL[] PROGMEM = "Printer ontbonden"; -const char * const MSG_PRINTER_DISCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PRINTER_DISCONNECTED_EN, - MSG_PRINTER_DISCONNECTED_EN, - MSG_PRINTER_DISCONNECTED_EN, - MSG_PRINTER_DISCONNECTED_EN, - MSG_PRINTER_DISCONNECTED_EN, - MSG_PRINTER_DISCONNECTED_DE, - MSG_PRINTER_DISCONNECTED_NL -}; - -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 = "Impresion cancelada"; -const char MSG_PRINT_ABORTED_PL[] PROGMEM = "Druk przerwany"; -const char MSG_PRINT_ABORTED_DE[] PROGMEM = "Druck abgebrochen"; -const char MSG_PRINT_ABORTED_NL[] PROGMEM = "Print afgebroken"; -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, - MSG_PRINT_ABORTED_DE, - MSG_PRINT_ABORTED_NL -}; - -const char MSG_PRINT_PAUSED_EN[] PROGMEM = "Print paused"; -const char MSG_PRINT_PAUSED_CZ[] PROGMEM = "Tisk pozastaven"; -const char MSG_PRINT_PAUSED_IT[] PROGMEM = "Stampa in pausa"; -const char MSG_PRINT_PAUSED_ES[] PROGMEM = "Impresion en pausa"; -const char MSG_PRINT_PAUSED_PL[] PROGMEM = "Druk zatrzymany"; -const char MSG_PRINT_PAUSED_DE[] PROGMEM = "Druck pausiert"; -const char MSG_PRINT_PAUSED_NL[] PROGMEM = "Druck pauzeren"; -const char * const MSG_PRINT_PAUSED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_PRINT_PAUSED_EN, - MSG_PRINT_PAUSED_CZ, - MSG_PRINT_PAUSED_IT, - MSG_PRINT_PAUSED_ES, - MSG_PRINT_PAUSED_PL, - MSG_PRINT_PAUSED_DE, - MSG_PRINT_PAUSED_NL -}; - -const char MSG_PRUSA3D_EN[] PROGMEM = "prusa3d.com"; -const char MSG_PRUSA3D_CZ[] PROGMEM = "prusa3d.cz"; -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_EN, - MSG_PRUSA3D_EN, - MSG_PRUSA3D_PL, - MSG_PRUSA3D_EN, - MSG_PRUSA3D_EN -}; - -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_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_EN, - MSG_PRUSA3D_FORUM_EN, - MSG_PRUSA3D_FORUM_PL, - MSG_PRUSA3D_FORUM_EN, - MSG_PRUSA3D_FORUM_EN -}; - -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_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_EN, - MSG_PRUSA3D_HOWTO_EN, - MSG_PRUSA3D_HOWTO_PL, - MSG_PRUSA3D_HOWTO_EN, - MSG_PRUSA3D_HOWTO_EN -}; - -const char MSG_REBOOT_EN[] PROGMEM = "Reboot the printer"; -const char MSG_REBOOT_CZ[] PROGMEM = "Restartujte tiskarnu"; -const char MSG_REBOOT_IT[] PROGMEM = "Riavvia stampante"; -const char MSG_REBOOT_ES[] PROGMEM = "Reiniciar impresora"; -const char MSG_REBOOT_PL[] PROGMEM = "Restart drukarki"; -const char MSG_REBOOT_DE[] PROGMEM = "Reboot den Drucker"; -const char MSG_REBOOT_NL[] PROGMEM = "Herstart de printer"; -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, - MSG_REBOOT_DE, - MSG_REBOOT_NL -}; - -const char MSG_RECTRACT_EN[] PROGMEM = "Rectract"; -const char * const MSG_RECTRACT_LANG_TABLE[1] PROGMEM = { - MSG_RECTRACT_EN -}; - -const char MSG_REFRESH_EN[] PROGMEM = "\xF8" "Refresh"; -const char * const MSG_REFRESH_LANG_TABLE[1] PROGMEM = { - MSG_REFRESH_EN -}; - -const char MSG_RESEND_EN[] PROGMEM = "Resend: "; -const char * const MSG_RESEND_LANG_TABLE[1] PROGMEM = { - MSG_RESEND_EN -}; - -const char MSG_RESET_CALIBRATE_E_EN[] PROGMEM = "Reset E Cal."; -const char * const MSG_RESET_CALIBRATE_E_LANG_TABLE[1] PROGMEM = { - MSG_RESET_CALIBRATE_E_EN -}; - -const char MSG_RESTORE_FAILSAFE_EN[] PROGMEM = "Restore failsafe"; -const char * const MSG_RESTORE_FAILSAFE_LANG_TABLE[1] PROGMEM = { - MSG_RESTORE_FAILSAFE_EN -}; - -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 MSG_RESUME_PRINT_DE[] PROGMEM = "Fortsetzen"; -const char MSG_RESUME_PRINT_NL[] PROGMEM = "Print hervatten"; -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, - MSG_RESUME_PRINT_DE, - MSG_RESUME_PRINT_NL -}; - -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 impresion"; -const char MSG_RESUMING_PL[] PROGMEM = "Wznowienie druku"; -const char MSG_RESUMING_DE[] PROGMEM = "Druck fortgesetzt"; -const char MSG_RESUMING_NL[] PROGMEM = "Print hervatten"; -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, - MSG_RESUMING_DE, - MSG_RESUMING_NL -}; - -const char MSG_RESUMING_PRINT_EN[] PROGMEM = "Resuming print"; -const char MSG_RESUMING_PRINT_CZ[] PROGMEM = "Obnovovani tisku"; -const char MSG_RESUMING_PRINT_IT[] PROGMEM = "Stampa in ripresa"; -const char MSG_RESUMING_PRINT_ES[] PROGMEM = "Reanudar impresion"; -const char MSG_RESUMING_PRINT_PL[] PROGMEM = "Wznawianie druku"; -const char MSG_RESUMING_PRINT_DE[] PROGMEM = "Druck fortsetzen"; -const char MSG_RESUMING_PRINT_NL[] PROGMEM = "Print hervatten"; -const char * const MSG_RESUMING_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_RESUMING_PRINT_EN, - MSG_RESUMING_PRINT_CZ, - MSG_RESUMING_PRINT_IT, - MSG_RESUMING_PRINT_ES, - MSG_RESUMING_PRINT_PL, - MSG_RESUMING_PRINT_DE, - MSG_RESUMING_PRINT_NL -}; - -const char MSG_RIGHT_EN[] PROGMEM = "Right:"; -const char MSG_RIGHT_CZ[] PROGMEM = "Pravy:"; -const char MSG_RIGHT_IT[] PROGMEM = "Destra:"; -const char MSG_RIGHT_ES[] PROGMEM = "Derecha:"; -const char MSG_RIGHT_PL[] PROGMEM = "Prawy:"; -const char MSG_RIGHT_DE[] PROGMEM = "Rechts:"; -const char MSG_RIGHT_NL[] PROGMEM = "Rechts:"; -const char * const MSG_RIGHT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_RIGHT_EN, - MSG_RIGHT_CZ, - MSG_RIGHT_IT, - MSG_RIGHT_ES, - MSG_RIGHT_PL, - MSG_RIGHT_DE, - MSG_RIGHT_NL -}; - -const char MSG_SD_CANT_ENTER_SUBDIR_EN[] PROGMEM = "Cannot enter subdir: "; -const char * const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[1] PROGMEM = { - MSG_SD_CANT_ENTER_SUBDIR_EN -}; - -const char MSG_SD_CANT_OPEN_SUBDIR_EN[] PROGMEM = "Cannot open subdir"; -const char * const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[1] PROGMEM = { - MSG_SD_CANT_OPEN_SUBDIR_EN -}; - -const char MSG_SD_CARD_OK_EN[] PROGMEM = "SD card ok"; -const char * const MSG_SD_CARD_OK_LANG_TABLE[1] PROGMEM = { - MSG_SD_CARD_OK_EN -}; - -const char MSG_SD_ERR_WRITE_TO_FILE_EN[] PROGMEM = "error writing to file"; -const char * const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[1] PROGMEM = { - MSG_SD_ERR_WRITE_TO_FILE_EN -}; - -const char MSG_SD_FILE_OPENED_EN[] PROGMEM = "File opened: "; -const char * const MSG_SD_FILE_OPENED_LANG_TABLE[1] PROGMEM = { - MSG_SD_FILE_OPENED_EN -}; - -const char MSG_SD_FILE_SELECTED_EN[] PROGMEM = "File selected"; -const char * const MSG_SD_FILE_SELECTED_LANG_TABLE[1] PROGMEM = { - MSG_SD_FILE_SELECTED_EN -}; - -const char MSG_SD_INIT_FAIL_EN[] PROGMEM = "SD init fail"; -const char * const MSG_SD_INIT_FAIL_LANG_TABLE[1] PROGMEM = { - MSG_SD_INIT_FAIL_EN -}; - -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 inserita"; -const char MSG_SD_INSERTED_ES[] PROGMEM = "Tarjeta insertada"; -const char MSG_SD_INSERTED_PL[] PROGMEM = "Karta wlozona"; -const char MSG_SD_INSERTED_DE[] PROGMEM = "SD Karte eingesetzt"; -const char MSG_SD_INSERTED_NL[] PROGMEM = "SD ingestoken"; -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, - MSG_SD_INSERTED_DE, - MSG_SD_INSERTED_NL -}; - -const char MSG_SD_NOT_PRINTING_EN[] PROGMEM = "Not SD printing"; -const char * const MSG_SD_NOT_PRINTING_LANG_TABLE[1] PROGMEM = { - MSG_SD_NOT_PRINTING_EN -}; - -const char MSG_SD_OPENROOT_FAIL_EN[] PROGMEM = "openRoot failed"; -const char * const MSG_SD_OPENROOT_FAIL_LANG_TABLE[1] PROGMEM = { - MSG_SD_OPENROOT_FAIL_EN -}; - -const char MSG_SD_OPEN_FILE_FAIL_EN[] PROGMEM = "open failed, File: "; -const char * const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[1] PROGMEM = { - MSG_SD_OPEN_FILE_FAIL_EN -}; - -const char MSG_SD_PRINTING_BYTE_EN[] PROGMEM = "SD printing byte "; -const char * const MSG_SD_PRINTING_BYTE_LANG_TABLE[1] PROGMEM = { - MSG_SD_PRINTING_BYTE_EN -}; - -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 rimossa"; -const char MSG_SD_REMOVED_ES[] PROGMEM = "Tarjeta retirada"; -const char MSG_SD_REMOVED_PL[] PROGMEM = "Karta wyjeta"; -const char MSG_SD_REMOVED_DE[] PROGMEM = "SD Karte entfernt"; -const char MSG_SD_REMOVED_NL[] PROGMEM = "SD verwijderd"; -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, - MSG_SD_REMOVED_DE, - MSG_SD_REMOVED_NL -}; - -const char MSG_SD_SIZE_EN[] PROGMEM = " Size: "; -const char * const MSG_SD_SIZE_LANG_TABLE[1] PROGMEM = { - MSG_SD_SIZE_EN -}; - -const char MSG_SD_VOL_INIT_FAIL_EN[] PROGMEM = "volume.init failed"; -const char * const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[1] PROGMEM = { - MSG_SD_VOL_INIT_FAIL_EN -}; - -const char MSG_SD_WORKDIR_FAIL_EN[] PROGMEM = "workDir open failed"; -const char * const MSG_SD_WORKDIR_FAIL_LANG_TABLE[1] PROGMEM = { - MSG_SD_WORKDIR_FAIL_EN -}; - -const char MSG_SD_WRITE_TO_FILE_EN[] PROGMEM = "Writing to file: "; -const char * const MSG_SD_WRITE_TO_FILE_LANG_TABLE[1] PROGMEM = { - MSG_SD_WRITE_TO_FILE_EN -}; - -const char MSG_SELFTEST_EN[] PROGMEM = "Selftest "; -const char MSG_SELFTEST_IT[] PROGMEM = "Autotest"; -const char MSG_SELFTEST_ES[] PROGMEM = "Autotest"; -const char MSG_SELFTEST_DE[] PROGMEM = "Selbsttest "; -const char MSG_SELFTEST_NL[] PROGMEM = "Zelftest "; -const char * const MSG_SELFTEST_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_EN, - MSG_SELFTEST_EN, - MSG_SELFTEST_IT, - MSG_SELFTEST_ES, - MSG_SELFTEST_EN, - MSG_SELFTEST_DE, - MSG_SELFTEST_NL -}; - -const char MSG_SELFTEST_BEDHEATER_EN[] PROGMEM = "Bed / Heater"; -const char MSG_SELFTEST_BEDHEATER_IT[] PROGMEM = "Letto/Riscald."; -const char MSG_SELFTEST_BEDHEATER_ES[] PROGMEM = "Cama/Calentador"; -const char MSG_SELFTEST_BEDHEATER_DE[] PROGMEM = "Bett / Heater"; -const char * const MSG_SELFTEST_BEDHEATER_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_BEDHEATER_EN, - MSG_SELFTEST_BEDHEATER_EN, - MSG_SELFTEST_BEDHEATER_IT, - MSG_SELFTEST_BEDHEATER_ES, - MSG_SELFTEST_BEDHEATER_EN, - MSG_SELFTEST_BEDHEATER_DE, - MSG_SELFTEST_BEDHEATER_EN -}; - -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 MSG_SELFTEST_CHECK_ALLCORRECT_DE[] PROGMEM = "Alles richtig "; -const char MSG_SELFTEST_CHECK_ALLCORRECT_NL[] PROGMEM = "Allemaal goed "; -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, - MSG_SELFTEST_CHECK_ALLCORRECT_DE, - MSG_SELFTEST_CHECK_ALLCORRECT_NL -}; - -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 letto"; -const char MSG_SELFTEST_CHECK_BED_ES[] PROGMEM = "Control de cama"; -const char MSG_SELFTEST_CHECK_BED_PL[] PROGMEM = "Kontrola bed "; -const char MSG_SELFTEST_CHECK_BED_DE[] PROGMEM = "Pruefe Bett "; -const char MSG_SELFTEST_CHECK_BED_NL[] PROGMEM = "Controleer 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, - MSG_SELFTEST_CHECK_BED_DE, - MSG_SELFTEST_CHECK_BED_NL -}; - -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 finecorsa"; -const char MSG_SELFTEST_CHECK_ENDSTOPS_ES[] PROGMEM = "Cont. topes final"; -const char MSG_SELFTEST_CHECK_ENDSTOPS_PL[] PROGMEM = "Kontrola endstops"; -const char MSG_SELFTEST_CHECK_ENDSTOPS_DE[] PROGMEM = "Pruefe Endschalter "; -const char MSG_SELFTEST_CHECK_ENDSTOPS_NL[] PROGMEM = "Controleer 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, - MSG_SELFTEST_CHECK_ENDSTOPS_DE, - MSG_SELFTEST_CHECK_ENDSTOPS_NL -}; - -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 ugello"; -const char MSG_SELFTEST_CHECK_HOTEND_ES[] PROGMEM = "Control hotend "; -const char MSG_SELFTEST_CHECK_HOTEND_PL[] PROGMEM = "Kontrola hotend "; -const char MSG_SELFTEST_CHECK_HOTEND_DE[] PROGMEM = "Pruefe Hotend "; -const char MSG_SELFTEST_CHECK_HOTEND_NL[] PROGMEM = "Controleer 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, - MSG_SELFTEST_CHECK_HOTEND_DE, - MSG_SELFTEST_CHECK_HOTEND_NL -}; - -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 MSG_SELFTEST_CHECK_X_DE[] PROGMEM = "Pruefe X Achse "; -const char MSG_SELFTEST_CHECK_X_NL[] PROGMEM = "Controleer X as "; -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, - MSG_SELFTEST_CHECK_X_DE, - MSG_SELFTEST_CHECK_X_NL -}; - -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 MSG_SELFTEST_CHECK_Y_DE[] PROGMEM = "Pruefe Y Achse "; -const char MSG_SELFTEST_CHECK_Y_NL[] PROGMEM = "Controleer Y as "; -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, - MSG_SELFTEST_CHECK_Y_DE, - MSG_SELFTEST_CHECK_Y_NL -}; - -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 MSG_SELFTEST_CHECK_Z_DE[] PROGMEM = "Pruefe Z Achse "; -const char MSG_SELFTEST_CHECK_Z_NL[] PROGMEM = "Controleer Z as "; -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, - MSG_SELFTEST_CHECK_Z_DE, - MSG_SELFTEST_CHECK_Z_NL -}; - -const char MSG_SELFTEST_COOLING_FAN_EN[] PROGMEM = "Front print fan?";; -const char MSG_SELFTEST_COOLING_FAN_CZ[] PROGMEM = "Predni tiskovy vent?";; -const char MSG_SELFTEST_COOLING_FAN_IT[] PROGMEM = "Vent di stampa ant.?";; -const char MSG_SELFTEST_COOLING_FAN_ES[] PROGMEM = "Vent. al frente?";; -const char MSG_SELFTEST_COOLING_FAN_PL[] PROGMEM = "Przodni went. druku?";; -const char MSG_SELFTEST_COOLING_FAN_DE[] PROGMEM = "Vorderer Luefter?";; -const char MSG_SELFTEST_COOLING_FAN_NL[] PROGMEM = "Voordere fan?";; -const char * const MSG_SELFTEST_COOLING_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_COOLING_FAN_EN, - MSG_SELFTEST_COOLING_FAN_CZ, - MSG_SELFTEST_COOLING_FAN_IT, - MSG_SELFTEST_COOLING_FAN_ES, - MSG_SELFTEST_COOLING_FAN_PL, - MSG_SELFTEST_COOLING_FAN_DE, - MSG_SELFTEST_COOLING_FAN_NL -}; - -const char MSG_SELFTEST_ENDSTOP_EN[] PROGMEM = "Endstop"; -const char MSG_SELFTEST_ENDSTOP_IT[] PROGMEM = "Finecorsa"; -const char MSG_SELFTEST_ENDSTOP_ES[] PROGMEM = "Tope final"; -const char * const MSG_SELFTEST_ENDSTOP_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_ENDSTOP_EN, - MSG_SELFTEST_ENDSTOP_EN, - MSG_SELFTEST_ENDSTOP_IT, - MSG_SELFTEST_ENDSTOP_ES, - MSG_SELFTEST_ENDSTOP_EN, - MSG_SELFTEST_ENDSTOP_EN, - MSG_SELFTEST_ENDSTOP_EN -}; - -const char MSG_SELFTEST_ENDSTOPS_EN[] PROGMEM = "Endstops"; -const char MSG_SELFTEST_ENDSTOPS_IT[] PROGMEM = "Finecorsa (2)"; -const char MSG_SELFTEST_ENDSTOPS_ES[] PROGMEM = "Topes final"; -const char MSG_SELFTEST_ENDSTOPS_DE[] PROGMEM = "Endschalter"; -const char * const MSG_SELFTEST_ENDSTOPS_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_ENDSTOPS_EN, - MSG_SELFTEST_ENDSTOPS_EN, - MSG_SELFTEST_ENDSTOPS_IT, - MSG_SELFTEST_ENDSTOPS_ES, - MSG_SELFTEST_ENDSTOPS_EN, - MSG_SELFTEST_ENDSTOPS_DE, - MSG_SELFTEST_ENDSTOPS_EN -}; - -const char MSG_SELFTEST_ENDSTOP_NOTHIT_EN[] PROGMEM = "Endstop not hit"; -const char MSG_SELFTEST_ENDSTOP_NOTHIT_IT[] PROGMEM = "Finec. fuori por."; -const char MSG_SELFTEST_ENDSTOP_NOTHIT_ES[] PROGMEM = "Tope fin. no toc."; -const char MSG_SELFTEST_ENDSTOP_NOTHIT_DE[] PROGMEM = "Endsch. n. erreicht"; -const char MSG_SELFTEST_ENDSTOP_NOTHIT_NL[] PROGMEM = "Endstop niet geraakt"; -const char * const MSG_SELFTEST_ENDSTOP_NOTHIT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_ENDSTOP_NOTHIT_EN, - MSG_SELFTEST_ENDSTOP_NOTHIT_EN, - MSG_SELFTEST_ENDSTOP_NOTHIT_IT, - MSG_SELFTEST_ENDSTOP_NOTHIT_ES, - MSG_SELFTEST_ENDSTOP_NOTHIT_EN, - MSG_SELFTEST_ENDSTOP_NOTHIT_DE, - MSG_SELFTEST_ENDSTOP_NOTHIT_NL -}; - -const char MSG_SELFTEST_ERROR_EN[] PROGMEM = "Selftest error !"; -const char MSG_SELFTEST_ERROR_IT[] PROGMEM = "Autotest negativo"; -const char MSG_SELFTEST_ERROR_ES[] PROGMEM = "Autotest error!"; -const char MSG_SELFTEST_ERROR_DE[] PROGMEM = "Selbsttest Fehler !"; -const char MSG_SELFTEST_ERROR_NL[] PROGMEM = "Zelftest Fout !"; -const char * const MSG_SELFTEST_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_ERROR_EN, - MSG_SELFTEST_ERROR_EN, - MSG_SELFTEST_ERROR_IT, - MSG_SELFTEST_ERROR_ES, - MSG_SELFTEST_ERROR_EN, - MSG_SELFTEST_ERROR_DE, - MSG_SELFTEST_ERROR_NL -}; - -const char MSG_SELFTEST_EXTRUDER_FAN_EN[] PROGMEM = "Left hotend fan?";; -const char MSG_SELFTEST_EXTRUDER_FAN_CZ[] PROGMEM = "Levy vent na trysce?";; -const char MSG_SELFTEST_EXTRUDER_FAN_IT[] PROGMEM = "Vent SX sull'ugello?";; -const char MSG_SELFTEST_EXTRUDER_FAN_ES[] PROGMEM = "Vent. en la izg?";; -const char MSG_SELFTEST_EXTRUDER_FAN_PL[] PROGMEM = "Lewy went na dysze?";; -const char MSG_SELFTEST_EXTRUDER_FAN_DE[] PROGMEM = "Linker Luefter?";; -const char MSG_SELFTEST_EXTRUDER_FAN_NL[] PROGMEM = "Linke fan?";; -const char * const MSG_SELFTEST_EXTRUDER_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_EXTRUDER_FAN_EN, - MSG_SELFTEST_EXTRUDER_FAN_CZ, - MSG_SELFTEST_EXTRUDER_FAN_IT, - MSG_SELFTEST_EXTRUDER_FAN_ES, - MSG_SELFTEST_EXTRUDER_FAN_PL, - MSG_SELFTEST_EXTRUDER_FAN_DE, - MSG_SELFTEST_EXTRUDER_FAN_NL -}; - -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 MSG_SELFTEST_FAILED_DE[] PROGMEM = "Selbsttest misluekt"; -const char MSG_SELFTEST_FAILED_NL[] PROGMEM = "Zelftest mislukt "; -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, - MSG_SELFTEST_FAILED_DE, - MSG_SELFTEST_FAILED_NL -}; - -const char MSG_SELFTEST_FAN_EN[] PROGMEM = "Fan test";; -const char MSG_SELFTEST_FAN_CZ[] PROGMEM = "Test ventilatoru";; -const char MSG_SELFTEST_FAN_IT[] PROGMEM = "Prova del ventilator";; -const char MSG_SELFTEST_FAN_ES[] PROGMEM = "Test del ventilador";; -const char MSG_SELFTEST_FAN_PL[] PROGMEM = "Test wentylatora";; -const char MSG_SELFTEST_FAN_DE[] PROGMEM = "Lueftertest";; -const char * const MSG_SELFTEST_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_FAN_EN, - MSG_SELFTEST_FAN_CZ, - MSG_SELFTEST_FAN_IT, - MSG_SELFTEST_FAN_ES, - MSG_SELFTEST_FAN_PL, - MSG_SELFTEST_FAN_DE, - MSG_SELFTEST_FAN_EN -}; - -const char MSG_SELFTEST_FAN_NO_EN[] PROGMEM = "Not spinning";; -const char MSG_SELFTEST_FAN_NO_CZ[] PROGMEM = "Netoci se";; -const char MSG_SELFTEST_FAN_NO_IT[] PROGMEM = "Non si gira";; -const char MSG_SELFTEST_FAN_NO_ES[] PROGMEM = "Ventilador no gira";; -const char MSG_SELFTEST_FAN_NO_PL[] PROGMEM = "Nekreci sie";; -const char MSG_SELFTEST_FAN_NO_DE[] PROGMEM = "Dreht nicht";; -const char MSG_SELFTEST_FAN_NO_NL[] PROGMEM = "Roteert niet";; -const char * const MSG_SELFTEST_FAN_NO_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_FAN_NO_EN, - MSG_SELFTEST_FAN_NO_CZ, - MSG_SELFTEST_FAN_NO_IT, - MSG_SELFTEST_FAN_NO_ES, - MSG_SELFTEST_FAN_NO_PL, - MSG_SELFTEST_FAN_NO_DE, - MSG_SELFTEST_FAN_NO_NL -}; - -const char MSG_SELFTEST_FAN_YES_EN[] PROGMEM = "Spinning";; -const char MSG_SELFTEST_FAN_YES_CZ[] PROGMEM = "Toci se";; -const char MSG_SELFTEST_FAN_YES_IT[] PROGMEM = "Gira";; -const char MSG_SELFTEST_FAN_YES_ES[] PROGMEM = "Ventilador gira";; -const char MSG_SELFTEST_FAN_YES_PL[] PROGMEM = "Kreci sie";; -const char MSG_SELFTEST_FAN_YES_DE[] PROGMEM = "Dreht";; -const char MSG_SELFTEST_FAN_YES_NL[] PROGMEM = "Roteert";; -const char * const MSG_SELFTEST_FAN_YES_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_FAN_YES_EN, - MSG_SELFTEST_FAN_YES_CZ, - MSG_SELFTEST_FAN_YES_IT, - MSG_SELFTEST_FAN_YES_ES, - MSG_SELFTEST_FAN_YES_PL, - MSG_SELFTEST_FAN_YES_DE, - MSG_SELFTEST_FAN_YES_NL -}; - -const char MSG_SELFTEST_HEATERTHERMISTOR_EN[] PROGMEM = "Heater/Thermistor"; -const char MSG_SELFTEST_HEATERTHERMISTOR_IT[] PROGMEM = "Riscald./Termist."; -const char MSG_SELFTEST_HEATERTHERMISTOR_ES[] PROGMEM = "Calent./Termistor"; -const char * const MSG_SELFTEST_HEATERTHERMISTOR_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_HEATERTHERMISTOR_EN, - MSG_SELFTEST_HEATERTHERMISTOR_EN, - MSG_SELFTEST_HEATERTHERMISTOR_IT, - MSG_SELFTEST_HEATERTHERMISTOR_ES, - MSG_SELFTEST_HEATERTHERMISTOR_EN, - MSG_SELFTEST_HEATERTHERMISTOR_EN, - MSG_SELFTEST_HEATERTHERMISTOR_EN -}; - -const char MSG_SELFTEST_MOTOR_EN[] PROGMEM = "Motor"; -const char MSG_SELFTEST_MOTOR_IT[] PROGMEM = "Motore"; -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_EN, - MSG_SELFTEST_MOTOR_IT, - MSG_SELFTEST_MOTOR_EN, - MSG_SELFTEST_MOTOR_PL, - MSG_SELFTEST_MOTOR_EN, - MSG_SELFTEST_MOTOR_EN -}; - -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 MSG_SELFTEST_NOTCONNECTED_DE[] PROGMEM = "Nicht angeschlossen"; -const char MSG_SELFTEST_NOTCONNECTED_NL[] PROGMEM = "Niet aangesloten"; -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, - MSG_SELFTEST_NOTCONNECTED_DE, - MSG_SELFTEST_NOTCONNECTED_NL -}; - -const char MSG_SELFTEST_OK_EN[] PROGMEM = "Self test OK"; -const char MSG_SELFTEST_OK_IT[] PROGMEM = "Autotest OK"; -const char MSG_SELFTEST_OK_DE[] PROGMEM = "Selbsttest OK"; -const char MSG_SELFTEST_OK_NL[] PROGMEM = "Zelftest OK"; -const char * const MSG_SELFTEST_OK_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_OK_EN, - MSG_SELFTEST_OK_EN, - MSG_SELFTEST_OK_IT, - MSG_SELFTEST_OK_EN, - MSG_SELFTEST_OK_EN, - MSG_SELFTEST_OK_DE, - MSG_SELFTEST_OK_NL -}; - -const char MSG_SELFTEST_PLEASECHECK_EN[] PROGMEM = "Please check :"; -const char MSG_SELFTEST_PLEASECHECK_CZ[] PROGMEM = "Zkontrolujte :"; -const char MSG_SELFTEST_PLEASECHECK_IT[] PROGMEM = "Verificare:"; -const char MSG_SELFTEST_PLEASECHECK_ES[] PROGMEM = "Controla :"; -const char MSG_SELFTEST_PLEASECHECK_PL[] PROGMEM = "Skontroluj :"; -const char MSG_SELFTEST_PLEASECHECK_DE[] PROGMEM = "Bitte pruefe:"; -const char MSG_SELFTEST_PLEASECHECK_NL[] PROGMEM = "Controleer aub:"; -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, - MSG_SELFTEST_PLEASECHECK_DE, - MSG_SELFTEST_PLEASECHECK_NL -}; - -const char MSG_SELFTEST_START_EN[] PROGMEM = "Self test start "; -const char MSG_SELFTEST_START_IT[] PROGMEM = "Avvia autotest"; -const char MSG_SELFTEST_START_ES[] PROGMEM = "Autotest salida"; -const char MSG_SELFTEST_START_DE[] PROGMEM = "Selbsttest start "; -const char MSG_SELFTEST_START_NL[] PROGMEM = "Zelftest start "; -const char * const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SELFTEST_START_EN, - MSG_SELFTEST_START_EN, - MSG_SELFTEST_START_IT, - MSG_SELFTEST_START_ES, - MSG_SELFTEST_START_EN, - MSG_SELFTEST_START_DE, - MSG_SELFTEST_START_NL -}; - -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 conexion"; -const char MSG_SELFTEST_WIRINGERROR_PL[] PROGMEM = "Blad polaczenia"; -const char MSG_SELFTEST_WIRINGERROR_DE[] PROGMEM = "Verdrahtungsfehler"; -const char MSG_SELFTEST_WIRINGERROR_NL[] PROGMEM = "Bedrading fout"; -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, - MSG_SELFTEST_WIRINGERROR_DE, - MSG_SELFTEST_WIRINGERROR_NL -}; - -const char MSG_SERIAL_ERROR_MENU_STRUCTURE_EN[] PROGMEM = "Error in menu structure"; -const char * const MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE[1] PROGMEM = { - MSG_SERIAL_ERROR_MENU_STRUCTURE_EN -}; - -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 = "Configuracion"; -const char MSG_SETTINGS_PL[] PROGMEM = "Ustawienia"; -const char MSG_SETTINGS_DE[] PROGMEM = "Einstellungen"; -const char MSG_SETTINGS_NL[] PROGMEM = "Instellingen"; -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, - MSG_SETTINGS_DE, - MSG_SETTINGS_NL -}; - -const char MSG_SET_HOME_OFFSETS_EN[] PROGMEM = "Set home offsets"; -const char * const MSG_SET_HOME_OFFSETS_LANG_TABLE[1] PROGMEM = { - MSG_SET_HOME_OFFSETS_EN -}; - -const char MSG_SET_ORIGIN_EN[] PROGMEM = "Set origin"; -const char * const MSG_SET_ORIGIN_LANG_TABLE[1] PROGMEM = { - MSG_SET_ORIGIN_EN -}; - -const char MSG_SET_TEMPERATURE_EN[] PROGMEM = "Set temperature:"; -const char MSG_SET_TEMPERATURE_CZ[] PROGMEM = "Nastavte teplotu:"; -const char MSG_SET_TEMPERATURE_IT[] PROGMEM = "Imposta temperatura"; -const char MSG_SET_TEMPERATURE_ES[] PROGMEM = "Establecer temp.:"; -const char MSG_SET_TEMPERATURE_PL[] PROGMEM = "Ustawic temperature"; -const char MSG_SET_TEMPERATURE_DE[] PROGMEM = "Temp.einstellen"; -const char MSG_SET_TEMPERATURE_NL[] PROGMEM = "Temp. instellen"; -const char * const MSG_SET_TEMPERATURE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SET_TEMPERATURE_EN, - MSG_SET_TEMPERATURE_CZ, - MSG_SET_TEMPERATURE_IT, - MSG_SET_TEMPERATURE_ES, - MSG_SET_TEMPERATURE_PL, - MSG_SET_TEMPERATURE_DE, - MSG_SET_TEMPERATURE_NL -}; - -const char MSG_SEVERE_SKEW_EN[] PROGMEM = "Severe skew:"; -const char MSG_SEVERE_SKEW_CZ[] PROGMEM = "Tezke zkoseni:"; -const char MSG_SEVERE_SKEW_IT[] PROGMEM = "Inc. rilevante:"; -const char MSG_SEVERE_SKEW_ES[] PROGMEM = "Inclin. severa:"; -const char MSG_SEVERE_SKEW_PL[] PROGMEM = "Ostre sciecie:"; -const char MSG_SEVERE_SKEW_DE[] PROGMEM = "Schwere Asym.:"; -const char MSG_SEVERE_SKEW_NL[] PROGMEM = "Hevige Asym.:"; -const char * const MSG_SEVERE_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SEVERE_SKEW_EN, - MSG_SEVERE_SKEW_CZ, - MSG_SEVERE_SKEW_IT, - MSG_SEVERE_SKEW_ES, - MSG_SEVERE_SKEW_PL, - MSG_SEVERE_SKEW_DE, - MSG_SEVERE_SKEW_NL -}; - -const char MSG_SHOW_END_STOPS_EN[] PROGMEM = "Show end stops"; -const char MSG_SHOW_END_STOPS_CZ[] PROGMEM = "Stav konc. spin."; -const char MSG_SHOW_END_STOPS_IT[] PROGMEM = "Stato finecorsa"; -const char MSG_SHOW_END_STOPS_ES[] PROGMEM = "Ensena tope final"; -const char MSG_SHOW_END_STOPS_PL[] PROGMEM = "Pokaz krancowki"; -const char MSG_SHOW_END_STOPS_DE[] PROGMEM = "Anzeigen Enschalter"; -const char MSG_SHOW_END_STOPS_NL[] PROGMEM = "Toon endstops"; -const char * const MSG_SHOW_END_STOPS_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SHOW_END_STOPS_EN, - MSG_SHOW_END_STOPS_CZ, - MSG_SHOW_END_STOPS_IT, - MSG_SHOW_END_STOPS_ES, - MSG_SHOW_END_STOPS_PL, - MSG_SHOW_END_STOPS_DE, - MSG_SHOW_END_STOPS_NL -}; - -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 = "Mode [forte]"; -const char MSG_SILENT_MODE_OFF_ES[] PROGMEM = "Modo [rend.pleno]"; -const char MSG_SILENT_MODE_OFF_PL[] PROGMEM = "Mod [w wydajnosc]"; -const char MSG_SILENT_MODE_OFF_DE[] PROGMEM = "Mode [Hohe Leist]"; -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, - MSG_SILENT_MODE_OFF_DE, - MSG_SILENT_MODE_OFF_EN -}; - -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 MSG_SILENT_MODE_ON_DE[] PROGMEM = "Mode [leise]"; -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, - MSG_SILENT_MODE_ON_DE, - MSG_SILENT_MODE_ON_EN -}; - -const char MSG_SLIGHT_SKEW_EN[] PROGMEM = "Slight skew:"; -const char MSG_SLIGHT_SKEW_CZ[] PROGMEM = "Lehke zkoseni:"; -const char MSG_SLIGHT_SKEW_IT[] PROGMEM = "Incl. leggera:"; -const char MSG_SLIGHT_SKEW_ES[] PROGMEM = "Inclin. ligera:"; -const char MSG_SLIGHT_SKEW_PL[] PROGMEM = "Lekkie sciecie:"; -const char MSG_SLIGHT_SKEW_DE[] PROGMEM = "Geringe Asym.:"; -const char MSG_SLIGHT_SKEW_NL[] PROGMEM = "Geringe Asym.:"; -const char * const MSG_SLIGHT_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_SLIGHT_SKEW_EN, - MSG_SLIGHT_SKEW_CZ, - MSG_SLIGHT_SKEW_IT, - MSG_SLIGHT_SKEW_ES, - MSG_SLIGHT_SKEW_PL, - MSG_SLIGHT_SKEW_DE, - MSG_SLIGHT_SKEW_NL -}; - -const char MSG_SOFTWARE_RESET_EN[] PROGMEM = " Software Reset"; -const char * const MSG_SOFTWARE_RESET_LANG_TABLE[1] PROGMEM = { - MSG_SOFTWARE_RESET_EN -}; - -const char MSG_SPEED_EN[] PROGMEM = "Speed"; -const char MSG_SPEED_CZ[] PROGMEM = "Rychlost"; -const char MSG_SPEED_IT[] PROGMEM = "Velocita"; -const char MSG_SPEED_ES[] PROGMEM = "Velocidad"; -const char MSG_SPEED_PL[] PROGMEM = "Predkosc"; -const char MSG_SPEED_DE[] PROGMEM = "Geschwindigkeit"; -const char MSG_SPEED_NL[] PROGMEM = "Snelheid"; -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, - MSG_SPEED_DE, - MSG_SPEED_NL -}; - -const char MSG_STACK_ERROR_EN[] PROGMEM = "Error - static memory has been overwritten"; -const char * const MSG_STACK_ERROR_LANG_TABLE[1] PROGMEM = { - MSG_STACK_ERROR_EN -}; - -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 MSG_STATISTICS_DE[] PROGMEM = "Statistiken "; -const char MSG_STATISTICS_NL[] PROGMEM = "Statistieken"; -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, - MSG_STATISTICS_DE, - MSG_STATISTICS_NL -}; - -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 usato:"; -const char MSG_STATS_FILAMENTUSED_ES[] PROGMEM = "Filamento : "; -const char MSG_STATS_FILAMENTUSED_PL[] PROGMEM = "Filament : "; -const char MSG_STATS_FILAMENTUSED_DE[] PROGMEM = "Filamentverbrauch:"; -const char MSG_STATS_FILAMENTUSED_NL[] PROGMEM = "Filamentverbruik:"; -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, - MSG_STATS_FILAMENTUSED_DE, - MSG_STATS_FILAMENTUSED_NL -}; - -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 di stampa:"; -const char MSG_STATS_PRINTTIME_ES[] PROGMEM = "Tiempo de imp.:"; -const char MSG_STATS_PRINTTIME_PL[] PROGMEM = "Czas druku : "; -const char MSG_STATS_PRINTTIME_DE[] PROGMEM = "Druckzeit: "; -const char MSG_STATS_PRINTTIME_NL[] PROGMEM = "Printtijd: "; -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, - MSG_STATS_PRINTTIME_DE, - MSG_STATS_PRINTTIME_NL -}; - -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 MSG_STATS_TOTALFILAMENT_DE[] PROGMEM = "Filament Gesamt:"; -const char MSG_STATS_TOTALFILAMENT_NL[] PROGMEM = "Filament total: "; -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, - MSG_STATS_TOTALFILAMENT_DE, - MSG_STATS_TOTALFILAMENT_NL -}; - -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 MSG_STATS_TOTALPRINTTIME_DE[] PROGMEM = "Totale Druckzeit:"; -const char MSG_STATS_TOTALPRINTTIME_NL[] PROGMEM = "Total printtijd:"; -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, - MSG_STATS_TOTALPRINTTIME_DE, - MSG_STATS_TOTALPRINTTIME_NL -}; - -const char MSG_STEPPER_TOO_HIGH_EN[] PROGMEM = "Steprate too high: "; -const char * const MSG_STEPPER_TOO_HIGH_LANG_TABLE[1] PROGMEM = { - MSG_STEPPER_TOO_HIGH_EN -}; - -const char MSG_STOPPED_EN[] PROGMEM = "STOPPED. "; -const char MSG_STOPPED_IT[] PROGMEM = "ARRESTATO."; -const char MSG_STOPPED_ES[] PROGMEM = "PARADA"; -const char MSG_STOPPED_DE[] PROGMEM = "GESTOPPT. "; -const char MSG_STOPPED_NL[] PROGMEM = "GESTOPT. "; -const char * const MSG_STOPPED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_STOPPED_EN, - MSG_STOPPED_EN, - MSG_STOPPED_IT, - MSG_STOPPED_ES, - MSG_STOPPED_EN, - MSG_STOPPED_DE, - MSG_STOPPED_NL -}; - -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 MSG_STOP_PRINT_DE[] PROGMEM = "Druck abbrechen"; -const char MSG_STOP_PRINT_NL[] PROGMEM = "Print stoppen"; -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, - MSG_STOP_PRINT_DE, - MSG_STOP_PRINT_NL -}; - -const char MSG_STORE_EPROM_EN[] PROGMEM = "Store memory"; -const char * const MSG_STORE_EPROM_LANG_TABLE[1] PROGMEM = { - MSG_STORE_EPROM_EN -}; - -const char MSG_SUPPORT_EN[] PROGMEM = "Support"; -const char MSG_SUPPORT_CZ[] PROGMEM = "Podpora"; -const char MSG_SUPPORT_ES[] PROGMEM = "Soporte"; -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_EN, - MSG_SUPPORT_ES, - MSG_SUPPORT_PL, - MSG_SUPPORT_EN, - MSG_SUPPORT_EN -}; - -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_PL[] PROGMEM = "Zapnout zdroj"; -const char MSG_SWITCH_PS_OFF_DE[] PROGMEM = "Netzteil AUS"; -const char MSG_SWITCH_PS_OFF_NL[] PROGMEM = "Uitschakelen"; -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_EN, - MSG_SWITCH_PS_OFF_EN, - MSG_SWITCH_PS_OFF_PL, - MSG_SWITCH_PS_OFF_DE, - MSG_SWITCH_PS_OFF_NL -}; - -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_PL[] PROGMEM = "Vypnout zdroj"; -const char MSG_SWITCH_PS_ON_DE[] PROGMEM = "Netzteil EIN"; -const char MSG_SWITCH_PS_ON_NL[] PROGMEM = "Opstarten"; -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_EN, - MSG_SWITCH_PS_ON_EN, - MSG_SWITCH_PS_ON_PL, - MSG_SWITCH_PS_ON_DE, - MSG_SWITCH_PS_ON_NL -}; - -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 attualizzare"; -const char MSG_TAKE_EFFECT_ES[] PROGMEM = " para aplicar cambios"; -const char MSG_TAKE_EFFECT_PL[] PROGMEM = " wprow. zmian"; -const char MSG_TAKE_EFFECT_DE[] PROGMEM = " um wirksam zu werden"; -const char MSG_TAKE_EFFECT_NL[] PROGMEM = " om effectief te worden"; -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, - MSG_TAKE_EFFECT_DE, - MSG_TAKE_EFFECT_NL -}; - -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 MSG_TEMPERATURE_DE[] PROGMEM = "Temperatur"; -const char MSG_TEMPERATURE_NL[] PROGMEM = "Temperatuur"; -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, - MSG_TEMPERATURE_DE, - MSG_TEMPERATURE_NL -}; - -const char MSG_TEMP_CALIBRATION_EN[] PROGMEM = "PINDA Temp.cal. "; -const char MSG_TEMP_CALIBRATION_CZ[] PROGMEM = "Tepl. kal. "; -const char MSG_TEMP_CALIBRATION_IT[] PROGMEM = "Cal. temp. "; -const char MSG_TEMP_CALIBRATION_ES[] PROGMEM = "Cal. temp. "; -const char MSG_TEMP_CALIBRATION_PL[] PROGMEM = "Ciepl. kal. "; -const char MSG_TEMP_CALIBRATION_DE[] PROGMEM = "PINDA Temp.Kal. "; -const char MSG_TEMP_CALIBRATION_NL[] PROGMEM = "PINDA Temp.kal."; -const char * const MSG_TEMP_CALIBRATION_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TEMP_CALIBRATION_EN, - MSG_TEMP_CALIBRATION_CZ, - MSG_TEMP_CALIBRATION_IT, - MSG_TEMP_CALIBRATION_ES, - MSG_TEMP_CALIBRATION_PL, - MSG_TEMP_CALIBRATION_DE, - MSG_TEMP_CALIBRATION_NL -}; - -const char MSG_TEMP_CALIBRATION_DONE_EN[] PROGMEM = "PINDA temperature calibration is finished. Click to continue."; -const char MSG_TEMP_CALIBRATION_DONE_CZ[] PROGMEM = "Teplotni kalibrace dokoncena. Pokracujte stiskem tlacitka."; -const char MSG_TEMP_CALIBRATION_DONE_IT[] PROGMEM = "Taratura temperatura terminata. Fare click per continuare."; -const char MSG_TEMP_CALIBRATION_DONE_ES[] PROGMEM = "Calibracon temperatura terminada. Presionar para continuar."; -const char MSG_TEMP_CALIBRATION_DONE_PL[] PROGMEM = "Cieplna kalibracja zakonczona. Kontynuuj przyciskiem"; -const char MSG_TEMP_CALIBRATION_DONE_DE[] PROGMEM = "Die PINDA Temperaturkalibrierung ist beendet. Klicke um fortzufahren."; -const char MSG_TEMP_CALIBRATION_DONE_NL[] PROGMEM = "PINDA temperatuur calibratie is klaar. Klik om door te gaan."; -const char * const MSG_TEMP_CALIBRATION_DONE_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TEMP_CALIBRATION_DONE_EN, - MSG_TEMP_CALIBRATION_DONE_CZ, - MSG_TEMP_CALIBRATION_DONE_IT, - MSG_TEMP_CALIBRATION_DONE_ES, - MSG_TEMP_CALIBRATION_DONE_PL, - MSG_TEMP_CALIBRATION_DONE_DE, - MSG_TEMP_CALIBRATION_DONE_NL -}; - -const char MSG_TEMP_CALIBRATION_OFF_EN[] PROGMEM = "PINDA T.cal.[OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_CZ[] PROGMEM = "Tepl. kal. [OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_IT[] PROGMEM = "Cal. temp. [OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_ES[] PROGMEM = "Cal. temp. [OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_PL[] PROGMEM = "Ciepl. kal. [OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_DE[] PROGMEM = "PINDA T.Kal.[OFF]"; -const char MSG_TEMP_CALIBRATION_OFF_NL[] PROGMEM = "PINDA T.kal.[OFF]"; -const char * const MSG_TEMP_CALIBRATION_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TEMP_CALIBRATION_OFF_EN, - MSG_TEMP_CALIBRATION_OFF_CZ, - MSG_TEMP_CALIBRATION_OFF_IT, - MSG_TEMP_CALIBRATION_OFF_ES, - MSG_TEMP_CALIBRATION_OFF_PL, - MSG_TEMP_CALIBRATION_OFF_DE, - MSG_TEMP_CALIBRATION_OFF_NL -}; - -const char MSG_TEMP_CALIBRATION_ON_EN[] PROGMEM = "PINDA T.cal. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_CZ[] PROGMEM = "Tepl. kal. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_IT[] PROGMEM = "Cal. temp. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_ES[] PROGMEM = "Cal. temp. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_PL[] PROGMEM = "Ciepl. kal. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_DE[] PROGMEM = "PINDA T.Kal. [ON]"; -const char MSG_TEMP_CALIBRATION_ON_NL[] PROGMEM = "PINDA T.kal. [ON]"; -const char * const MSG_TEMP_CALIBRATION_ON_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TEMP_CALIBRATION_ON_EN, - MSG_TEMP_CALIBRATION_ON_CZ, - MSG_TEMP_CALIBRATION_ON_IT, - MSG_TEMP_CALIBRATION_ON_ES, - MSG_TEMP_CALIBRATION_ON_PL, - MSG_TEMP_CALIBRATION_ON_DE, - MSG_TEMP_CALIBRATION_ON_NL -}; - -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN[] PROGMEM = "SD card [normal]"; -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_PL[] PROGMEM = "karta SD [normal]"; -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_DE[] PROGMEM = "SD Karte [normal]"; -const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_PL, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_DE, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN -}; - -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN[] PROGMEM = "SD card [FlshAir]"; -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_PL[] PROGMEM = "karta SD[FlshAir]"; -const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_DE[] PROGMEM = "SD Karte [FlshAir]"; -const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_PL, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_DE, - MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN -}; - -const char MSG_TUNE_EN[] PROGMEM = "Tune"; -const char MSG_TUNE_CZ[] PROGMEM = "Ladit"; -const char MSG_TUNE_IT[] PROGMEM = "Regola"; -const char MSG_TUNE_ES[] PROGMEM = "Ajustar"; -const char MSG_TUNE_PL[] PROGMEM = "Nastroic"; -const char MSG_TUNE_DE[] PROGMEM = "Feineinstellung"; -const char MSG_TUNE_NL[] PROGMEM = "Fijninstellingen"; -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, - MSG_TUNE_DE, - MSG_TUNE_NL -}; - -const char MSG_UNKNOWN_COMMAND_EN[] PROGMEM = "Unknown command: \""; -const char * const MSG_UNKNOWN_COMMAND_LANG_TABLE[1] PROGMEM = { - MSG_UNKNOWN_COMMAND_EN -}; - -const char MSG_UNLOADING_FILAMENT_EN[] PROGMEM = "Unloading filament"; -const char MSG_UNLOADING_FILAMENT_CZ[] PROGMEM = "Vysouvam filament"; -const char MSG_UNLOADING_FILAMENT_IT[] PROGMEM = "Rilasc. filamento"; -const char MSG_UNLOADING_FILAMENT_ES[] PROGMEM = "Soltando filamento"; -const char MSG_UNLOADING_FILAMENT_PL[] PROGMEM = "Wysuwam filament"; -const char MSG_UNLOADING_FILAMENT_DE[] PROGMEM = "Filament auswerfen"; -const char MSG_UNLOADING_FILAMENT_NL[] PROGMEM = "Filament uitwerpen"; -const char * const MSG_UNLOADING_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOADING_FILAMENT_EN, - MSG_UNLOADING_FILAMENT_CZ, - MSG_UNLOADING_FILAMENT_IT, - MSG_UNLOADING_FILAMENT_ES, - MSG_UNLOADING_FILAMENT_PL, - MSG_UNLOADING_FILAMENT_DE, - MSG_UNLOADING_FILAMENT_NL -}; - -const char MSG_UNLOAD_ALL_EN[] PROGMEM = "Unload all"; -const char MSG_UNLOAD_ALL_CZ[] PROGMEM = "Vyjmout vse"; -const char MSG_UNLOAD_ALL_IT[] PROGMEM = "Rilasciare tutti"; -const char MSG_UNLOAD_ALL_ES[] PROGMEM = "Soltar todos fil."; -const char MSG_UNLOAD_ALL_PL[] PROGMEM = "Wyjac wszystkie"; -const char MSG_UNLOAD_ALL_DE[] PROGMEM = "Alles entladen"; -const char MSG_UNLOAD_ALL_NL[] PROGMEM = "Alle ontladen"; -const char * const MSG_UNLOAD_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOAD_ALL_EN, - MSG_UNLOAD_ALL_CZ, - MSG_UNLOAD_ALL_IT, - MSG_UNLOAD_ALL_ES, - MSG_UNLOAD_ALL_PL, - MSG_UNLOAD_ALL_DE, - MSG_UNLOAD_ALL_NL -}; - -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 = "Scarica filamento"; -const char MSG_UNLOAD_FILAMENT_ES[] PROGMEM = "Soltar filamento"; -const char MSG_UNLOAD_FILAMENT_PL[] PROGMEM = "Wyjac filament"; -const char MSG_UNLOAD_FILAMENT_DE[] PROGMEM = "Filament entnehmen"; -const char MSG_UNLOAD_FILAMENT_NL[] PROGMEM = "Filament uithalen"; -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, - MSG_UNLOAD_FILAMENT_DE, - MSG_UNLOAD_FILAMENT_NL -}; - -const char MSG_UNLOAD_FILAMENT_1_EN[] PROGMEM = "Unload filament 1"; -const char MSG_UNLOAD_FILAMENT_1_CZ[] PROGMEM = "Vyjmout filam. 1"; -const char MSG_UNLOAD_FILAMENT_1_IT[] PROGMEM = "Rilasciare fil. 1"; -const char MSG_UNLOAD_FILAMENT_1_ES[] PROGMEM = "Soltar fil. 1"; -const char MSG_UNLOAD_FILAMENT_1_PL[] PROGMEM = "Wyjac filament 1"; -const char MSG_UNLOAD_FILAMENT_1_DE[] PROGMEM = "Filam. 1 entladen"; -const char MSG_UNLOAD_FILAMENT_1_NL[] PROGMEM = "Filam. 1 ontladen"; -const char * const MSG_UNLOAD_FILAMENT_1_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOAD_FILAMENT_1_EN, - MSG_UNLOAD_FILAMENT_1_CZ, - MSG_UNLOAD_FILAMENT_1_IT, - MSG_UNLOAD_FILAMENT_1_ES, - MSG_UNLOAD_FILAMENT_1_PL, - MSG_UNLOAD_FILAMENT_1_DE, - MSG_UNLOAD_FILAMENT_1_NL -}; - -const char MSG_UNLOAD_FILAMENT_2_EN[] PROGMEM = "Unload filament 2"; -const char MSG_UNLOAD_FILAMENT_2_CZ[] PROGMEM = "Vyjmout filam. 2"; -const char MSG_UNLOAD_FILAMENT_2_IT[] PROGMEM = "Rilasciare fil. 1"; -const char MSG_UNLOAD_FILAMENT_2_ES[] PROGMEM = "Soltar fil. 2"; -const char MSG_UNLOAD_FILAMENT_2_PL[] PROGMEM = "Wyjac filament 2"; -const char MSG_UNLOAD_FILAMENT_2_DE[] PROGMEM = "Filam. 2 entladen"; -const char MSG_UNLOAD_FILAMENT_2_NL[] PROGMEM = "Filam. 2 ontladen"; -const char * const MSG_UNLOAD_FILAMENT_2_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOAD_FILAMENT_2_EN, - MSG_UNLOAD_FILAMENT_2_CZ, - MSG_UNLOAD_FILAMENT_2_IT, - MSG_UNLOAD_FILAMENT_2_ES, - MSG_UNLOAD_FILAMENT_2_PL, - MSG_UNLOAD_FILAMENT_2_DE, - MSG_UNLOAD_FILAMENT_2_NL -}; - -const char MSG_UNLOAD_FILAMENT_3_EN[] PROGMEM = "Unload filament 3"; -const char MSG_UNLOAD_FILAMENT_3_CZ[] PROGMEM = "Vyjmout filam. 3"; -const char MSG_UNLOAD_FILAMENT_3_IT[] PROGMEM = "Rilasciare fil. 1"; -const char MSG_UNLOAD_FILAMENT_3_ES[] PROGMEM = "Soltar fil. 3"; -const char MSG_UNLOAD_FILAMENT_3_PL[] PROGMEM = "Wyjac filament 3"; -const char MSG_UNLOAD_FILAMENT_3_DE[] PROGMEM = "Filam. 3 entladen"; -const char MSG_UNLOAD_FILAMENT_3_NL[] PROGMEM = "Filam. 3 ontladen"; -const char * const MSG_UNLOAD_FILAMENT_3_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOAD_FILAMENT_3_EN, - MSG_UNLOAD_FILAMENT_3_CZ, - MSG_UNLOAD_FILAMENT_3_IT, - MSG_UNLOAD_FILAMENT_3_ES, - MSG_UNLOAD_FILAMENT_3_PL, - MSG_UNLOAD_FILAMENT_3_DE, - MSG_UNLOAD_FILAMENT_3_NL -}; - -const char MSG_UNLOAD_FILAMENT_4_EN[] PROGMEM = "Unload filament 4"; -const char MSG_UNLOAD_FILAMENT_4_CZ[] PROGMEM = "Vyjmout filam. 4"; -const char MSG_UNLOAD_FILAMENT_4_IT[] PROGMEM = "Rilasciare fil. 1"; -const char MSG_UNLOAD_FILAMENT_4_ES[] PROGMEM = "Soltar fil. 4"; -const char MSG_UNLOAD_FILAMENT_4_PL[] PROGMEM = "Wyjac filament 4"; -const char MSG_UNLOAD_FILAMENT_4_DE[] PROGMEM = "Filam. 4 entladen"; -const char MSG_UNLOAD_FILAMENT_4_NL[] PROGMEM = "Filam. 4 ontladen"; -const char * const MSG_UNLOAD_FILAMENT_4_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_UNLOAD_FILAMENT_4_EN, - MSG_UNLOAD_FILAMENT_4_CZ, - MSG_UNLOAD_FILAMENT_4_IT, - MSG_UNLOAD_FILAMENT_4_ES, - MSG_UNLOAD_FILAMENT_4_PL, - MSG_UNLOAD_FILAMENT_4_DE, - MSG_UNLOAD_FILAMENT_4_NL -}; - -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 MSG_USB_PRINTING_DE[] PROGMEM = "USB drucken "; -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, - MSG_USB_PRINTING_DE, - MSG_USB_PRINTING_EN -}; - -const char MSG_USED_EN[] PROGMEM = "Used during print"; -const char MSG_USED_CZ[] PROGMEM = "Pouzite behem tisku"; -const char MSG_USED_IT[] PROGMEM = "Usati nella stampa"; -const char MSG_USED_ES[] PROGMEM = "Usado en impresion"; -const char MSG_USED_PL[] PROGMEM = "Uzyte przy druku"; -const char MSG_USED_DE[] PROGMEM = "Benutzt beim Druck"; -const char MSG_USED_NL[] PROGMEM = "Gebruikt bij print"; -const char * const MSG_USED_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_USED_EN, - MSG_USED_CZ, - MSG_USED_IT, - MSG_USED_ES, - MSG_USED_PL, - MSG_USED_DE, - MSG_USED_NL -}; - -const char MSG_USERWAIT_EN[] PROGMEM = "Wait for user..."; -const char MSG_USERWAIT_IT[] PROGMEM = "Attendendo utente"; -const char MSG_USERWAIT_ES[] PROGMEM = "Esperando ordenes"; -const char MSG_USERWAIT_DE[] PROGMEM = "Warte auf Nutzer..."; -const char MSG_USERWAIT_NL[] PROGMEM = "Wachten op gebruiker"; -const char * const MSG_USERWAIT_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_USERWAIT_EN, - MSG_USERWAIT_EN, - MSG_USERWAIT_IT, - MSG_USERWAIT_ES, - MSG_USERWAIT_EN, - MSG_USERWAIT_DE, - MSG_USERWAIT_NL -}; - -const char MSG_VMIN_EN[] PROGMEM = "Vmin"; -const char * const MSG_VMIN_LANG_TABLE[1] PROGMEM = { - MSG_VMIN_EN -}; - -const char MSG_VOLUMETRIC_EN[] PROGMEM = "Filament"; -const char * const MSG_VOLUMETRIC_LANG_TABLE[1] PROGMEM = { - MSG_VOLUMETRIC_EN -}; - -const char MSG_VOLUMETRIC_ENABLED_EN[] PROGMEM = "E in mm3"; -const char * const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[1] PROGMEM = { - MSG_VOLUMETRIC_ENABLED_EN -}; - -const char MSG_VTRAV_MIN_EN[] PROGMEM = "VTrav min"; -const char * const MSG_VTRAV_MIN_LANG_TABLE[1] PROGMEM = { - MSG_VTRAV_MIN_EN -}; - -const char MSG_WAITING_TEMP_EN[] PROGMEM = "Waiting for nozzle and bed cooling"; -const char MSG_WAITING_TEMP_CZ[] PROGMEM = "Cekani na zchladnuti trysky a podlozky."; -const char MSG_WAITING_TEMP_IT[] PROGMEM = "In attesa del raffreddamento della testina e del piatto"; -const char MSG_WAITING_TEMP_ES[] PROGMEM = "Esperando enfriamiento de la cama y del extrusor."; -const char MSG_WAITING_TEMP_PL[] PROGMEM = "Oczekiwanie na wychlodzenie dyszy i podkladki."; -const char MSG_WAITING_TEMP_DE[] PROGMEM = "Warten auf Abkuehlung von Duese und Bett."; -const char MSG_WAITING_TEMP_NL[] PROGMEM = "Wachten op afkoelen van heater en bed."; -const char * const MSG_WAITING_TEMP_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_WAITING_TEMP_EN, - MSG_WAITING_TEMP_CZ, - MSG_WAITING_TEMP_IT, - MSG_WAITING_TEMP_ES, - MSG_WAITING_TEMP_PL, - MSG_WAITING_TEMP_DE, - MSG_WAITING_TEMP_NL -}; - -const char MSG_WATCH_EN[] PROGMEM = "Info screen"; -const char MSG_WATCH_CZ[] PROGMEM = "Informace"; -const char MSG_WATCH_IT[] PROGMEM = "Schermata info"; -const char MSG_WATCH_ES[] PROGMEM = "Monitorizar"; -const char MSG_WATCH_PL[] PROGMEM = "Informacje"; -const char MSG_WATCH_DE[] PROGMEM = "Information"; -const char MSG_WATCH_NL[] PROGMEM = "Info scherm"; -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, - MSG_WATCH_DE, - MSG_WATCH_NL -}; - -const char MSG_WATCHDOG_RESET_EN[] PROGMEM = " Watchdog Reset"; -const char * const MSG_WATCHDOG_RESET_LANG_TABLE[1] PROGMEM = { - MSG_WATCHDOG_RESET_EN -}; - -const char MSG_XYZ_DETAILS_EN[] PROGMEM = "XYZ cal. details"; -const char MSG_XYZ_DETAILS_CZ[] PROGMEM = "Detaily XYZ kal."; -const char MSG_XYZ_DETAILS_IT[] PROGMEM = "XYZ Cal. dettagli"; -const char MSG_XYZ_DETAILS_ES[] PROGMEM = "Inform. XYZ cal."; -const char MSG_XYZ_DETAILS_PL[] PROGMEM = "Szczegoly kal.XYZ"; -const char MSG_XYZ_DETAILS_DE[] PROGMEM = "XYZ Kal. Details"; -const char MSG_XYZ_DETAILS_NL[] PROGMEM = "XYZ kal. details"; -const char * const MSG_XYZ_DETAILS_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_XYZ_DETAILS_EN, - MSG_XYZ_DETAILS_CZ, - MSG_XYZ_DETAILS_IT, - MSG_XYZ_DETAILS_ES, - MSG_XYZ_DETAILS_PL, - MSG_XYZ_DETAILS_DE, - MSG_XYZ_DETAILS_NL -}; - -const char MSG_X_MAX_EN[] PROGMEM = "x_max: "; -const char * const MSG_X_MAX_LANG_TABLE[1] PROGMEM = { - MSG_X_MAX_EN -}; - -const char MSG_X_MIN_EN[] PROGMEM = "x_min: "; -const char * const MSG_X_MIN_LANG_TABLE[1] PROGMEM = { - MSG_X_MIN_EN -}; - -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 MSG_YES_DE[] PROGMEM = "Ja"; -const char MSG_YES_NL[] PROGMEM = "Ja"; -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, - MSG_YES_DE, - MSG_YES_NL -}; - -const char MSG_Y_DISTANCE_FROM_MIN_EN[] PROGMEM = "Y distance from min:"; -const char MSG_Y_DISTANCE_FROM_MIN_CZ[] PROGMEM = "Y vzdalenost od min:"; -const char MSG_Y_DISTANCE_FROM_MIN_IT[] PROGMEM = "Distanza Y da min:"; -const char MSG_Y_DISTANCE_FROM_MIN_ES[] PROGMEM = "Dist. Y desde min:"; -const char MSG_Y_DISTANCE_FROM_MIN_PL[] PROGMEM = "Odleglosc Y od min.:"; -const char MSG_Y_DISTANCE_FROM_MIN_DE[] PROGMEM = "Y Entfernung von min"; -const char MSG_Y_DISTANCE_FROM_MIN_NL[] PROGMEM = "Y afstand van min"; -const char * const MSG_Y_DISTANCE_FROM_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { - MSG_Y_DISTANCE_FROM_MIN_EN, - MSG_Y_DISTANCE_FROM_MIN_CZ, - MSG_Y_DISTANCE_FROM_MIN_IT, - MSG_Y_DISTANCE_FROM_MIN_ES, - MSG_Y_DISTANCE_FROM_MIN_PL, - MSG_Y_DISTANCE_FROM_MIN_DE, - MSG_Y_DISTANCE_FROM_MIN_NL -}; - -const char MSG_Y_MAX_EN[] PROGMEM = "y_max: "; -const char * const MSG_Y_MAX_LANG_TABLE[1] PROGMEM = { - MSG_Y_MAX_EN -}; - -const char MSG_Y_MIN_EN[] PROGMEM = "y_min: "; -const char * const MSG_Y_MIN_LANG_TABLE[1] PROGMEM = { - MSG_Y_MIN_EN -}; - -const char MSG_ZPROBE_OUT_EN[] PROGMEM = "Z probe out. bed"; -const char * const MSG_ZPROBE_OUT_LANG_TABLE[1] PROGMEM = { - MSG_ZPROBE_OUT_EN -}; - -const char MSG_ZPROBE_ZOFFSET_EN[] PROGMEM = "Z Offset"; -const char * const MSG_ZPROBE_ZOFFSET_LANG_TABLE[1] PROGMEM = { - MSG_ZPROBE_ZOFFSET_EN -}; - -const char MSG_Z_MAX_EN[] PROGMEM = "z_max: "; -const char * const MSG_Z_MAX_LANG_TABLE[1] PROGMEM = { - MSG_Z_MAX_EN -}; - -const char MSG_Z_MIN_EN[] PROGMEM = "z_min: "; -const char * const MSG_Z_MIN_LANG_TABLE[1] PROGMEM = { - MSG_Z_MIN_EN -}; - -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 " pronta."; -const char WELCOME_MSG_ES[] PROGMEM = CUSTOM_MENDEL_NAME " prep."; -const char WELCOME_MSG_PL[] PROGMEM = CUSTOM_MENDEL_NAME " gotowa"; -const char WELCOME_MSG_DE[] PROGMEM = CUSTOM_MENDEL_NAME " bereit."; -const char WELCOME_MSG_NL[] PROGMEM = CUSTOM_MENDEL_NAME " gereed."; -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, - WELCOME_MSG_DE, - WELCOME_MSG_NL -}; - - -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 "Configuration_prusa.h" +#include "language_all.h" + +#define LCD_WIDTH 20 +extern unsigned char lang_selected; + +const char MSG_ACTIVE_EXTRUDER_EN[] PROGMEM = "Active Extruder: "; +const char * const MSG_ACTIVE_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_ACTIVE_EXTRUDER_EN +}; + +const char MSG_ADJUSTZ_EN[] PROGMEM = "Auto adjust Z?"; +const char MSG_ADJUSTZ_CZ[] PROGMEM = "Auto doladit Z ?"; +const char MSG_ADJUSTZ_IT[] PROGMEM = "Autoregolare Z?"; +const char MSG_ADJUSTZ_ES[] PROGMEM = "Ajustar Eje Z"; +const char MSG_ADJUSTZ_PL[] PROGMEM = "Autodostroic Z?"; +const char MSG_ADJUSTZ_DE[] PROGMEM = "Auto Z einstellen?"; +const char MSG_ADJUSTZ_NL[] PROGMEM = "Auto instellen 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, + MSG_ADJUSTZ_DE, + MSG_ADJUSTZ_NL +}; + +const char MSG_ALL_EN[] PROGMEM = "All"; +const char MSG_ALL_CZ[] PROGMEM = "Vse"; +const char MSG_ALL_IT[] PROGMEM = "Tutti"; +const char MSG_ALL_ES[] PROGMEM = "Todos"; +const char MSG_ALL_PL[] PROGMEM = "Wszystko"; +const char MSG_ALL_DE[] PROGMEM = "Alle"; +const char MSG_ALL_NL[] PROGMEM = "Alle"; +const char * const MSG_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ALL_EN, + MSG_ALL_CZ, + MSG_ALL_IT, + MSG_ALL_ES, + MSG_ALL_PL, + MSG_ALL_DE, + MSG_ALL_NL +}; + +const char MSG_AMAX_EN[] PROGMEM = "Amax "; +const char * const MSG_AMAX_LANG_TABLE[1] PROGMEM = { + MSG_AMAX_EN +}; + +const char MSG_AUTHOR_EN[] PROGMEM = " | Author: "; +const char * const MSG_AUTHOR_LANG_TABLE[1] PROGMEM = { + MSG_AUTHOR_EN +}; + +const char MSG_AUTO_HOME_EN[] PROGMEM = "Auto home"; +const char MSG_AUTO_HOME_IT[] PROGMEM = "Trova origine"; +const char MSG_AUTO_HOME_ES[] PROGMEM = "Llevar al origen"; +const char MSG_AUTO_HOME_DE[] PROGMEM = "Startposition"; +const char MSG_AUTO_HOME_NL[] PROGMEM = "Startpositie"; +const char * const MSG_AUTO_HOME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_AUTO_HOME_EN, + MSG_AUTO_HOME_EN, + MSG_AUTO_HOME_IT, + MSG_AUTO_HOME_ES, + MSG_AUTO_HOME_EN, + MSG_AUTO_HOME_DE, + MSG_AUTO_HOME_NL +}; + +const char MSG_A_RETRACT_EN[] PROGMEM = "A-retract"; +const char * const MSG_A_RETRACT_LANG_TABLE[1] PROGMEM = { + MSG_A_RETRACT_EN +}; + +const char MSG_BABYSTEPPING_X_EN[] PROGMEM = "Babystepping X"; +const char * const MSG_BABYSTEPPING_X_LANG_TABLE[1] PROGMEM = { + MSG_BABYSTEPPING_X_EN +}; + +const char MSG_BABYSTEPPING_Y_EN[] PROGMEM = "Babystepping Y"; +const char * const MSG_BABYSTEPPING_Y_LANG_TABLE[1] PROGMEM = { + MSG_BABYSTEPPING_Y_EN +}; + +const char MSG_BABYSTEPPING_Z_EN[] PROGMEM = "Adjusting Z"; +const char * const MSG_BABYSTEPPING_Z_LANG_TABLE[1] PROGMEM = { + MSG_BABYSTEPPING_Z_EN +}; + +const char MSG_BABYSTEP_X_EN[] PROGMEM = "Babystep X"; +const char * const MSG_BABYSTEP_X_LANG_TABLE[1] PROGMEM = { + MSG_BABYSTEP_X_EN +}; + +const char MSG_BABYSTEP_Y_EN[] PROGMEM = "Babystep Y"; +const char * const MSG_BABYSTEP_Y_LANG_TABLE[1] PROGMEM = { + MSG_BABYSTEP_Y_EN +}; + +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 = "Compensazione Z"; +const char MSG_BABYSTEP_Z_ES[] PROGMEM = "Micropaso Eje Z"; +const char MSG_BABYSTEP_Z_PL[] PROGMEM = "Dostrojenie osy Z"; +const char MSG_BABYSTEP_Z_DE[] PROGMEM = "Live Z einstellen"; +const char MSG_BABYSTEP_Z_NL[] PROGMEM = "Live Z aanpassen"; +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, + MSG_BABYSTEP_Z_DE, + MSG_BABYSTEP_Z_NL +}; + +const char MSG_BABYSTEP_Z_NOT_SET_EN[] PROGMEM = "Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration."; +const char MSG_BABYSTEP_Z_NOT_SET_CZ[] PROGMEM = "Neni zkalibrovana vzdalenost trysky od tiskove podlozky. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy."; +const char MSG_BABYSTEP_Z_NOT_SET_IT[] PROGMEM = "Distanza tra la punta dell'ugello e la superficie del letto non ancora imposta. Si prega di seguire il manuale, capitolo First steps, sezione First layer calibration."; +const char MSG_BABYSTEP_Z_NOT_SET_ES[] PROGMEM = "Distancia entre la punta de la boquilla y la superficie de la cama no fijada aun. Por favor siga el manual, capitulo First steps, seccion First layer calibration."; +const char MSG_BABYSTEP_Z_NOT_SET_PL[] PROGMEM = "Odleglosc dyszy od podkladki nie jest skalibrowana. Postepuj zgodnie z instrukcja rozdzial Zaczynamy, podrozdzial Kalibracja pierwszej warstwy."; +const char MSG_BABYSTEP_Z_NOT_SET_DE[] PROGMEM = "Der Abstand zwischen der Spitze der Duese und der Druckoberflaeche / Bett ist noch nicht eingestellt. Bitte folgen Sie dem Handbuch, First steps, Abschnitt First layer calibration."; +const char MSG_BABYSTEP_Z_NOT_SET_NL[] PROGMEM = "Afstand tussen tip van het tuit en het print oppervlak nog niet vastgesteld. Volg de handleiding, First steps, sectie First layer calibration."; +const char * const MSG_BABYSTEP_Z_NOT_SET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BABYSTEP_Z_NOT_SET_EN, + MSG_BABYSTEP_Z_NOT_SET_CZ, + MSG_BABYSTEP_Z_NOT_SET_IT, + MSG_BABYSTEP_Z_NOT_SET_ES, + MSG_BABYSTEP_Z_NOT_SET_PL, + MSG_BABYSTEP_Z_NOT_SET_DE, + MSG_BABYSTEP_Z_NOT_SET_NL +}; + +const char MSG_BED_EN[] PROGMEM = "Bed"; +const char MSG_BED_IT[] PROGMEM = "Letto"; +const char MSG_BED_ES[] PROGMEM = "Base"; +const char MSG_BED_PL[] PROGMEM = "Stolik"; +const char MSG_BED_DE[] PROGMEM = "Bett"; +const char * const MSG_BED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_EN, + MSG_BED_EN, + MSG_BED_IT, + MSG_BED_ES, + MSG_BED_PL, + MSG_BED_DE, + MSG_BED_EN +}; + +const char MSG_BED_CORRECTION_FRONT_EN[] PROGMEM = "Front side[um]"; +const char MSG_BED_CORRECTION_FRONT_CZ[] PROGMEM = "Vpredu [um]"; +const char MSG_BED_CORRECTION_FRONT_IT[] PROGMEM = "Fronte [um]"; +const char MSG_BED_CORRECTION_FRONT_ES[] PROGMEM = "Adelante [um]"; +const char MSG_BED_CORRECTION_FRONT_PL[] PROGMEM = "Do przodu [um]"; +const char MSG_BED_CORRECTION_FRONT_DE[] PROGMEM = "Vorne [um]"; +const char MSG_BED_CORRECTION_FRONT_NL[] PROGMEM = "Voorruit [um]"; +const char * const MSG_BED_CORRECTION_FRONT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_FRONT_EN, + MSG_BED_CORRECTION_FRONT_CZ, + MSG_BED_CORRECTION_FRONT_IT, + MSG_BED_CORRECTION_FRONT_ES, + MSG_BED_CORRECTION_FRONT_PL, + MSG_BED_CORRECTION_FRONT_DE, + MSG_BED_CORRECTION_FRONT_NL +}; + +const char MSG_BED_CORRECTION_LEFT_EN[] PROGMEM = "Left side [um]"; +const char MSG_BED_CORRECTION_LEFT_CZ[] PROGMEM = "Vlevo [um]"; +const char MSG_BED_CORRECTION_LEFT_IT[] PROGMEM = "Sinistra [um]"; +const char MSG_BED_CORRECTION_LEFT_ES[] PROGMEM = "Izquierda [um]"; +const char MSG_BED_CORRECTION_LEFT_PL[] PROGMEM = "W lewo [um]"; +const char MSG_BED_CORRECTION_LEFT_DE[] PROGMEM = "Links [um]"; +const char MSG_BED_CORRECTION_LEFT_NL[] PROGMEM = "Links [um]"; +const char * const MSG_BED_CORRECTION_LEFT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_LEFT_EN, + MSG_BED_CORRECTION_LEFT_CZ, + MSG_BED_CORRECTION_LEFT_IT, + MSG_BED_CORRECTION_LEFT_ES, + MSG_BED_CORRECTION_LEFT_PL, + MSG_BED_CORRECTION_LEFT_DE, + MSG_BED_CORRECTION_LEFT_NL +}; + +const char MSG_BED_CORRECTION_MENU_EN[] PROGMEM = "Bed level correct"; +const char MSG_BED_CORRECTION_MENU_CZ[] PROGMEM = "Korekce podlozky"; +const char MSG_BED_CORRECTION_MENU_IT[] PROGMEM = "Correz. liv.letto"; +const char MSG_BED_CORRECTION_MENU_ES[] PROGMEM = "Corr. de la cama"; +const char MSG_BED_CORRECTION_MENU_PL[] PROGMEM = "Korekta podkladki"; +const char MSG_BED_CORRECTION_MENU_DE[] PROGMEM = "Bett level korrekt"; +const char MSG_BED_CORRECTION_MENU_NL[] PROGMEM = "Bed juist"; +const char * const MSG_BED_CORRECTION_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_MENU_EN, + MSG_BED_CORRECTION_MENU_CZ, + MSG_BED_CORRECTION_MENU_IT, + MSG_BED_CORRECTION_MENU_ES, + MSG_BED_CORRECTION_MENU_PL, + MSG_BED_CORRECTION_MENU_DE, + MSG_BED_CORRECTION_MENU_NL +}; + +const char MSG_BED_CORRECTION_REAR_EN[] PROGMEM = "Rear side [um]"; +const char MSG_BED_CORRECTION_REAR_CZ[] PROGMEM = "Vzadu [um]"; +const char MSG_BED_CORRECTION_REAR_IT[] PROGMEM = "Retro [um]"; +const char MSG_BED_CORRECTION_REAR_ES[] PROGMEM = "Atras [um]"; +const char MSG_BED_CORRECTION_REAR_PL[] PROGMEM = "Do tylu [um]"; +const char MSG_BED_CORRECTION_REAR_DE[] PROGMEM = "Hinten [um]"; +const char MSG_BED_CORRECTION_REAR_NL[] PROGMEM = "Achter [um]"; +const char * const MSG_BED_CORRECTION_REAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_REAR_EN, + MSG_BED_CORRECTION_REAR_CZ, + MSG_BED_CORRECTION_REAR_IT, + MSG_BED_CORRECTION_REAR_ES, + MSG_BED_CORRECTION_REAR_PL, + MSG_BED_CORRECTION_REAR_DE, + MSG_BED_CORRECTION_REAR_NL +}; + +const char MSG_BED_CORRECTION_RESET_EN[] PROGMEM = "Reset"; +const char MSG_BED_CORRECTION_RESET_DE[] PROGMEM = "Zuruecksetzen"; +const char * const MSG_BED_CORRECTION_RESET_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_RESET_EN, + MSG_BED_CORRECTION_RESET_EN, + MSG_BED_CORRECTION_RESET_EN, + MSG_BED_CORRECTION_RESET_EN, + MSG_BED_CORRECTION_RESET_EN, + MSG_BED_CORRECTION_RESET_DE, + MSG_BED_CORRECTION_RESET_EN +}; + +const char MSG_BED_CORRECTION_RIGHT_EN[] PROGMEM = "Right side[um]"; +const char MSG_BED_CORRECTION_RIGHT_CZ[] PROGMEM = "Vpravo [um]"; +const char MSG_BED_CORRECTION_RIGHT_IT[] PROGMEM = "Destra [um]"; +const char MSG_BED_CORRECTION_RIGHT_ES[] PROGMEM = "Derecha [um]"; +const char MSG_BED_CORRECTION_RIGHT_PL[] PROGMEM = "W prawo [um]"; +const char MSG_BED_CORRECTION_RIGHT_DE[] PROGMEM = "Rechts [um]"; +const char MSG_BED_CORRECTION_RIGHT_NL[] PROGMEM = "Rechts [um]"; +const char * const MSG_BED_CORRECTION_RIGHT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_CORRECTION_RIGHT_EN, + MSG_BED_CORRECTION_RIGHT_CZ, + MSG_BED_CORRECTION_RIGHT_IT, + MSG_BED_CORRECTION_RIGHT_ES, + MSG_BED_CORRECTION_RIGHT_PL, + MSG_BED_CORRECTION_RIGHT_DE, + MSG_BED_CORRECTION_RIGHT_NL +}; + +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 preparada"; +const char MSG_BED_DONE_PL[] PROGMEM = "Stolik OK."; +const char MSG_BED_DONE_DE[] PROGMEM = "Bett OK"; +const char MSG_BED_DONE_NL[] PROGMEM = "Bed 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, + MSG_BED_DONE_DE, + MSG_BED_DONE_NL +}; + +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 = "Riscald. letto"; +const char MSG_BED_HEATING_ES[] PROGMEM = "Calentando Base"; +const char MSG_BED_HEATING_PL[] PROGMEM = "Grzanie stolika.."; +const char MSG_BED_HEATING_DE[] PROGMEM = "Bett aufheizen"; +const char MSG_BED_HEATING_NL[] PROGMEM = "Bed opwarmen"; +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, + MSG_BED_HEATING_DE, + MSG_BED_HEATING_NL +}; + +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_EN[] PROGMEM = "Bed leveling failed. Sensor triggered too high. Waiting for reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_IT[] PROGMEM = "Livellamento letto fallito.Risp sensore troppo prestoIn attesa di reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_ES[] PROGMEM = "Nivelacion fallada. Sensor funciona demasiado temprano. Esperando reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_PL[] PROGMEM = "Kalibracja Z nieudana. Sensor dotk. za wysoko. Czekam na reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor wurde zu hoch ausgeloest. Warte auf Reset."; +const char MSG_BED_LEVELING_FAILED_POINT_HIGH_NL[] PROGMEM = "Bed nivellering mislukt. Een sensor heeft te hoog getriggerd. Wacht op reset."; +const char * const MSG_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_LEVELING_FAILED_POINT_HIGH_EN, + MSG_BED_LEVELING_FAILED_POINT_HIGH_CZ, + MSG_BED_LEVELING_FAILED_POINT_HIGH_IT, + MSG_BED_LEVELING_FAILED_POINT_HIGH_ES, + MSG_BED_LEVELING_FAILED_POINT_HIGH_PL, + MSG_BED_LEVELING_FAILED_POINT_HIGH_DE, + MSG_BED_LEVELING_FAILED_POINT_HIGH_NL +}; + +const char MSG_BED_LEVELING_FAILED_POINT_LOW_EN[] PROGMEM = "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_IT[] PROGMEM = "Livellamento letto fallito.NoRispSensor Residui su ugello? In attesa di reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_ES[] PROGMEM = "Nivelacion fallada. Sensor no funciona. Escombros en Boqui.? Esperando reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_PL[] PROGMEM = "Kalibracja nieudana. Sensor nie dotknal. Zanieczysz. dysza? Czekam na reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor wurde nicht ausgeloest. Schmutzige Duese? Warte auf Reset."; +const char MSG_BED_LEVELING_FAILED_POINT_LOW_NL[] PROGMEM = "Bed nivellering mislukt. Sensor was niet geactiveerd. Vuil op nozzle? Wacht op reset."; +const char * const MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_LEVELING_FAILED_POINT_LOW_EN, + MSG_BED_LEVELING_FAILED_POINT_LOW_CZ, + MSG_BED_LEVELING_FAILED_POINT_LOW_IT, + MSG_BED_LEVELING_FAILED_POINT_LOW_ES, + MSG_BED_LEVELING_FAILED_POINT_LOW_PL, + MSG_BED_LEVELING_FAILED_POINT_LOW_DE, + MSG_BED_LEVELING_FAILED_POINT_LOW_NL +}; + +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN[] PROGMEM = "Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ[] PROGMEM = "Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_IT[] PROGMEM = "Livellamento letto fallito. Sensore discon. o Cavo Dann. In attesa di reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES[] PROGMEM = "Nivelacion fallada. Sensor desconectado o cables danados. Esperando reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL[] PROGMEM = "Kalibracja nieudana. Sensor odlaczony lub uszkodz. kabel. Czekam na reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_DE[] PROGMEM = "Bett-Nivellierung fehlgeschlagen. Sensor nicht angeschlossen oder Kabel defekt. Warte auf Reset."; +const char MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_NL[] PROGMEM = "Bed nivellering mislukt.Sensor niet aangesloten of kabel gebroken.Wacht op reset"; +const char * const MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_EN, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_CZ, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_IT, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_ES, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_PL, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_DE, + MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration failed. Front calibration points not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punti anteriori non raggiungibili."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delanteros no alcanzables."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Przed. punkty kalibr. zbyt do przodu. Wyrownac drukarke."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Voorzijde kalibratiepunten niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration failed. Left front calibration point not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punto anteriore sinistro non raggiungibile."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Lewy przedni punkt zbyt do przodu. Wyrownac drukarke."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Linker voderer Kalibrierpunkt nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Linksvoor kalibratiepunt niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration failed. Right front calibration point not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_IT[] PROGMEM = "Calibrazione XYZ fallita. Punto anteriore destro non raggiungibile."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibracion XYZ fallad. Punto delantero derecho no alcanzable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibr. XYZ nieudana. Prawy przedni punkt zbyt do przodu. Wyrownac drukarke."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_NL[] PROGMEM = "XYZ kalibratie mislukt. Rechtsvoor kalibratiepunt niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN[] PROGMEM = "XYZ calibration failed. Please consult the manual."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ[] PROGMEM = "Kalibrace XYZ selhala. Nahlednete do manualu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_IT[] PROGMEM = "Calibrazione XYZ fallita. Si prega di consultare il manuale."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES[] PROGMEM = "Calibracion XYZ fallada. Consultar el manual por favor."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL[] PROGMEM = "Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch."; +const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_NL[] PROGMEM = "XYZ kalibratie mislukt. Raadpleeg de handleiding."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_EN, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_IT, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_ES, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_PL, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_DE, + MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN[] PROGMEM = "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_CZ[] PROGMEM = "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_IT[] PROGMEM = "Calibrazione XYZ OK. Gli assi X/Y sono perpendicolari. Complimenti!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES[] PROGMEM = "Calibracion XYZ ok. Ejes X/Y perpendiculares. Felicitaciones!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL[] PROGMEM = "Kalibracja XYZ ok. Osie X/Y sa prostopadle. Gratulacje!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander. Glueckwunsch!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen staan perpendiculair. Gefeliciteerd!"; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_EN, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_IT, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_ES, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_PL, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_DE, + MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN[] PROGMEM = "XYZ calibration failed. Bed calibration point was not found."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ[] PROGMEM = "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_IT[] PROGMEM = "Calibrazione XYZ fallita. Il punto di calibrazione sul letto non e' stato trovato."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES[] PROGMEM = "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL[] PROGMEM = "Kalibr. XYZ nieudana. Kalibracyjny punkt podkladki nieznaleziony."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_DE[] PROGMEM = "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden."; +const char MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_NL[] PROGMEM = "XYZ kalibratie mislukt. Bed kalibratiepunt niet gevonden."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_EN, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_IT, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_ES, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_PL, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_DE, + MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN[] PROGMEM = "XYZ calibration all right. Skew will be corrected automatically."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ[] PROGMEM = "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_IT[] PROGMEM = "Calibrazion XYZ corretta. La distorsione verra' automaticamente compensata."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES[] PROGMEM = "Calibracion XYZ correcta. La inclinacion se corregira automaticamente."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL[] PROGMEM = "Kalibracja XYZ prawidlowa. Skosy beda automatycznie wyrownane przy druku."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind sehr schief. Schiefheit wird automatisch korrigiert."; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen zijn heel scheef. Scheefheid wordt automatisch gecorrigeerd."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_EN, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_IT, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_ES, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_PL, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_DE, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN[] PROGMEM = "XYZ calibration all right. X/Y axes are slightly skewed. Good job!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ[] PROGMEM = "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_IT[] PROGMEM = "Calibrazion XYZ corretta. Assi X/Y leggermente storti. Ben fatto!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES[] PROGMEM = "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL[] PROGMEM = "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_DE[] PROGMEM = "XYZ-Kalibrierung ok. X/Y-Achsen sind etwas schief. Schiefheit wird automatisch korrigiert. Gut gemacht!"; +const char MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_NL[] PROGMEM = "XYZ kalibratie ok. X/Y-assen zijn iets scheef. Scheefheid wordt automatisch gecorrigeerd. Goed gedaan!"; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_EN, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_IT, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_ES, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_PL, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_DE, + MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN[] PROGMEM = "XYZ calibration compromised. Front calibration points not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punti anteriori non raggiungibili."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delanteros no alcanzables."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL[] PROGMEM = "Kalibr. XYZ niedokladna. Przednie punkty kalibr. Zbyt wys. do przodu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Vordere Kalibrierpunkte nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Voorzijde kalibratiepunten niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Left front calibration point not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Levy predni bod moc vpredu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punto anteriore sinistro non raggiungibile."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Linker vorderer Kalibrierpunkt nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Linksvoor kalibratiepunt niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_NL +}; + +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN[] PROGMEM = "XYZ calibration compromised. Right front calibration point not reachable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ[] PROGMEM = "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_IT[] PROGMEM = "Calibrazione XYZ compromessa. Punto anteriore destro non raggiungibile."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES[] PROGMEM = "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL[] PROGMEM = "Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_DE[] PROGMEM = "XYZ-Kalibrierung ungenau. Rechter vorderer Kalibrierpunkt nicht erreichbar."; +const char MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_NL[] PROGMEM = "XYZ kalibratie gecompromitteerd. Rechtsvoor kalibratiepunt niet bereikbaar."; +const char * const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_EN, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_CZ, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_IT, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_ES, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_PL, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_DE, + MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_NL +}; + +const char MSG_BEGIN_FILE_LIST_EN[] PROGMEM = "Begin file list"; +const char * const MSG_BEGIN_FILE_LIST_LANG_TABLE[1] PROGMEM = { + MSG_BEGIN_FILE_LIST_EN +}; + +const char MSG_BROWNOUT_RESET_EN[] PROGMEM = " Brown out Reset"; +const char * const MSG_BROWNOUT_RESET_LANG_TABLE[1] PROGMEM = { + MSG_BROWNOUT_RESET_EN +}; + +const char MSG_CALIBRATE_BED_EN[] PROGMEM = "Calibrate XYZ"; +const char MSG_CALIBRATE_BED_CZ[] PROGMEM = "Kalibrace XYZ"; +const char MSG_CALIBRATE_BED_IT[] PROGMEM = "Calibra XYZ"; +const char MSG_CALIBRATE_BED_ES[] PROGMEM = "Calibra XYZ"; +const char MSG_CALIBRATE_BED_PL[] PROGMEM = "Kalibracja XYZ"; +const char MSG_CALIBRATE_BED_DE[] PROGMEM = "Kalibrierung XYZ"; +const char MSG_CALIBRATE_BED_NL[] PROGMEM = "Kalibratie XYZ"; +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, + MSG_CALIBRATE_BED_DE, + MSG_CALIBRATE_BED_NL +}; + +const char MSG_CALIBRATE_BED_RESET_EN[] PROGMEM = "Reset XYZ calibr."; +const char MSG_CALIBRATE_BED_RESET_CZ[] PROGMEM = "Reset XYZ kalibr."; +const char MSG_CALIBRATE_BED_RESET_PL[] PROGMEM = "Reset kalibr. XYZ"; +const char MSG_CALIBRATE_BED_RESET_DE[] PROGMEM = "Reset XYZ Kalibr."; +const char MSG_CALIBRATE_BED_RESET_NL[] PROGMEM = "Reset XYZ kalibr."; +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_EN, + MSG_CALIBRATE_BED_RESET_EN, + MSG_CALIBRATE_BED_RESET_PL, + MSG_CALIBRATE_BED_RESET_DE, + MSG_CALIBRATE_BED_RESET_NL +}; + +const char MSG_CALIBRATE_E_EN[] PROGMEM = "Calibrate E"; +const char MSG_CALIBRATE_E_CZ[] PROGMEM = "Kalibrovat E"; +const char MSG_CALIBRATE_E_IT[] PROGMEM = "Calibra E"; +const char MSG_CALIBRATE_E_ES[] PROGMEM = "Calibrar E"; +const char MSG_CALIBRATE_E_PL[] PROGMEM = "Kalibruj E"; +const char MSG_CALIBRATE_E_DE[] PROGMEM = "Kalibriere E"; +const char MSG_CALIBRATE_E_NL[] PROGMEM = "Kalibratie E"; +const char * const MSG_CALIBRATE_E_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CALIBRATE_E_EN, + MSG_CALIBRATE_E_CZ, + MSG_CALIBRATE_E_IT, + MSG_CALIBRATE_E_ES, + MSG_CALIBRATE_E_PL, + MSG_CALIBRATE_E_DE, + MSG_CALIBRATE_E_NL +}; + +const char MSG_CALIBRATE_PINDA_EN[] PROGMEM = "PINDA Temp. cal."; +const char MSG_CALIBRATE_PINDA_CZ[] PROGMEM = "Zkalibrovat"; +const char MSG_CALIBRATE_PINDA_IT[] PROGMEM = "Calibrare"; +const char MSG_CALIBRATE_PINDA_ES[] PROGMEM = "Calibrar"; +const char MSG_CALIBRATE_PINDA_PL[] PROGMEM = "Skalibrowac"; +const char MSG_CALIBRATE_PINDA_DE[] PROGMEM = "PINDA Temp. Kal."; +const char MSG_CALIBRATE_PINDA_NL[] PROGMEM = "PINDA Temp. kal."; +const char * const MSG_CALIBRATE_PINDA_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CALIBRATE_PINDA_EN, + MSG_CALIBRATE_PINDA_CZ, + MSG_CALIBRATE_PINDA_IT, + MSG_CALIBRATE_PINDA_ES, + MSG_CALIBRATE_PINDA_PL, + MSG_CALIBRATE_PINDA_DE, + MSG_CALIBRATE_PINDA_NL +}; + +const char MSG_CALIBRATION_PINDA_MENU_EN[] PROGMEM = "PINDA Temp. cal."; +const char MSG_CALIBRATION_PINDA_MENU_CZ[] PROGMEM = "Teplot. kalibrace"; +const char MSG_CALIBRATION_PINDA_MENU_IT[] PROGMEM = "Taratura temp."; +const char MSG_CALIBRATION_PINDA_MENU_ES[] PROGMEM = "Calibracion temp."; +const char MSG_CALIBRATION_PINDA_MENU_PL[] PROGMEM = "Cieplna kalibr."; +const char MSG_CALIBRATION_PINDA_MENU_DE[] PROGMEM = "PINDA Temp. Kal."; +const char MSG_CALIBRATION_PINDA_MENU_NL[] PROGMEM = "PINDA Temp. kal."; +const char * const MSG_CALIBRATION_PINDA_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CALIBRATION_PINDA_MENU_EN, + MSG_CALIBRATION_PINDA_MENU_CZ, + MSG_CALIBRATION_PINDA_MENU_IT, + MSG_CALIBRATION_PINDA_MENU_ES, + MSG_CALIBRATION_PINDA_MENU_PL, + MSG_CALIBRATION_PINDA_MENU_DE, + MSG_CALIBRATION_PINDA_MENU_NL +}; + +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 = "Stampa da SD"; +const char MSG_CARD_MENU_ES[] PROGMEM = "Menu tarjeta SD"; +const char MSG_CARD_MENU_PL[] PROGMEM = "Druk z SD"; +const char MSG_CARD_MENU_DE[] PROGMEM = "Drucken von SD"; +const char MSG_CARD_MENU_NL[] PROGMEM = "Print van 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, + MSG_CARD_MENU_DE, + MSG_CARD_MENU_NL +}; + +const char MSG_CENTER_EN[] PROGMEM = "Center:"; +const char MSG_CENTER_CZ[] PROGMEM = "Stred:"; +const char MSG_CENTER_IT[] PROGMEM = "Centro:"; +const char MSG_CENTER_ES[] PROGMEM = "Centro:"; +const char MSG_CENTER_PL[] PROGMEM = "Srodek:"; +const char MSG_CENTER_DE[] PROGMEM = "Mitte:"; +const char MSG_CENTER_NL[] PROGMEM = "Centrum:"; +const char * const MSG_CENTER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CENTER_EN, + MSG_CENTER_CZ, + MSG_CENTER_IT, + MSG_CENTER_ES, + MSG_CENTER_PL, + MSG_CENTER_DE, + MSG_CENTER_NL +}; + +const char MSG_CHANGE_EXTR_EN[] PROGMEM = "Change extruder"; +const char MSG_CHANGE_EXTR_CZ[] PROGMEM = "Zmenit extruder"; +const char MSG_CHANGE_EXTR_IT[] PROGMEM = "Cambio estrusore."; +const char MSG_CHANGE_EXTR_ES[] PROGMEM = "Cambiar extrusor."; +const char MSG_CHANGE_EXTR_PL[] PROGMEM = "Zmienic ekstruder"; +const char MSG_CHANGE_EXTR_DE[] PROGMEM = "Wechsel extruder"; +const char MSG_CHANGE_EXTR_NL[] PROGMEM = "Wissel extruder"; +const char * const MSG_CHANGE_EXTR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CHANGE_EXTR_EN, + MSG_CHANGE_EXTR_CZ, + MSG_CHANGE_EXTR_IT, + MSG_CHANGE_EXTR_ES, + MSG_CHANGE_EXTR_PL, + MSG_CHANGE_EXTR_DE, + MSG_CHANGE_EXTR_NL +}; + +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 = "Cambio riuscito!"; +const char MSG_CHANGE_SUCCESS_ES[] PROGMEM = "Cambio correcto"; +const char MSG_CHANGE_SUCCESS_PL[] PROGMEM = "Wymiana ok!"; +const char MSG_CHANGE_SUCCESS_DE[] PROGMEM = "Wechsel erfolgreich!"; +const char MSG_CHANGE_SUCCESS_NL[] PROGMEM = "Wissel succesvol!"; +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, + MSG_CHANGE_SUCCESS_DE, + MSG_CHANGE_SUCCESS_NL +}; + +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 = "Cambiando filam."; +const char MSG_CHANGING_FILAMENT_ES[] PROGMEM = "Cambiando filamento"; +const char MSG_CHANGING_FILAMENT_PL[] PROGMEM = "Wymiana filamentu"; +const char MSG_CHANGING_FILAMENT_DE[] PROGMEM = "Filament-Wechsel!"; +const char MSG_CHANGING_FILAMENT_NL[] PROGMEM = "Wissel filament!"; +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, + MSG_CHANGING_FILAMENT_DE, + MSG_CHANGING_FILAMENT_NL +}; + +const char MSG_CHOOSE_EXTRUDER_EN[] PROGMEM = "Choose extruder:"; +const char MSG_CHOOSE_EXTRUDER_CZ[] PROGMEM = "Vyberte extruder:"; +const char MSG_CHOOSE_EXTRUDER_IT[] PROGMEM = "Seleziona estrusore:"; +const char MSG_CHOOSE_EXTRUDER_ES[] PROGMEM = "Elegir extrusor:"; +const char MSG_CHOOSE_EXTRUDER_PL[] PROGMEM = "Wybierz ekstruder"; +const char MSG_CHOOSE_EXTRUDER_DE[] PROGMEM = "Waehlen Sie Extruder"; +const char MSG_CHOOSE_EXTRUDER_NL[] PROGMEM = "Kies Extruder"; +const char * const MSG_CHOOSE_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CHOOSE_EXTRUDER_EN, + MSG_CHOOSE_EXTRUDER_CZ, + MSG_CHOOSE_EXTRUDER_IT, + MSG_CHOOSE_EXTRUDER_ES, + MSG_CHOOSE_EXTRUDER_PL, + MSG_CHOOSE_EXTRUDER_DE, + MSG_CHOOSE_EXTRUDER_NL +}; + +const char MSG_CLEAN_NOZZLE_E_EN[] PROGMEM = "E calibration finished. Please clean the nozzle. Click when done."; +const char MSG_CLEAN_NOZZLE_E_CZ[] PROGMEM = "E kalibrace ukoncena. Prosim ocistete trysku. Po te potvrdte tlacitkem."; +const char MSG_CLEAN_NOZZLE_E_IT[] PROGMEM = "Calibrazione E terminata. Si prega di pulire l'ugello. Click per continuare."; +const char MSG_CLEAN_NOZZLE_E_ES[] PROGMEM = "E calibrado. Limpiar la boquilla. Haga clic una vez terminado."; +const char MSG_CLEAN_NOZZLE_E_PL[] PROGMEM = "Kalibracja E skonczona. Prosze oczyscic dysze. Potem potwierdzic przyciskiem. "; +const char MSG_CLEAN_NOZZLE_E_DE[] PROGMEM = "E-Kalibrierung beendet. Bitte reinigen Sie die Duese. Klicken wenn fertig."; +const char MSG_CLEAN_NOZZLE_E_NL[] PROGMEM = "E kalibratie voltooid. Reinig het tuit. Klik op als klaar."; +const char * const MSG_CLEAN_NOZZLE_E_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CLEAN_NOZZLE_E_EN, + MSG_CLEAN_NOZZLE_E_CZ, + MSG_CLEAN_NOZZLE_E_IT, + MSG_CLEAN_NOZZLE_E_ES, + MSG_CLEAN_NOZZLE_E_PL, + MSG_CLEAN_NOZZLE_E_DE, + MSG_CLEAN_NOZZLE_E_NL +}; + +const char MSG_CNG_SDCARD_EN[] PROGMEM = "Change SD card"; +const char * const MSG_CNG_SDCARD_LANG_TABLE[1] PROGMEM = { + MSG_CNG_SDCARD_EN +}; + +const char MSG_CONFIGURATION_VER_EN[] PROGMEM = " Last Updated: "; +const char * const MSG_CONFIGURATION_VER_LANG_TABLE[1] PROGMEM = { + MSG_CONFIGURATION_VER_EN +}; + +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN[] PROGMEM = "Are left and right Z~carriages all up?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ[] PROGMEM = "Dojely oba Z voziky k~hornimu dorazu?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_IT[] PROGMEM = "I carrelli Z sin/des sono altezza max?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES[] PROGMEM = "Carros Z izq./der. estan arriba maximo?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL[] PROGMEM = "Oba wozki dojechaly do gornej ramy?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_DE[] PROGMEM = "Sind beide Z Schlitten ganz oben?"; +const char MSG_CONFIRM_CARRIAGE_AT_THE_TOP_NL[] PROGMEM = "Zijn beide Z wagen heelemaal boven?"; +const char * const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_EN, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_CZ, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_IT, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_ES, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_PL, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_DE, + MSG_CONFIRM_CARRIAGE_AT_THE_TOP_NL +}; + +const char MSG_CONFIRM_NOZZLE_CLEAN_EN[] PROGMEM = "Please clean the nozzle for calibration. Click when done."; +const char MSG_CONFIRM_NOZZLE_CLEAN_CZ[] PROGMEM = "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem."; +const char MSG_CONFIRM_NOZZLE_CLEAN_IT[] PROGMEM = "Pulire l'ugello per la calibrazione, poi fare click."; +const char MSG_CONFIRM_NOZZLE_CLEAN_ES[] PROGMEM = "Limpiar boquilla para calibracion. Click cuando acabes."; +const char MSG_CONFIRM_NOZZLE_CLEAN_PL[] PROGMEM = "Dla prawidl. kalibracji prosze oczyscic dysze. Potw. guzikiem."; +const char MSG_CONFIRM_NOZZLE_CLEAN_DE[] PROGMEM = "Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber."; +const char MSG_CONFIRM_NOZZLE_CLEAN_NL[] PROGMEM = "Reinig het tuit voor de kalibratie aub. Klik als klaar."; +const char * const MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIRM_NOZZLE_CLEAN_EN, + MSG_CONFIRM_NOZZLE_CLEAN_CZ, + MSG_CONFIRM_NOZZLE_CLEAN_IT, + MSG_CONFIRM_NOZZLE_CLEAN_ES, + MSG_CONFIRM_NOZZLE_CLEAN_PL, + MSG_CONFIRM_NOZZLE_CLEAN_DE, + MSG_CONFIRM_NOZZLE_CLEAN_NL +}; + +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_EN[] PROGMEM = "Filaments are now adjusted. Please clean the nozzle for calibration. Click when done."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_CZ[] PROGMEM = "Filamenty jsou srovnany. Pro uspesnou kalibraci prosim ocistete trysku. Po te potvrdte tlacitkem."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_IT[] PROGMEM = "I filamenti sono regolati. Si prega di pulire l'ugello per la calibrazione. Click per continuare."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_ES[] PROGMEM = "Filamentos ajustados. Limpie la boquilla para calibracion. Haga clic una vez terminado."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_PL[] PROGMEM = "Dla prawidlowej kalibracji prosze oczyscic dysze. Potem potwierdzic przyciskiem."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_DE[] PROGMEM = "Filamente sind jetzt eingestellt. Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber."; +const char MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_NL[] PROGMEM = "Filamenten zijn nu ingesteld. Reinig het tuit voor de kalibratie. Klik als klaar."; +const char * const MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_EN, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_CZ, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_IT, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_ES, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_PL, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_DE, + MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_NL +}; + +const char MSG_CONTROL_EN[] PROGMEM = "Control"; +const char * const MSG_CONTROL_LANG_TABLE[1] PROGMEM = { + MSG_CONTROL_EN +}; + +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 MSG_COOLDOWN_DE[] PROGMEM = "Abkuehlen"; +const char MSG_COOLDOWN_NL[] PROGMEM = "Afkoelen"; +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, + MSG_COOLDOWN_DE, + MSG_COOLDOWN_NL +}; + +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 correct.?"; +const char MSG_CORRECTLY_PL[] PROGMEM = "Wymiana ok?"; +const char MSG_CORRECTLY_DE[] PROGMEM = "Wechsel ok?"; +const char MSG_CORRECTLY_NL[] PROGMEM = "Wissel 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, + MSG_CORRECTLY_DE, + MSG_CORRECTLY_NL +}; + +const char MSG_COUNT_X_EN[] PROGMEM = " Count X: "; +const char * const MSG_COUNT_X_LANG_TABLE[1] PROGMEM = { + MSG_COUNT_X_EN +}; + +const char MSG_CURRENT_EN[] PROGMEM = "Current"; +const char MSG_CURRENT_CZ[] PROGMEM = "Pouze aktualni"; +const char MSG_CURRENT_IT[] PROGMEM = "Attuale"; +const char MSG_CURRENT_ES[] PROGMEM = "Actual"; +const char MSG_CURRENT_PL[] PROGMEM = "Tylko aktualne"; +const char MSG_CURRENT_DE[] PROGMEM = "Aktuelles"; +const char MSG_CURRENT_NL[] PROGMEM = "Actueel"; +const char * const MSG_CURRENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_CURRENT_EN, + MSG_CURRENT_CZ, + MSG_CURRENT_IT, + MSG_CURRENT_ES, + MSG_CURRENT_PL, + MSG_CURRENT_DE, + MSG_CURRENT_NL +}; + +const char MSG_DATE_EN[] PROGMEM = "Date:"; +const char MSG_DATE_CZ[] PROGMEM = "Datum:"; +const char MSG_DATE_IT[] PROGMEM = "Data"; +const char MSG_DATE_ES[] PROGMEM = "Fecha:"; +const char MSG_DATE_PL[] PROGMEM = "Data:"; +const char MSG_DATE_DE[] PROGMEM = "Datum:"; +const char MSG_DATE_NL[] PROGMEM = "Datum:"; +const char * const MSG_DATE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_DATE_EN, + MSG_DATE_CZ, + MSG_DATE_IT, + MSG_DATE_ES, + MSG_DATE_PL, + MSG_DATE_DE, + MSG_DATE_NL +}; + +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 = "Disabilit motori"; +const char MSG_DISABLE_STEPPERS_ES[] PROGMEM = "Apagar motores"; +const char MSG_DISABLE_STEPPERS_PL[] PROGMEM = "Wylaczyc silniki"; +const char MSG_DISABLE_STEPPERS_DE[] PROGMEM = "Motoren aus"; +const char MSG_DISABLE_STEPPERS_NL[] PROGMEM = "Motoren uit"; +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, + MSG_DISABLE_STEPPERS_DE, + MSG_DISABLE_STEPPERS_NL +}; + +const char MSG_DWELL_EN[] PROGMEM = "Sleep..."; +const char MSG_DWELL_IT[] PROGMEM = "Sospensione..."; +const char MSG_DWELL_ES[] PROGMEM = "En espera"; +const char MSG_DWELL_DE[] PROGMEM = "Warten..."; +const char MSG_DWELL_NL[] PROGMEM = "Slapen..."; +const char * const MSG_DWELL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_DWELL_EN, + MSG_DWELL_EN, + MSG_DWELL_IT, + MSG_DWELL_ES, + MSG_DWELL_EN, + MSG_DWELL_DE, + MSG_DWELL_NL +}; + +const char MSG_ENDSTOPS_HIT_EN[] PROGMEM = "endstops hit: "; +const char * const MSG_ENDSTOPS_HIT_LANG_TABLE[1] PROGMEM = { + MSG_ENDSTOPS_HIT_EN +}; + +const char MSG_ENDSTOP_HIT_EN[] PROGMEM = "TRIGGERED"; +const char * const MSG_ENDSTOP_HIT_LANG_TABLE[1] PROGMEM = { + MSG_ENDSTOP_HIT_EN +}; + +const char MSG_ENDSTOP_OPEN_EN[] PROGMEM = "open"; +const char * const MSG_ENDSTOP_OPEN_LANG_TABLE[1] PROGMEM = { + MSG_ENDSTOP_OPEN_EN +}; + +const char MSG_END_FILE_LIST_EN[] PROGMEM = "End file list"; +const char * const MSG_END_FILE_LIST_LANG_TABLE[1] PROGMEM = { + MSG_END_FILE_LIST_EN +}; + +const char MSG_ERROR_EN[] PROGMEM = "ERROR:"; +const char MSG_ERROR_CZ[] PROGMEM = "CHYBA:"; +const char MSG_ERROR_IT[] PROGMEM = "ERRORE:"; +const char MSG_ERROR_PL[] PROGMEM = "BLAD:"; +const char MSG_ERROR_DE[] PROGMEM = "FEHLER:"; +const char MSG_ERROR_NL[] PROGMEM = "FOUT:"; +const char * const MSG_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_ERROR_EN, + MSG_ERROR_CZ, + MSG_ERROR_IT, + MSG_ERROR_EN, + MSG_ERROR_PL, + MSG_ERROR_DE, + MSG_ERROR_NL +}; + +const char MSG_ERR_CHECKSUM_MISMATCH_EN[] PROGMEM = "checksum mismatch, Last Line: "; +const char * const MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE[1] PROGMEM = { + MSG_ERR_CHECKSUM_MISMATCH_EN +}; + +const char MSG_ERR_COLD_EXTRUDE_STOP_EN[] PROGMEM = " cold extrusion prevented"; +const char * const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[1] PROGMEM = { + MSG_ERR_COLD_EXTRUDE_STOP_EN +}; + +const char MSG_ERR_KILLED_EN[] PROGMEM = "Printer halted. kill() called!"; +const char * const MSG_ERR_KILLED_LANG_TABLE[1] PROGMEM = { + MSG_ERR_KILLED_EN +}; + +const char MSG_ERR_LINE_NO_EN[] PROGMEM = "Line Number is not Last Line Number+1, Last Line: "; +const char * const MSG_ERR_LINE_NO_LANG_TABLE[1] PROGMEM = { + MSG_ERR_LINE_NO_EN +}; + +const char MSG_ERR_LONG_EXTRUDE_STOP_EN[] PROGMEM = " too long extrusion prevented"; +const char * const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[1] PROGMEM = { + MSG_ERR_LONG_EXTRUDE_STOP_EN +}; + +const char MSG_ERR_NO_CHECKSUM_EN[] PROGMEM = "No Checksum with line number, Last Line: "; +const char * const MSG_ERR_NO_CHECKSUM_LANG_TABLE[1] PROGMEM = { + MSG_ERR_NO_CHECKSUM_EN +}; + +const char MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN[] PROGMEM = "No Line Number with checksum, Last Line: "; +const char * const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[1] PROGMEM = { + MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_EN +}; + +const char MSG_ERR_NO_THERMISTORS_EN[] PROGMEM = "No thermistors - no temperature"; +const char * const MSG_ERR_NO_THERMISTORS_LANG_TABLE[1] PROGMEM = { + MSG_ERR_NO_THERMISTORS_EN +}; + +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 * const MSG_ERR_STOPPED_LANG_TABLE[1] PROGMEM = { + MSG_ERR_STOPPED_EN +}; + +const char MSG_EXTERNAL_RESET_EN[] PROGMEM = " External Reset"; +const char * const MSG_EXTERNAL_RESET_LANG_TABLE[1] PROGMEM = { + MSG_EXTERNAL_RESET_EN +}; + +const char MSG_EXTRUDER_EN[] PROGMEM = "Extruder"; +const char MSG_EXTRUDER_IT[] PROGMEM = "Estrusore"; +const char MSG_EXTRUDER_ES[] PROGMEM = "Extrusor"; +const char MSG_EXTRUDER_PL[] PROGMEM = "Ekstruder"; +const char * const MSG_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDER_EN, + MSG_EXTRUDER_EN, + MSG_EXTRUDER_IT, + MSG_EXTRUDER_ES, + MSG_EXTRUDER_PL, + MSG_EXTRUDER_EN, + MSG_EXTRUDER_EN +}; + +const char MSG_EXTRUDER_1_EN[] PROGMEM = "Extruder 1"; +const char MSG_EXTRUDER_1_IT[] PROGMEM = "Estrusore 1"; +const char MSG_EXTRUDER_1_ES[] PROGMEM = "Extrusor 1"; +const char MSG_EXTRUDER_1_PL[] PROGMEM = "Ekstruder 1"; +const char * const MSG_EXTRUDER_1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDER_1_EN, + MSG_EXTRUDER_1_EN, + MSG_EXTRUDER_1_IT, + MSG_EXTRUDER_1_ES, + MSG_EXTRUDER_1_PL, + MSG_EXTRUDER_1_EN, + MSG_EXTRUDER_1_EN +}; + +const char MSG_EXTRUDER_2_EN[] PROGMEM = "Extruder 2"; +const char MSG_EXTRUDER_2_IT[] PROGMEM = "Estrusore 2"; +const char MSG_EXTRUDER_2_ES[] PROGMEM = "Extrusor 2"; +const char MSG_EXTRUDER_2_PL[] PROGMEM = "Ekstruder 2"; +const char * const MSG_EXTRUDER_2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDER_2_EN, + MSG_EXTRUDER_2_EN, + MSG_EXTRUDER_2_IT, + MSG_EXTRUDER_2_ES, + MSG_EXTRUDER_2_PL, + MSG_EXTRUDER_2_EN, + MSG_EXTRUDER_2_EN +}; + +const char MSG_EXTRUDER_3_EN[] PROGMEM = "Extruder 3"; +const char MSG_EXTRUDER_3_IT[] PROGMEM = "Estrusore 3"; +const char MSG_EXTRUDER_3_ES[] PROGMEM = "Extrusor 3"; +const char MSG_EXTRUDER_3_PL[] PROGMEM = "Ekstruder 3"; +const char * const MSG_EXTRUDER_3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDER_3_EN, + MSG_EXTRUDER_3_EN, + MSG_EXTRUDER_3_IT, + MSG_EXTRUDER_3_ES, + MSG_EXTRUDER_3_PL, + MSG_EXTRUDER_3_EN, + MSG_EXTRUDER_3_EN +}; + +const char MSG_EXTRUDER_4_EN[] PROGMEM = "Extruder 4"; +const char MSG_EXTRUDER_4_IT[] PROGMEM = "Estrusore 4"; +const char MSG_EXTRUDER_4_ES[] PROGMEM = "Extrusor 4"; +const char MSG_EXTRUDER_4_PL[] PROGMEM = "Ekstruder 4"; +const char * const MSG_EXTRUDER_4_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_EXTRUDER_4_EN, + MSG_EXTRUDER_4_EN, + MSG_EXTRUDER_4_IT, + MSG_EXTRUDER_4_ES, + MSG_EXTRUDER_4_PL, + MSG_EXTRUDER_4_EN, + MSG_EXTRUDER_4_EN +}; + +const char MSG_E_CAL_KNOB_EN[] PROGMEM = "Rotate knob until mark reaches extruder body. Click when done."; +const char MSG_E_CAL_KNOB_CZ[] PROGMEM = "Otacejte tlacitkem dokud znacka nedosahne tela extruderu. Potvrdte tlacitkem."; +const char MSG_E_CAL_KNOB_IT[] PROGMEM = "Girare la manopola affinche' il segno raggiunga il corpo dell'estrusore. Click per continuare."; +const char MSG_E_CAL_KNOB_ES[] PROGMEM = "Rotar el mando hasta que la marca llegue al cuerpo del extrusor. Haga clic una vez terminado."; +const char MSG_E_CAL_KNOB_PL[] PROGMEM = "Prosze otaczac przycisk poki znacznik nie dosiegnie ciala ekstrudera. Potwierdzic przyciskiem."; +const char MSG_E_CAL_KNOB_DE[] PROGMEM = "Knopf drehen bis die Filamentmarkierung erreicht ist. Klicken wenn fertig."; +const char MSG_E_CAL_KNOB_NL[] PROGMEM = "Draai knop tot mark extruder bereikt is. Klik als klaar."; +const char * const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_E_CAL_KNOB_EN, + MSG_E_CAL_KNOB_CZ, + MSG_E_CAL_KNOB_IT, + MSG_E_CAL_KNOB_ES, + MSG_E_CAL_KNOB_PL, + MSG_E_CAL_KNOB_DE, + MSG_E_CAL_KNOB_NL +}; + +const char MSG_Enqueing_EN[] PROGMEM = "enqueing \""; +const char * const MSG_Enqueing_LANG_TABLE[1] PROGMEM = { + MSG_Enqueing_EN +}; + +const char MSG_FACTOR_EN[] PROGMEM = " \002 Fact"; +const char * const MSG_FACTOR_LANG_TABLE[1] PROGMEM = { + MSG_FACTOR_EN +}; + +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 = "Velocita vent."; +const char MSG_FAN_SPEED_ES[] PROGMEM = "Velocidad Vent."; +const char MSG_FAN_SPEED_PL[] PROGMEM = "Predkosc went."; +const char MSG_FAN_SPEED_DE[] PROGMEM = "Luefter-Tempo"; +const char MSG_FAN_SPEED_NL[] PROGMEM = "Fan snelheid"; +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, + MSG_FAN_SPEED_DE, + MSG_FAN_SPEED_NL +}; + +const char MSG_FARM_CARD_MENU_EN[] PROGMEM = "Farm mode print"; +const char * const MSG_FARM_CARD_MENU_LANG_TABLE[1] PROGMEM = { + MSG_FARM_CARD_MENU_EN +}; + +const char MSG_FILAMENTCHANGE_EN[] PROGMEM = "Change filament"; +const char MSG_FILAMENTCHANGE_CZ[] PROGMEM = "Vymenit filament"; +const char MSG_FILAMENTCHANGE_IT[] PROGMEM = "Camb. filamento"; +const char MSG_FILAMENTCHANGE_ES[] PROGMEM = "Cambiar filamento"; +const char MSG_FILAMENTCHANGE_PL[] PROGMEM = "Wymienic filament"; +const char MSG_FILAMENTCHANGE_DE[] PROGMEM = "Filament-Wechsel"; +const char MSG_FILAMENTCHANGE_NL[] PROGMEM = "Wissel 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, + MSG_FILAMENTCHANGE_DE, + MSG_FILAMENTCHANGE_NL +}; + +const char MSG_FILAMENT_CLEAN_EN[] PROGMEM = "Is color clear?"; +const char MSG_FILAMENT_CLEAN_CZ[] PROGMEM = "Je barva cista?"; +const char MSG_FILAMENT_CLEAN_IT[] PROGMEM = "Il colore e' nitido?"; +const char MSG_FILAMENT_CLEAN_ES[] PROGMEM = "Es el nuevo color nitido?"; +const char MSG_FILAMENT_CLEAN_PL[] PROGMEM = "Czy kolor jest czysty?"; +const char MSG_FILAMENT_CLEAN_DE[] PROGMEM = "Ist Farbe rein?"; +const char MSG_FILAMENT_CLEAN_NL[] PROGMEM = "Is kleur zuiver?"; +const char * const MSG_FILAMENT_CLEAN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_CLEAN_EN, + MSG_FILAMENT_CLEAN_CZ, + MSG_FILAMENT_CLEAN_IT, + MSG_FILAMENT_CLEAN_ES, + MSG_FILAMENT_CLEAN_PL, + MSG_FILAMENT_CLEAN_DE, + MSG_FILAMENT_CLEAN_NL +}; + +const char MSG_FILAMENT_LOADING_T0_EN[] PROGMEM = "Insert filament into extruder 1. Click when done."; +const char MSG_FILAMENT_LOADING_T0_CZ[] PROGMEM = "Vlozte filament do extruderu 1. Potvrdte tlacitkem."; +const char MSG_FILAMENT_LOADING_T0_IT[] PROGMEM = "Inserire filamento nell'estrusore 1. Click per continuare."; +const char MSG_FILAMENT_LOADING_T0_ES[] PROGMEM = "Insertar filamento en el extrusor 1. Haga clic una vez terminado."; +const char MSG_FILAMENT_LOADING_T0_PL[] PROGMEM = "Wloz filament do ekstrudera 1. Potwierdz przyciskiem."; +const char MSG_FILAMENT_LOADING_T0_DE[] PROGMEM = "Filament in extruder 1 einlegen. Klicken wenn fertig."; +const char MSG_FILAMENT_LOADING_T0_NL[] PROGMEM = "Steek filament in de extruder 1. Klik als klaar."; +const char * const MSG_FILAMENT_LOADING_T0_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_LOADING_T0_EN, + MSG_FILAMENT_LOADING_T0_CZ, + MSG_FILAMENT_LOADING_T0_IT, + MSG_FILAMENT_LOADING_T0_ES, + MSG_FILAMENT_LOADING_T0_PL, + MSG_FILAMENT_LOADING_T0_DE, + MSG_FILAMENT_LOADING_T0_NL +}; + +const char MSG_FILAMENT_LOADING_T1_EN[] PROGMEM = "Insert filament into extruder 2. Click when done."; +const char MSG_FILAMENT_LOADING_T1_CZ[] PROGMEM = "Vlozte filament do extruderu 2. Potvrdte tlacitkem."; +const char MSG_FILAMENT_LOADING_T1_IT[] PROGMEM = "Inserire filamento nell'estrusore 2. Click per continuare."; +const char MSG_FILAMENT_LOADING_T1_ES[] PROGMEM = "Insertar filamento en el extrusor 2. Haga clic una vez terminado."; +const char MSG_FILAMENT_LOADING_T1_PL[] PROGMEM = "Wloz filament do ekstrudera 2. Potwierdz przyciskiem."; +const char MSG_FILAMENT_LOADING_T1_DE[] PROGMEM = "Filament in extruder 2 einlegen. Klicken wenn fertig."; +const char MSG_FILAMENT_LOADING_T1_NL[] PROGMEM = "Steek filament in de extruder 2. Klik als klaar."; +const char * const MSG_FILAMENT_LOADING_T1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_LOADING_T1_EN, + MSG_FILAMENT_LOADING_T1_CZ, + MSG_FILAMENT_LOADING_T1_IT, + MSG_FILAMENT_LOADING_T1_ES, + MSG_FILAMENT_LOADING_T1_PL, + MSG_FILAMENT_LOADING_T1_DE, + MSG_FILAMENT_LOADING_T1_NL +}; + +const char MSG_FILAMENT_LOADING_T2_EN[] PROGMEM = "Insert filament into extruder 3. Click when done."; +const char MSG_FILAMENT_LOADING_T2_CZ[] PROGMEM = "Vlozte filament do extruderu 3. Potvrdte tlacitkem."; +const char MSG_FILAMENT_LOADING_T2_IT[] PROGMEM = "Inserire filamento nell'estrusore 3. Click per continuare."; +const char MSG_FILAMENT_LOADING_T2_ES[] PROGMEM = "Insertar filamento en el extrusor 3. Haga clic una vez terminado."; +const char MSG_FILAMENT_LOADING_T2_PL[] PROGMEM = "Wloz filament do ekstrudera 3. Potwierdz przyciskiem."; +const char MSG_FILAMENT_LOADING_T2_DE[] PROGMEM = "Filament in extruder 3 einlegen. Klicken wenn fertig."; +const char MSG_FILAMENT_LOADING_T2_NL[] PROGMEM = "Steek filament in de extruder 3. Klik als klaar."; +const char * const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_LOADING_T2_EN, + MSG_FILAMENT_LOADING_T2_CZ, + MSG_FILAMENT_LOADING_T2_IT, + MSG_FILAMENT_LOADING_T2_ES, + MSG_FILAMENT_LOADING_T2_PL, + MSG_FILAMENT_LOADING_T2_DE, + MSG_FILAMENT_LOADING_T2_NL +}; + +const char MSG_FILAMENT_LOADING_T3_EN[] PROGMEM = "Insert filament into extruder 4. Click when done."; +const char MSG_FILAMENT_LOADING_T3_CZ[] PROGMEM = "Vlozte filament do extruderu 4. Potvrdte tlacitkem."; +const char MSG_FILAMENT_LOADING_T3_IT[] PROGMEM = "Inserire filamento nell'estrusore 4. Click per continuare."; +const char MSG_FILAMENT_LOADING_T3_ES[] PROGMEM = "Insertar filamento en el extrusor 4. Haga clic una vez terminado."; +const char MSG_FILAMENT_LOADING_T3_PL[] PROGMEM = "Wloz filament do ekstrudera 4. Potwierdz przyciskiem."; +const char MSG_FILAMENT_LOADING_T3_DE[] PROGMEM = "Filament in extruder 4 einlegen. Klicken wenn fertig."; +const char MSG_FILAMENT_LOADING_T3_NL[] PROGMEM = "Steek filament in de extruder 4. Klik als klaar."; +const char * const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FILAMENT_LOADING_T3_EN, + MSG_FILAMENT_LOADING_T3_CZ, + MSG_FILAMENT_LOADING_T3_IT, + MSG_FILAMENT_LOADING_T3_ES, + MSG_FILAMENT_LOADING_T3_PL, + MSG_FILAMENT_LOADING_T3_DE, + MSG_FILAMENT_LOADING_T3_NL +}; + +const char MSG_FILE_PRINTED_EN[] PROGMEM = "Done printing file"; +const char * const MSG_FILE_PRINTED_LANG_TABLE[1] PROGMEM = { + MSG_FILE_PRINTED_EN +}; + +const char MSG_FILE_SAVED_EN[] PROGMEM = "Done saving file."; +const char * const MSG_FILE_SAVED_LANG_TABLE[1] PROGMEM = { + MSG_FILE_SAVED_EN +}; + +const char MSG_FIL_ADJUSTING_EN[] PROGMEM = "Adjusting filaments. Please wait."; +const char MSG_FIL_ADJUSTING_CZ[] PROGMEM = "Probiha srovnani filamentu. Prosim cekejte."; +const char MSG_FIL_ADJUSTING_IT[] PROGMEM = "Filamento in fase di regolazione. Attendere prego."; +const char MSG_FIL_ADJUSTING_ES[] PROGMEM = "Ajustando filamentos. Esperar por favor."; +const char MSG_FIL_ADJUSTING_PL[] PROGMEM = "Przebiega wyrownanie filamentow. Prosze czekac."; +const char MSG_FIL_ADJUSTING_DE[] PROGMEM = "Einstellen Filament. Bitte warten."; +const char MSG_FIL_ADJUSTING_NL[] PROGMEM = "Aanpassen filamenten. Even geduld aub."; +const char * const MSG_FIL_ADJUSTING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FIL_ADJUSTING_EN, + MSG_FIL_ADJUSTING_CZ, + MSG_FIL_ADJUSTING_IT, + MSG_FIL_ADJUSTING_ES, + MSG_FIL_ADJUSTING_PL, + MSG_FIL_ADJUSTING_DE, + MSG_FIL_ADJUSTING_NL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_EN[] PROGMEM = "Iteration "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_CZ[] PROGMEM = "Iterace "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_IT[] PROGMEM = "Reiterazione "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_ES[] PROGMEM = "Reiteracion "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_PL[] PROGMEM = "Iteracja "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_DE[] PROGMEM = "Wiederholung "; +const char MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_NL[] PROGMEM = "Herhaling "; +const char * const MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_EN, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_CZ, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_IT, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_ES, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_PL, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_DE, + MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_NL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Searching bed calibration point"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Hledam kalibracni bod podlozky"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Ricerca del letto punto di calibraz."; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Buscando cama punto de calibracion"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Szukam punktu kalibracyjnego podkladki"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_DE[] PROGMEM = "Suche Bett Kalibrierpunkt"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_NL[] PROGMEM = "Zoeke bed kalibratiepunt"; +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, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_DE, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE1_NL +}; + +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = " of 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = " z 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = " su 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = " de 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = " z 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_DE[] PROGMEM = " von 4"; +const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_NL[] PROGMEM = " van 4"; +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, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_DE, + MSG_FIND_BED_OFFSET_AND_SKEW_LINE2_NL +}; + +const char MSG_FINISHING_MOVEMENTS_EN[] PROGMEM = "Finishing movements"; +const char MSG_FINISHING_MOVEMENTS_CZ[] PROGMEM = "Dokoncovani pohybu"; +const char MSG_FINISHING_MOVEMENTS_IT[] PROGMEM = "Arresto in corso"; +const char MSG_FINISHING_MOVEMENTS_ES[] PROGMEM = "Term. movimientos"; +const char MSG_FINISHING_MOVEMENTS_PL[] PROGMEM = "Konczenie druku"; +const char MSG_FINISHING_MOVEMENTS_DE[] PROGMEM = "Bewegungen beenden"; +const char MSG_FINISHING_MOVEMENTS_NL[] PROGMEM = "Bewegingen afwerken"; +const char * const MSG_FINISHING_MOVEMENTS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FINISHING_MOVEMENTS_EN, + MSG_FINISHING_MOVEMENTS_CZ, + MSG_FINISHING_MOVEMENTS_IT, + MSG_FINISHING_MOVEMENTS_ES, + MSG_FINISHING_MOVEMENTS_PL, + MSG_FINISHING_MOVEMENTS_DE, + MSG_FINISHING_MOVEMENTS_NL +}; + +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 MSG_FLOW_DE[] PROGMEM = "Durchfluss"; +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, + MSG_FLOW_DE, + MSG_FLOW_EN +}; + +const char MSG_FLOW0_EN[] PROGMEM = "Flow 0"; +const char * const MSG_FLOW0_LANG_TABLE[1] PROGMEM = { + MSG_FLOW0_EN +}; + +const char MSG_FLOW1_EN[] PROGMEM = "Flow 1"; +const char * const MSG_FLOW1_LANG_TABLE[1] PROGMEM = { + MSG_FLOW1_EN +}; + +const char MSG_FLOW2_EN[] PROGMEM = "Flow 2"; +const char * const MSG_FLOW2_LANG_TABLE[1] PROGMEM = { + MSG_FLOW2_EN +}; + +const char MSG_FOLLOW_CALIBRATION_FLOW_EN[] PROGMEM = "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."; +const char MSG_FOLLOW_CALIBRATION_FLOW_CZ[] PROGMEM = "Tiskarna nebyla jeste zkalibrovana. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Postup kalibrace."; +const char MSG_FOLLOW_CALIBRATION_FLOW_IT[] PROGMEM = "Stampante ancora non calibrata. Si prega di seguire il manuale, capitolo PRIMI PASSI, sezione della calibrazione."; +const char MSG_FOLLOW_CALIBRATION_FLOW_ES[] PROGMEM = "Impresora no esta calibrada todavia. Por favor usar el manual, el capitulo First steps, seleccion Calibration flow."; +const char MSG_FOLLOW_CALIBRATION_FLOW_PL[] PROGMEM = "Drukarka nie zostala jeszcze skalibrowana. Prosze kierowac sie instrukcja, rozdzial Zaczynamy, podrozdzial Selftest."; +const char MSG_FOLLOW_CALIBRATION_FLOW_DE[] PROGMEM = "Der Drucker wurde noch nicht kalibriert. Bitte folgen Sie dem Handbuch, Kapitel First steps, Abschnitt Calibration flow."; +const char MSG_FOLLOW_CALIBRATION_FLOW_NL[] PROGMEM = "Printer is nog niet gekalibreerd. Volg de handleiding, hoofdstuk First steps, sectie Calibration flow."; +const char * const MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_FOLLOW_CALIBRATION_FLOW_EN, + MSG_FOLLOW_CALIBRATION_FLOW_CZ, + MSG_FOLLOW_CALIBRATION_FLOW_IT, + MSG_FOLLOW_CALIBRATION_FLOW_ES, + MSG_FOLLOW_CALIBRATION_FLOW_PL, + MSG_FOLLOW_CALIBRATION_FLOW_DE, + MSG_FOLLOW_CALIBRATION_FLOW_NL +}; + +const char MSG_FREE_MEMORY_EN[] PROGMEM = " Free Memory: "; +const char * const MSG_FREE_MEMORY_LANG_TABLE[1] PROGMEM = { + MSG_FREE_MEMORY_EN +}; + +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 MSG_HEATING_DE[] PROGMEM = "Aufheizen"; +const char MSG_HEATING_NL[] PROGMEM = "Opwarmen"; +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, + MSG_HEATING_DE, + MSG_HEATING_NL +}; + +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 = "Riscald. completo"; +const char MSG_HEATING_COMPLETE_ES[] PROGMEM = "Calentamiento final."; +const char MSG_HEATING_COMPLETE_PL[] PROGMEM = "Grzanie OK."; +const char MSG_HEATING_COMPLETE_DE[] PROGMEM = "Aufgeheizen klar."; +const char MSG_HEATING_COMPLETE_NL[] PROGMEM = "Opwarmen klaar."; +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, + MSG_HEATING_COMPLETE_DE, + MSG_HEATING_COMPLETE_NL +}; + +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 MSG_HOMEYZ_DE[] PROGMEM = "Kalibrieren Z"; +const char MSG_HOMEYZ_NL[] PROGMEM = "Kalibreren 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, + MSG_HOMEYZ_DE, + MSG_HOMEYZ_NL +}; + +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 = "Calibrazione OK"; +const char MSG_HOMEYZ_DONE_ES[] PROGMEM = "Calibracion OK"; +const char MSG_HOMEYZ_DONE_PL[] PROGMEM = "Kalibracja OK"; +const char MSG_HOMEYZ_DONE_DE[] PROGMEM = "Kalibrierung OK"; +const char MSG_HOMEYZ_DONE_NL[] PROGMEM = "Kalbibratie 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, + MSG_HOMEYZ_DONE_DE, + MSG_HOMEYZ_DONE_NL +}; + +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 MSG_HOMEYZ_PROGRESS_DE[] PROGMEM = "Kalibriere Z"; +const char MSG_HOMEYZ_PROGRESS_NL[] PROGMEM = "Kalibreren 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, + MSG_HOMEYZ_PROGRESS_DE, + MSG_HOMEYZ_PROGRESS_NL +}; + +const char MSG_HOTEND_OFFSET_EN[] PROGMEM = "Hotend offsets:"; +const char * const MSG_HOTEND_OFFSET_LANG_TABLE[1] PROGMEM = { + MSG_HOTEND_OFFSET_EN +}; + +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_EN[] PROGMEM = "Improving bed calibration point"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_CZ[] PROGMEM = "Zlepsuji presnost kalibracniho bodu"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_IT[] PROGMEM = "Perfezion. il letto punto di calibraz."; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_ES[] PROGMEM = "Mejorando cama punto de calibracion"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_PL[] PROGMEM = "Poprawiam precyzyjnosc punktu kalibracyjnego"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_DE[] PROGMEM = "Genauigkeit verbessern bei Kalibrierpunkt"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_NL[] PROGMEM = "Nauwkeurigheid verbeteren bij kalibratiepunt"; +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, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_DE, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1_NL +}; + +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_EN[] PROGMEM = " of 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_CZ[] PROGMEM = " z 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_IT[] PROGMEM = " su 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_ES[] PROGMEM = " de 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_PL[] PROGMEM = " z 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_DE[] PROGMEM = " von 9"; +const char MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_NL[] PROGMEM = " van 9"; +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, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_DE, + MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2_NL +}; + +const char MSG_INIT_SDCARD_EN[] PROGMEM = "Init. SD card"; +const char * const MSG_INIT_SDCARD_LANG_TABLE[1] PROGMEM = { + MSG_INIT_SDCARD_EN +}; + +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 = "Introducir filamento"; +const char MSG_INSERT_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; +const char MSG_INSERT_FILAMENT_DE[] PROGMEM = "Filament einlegen"; +const char MSG_INSERT_FILAMENT_NL[] PROGMEM = "Filament insteken"; +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, + MSG_INSERT_FILAMENT_DE, + MSG_INSERT_FILAMENT_NL +}; + +const char MSG_INVALID_EXTRUDER_EN[] PROGMEM = "Invalid extruder"; +const char * const MSG_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_INVALID_EXTRUDER_EN +}; + +const char MSG_KILLED_EN[] PROGMEM = "KILLED. "; +const char MSG_KILLED_IT[] PROGMEM = "IN TILT."; +const char MSG_KILLED_ES[] PROGMEM = "PARADA DE EMERGENCIA"; +const char MSG_KILLED_DE[] PROGMEM = "ABGEBROCHEN. "; +const char MSG_KILLED_NL[] PROGMEM = "NOODSTOP/KILLED. "; +const char * const MSG_KILLED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_KILLED_EN, + MSG_KILLED_EN, + MSG_KILLED_IT, + MSG_KILLED_ES, + MSG_KILLED_EN, + MSG_KILLED_DE, + MSG_KILLED_NL +}; + +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 MSG_LANGUAGE_NAME_DE[] PROGMEM = "Deutsch"; +const char MSG_LANGUAGE_NAME_NL[] PROGMEM = "Nederlands"; +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, + MSG_LANGUAGE_NAME_DE, + MSG_LANGUAGE_NAME_NL +}; + +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 = "Seleziona lingua"; +const char MSG_LANGUAGE_SELECT_ES[] PROGMEM = "Cambiae el idioma"; +const char MSG_LANGUAGE_SELECT_PL[] PROGMEM = "Wybor jezyka"; +const char MSG_LANGUAGE_SELECT_DE[] PROGMEM = "Waehle Sprache"; +const char MSG_LANGUAGE_SELECT_NL[] PROGMEM = "Kies taal"; +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, + MSG_LANGUAGE_SELECT_DE, + MSG_LANGUAGE_SELECT_NL +}; + +const char MSG_LEFT_EN[] PROGMEM = "Left:"; +const char MSG_LEFT_CZ[] PROGMEM = "Levy:"; +const char MSG_LEFT_IT[] PROGMEM = "Sinistra:"; +const char MSG_LEFT_ES[] PROGMEM = "Izquierda:"; +const char MSG_LEFT_PL[] PROGMEM = "Lewy:"; +const char MSG_LEFT_DE[] PROGMEM = "Links:"; +const char MSG_LEFT_NL[] PROGMEM = "Links:"; +const char * const MSG_LEFT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LEFT_EN, + MSG_LEFT_CZ, + MSG_LEFT_IT, + MSG_LEFT_ES, + MSG_LEFT_PL, + MSG_LEFT_DE, + MSG_LEFT_NL +}; + +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 = "Caricando colore"; +const char MSG_LOADING_COLOR_ES[] PROGMEM = "Cambiando color"; +const char MSG_LOADING_COLOR_PL[] PROGMEM = "Czyszcz. koloru"; +const char MSG_LOADING_COLOR_DE[] PROGMEM = "Lade Farbe"; +const char MSG_LOADING_COLOR_NL[] PROGMEM = "Laade kleur"; +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, + MSG_LOADING_COLOR_DE, + MSG_LOADING_COLOR_NL +}; + +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 = "Caricando filam."; +const char MSG_LOADING_FILAMENT_ES[] PROGMEM = "Introduciendo filam."; +const char MSG_LOADING_FILAMENT_PL[] PROGMEM = "Wprow. filamentu"; +const char MSG_LOADING_FILAMENT_DE[] PROGMEM = "Filament laedt"; +const char MSG_LOADING_FILAMENT_NL[] PROGMEM = "Laade Filament"; +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, + MSG_LOADING_FILAMENT_DE, + MSG_LOADING_FILAMENT_NL +}; + +const char MSG_LOAD_ALL_EN[] PROGMEM = "Load all"; +const char MSG_LOAD_ALL_CZ[] PROGMEM = "Zavest vse"; +const char MSG_LOAD_ALL_IT[] PROGMEM = "Caricare tutti"; +const char MSG_LOAD_ALL_ES[] PROGMEM = "Intr. todos fil."; +const char MSG_LOAD_ALL_PL[] PROGMEM = "Zalad. wszystkie"; +const char MSG_LOAD_ALL_DE[] PROGMEM = "Alle laden"; +const char MSG_LOAD_ALL_NL[] PROGMEM = "Alle laden"; +const char * const MSG_LOAD_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_ALL_EN, + MSG_LOAD_ALL_CZ, + MSG_LOAD_ALL_IT, + MSG_LOAD_ALL_ES, + MSG_LOAD_ALL_PL, + MSG_LOAD_ALL_DE, + MSG_LOAD_ALL_NL +}; + +const char MSG_LOAD_EPROM_EN[] PROGMEM = "Load memory"; +const char * const MSG_LOAD_EPROM_LANG_TABLE[1] PROGMEM = { + MSG_LOAD_EPROM_EN +}; + +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 = "Carica filamento"; +const char MSG_LOAD_FILAMENT_ES[] PROGMEM = "Introducir filam."; +const char MSG_LOAD_FILAMENT_PL[] PROGMEM = "Wprowadz filament"; +const char MSG_LOAD_FILAMENT_DE[] PROGMEM = "Filament laden"; +const char MSG_LOAD_FILAMENT_NL[] PROGMEM = "Filament laden"; +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, + MSG_LOAD_FILAMENT_DE, + MSG_LOAD_FILAMENT_NL +}; + +const char MSG_LOAD_FILAMENT_1_EN[] PROGMEM = "Load filament 1"; +const char MSG_LOAD_FILAMENT_1_CZ[] PROGMEM = "Zavest filament 1"; +const char MSG_LOAD_FILAMENT_1_IT[] PROGMEM = "Caricare fil. 1"; +const char MSG_LOAD_FILAMENT_1_ES[] PROGMEM = "Introducir fil. 1"; +const char MSG_LOAD_FILAMENT_1_PL[] PROGMEM = "Zaladowac fil. 1"; +const char MSG_LOAD_FILAMENT_1_DE[] PROGMEM = "Filament 1 laden"; +const char MSG_LOAD_FILAMENT_1_NL[] PROGMEM = "Filament 1 laden"; +const char * const MSG_LOAD_FILAMENT_1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_FILAMENT_1_EN, + MSG_LOAD_FILAMENT_1_CZ, + MSG_LOAD_FILAMENT_1_IT, + MSG_LOAD_FILAMENT_1_ES, + MSG_LOAD_FILAMENT_1_PL, + MSG_LOAD_FILAMENT_1_DE, + MSG_LOAD_FILAMENT_1_NL +}; + +const char MSG_LOAD_FILAMENT_2_EN[] PROGMEM = "Load filament 2"; +const char MSG_LOAD_FILAMENT_2_CZ[] PROGMEM = "Zavest filament 2"; +const char MSG_LOAD_FILAMENT_2_IT[] PROGMEM = "Caricare fil. 2"; +const char MSG_LOAD_FILAMENT_2_ES[] PROGMEM = "Introducir fil. 2"; +const char MSG_LOAD_FILAMENT_2_PL[] PROGMEM = "Zaladowac fil. 2"; +const char MSG_LOAD_FILAMENT_2_DE[] PROGMEM = "Filament 2 laden"; +const char MSG_LOAD_FILAMENT_2_NL[] PROGMEM = "Filament 2 laden"; +const char * const MSG_LOAD_FILAMENT_2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_FILAMENT_2_EN, + MSG_LOAD_FILAMENT_2_CZ, + MSG_LOAD_FILAMENT_2_IT, + MSG_LOAD_FILAMENT_2_ES, + MSG_LOAD_FILAMENT_2_PL, + MSG_LOAD_FILAMENT_2_DE, + MSG_LOAD_FILAMENT_2_NL +}; + +const char MSG_LOAD_FILAMENT_3_EN[] PROGMEM = "Load filament 3"; +const char MSG_LOAD_FILAMENT_3_CZ[] PROGMEM = "Zavest filament 3"; +const char MSG_LOAD_FILAMENT_3_IT[] PROGMEM = "Caricare fil. 3"; +const char MSG_LOAD_FILAMENT_3_ES[] PROGMEM = "Introducir fil. 3"; +const char MSG_LOAD_FILAMENT_3_PL[] PROGMEM = "Zaladowac fil. 3"; +const char MSG_LOAD_FILAMENT_3_DE[] PROGMEM = "Filament 3 laden"; +const char MSG_LOAD_FILAMENT_3_NL[] PROGMEM = "Filament 3 laden"; +const char * const MSG_LOAD_FILAMENT_3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_FILAMENT_3_EN, + MSG_LOAD_FILAMENT_3_CZ, + MSG_LOAD_FILAMENT_3_IT, + MSG_LOAD_FILAMENT_3_ES, + MSG_LOAD_FILAMENT_3_PL, + MSG_LOAD_FILAMENT_3_DE, + MSG_LOAD_FILAMENT_3_NL +}; + +const char MSG_LOAD_FILAMENT_4_EN[] PROGMEM = "Load filament 4"; +const char MSG_LOAD_FILAMENT_4_CZ[] PROGMEM = "Zavest filament 4"; +const char MSG_LOAD_FILAMENT_4_IT[] PROGMEM = "Caricare fil. 4"; +const char MSG_LOAD_FILAMENT_4_ES[] PROGMEM = "Introducir fil. 4"; +const char MSG_LOAD_FILAMENT_4_PL[] PROGMEM = "Zaladowac fil. 4"; +const char MSG_LOAD_FILAMENT_4_DE[] PROGMEM = "Filament 4 laden"; +const char MSG_LOAD_FILAMENT_4_NL[] PROGMEM = "Filament 4 laden"; +const char * const MSG_LOAD_FILAMENT_4_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOAD_FILAMENT_4_EN, + MSG_LOAD_FILAMENT_4_CZ, + MSG_LOAD_FILAMENT_4_IT, + MSG_LOAD_FILAMENT_4_ES, + MSG_LOAD_FILAMENT_4_PL, + MSG_LOAD_FILAMENT_4_DE, + MSG_LOAD_FILAMENT_4_NL +}; + +const char MSG_LOOSE_PULLEY_EN[] PROGMEM = "Loose pulley"; +const char MSG_LOOSE_PULLEY_CZ[] PROGMEM = "Uvolnena remenicka"; +const char MSG_LOOSE_PULLEY_IT[] PROGMEM = "Puleggia lenta"; +const char MSG_LOOSE_PULLEY_ES[] PROGMEM = "Polea suelta"; +const char MSG_LOOSE_PULLEY_PL[] PROGMEM = "Kolo pasowe"; +const char MSG_LOOSE_PULLEY_DE[] PROGMEM = "Loser pulley"; +const char * const MSG_LOOSE_PULLEY_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_LOOSE_PULLEY_EN, + MSG_LOOSE_PULLEY_CZ, + MSG_LOOSE_PULLEY_IT, + MSG_LOOSE_PULLEY_ES, + MSG_LOOSE_PULLEY_PL, + MSG_LOOSE_PULLEY_DE, + MSG_LOOSE_PULLEY_EN +}; + +const char MSG_M104_INVALID_EXTRUDER_EN[] PROGMEM = "M104 Invalid extruder "; +const char * const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M104_INVALID_EXTRUDER_EN +}; + +const char MSG_M105_INVALID_EXTRUDER_EN[] PROGMEM = "M105 Invalid extruder "; +const char * const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M105_INVALID_EXTRUDER_EN +}; + +const char MSG_M109_INVALID_EXTRUDER_EN[] PROGMEM = "M109 Invalid extruder "; +const char * const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M109_INVALID_EXTRUDER_EN +}; + +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 * const MSG_M115_REPORT_LANG_TABLE[1] PROGMEM = { + MSG_M115_REPORT_EN +}; + +const char MSG_M119_REPORT_EN[] PROGMEM = "Reporting endstop status"; +const char * const MSG_M119_REPORT_LANG_TABLE[1] PROGMEM = { + MSG_M119_REPORT_EN +}; + +const char MSG_M200_INVALID_EXTRUDER_EN[] PROGMEM = "M200 Invalid extruder "; +const char * const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M200_INVALID_EXTRUDER_EN +}; + +const char MSG_M218_INVALID_EXTRUDER_EN[] PROGMEM = "M218 Invalid extruder "; +const char * const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M218_INVALID_EXTRUDER_EN +}; + +const char MSG_M221_INVALID_EXTRUDER_EN[] PROGMEM = "M221 Invalid extruder "; +const char * const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[1] PROGMEM = { + MSG_M221_INVALID_EXTRUDER_EN +}; + +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 MSG_MAIN_DE[] PROGMEM = "Hauptmenue"; +const char MSG_MAIN_NL[] PROGMEM = "Hoofdmenu"; +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, + MSG_MAIN_DE, + MSG_MAIN_NL +}; + +const char MSG_MARK_FIL_EN[] PROGMEM = "Mark filament 100mm from extruder body. Click when done."; +const char MSG_MARK_FIL_CZ[] PROGMEM = "Oznacte filament 100 mm od tela extruderu a po te potvrdte tlacitkem."; +const char MSG_MARK_FIL_IT[] PROGMEM = "Segnare il filamento a 100 mm di distanza dal corpo dell'estrusore. Click per continuare."; +const char MSG_MARK_FIL_ES[] PROGMEM = "Marque el filamento 100 mm por encima del final del extrusor. Hacer clic una vez terminado."; +const char MSG_MARK_FIL_PL[] PROGMEM = "Prosze oznaczyc filament 100 mm od ciala ekstrudera. Potwierdzic przyciskiem."; +const char MSG_MARK_FIL_DE[] PROGMEM = "Filament 100mm vom Extrudergehaeuse markieren. Klicken wenn Fertig."; +const char MSG_MARK_FIL_NL[] PROGMEM = "Mark filament 100mm van extruder body. Klik als klaar."; +const char * const MSG_MARK_FIL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MARK_FIL_EN, + MSG_MARK_FIL_CZ, + MSG_MARK_FIL_IT, + MSG_MARK_FIL_ES, + MSG_MARK_FIL_PL, + MSG_MARK_FIL_DE, + MSG_MARK_FIL_NL +}; + +const char MSG_MAX_EN[] PROGMEM = " \002 Max"; +const char * const MSG_MAX_LANG_TABLE[1] PROGMEM = { + MSG_MAX_EN +}; + +const char MSG_MEASURED_SKEW_EN[] PROGMEM = "Measured skew:"; +const char MSG_MEASURED_SKEW_CZ[] PROGMEM = "Merene zkoseni:"; +const char MSG_MEASURED_SKEW_IT[] PROGMEM = "Incl. misurata:"; +const char MSG_MEASURED_SKEW_ES[] PROGMEM = "Inclin. medida:"; +const char MSG_MEASURED_SKEW_PL[] PROGMEM = "Zmier. sciecie:"; +const char MSG_MEASURED_SKEW_DE[] PROGMEM = "Symmetrie:"; +const char MSG_MEASURED_SKEW_NL[] PROGMEM = "Symmetrie:"; +const char * const MSG_MEASURED_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MEASURED_SKEW_EN, + MSG_MEASURED_SKEW_CZ, + MSG_MEASURED_SKEW_IT, + MSG_MEASURED_SKEW_ES, + MSG_MEASURED_SKEW_PL, + MSG_MEASURED_SKEW_DE, + MSG_MEASURED_SKEW_NL +}; + +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_EN[] PROGMEM = "Measuring reference height of calibration point"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_CZ[] PROGMEM = "Merim referencni vysku kalibracniho bodu"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_IT[] PROGMEM = "Misurare l'altezza di riferimento del punto di calibrazione"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_ES[] PROGMEM = "Medir la altura del punto de la calibracion"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_PL[] PROGMEM = "Okreslam wysokosc odniesienia punktu kalibracyjnego"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_DE[] PROGMEM = "Messen der Referenzhoehe des Kalibrierpunktes"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_NL[] PROGMEM = "Meten van reference hoogte van de kalibratiepunt"; +const char * const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_EN, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_CZ, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_IT, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_ES, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_PL, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_DE, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_NL +}; + +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_EN[] PROGMEM = " of 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_CZ[] PROGMEM = " z 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_IT[] PROGMEM = " su 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_ES[] PROGMEM = " de 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_PL[] PROGMEM = " z 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_DE[] PROGMEM = " von 9"; +const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_NL[] PROGMEM = " van 9"; +const char * const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_EN, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_CZ, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_IT, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_ES, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_PL, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_DE, + MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_NL +}; + +const char MSG_MENU_CALIBRATION_EN[] PROGMEM = "Calibration"; +const char MSG_MENU_CALIBRATION_CZ[] PROGMEM = "Kalibrace"; +const char MSG_MENU_CALIBRATION_IT[] PROGMEM = "Calibrazione"; +const char MSG_MENU_CALIBRATION_ES[] PROGMEM = "Calibracion"; +const char MSG_MENU_CALIBRATION_PL[] PROGMEM = "Kalibracja"; +const char MSG_MENU_CALIBRATION_DE[] PROGMEM = "Kalibrierung"; +const char MSG_MENU_CALIBRATION_NL[] PROGMEM = "Kalibratie"; +const char * const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MENU_CALIBRATION_EN, + MSG_MENU_CALIBRATION_CZ, + MSG_MENU_CALIBRATION_IT, + MSG_MENU_CALIBRATION_ES, + MSG_MENU_CALIBRATION_PL, + MSG_MENU_CALIBRATION_DE, + MSG_MENU_CALIBRATION_NL +}; + +const char MSG_MESH_BED_LEVELING_EN[] PROGMEM = "Mesh Bed Leveling"; +const char MSG_MESH_BED_LEVELING_IT[] PROGMEM = "Mesh livel. letto"; +const char * const MSG_MESH_BED_LEVELING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MESH_BED_LEVELING_EN, + MSG_MESH_BED_LEVELING_EN, + MSG_MESH_BED_LEVELING_IT, + MSG_MESH_BED_LEVELING_EN, + MSG_MESH_BED_LEVELING_EN, + MSG_MESH_BED_LEVELING_EN, + MSG_MESH_BED_LEVELING_EN +}; + +const char MSG_MIN_EN[] PROGMEM = " \002 Min"; +const char * const MSG_MIN_LANG_TABLE[1] PROGMEM = { + MSG_MIN_EN +}; + +const char MSG_MOTION_EN[] PROGMEM = "Motion"; +const char * const MSG_MOTION_LANG_TABLE[1] PROGMEM = { + MSG_MOTION_EN +}; + +const char MSG_MOVE_01MM_EN[] PROGMEM = "Move 0.1mm"; +const char * const MSG_MOVE_01MM_LANG_TABLE[1] PROGMEM = { + MSG_MOVE_01MM_EN +}; + +const char MSG_MOVE_10MM_EN[] PROGMEM = "Move 10mm"; +const char * const MSG_MOVE_10MM_LANG_TABLE[1] PROGMEM = { + MSG_MOVE_10MM_EN +}; + +const char MSG_MOVE_1MM_EN[] PROGMEM = "Move 1mm"; +const char * const MSG_MOVE_1MM_LANG_TABLE[1] PROGMEM = { + MSG_MOVE_1MM_EN +}; + +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 MSG_MOVE_AXIS_DE[] PROGMEM = "Bewege Achse"; +const char MSG_MOVE_AXIS_NL[] PROGMEM = "As verplaatsen"; +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, + MSG_MOVE_AXIS_DE, + MSG_MOVE_AXIS_NL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_EN[] PROGMEM = "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ[] PROGMEM = "Kalibrace XYZ. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_IT[] PROGMEM = "Calibrazione XYZ. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_ES[] PROGMEM = "Calibrando XYZ. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_PL[] PROGMEM = "Kalibracja XYZ. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_DE[] PROGMEM = "Kalibrieren von XYZ. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_NL[] PROGMEM = "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar."; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_PL, + MSG_MOVE_CARRIAGE_TO_THE_TOP_DE, + MSG_MOVE_CARRIAGE_TO_THE_TOP_NL +}; + +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_EN[] PROGMEM = "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_CZ[] PROGMEM = "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_IT[] PROGMEM = "Calibrazione Z. Ruotare la manopola per alzare il carrello Z fino all'altezza massima. Click per terminare."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_ES[] PROGMEM = "Calibrando Z. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_PL[] PROGMEM = "Kalibracja Z. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_DE[] PROGMEM = "Kalibrieren von Z. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind."; +const char MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_NL[] PROGMEM = "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar."; +const char * const MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_EN, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_CZ, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_IT, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_ES, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_PL, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_DE, + MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_NL +}; + +const char MSG_MOVE_E_EN[] PROGMEM = "Extruder"; +const char MSG_MOVE_E_IT[] PROGMEM = "Muovi Estrusore"; +const char MSG_MOVE_E_ES[] PROGMEM = "Extruir"; +const char * const MSG_MOVE_E_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_MOVE_E_EN, + MSG_MOVE_E_EN, + MSG_MOVE_E_IT, + MSG_MOVE_E_ES, + MSG_MOVE_E_EN, + MSG_MOVE_E_EN, + MSG_MOVE_E_EN +}; + +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 MSG_MOVE_X_DE[] PROGMEM = "Bewege X"; +const char MSG_MOVE_X_NL[] PROGMEM = "Verplaats 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, + MSG_MOVE_X_DE, + MSG_MOVE_X_NL +}; + +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 MSG_MOVE_Y_DE[] PROGMEM = "Bewege Y"; +const char MSG_MOVE_Y_NL[] PROGMEM = "Verplaats 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, + MSG_MOVE_Y_DE, + MSG_MOVE_Y_NL +}; + +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 MSG_MOVE_Z_DE[] PROGMEM = "Bewege Z"; +const char MSG_MOVE_Z_NL[] PROGMEM = "Verplaats 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, + MSG_MOVE_Z_DE, + MSG_MOVE_Z_NL +}; + +const char MSG_NEW_FIRMWARE_AVAILABLE_EN[] PROGMEM = "New firmware version available:"; +const char MSG_NEW_FIRMWARE_AVAILABLE_CZ[] PROGMEM = "Vysla nova verze firmware:"; +const char MSG_NEW_FIRMWARE_AVAILABLE_IT[] PROGMEM = "Nuova versione del firmware disponibile"; +const char MSG_NEW_FIRMWARE_AVAILABLE_ES[] PROGMEM = "Nuevo firmware disponible:"; +const char MSG_NEW_FIRMWARE_AVAILABLE_PL[] PROGMEM = "Wyszla nowa wersja firmware:"; +const char MSG_NEW_FIRMWARE_AVAILABLE_DE[] PROGMEM = "Neue Firmware Version verfuegbar:"; +const char MSG_NEW_FIRMWARE_AVAILABLE_NL[] PROGMEM = "Nieuwe firmware versie beschikbaar:"; +const char * const MSG_NEW_FIRMWARE_AVAILABLE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NEW_FIRMWARE_AVAILABLE_EN, + MSG_NEW_FIRMWARE_AVAILABLE_CZ, + MSG_NEW_FIRMWARE_AVAILABLE_IT, + MSG_NEW_FIRMWARE_AVAILABLE_ES, + MSG_NEW_FIRMWARE_AVAILABLE_PL, + MSG_NEW_FIRMWARE_AVAILABLE_DE, + MSG_NEW_FIRMWARE_AVAILABLE_NL +}; + +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN[] PROGMEM = "Please upgrade."; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ[] PROGMEM = "Prosim aktualizujte."; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_IT[] PROGMEM = "Prega aggiorna."; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES[] PROGMEM = "Actualizar por favor"; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL[] PROGMEM = "Prosze zaktualizowac"; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_DE[] PROGMEM = "Bitte aktualisieren."; +const char MSG_NEW_FIRMWARE_PLEASE_UPGRADE_NL[] PROGMEM = "Upgraden aub."; +const char * const MSG_NEW_FIRMWARE_PLEASE_UPGRADE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_EN, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_CZ, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_IT, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_ES, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_PL, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_DE, + MSG_NEW_FIRMWARE_PLEASE_UPGRADE_NL +}; + +const char MSG_NO_EN[] PROGMEM = "No"; +const char MSG_NO_CZ[] PROGMEM = "Ne"; +const char MSG_NO_PL[] PROGMEM = "Nie"; +const char MSG_NO_DE[] PROGMEM = "Nein"; +const char MSG_NO_NL[] PROGMEM = "Nee"; +const char * const MSG_NO_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NO_EN, + MSG_NO_CZ, + MSG_NO_EN, + MSG_NO_EN, + MSG_NO_PL, + MSG_NO_DE, + MSG_NO_NL +}; + +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 = "Colore non puro"; +const char MSG_NOT_COLOR_ES[] PROGMEM = "Color no homogeneo"; +const char MSG_NOT_COLOR_PL[] PROGMEM = "Kolor zanieczysz."; +const char MSG_NOT_COLOR_DE[] PROGMEM = "Farbe nicht klar."; +const char MSG_NOT_COLOR_NL[] PROGMEM = "Kleur niet duidelijk"; +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, + MSG_NOT_COLOR_DE, + MSG_NOT_COLOR_NL +}; + +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. non caricato"; +const char MSG_NOT_LOADED_ES[] PROGMEM = "Fil. no introducido"; +const char MSG_NOT_LOADED_PL[] PROGMEM = "Brak filamentu"; +const char MSG_NOT_LOADED_DE[] PROGMEM = "Fil. nicht geladen"; +const char MSG_NOT_LOADED_NL[] PROGMEM = "Fil. niet geladen"; +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, + MSG_NOT_LOADED_DE, + MSG_NOT_LOADED_NL +}; + +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 = "Boquilla"; +const char MSG_NOZZLE_PL[] PROGMEM = "Dysza"; +const char MSG_NOZZLE_DE[] PROGMEM = "Duese"; +const char MSG_NOZZLE_NL[] PROGMEM = "Tuit"; +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, + MSG_NOZZLE_DE, + MSG_NOZZLE_NL +}; + +const char MSG_NOZZLE1_EN[] PROGMEM = "Nozzle2"; +const char * const MSG_NOZZLE1_LANG_TABLE[1] PROGMEM = { + MSG_NOZZLE1_EN +}; + +const char MSG_NOZZLE2_EN[] PROGMEM = "Nozzle3"; +const char * const MSG_NOZZLE2_LANG_TABLE[1] PROGMEM = { + MSG_NOZZLE2_EN +}; + +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 = "Nessuna SD"; +const char MSG_NO_CARD_ES[] PROGMEM = "No hay tarjeta SD"; +const char MSG_NO_CARD_PL[] PROGMEM = "Brak karty SD"; +const char MSG_NO_CARD_DE[] PROGMEM = "Keine SD Karte"; +const char MSG_NO_CARD_NL[] PROGMEM = "Geen SD kaart"; +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, + MSG_NO_CARD_DE, + MSG_NO_CARD_NL +}; + +const char MSG_NO_MOVE_EN[] 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_DE[] PROGMEM = "Keine Bewegung."; +const char MSG_NO_MOVE_NL[] PROGMEM = "Geen beweging."; +const char * const MSG_NO_MOVE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_NO_MOVE_EN, + MSG_NO_MOVE_EN, + MSG_NO_MOVE_IT, + MSG_NO_MOVE_ES, + MSG_NO_MOVE_EN, + MSG_NO_MOVE_DE, + MSG_NO_MOVE_NL +}; + +const char MSG_OFF_EN[] PROGMEM = "Off"; +const char * const MSG_OFF_LANG_TABLE[1] PROGMEM = { + MSG_OFF_EN +}; + +const char MSG_OK_EN[] PROGMEM = "ok"; +const char * const MSG_OK_LANG_TABLE[1] PROGMEM = { + MSG_OK_EN +}; + +const char MSG_ON_EN[] PROGMEM = "On "; +const char * const MSG_ON_LANG_TABLE[1] PROGMEM = { + MSG_ON_EN +}; + +const char MSG_PAPER_EN[] PROGMEM = "Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."; +const char MSG_PAPER_CZ[] PROGMEM = "Umistete list papiru na podlozku a udrzujte jej pod tryskou behem mereni prvnich 4 bodu. Pokud tryska zachyti papir, vypnete tiskarnu."; +const char MSG_PAPER_IT[] PROGMEM = "Porre un foglio sotto l'ugello durante la calibrazione dei primi 4 punti. In caso l'ugello muova il foglio spegnere prontamente la stampante."; +const char MSG_PAPER_ES[] PROGMEM = "Colocar una hoja de papel sobre la superficie de impresion durante la calibracion de los primeros 4 puntos. Si la boquilla mueve el papel, apagar impresora inmediatamente."; +const char MSG_PAPER_PL[] PROGMEM = "Umiesc kartke papieru na podkladce i trzymaj pod dysza podczas pomiaru pierwszych 4 punktow. Jesli dysza zahaczy o papier, wylacz drukarke."; +const char MSG_PAPER_DE[] PROGMEM = "Lege waehrend der Kalibrierung der ersten 4 Punkte ein Blatt Papier unter die Duese. Wenn die Duese das Papier bewegt, Drucker sofort ausschalten!"; +const char MSG_PAPER_NL[] PROGMEM = "Leg een vel papier onder het tuit tijdens de kalibratie van de eerste 4 punten. Als het tuit het papier vangt, Printer onmiddellijk uitschakelen."; +const char * const MSG_PAPER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PAPER_EN, + MSG_PAPER_CZ, + MSG_PAPER_IT, + MSG_PAPER_ES, + MSG_PAPER_PL, + MSG_PAPER_DE, + MSG_PAPER_NL +}; + +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 = "Metti in pausa"; +const char MSG_PAUSE_PRINT_ES[] PROGMEM = "Pausar impresion"; +const char MSG_PAUSE_PRINT_PL[] PROGMEM = "Przerwac druk"; +const char MSG_PAUSE_PRINT_DE[] PROGMEM = "Pause"; +const char MSG_PAUSE_PRINT_NL[] PROGMEM = "Print pauzeren"; +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, + MSG_PAUSE_PRINT_DE, + MSG_PAUSE_PRINT_NL +}; + +const char MSG_PICK_Z_EN[] PROGMEM = "Pick print"; +const char MSG_PICK_Z_CZ[] PROGMEM = "Vyberte vytisk"; +const char MSG_PICK_Z_ES[] PROGMEM = "Esc. Modelo Adecuado"; +const char MSG_PICK_Z_PL[] PROGMEM = "Vyberte vytisk"; +const char MSG_PICK_Z_DE[] PROGMEM = "Waehle Druck"; +const char * const MSG_PICK_Z_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PICK_Z_EN, + MSG_PICK_Z_CZ, + MSG_PICK_Z_EN, + MSG_PICK_Z_ES, + MSG_PICK_Z_PL, + MSG_PICK_Z_DE, + MSG_PICK_Z_EN +}; + +const char MSG_PID_BED_EN[] PROGMEM = "PID bed cal. "; +const char MSG_PID_BED_DE[] PROGMEM = "PID Bett Kalibrier. "; +const char MSG_PID_BED_NL[] PROGMEM = "PID bed kalibratie "; +const char * const MSG_PID_BED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_BED_EN, + MSG_PID_BED_EN, + MSG_PID_BED_EN, + MSG_PID_BED_EN, + MSG_PID_BED_EN, + MSG_PID_BED_DE, + MSG_PID_BED_NL +}; + +const char MSG_PID_BED_FINISHED_EN[] PROGMEM = "PID bed cal. done "; +const char MSG_PID_BED_FINISHED_DE[] PROGMEM = "PID Bett Kal. fertig"; +const char MSG_PID_BED_FINISHED_NL[] PROGMEM = "PID bed kal. klaar "; +const char * const MSG_PID_BED_FINISHED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_BED_FINISHED_EN, + MSG_PID_BED_FINISHED_EN, + MSG_PID_BED_FINISHED_EN, + MSG_PID_BED_FINISHED_EN, + MSG_PID_BED_FINISHED_EN, + MSG_PID_BED_FINISHED_DE, + MSG_PID_BED_FINISHED_NL +}; + +const char MSG_PID_BED_RUNNING_EN[] PROGMEM = "PID bed cal. "; +const char MSG_PID_BED_RUNNING_DE[] PROGMEM = "PID Bett Kal."; +const char MSG_PID_BED_RUNNING_NL[] PROGMEM = "PID bed kal. "; +const char * const MSG_PID_BED_RUNNING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_BED_RUNNING_EN, + MSG_PID_BED_RUNNING_EN, + MSG_PID_BED_RUNNING_EN, + MSG_PID_BED_RUNNING_EN, + MSG_PID_BED_RUNNING_EN, + MSG_PID_BED_RUNNING_DE, + MSG_PID_BED_RUNNING_NL +}; + +const char MSG_PID_EXTRUDER_EN[] PROGMEM = "PID calibration"; +const char MSG_PID_EXTRUDER_CZ[] PROGMEM = "PID kalibrace"; +const char MSG_PID_EXTRUDER_IT[] PROGMEM = "Calibrazione PID"; +const char MSG_PID_EXTRUDER_ES[] PROGMEM = "Calibracion PID"; +const char MSG_PID_EXTRUDER_PL[] PROGMEM = "Kalibracja PID"; +const char MSG_PID_EXTRUDER_DE[] PROGMEM = "PID Kalibrierung"; +const char MSG_PID_EXTRUDER_NL[] PROGMEM = "PID kalibratie"; +const char * const MSG_PID_EXTRUDER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_EXTRUDER_EN, + MSG_PID_EXTRUDER_CZ, + MSG_PID_EXTRUDER_IT, + MSG_PID_EXTRUDER_ES, + MSG_PID_EXTRUDER_PL, + MSG_PID_EXTRUDER_DE, + MSG_PID_EXTRUDER_NL +}; + +const char MSG_PID_FINISHED_EN[] PROGMEM = "PID cal. finished "; +const char MSG_PID_FINISHED_CZ[] PROGMEM = "PID kal. ukoncena"; +const char MSG_PID_FINISHED_IT[] PROGMEM = "Cal. PID completa"; +const char MSG_PID_FINISHED_ES[] PROGMEM = "Cal. PID terminada"; +const char MSG_PID_FINISHED_PL[] PROGMEM = "Kal. PID zakonczona"; +const char MSG_PID_FINISHED_DE[] PROGMEM = "PID Kal. fertig "; +const char MSG_PID_FINISHED_NL[] PROGMEM = "PID kal. klaar "; +const char * const MSG_PID_FINISHED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_FINISHED_EN, + MSG_PID_FINISHED_CZ, + MSG_PID_FINISHED_IT, + MSG_PID_FINISHED_ES, + MSG_PID_FINISHED_PL, + MSG_PID_FINISHED_DE, + MSG_PID_FINISHED_NL +}; + +const char MSG_PID_RUNNING_EN[] PROGMEM = "PID cal. "; +const char MSG_PID_RUNNING_CZ[] PROGMEM = "PID kal. "; +const char MSG_PID_RUNNING_IT[] PROGMEM = "Cal. PID"; +const char MSG_PID_RUNNING_ES[] PROGMEM = "Cal. PID "; +const char MSG_PID_RUNNING_PL[] PROGMEM = "Kal. PID"; +const char MSG_PID_RUNNING_DE[] PROGMEM = "PID Kal. "; +const char MSG_PID_RUNNING_NL[] PROGMEM = "PID kal. "; +const char * const MSG_PID_RUNNING_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PID_RUNNING_EN, + MSG_PID_RUNNING_CZ, + MSG_PID_RUNNING_IT, + MSG_PID_RUNNING_ES, + MSG_PID_RUNNING_PL, + MSG_PID_RUNNING_DE, + MSG_PID_RUNNING_NL +}; + +const char MSG_PINDA_NOT_CALIBRATED_EN[] PROGMEM = "PINDA temperature calibration has not been run yet"; +const char MSG_PINDA_NOT_CALIBRATED_CZ[] PROGMEM = "Tiskarna nebyla teplotne zkalibrovana"; +const char MSG_PINDA_NOT_CALIBRATED_IT[] PROGMEM = "Taratura della temperatura non ancora eseguita"; +const char MSG_PINDA_NOT_CALIBRATED_ES[] PROGMEM = "La temperatura de calibracion no ha sido ajustada"; +const char MSG_PINDA_NOT_CALIBRATED_PL[] PROGMEM = "Cieplna kalibracja nie byla przeprowadzona"; +const char MSG_PINDA_NOT_CALIBRATED_DE[] PROGMEM = "PINDA Temperatur Kalibrierung wurde noch nicht ausgefuehrt"; +const char MSG_PINDA_NOT_CALIBRATED_NL[] PROGMEM = "PINDA temperatuur calibratie was nog niet uitgevoerd"; +const char * const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PINDA_NOT_CALIBRATED_EN, + MSG_PINDA_NOT_CALIBRATED_CZ, + MSG_PINDA_NOT_CALIBRATED_IT, + MSG_PINDA_NOT_CALIBRATED_ES, + MSG_PINDA_NOT_CALIBRATED_PL, + MSG_PINDA_NOT_CALIBRATED_DE, + MSG_PINDA_NOT_CALIBRATED_NL +}; + +const char MSG_PINDA_PREHEAT_EN[] PROGMEM = "PINDA Heating"; +const char MSG_PINDA_PREHEAT_CZ[] PROGMEM = "Nahrivani PINDA"; +const char MSG_PINDA_PREHEAT_IT[] PROGMEM = "Riscald. PINDA"; +const char MSG_PINDA_PREHEAT_ES[] PROGMEM = "Calentando PINDA"; +const char MSG_PINDA_PREHEAT_PL[] PROGMEM = "Grzanie PINDA"; +const char MSG_PINDA_PREHEAT_DE[] PROGMEM = "PINDA aufwaremen"; +const char MSG_PINDA_PREHEAT_NL[] PROGMEM = "PINDA warmt op"; +const char * const MSG_PINDA_PREHEAT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PINDA_PREHEAT_EN, + MSG_PINDA_PREHEAT_CZ, + MSG_PINDA_PREHEAT_IT, + MSG_PINDA_PREHEAT_ES, + MSG_PINDA_PREHEAT_PL, + MSG_PINDA_PREHEAT_DE, + MSG_PINDA_PREHEAT_NL +}; + +const char MSG_PLANNER_BUFFER_BYTES_EN[] PROGMEM = " PlannerBufferBytes: "; +const char * const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1] PROGMEM = { + MSG_PLANNER_BUFFER_BYTES_EN +}; + +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 = "Por Favor Esperar"; +const char MSG_PLEASE_WAIT_PL[] PROGMEM = "Prosze czekac"; +const char MSG_PLEASE_WAIT_DE[] PROGMEM = "Bitte warten"; +const char MSG_PLEASE_WAIT_NL[] PROGMEM = "Wacht aub"; +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, + MSG_PLEASE_WAIT_DE, + MSG_PLEASE_WAIT_NL +}; + +const char MSG_POSITION_UNKNOWN_EN[] PROGMEM = "Home X/Y before Z"; +const char * const MSG_POSITION_UNKNOWN_LANG_TABLE[1] PROGMEM = { + MSG_POSITION_UNKNOWN_EN +}; + +const char MSG_POWERUP_EN[] PROGMEM = "PowerUp"; +const char * const MSG_POWERUP_LANG_TABLE[1] PROGMEM = { + MSG_POWERUP_EN +}; + +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 MSG_PREHEAT_DE[] PROGMEM = "Vorheizen"; +const char MSG_PREHEAT_NL[] PROGMEM = "Voorverwarmen"; +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, + MSG_PREHEAT_DE, + MSG_PREHEAT_NL +}; + +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 = "Precalentar extrusor"; +const char MSG_PREHEAT_NOZZLE_PL[] PROGMEM = "Nagrzej dysze!"; +const char MSG_PREHEAT_NOZZLE_DE[] PROGMEM = "Duese vorheizen!"; +const char MSG_PREHEAT_NOZZLE_NL[] PROGMEM = "Tuit voorverwarmen!"; +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, + MSG_PREHEAT_NOZZLE_DE, + MSG_PREHEAT_NOZZLE_NL +}; + +const char MSG_PREPARE_FILAMENT_EN[] PROGMEM = "Prepare new filament"; +const char MSG_PREPARE_FILAMENT_CZ[] PROGMEM = "Pripravte filament"; +const char MSG_PREPARE_FILAMENT_IT[] PROGMEM = "Preparare filamento"; +const char MSG_PREPARE_FILAMENT_ES[] PROGMEM = "Preparar filamento"; +const char MSG_PREPARE_FILAMENT_PL[] PROGMEM = "Przygotuj filament"; +const char MSG_PREPARE_FILAMENT_DE[] PROGMEM = "Filam. bereithalten"; +const char MSG_PREPARE_FILAMENT_NL[] PROGMEM = "Filam. voorbereiden"; +const char * const MSG_PREPARE_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PREPARE_FILAMENT_EN, + MSG_PREPARE_FILAMENT_CZ, + MSG_PREPARE_FILAMENT_IT, + MSG_PREPARE_FILAMENT_ES, + MSG_PREPARE_FILAMENT_PL, + MSG_PREPARE_FILAMENT_DE, + MSG_PREPARE_FILAMENT_NL +}; + +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 = "e cliccare manopola"; +const char MSG_PRESS_ES[] PROGMEM = "Pulsar el mando"; +const char MSG_PRESS_PL[] PROGMEM = "Nacisnij przycisk"; +const char MSG_PRESS_DE[] PROGMEM = "und Knopf druecken"; +const char MSG_PRESS_NL[] PROGMEM = "en druk op knop"; +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, + MSG_PRESS_DE, + MSG_PRESS_NL +}; + +const char MSG_PRINTER_DISCONNECTED_EN[] PROGMEM = "Printer disconnected"; +const char MSG_PRINTER_DISCONNECTED_DE[] PROGMEM = "Drucker getrent"; +const char MSG_PRINTER_DISCONNECTED_NL[] PROGMEM = "Printer ontbonden"; +const char * const MSG_PRINTER_DISCONNECTED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRINTER_DISCONNECTED_EN, + MSG_PRINTER_DISCONNECTED_EN, + MSG_PRINTER_DISCONNECTED_EN, + MSG_PRINTER_DISCONNECTED_EN, + MSG_PRINTER_DISCONNECTED_EN, + MSG_PRINTER_DISCONNECTED_DE, + MSG_PRINTER_DISCONNECTED_NL +}; + +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 = "Impresion cancelada"; +const char MSG_PRINT_ABORTED_PL[] PROGMEM = "Druk przerwany"; +const char MSG_PRINT_ABORTED_DE[] PROGMEM = "Druck abgebrochen"; +const char MSG_PRINT_ABORTED_NL[] PROGMEM = "Print afgebroken"; +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, + MSG_PRINT_ABORTED_DE, + MSG_PRINT_ABORTED_NL +}; + +const char MSG_PRINT_PAUSED_EN[] PROGMEM = "Print paused"; +const char MSG_PRINT_PAUSED_CZ[] PROGMEM = "Tisk pozastaven"; +const char MSG_PRINT_PAUSED_IT[] PROGMEM = "Stampa in pausa"; +const char MSG_PRINT_PAUSED_ES[] PROGMEM = "Impresion en pausa"; +const char MSG_PRINT_PAUSED_PL[] PROGMEM = "Druk zatrzymany"; +const char MSG_PRINT_PAUSED_DE[] PROGMEM = "Druck pausiert"; +const char MSG_PRINT_PAUSED_NL[] PROGMEM = "Druck pauzeren"; +const char * const MSG_PRINT_PAUSED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_PRINT_PAUSED_EN, + MSG_PRINT_PAUSED_CZ, + MSG_PRINT_PAUSED_IT, + MSG_PRINT_PAUSED_ES, + MSG_PRINT_PAUSED_PL, + MSG_PRINT_PAUSED_DE, + MSG_PRINT_PAUSED_NL +}; + +const char MSG_PRUSA3D_EN[] PROGMEM = "prusa3d.com"; +const char MSG_PRUSA3D_CZ[] PROGMEM = "prusa3d.cz"; +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_EN, + MSG_PRUSA3D_EN, + MSG_PRUSA3D_PL, + MSG_PRUSA3D_EN, + MSG_PRUSA3D_EN +}; + +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_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_EN, + MSG_PRUSA3D_FORUM_EN, + MSG_PRUSA3D_FORUM_PL, + MSG_PRUSA3D_FORUM_EN, + MSG_PRUSA3D_FORUM_EN +}; + +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_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_EN, + MSG_PRUSA3D_HOWTO_EN, + MSG_PRUSA3D_HOWTO_PL, + MSG_PRUSA3D_HOWTO_EN, + MSG_PRUSA3D_HOWTO_EN +}; + +const char MSG_REBOOT_EN[] PROGMEM = "Reboot the printer"; +const char MSG_REBOOT_CZ[] PROGMEM = "Restartujte tiskarnu"; +const char MSG_REBOOT_IT[] PROGMEM = "Riavvia stampante"; +const char MSG_REBOOT_ES[] PROGMEM = "Reiniciar impresora"; +const char MSG_REBOOT_PL[] PROGMEM = "Restart drukarki"; +const char MSG_REBOOT_DE[] PROGMEM = "Reboot den Drucker"; +const char MSG_REBOOT_NL[] PROGMEM = "Herstart de printer"; +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, + MSG_REBOOT_DE, + MSG_REBOOT_NL +}; + +const char MSG_RECTRACT_EN[] PROGMEM = "Rectract"; +const char * const MSG_RECTRACT_LANG_TABLE[1] PROGMEM = { + MSG_RECTRACT_EN +}; + +const char MSG_REFRESH_EN[] PROGMEM = "\xF8" "Refresh"; +const char * const MSG_REFRESH_LANG_TABLE[1] PROGMEM = { + MSG_REFRESH_EN +}; + +const char MSG_RESEND_EN[] PROGMEM = "Resend: "; +const char * const MSG_RESEND_LANG_TABLE[1] PROGMEM = { + MSG_RESEND_EN +}; + +const char MSG_RESET_CALIBRATE_E_EN[] PROGMEM = "Reset E Cal."; +const char * const MSG_RESET_CALIBRATE_E_LANG_TABLE[1] PROGMEM = { + MSG_RESET_CALIBRATE_E_EN +}; + +const char MSG_RESTORE_FAILSAFE_EN[] PROGMEM = "Restore failsafe"; +const char * const MSG_RESTORE_FAILSAFE_LANG_TABLE[1] PROGMEM = { + MSG_RESTORE_FAILSAFE_EN +}; + +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 MSG_RESUME_PRINT_DE[] PROGMEM = "Fortsetzen"; +const char MSG_RESUME_PRINT_NL[] PROGMEM = "Print hervatten"; +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, + MSG_RESUME_PRINT_DE, + MSG_RESUME_PRINT_NL +}; + +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 impresion"; +const char MSG_RESUMING_PL[] PROGMEM = "Wznowienie druku"; +const char MSG_RESUMING_DE[] PROGMEM = "Druck fortgesetzt"; +const char MSG_RESUMING_NL[] PROGMEM = "Print hervatten"; +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, + MSG_RESUMING_DE, + MSG_RESUMING_NL +}; + +const char MSG_RESUMING_PRINT_EN[] PROGMEM = "Resuming print"; +const char MSG_RESUMING_PRINT_CZ[] PROGMEM = "Obnovovani tisku"; +const char MSG_RESUMING_PRINT_IT[] PROGMEM = "Stampa in ripresa"; +const char MSG_RESUMING_PRINT_ES[] PROGMEM = "Reanudar impresion"; +const char MSG_RESUMING_PRINT_PL[] PROGMEM = "Wznawianie druku"; +const char MSG_RESUMING_PRINT_DE[] PROGMEM = "Druck fortsetzen"; +const char MSG_RESUMING_PRINT_NL[] PROGMEM = "Print hervatten"; +const char * const MSG_RESUMING_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RESUMING_PRINT_EN, + MSG_RESUMING_PRINT_CZ, + MSG_RESUMING_PRINT_IT, + MSG_RESUMING_PRINT_ES, + MSG_RESUMING_PRINT_PL, + MSG_RESUMING_PRINT_DE, + MSG_RESUMING_PRINT_NL +}; + +const char MSG_RIGHT_EN[] PROGMEM = "Right:"; +const char MSG_RIGHT_CZ[] PROGMEM = "Pravy:"; +const char MSG_RIGHT_IT[] PROGMEM = "Destra:"; +const char MSG_RIGHT_ES[] PROGMEM = "Derecha:"; +const char MSG_RIGHT_PL[] PROGMEM = "Prawy:"; +const char MSG_RIGHT_DE[] PROGMEM = "Rechts:"; +const char MSG_RIGHT_NL[] PROGMEM = "Rechts:"; +const char * const MSG_RIGHT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_RIGHT_EN, + MSG_RIGHT_CZ, + MSG_RIGHT_IT, + MSG_RIGHT_ES, + MSG_RIGHT_PL, + MSG_RIGHT_DE, + MSG_RIGHT_NL +}; + +const char MSG_SD_CANT_ENTER_SUBDIR_EN[] PROGMEM = "Cannot enter subdir: "; +const char * const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[1] PROGMEM = { + MSG_SD_CANT_ENTER_SUBDIR_EN +}; + +const char MSG_SD_CANT_OPEN_SUBDIR_EN[] PROGMEM = "Cannot open subdir"; +const char * const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[1] PROGMEM = { + MSG_SD_CANT_OPEN_SUBDIR_EN +}; + +const char MSG_SD_CARD_OK_EN[] PROGMEM = "SD card ok"; +const char * const MSG_SD_CARD_OK_LANG_TABLE[1] PROGMEM = { + MSG_SD_CARD_OK_EN +}; + +const char MSG_SD_ERR_WRITE_TO_FILE_EN[] PROGMEM = "error writing to file"; +const char * const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[1] PROGMEM = { + MSG_SD_ERR_WRITE_TO_FILE_EN +}; + +const char MSG_SD_FILE_OPENED_EN[] PROGMEM = "File opened: "; +const char * const MSG_SD_FILE_OPENED_LANG_TABLE[1] PROGMEM = { + MSG_SD_FILE_OPENED_EN +}; + +const char MSG_SD_FILE_SELECTED_EN[] PROGMEM = "File selected"; +const char * const MSG_SD_FILE_SELECTED_LANG_TABLE[1] PROGMEM = { + MSG_SD_FILE_SELECTED_EN +}; + +const char MSG_SD_INIT_FAIL_EN[] PROGMEM = "SD init fail"; +const char * const MSG_SD_INIT_FAIL_LANG_TABLE[1] PROGMEM = { + MSG_SD_INIT_FAIL_EN +}; + +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 inserita"; +const char MSG_SD_INSERTED_ES[] PROGMEM = "Tarjeta insertada"; +const char MSG_SD_INSERTED_PL[] PROGMEM = "Karta wlozona"; +const char MSG_SD_INSERTED_DE[] PROGMEM = "SD Karte eingesetzt"; +const char MSG_SD_INSERTED_NL[] PROGMEM = "SD ingestoken"; +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, + MSG_SD_INSERTED_DE, + MSG_SD_INSERTED_NL +}; + +const char MSG_SD_NOT_PRINTING_EN[] PROGMEM = "Not SD printing"; +const char * const MSG_SD_NOT_PRINTING_LANG_TABLE[1] PROGMEM = { + MSG_SD_NOT_PRINTING_EN +}; + +const char MSG_SD_OPENROOT_FAIL_EN[] PROGMEM = "openRoot failed"; +const char * const MSG_SD_OPENROOT_FAIL_LANG_TABLE[1] PROGMEM = { + MSG_SD_OPENROOT_FAIL_EN +}; + +const char MSG_SD_OPEN_FILE_FAIL_EN[] PROGMEM = "open failed, File: "; +const char * const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[1] PROGMEM = { + MSG_SD_OPEN_FILE_FAIL_EN +}; + +const char MSG_SD_PRINTING_BYTE_EN[] PROGMEM = "SD printing byte "; +const char * const MSG_SD_PRINTING_BYTE_LANG_TABLE[1] PROGMEM = { + MSG_SD_PRINTING_BYTE_EN +}; + +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 rimossa"; +const char MSG_SD_REMOVED_ES[] PROGMEM = "Tarjeta retirada"; +const char MSG_SD_REMOVED_PL[] PROGMEM = "Karta wyjeta"; +const char MSG_SD_REMOVED_DE[] PROGMEM = "SD Karte entfernt"; +const char MSG_SD_REMOVED_NL[] PROGMEM = "SD verwijderd"; +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, + MSG_SD_REMOVED_DE, + MSG_SD_REMOVED_NL +}; + +const char MSG_SD_SIZE_EN[] PROGMEM = " Size: "; +const char * const MSG_SD_SIZE_LANG_TABLE[1] PROGMEM = { + MSG_SD_SIZE_EN +}; + +const char MSG_SD_VOL_INIT_FAIL_EN[] PROGMEM = "volume.init failed"; +const char * const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[1] PROGMEM = { + MSG_SD_VOL_INIT_FAIL_EN +}; + +const char MSG_SD_WORKDIR_FAIL_EN[] PROGMEM = "workDir open failed"; +const char * const MSG_SD_WORKDIR_FAIL_LANG_TABLE[1] PROGMEM = { + MSG_SD_WORKDIR_FAIL_EN +}; + +const char MSG_SD_WRITE_TO_FILE_EN[] PROGMEM = "Writing to file: "; +const char * const MSG_SD_WRITE_TO_FILE_LANG_TABLE[1] PROGMEM = { + MSG_SD_WRITE_TO_FILE_EN +}; + +const char MSG_SELFTEST_EN[] PROGMEM = "Selftest "; +const char MSG_SELFTEST_IT[] PROGMEM = "Autotest"; +const char MSG_SELFTEST_ES[] PROGMEM = "Autotest"; +const char MSG_SELFTEST_DE[] PROGMEM = "Selbsttest "; +const char MSG_SELFTEST_NL[] PROGMEM = "Zelftest "; +const char * const MSG_SELFTEST_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_EN, + MSG_SELFTEST_EN, + MSG_SELFTEST_IT, + MSG_SELFTEST_ES, + MSG_SELFTEST_EN, + MSG_SELFTEST_DE, + MSG_SELFTEST_NL +}; + +const char MSG_SELFTEST_BEDHEATER_EN[] PROGMEM = "Bed / Heater"; +const char MSG_SELFTEST_BEDHEATER_IT[] PROGMEM = "Letto/Riscald."; +const char MSG_SELFTEST_BEDHEATER_ES[] PROGMEM = "Cama/Calentador"; +const char MSG_SELFTEST_BEDHEATER_DE[] PROGMEM = "Bett / Heater"; +const char * const MSG_SELFTEST_BEDHEATER_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_BEDHEATER_EN, + MSG_SELFTEST_BEDHEATER_EN, + MSG_SELFTEST_BEDHEATER_IT, + MSG_SELFTEST_BEDHEATER_ES, + MSG_SELFTEST_BEDHEATER_EN, + MSG_SELFTEST_BEDHEATER_DE, + MSG_SELFTEST_BEDHEATER_EN +}; + +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 MSG_SELFTEST_CHECK_ALLCORRECT_DE[] PROGMEM = "Alles richtig "; +const char MSG_SELFTEST_CHECK_ALLCORRECT_NL[] PROGMEM = "Allemaal goed "; +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, + MSG_SELFTEST_CHECK_ALLCORRECT_DE, + MSG_SELFTEST_CHECK_ALLCORRECT_NL +}; + +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 letto"; +const char MSG_SELFTEST_CHECK_BED_ES[] PROGMEM = "Control de cama"; +const char MSG_SELFTEST_CHECK_BED_PL[] PROGMEM = "Kontrola bed "; +const char MSG_SELFTEST_CHECK_BED_DE[] PROGMEM = "Pruefe Bett "; +const char MSG_SELFTEST_CHECK_BED_NL[] PROGMEM = "Controleer 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, + MSG_SELFTEST_CHECK_BED_DE, + MSG_SELFTEST_CHECK_BED_NL +}; + +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 finecorsa"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_ES[] PROGMEM = "Cont. topes final"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_PL[] PROGMEM = "Kontrola endstops"; +const char MSG_SELFTEST_CHECK_ENDSTOPS_DE[] PROGMEM = "Pruefe Endschalter "; +const char MSG_SELFTEST_CHECK_ENDSTOPS_NL[] PROGMEM = "Controleer 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, + MSG_SELFTEST_CHECK_ENDSTOPS_DE, + MSG_SELFTEST_CHECK_ENDSTOPS_NL +}; + +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 ugello"; +const char MSG_SELFTEST_CHECK_HOTEND_ES[] PROGMEM = "Control hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_PL[] PROGMEM = "Kontrola hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_DE[] PROGMEM = "Pruefe Hotend "; +const char MSG_SELFTEST_CHECK_HOTEND_NL[] PROGMEM = "Controleer 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, + MSG_SELFTEST_CHECK_HOTEND_DE, + MSG_SELFTEST_CHECK_HOTEND_NL +}; + +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 MSG_SELFTEST_CHECK_X_DE[] PROGMEM = "Pruefe X Achse "; +const char MSG_SELFTEST_CHECK_X_NL[] PROGMEM = "Controleer X as "; +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, + MSG_SELFTEST_CHECK_X_DE, + MSG_SELFTEST_CHECK_X_NL +}; + +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 MSG_SELFTEST_CHECK_Y_DE[] PROGMEM = "Pruefe Y Achse "; +const char MSG_SELFTEST_CHECK_Y_NL[] PROGMEM = "Controleer Y as "; +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, + MSG_SELFTEST_CHECK_Y_DE, + MSG_SELFTEST_CHECK_Y_NL +}; + +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 MSG_SELFTEST_CHECK_Z_DE[] PROGMEM = "Pruefe Z Achse "; +const char MSG_SELFTEST_CHECK_Z_NL[] PROGMEM = "Controleer Z as "; +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, + MSG_SELFTEST_CHECK_Z_DE, + MSG_SELFTEST_CHECK_Z_NL +}; + +const char MSG_SELFTEST_COOLING_FAN_EN[] PROGMEM = "Front print fan?";; +const char MSG_SELFTEST_COOLING_FAN_CZ[] PROGMEM = "Predni tiskovy vent?";; +const char MSG_SELFTEST_COOLING_FAN_IT[] PROGMEM = "Vent di stampa ant.?";; +const char MSG_SELFTEST_COOLING_FAN_ES[] PROGMEM = "Vent. al frente?";; +const char MSG_SELFTEST_COOLING_FAN_PL[] PROGMEM = "Przodni went. druku?";; +const char MSG_SELFTEST_COOLING_FAN_DE[] PROGMEM = "Vorderer Luefter?";; +const char MSG_SELFTEST_COOLING_FAN_NL[] PROGMEM = "Voordere fan?";; +const char * const MSG_SELFTEST_COOLING_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_COOLING_FAN_EN, + MSG_SELFTEST_COOLING_FAN_CZ, + MSG_SELFTEST_COOLING_FAN_IT, + MSG_SELFTEST_COOLING_FAN_ES, + MSG_SELFTEST_COOLING_FAN_PL, + MSG_SELFTEST_COOLING_FAN_DE, + MSG_SELFTEST_COOLING_FAN_NL +}; + +const char MSG_SELFTEST_ENDSTOP_EN[] PROGMEM = "Endstop"; +const char MSG_SELFTEST_ENDSTOP_IT[] PROGMEM = "Finecorsa"; +const char MSG_SELFTEST_ENDSTOP_ES[] PROGMEM = "Tope final"; +const char * const MSG_SELFTEST_ENDSTOP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOP_EN, + MSG_SELFTEST_ENDSTOP_EN, + MSG_SELFTEST_ENDSTOP_IT, + MSG_SELFTEST_ENDSTOP_ES, + MSG_SELFTEST_ENDSTOP_EN, + MSG_SELFTEST_ENDSTOP_EN, + MSG_SELFTEST_ENDSTOP_EN +}; + +const char MSG_SELFTEST_ENDSTOPS_EN[] PROGMEM = "Endstops"; +const char MSG_SELFTEST_ENDSTOPS_IT[] PROGMEM = "Finecorsa (2)"; +const char MSG_SELFTEST_ENDSTOPS_ES[] PROGMEM = "Topes final"; +const char MSG_SELFTEST_ENDSTOPS_DE[] PROGMEM = "Endschalter"; +const char * const MSG_SELFTEST_ENDSTOPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOPS_EN, + MSG_SELFTEST_ENDSTOPS_EN, + MSG_SELFTEST_ENDSTOPS_IT, + MSG_SELFTEST_ENDSTOPS_ES, + MSG_SELFTEST_ENDSTOPS_EN, + MSG_SELFTEST_ENDSTOPS_DE, + MSG_SELFTEST_ENDSTOPS_EN +}; + +const char MSG_SELFTEST_ENDSTOP_NOTHIT_EN[] PROGMEM = "Endstop not hit"; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_IT[] PROGMEM = "Finec. fuori por."; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_ES[] PROGMEM = "Tope fin. no toc."; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_DE[] PROGMEM = "Endsch. n. erreicht"; +const char MSG_SELFTEST_ENDSTOP_NOTHIT_NL[] PROGMEM = "Endstop niet geraakt"; +const char * const MSG_SELFTEST_ENDSTOP_NOTHIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ENDSTOP_NOTHIT_EN, + MSG_SELFTEST_ENDSTOP_NOTHIT_EN, + MSG_SELFTEST_ENDSTOP_NOTHIT_IT, + MSG_SELFTEST_ENDSTOP_NOTHIT_ES, + MSG_SELFTEST_ENDSTOP_NOTHIT_EN, + MSG_SELFTEST_ENDSTOP_NOTHIT_DE, + MSG_SELFTEST_ENDSTOP_NOTHIT_NL +}; + +const char MSG_SELFTEST_ERROR_EN[] PROGMEM = "Selftest error !"; +const char MSG_SELFTEST_ERROR_IT[] PROGMEM = "Autotest negativo"; +const char MSG_SELFTEST_ERROR_ES[] PROGMEM = "Autotest error!"; +const char MSG_SELFTEST_ERROR_DE[] PROGMEM = "Selbsttest Fehler !"; +const char MSG_SELFTEST_ERROR_NL[] PROGMEM = "Zelftest Fout !"; +const char * const MSG_SELFTEST_ERROR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_ERROR_EN, + MSG_SELFTEST_ERROR_EN, + MSG_SELFTEST_ERROR_IT, + MSG_SELFTEST_ERROR_ES, + MSG_SELFTEST_ERROR_EN, + MSG_SELFTEST_ERROR_DE, + MSG_SELFTEST_ERROR_NL +}; + +const char MSG_SELFTEST_EXTRUDER_FAN_EN[] PROGMEM = "Left hotend fan?";; +const char MSG_SELFTEST_EXTRUDER_FAN_CZ[] PROGMEM = "Levy vent na trysce?";; +const char MSG_SELFTEST_EXTRUDER_FAN_IT[] PROGMEM = "Vent SX sull'ugello?";; +const char MSG_SELFTEST_EXTRUDER_FAN_ES[] PROGMEM = "Vent. en la izg?";; +const char MSG_SELFTEST_EXTRUDER_FAN_PL[] PROGMEM = "Lewy went na dysze?";; +const char MSG_SELFTEST_EXTRUDER_FAN_DE[] PROGMEM = "Linker Luefter?";; +const char MSG_SELFTEST_EXTRUDER_FAN_NL[] PROGMEM = "Linke fan?";; +const char * const MSG_SELFTEST_EXTRUDER_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_EXTRUDER_FAN_EN, + MSG_SELFTEST_EXTRUDER_FAN_CZ, + MSG_SELFTEST_EXTRUDER_FAN_IT, + MSG_SELFTEST_EXTRUDER_FAN_ES, + MSG_SELFTEST_EXTRUDER_FAN_PL, + MSG_SELFTEST_EXTRUDER_FAN_DE, + MSG_SELFTEST_EXTRUDER_FAN_NL +}; + +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 MSG_SELFTEST_FAILED_DE[] PROGMEM = "Selbsttest misluekt"; +const char MSG_SELFTEST_FAILED_NL[] PROGMEM = "Zelftest mislukt "; +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, + MSG_SELFTEST_FAILED_DE, + MSG_SELFTEST_FAILED_NL +}; + +const char MSG_SELFTEST_FAN_EN[] PROGMEM = "Fan test";; +const char MSG_SELFTEST_FAN_CZ[] PROGMEM = "Test ventilatoru";; +const char MSG_SELFTEST_FAN_IT[] PROGMEM = "Prova del ventilator";; +const char MSG_SELFTEST_FAN_ES[] PROGMEM = "Test del ventilador";; +const char MSG_SELFTEST_FAN_PL[] PROGMEM = "Test wentylatora";; +const char MSG_SELFTEST_FAN_DE[] PROGMEM = "Lueftertest";; +const char * const MSG_SELFTEST_FAN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_FAN_EN, + MSG_SELFTEST_FAN_CZ, + MSG_SELFTEST_FAN_IT, + MSG_SELFTEST_FAN_ES, + MSG_SELFTEST_FAN_PL, + MSG_SELFTEST_FAN_DE, + MSG_SELFTEST_FAN_EN +}; + +const char MSG_SELFTEST_FAN_NO_EN[] PROGMEM = "Not spinning";; +const char MSG_SELFTEST_FAN_NO_CZ[] PROGMEM = "Netoci se";; +const char MSG_SELFTEST_FAN_NO_IT[] PROGMEM = "Non si gira";; +const char MSG_SELFTEST_FAN_NO_ES[] PROGMEM = "Ventilador no gira";; +const char MSG_SELFTEST_FAN_NO_PL[] PROGMEM = "Nekreci sie";; +const char MSG_SELFTEST_FAN_NO_DE[] PROGMEM = "Dreht nicht";; +const char MSG_SELFTEST_FAN_NO_NL[] PROGMEM = "Roteert niet";; +const char * const MSG_SELFTEST_FAN_NO_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_FAN_NO_EN, + MSG_SELFTEST_FAN_NO_CZ, + MSG_SELFTEST_FAN_NO_IT, + MSG_SELFTEST_FAN_NO_ES, + MSG_SELFTEST_FAN_NO_PL, + MSG_SELFTEST_FAN_NO_DE, + MSG_SELFTEST_FAN_NO_NL +}; + +const char MSG_SELFTEST_FAN_YES_EN[] PROGMEM = "Spinning";; +const char MSG_SELFTEST_FAN_YES_CZ[] PROGMEM = "Toci se";; +const char MSG_SELFTEST_FAN_YES_IT[] PROGMEM = "Gira";; +const char MSG_SELFTEST_FAN_YES_ES[] PROGMEM = "Ventilador gira";; +const char MSG_SELFTEST_FAN_YES_PL[] PROGMEM = "Kreci sie";; +const char MSG_SELFTEST_FAN_YES_DE[] PROGMEM = "Dreht";; +const char MSG_SELFTEST_FAN_YES_NL[] PROGMEM = "Roteert";; +const char * const MSG_SELFTEST_FAN_YES_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_FAN_YES_EN, + MSG_SELFTEST_FAN_YES_CZ, + MSG_SELFTEST_FAN_YES_IT, + MSG_SELFTEST_FAN_YES_ES, + MSG_SELFTEST_FAN_YES_PL, + MSG_SELFTEST_FAN_YES_DE, + MSG_SELFTEST_FAN_YES_NL +}; + +const char MSG_SELFTEST_HEATERTHERMISTOR_EN[] PROGMEM = "Heater/Thermistor"; +const char MSG_SELFTEST_HEATERTHERMISTOR_IT[] PROGMEM = "Riscald./Termist."; +const char MSG_SELFTEST_HEATERTHERMISTOR_ES[] PROGMEM = "Calent./Termistor"; +const char * const MSG_SELFTEST_HEATERTHERMISTOR_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_HEATERTHERMISTOR_EN, + MSG_SELFTEST_HEATERTHERMISTOR_EN, + MSG_SELFTEST_HEATERTHERMISTOR_IT, + MSG_SELFTEST_HEATERTHERMISTOR_ES, + MSG_SELFTEST_HEATERTHERMISTOR_EN, + MSG_SELFTEST_HEATERTHERMISTOR_EN, + MSG_SELFTEST_HEATERTHERMISTOR_EN +}; + +const char MSG_SELFTEST_MOTOR_EN[] PROGMEM = "Motor"; +const char MSG_SELFTEST_MOTOR_IT[] PROGMEM = "Motore"; +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_EN, + MSG_SELFTEST_MOTOR_IT, + MSG_SELFTEST_MOTOR_EN, + MSG_SELFTEST_MOTOR_PL, + MSG_SELFTEST_MOTOR_EN, + MSG_SELFTEST_MOTOR_EN +}; + +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 MSG_SELFTEST_NOTCONNECTED_DE[] PROGMEM = "Nicht angeschlossen"; +const char MSG_SELFTEST_NOTCONNECTED_NL[] PROGMEM = "Niet aangesloten"; +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, + MSG_SELFTEST_NOTCONNECTED_DE, + MSG_SELFTEST_NOTCONNECTED_NL +}; + +const char MSG_SELFTEST_OK_EN[] PROGMEM = "Self test OK"; +const char MSG_SELFTEST_OK_IT[] PROGMEM = "Autotest OK"; +const char MSG_SELFTEST_OK_DE[] PROGMEM = "Selbsttest OK"; +const char MSG_SELFTEST_OK_NL[] PROGMEM = "Zelftest OK"; +const char * const MSG_SELFTEST_OK_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_OK_EN, + MSG_SELFTEST_OK_EN, + MSG_SELFTEST_OK_IT, + MSG_SELFTEST_OK_EN, + MSG_SELFTEST_OK_EN, + MSG_SELFTEST_OK_DE, + MSG_SELFTEST_OK_NL +}; + +const char MSG_SELFTEST_PLEASECHECK_EN[] PROGMEM = "Please check :"; +const char MSG_SELFTEST_PLEASECHECK_CZ[] PROGMEM = "Zkontrolujte :"; +const char MSG_SELFTEST_PLEASECHECK_IT[] PROGMEM = "Verificare:"; +const char MSG_SELFTEST_PLEASECHECK_ES[] PROGMEM = "Controla :"; +const char MSG_SELFTEST_PLEASECHECK_PL[] PROGMEM = "Skontroluj :"; +const char MSG_SELFTEST_PLEASECHECK_DE[] PROGMEM = "Bitte pruefe:"; +const char MSG_SELFTEST_PLEASECHECK_NL[] PROGMEM = "Controleer aub:"; +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, + MSG_SELFTEST_PLEASECHECK_DE, + MSG_SELFTEST_PLEASECHECK_NL +}; + +const char MSG_SELFTEST_START_EN[] PROGMEM = "Self test start "; +const char MSG_SELFTEST_START_IT[] PROGMEM = "Avvia autotest"; +const char MSG_SELFTEST_START_ES[] PROGMEM = "Autotest salida"; +const char MSG_SELFTEST_START_DE[] PROGMEM = "Selbsttest start "; +const char MSG_SELFTEST_START_NL[] PROGMEM = "Zelftest start "; +const char * const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SELFTEST_START_EN, + MSG_SELFTEST_START_EN, + MSG_SELFTEST_START_IT, + MSG_SELFTEST_START_ES, + MSG_SELFTEST_START_EN, + MSG_SELFTEST_START_DE, + MSG_SELFTEST_START_NL +}; + +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 conexion"; +const char MSG_SELFTEST_WIRINGERROR_PL[] PROGMEM = "Blad polaczenia"; +const char MSG_SELFTEST_WIRINGERROR_DE[] PROGMEM = "Verdrahtungsfehler"; +const char MSG_SELFTEST_WIRINGERROR_NL[] PROGMEM = "Bedrading fout"; +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, + MSG_SELFTEST_WIRINGERROR_DE, + MSG_SELFTEST_WIRINGERROR_NL +}; + +const char MSG_SERIAL_ERROR_MENU_STRUCTURE_EN[] PROGMEM = "Error in menu structure"; +const char * const MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE[1] PROGMEM = { + MSG_SERIAL_ERROR_MENU_STRUCTURE_EN +}; + +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 = "Configuracion"; +const char MSG_SETTINGS_PL[] PROGMEM = "Ustawienia"; +const char MSG_SETTINGS_DE[] PROGMEM = "Einstellungen"; +const char MSG_SETTINGS_NL[] PROGMEM = "Instellingen"; +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, + MSG_SETTINGS_DE, + MSG_SETTINGS_NL +}; + +const char MSG_SET_HOME_OFFSETS_EN[] PROGMEM = "Set home offsets"; +const char * const MSG_SET_HOME_OFFSETS_LANG_TABLE[1] PROGMEM = { + MSG_SET_HOME_OFFSETS_EN +}; + +const char MSG_SET_ORIGIN_EN[] PROGMEM = "Set origin"; +const char * const MSG_SET_ORIGIN_LANG_TABLE[1] PROGMEM = { + MSG_SET_ORIGIN_EN +}; + +const char MSG_SET_TEMPERATURE_EN[] PROGMEM = "Set temperature:"; +const char MSG_SET_TEMPERATURE_CZ[] PROGMEM = "Nastavte teplotu:"; +const char MSG_SET_TEMPERATURE_IT[] PROGMEM = "Imposta temperatura"; +const char MSG_SET_TEMPERATURE_ES[] PROGMEM = "Establecer temp.:"; +const char MSG_SET_TEMPERATURE_PL[] PROGMEM = "Ustawic temperature"; +const char MSG_SET_TEMPERATURE_DE[] PROGMEM = "Temp.einstellen"; +const char MSG_SET_TEMPERATURE_NL[] PROGMEM = "Temp. instellen"; +const char * const MSG_SET_TEMPERATURE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SET_TEMPERATURE_EN, + MSG_SET_TEMPERATURE_CZ, + MSG_SET_TEMPERATURE_IT, + MSG_SET_TEMPERATURE_ES, + MSG_SET_TEMPERATURE_PL, + MSG_SET_TEMPERATURE_DE, + MSG_SET_TEMPERATURE_NL +}; + +const char MSG_SEVERE_SKEW_EN[] PROGMEM = "Severe skew:"; +const char MSG_SEVERE_SKEW_CZ[] PROGMEM = "Tezke zkoseni:"; +const char MSG_SEVERE_SKEW_IT[] PROGMEM = "Inc. rilevante:"; +const char MSG_SEVERE_SKEW_ES[] PROGMEM = "Inclin. severa:"; +const char MSG_SEVERE_SKEW_PL[] PROGMEM = "Ostre sciecie:"; +const char MSG_SEVERE_SKEW_DE[] PROGMEM = "Schwere Asym.:"; +const char MSG_SEVERE_SKEW_NL[] PROGMEM = "Hevige Asym.:"; +const char * const MSG_SEVERE_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SEVERE_SKEW_EN, + MSG_SEVERE_SKEW_CZ, + MSG_SEVERE_SKEW_IT, + MSG_SEVERE_SKEW_ES, + MSG_SEVERE_SKEW_PL, + MSG_SEVERE_SKEW_DE, + MSG_SEVERE_SKEW_NL +}; + +const char MSG_SHOW_END_STOPS_EN[] PROGMEM = "Show end stops"; +const char MSG_SHOW_END_STOPS_CZ[] PROGMEM = "Stav konc. spin."; +const char MSG_SHOW_END_STOPS_IT[] PROGMEM = "Stato finecorsa"; +const char MSG_SHOW_END_STOPS_ES[] PROGMEM = "Ensena tope final"; +const char MSG_SHOW_END_STOPS_PL[] PROGMEM = "Pokaz krancowki"; +const char MSG_SHOW_END_STOPS_DE[] PROGMEM = "Anzeigen Enschalter"; +const char MSG_SHOW_END_STOPS_NL[] PROGMEM = "Toon endstops"; +const char * const MSG_SHOW_END_STOPS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SHOW_END_STOPS_EN, + MSG_SHOW_END_STOPS_CZ, + MSG_SHOW_END_STOPS_IT, + MSG_SHOW_END_STOPS_ES, + MSG_SHOW_END_STOPS_PL, + MSG_SHOW_END_STOPS_DE, + MSG_SHOW_END_STOPS_NL +}; + +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 = "Mode [forte]"; +const char MSG_SILENT_MODE_OFF_ES[] PROGMEM = "Modo [rend.pleno]"; +const char MSG_SILENT_MODE_OFF_PL[] PROGMEM = "Mod [w wydajnosc]"; +const char MSG_SILENT_MODE_OFF_DE[] PROGMEM = "Mode [Hohe Leist]"; +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, + MSG_SILENT_MODE_OFF_DE, + MSG_SILENT_MODE_OFF_EN +}; + +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 MSG_SILENT_MODE_ON_DE[] PROGMEM = "Mode [leise]"; +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, + MSG_SILENT_MODE_ON_DE, + MSG_SILENT_MODE_ON_EN +}; + +const char MSG_SLIGHT_SKEW_EN[] PROGMEM = "Slight skew:"; +const char MSG_SLIGHT_SKEW_CZ[] PROGMEM = "Lehke zkoseni:"; +const char MSG_SLIGHT_SKEW_IT[] PROGMEM = "Incl. leggera:"; +const char MSG_SLIGHT_SKEW_ES[] PROGMEM = "Inclin. ligera:"; +const char MSG_SLIGHT_SKEW_PL[] PROGMEM = "Lekkie sciecie:"; +const char MSG_SLIGHT_SKEW_DE[] PROGMEM = "Geringe Asym.:"; +const char MSG_SLIGHT_SKEW_NL[] PROGMEM = "Geringe Asym.:"; +const char * const MSG_SLIGHT_SKEW_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_SLIGHT_SKEW_EN, + MSG_SLIGHT_SKEW_CZ, + MSG_SLIGHT_SKEW_IT, + MSG_SLIGHT_SKEW_ES, + MSG_SLIGHT_SKEW_PL, + MSG_SLIGHT_SKEW_DE, + MSG_SLIGHT_SKEW_NL +}; + +const char MSG_SOFTWARE_RESET_EN[] PROGMEM = " Software Reset"; +const char * const MSG_SOFTWARE_RESET_LANG_TABLE[1] PROGMEM = { + MSG_SOFTWARE_RESET_EN +}; + +const char MSG_SPEED_EN[] PROGMEM = "Speed"; +const char MSG_SPEED_CZ[] PROGMEM = "Rychlost"; +const char MSG_SPEED_IT[] PROGMEM = "Velocita"; +const char MSG_SPEED_ES[] PROGMEM = "Velocidad"; +const char MSG_SPEED_PL[] PROGMEM = "Predkosc"; +const char MSG_SPEED_DE[] PROGMEM = "Geschwindigkeit"; +const char MSG_SPEED_NL[] PROGMEM = "Snelheid"; +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, + MSG_SPEED_DE, + MSG_SPEED_NL +}; + +const char MSG_STACK_ERROR_EN[] PROGMEM = "Error - static memory has been overwritten"; +const char * const MSG_STACK_ERROR_LANG_TABLE[1] PROGMEM = { + MSG_STACK_ERROR_EN +}; + +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 MSG_STATISTICS_DE[] PROGMEM = "Statistiken "; +const char MSG_STATISTICS_NL[] PROGMEM = "Statistieken"; +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, + MSG_STATISTICS_DE, + MSG_STATISTICS_NL +}; + +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 usato:"; +const char MSG_STATS_FILAMENTUSED_ES[] PROGMEM = "Filamento : "; +const char MSG_STATS_FILAMENTUSED_PL[] PROGMEM = "Filament : "; +const char MSG_STATS_FILAMENTUSED_DE[] PROGMEM = "Filamentverbrauch:"; +const char MSG_STATS_FILAMENTUSED_NL[] PROGMEM = "Filamentverbruik:"; +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, + MSG_STATS_FILAMENTUSED_DE, + MSG_STATS_FILAMENTUSED_NL +}; + +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 di stampa:"; +const char MSG_STATS_PRINTTIME_ES[] PROGMEM = "Tiempo de imp.:"; +const char MSG_STATS_PRINTTIME_PL[] PROGMEM = "Czas druku : "; +const char MSG_STATS_PRINTTIME_DE[] PROGMEM = "Druckzeit: "; +const char MSG_STATS_PRINTTIME_NL[] PROGMEM = "Printtijd: "; +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, + MSG_STATS_PRINTTIME_DE, + MSG_STATS_PRINTTIME_NL +}; + +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 MSG_STATS_TOTALFILAMENT_DE[] PROGMEM = "Filament Gesamt:"; +const char MSG_STATS_TOTALFILAMENT_NL[] PROGMEM = "Filament total: "; +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, + MSG_STATS_TOTALFILAMENT_DE, + MSG_STATS_TOTALFILAMENT_NL +}; + +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 MSG_STATS_TOTALPRINTTIME_DE[] PROGMEM = "Totale Druckzeit:"; +const char MSG_STATS_TOTALPRINTTIME_NL[] PROGMEM = "Total printtijd:"; +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, + MSG_STATS_TOTALPRINTTIME_DE, + MSG_STATS_TOTALPRINTTIME_NL +}; + +const char MSG_STEPPER_TOO_HIGH_EN[] PROGMEM = "Steprate too high: "; +const char * const MSG_STEPPER_TOO_HIGH_LANG_TABLE[1] PROGMEM = { + MSG_STEPPER_TOO_HIGH_EN +}; + +const char MSG_STOPPED_EN[] PROGMEM = "STOPPED. "; +const char MSG_STOPPED_IT[] PROGMEM = "ARRESTATO."; +const char MSG_STOPPED_ES[] PROGMEM = "PARADA"; +const char MSG_STOPPED_DE[] PROGMEM = "GESTOPPT. "; +const char MSG_STOPPED_NL[] PROGMEM = "GESTOPT. "; +const char * const MSG_STOPPED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_STOPPED_EN, + MSG_STOPPED_EN, + MSG_STOPPED_IT, + MSG_STOPPED_ES, + MSG_STOPPED_EN, + MSG_STOPPED_DE, + MSG_STOPPED_NL +}; + +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 MSG_STOP_PRINT_DE[] PROGMEM = "Druck abbrechen"; +const char MSG_STOP_PRINT_NL[] PROGMEM = "Print stoppen"; +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, + MSG_STOP_PRINT_DE, + MSG_STOP_PRINT_NL +}; + +const char MSG_STORE_EPROM_EN[] PROGMEM = "Store memory"; +const char * const MSG_STORE_EPROM_LANG_TABLE[1] PROGMEM = { + MSG_STORE_EPROM_EN +}; + +const char MSG_SUPPORT_EN[] PROGMEM = "Support"; +const char MSG_SUPPORT_CZ[] PROGMEM = "Podpora"; +const char MSG_SUPPORT_ES[] PROGMEM = "Soporte"; +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_EN, + MSG_SUPPORT_ES, + MSG_SUPPORT_PL, + MSG_SUPPORT_EN, + MSG_SUPPORT_EN +}; + +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_PL[] PROGMEM = "Zapnout zdroj"; +const char MSG_SWITCH_PS_OFF_DE[] PROGMEM = "Netzteil AUS"; +const char MSG_SWITCH_PS_OFF_NL[] PROGMEM = "Uitschakelen"; +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_EN, + MSG_SWITCH_PS_OFF_EN, + MSG_SWITCH_PS_OFF_PL, + MSG_SWITCH_PS_OFF_DE, + MSG_SWITCH_PS_OFF_NL +}; + +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_PL[] PROGMEM = "Vypnout zdroj"; +const char MSG_SWITCH_PS_ON_DE[] PROGMEM = "Netzteil EIN"; +const char MSG_SWITCH_PS_ON_NL[] PROGMEM = "Opstarten"; +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_EN, + MSG_SWITCH_PS_ON_EN, + MSG_SWITCH_PS_ON_PL, + MSG_SWITCH_PS_ON_DE, + MSG_SWITCH_PS_ON_NL +}; + +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 attualizzare"; +const char MSG_TAKE_EFFECT_ES[] PROGMEM = " para aplicar cambios"; +const char MSG_TAKE_EFFECT_PL[] PROGMEM = " wprow. zmian"; +const char MSG_TAKE_EFFECT_DE[] PROGMEM = " um wirksam zu werden"; +const char MSG_TAKE_EFFECT_NL[] PROGMEM = " om effectief te worden"; +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, + MSG_TAKE_EFFECT_DE, + MSG_TAKE_EFFECT_NL +}; + +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 MSG_TEMPERATURE_DE[] PROGMEM = "Temperatur"; +const char MSG_TEMPERATURE_NL[] PROGMEM = "Temperatuur"; +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, + MSG_TEMPERATURE_DE, + MSG_TEMPERATURE_NL +}; + +const char MSG_TEMP_CALIBRATION_EN[] PROGMEM = "PINDA Temp.cal. "; +const char MSG_TEMP_CALIBRATION_CZ[] PROGMEM = "Tepl. kal. "; +const char MSG_TEMP_CALIBRATION_IT[] PROGMEM = "Cal. temp. "; +const char MSG_TEMP_CALIBRATION_ES[] PROGMEM = "Cal. temp. "; +const char MSG_TEMP_CALIBRATION_PL[] PROGMEM = "Ciepl. kal. "; +const char MSG_TEMP_CALIBRATION_DE[] PROGMEM = "PINDA Temp.Kal. "; +const char MSG_TEMP_CALIBRATION_NL[] PROGMEM = "PINDA Temp.kal."; +const char * const MSG_TEMP_CALIBRATION_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TEMP_CALIBRATION_EN, + MSG_TEMP_CALIBRATION_CZ, + MSG_TEMP_CALIBRATION_IT, + MSG_TEMP_CALIBRATION_ES, + MSG_TEMP_CALIBRATION_PL, + MSG_TEMP_CALIBRATION_DE, + MSG_TEMP_CALIBRATION_NL +}; + +const char MSG_TEMP_CALIBRATION_DONE_EN[] PROGMEM = "PINDA temperature calibration is finished. Click to continue."; +const char MSG_TEMP_CALIBRATION_DONE_CZ[] PROGMEM = "Teplotni kalibrace dokoncena. Pokracujte stiskem tlacitka."; +const char MSG_TEMP_CALIBRATION_DONE_IT[] PROGMEM = "Taratura temperatura terminata. Fare click per continuare."; +const char MSG_TEMP_CALIBRATION_DONE_ES[] PROGMEM = "Calibracon temperatura terminada. Presionar para continuar."; +const char MSG_TEMP_CALIBRATION_DONE_PL[] PROGMEM = "Cieplna kalibracja zakonczona. Kontynuuj przyciskiem"; +const char MSG_TEMP_CALIBRATION_DONE_DE[] PROGMEM = "Die PINDA Temperaturkalibrierung ist beendet. Klicke um fortzufahren."; +const char MSG_TEMP_CALIBRATION_DONE_NL[] PROGMEM = "PINDA temperatuur calibratie is klaar. Klik om door te gaan."; +const char * const MSG_TEMP_CALIBRATION_DONE_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TEMP_CALIBRATION_DONE_EN, + MSG_TEMP_CALIBRATION_DONE_CZ, + MSG_TEMP_CALIBRATION_DONE_IT, + MSG_TEMP_CALIBRATION_DONE_ES, + MSG_TEMP_CALIBRATION_DONE_PL, + MSG_TEMP_CALIBRATION_DONE_DE, + MSG_TEMP_CALIBRATION_DONE_NL +}; + +const char MSG_TEMP_CALIBRATION_OFF_EN[] PROGMEM = "PINDA T.cal.[OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_CZ[] PROGMEM = "Tepl. kal. [OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_IT[] PROGMEM = "Cal. temp. [OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_ES[] PROGMEM = "Cal. temp. [OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_PL[] PROGMEM = "Ciepl. kal. [OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_DE[] PROGMEM = "PINDA T.Kal.[OFF]"; +const char MSG_TEMP_CALIBRATION_OFF_NL[] PROGMEM = "PINDA T.kal.[OFF]"; +const char * const MSG_TEMP_CALIBRATION_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TEMP_CALIBRATION_OFF_EN, + MSG_TEMP_CALIBRATION_OFF_CZ, + MSG_TEMP_CALIBRATION_OFF_IT, + MSG_TEMP_CALIBRATION_OFF_ES, + MSG_TEMP_CALIBRATION_OFF_PL, + MSG_TEMP_CALIBRATION_OFF_DE, + MSG_TEMP_CALIBRATION_OFF_NL +}; + +const char MSG_TEMP_CALIBRATION_ON_EN[] PROGMEM = "PINDA T.cal. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_CZ[] PROGMEM = "Tepl. kal. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_IT[] PROGMEM = "Cal. temp. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_ES[] PROGMEM = "Cal. temp. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_PL[] PROGMEM = "Ciepl. kal. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_DE[] PROGMEM = "PINDA T.Kal. [ON]"; +const char MSG_TEMP_CALIBRATION_ON_NL[] PROGMEM = "PINDA T.kal. [ON]"; +const char * const MSG_TEMP_CALIBRATION_ON_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TEMP_CALIBRATION_ON_EN, + MSG_TEMP_CALIBRATION_ON_CZ, + MSG_TEMP_CALIBRATION_ON_IT, + MSG_TEMP_CALIBRATION_ON_ES, + MSG_TEMP_CALIBRATION_ON_PL, + MSG_TEMP_CALIBRATION_ON_DE, + MSG_TEMP_CALIBRATION_ON_NL +}; + +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN[] PROGMEM = "SD card [normal]"; +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_PL[] PROGMEM = "karta SD [normal]"; +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_DE[] PROGMEM = "SD Karte [normal]"; +const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_PL, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_DE, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_EN +}; + +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN[] PROGMEM = "SD card [FlshAir]"; +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_PL[] PROGMEM = "karta SD[FlshAir]"; +const char MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_DE[] PROGMEM = "SD Karte [FlshAir]"; +const char * const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_PL, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_DE, + MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_EN +}; + +const char MSG_TUNE_EN[] PROGMEM = "Tune"; +const char MSG_TUNE_CZ[] PROGMEM = "Ladit"; +const char MSG_TUNE_IT[] PROGMEM = "Regola"; +const char MSG_TUNE_ES[] PROGMEM = "Ajustar"; +const char MSG_TUNE_PL[] PROGMEM = "Nastroic"; +const char MSG_TUNE_DE[] PROGMEM = "Feineinstellung"; +const char MSG_TUNE_NL[] PROGMEM = "Fijninstellingen"; +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, + MSG_TUNE_DE, + MSG_TUNE_NL +}; + +const char MSG_UNKNOWN_COMMAND_EN[] PROGMEM = "Unknown command: \""; +const char * const MSG_UNKNOWN_COMMAND_LANG_TABLE[1] PROGMEM = { + MSG_UNKNOWN_COMMAND_EN +}; + +const char MSG_UNLOADING_FILAMENT_EN[] PROGMEM = "Unloading filament"; +const char MSG_UNLOADING_FILAMENT_CZ[] PROGMEM = "Vysouvam filament"; +const char MSG_UNLOADING_FILAMENT_IT[] PROGMEM = "Rilasc. filamento"; +const char MSG_UNLOADING_FILAMENT_ES[] PROGMEM = "Soltando filamento"; +const char MSG_UNLOADING_FILAMENT_PL[] PROGMEM = "Wysuwam filament"; +const char MSG_UNLOADING_FILAMENT_DE[] PROGMEM = "Filament auswerfen"; +const char MSG_UNLOADING_FILAMENT_NL[] PROGMEM = "Filament uitwerpen"; +const char * const MSG_UNLOADING_FILAMENT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOADING_FILAMENT_EN, + MSG_UNLOADING_FILAMENT_CZ, + MSG_UNLOADING_FILAMENT_IT, + MSG_UNLOADING_FILAMENT_ES, + MSG_UNLOADING_FILAMENT_PL, + MSG_UNLOADING_FILAMENT_DE, + MSG_UNLOADING_FILAMENT_NL +}; + +const char MSG_UNLOAD_ALL_EN[] PROGMEM = "Unload all"; +const char MSG_UNLOAD_ALL_CZ[] PROGMEM = "Vyjmout vse"; +const char MSG_UNLOAD_ALL_IT[] PROGMEM = "Rilasciare tutti"; +const char MSG_UNLOAD_ALL_ES[] PROGMEM = "Soltar todos fil."; +const char MSG_UNLOAD_ALL_PL[] PROGMEM = "Wyjac wszystkie"; +const char MSG_UNLOAD_ALL_DE[] PROGMEM = "Alles entladen"; +const char MSG_UNLOAD_ALL_NL[] PROGMEM = "Alle ontladen"; +const char * const MSG_UNLOAD_ALL_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_ALL_EN, + MSG_UNLOAD_ALL_CZ, + MSG_UNLOAD_ALL_IT, + MSG_UNLOAD_ALL_ES, + MSG_UNLOAD_ALL_PL, + MSG_UNLOAD_ALL_DE, + MSG_UNLOAD_ALL_NL +}; + +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 = "Scarica filamento"; +const char MSG_UNLOAD_FILAMENT_ES[] PROGMEM = "Soltar filamento"; +const char MSG_UNLOAD_FILAMENT_PL[] PROGMEM = "Wyjac filament"; +const char MSG_UNLOAD_FILAMENT_DE[] PROGMEM = "Filament entnehmen"; +const char MSG_UNLOAD_FILAMENT_NL[] PROGMEM = "Filament uithalen"; +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, + MSG_UNLOAD_FILAMENT_DE, + MSG_UNLOAD_FILAMENT_NL +}; + +const char MSG_UNLOAD_FILAMENT_1_EN[] PROGMEM = "Unload filament 1"; +const char MSG_UNLOAD_FILAMENT_1_CZ[] PROGMEM = "Vyjmout filam. 1"; +const char MSG_UNLOAD_FILAMENT_1_IT[] PROGMEM = "Rilasciare fil. 1"; +const char MSG_UNLOAD_FILAMENT_1_ES[] PROGMEM = "Soltar fil. 1"; +const char MSG_UNLOAD_FILAMENT_1_PL[] PROGMEM = "Wyjac filament 1"; +const char MSG_UNLOAD_FILAMENT_1_DE[] PROGMEM = "Filam. 1 entladen"; +const char MSG_UNLOAD_FILAMENT_1_NL[] PROGMEM = "Filam. 1 ontladen"; +const char * const MSG_UNLOAD_FILAMENT_1_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_FILAMENT_1_EN, + MSG_UNLOAD_FILAMENT_1_CZ, + MSG_UNLOAD_FILAMENT_1_IT, + MSG_UNLOAD_FILAMENT_1_ES, + MSG_UNLOAD_FILAMENT_1_PL, + MSG_UNLOAD_FILAMENT_1_DE, + MSG_UNLOAD_FILAMENT_1_NL +}; + +const char MSG_UNLOAD_FILAMENT_2_EN[] PROGMEM = "Unload filament 2"; +const char MSG_UNLOAD_FILAMENT_2_CZ[] PROGMEM = "Vyjmout filam. 2"; +const char MSG_UNLOAD_FILAMENT_2_IT[] PROGMEM = "Rilasciare fil. 1"; +const char MSG_UNLOAD_FILAMENT_2_ES[] PROGMEM = "Soltar fil. 2"; +const char MSG_UNLOAD_FILAMENT_2_PL[] PROGMEM = "Wyjac filament 2"; +const char MSG_UNLOAD_FILAMENT_2_DE[] PROGMEM = "Filam. 2 entladen"; +const char MSG_UNLOAD_FILAMENT_2_NL[] PROGMEM = "Filam. 2 ontladen"; +const char * const MSG_UNLOAD_FILAMENT_2_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_FILAMENT_2_EN, + MSG_UNLOAD_FILAMENT_2_CZ, + MSG_UNLOAD_FILAMENT_2_IT, + MSG_UNLOAD_FILAMENT_2_ES, + MSG_UNLOAD_FILAMENT_2_PL, + MSG_UNLOAD_FILAMENT_2_DE, + MSG_UNLOAD_FILAMENT_2_NL +}; + +const char MSG_UNLOAD_FILAMENT_3_EN[] PROGMEM = "Unload filament 3"; +const char MSG_UNLOAD_FILAMENT_3_CZ[] PROGMEM = "Vyjmout filam. 3"; +const char MSG_UNLOAD_FILAMENT_3_IT[] PROGMEM = "Rilasciare fil. 1"; +const char MSG_UNLOAD_FILAMENT_3_ES[] PROGMEM = "Soltar fil. 3"; +const char MSG_UNLOAD_FILAMENT_3_PL[] PROGMEM = "Wyjac filament 3"; +const char MSG_UNLOAD_FILAMENT_3_DE[] PROGMEM = "Filam. 3 entladen"; +const char MSG_UNLOAD_FILAMENT_3_NL[] PROGMEM = "Filam. 3 ontladen"; +const char * const MSG_UNLOAD_FILAMENT_3_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_FILAMENT_3_EN, + MSG_UNLOAD_FILAMENT_3_CZ, + MSG_UNLOAD_FILAMENT_3_IT, + MSG_UNLOAD_FILAMENT_3_ES, + MSG_UNLOAD_FILAMENT_3_PL, + MSG_UNLOAD_FILAMENT_3_DE, + MSG_UNLOAD_FILAMENT_3_NL +}; + +const char MSG_UNLOAD_FILAMENT_4_EN[] PROGMEM = "Unload filament 4"; +const char MSG_UNLOAD_FILAMENT_4_CZ[] PROGMEM = "Vyjmout filam. 4"; +const char MSG_UNLOAD_FILAMENT_4_IT[] PROGMEM = "Rilasciare fil. 1"; +const char MSG_UNLOAD_FILAMENT_4_ES[] PROGMEM = "Soltar fil. 4"; +const char MSG_UNLOAD_FILAMENT_4_PL[] PROGMEM = "Wyjac filament 4"; +const char MSG_UNLOAD_FILAMENT_4_DE[] PROGMEM = "Filam. 4 entladen"; +const char MSG_UNLOAD_FILAMENT_4_NL[] PROGMEM = "Filam. 4 ontladen"; +const char * const MSG_UNLOAD_FILAMENT_4_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_UNLOAD_FILAMENT_4_EN, + MSG_UNLOAD_FILAMENT_4_CZ, + MSG_UNLOAD_FILAMENT_4_IT, + MSG_UNLOAD_FILAMENT_4_ES, + MSG_UNLOAD_FILAMENT_4_PL, + MSG_UNLOAD_FILAMENT_4_DE, + MSG_UNLOAD_FILAMENT_4_NL +}; + +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 MSG_USB_PRINTING_DE[] PROGMEM = "USB drucken "; +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, + MSG_USB_PRINTING_DE, + MSG_USB_PRINTING_EN +}; + +const char MSG_USED_EN[] PROGMEM = "Used during print"; +const char MSG_USED_CZ[] PROGMEM = "Pouzite behem tisku"; +const char MSG_USED_IT[] PROGMEM = "Usati nella stampa"; +const char MSG_USED_ES[] PROGMEM = "Usado en impresion"; +const char MSG_USED_PL[] PROGMEM = "Uzyte przy druku"; +const char MSG_USED_DE[] PROGMEM = "Benutzt beim Druck"; +const char MSG_USED_NL[] PROGMEM = "Gebruikt bij print"; +const char * const MSG_USED_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_USED_EN, + MSG_USED_CZ, + MSG_USED_IT, + MSG_USED_ES, + MSG_USED_PL, + MSG_USED_DE, + MSG_USED_NL +}; + +const char MSG_USERWAIT_EN[] PROGMEM = "Wait for user..."; +const char MSG_USERWAIT_IT[] PROGMEM = "Attendendo utente"; +const char MSG_USERWAIT_ES[] PROGMEM = "Esperando ordenes"; +const char MSG_USERWAIT_DE[] PROGMEM = "Warte auf Nutzer..."; +const char MSG_USERWAIT_NL[] PROGMEM = "Wachten op gebruiker"; +const char * const MSG_USERWAIT_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_USERWAIT_EN, + MSG_USERWAIT_EN, + MSG_USERWAIT_IT, + MSG_USERWAIT_ES, + MSG_USERWAIT_EN, + MSG_USERWAIT_DE, + MSG_USERWAIT_NL +}; + +const char MSG_VMIN_EN[] PROGMEM = "Vmin"; +const char * const MSG_VMIN_LANG_TABLE[1] PROGMEM = { + MSG_VMIN_EN +}; + +const char MSG_VOLUMETRIC_EN[] PROGMEM = "Filament"; +const char * const MSG_VOLUMETRIC_LANG_TABLE[1] PROGMEM = { + MSG_VOLUMETRIC_EN +}; + +const char MSG_VOLUMETRIC_ENABLED_EN[] PROGMEM = "E in mm3"; +const char * const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[1] PROGMEM = { + MSG_VOLUMETRIC_ENABLED_EN +}; + +const char MSG_VTRAV_MIN_EN[] PROGMEM = "VTrav min"; +const char * const MSG_VTRAV_MIN_LANG_TABLE[1] PROGMEM = { + MSG_VTRAV_MIN_EN +}; + +const char MSG_WAITING_TEMP_EN[] PROGMEM = "Waiting for nozzle and bed cooling"; +const char MSG_WAITING_TEMP_CZ[] PROGMEM = "Cekani na zchladnuti trysky a podlozky."; +const char MSG_WAITING_TEMP_IT[] PROGMEM = "In attesa del raffreddamento della testina e del piatto"; +const char MSG_WAITING_TEMP_ES[] PROGMEM = "Esperando enfriamiento de la cama y del extrusor."; +const char MSG_WAITING_TEMP_PL[] PROGMEM = "Oczekiwanie na wychlodzenie dyszy i podkladki."; +const char MSG_WAITING_TEMP_DE[] PROGMEM = "Warten auf Abkuehlung von Duese und Bett."; +const char MSG_WAITING_TEMP_NL[] PROGMEM = "Wachten op afkoelen van heater en bed."; +const char * const MSG_WAITING_TEMP_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_WAITING_TEMP_EN, + MSG_WAITING_TEMP_CZ, + MSG_WAITING_TEMP_IT, + MSG_WAITING_TEMP_ES, + MSG_WAITING_TEMP_PL, + MSG_WAITING_TEMP_DE, + MSG_WAITING_TEMP_NL +}; + +const char MSG_WATCH_EN[] PROGMEM = "Info screen"; +const char MSG_WATCH_CZ[] PROGMEM = "Informace"; +const char MSG_WATCH_IT[] PROGMEM = "Schermata info"; +const char MSG_WATCH_ES[] PROGMEM = "Monitorizar"; +const char MSG_WATCH_PL[] PROGMEM = "Informacje"; +const char MSG_WATCH_DE[] PROGMEM = "Information"; +const char MSG_WATCH_NL[] PROGMEM = "Info scherm"; +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, + MSG_WATCH_DE, + MSG_WATCH_NL +}; + +const char MSG_WATCHDOG_RESET_EN[] PROGMEM = " Watchdog Reset"; +const char * const MSG_WATCHDOG_RESET_LANG_TABLE[1] PROGMEM = { + MSG_WATCHDOG_RESET_EN +}; + +const char MSG_XYZ_DETAILS_EN[] PROGMEM = "XYZ cal. details"; +const char MSG_XYZ_DETAILS_CZ[] PROGMEM = "Detaily XYZ kal."; +const char MSG_XYZ_DETAILS_IT[] PROGMEM = "XYZ Cal. dettagli"; +const char MSG_XYZ_DETAILS_ES[] PROGMEM = "Inform. XYZ cal."; +const char MSG_XYZ_DETAILS_PL[] PROGMEM = "Szczegoly kal.XYZ"; +const char MSG_XYZ_DETAILS_DE[] PROGMEM = "XYZ Kal. Details"; +const char MSG_XYZ_DETAILS_NL[] PROGMEM = "XYZ kal. details"; +const char * const MSG_XYZ_DETAILS_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_XYZ_DETAILS_EN, + MSG_XYZ_DETAILS_CZ, + MSG_XYZ_DETAILS_IT, + MSG_XYZ_DETAILS_ES, + MSG_XYZ_DETAILS_PL, + MSG_XYZ_DETAILS_DE, + MSG_XYZ_DETAILS_NL +}; + +const char MSG_X_MAX_EN[] PROGMEM = "x_max: "; +const char * const MSG_X_MAX_LANG_TABLE[1] PROGMEM = { + MSG_X_MAX_EN +}; + +const char MSG_X_MIN_EN[] PROGMEM = "x_min: "; +const char * const MSG_X_MIN_LANG_TABLE[1] PROGMEM = { + MSG_X_MIN_EN +}; + +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 MSG_YES_DE[] PROGMEM = "Ja"; +const char MSG_YES_NL[] PROGMEM = "Ja"; +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, + MSG_YES_DE, + MSG_YES_NL +}; + +const char MSG_Y_DISTANCE_FROM_MIN_EN[] PROGMEM = "Y distance from min:"; +const char MSG_Y_DISTANCE_FROM_MIN_CZ[] PROGMEM = "Y vzdalenost od min:"; +const char MSG_Y_DISTANCE_FROM_MIN_IT[] PROGMEM = "Distanza Y da min:"; +const char MSG_Y_DISTANCE_FROM_MIN_ES[] PROGMEM = "Dist. Y desde min:"; +const char MSG_Y_DISTANCE_FROM_MIN_PL[] PROGMEM = "Odleglosc Y od min.:"; +const char MSG_Y_DISTANCE_FROM_MIN_DE[] PROGMEM = "Y Entfernung von min"; +const char MSG_Y_DISTANCE_FROM_MIN_NL[] PROGMEM = "Y afstand van min"; +const char * const MSG_Y_DISTANCE_FROM_MIN_LANG_TABLE[LANG_NUM] PROGMEM = { + MSG_Y_DISTANCE_FROM_MIN_EN, + MSG_Y_DISTANCE_FROM_MIN_CZ, + MSG_Y_DISTANCE_FROM_MIN_IT, + MSG_Y_DISTANCE_FROM_MIN_ES, + MSG_Y_DISTANCE_FROM_MIN_PL, + MSG_Y_DISTANCE_FROM_MIN_DE, + MSG_Y_DISTANCE_FROM_MIN_NL +}; + +const char MSG_Y_MAX_EN[] PROGMEM = "y_max: "; +const char * const MSG_Y_MAX_LANG_TABLE[1] PROGMEM = { + MSG_Y_MAX_EN +}; + +const char MSG_Y_MIN_EN[] PROGMEM = "y_min: "; +const char * const MSG_Y_MIN_LANG_TABLE[1] PROGMEM = { + MSG_Y_MIN_EN +}; + +const char MSG_ZPROBE_OUT_EN[] PROGMEM = "Z probe out. bed"; +const char * const MSG_ZPROBE_OUT_LANG_TABLE[1] PROGMEM = { + MSG_ZPROBE_OUT_EN +}; + +const char MSG_ZPROBE_ZOFFSET_EN[] PROGMEM = "Z Offset"; +const char * const MSG_ZPROBE_ZOFFSET_LANG_TABLE[1] PROGMEM = { + MSG_ZPROBE_ZOFFSET_EN +}; + +const char MSG_Z_MAX_EN[] PROGMEM = "z_max: "; +const char * const MSG_Z_MAX_LANG_TABLE[1] PROGMEM = { + MSG_Z_MAX_EN +}; + +const char MSG_Z_MIN_EN[] PROGMEM = "z_min: "; +const char * const MSG_Z_MIN_LANG_TABLE[1] PROGMEM = { + MSG_Z_MIN_EN +}; + +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 " pronta."; +const char WELCOME_MSG_ES[] PROGMEM = CUSTOM_MENDEL_NAME " prep."; +const char WELCOME_MSG_PL[] PROGMEM = CUSTOM_MENDEL_NAME " gotowa"; +const char WELCOME_MSG_DE[] PROGMEM = CUSTOM_MENDEL_NAME " bereit."; +const char WELCOME_MSG_NL[] PROGMEM = CUSTOM_MENDEL_NAME " gereed."; +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, + WELCOME_MSG_DE, + WELCOME_MSG_NL +}; + + +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 2d804e668..82628e637 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -1,668 +1,668 @@ -#ifndef LANGUAGE_ALL_H -#define LANGUAGE_ALL_H - -#include -// Language indices into their particular symbol tables. -#define LANG_ID_EN 0 -#define LANG_ID_CZ 1 -#define LANG_ID_IT 2 -#define LANG_ID_ES 3 -#define LANG_ID_PL 4 -#define LANG_ID_DE 5 -#define LANG_ID_NL 6 -// Language is not defined and it shall be selected from the menu. -#define LANG_ID_FORCE_SELECTION 254 -// Language is not defined on a virgin RAMBo board. -#define LANG_ID_UNDEFINED 255 - -// Default language ID, if no language is selected. -#define LANG_ID_DEFAULT LANG_ID_EN - -// Number of languages available in the language table. -#define LANG_NUM 7 - -// Currectly active language selection. -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_ACTIVE_EXTRUDER_LANG_TABLE[1]; -#define MSG_ACTIVE_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_ACTIVE_EXTRUDER_LANG_TABLE, 0) -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_ALL_LANG_TABLE[LANG_NUM]; -#define MSG_ALL LANG_TABLE_SELECT(MSG_ALL_LANG_TABLE) -extern const char* const MSG_AMAX_LANG_TABLE[1]; -#define MSG_AMAX LANG_TABLE_SELECT_EXPLICIT(MSG_AMAX_LANG_TABLE, 0) -extern const char* const MSG_AUTHOR_LANG_TABLE[1]; -#define MSG_AUTHOR LANG_TABLE_SELECT_EXPLICIT(MSG_AUTHOR_LANG_TABLE, 0) -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[1]; -#define MSG_A_RETRACT LANG_TABLE_SELECT_EXPLICIT(MSG_A_RETRACT_LANG_TABLE, 0) -extern const char* const MSG_BABYSTEPPING_X_LANG_TABLE[1]; -#define MSG_BABYSTEPPING_X LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_X_LANG_TABLE, 0) -extern const char* const MSG_BABYSTEPPING_Y_LANG_TABLE[1]; -#define MSG_BABYSTEPPING_Y LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_Y_LANG_TABLE, 0) -extern const char* const MSG_BABYSTEPPING_Z_LANG_TABLE[1]; -#define MSG_BABYSTEPPING_Z LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_Z_LANG_TABLE, 0) -extern const char* const MSG_BABYSTEP_X_LANG_TABLE[1]; -#define MSG_BABYSTEP_X LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEP_X_LANG_TABLE, 0) -extern const char* const MSG_BABYSTEP_Y_LANG_TABLE[1]; -#define MSG_BABYSTEP_Y LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEP_Y_LANG_TABLE, 0) -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_BABYSTEP_Z_NOT_SET_LANG_TABLE[LANG_NUM]; -#define MSG_BABYSTEP_Z_NOT_SET LANG_TABLE_SELECT(MSG_BABYSTEP_Z_NOT_SET_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_CORRECTION_FRONT_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_FRONT LANG_TABLE_SELECT(MSG_BED_CORRECTION_FRONT_LANG_TABLE) -extern const char* const MSG_BED_CORRECTION_LEFT_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_LEFT LANG_TABLE_SELECT(MSG_BED_CORRECTION_LEFT_LANG_TABLE) -extern const char* const MSG_BED_CORRECTION_MENU_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_MENU LANG_TABLE_SELECT(MSG_BED_CORRECTION_MENU_LANG_TABLE) -extern const char* const MSG_BED_CORRECTION_REAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_REAR LANG_TABLE_SELECT(MSG_BED_CORRECTION_REAR_LANG_TABLE) -extern const char* const MSG_BED_CORRECTION_RESET_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_RESET LANG_TABLE_SELECT(MSG_BED_CORRECTION_RESET_LANG_TABLE) -extern const char* const MSG_BED_CORRECTION_RIGHT_LANG_TABLE[LANG_NUM]; -#define MSG_BED_CORRECTION_RIGHT LANG_TABLE_SELECT(MSG_BED_CORRECTION_RIGHT_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_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE[LANG_NUM]; -#define MSG_BED_LEVELING_FAILED_POINT_HIGH LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE) -extern const char* const MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE[LANG_NUM]; -#define MSG_BED_LEVELING_FAILED_POINT_LOW LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE) -extern const char* const MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE[LANG_NUM]; -#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE) -extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM]; -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE) -extern const char* const MSG_BEGIN_FILE_LIST_LANG_TABLE[1]; -#define MSG_BEGIN_FILE_LIST LANG_TABLE_SELECT_EXPLICIT(MSG_BEGIN_FILE_LIST_LANG_TABLE, 0) -extern const char* const MSG_BROWNOUT_RESET_LANG_TABLE[1]; -#define MSG_BROWNOUT_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_BROWNOUT_RESET_LANG_TABLE, 0) -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_CALIBRATE_E_LANG_TABLE[LANG_NUM]; -#define MSG_CALIBRATE_E LANG_TABLE_SELECT(MSG_CALIBRATE_E_LANG_TABLE) -extern const char* const MSG_CALIBRATE_PINDA_LANG_TABLE[LANG_NUM]; -#define MSG_CALIBRATE_PINDA LANG_TABLE_SELECT(MSG_CALIBRATE_PINDA_LANG_TABLE) -extern const char* const MSG_CALIBRATION_PINDA_MENU_LANG_TABLE[LANG_NUM]; -#define MSG_CALIBRATION_PINDA_MENU LANG_TABLE_SELECT(MSG_CALIBRATION_PINDA_MENU_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_CENTER_LANG_TABLE[LANG_NUM]; -#define MSG_CENTER LANG_TABLE_SELECT(MSG_CENTER_LANG_TABLE) -extern const char* const MSG_CHANGE_EXTR_LANG_TABLE[LANG_NUM]; -#define MSG_CHANGE_EXTR LANG_TABLE_SELECT(MSG_CHANGE_EXTR_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_CHOOSE_EXTRUDER_LANG_TABLE[LANG_NUM]; -#define MSG_CHOOSE_EXTRUDER LANG_TABLE_SELECT(MSG_CHOOSE_EXTRUDER_LANG_TABLE) -extern const char* const MSG_CLEAN_NOZZLE_E_LANG_TABLE[LANG_NUM]; -#define MSG_CLEAN_NOZZLE_E LANG_TABLE_SELECT(MSG_CLEAN_NOZZLE_E_LANG_TABLE) -extern const char* const MSG_CNG_SDCARD_LANG_TABLE[1]; -#define MSG_CNG_SDCARD LANG_TABLE_SELECT_EXPLICIT(MSG_CNG_SDCARD_LANG_TABLE, 0) -extern const char* const MSG_CONFIGURATION_VER_LANG_TABLE[1]; -#define MSG_CONFIGURATION_VER LANG_TABLE_SELECT_EXPLICIT(MSG_CONFIGURATION_VER_LANG_TABLE, 0) -extern const char* const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE[LANG_NUM]; -#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP LANG_TABLE_SELECT(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE) -extern const char* const MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE[LANG_NUM]; -#define MSG_CONFIRM_NOZZLE_CLEAN LANG_TABLE_SELECT(MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE) -extern const char* const MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE[LANG_NUM]; -#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ LANG_TABLE_SELECT(MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE) -extern const char* const MSG_CONTROL_LANG_TABLE[1]; -#define MSG_CONTROL LANG_TABLE_SELECT_EXPLICIT(MSG_CONTROL_LANG_TABLE, 0) -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[1]; -#define MSG_COUNT_X LANG_TABLE_SELECT_EXPLICIT(MSG_COUNT_X_LANG_TABLE, 0) -extern const char* const MSG_CURRENT_LANG_TABLE[LANG_NUM]; -#define MSG_CURRENT LANG_TABLE_SELECT(MSG_CURRENT_LANG_TABLE) -extern const char* const MSG_DATE_LANG_TABLE[LANG_NUM]; -#define MSG_DATE LANG_TABLE_SELECT(MSG_DATE_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_ENDSTOPS_HIT_LANG_TABLE[1]; -#define MSG_ENDSTOPS_HIT LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOPS_HIT_LANG_TABLE, 0) -extern const char* const MSG_ENDSTOP_HIT_LANG_TABLE[1]; -#define MSG_ENDSTOP_HIT LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOP_HIT_LANG_TABLE, 0) -extern const char* const MSG_ENDSTOP_OPEN_LANG_TABLE[1]; -#define MSG_ENDSTOP_OPEN LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOP_OPEN_LANG_TABLE, 0) -extern const char* const MSG_END_FILE_LIST_LANG_TABLE[1]; -#define MSG_END_FILE_LIST LANG_TABLE_SELECT_EXPLICIT(MSG_END_FILE_LIST_LANG_TABLE, 0) -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[1]; -#define MSG_ERR_CHECKSUM_MISMATCH LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE, 0) -extern const char* const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[1]; -#define MSG_ERR_COLD_EXTRUDE_STOP LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE, 0) -extern const char* const MSG_ERR_KILLED_LANG_TABLE[1]; -#define MSG_ERR_KILLED LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_KILLED_LANG_TABLE, 0) -extern const char* const MSG_ERR_LINE_NO_LANG_TABLE[1]; -#define MSG_ERR_LINE_NO LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_LINE_NO_LANG_TABLE, 0) -extern const char* const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[1]; -#define MSG_ERR_LONG_EXTRUDE_STOP LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE, 0) -extern const char* const MSG_ERR_NO_CHECKSUM_LANG_TABLE[1]; -#define MSG_ERR_NO_CHECKSUM LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_CHECKSUM_LANG_TABLE, 0) -extern const char* const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[1]; -#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE, 0) -extern const char* const MSG_ERR_NO_THERMISTORS_LANG_TABLE[1]; -#define MSG_ERR_NO_THERMISTORS LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_THERMISTORS_LANG_TABLE, 0) -extern const char* const MSG_ERR_STOPPED_LANG_TABLE[1]; -#define MSG_ERR_STOPPED LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_STOPPED_LANG_TABLE, 0) -extern const char* const MSG_EXTERNAL_RESET_LANG_TABLE[1]; -#define MSG_EXTERNAL_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_EXTERNAL_RESET_LANG_TABLE, 0) -extern const char* const MSG_EXTRUDER_LANG_TABLE[LANG_NUM]; -#define MSG_EXTRUDER LANG_TABLE_SELECT(MSG_EXTRUDER_LANG_TABLE) -extern const char* const MSG_EXTRUDER_1_LANG_TABLE[LANG_NUM]; -#define MSG_EXTRUDER_1 LANG_TABLE_SELECT(MSG_EXTRUDER_1_LANG_TABLE) -extern const char* const MSG_EXTRUDER_2_LANG_TABLE[LANG_NUM]; -#define MSG_EXTRUDER_2 LANG_TABLE_SELECT(MSG_EXTRUDER_2_LANG_TABLE) -extern const char* const MSG_EXTRUDER_3_LANG_TABLE[LANG_NUM]; -#define MSG_EXTRUDER_3 LANG_TABLE_SELECT(MSG_EXTRUDER_3_LANG_TABLE) -extern const char* const MSG_EXTRUDER_4_LANG_TABLE[LANG_NUM]; -#define MSG_EXTRUDER_4 LANG_TABLE_SELECT(MSG_EXTRUDER_4_LANG_TABLE) -extern const char* const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM]; -#define MSG_E_CAL_KNOB LANG_TABLE_SELECT(MSG_E_CAL_KNOB_LANG_TABLE) -extern const char* const MSG_Enqueing_LANG_TABLE[1]; -#define MSG_Enqueing LANG_TABLE_SELECT_EXPLICIT(MSG_Enqueing_LANG_TABLE, 0) -extern const char* const MSG_FACTOR_LANG_TABLE[1]; -#define MSG_FACTOR LANG_TABLE_SELECT_EXPLICIT(MSG_FACTOR_LANG_TABLE, 0) -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_FARM_CARD_MENU_LANG_TABLE[1]; -#define MSG_FARM_CARD_MENU LANG_TABLE_SELECT_EXPLICIT(MSG_FARM_CARD_MENU_LANG_TABLE, 0) -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_CLEAN_LANG_TABLE[LANG_NUM]; -#define MSG_FILAMENT_CLEAN LANG_TABLE_SELECT(MSG_FILAMENT_CLEAN_LANG_TABLE) -extern const char* const MSG_FILAMENT_LOADING_T0_LANG_TABLE[LANG_NUM]; -#define MSG_FILAMENT_LOADING_T0 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T0_LANG_TABLE) -extern const char* const MSG_FILAMENT_LOADING_T1_LANG_TABLE[LANG_NUM]; -#define MSG_FILAMENT_LOADING_T1 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T1_LANG_TABLE) -extern const char* const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM]; -#define MSG_FILAMENT_LOADING_T2 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T2_LANG_TABLE) -extern const char* const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM]; -#define MSG_FILAMENT_LOADING_T3 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T3_LANG_TABLE) -extern const char* const MSG_FILE_PRINTED_LANG_TABLE[1]; -#define MSG_FILE_PRINTED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_PRINTED_LANG_TABLE, 0) -extern const char* const MSG_FILE_SAVED_LANG_TABLE[1]; -#define MSG_FILE_SAVED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_SAVED_LANG_TABLE, 0) -extern const char* const MSG_FIL_ADJUSTING_LANG_TABLE[LANG_NUM]; -#define MSG_FIL_ADJUSTING LANG_TABLE_SELECT(MSG_FIL_ADJUSTING_LANG_TABLE) -extern const char* const MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_LANG_TABLE[LANG_NUM]; -#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION LANG_TABLE_SELECT(MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_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_FINISHING_MOVEMENTS_LANG_TABLE[LANG_NUM]; -#define MSG_FINISHING_MOVEMENTS LANG_TABLE_SELECT(MSG_FINISHING_MOVEMENTS_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[1]; -#define MSG_FLOW0 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW0_LANG_TABLE, 0) -extern const char* const MSG_FLOW1_LANG_TABLE[1]; -#define MSG_FLOW1 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW1_LANG_TABLE, 0) -extern const char* const MSG_FLOW2_LANG_TABLE[1]; -#define MSG_FLOW2 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW2_LANG_TABLE, 0) -extern const char* const MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE[LANG_NUM]; -#define MSG_FOLLOW_CALIBRATION_FLOW LANG_TABLE_SELECT(MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE) -extern const char* const MSG_FREE_MEMORY_LANG_TABLE[1]; -#define MSG_FREE_MEMORY LANG_TABLE_SELECT_EXPLICIT(MSG_FREE_MEMORY_LANG_TABLE, 0) -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[1]; -#define MSG_HOTEND_OFFSET LANG_TABLE_SELECT_EXPLICIT(MSG_HOTEND_OFFSET_LANG_TABLE, 0) -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_INIT_SDCARD_LANG_TABLE[1]; -#define MSG_INIT_SDCARD LANG_TABLE_SELECT_EXPLICIT(MSG_INIT_SDCARD_LANG_TABLE, 0) -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[1]; -#define MSG_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_INVALID_EXTRUDER_LANG_TABLE, 0) -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_LEFT_LANG_TABLE[LANG_NUM]; -#define MSG_LEFT LANG_TABLE_SELECT(MSG_LEFT_LANG_TABLE) -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_ALL_LANG_TABLE[LANG_NUM]; -#define MSG_LOAD_ALL LANG_TABLE_SELECT(MSG_LOAD_ALL_LANG_TABLE) -extern const char* const MSG_LOAD_EPROM_LANG_TABLE[1]; -#define MSG_LOAD_EPROM LANG_TABLE_SELECT_EXPLICIT(MSG_LOAD_EPROM_LANG_TABLE, 0) -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_LOAD_FILAMENT_1_LANG_TABLE[LANG_NUM]; -#define MSG_LOAD_FILAMENT_1 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_1_LANG_TABLE) -extern const char* const MSG_LOAD_FILAMENT_2_LANG_TABLE[LANG_NUM]; -#define MSG_LOAD_FILAMENT_2 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_2_LANG_TABLE) -extern const char* const MSG_LOAD_FILAMENT_3_LANG_TABLE[LANG_NUM]; -#define MSG_LOAD_FILAMENT_3 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_3_LANG_TABLE) -extern const char* const MSG_LOAD_FILAMENT_4_LANG_TABLE[LANG_NUM]; -#define MSG_LOAD_FILAMENT_4 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_4_LANG_TABLE) -extern const char* const MSG_LOOSE_PULLEY_LANG_TABLE[LANG_NUM]; -#define MSG_LOOSE_PULLEY LANG_TABLE_SELECT(MSG_LOOSE_PULLEY_LANG_TABLE) -extern const char* const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M104_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M104_INVALID_EXTRUDER_LANG_TABLE, 0) -extern const char* const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M105_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M105_INVALID_EXTRUDER_LANG_TABLE, 0) -extern const char* const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M109_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M109_INVALID_EXTRUDER_LANG_TABLE, 0) -extern const char* const MSG_M115_REPORT_LANG_TABLE[1]; -#define MSG_M115_REPORT LANG_TABLE_SELECT_EXPLICIT(MSG_M115_REPORT_LANG_TABLE, 0) -extern const char* const MSG_M119_REPORT_LANG_TABLE[1]; -#define MSG_M119_REPORT LANG_TABLE_SELECT_EXPLICIT(MSG_M119_REPORT_LANG_TABLE, 0) -extern const char* const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M200_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M200_INVALID_EXTRUDER_LANG_TABLE, 0) -extern const char* const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M218_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M218_INVALID_EXTRUDER_LANG_TABLE, 0) -extern const char* const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[1]; -#define MSG_M221_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M221_INVALID_EXTRUDER_LANG_TABLE, 0) -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_MARK_FIL_LANG_TABLE[LANG_NUM]; -#define MSG_MARK_FIL LANG_TABLE_SELECT(MSG_MARK_FIL_LANG_TABLE) -extern const char* const MSG_MAX_LANG_TABLE[1]; -#define MSG_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_MAX_LANG_TABLE, 0) -extern const char* const MSG_MEASURED_SKEW_LANG_TABLE[LANG_NUM]; -#define MSG_MEASURED_SKEW LANG_TABLE_SELECT(MSG_MEASURED_SKEW_LANG_TABLE) -extern const char* const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE[LANG_NUM]; -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 LANG_TABLE_SELECT(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE) -extern const char* const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE[LANG_NUM]; -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 LANG_TABLE_SELECT(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE) -extern const char* const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM]; -#define MSG_MENU_CALIBRATION LANG_TABLE_SELECT(MSG_MENU_CALIBRATION_LANG_TABLE) -extern const char* const MSG_MESH_BED_LEVELING_LANG_TABLE[LANG_NUM]; -#define MSG_MESH_BED_LEVELING LANG_TABLE_SELECT(MSG_MESH_BED_LEVELING_LANG_TABLE) -extern const char* const MSG_MIN_LANG_TABLE[1]; -#define MSG_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_MIN_LANG_TABLE, 0) -extern const char* const MSG_MOTION_LANG_TABLE[1]; -#define MSG_MOTION LANG_TABLE_SELECT_EXPLICIT(MSG_MOTION_LANG_TABLE, 0) -extern const char* const MSG_MOVE_01MM_LANG_TABLE[1]; -#define MSG_MOVE_01MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_01MM_LANG_TABLE, 0) -extern const char* const MSG_MOVE_10MM_LANG_TABLE[1]; -#define MSG_MOVE_10MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_10MM_LANG_TABLE, 0) -extern const char* const MSG_MOVE_1MM_LANG_TABLE[1]; -#define MSG_MOVE_1MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_1MM_LANG_TABLE, 0) -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_LANG_TABLE[LANG_NUM]; -#define MSG_MOVE_CARRIAGE_TO_THE_TOP LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LANG_TABLE) -extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_LANG_TABLE[LANG_NUM]; -#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_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_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_NEW_FIRMWARE_AVAILABLE_LANG_TABLE[LANG_NUM]; -#define MSG_NEW_FIRMWARE_AVAILABLE LANG_TABLE_SELECT(MSG_NEW_FIRMWARE_AVAILABLE_LANG_TABLE) -extern const char* const MSG_NEW_FIRMWARE_PLEASE_UPGRADE_LANG_TABLE[LANG_NUM]; -#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE LANG_TABLE_SELECT(MSG_NEW_FIRMWARE_PLEASE_UPGRADE_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[1]; -#define MSG_NOZZLE1 LANG_TABLE_SELECT_EXPLICIT(MSG_NOZZLE1_LANG_TABLE, 0) -extern const char* const MSG_NOZZLE2_LANG_TABLE[1]; -#define MSG_NOZZLE2 LANG_TABLE_SELECT_EXPLICIT(MSG_NOZZLE2_LANG_TABLE, 0) -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[1]; -#define MSG_OFF LANG_TABLE_SELECT_EXPLICIT(MSG_OFF_LANG_TABLE, 0) -extern const char* const MSG_OK_LANG_TABLE[1]; -#define MSG_OK LANG_TABLE_SELECT_EXPLICIT(MSG_OK_LANG_TABLE, 0) -extern const char* const MSG_ON_LANG_TABLE[1]; -#define MSG_ON LANG_TABLE_SELECT_EXPLICIT(MSG_ON_LANG_TABLE, 0) -extern const char* const MSG_PAPER_LANG_TABLE[LANG_NUM]; -#define MSG_PAPER LANG_TABLE_SELECT(MSG_PAPER_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_BED_LANG_TABLE[LANG_NUM]; -#define MSG_PID_BED LANG_TABLE_SELECT(MSG_PID_BED_LANG_TABLE) -extern const char* const MSG_PID_BED_FINISHED_LANG_TABLE[LANG_NUM]; -#define MSG_PID_BED_FINISHED LANG_TABLE_SELECT(MSG_PID_BED_FINISHED_LANG_TABLE) -extern const char* const MSG_PID_BED_RUNNING_LANG_TABLE[LANG_NUM]; -#define MSG_PID_BED_RUNNING LANG_TABLE_SELECT(MSG_PID_BED_RUNNING_LANG_TABLE) -extern const char* const MSG_PID_EXTRUDER_LANG_TABLE[LANG_NUM]; -#define MSG_PID_EXTRUDER LANG_TABLE_SELECT(MSG_PID_EXTRUDER_LANG_TABLE) -extern const char* const MSG_PID_FINISHED_LANG_TABLE[LANG_NUM]; -#define MSG_PID_FINISHED LANG_TABLE_SELECT(MSG_PID_FINISHED_LANG_TABLE) -extern const char* const MSG_PID_RUNNING_LANG_TABLE[LANG_NUM]; -#define MSG_PID_RUNNING LANG_TABLE_SELECT(MSG_PID_RUNNING_LANG_TABLE) -extern const char* const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[LANG_NUM]; -#define MSG_PINDA_NOT_CALIBRATED LANG_TABLE_SELECT(MSG_PINDA_NOT_CALIBRATED_LANG_TABLE) -extern const char* const MSG_PINDA_PREHEAT_LANG_TABLE[LANG_NUM]; -#define MSG_PINDA_PREHEAT LANG_TABLE_SELECT(MSG_PINDA_PREHEAT_LANG_TABLE) -extern const char* const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1]; -#define MSG_PLANNER_BUFFER_BYTES LANG_TABLE_SELECT_EXPLICIT(MSG_PLANNER_BUFFER_BYTES_LANG_TABLE, 0) -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[1]; -#define MSG_POSITION_UNKNOWN LANG_TABLE_SELECT_EXPLICIT(MSG_POSITION_UNKNOWN_LANG_TABLE, 0) -extern const char* const MSG_POWERUP_LANG_TABLE[1]; -#define MSG_POWERUP LANG_TABLE_SELECT_EXPLICIT(MSG_POWERUP_LANG_TABLE, 0) -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_NOZZLE_LANG_TABLE[LANG_NUM]; -#define MSG_PREHEAT_NOZZLE LANG_TABLE_SELECT(MSG_PREHEAT_NOZZLE_LANG_TABLE) -extern const char* const MSG_PREPARE_FILAMENT_LANG_TABLE[LANG_NUM]; -#define MSG_PREPARE_FILAMENT LANG_TABLE_SELECT(MSG_PREPARE_FILAMENT_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_PRINTER_DISCONNECTED_LANG_TABLE[LANG_NUM]; -#define MSG_PRINTER_DISCONNECTED LANG_TABLE_SELECT(MSG_PRINTER_DISCONNECTED_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_PRINT_PAUSED_LANG_TABLE[LANG_NUM]; -#define MSG_PRINT_PAUSED LANG_TABLE_SELECT(MSG_PRINT_PAUSED_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[1]; -#define MSG_RECTRACT LANG_TABLE_SELECT_EXPLICIT(MSG_RECTRACT_LANG_TABLE, 0) -extern const char* const MSG_REFRESH_LANG_TABLE[1]; -#define MSG_REFRESH LANG_TABLE_SELECT_EXPLICIT(MSG_REFRESH_LANG_TABLE, 0) -extern const char* const MSG_RESEND_LANG_TABLE[1]; -#define MSG_RESEND LANG_TABLE_SELECT_EXPLICIT(MSG_RESEND_LANG_TABLE, 0) -extern const char* const MSG_RESET_CALIBRATE_E_LANG_TABLE[1]; -#define MSG_RESET_CALIBRATE_E LANG_TABLE_SELECT_EXPLICIT(MSG_RESET_CALIBRATE_E_LANG_TABLE, 0) -extern const char* const MSG_RESTORE_FAILSAFE_LANG_TABLE[1]; -#define MSG_RESTORE_FAILSAFE LANG_TABLE_SELECT_EXPLICIT(MSG_RESTORE_FAILSAFE_LANG_TABLE, 0) -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_RESUMING_PRINT_LANG_TABLE[LANG_NUM]; -#define MSG_RESUMING_PRINT LANG_TABLE_SELECT(MSG_RESUMING_PRINT_LANG_TABLE) -extern const char* const MSG_RIGHT_LANG_TABLE[LANG_NUM]; -#define MSG_RIGHT LANG_TABLE_SELECT(MSG_RIGHT_LANG_TABLE) -extern const char* const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[1]; -#define MSG_SD_CANT_ENTER_SUBDIR LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE, 0) -extern const char* const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[1]; -#define MSG_SD_CANT_OPEN_SUBDIR LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE, 0) -extern const char* const MSG_SD_CARD_OK_LANG_TABLE[1]; -#define MSG_SD_CARD_OK LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CARD_OK_LANG_TABLE, 0) -extern const char* const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[1]; -#define MSG_SD_ERR_WRITE_TO_FILE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE, 0) -extern const char* const MSG_SD_FILE_OPENED_LANG_TABLE[1]; -#define MSG_SD_FILE_OPENED LANG_TABLE_SELECT_EXPLICIT(MSG_SD_FILE_OPENED_LANG_TABLE, 0) -extern const char* const MSG_SD_FILE_SELECTED_LANG_TABLE[1]; -#define MSG_SD_FILE_SELECTED LANG_TABLE_SELECT_EXPLICIT(MSG_SD_FILE_SELECTED_LANG_TABLE, 0) -extern const char* const MSG_SD_INIT_FAIL_LANG_TABLE[1]; -#define MSG_SD_INIT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_INIT_FAIL_LANG_TABLE, 0) -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[1]; -#define MSG_SD_NOT_PRINTING LANG_TABLE_SELECT_EXPLICIT(MSG_SD_NOT_PRINTING_LANG_TABLE, 0) -extern const char* const MSG_SD_OPENROOT_FAIL_LANG_TABLE[1]; -#define MSG_SD_OPENROOT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_OPENROOT_FAIL_LANG_TABLE, 0) -extern const char* const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[1]; -#define MSG_SD_OPEN_FILE_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_OPEN_FILE_FAIL_LANG_TABLE, 0) -extern const char* const MSG_SD_PRINTING_BYTE_LANG_TABLE[1]; -#define MSG_SD_PRINTING_BYTE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_PRINTING_BYTE_LANG_TABLE, 0) -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[1]; -#define MSG_SD_SIZE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_SIZE_LANG_TABLE, 0) -extern const char* const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[1]; -#define MSG_SD_VOL_INIT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_VOL_INIT_FAIL_LANG_TABLE, 0) -extern const char* const MSG_SD_WORKDIR_FAIL_LANG_TABLE[1]; -#define MSG_SD_WORKDIR_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_WORKDIR_FAIL_LANG_TABLE, 0) -extern const char* const MSG_SD_WRITE_TO_FILE_LANG_TABLE[1]; -#define MSG_SD_WRITE_TO_FILE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_WRITE_TO_FILE_LANG_TABLE, 0) -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_COOLING_FAN_LANG_TABLE[LANG_NUM]; -#define MSG_SELFTEST_COOLING_FAN LANG_TABLE_SELECT(MSG_SELFTEST_COOLING_FAN_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_EXTRUDER_FAN_LANG_TABLE[LANG_NUM]; -#define MSG_SELFTEST_EXTRUDER_FAN LANG_TABLE_SELECT(MSG_SELFTEST_EXTRUDER_FAN_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_FAN_LANG_TABLE[LANG_NUM]; -#define MSG_SELFTEST_FAN LANG_TABLE_SELECT(MSG_SELFTEST_FAN_LANG_TABLE) -extern const char* const MSG_SELFTEST_FAN_NO_LANG_TABLE[LANG_NUM]; -#define MSG_SELFTEST_FAN_NO LANG_TABLE_SELECT(MSG_SELFTEST_FAN_NO_LANG_TABLE) -extern const char* const MSG_SELFTEST_FAN_YES_LANG_TABLE[LANG_NUM]; -#define MSG_SELFTEST_FAN_YES LANG_TABLE_SELECT(MSG_SELFTEST_FAN_YES_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[1]; -#define MSG_SERIAL_ERROR_MENU_STRUCTURE LANG_TABLE_SELECT_EXPLICIT(MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE, 0) -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[1]; -#define MSG_SET_HOME_OFFSETS LANG_TABLE_SELECT_EXPLICIT(MSG_SET_HOME_OFFSETS_LANG_TABLE, 0) -extern const char* const MSG_SET_ORIGIN_LANG_TABLE[1]; -#define MSG_SET_ORIGIN LANG_TABLE_SELECT_EXPLICIT(MSG_SET_ORIGIN_LANG_TABLE, 0) -extern const char* const MSG_SET_TEMPERATURE_LANG_TABLE[LANG_NUM]; -#define MSG_SET_TEMPERATURE LANG_TABLE_SELECT(MSG_SET_TEMPERATURE_LANG_TABLE) -extern const char* const MSG_SEVERE_SKEW_LANG_TABLE[LANG_NUM]; -#define MSG_SEVERE_SKEW LANG_TABLE_SELECT(MSG_SEVERE_SKEW_LANG_TABLE) -extern const char* const MSG_SHOW_END_STOPS_LANG_TABLE[LANG_NUM]; -#define MSG_SHOW_END_STOPS LANG_TABLE_SELECT(MSG_SHOW_END_STOPS_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_SLIGHT_SKEW_LANG_TABLE[LANG_NUM]; -#define MSG_SLIGHT_SKEW LANG_TABLE_SELECT(MSG_SLIGHT_SKEW_LANG_TABLE) -extern const char* const MSG_SOFTWARE_RESET_LANG_TABLE[1]; -#define MSG_SOFTWARE_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_SOFTWARE_RESET_LANG_TABLE, 0) -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_STACK_ERROR_LANG_TABLE[1]; -#define MSG_STACK_ERROR LANG_TABLE_SELECT_EXPLICIT(MSG_STACK_ERROR_LANG_TABLE, 0) -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[1]; -#define MSG_STEPPER_TOO_HIGH LANG_TABLE_SELECT_EXPLICIT(MSG_STEPPER_TOO_HIGH_LANG_TABLE, 0) -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[1]; -#define MSG_STORE_EPROM LANG_TABLE_SELECT_EXPLICIT(MSG_STORE_EPROM_LANG_TABLE, 0) -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_TEMP_CALIBRATION_LANG_TABLE[LANG_NUM]; -#define MSG_TEMP_CALIBRATION LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_LANG_TABLE) -extern const char* const MSG_TEMP_CALIBRATION_DONE_LANG_TABLE[LANG_NUM]; -#define MSG_TEMP_CALIBRATION_DONE LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_DONE_LANG_TABLE) -extern const char* const MSG_TEMP_CALIBRATION_OFF_LANG_TABLE[LANG_NUM]; -#define MSG_TEMP_CALIBRATION_OFF LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_OFF_LANG_TABLE) -extern const char* const MSG_TEMP_CALIBRATION_ON_LANG_TABLE[LANG_NUM]; -#define MSG_TEMP_CALIBRATION_ON LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_ON_LANG_TABLE) -extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[LANG_NUM]; -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF LANG_TABLE_SELECT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE) -extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[LANG_NUM]; -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON LANG_TABLE_SELECT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_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[1]; -#define MSG_UNKNOWN_COMMAND LANG_TABLE_SELECT_EXPLICIT(MSG_UNKNOWN_COMMAND_LANG_TABLE, 0) -extern const char* const MSG_UNLOADING_FILAMENT_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOADING_FILAMENT LANG_TABLE_SELECT(MSG_UNLOADING_FILAMENT_LANG_TABLE) -extern const char* const MSG_UNLOAD_ALL_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOAD_ALL LANG_TABLE_SELECT(MSG_UNLOAD_ALL_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_UNLOAD_FILAMENT_1_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOAD_FILAMENT_1 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_1_LANG_TABLE) -extern const char* const MSG_UNLOAD_FILAMENT_2_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOAD_FILAMENT_2 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_2_LANG_TABLE) -extern const char* const MSG_UNLOAD_FILAMENT_3_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOAD_FILAMENT_3 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_3_LANG_TABLE) -extern const char* const MSG_UNLOAD_FILAMENT_4_LANG_TABLE[LANG_NUM]; -#define MSG_UNLOAD_FILAMENT_4 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_4_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_USED_LANG_TABLE[LANG_NUM]; -#define MSG_USED LANG_TABLE_SELECT(MSG_USED_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_VMIN_LANG_TABLE[1]; -#define MSG_VMIN LANG_TABLE_SELECT_EXPLICIT(MSG_VMIN_LANG_TABLE, 0) -extern const char* const MSG_VOLUMETRIC_LANG_TABLE[1]; -#define MSG_VOLUMETRIC LANG_TABLE_SELECT_EXPLICIT(MSG_VOLUMETRIC_LANG_TABLE, 0) -extern const char* const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[1]; -#define MSG_VOLUMETRIC_ENABLED LANG_TABLE_SELECT_EXPLICIT(MSG_VOLUMETRIC_ENABLED_LANG_TABLE, 0) -extern const char* const MSG_VTRAV_MIN_LANG_TABLE[1]; -#define MSG_VTRAV_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_VTRAV_MIN_LANG_TABLE, 0) -extern const char* const MSG_WAITING_TEMP_LANG_TABLE[LANG_NUM]; -#define MSG_WAITING_TEMP LANG_TABLE_SELECT(MSG_WAITING_TEMP_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[1]; -#define MSG_WATCHDOG_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_WATCHDOG_RESET_LANG_TABLE, 0) -extern const char* const MSG_XYZ_DETAILS_LANG_TABLE[LANG_NUM]; -#define MSG_XYZ_DETAILS LANG_TABLE_SELECT(MSG_XYZ_DETAILS_LANG_TABLE) -extern const char* const MSG_X_MAX_LANG_TABLE[1]; -#define MSG_X_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_X_MAX_LANG_TABLE, 0) -extern const char* const MSG_X_MIN_LANG_TABLE[1]; -#define MSG_X_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_X_MIN_LANG_TABLE, 0) -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_Y_DISTANCE_FROM_MIN_LANG_TABLE[LANG_NUM]; -#define MSG_Y_DISTANCE_FROM_MIN LANG_TABLE_SELECT(MSG_Y_DISTANCE_FROM_MIN_LANG_TABLE) -extern const char* const MSG_Y_MAX_LANG_TABLE[1]; -#define MSG_Y_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_Y_MAX_LANG_TABLE, 0) -extern const char* const MSG_Y_MIN_LANG_TABLE[1]; -#define MSG_Y_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_Y_MIN_LANG_TABLE, 0) -extern const char* const MSG_ZPROBE_OUT_LANG_TABLE[1]; -#define MSG_ZPROBE_OUT LANG_TABLE_SELECT_EXPLICIT(MSG_ZPROBE_OUT_LANG_TABLE, 0) -extern const char* const MSG_ZPROBE_ZOFFSET_LANG_TABLE[1]; -#define MSG_ZPROBE_ZOFFSET LANG_TABLE_SELECT_EXPLICIT(MSG_ZPROBE_ZOFFSET_LANG_TABLE, 0) -extern const char* const MSG_Z_MAX_LANG_TABLE[1]; -#define MSG_Z_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_Z_MAX_LANG_TABLE, 0) -extern const char* const MSG_Z_MIN_LANG_TABLE[1]; -#define MSG_Z_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_Z_MIN_LANG_TABLE, 0) -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 +#ifndef LANGUAGE_ALL_H +#define LANGUAGE_ALL_H + +#include +// Language indices into their particular symbol tables. +#define LANG_ID_EN 0 +#define LANG_ID_CZ 1 +#define LANG_ID_IT 2 +#define LANG_ID_ES 3 +#define LANG_ID_PL 4 +#define LANG_ID_DE 5 +#define LANG_ID_NL 6 +// Language is not defined and it shall be selected from the menu. +#define LANG_ID_FORCE_SELECTION 254 +// Language is not defined on a virgin RAMBo board. +#define LANG_ID_UNDEFINED 255 + +// Default language ID, if no language is selected. +#define LANG_ID_DEFAULT LANG_ID_EN + +// Number of languages available in the language table. +#define LANG_NUM 7 + +// Currectly active language selection. +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_ACTIVE_EXTRUDER_LANG_TABLE[1]; +#define MSG_ACTIVE_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_ACTIVE_EXTRUDER_LANG_TABLE, 0) +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_ALL_LANG_TABLE[LANG_NUM]; +#define MSG_ALL LANG_TABLE_SELECT(MSG_ALL_LANG_TABLE) +extern const char* const MSG_AMAX_LANG_TABLE[1]; +#define MSG_AMAX LANG_TABLE_SELECT_EXPLICIT(MSG_AMAX_LANG_TABLE, 0) +extern const char* const MSG_AUTHOR_LANG_TABLE[1]; +#define MSG_AUTHOR LANG_TABLE_SELECT_EXPLICIT(MSG_AUTHOR_LANG_TABLE, 0) +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[1]; +#define MSG_A_RETRACT LANG_TABLE_SELECT_EXPLICIT(MSG_A_RETRACT_LANG_TABLE, 0) +extern const char* const MSG_BABYSTEPPING_X_LANG_TABLE[1]; +#define MSG_BABYSTEPPING_X LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_X_LANG_TABLE, 0) +extern const char* const MSG_BABYSTEPPING_Y_LANG_TABLE[1]; +#define MSG_BABYSTEPPING_Y LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_Y_LANG_TABLE, 0) +extern const char* const MSG_BABYSTEPPING_Z_LANG_TABLE[1]; +#define MSG_BABYSTEPPING_Z LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEPPING_Z_LANG_TABLE, 0) +extern const char* const MSG_BABYSTEP_X_LANG_TABLE[1]; +#define MSG_BABYSTEP_X LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEP_X_LANG_TABLE, 0) +extern const char* const MSG_BABYSTEP_Y_LANG_TABLE[1]; +#define MSG_BABYSTEP_Y LANG_TABLE_SELECT_EXPLICIT(MSG_BABYSTEP_Y_LANG_TABLE, 0) +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_BABYSTEP_Z_NOT_SET_LANG_TABLE[LANG_NUM]; +#define MSG_BABYSTEP_Z_NOT_SET LANG_TABLE_SELECT(MSG_BABYSTEP_Z_NOT_SET_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_CORRECTION_FRONT_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_FRONT LANG_TABLE_SELECT(MSG_BED_CORRECTION_FRONT_LANG_TABLE) +extern const char* const MSG_BED_CORRECTION_LEFT_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_LEFT LANG_TABLE_SELECT(MSG_BED_CORRECTION_LEFT_LANG_TABLE) +extern const char* const MSG_BED_CORRECTION_MENU_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_MENU LANG_TABLE_SELECT(MSG_BED_CORRECTION_MENU_LANG_TABLE) +extern const char* const MSG_BED_CORRECTION_REAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_REAR LANG_TABLE_SELECT(MSG_BED_CORRECTION_REAR_LANG_TABLE) +extern const char* const MSG_BED_CORRECTION_RESET_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_RESET LANG_TABLE_SELECT(MSG_BED_CORRECTION_RESET_LANG_TABLE) +extern const char* const MSG_BED_CORRECTION_RIGHT_LANG_TABLE[LANG_NUM]; +#define MSG_BED_CORRECTION_RIGHT LANG_TABLE_SELECT(MSG_BED_CORRECTION_RIGHT_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_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE[LANG_NUM]; +#define MSG_BED_LEVELING_FAILED_POINT_HIGH LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_POINT_HIGH_LANG_TABLE) +extern const char* const MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE[LANG_NUM]; +#define MSG_BED_LEVELING_FAILED_POINT_LOW LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_POINT_LOW_LANG_TABLE) +extern const char* const MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE[LANG_NUM]; +#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED LANG_TABLE_SELECT(MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_PERFECT_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR_LANG_TABLE) +extern const char* const MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE[LANG_NUM]; +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR LANG_TABLE_SELECT(MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR_LANG_TABLE) +extern const char* const MSG_BEGIN_FILE_LIST_LANG_TABLE[1]; +#define MSG_BEGIN_FILE_LIST LANG_TABLE_SELECT_EXPLICIT(MSG_BEGIN_FILE_LIST_LANG_TABLE, 0) +extern const char* const MSG_BROWNOUT_RESET_LANG_TABLE[1]; +#define MSG_BROWNOUT_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_BROWNOUT_RESET_LANG_TABLE, 0) +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_CALIBRATE_E_LANG_TABLE[LANG_NUM]; +#define MSG_CALIBRATE_E LANG_TABLE_SELECT(MSG_CALIBRATE_E_LANG_TABLE) +extern const char* const MSG_CALIBRATE_PINDA_LANG_TABLE[LANG_NUM]; +#define MSG_CALIBRATE_PINDA LANG_TABLE_SELECT(MSG_CALIBRATE_PINDA_LANG_TABLE) +extern const char* const MSG_CALIBRATION_PINDA_MENU_LANG_TABLE[LANG_NUM]; +#define MSG_CALIBRATION_PINDA_MENU LANG_TABLE_SELECT(MSG_CALIBRATION_PINDA_MENU_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_CENTER_LANG_TABLE[LANG_NUM]; +#define MSG_CENTER LANG_TABLE_SELECT(MSG_CENTER_LANG_TABLE) +extern const char* const MSG_CHANGE_EXTR_LANG_TABLE[LANG_NUM]; +#define MSG_CHANGE_EXTR LANG_TABLE_SELECT(MSG_CHANGE_EXTR_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_CHOOSE_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_CHOOSE_EXTRUDER LANG_TABLE_SELECT(MSG_CHOOSE_EXTRUDER_LANG_TABLE) +extern const char* const MSG_CLEAN_NOZZLE_E_LANG_TABLE[LANG_NUM]; +#define MSG_CLEAN_NOZZLE_E LANG_TABLE_SELECT(MSG_CLEAN_NOZZLE_E_LANG_TABLE) +extern const char* const MSG_CNG_SDCARD_LANG_TABLE[1]; +#define MSG_CNG_SDCARD LANG_TABLE_SELECT_EXPLICIT(MSG_CNG_SDCARD_LANG_TABLE, 0) +extern const char* const MSG_CONFIGURATION_VER_LANG_TABLE[1]; +#define MSG_CONFIGURATION_VER LANG_TABLE_SELECT_EXPLICIT(MSG_CONFIGURATION_VER_LANG_TABLE, 0) +extern const char* const MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP LANG_TABLE_SELECT(MSG_CONFIRM_CARRIAGE_AT_THE_TOP_LANG_TABLE) +extern const char* const MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIRM_NOZZLE_CLEAN LANG_TABLE_SELECT(MSG_CONFIRM_NOZZLE_CLEAN_LANG_TABLE) +extern const char* const MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE[LANG_NUM]; +#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ LANG_TABLE_SELECT(MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ_LANG_TABLE) +extern const char* const MSG_CONTROL_LANG_TABLE[1]; +#define MSG_CONTROL LANG_TABLE_SELECT_EXPLICIT(MSG_CONTROL_LANG_TABLE, 0) +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[1]; +#define MSG_COUNT_X LANG_TABLE_SELECT_EXPLICIT(MSG_COUNT_X_LANG_TABLE, 0) +extern const char* const MSG_CURRENT_LANG_TABLE[LANG_NUM]; +#define MSG_CURRENT LANG_TABLE_SELECT(MSG_CURRENT_LANG_TABLE) +extern const char* const MSG_DATE_LANG_TABLE[LANG_NUM]; +#define MSG_DATE LANG_TABLE_SELECT(MSG_DATE_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_ENDSTOPS_HIT_LANG_TABLE[1]; +#define MSG_ENDSTOPS_HIT LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOPS_HIT_LANG_TABLE, 0) +extern const char* const MSG_ENDSTOP_HIT_LANG_TABLE[1]; +#define MSG_ENDSTOP_HIT LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOP_HIT_LANG_TABLE, 0) +extern const char* const MSG_ENDSTOP_OPEN_LANG_TABLE[1]; +#define MSG_ENDSTOP_OPEN LANG_TABLE_SELECT_EXPLICIT(MSG_ENDSTOP_OPEN_LANG_TABLE, 0) +extern const char* const MSG_END_FILE_LIST_LANG_TABLE[1]; +#define MSG_END_FILE_LIST LANG_TABLE_SELECT_EXPLICIT(MSG_END_FILE_LIST_LANG_TABLE, 0) +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[1]; +#define MSG_ERR_CHECKSUM_MISMATCH LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_CHECKSUM_MISMATCH_LANG_TABLE, 0) +extern const char* const MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE[1]; +#define MSG_ERR_COLD_EXTRUDE_STOP LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_COLD_EXTRUDE_STOP_LANG_TABLE, 0) +extern const char* const MSG_ERR_KILLED_LANG_TABLE[1]; +#define MSG_ERR_KILLED LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_KILLED_LANG_TABLE, 0) +extern const char* const MSG_ERR_LINE_NO_LANG_TABLE[1]; +#define MSG_ERR_LINE_NO LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_LINE_NO_LANG_TABLE, 0) +extern const char* const MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE[1]; +#define MSG_ERR_LONG_EXTRUDE_STOP LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_LONG_EXTRUDE_STOP_LANG_TABLE, 0) +extern const char* const MSG_ERR_NO_CHECKSUM_LANG_TABLE[1]; +#define MSG_ERR_NO_CHECKSUM LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_CHECKSUM_LANG_TABLE, 0) +extern const char* const MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE[1]; +#define MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM_LANG_TABLE, 0) +extern const char* const MSG_ERR_NO_THERMISTORS_LANG_TABLE[1]; +#define MSG_ERR_NO_THERMISTORS LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_NO_THERMISTORS_LANG_TABLE, 0) +extern const char* const MSG_ERR_STOPPED_LANG_TABLE[1]; +#define MSG_ERR_STOPPED LANG_TABLE_SELECT_EXPLICIT(MSG_ERR_STOPPED_LANG_TABLE, 0) +extern const char* const MSG_EXTERNAL_RESET_LANG_TABLE[1]; +#define MSG_EXTERNAL_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_EXTERNAL_RESET_LANG_TABLE, 0) +extern const char* const MSG_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDER LANG_TABLE_SELECT(MSG_EXTRUDER_LANG_TABLE) +extern const char* const MSG_EXTRUDER_1_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDER_1 LANG_TABLE_SELECT(MSG_EXTRUDER_1_LANG_TABLE) +extern const char* const MSG_EXTRUDER_2_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDER_2 LANG_TABLE_SELECT(MSG_EXTRUDER_2_LANG_TABLE) +extern const char* const MSG_EXTRUDER_3_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDER_3 LANG_TABLE_SELECT(MSG_EXTRUDER_3_LANG_TABLE) +extern const char* const MSG_EXTRUDER_4_LANG_TABLE[LANG_NUM]; +#define MSG_EXTRUDER_4 LANG_TABLE_SELECT(MSG_EXTRUDER_4_LANG_TABLE) +extern const char* const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM]; +#define MSG_E_CAL_KNOB LANG_TABLE_SELECT(MSG_E_CAL_KNOB_LANG_TABLE) +extern const char* const MSG_Enqueing_LANG_TABLE[1]; +#define MSG_Enqueing LANG_TABLE_SELECT_EXPLICIT(MSG_Enqueing_LANG_TABLE, 0) +extern const char* const MSG_FACTOR_LANG_TABLE[1]; +#define MSG_FACTOR LANG_TABLE_SELECT_EXPLICIT(MSG_FACTOR_LANG_TABLE, 0) +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_FARM_CARD_MENU_LANG_TABLE[1]; +#define MSG_FARM_CARD_MENU LANG_TABLE_SELECT_EXPLICIT(MSG_FARM_CARD_MENU_LANG_TABLE, 0) +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_CLEAN_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_CLEAN LANG_TABLE_SELECT(MSG_FILAMENT_CLEAN_LANG_TABLE) +extern const char* const MSG_FILAMENT_LOADING_T0_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_LOADING_T0 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T0_LANG_TABLE) +extern const char* const MSG_FILAMENT_LOADING_T1_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_LOADING_T1 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T1_LANG_TABLE) +extern const char* const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_LOADING_T2 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T2_LANG_TABLE) +extern const char* const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM]; +#define MSG_FILAMENT_LOADING_T3 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T3_LANG_TABLE) +extern const char* const MSG_FILE_PRINTED_LANG_TABLE[1]; +#define MSG_FILE_PRINTED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_PRINTED_LANG_TABLE, 0) +extern const char* const MSG_FILE_SAVED_LANG_TABLE[1]; +#define MSG_FILE_SAVED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_SAVED_LANG_TABLE, 0) +extern const char* const MSG_FIL_ADJUSTING_LANG_TABLE[LANG_NUM]; +#define MSG_FIL_ADJUSTING LANG_TABLE_SELECT(MSG_FIL_ADJUSTING_LANG_TABLE) +extern const char* const MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_LANG_TABLE[LANG_NUM]; +#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION LANG_TABLE_SELECT(MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION_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_FINISHING_MOVEMENTS_LANG_TABLE[LANG_NUM]; +#define MSG_FINISHING_MOVEMENTS LANG_TABLE_SELECT(MSG_FINISHING_MOVEMENTS_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[1]; +#define MSG_FLOW0 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW0_LANG_TABLE, 0) +extern const char* const MSG_FLOW1_LANG_TABLE[1]; +#define MSG_FLOW1 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW1_LANG_TABLE, 0) +extern const char* const MSG_FLOW2_LANG_TABLE[1]; +#define MSG_FLOW2 LANG_TABLE_SELECT_EXPLICIT(MSG_FLOW2_LANG_TABLE, 0) +extern const char* const MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE[LANG_NUM]; +#define MSG_FOLLOW_CALIBRATION_FLOW LANG_TABLE_SELECT(MSG_FOLLOW_CALIBRATION_FLOW_LANG_TABLE) +extern const char* const MSG_FREE_MEMORY_LANG_TABLE[1]; +#define MSG_FREE_MEMORY LANG_TABLE_SELECT_EXPLICIT(MSG_FREE_MEMORY_LANG_TABLE, 0) +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[1]; +#define MSG_HOTEND_OFFSET LANG_TABLE_SELECT_EXPLICIT(MSG_HOTEND_OFFSET_LANG_TABLE, 0) +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_INIT_SDCARD_LANG_TABLE[1]; +#define MSG_INIT_SDCARD LANG_TABLE_SELECT_EXPLICIT(MSG_INIT_SDCARD_LANG_TABLE, 0) +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[1]; +#define MSG_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_INVALID_EXTRUDER_LANG_TABLE, 0) +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_LEFT_LANG_TABLE[LANG_NUM]; +#define MSG_LEFT LANG_TABLE_SELECT(MSG_LEFT_LANG_TABLE) +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_ALL_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_ALL LANG_TABLE_SELECT(MSG_LOAD_ALL_LANG_TABLE) +extern const char* const MSG_LOAD_EPROM_LANG_TABLE[1]; +#define MSG_LOAD_EPROM LANG_TABLE_SELECT_EXPLICIT(MSG_LOAD_EPROM_LANG_TABLE, 0) +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_LOAD_FILAMENT_1_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_FILAMENT_1 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_1_LANG_TABLE) +extern const char* const MSG_LOAD_FILAMENT_2_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_FILAMENT_2 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_2_LANG_TABLE) +extern const char* const MSG_LOAD_FILAMENT_3_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_FILAMENT_3 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_3_LANG_TABLE) +extern const char* const MSG_LOAD_FILAMENT_4_LANG_TABLE[LANG_NUM]; +#define MSG_LOAD_FILAMENT_4 LANG_TABLE_SELECT(MSG_LOAD_FILAMENT_4_LANG_TABLE) +extern const char* const MSG_LOOSE_PULLEY_LANG_TABLE[LANG_NUM]; +#define MSG_LOOSE_PULLEY LANG_TABLE_SELECT(MSG_LOOSE_PULLEY_LANG_TABLE) +extern const char* const MSG_M104_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M104_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M104_INVALID_EXTRUDER_LANG_TABLE, 0) +extern const char* const MSG_M105_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M105_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M105_INVALID_EXTRUDER_LANG_TABLE, 0) +extern const char* const MSG_M109_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M109_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M109_INVALID_EXTRUDER_LANG_TABLE, 0) +extern const char* const MSG_M115_REPORT_LANG_TABLE[1]; +#define MSG_M115_REPORT LANG_TABLE_SELECT_EXPLICIT(MSG_M115_REPORT_LANG_TABLE, 0) +extern const char* const MSG_M119_REPORT_LANG_TABLE[1]; +#define MSG_M119_REPORT LANG_TABLE_SELECT_EXPLICIT(MSG_M119_REPORT_LANG_TABLE, 0) +extern const char* const MSG_M200_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M200_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M200_INVALID_EXTRUDER_LANG_TABLE, 0) +extern const char* const MSG_M218_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M218_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M218_INVALID_EXTRUDER_LANG_TABLE, 0) +extern const char* const MSG_M221_INVALID_EXTRUDER_LANG_TABLE[1]; +#define MSG_M221_INVALID_EXTRUDER LANG_TABLE_SELECT_EXPLICIT(MSG_M221_INVALID_EXTRUDER_LANG_TABLE, 0) +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_MARK_FIL_LANG_TABLE[LANG_NUM]; +#define MSG_MARK_FIL LANG_TABLE_SELECT(MSG_MARK_FIL_LANG_TABLE) +extern const char* const MSG_MAX_LANG_TABLE[1]; +#define MSG_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_MAX_LANG_TABLE, 0) +extern const char* const MSG_MEASURED_SKEW_LANG_TABLE[LANG_NUM]; +#define MSG_MEASURED_SKEW LANG_TABLE_SELECT(MSG_MEASURED_SKEW_LANG_TABLE) +extern const char* const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE[LANG_NUM]; +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 LANG_TABLE_SELECT(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1_LANG_TABLE) +extern const char* const MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE[LANG_NUM]; +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 LANG_TABLE_SELECT(MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2_LANG_TABLE) +extern const char* const MSG_MENU_CALIBRATION_LANG_TABLE[LANG_NUM]; +#define MSG_MENU_CALIBRATION LANG_TABLE_SELECT(MSG_MENU_CALIBRATION_LANG_TABLE) +extern const char* const MSG_MESH_BED_LEVELING_LANG_TABLE[LANG_NUM]; +#define MSG_MESH_BED_LEVELING LANG_TABLE_SELECT(MSG_MESH_BED_LEVELING_LANG_TABLE) +extern const char* const MSG_MIN_LANG_TABLE[1]; +#define MSG_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_MIN_LANG_TABLE, 0) +extern const char* const MSG_MOTION_LANG_TABLE[1]; +#define MSG_MOTION LANG_TABLE_SELECT_EXPLICIT(MSG_MOTION_LANG_TABLE, 0) +extern const char* const MSG_MOVE_01MM_LANG_TABLE[1]; +#define MSG_MOVE_01MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_01MM_LANG_TABLE, 0) +extern const char* const MSG_MOVE_10MM_LANG_TABLE[1]; +#define MSG_MOVE_10MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_10MM_LANG_TABLE, 0) +extern const char* const MSG_MOVE_1MM_LANG_TABLE[1]; +#define MSG_MOVE_1MM LANG_TABLE_SELECT_EXPLICIT(MSG_MOVE_1MM_LANG_TABLE, 0) +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_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_LANG_TABLE) +extern const char* const MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_LANG_TABLE[LANG_NUM]; +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z LANG_TABLE_SELECT(MSG_MOVE_CARRIAGE_TO_THE_TOP_Z_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_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_NEW_FIRMWARE_AVAILABLE_LANG_TABLE[LANG_NUM]; +#define MSG_NEW_FIRMWARE_AVAILABLE LANG_TABLE_SELECT(MSG_NEW_FIRMWARE_AVAILABLE_LANG_TABLE) +extern const char* const MSG_NEW_FIRMWARE_PLEASE_UPGRADE_LANG_TABLE[LANG_NUM]; +#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE LANG_TABLE_SELECT(MSG_NEW_FIRMWARE_PLEASE_UPGRADE_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[1]; +#define MSG_NOZZLE1 LANG_TABLE_SELECT_EXPLICIT(MSG_NOZZLE1_LANG_TABLE, 0) +extern const char* const MSG_NOZZLE2_LANG_TABLE[1]; +#define MSG_NOZZLE2 LANG_TABLE_SELECT_EXPLICIT(MSG_NOZZLE2_LANG_TABLE, 0) +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[1]; +#define MSG_OFF LANG_TABLE_SELECT_EXPLICIT(MSG_OFF_LANG_TABLE, 0) +extern const char* const MSG_OK_LANG_TABLE[1]; +#define MSG_OK LANG_TABLE_SELECT_EXPLICIT(MSG_OK_LANG_TABLE, 0) +extern const char* const MSG_ON_LANG_TABLE[1]; +#define MSG_ON LANG_TABLE_SELECT_EXPLICIT(MSG_ON_LANG_TABLE, 0) +extern const char* const MSG_PAPER_LANG_TABLE[LANG_NUM]; +#define MSG_PAPER LANG_TABLE_SELECT(MSG_PAPER_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_BED_LANG_TABLE[LANG_NUM]; +#define MSG_PID_BED LANG_TABLE_SELECT(MSG_PID_BED_LANG_TABLE) +extern const char* const MSG_PID_BED_FINISHED_LANG_TABLE[LANG_NUM]; +#define MSG_PID_BED_FINISHED LANG_TABLE_SELECT(MSG_PID_BED_FINISHED_LANG_TABLE) +extern const char* const MSG_PID_BED_RUNNING_LANG_TABLE[LANG_NUM]; +#define MSG_PID_BED_RUNNING LANG_TABLE_SELECT(MSG_PID_BED_RUNNING_LANG_TABLE) +extern const char* const MSG_PID_EXTRUDER_LANG_TABLE[LANG_NUM]; +#define MSG_PID_EXTRUDER LANG_TABLE_SELECT(MSG_PID_EXTRUDER_LANG_TABLE) +extern const char* const MSG_PID_FINISHED_LANG_TABLE[LANG_NUM]; +#define MSG_PID_FINISHED LANG_TABLE_SELECT(MSG_PID_FINISHED_LANG_TABLE) +extern const char* const MSG_PID_RUNNING_LANG_TABLE[LANG_NUM]; +#define MSG_PID_RUNNING LANG_TABLE_SELECT(MSG_PID_RUNNING_LANG_TABLE) +extern const char* const MSG_PINDA_NOT_CALIBRATED_LANG_TABLE[LANG_NUM]; +#define MSG_PINDA_NOT_CALIBRATED LANG_TABLE_SELECT(MSG_PINDA_NOT_CALIBRATED_LANG_TABLE) +extern const char* const MSG_PINDA_PREHEAT_LANG_TABLE[LANG_NUM]; +#define MSG_PINDA_PREHEAT LANG_TABLE_SELECT(MSG_PINDA_PREHEAT_LANG_TABLE) +extern const char* const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1]; +#define MSG_PLANNER_BUFFER_BYTES LANG_TABLE_SELECT_EXPLICIT(MSG_PLANNER_BUFFER_BYTES_LANG_TABLE, 0) +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[1]; +#define MSG_POSITION_UNKNOWN LANG_TABLE_SELECT_EXPLICIT(MSG_POSITION_UNKNOWN_LANG_TABLE, 0) +extern const char* const MSG_POWERUP_LANG_TABLE[1]; +#define MSG_POWERUP LANG_TABLE_SELECT_EXPLICIT(MSG_POWERUP_LANG_TABLE, 0) +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_NOZZLE_LANG_TABLE[LANG_NUM]; +#define MSG_PREHEAT_NOZZLE LANG_TABLE_SELECT(MSG_PREHEAT_NOZZLE_LANG_TABLE) +extern const char* const MSG_PREPARE_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_PREPARE_FILAMENT LANG_TABLE_SELECT(MSG_PREPARE_FILAMENT_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_PRINTER_DISCONNECTED_LANG_TABLE[LANG_NUM]; +#define MSG_PRINTER_DISCONNECTED LANG_TABLE_SELECT(MSG_PRINTER_DISCONNECTED_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_PRINT_PAUSED_LANG_TABLE[LANG_NUM]; +#define MSG_PRINT_PAUSED LANG_TABLE_SELECT(MSG_PRINT_PAUSED_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[1]; +#define MSG_RECTRACT LANG_TABLE_SELECT_EXPLICIT(MSG_RECTRACT_LANG_TABLE, 0) +extern const char* const MSG_REFRESH_LANG_TABLE[1]; +#define MSG_REFRESH LANG_TABLE_SELECT_EXPLICIT(MSG_REFRESH_LANG_TABLE, 0) +extern const char* const MSG_RESEND_LANG_TABLE[1]; +#define MSG_RESEND LANG_TABLE_SELECT_EXPLICIT(MSG_RESEND_LANG_TABLE, 0) +extern const char* const MSG_RESET_CALIBRATE_E_LANG_TABLE[1]; +#define MSG_RESET_CALIBRATE_E LANG_TABLE_SELECT_EXPLICIT(MSG_RESET_CALIBRATE_E_LANG_TABLE, 0) +extern const char* const MSG_RESTORE_FAILSAFE_LANG_TABLE[1]; +#define MSG_RESTORE_FAILSAFE LANG_TABLE_SELECT_EXPLICIT(MSG_RESTORE_FAILSAFE_LANG_TABLE, 0) +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_RESUMING_PRINT_LANG_TABLE[LANG_NUM]; +#define MSG_RESUMING_PRINT LANG_TABLE_SELECT(MSG_RESUMING_PRINT_LANG_TABLE) +extern const char* const MSG_RIGHT_LANG_TABLE[LANG_NUM]; +#define MSG_RIGHT LANG_TABLE_SELECT(MSG_RIGHT_LANG_TABLE) +extern const char* const MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE[1]; +#define MSG_SD_CANT_ENTER_SUBDIR LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CANT_ENTER_SUBDIR_LANG_TABLE, 0) +extern const char* const MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE[1]; +#define MSG_SD_CANT_OPEN_SUBDIR LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CANT_OPEN_SUBDIR_LANG_TABLE, 0) +extern const char* const MSG_SD_CARD_OK_LANG_TABLE[1]; +#define MSG_SD_CARD_OK LANG_TABLE_SELECT_EXPLICIT(MSG_SD_CARD_OK_LANG_TABLE, 0) +extern const char* const MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE[1]; +#define MSG_SD_ERR_WRITE_TO_FILE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_ERR_WRITE_TO_FILE_LANG_TABLE, 0) +extern const char* const MSG_SD_FILE_OPENED_LANG_TABLE[1]; +#define MSG_SD_FILE_OPENED LANG_TABLE_SELECT_EXPLICIT(MSG_SD_FILE_OPENED_LANG_TABLE, 0) +extern const char* const MSG_SD_FILE_SELECTED_LANG_TABLE[1]; +#define MSG_SD_FILE_SELECTED LANG_TABLE_SELECT_EXPLICIT(MSG_SD_FILE_SELECTED_LANG_TABLE, 0) +extern const char* const MSG_SD_INIT_FAIL_LANG_TABLE[1]; +#define MSG_SD_INIT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_INIT_FAIL_LANG_TABLE, 0) +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[1]; +#define MSG_SD_NOT_PRINTING LANG_TABLE_SELECT_EXPLICIT(MSG_SD_NOT_PRINTING_LANG_TABLE, 0) +extern const char* const MSG_SD_OPENROOT_FAIL_LANG_TABLE[1]; +#define MSG_SD_OPENROOT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_OPENROOT_FAIL_LANG_TABLE, 0) +extern const char* const MSG_SD_OPEN_FILE_FAIL_LANG_TABLE[1]; +#define MSG_SD_OPEN_FILE_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_OPEN_FILE_FAIL_LANG_TABLE, 0) +extern const char* const MSG_SD_PRINTING_BYTE_LANG_TABLE[1]; +#define MSG_SD_PRINTING_BYTE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_PRINTING_BYTE_LANG_TABLE, 0) +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[1]; +#define MSG_SD_SIZE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_SIZE_LANG_TABLE, 0) +extern const char* const MSG_SD_VOL_INIT_FAIL_LANG_TABLE[1]; +#define MSG_SD_VOL_INIT_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_VOL_INIT_FAIL_LANG_TABLE, 0) +extern const char* const MSG_SD_WORKDIR_FAIL_LANG_TABLE[1]; +#define MSG_SD_WORKDIR_FAIL LANG_TABLE_SELECT_EXPLICIT(MSG_SD_WORKDIR_FAIL_LANG_TABLE, 0) +extern const char* const MSG_SD_WRITE_TO_FILE_LANG_TABLE[1]; +#define MSG_SD_WRITE_TO_FILE LANG_TABLE_SELECT_EXPLICIT(MSG_SD_WRITE_TO_FILE_LANG_TABLE, 0) +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_COOLING_FAN_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_COOLING_FAN LANG_TABLE_SELECT(MSG_SELFTEST_COOLING_FAN_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_EXTRUDER_FAN_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_EXTRUDER_FAN LANG_TABLE_SELECT(MSG_SELFTEST_EXTRUDER_FAN_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_FAN_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_FAN LANG_TABLE_SELECT(MSG_SELFTEST_FAN_LANG_TABLE) +extern const char* const MSG_SELFTEST_FAN_NO_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_FAN_NO LANG_TABLE_SELECT(MSG_SELFTEST_FAN_NO_LANG_TABLE) +extern const char* const MSG_SELFTEST_FAN_YES_LANG_TABLE[LANG_NUM]; +#define MSG_SELFTEST_FAN_YES LANG_TABLE_SELECT(MSG_SELFTEST_FAN_YES_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[1]; +#define MSG_SERIAL_ERROR_MENU_STRUCTURE LANG_TABLE_SELECT_EXPLICIT(MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE, 0) +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[1]; +#define MSG_SET_HOME_OFFSETS LANG_TABLE_SELECT_EXPLICIT(MSG_SET_HOME_OFFSETS_LANG_TABLE, 0) +extern const char* const MSG_SET_ORIGIN_LANG_TABLE[1]; +#define MSG_SET_ORIGIN LANG_TABLE_SELECT_EXPLICIT(MSG_SET_ORIGIN_LANG_TABLE, 0) +extern const char* const MSG_SET_TEMPERATURE_LANG_TABLE[LANG_NUM]; +#define MSG_SET_TEMPERATURE LANG_TABLE_SELECT(MSG_SET_TEMPERATURE_LANG_TABLE) +extern const char* const MSG_SEVERE_SKEW_LANG_TABLE[LANG_NUM]; +#define MSG_SEVERE_SKEW LANG_TABLE_SELECT(MSG_SEVERE_SKEW_LANG_TABLE) +extern const char* const MSG_SHOW_END_STOPS_LANG_TABLE[LANG_NUM]; +#define MSG_SHOW_END_STOPS LANG_TABLE_SELECT(MSG_SHOW_END_STOPS_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_SLIGHT_SKEW_LANG_TABLE[LANG_NUM]; +#define MSG_SLIGHT_SKEW LANG_TABLE_SELECT(MSG_SLIGHT_SKEW_LANG_TABLE) +extern const char* const MSG_SOFTWARE_RESET_LANG_TABLE[1]; +#define MSG_SOFTWARE_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_SOFTWARE_RESET_LANG_TABLE, 0) +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_STACK_ERROR_LANG_TABLE[1]; +#define MSG_STACK_ERROR LANG_TABLE_SELECT_EXPLICIT(MSG_STACK_ERROR_LANG_TABLE, 0) +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[1]; +#define MSG_STEPPER_TOO_HIGH LANG_TABLE_SELECT_EXPLICIT(MSG_STEPPER_TOO_HIGH_LANG_TABLE, 0) +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[1]; +#define MSG_STORE_EPROM LANG_TABLE_SELECT_EXPLICIT(MSG_STORE_EPROM_LANG_TABLE, 0) +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_TEMP_CALIBRATION_LANG_TABLE[LANG_NUM]; +#define MSG_TEMP_CALIBRATION LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_LANG_TABLE) +extern const char* const MSG_TEMP_CALIBRATION_DONE_LANG_TABLE[LANG_NUM]; +#define MSG_TEMP_CALIBRATION_DONE LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_DONE_LANG_TABLE) +extern const char* const MSG_TEMP_CALIBRATION_OFF_LANG_TABLE[LANG_NUM]; +#define MSG_TEMP_CALIBRATION_OFF LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_OFF_LANG_TABLE) +extern const char* const MSG_TEMP_CALIBRATION_ON_LANG_TABLE[LANG_NUM]; +#define MSG_TEMP_CALIBRATION_ON LANG_TABLE_SELECT(MSG_TEMP_CALIBRATION_ON_LANG_TABLE) +extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE[LANG_NUM]; +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF LANG_TABLE_SELECT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF_LANG_TABLE) +extern const char* const MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_LANG_TABLE[LANG_NUM]; +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON LANG_TABLE_SELECT(MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON_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[1]; +#define MSG_UNKNOWN_COMMAND LANG_TABLE_SELECT_EXPLICIT(MSG_UNKNOWN_COMMAND_LANG_TABLE, 0) +extern const char* const MSG_UNLOADING_FILAMENT_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOADING_FILAMENT LANG_TABLE_SELECT(MSG_UNLOADING_FILAMENT_LANG_TABLE) +extern const char* const MSG_UNLOAD_ALL_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_ALL LANG_TABLE_SELECT(MSG_UNLOAD_ALL_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_UNLOAD_FILAMENT_1_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_FILAMENT_1 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_1_LANG_TABLE) +extern const char* const MSG_UNLOAD_FILAMENT_2_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_FILAMENT_2 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_2_LANG_TABLE) +extern const char* const MSG_UNLOAD_FILAMENT_3_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_FILAMENT_3 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_3_LANG_TABLE) +extern const char* const MSG_UNLOAD_FILAMENT_4_LANG_TABLE[LANG_NUM]; +#define MSG_UNLOAD_FILAMENT_4 LANG_TABLE_SELECT(MSG_UNLOAD_FILAMENT_4_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_USED_LANG_TABLE[LANG_NUM]; +#define MSG_USED LANG_TABLE_SELECT(MSG_USED_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_VMIN_LANG_TABLE[1]; +#define MSG_VMIN LANG_TABLE_SELECT_EXPLICIT(MSG_VMIN_LANG_TABLE, 0) +extern const char* const MSG_VOLUMETRIC_LANG_TABLE[1]; +#define MSG_VOLUMETRIC LANG_TABLE_SELECT_EXPLICIT(MSG_VOLUMETRIC_LANG_TABLE, 0) +extern const char* const MSG_VOLUMETRIC_ENABLED_LANG_TABLE[1]; +#define MSG_VOLUMETRIC_ENABLED LANG_TABLE_SELECT_EXPLICIT(MSG_VOLUMETRIC_ENABLED_LANG_TABLE, 0) +extern const char* const MSG_VTRAV_MIN_LANG_TABLE[1]; +#define MSG_VTRAV_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_VTRAV_MIN_LANG_TABLE, 0) +extern const char* const MSG_WAITING_TEMP_LANG_TABLE[LANG_NUM]; +#define MSG_WAITING_TEMP LANG_TABLE_SELECT(MSG_WAITING_TEMP_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[1]; +#define MSG_WATCHDOG_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_WATCHDOG_RESET_LANG_TABLE, 0) +extern const char* const MSG_XYZ_DETAILS_LANG_TABLE[LANG_NUM]; +#define MSG_XYZ_DETAILS LANG_TABLE_SELECT(MSG_XYZ_DETAILS_LANG_TABLE) +extern const char* const MSG_X_MAX_LANG_TABLE[1]; +#define MSG_X_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_X_MAX_LANG_TABLE, 0) +extern const char* const MSG_X_MIN_LANG_TABLE[1]; +#define MSG_X_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_X_MIN_LANG_TABLE, 0) +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_Y_DISTANCE_FROM_MIN_LANG_TABLE[LANG_NUM]; +#define MSG_Y_DISTANCE_FROM_MIN LANG_TABLE_SELECT(MSG_Y_DISTANCE_FROM_MIN_LANG_TABLE) +extern const char* const MSG_Y_MAX_LANG_TABLE[1]; +#define MSG_Y_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_Y_MAX_LANG_TABLE, 0) +extern const char* const MSG_Y_MIN_LANG_TABLE[1]; +#define MSG_Y_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_Y_MIN_LANG_TABLE, 0) +extern const char* const MSG_ZPROBE_OUT_LANG_TABLE[1]; +#define MSG_ZPROBE_OUT LANG_TABLE_SELECT_EXPLICIT(MSG_ZPROBE_OUT_LANG_TABLE, 0) +extern const char* const MSG_ZPROBE_ZOFFSET_LANG_TABLE[1]; +#define MSG_ZPROBE_ZOFFSET LANG_TABLE_SELECT_EXPLICIT(MSG_ZPROBE_ZOFFSET_LANG_TABLE, 0) +extern const char* const MSG_Z_MAX_LANG_TABLE[1]; +#define MSG_Z_MAX LANG_TABLE_SELECT_EXPLICIT(MSG_Z_MAX_LANG_TABLE, 0) +extern const char* const MSG_Z_MIN_LANG_TABLE[1]; +#define MSG_Z_MIN LANG_TABLE_SELECT_EXPLICIT(MSG_Z_MIN_LANG_TABLE, 0) +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_cz.h b/Firmware/language_cz.h index d9f3715d9..7dd1865d6 100644 --- a/Firmware/language_cz.h +++ b/Firmware/language_cz.h @@ -1,313 +1,313 @@ -/** - * English - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ -#define WELCOME_MSG CUSTOM_MENDEL_NAME " ok" -#define MSG_SD_INSERTED "Karta vlozena" -#define MSG_SD_REMOVED "Karta vyjmuta" -#define MSG_MAIN "Hlavni nabidka" -#define MSG_DISABLE_STEPPERS "Vypnout motory" -#define MSG_AUTO_HOME "Auto home" -#define MSG_SET_HOME_OFFSETS "Nastav pocatek home" -#define MSG_SET_ORIGIN "Nastav pocatek" -#define MSG_COOLDOWN "Zchladit" -#define MSG_SWITCH_PS_ON "Vypnout zdroj" -#define MSG_SWITCH_PS_OFF "Zapnout zdroj" -#define MSG_MOVE_AXIS "Posunout osu" -#define MSG_MOVE_X "Posunout X" -#define MSG_MOVE_Y "Posunout Y" -#define MSG_MOVE_Z "Posunout Z" -#define MSG_MOVE_E "Extruder" -#define MSG_SPEED "Rychlost" -#define MSG_NOZZLE "Tryska" -#define MSG_NOZZLE1 "Tryska2" -#define MSG_NOZZLE2 "Tryska3" -#define MSG_BED "Bed" -#define MSG_FAN_SPEED "Rychlost vent." -#define MSG_FLOW "Prutok" -#define MSG_FLOW0 "Prutok 0" -#define MSG_FLOW1 "Prutok 1" -#define MSG_FLOW2 "Prutok 2" -#define MSG_CONTROL "Kontrola" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fact" -#define MSG_TEMPERATURE "Teplota" -#define MSG_MOTION "Pohyb" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "Store memory" -#define MSG_LOAD_EPROM "Ulozit pamet" -#define MSG_RESTORE_FAILSAFE "Obnovit vychozi" -#define MSG_REFRESH "\xF8" "Obnovit" -#define MSG_WATCH "Informace" -#define MSG_TUNE "Ladit" -#define MSG_PAUSE_PRINT "Pozastavit tisk" -#define MSG_RESUME_PRINT "Pokracovat" -#define MSG_STOP_PRINT "Zastavit tisk" -#define MSG_CARD_MENU "Tisk z SD" -#define MSG_NO_CARD "Zadna SD karta" -#define MSG_DWELL "Sleep..." -#define MSG_USERWAIT "Wait for user..." -#define MSG_RESUMING "Obnoveni tisku" -#define MSG_PRINT_ABORTED "Tisk prerusen" -#define MSG_NO_MOVE "No move." -#define MSG_KILLED "KILLED. " -#define MSG_STOPPED "STOPPED. " -#define MSG_FILAMENTCHANGE "Vymenit filament" -#define MSG_INIT_SDCARD "Inic. SD" -#define MSG_CNG_SDCARD "Vymenit SD" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Doladeni osy Z" -#define MSG_ADJUSTZ "Auto doladit Z ?" -#define MSG_PICK_Z "Vyberte vytisk" - -#define MSG_HOMEYZ "Kalibrovat Z" -#define MSG_HOMEYZ_PROGRESS "Kalibruji Z" -#define MSG_HOMEYZ_DONE "Kalibrace OK" - -#define MSG_SETTINGS "Nastaveni" -#define MSG_PREHEAT "Predehrev" -#define MSG_UNLOAD_FILAMENT "Vyjmout filament" -#define MSG_LOAD_FILAMENT "Zavest filament" -#define MSG_LOAD_FILAMENT_1 "Zavest filament 1" -#define MSG_LOAD_FILAMENT_2 "Zavest filament 2" -#define MSG_LOAD_FILAMENT_3 "Zavest filament 3" -#define MSG_LOAD_FILAMENT_4 "Zavest filament 4" -#define MSG_UNLOAD_FILAMENT_1 "Vyjmout filam. 1" -#define MSG_UNLOAD_FILAMENT_2 "Vyjmout filam. 2" -#define MSG_UNLOAD_FILAMENT_3 "Vyjmout filam. 3" -#define MSG_UNLOAD_FILAMENT_4 "Vyjmout filam. 4" -#define MSG_UNLOAD_ALL "Vyjmout vse" -#define MSG_LOAD_ALL "Zavest vse" - -#define MSG_RECTRACT "Rectract" -#define MSG_ERROR "CHYBA:" -#define MSG_PREHEAT_NOZZLE "Predehrejte trysku!" -#define MSG_SUPPORT "Podpora" -#define MSG_CORRECTLY "Vymena ok?" -#define MSG_YES "Ano" -#define MSG_NO "Ne" -#define MSG_NOT_LOADED "Filament nezaveden" -#define MSG_NOT_COLOR "Barva neni cista" -#define MSG_LOADING_FILAMENT "Zavadeni filamentu" -#define MSG_PLEASE_WAIT "Prosim cekejte" -#define MSG_LOADING_COLOR "Cisteni barvy" -#define MSG_CHANGE_SUCCESS "Zmena uspesna!" -#define MSG_PRESS "a stisknete tlacitko" -#define MSG_INSERT_FILAMENT "Vlozte filament" -#define MSG_CHANGING_FILAMENT "Vymena filamentu!" - -#define MSG_SILENT_MODE_ON "Mod [tichy]" -#define MSG_SILENT_MODE_OFF "Mod [vys. vykon]" -#define MSG_REBOOT "Restartujte tiskarnu" -#define MSG_TAKE_EFFECT " pro projeveni zmen" - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Last Updated: " -#define MSG_FREE_MEMORY " Free Memory: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define MSG_BEGIN_FILE_LIST "Begin file list" -#define MSG_END_FILE_LIST "End file list" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_HEATING "Zahrivani" -#define MSG_HEATING_COMPLETE "Zahrivani OK." -#define MSG_BED_HEATING "Zahrivani bed" -#define MSG_BED_DONE "Bed OK." -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Printer halted. kill() called!" -#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Reporting endstop status" -#define MSG_ENDSTOP_HIT "TRIGGERED" -#define MSG_ENDSTOP_OPEN "open" - -#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "File opened: " -#define MSG_SD_FILE_SELECTED "File selected" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Not SD printing" -#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" -#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " - -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Dostavovani Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" - -#define MSG_LANGUAGE_NAME "Cestina" -#define MSG_LANGUAGE_SELECT "Vyber jazyka" - #define MSG_PRUSA3D "prusa3d.cz" - #define MSG_PRUSA3D_FORUM "forum.prusa3d.cz" - #define MSG_PRUSA3D_HOWTO "howto.prusa3d.cz" - -#define MSG_HOMEYZ "Kalibrovat Z" -#define MSG_HOMEYZ_PROGRESS "Kalibruji Z" -#define MSG_HOMEYZ_DONE "Kalibrace OK" - -#define MSG_SELFTEST_ERROR "Selftest error !" -#define MSG_SELFTEST_PLEASECHECK "Zkontrolujte :" -#define MSG_SELFTEST_NOTCONNECTED "Nezapojeno " -#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" -#define MSG_SELFTEST_BEDHEATER "Bed / Heater" -#define MSG_SELFTEST_WIRINGERROR "Chyba zapojeni" -#define MSG_SELFTEST_ENDSTOPS "Endstops" -#define MSG_SELFTEST_MOTOR "Motor" -#define MSG_SELFTEST_ENDSTOP "Endstop" -#define MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" -#define MSG_SELFTEST_OK "Self test OK" - -#define(length=20) MSG_SELFTEST_FAN "Test ventilatoru"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Predni tiskovy vent?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Levy vent na trysce?"; -#define MSG_SELFTEST_FAN_YES "Toci se"; -#define MSG_SELFTEST_FAN_NO "Netoci se"; - -#define MSG_STATS_TOTALFILAMENT "Filament celkem :" -#define MSG_STATS_TOTALPRINTTIME "Celkovy cas :" -#define MSG_STATS_FILAMENTUSED "Filament : " -#define MSG_STATS_PRINTTIME "Cas tisku : " - -#define MSG_SELFTEST_START "Self test start " -#define MSG_SELFTEST_CHECK_ENDSTOPS "Kontrola endstops" -#define MSG_SELFTEST_CHECK_HOTEND "Kontrola hotend " -#define MSG_SELFTEST_CHECK_X "Kontrola X axis " -#define MSG_SELFTEST_CHECK_Y "Kontrola Y axis " -#define MSG_SELFTEST_CHECK_Z "Kontrola Z axis " -#define MSG_SELFTEST_CHECK_BED "Kontrola bed " -#define MSG_SELFTEST_CHECK_ALLCORRECT "Vse OK " -#define MSG_SELFTEST "Selftest " -#define MSG_SELFTEST_FAILED "Selftest selhal " - -#define MSG_STATISTICS "Statistika " -#define MSG_USB_PRINTING "Tisk z USB " - -#define MSG_SHOW_END_STOPS "Stav konc. spin." -#define MSG_CALIBRATE_BED "Kalibrace XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset XYZ kalibr." - -#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibrace XYZ. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem." -#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem." - -#define MSG_CONFIRM_NOZZLE_CLEAN "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem." -#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Dojely oba Z voziky k~hornimu dorazu?" - -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Hledam kalibracni bod podlozky" -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " z 4" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Zlepsuji presnost kalibracniho bodu" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " z 9" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Merim referencni vysku kalibracniho bodu" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " z 9" -#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iterace " - -#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen." -#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Kalibrace XYZ selhala. Nahlednete do manualu." -#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Kalibrace XYZ nepresna. Levy predni bod moc vpredu." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu." - -#define MSG_BED_LEVELING_FAILED_POINT_LOW "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset." -#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset." -#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset." - -#define MSG_NEW_FIRMWARE_AVAILABLE "Vysla nova verze firmware:" -#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Prosim aktualizujte." -#define MSG_FOLLOW_CALIBRATION_FLOW "Tiskarna nebyla jeste zkalibrovana. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Postup kalibrace." -#define MSG_BABYSTEP_Z_NOT_SET "Neni zkalibrovana vzdalenost trysky od tiskove podlozky. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy." - -#define MSG_BED_CORRECTION_MENU "Korekce podlozky" -#define MSG_BED_CORRECTION_LEFT "Vlevo [um]" -#define MSG_BED_CORRECTION_RIGHT "Vpravo [um]" -#define MSG_BED_CORRECTION_FRONT "Vpredu [um]" -#define MSG_BED_CORRECTION_REAR "Vzadu [um]" -#define MSG_BED_CORRECTION_RESET "Reset" - -#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Kalibrace" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" - -#define MSG_LOOSE_PULLEY "Uvolnena remenicka" -#define MSG_FILAMENT_LOADING_T0 "Vlozte filament do extruderu 1. Potvrdte tlacitkem." -#define MSG_FILAMENT_LOADING_T1 "Vlozte filament do extruderu 2. Potvrdte tlacitkem." -#define MSG_FILAMENT_LOADING_T2 "Vlozte filament do extruderu 3. Potvrdte tlacitkem." -#define MSG_FILAMENT_LOADING_T3 "Vlozte filament do extruderu 4. Potvrdte tlacitkem." -#define MSG_CHANGE_EXTR "Zmenit extruder" - -#define MSG_FIL_ADJUSTING "Probiha srovnani filamentu. Prosim cekejte." -#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamenty jsou srovnany. Pro uspesnou kalibraci prosim ocistete trysku. Po te potvrdte tlacitkem." -#define MSG_CALIBRATE_E "Kalibrovat E" -#define MSG_E_CAL_KNOB "Otacejte tlacitkem dokud znacka nedosahne tela extruderu. Potvrdte tlacitkem." -#define MSG_MARK_FIL "Oznacte filament 100 mm od tela extruderu a po te potvrdte tlacitkem." -#define MSG_CLEAN_NOZZLE_E "E kalibrace ukoncena. Prosim ocistete trysku. Po te potvrdte tlacitkem." -#define MSG_WAITING_TEMP "Cekani na zchladnuti trysky a podlozky." -#define MSG_FILAMENT_CLEAN "Je barva cista?" -#define MSG_UNLOADING_FILAMENT "Vysouvam filament" - -#define MSG_PAPER "Umistete list papiru na podlozku a udrzujte jej pod tryskou behem mereni prvnich 4 bodu. Pokud tryska zachyti papir, vypnete tiskarnu." - -#define MSG_FINISHING_MOVEMENTS "Dokoncovani pohybu" -#define MSG_PRINT_PAUSED "Tisk pozastaven" -#define MSG_RESUMING_PRINT "Obnovovani tisku" -#define MSG_PID_EXTRUDER "PID kalibrace" -#define MSG_SET_TEMPERATURE "Nastavte teplotu:" -#define MSG_PID_FINISHED "PID kal. ukoncena" -#define MSG_PID_RUNNING "PID kal. " - -#define MSG_CALIBRATE_PINDA "Zkalibrovat" -#define MSG_CALIBRATION_PINDA_MENU "Teplot. kalibrace" -#define MSG_PINDA_NOT_CALIBRATED "Tiskarna nebyla teplotne zkalibrovana" -#define MSG_PINDA_PREHEAT "Nahrivani PINDA" -#define MSG_TEMP_CALIBRATION "Tepl. kal. " -#define MSG_TEMP_CALIBRATION_DONE "Teplotni kalibrace dokoncena. Pokracujte stiskem tlacitka." -#define MSG_TEMP_CALIBRATION_ON "Tepl. kal. [ON]" -#define MSG_TEMP_CALIBRATION_OFF "Tepl. kal. [OFF]" -#define MSG_PREPARE_FILAMENT "Pripravte filament" -#define MSG_ALL "Vse" -#define MSG_USED "Pouzite behem tisku" -#define MSG_CURRENT "Pouze aktualni" -#define MSG_CHOOSE_EXTRUDER "Vyberte extruder:" -#define MSG_EXTRUDER "Extruder" -#define MSG_EXTRUDER_1 "Extruder 1" -#define MSG_EXTRUDER_2 "Extruder 2" -#define MSG_EXTRUDER_3 "Extruder 3" -#define MSG_EXTRUDER_4 "Extruder 4" -#define MSG_DATE "Datum:" -#define MSG_XYZ_DETAILS "Detaily XYZ kal." -#define MSG_Y_DISTANCE_FROM_MIN "Y vzdalenost od min:" -#define MSG_LEFT "Levy:" -#define MSG_CENTER "Stred:" -#define MSG_RIGHT "Pravy:" -#define MSG_MEASURED_SKEW "Merene zkoseni:" -#define MSG_SLIGHT_SKEW "Lehke zkoseni:" +/** + * English + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ +#define WELCOME_MSG CUSTOM_MENDEL_NAME " ok" +#define MSG_SD_INSERTED "Karta vlozena" +#define MSG_SD_REMOVED "Karta vyjmuta" +#define MSG_MAIN "Hlavni nabidka" +#define MSG_DISABLE_STEPPERS "Vypnout motory" +#define MSG_AUTO_HOME "Auto home" +#define MSG_SET_HOME_OFFSETS "Nastav pocatek home" +#define MSG_SET_ORIGIN "Nastav pocatek" +#define MSG_COOLDOWN "Zchladit" +#define MSG_SWITCH_PS_ON "Vypnout zdroj" +#define MSG_SWITCH_PS_OFF "Zapnout zdroj" +#define MSG_MOVE_AXIS "Posunout osu" +#define MSG_MOVE_X "Posunout X" +#define MSG_MOVE_Y "Posunout Y" +#define MSG_MOVE_Z "Posunout Z" +#define MSG_MOVE_E "Extruder" +#define MSG_SPEED "Rychlost" +#define MSG_NOZZLE "Tryska" +#define MSG_NOZZLE1 "Tryska2" +#define MSG_NOZZLE2 "Tryska3" +#define MSG_BED "Bed" +#define MSG_FAN_SPEED "Rychlost vent." +#define MSG_FLOW "Prutok" +#define MSG_FLOW0 "Prutok 0" +#define MSG_FLOW1 "Prutok 1" +#define MSG_FLOW2 "Prutok 2" +#define MSG_CONTROL "Kontrola" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fact" +#define MSG_TEMPERATURE "Teplota" +#define MSG_MOTION "Pohyb" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "Store memory" +#define MSG_LOAD_EPROM "Ulozit pamet" +#define MSG_RESTORE_FAILSAFE "Obnovit vychozi" +#define MSG_REFRESH "\xF8" "Obnovit" +#define MSG_WATCH "Informace" +#define MSG_TUNE "Ladit" +#define MSG_PAUSE_PRINT "Pozastavit tisk" +#define MSG_RESUME_PRINT "Pokracovat" +#define MSG_STOP_PRINT "Zastavit tisk" +#define MSG_CARD_MENU "Tisk z SD" +#define MSG_NO_CARD "Zadna SD karta" +#define MSG_DWELL "Sleep..." +#define MSG_USERWAIT "Wait for user..." +#define MSG_RESUMING "Obnoveni tisku" +#define MSG_PRINT_ABORTED "Tisk prerusen" +#define MSG_NO_MOVE "No move." +#define MSG_KILLED "KILLED. " +#define MSG_STOPPED "STOPPED. " +#define MSG_FILAMENTCHANGE "Vymenit filament" +#define MSG_INIT_SDCARD "Inic. SD" +#define MSG_CNG_SDCARD "Vymenit SD" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_BABYSTEP_Z "Doladeni osy Z" +#define MSG_ADJUSTZ "Auto doladit Z ?" +#define MSG_PICK_Z "Vyberte vytisk" + +#define MSG_HOMEYZ "Kalibrovat Z" +#define MSG_HOMEYZ_PROGRESS "Kalibruji Z" +#define MSG_HOMEYZ_DONE "Kalibrace OK" + +#define MSG_SETTINGS "Nastaveni" +#define MSG_PREHEAT "Predehrev" +#define MSG_UNLOAD_FILAMENT "Vyjmout filament" +#define MSG_LOAD_FILAMENT "Zavest filament" +#define MSG_LOAD_FILAMENT_1 "Zavest filament 1" +#define MSG_LOAD_FILAMENT_2 "Zavest filament 2" +#define MSG_LOAD_FILAMENT_3 "Zavest filament 3" +#define MSG_LOAD_FILAMENT_4 "Zavest filament 4" +#define MSG_UNLOAD_FILAMENT_1 "Vyjmout filam. 1" +#define MSG_UNLOAD_FILAMENT_2 "Vyjmout filam. 2" +#define MSG_UNLOAD_FILAMENT_3 "Vyjmout filam. 3" +#define MSG_UNLOAD_FILAMENT_4 "Vyjmout filam. 4" +#define MSG_UNLOAD_ALL "Vyjmout vse" +#define MSG_LOAD_ALL "Zavest vse" + +#define MSG_RECTRACT "Rectract" +#define MSG_ERROR "CHYBA:" +#define MSG_PREHEAT_NOZZLE "Predehrejte trysku!" +#define MSG_SUPPORT "Podpora" +#define MSG_CORRECTLY "Vymena ok?" +#define MSG_YES "Ano" +#define MSG_NO "Ne" +#define MSG_NOT_LOADED "Filament nezaveden" +#define MSG_NOT_COLOR "Barva neni cista" +#define MSG_LOADING_FILAMENT "Zavadeni filamentu" +#define MSG_PLEASE_WAIT "Prosim cekejte" +#define MSG_LOADING_COLOR "Cisteni barvy" +#define MSG_CHANGE_SUCCESS "Zmena uspesna!" +#define MSG_PRESS "a stisknete tlacitko" +#define MSG_INSERT_FILAMENT "Vlozte filament" +#define MSG_CHANGING_FILAMENT "Vymena filamentu!" + +#define MSG_SILENT_MODE_ON "Mod [tichy]" +#define MSG_SILENT_MODE_OFF "Mod [vys. vykon]" +#define MSG_REBOOT "Restartujte tiskarnu" +#define MSG_TAKE_EFFECT " pro projeveni zmen" + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Last Updated: " +#define MSG_FREE_MEMORY " Free Memory: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " +#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " +#define MSG_BEGIN_FILE_LIST "Begin file list" +#define MSG_END_FILE_LIST "End file list" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_HEATING "Zahrivani" +#define MSG_HEATING_COMPLETE "Zahrivani OK." +#define MSG_BED_HEATING "Zahrivani bed" +#define MSG_BED_DONE "Bed OK." +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Printer halted. kill() called!" +#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Reporting endstop status" +#define MSG_ENDSTOP_HIT "TRIGGERED" +#define MSG_ENDSTOP_OPEN "open" + +#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "File opened: " +#define MSG_SD_FILE_SELECTED "File selected" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Not SD printing" +#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" +#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " + +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Dostavovani Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" + +#define MSG_LANGUAGE_NAME "Cestina" +#define MSG_LANGUAGE_SELECT "Vyber jazyka" + #define MSG_PRUSA3D "prusa3d.cz" + #define MSG_PRUSA3D_FORUM "forum.prusa3d.cz" + #define MSG_PRUSA3D_HOWTO "howto.prusa3d.cz" + +#define MSG_HOMEYZ "Kalibrovat Z" +#define MSG_HOMEYZ_PROGRESS "Kalibruji Z" +#define MSG_HOMEYZ_DONE "Kalibrace OK" + +#define MSG_SELFTEST_ERROR "Selftest error !" +#define MSG_SELFTEST_PLEASECHECK "Zkontrolujte :" +#define MSG_SELFTEST_NOTCONNECTED "Nezapojeno " +#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" +#define MSG_SELFTEST_BEDHEATER "Bed / Heater" +#define MSG_SELFTEST_WIRINGERROR "Chyba zapojeni" +#define MSG_SELFTEST_ENDSTOPS "Endstops" +#define MSG_SELFTEST_MOTOR "Motor" +#define MSG_SELFTEST_ENDSTOP "Endstop" +#define MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" +#define MSG_SELFTEST_OK "Self test OK" + +#define(length=20) MSG_SELFTEST_FAN "Test ventilatoru"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Predni tiskovy vent?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Levy vent na trysce?"; +#define MSG_SELFTEST_FAN_YES "Toci se"; +#define MSG_SELFTEST_FAN_NO "Netoci se"; + +#define MSG_STATS_TOTALFILAMENT "Filament celkem :" +#define MSG_STATS_TOTALPRINTTIME "Celkovy cas :" +#define MSG_STATS_FILAMENTUSED "Filament : " +#define MSG_STATS_PRINTTIME "Cas tisku : " + +#define MSG_SELFTEST_START "Self test start " +#define MSG_SELFTEST_CHECK_ENDSTOPS "Kontrola endstops" +#define MSG_SELFTEST_CHECK_HOTEND "Kontrola hotend " +#define MSG_SELFTEST_CHECK_X "Kontrola X axis " +#define MSG_SELFTEST_CHECK_Y "Kontrola Y axis " +#define MSG_SELFTEST_CHECK_Z "Kontrola Z axis " +#define MSG_SELFTEST_CHECK_BED "Kontrola bed " +#define MSG_SELFTEST_CHECK_ALLCORRECT "Vse OK " +#define MSG_SELFTEST "Selftest " +#define MSG_SELFTEST_FAILED "Selftest selhal " + +#define MSG_STATISTICS "Statistika " +#define MSG_USB_PRINTING "Tisk z USB " + +#define MSG_SHOW_END_STOPS "Stav konc. spin." +#define MSG_CALIBRATE_BED "Kalibrace XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset XYZ kalibr." + +#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibrace XYZ. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibrace Z. Otacenim tlacitka posunte Z osu az k~hornimu dorazu. Potvrdte tlacitkem." + +#define MSG_CONFIRM_NOZZLE_CLEAN "Pro uspesnou kalibraci ocistete prosim tiskovou trysku. Potvrdte tlacitkem." +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Dojely oba Z voziky k~hornimu dorazu?" + +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Hledam kalibracni bod podlozky" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " z 4" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Zlepsuji presnost kalibracniho bodu" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " z 9" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Merim referencni vysku kalibracniho bodu" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " z 9" +#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iterace " + +#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Kalibrace XYZ selhala. Kalibracni bod podlozky nenalezen." +#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Kalibrace XYZ selhala. Nahlednete do manualu." +#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Kalibrace XYZ v poradku. X/Y osy jsou kolme. Gratuluji!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Kalibrace XYZ v poradku. X/Y osy mirne zkosene. Dobra prace!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Kalibrace XYZ v poradku. Zkoseni bude automaticky vyrovnano pri tisku." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Kalibrace XYZ selhala. Levy predni bod moc vpredu. Srovnejte tiskarnu." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Kalibrace XYZ selhala. Pravy predni bod moc vpredu. Srovnejte tiskarnu." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Kalibrace XYZ selhala. Predni kalibracni body moc vpredu. Srovnejte tiskarnu." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Kalibrace XYZ nepresna. Levy predni bod moc vpredu." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Kalibrace XYZ nepresna. Pravy predni bod moc vpredu." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Kalibrace XYZ nepresna. Predni kalibracni body moc vpredu." + +#define MSG_BED_LEVELING_FAILED_POINT_LOW "Kalibrace Z selhala. Sensor nesepnul. Znecistena tryska? Cekam na reset." +#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Kalibrace Z selhala. Sensor sepnul prilis vysoko. Cekam na reset." +#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Kalibrace Z selhala. Sensor je odpojeny nebo preruseny kabel. Cekam na reset." + +#define MSG_NEW_FIRMWARE_AVAILABLE "Vysla nova verze firmware:" +#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Prosim aktualizujte." +#define MSG_FOLLOW_CALIBRATION_FLOW "Tiskarna nebyla jeste zkalibrovana. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Postup kalibrace." +#define MSG_BABYSTEP_Z_NOT_SET "Neni zkalibrovana vzdalenost trysky od tiskove podlozky. Postupujte prosim podle manualu, kapitola Zaciname, odstavec Nastaveni prvni vrstvy." + +#define MSG_BED_CORRECTION_MENU "Korekce podlozky" +#define MSG_BED_CORRECTION_LEFT "Vlevo [um]" +#define MSG_BED_CORRECTION_RIGHT "Vpravo [um]" +#define MSG_BED_CORRECTION_FRONT "Vpredu [um]" +#define MSG_BED_CORRECTION_REAR "Vzadu [um]" +#define MSG_BED_CORRECTION_RESET "Reset" + +#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Kalibrace" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" + +#define MSG_LOOSE_PULLEY "Uvolnena remenicka" +#define MSG_FILAMENT_LOADING_T0 "Vlozte filament do extruderu 1. Potvrdte tlacitkem." +#define MSG_FILAMENT_LOADING_T1 "Vlozte filament do extruderu 2. Potvrdte tlacitkem." +#define MSG_FILAMENT_LOADING_T2 "Vlozte filament do extruderu 3. Potvrdte tlacitkem." +#define MSG_FILAMENT_LOADING_T3 "Vlozte filament do extruderu 4. Potvrdte tlacitkem." +#define MSG_CHANGE_EXTR "Zmenit extruder" + +#define MSG_FIL_ADJUSTING "Probiha srovnani filamentu. Prosim cekejte." +#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamenty jsou srovnany. Pro uspesnou kalibraci prosim ocistete trysku. Po te potvrdte tlacitkem." +#define MSG_CALIBRATE_E "Kalibrovat E" +#define MSG_E_CAL_KNOB "Otacejte tlacitkem dokud znacka nedosahne tela extruderu. Potvrdte tlacitkem." +#define MSG_MARK_FIL "Oznacte filament 100 mm od tela extruderu a po te potvrdte tlacitkem." +#define MSG_CLEAN_NOZZLE_E "E kalibrace ukoncena. Prosim ocistete trysku. Po te potvrdte tlacitkem." +#define MSG_WAITING_TEMP "Cekani na zchladnuti trysky a podlozky." +#define MSG_FILAMENT_CLEAN "Je barva cista?" +#define MSG_UNLOADING_FILAMENT "Vysouvam filament" + +#define MSG_PAPER "Umistete list papiru na podlozku a udrzujte jej pod tryskou behem mereni prvnich 4 bodu. Pokud tryska zachyti papir, vypnete tiskarnu." + +#define MSG_FINISHING_MOVEMENTS "Dokoncovani pohybu" +#define MSG_PRINT_PAUSED "Tisk pozastaven" +#define MSG_RESUMING_PRINT "Obnovovani tisku" +#define MSG_PID_EXTRUDER "PID kalibrace" +#define MSG_SET_TEMPERATURE "Nastavte teplotu:" +#define MSG_PID_FINISHED "PID kal. ukoncena" +#define MSG_PID_RUNNING "PID kal. " + +#define MSG_CALIBRATE_PINDA "Zkalibrovat" +#define MSG_CALIBRATION_PINDA_MENU "Teplot. kalibrace" +#define MSG_PINDA_NOT_CALIBRATED "Tiskarna nebyla teplotne zkalibrovana" +#define MSG_PINDA_PREHEAT "Nahrivani PINDA" +#define MSG_TEMP_CALIBRATION "Tepl. kal. " +#define MSG_TEMP_CALIBRATION_DONE "Teplotni kalibrace dokoncena. Pokracujte stiskem tlacitka." +#define MSG_TEMP_CALIBRATION_ON "Tepl. kal. [ON]" +#define MSG_TEMP_CALIBRATION_OFF "Tepl. kal. [OFF]" +#define MSG_PREPARE_FILAMENT "Pripravte filament" +#define MSG_ALL "Vse" +#define MSG_USED "Pouzite behem tisku" +#define MSG_CURRENT "Pouze aktualni" +#define MSG_CHOOSE_EXTRUDER "Vyberte extruder:" +#define MSG_EXTRUDER "Extruder" +#define MSG_EXTRUDER_1 "Extruder 1" +#define MSG_EXTRUDER_2 "Extruder 2" +#define MSG_EXTRUDER_3 "Extruder 3" +#define MSG_EXTRUDER_4 "Extruder 4" +#define MSG_DATE "Datum:" +#define MSG_XYZ_DETAILS "Detaily XYZ kal." +#define MSG_Y_DISTANCE_FROM_MIN "Y vzdalenost od min:" +#define MSG_LEFT "Levy:" +#define MSG_CENTER "Stred:" +#define MSG_RIGHT "Pravy:" +#define MSG_MEASURED_SKEW "Merene zkoseni:" +#define MSG_SLIGHT_SKEW "Lehke zkoseni:" #define MSG_SEVERE_SKEW "Tezke zkoseni:" \ No newline at end of file diff --git a/Firmware/language_de.h b/Firmware/language_de.h index 3083bc17d..b528ca1b0 100644 --- a/Firmware/language_de.h +++ b/Firmware/language_de.h @@ -1,327 +1,327 @@ -/** - * German - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ - - #define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " bereit." -#define MSG_SD_INSERTED "SD Karte eingesetzt" -#define MSG_SD_REMOVED "SD Karte entfernt" -#define MSG_MAIN "Hauptmenue" -#define(length=20) MSG_DISABLE_STEPPERS "Motoren aus" -#define MSG_AUTO_HOME "Startposition" -#define MSG_SET_HOME_OFFSETS "Setze Homeversatz" -#define MSG_SET_ORIGIN "Setze Nullpunkt" -#define MSG_COOLDOWN "Abkuehlen" -#define MSG_SWITCH_PS_ON "Netzteil EIN" -#define MSG_SWITCH_PS_OFF "Netzteil AUS" -#define MSG_MOVE_AXIS "Bewege Achse" -#define MSG_MOVE_X "Bewege X" -#define MSG_MOVE_Y "Bewege Y" -#define MSG_MOVE_Z "Bewege Z" -#define MSG_MOVE_E "Extruder" -#define MSG_SPEED "Geschwindigkeit" -#define MSG_NOZZLE "Duese" -#define MSG_NOZZLE1 "Duese2" -#define MSG_NOZZLE2 "Duese3" -#define MSG_BED "Bett" -#define(length=20) MSG_FAN_SPEED "Luefter-Tempo" -#define MSG_FLOW "Durchfluss" -#define MSG_FLOW0 "Durchfluss 0" -#define MSG_FLOW1 "Durchfluss 1" -#define MSG_FLOW2 "Durchfluss 2" -#define MSG_CONTROL "Einstellungen" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fakt" -#define MSG_TEMPERATURE "Temperatur" -#define MSG_MOTION "Bewegung" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "EPROM speichern" -#define MSG_LOAD_EPROM "EPROM laden" -#define MSG_RESTORE_FAILSAFE "Standardkonfiguration" -#define MSG_REFRESH "Aktualisieren" -#define MSG_WATCH "Information" -#define MSG_TUNE "Feineinstellung" -#define MSG_PAUSE_PRINT "Pause" -#define MSG_RESUME_PRINT "Fortsetzen" -#define MSG_STOP_PRINT "Druck abbrechen" -#define MSG_CARD_MENU "Drucken von SD" -#define MSG_NO_CARD "Keine SD Karte" -#define MSG_DWELL "Warten..." -#define(length=20) MSG_USERWAIT "Warte auf Nutzer..." -#define(length=20) MSG_RESUMING "Druck fortgesetzt" -#define(length=20) MSG_PRINT_ABORTED "Druck abgebrochen" -#define MSG_NO_MOVE "Keine Bewegung." -#define(length=20) MSG_KILLED "ABGEBROCHEN. " -#define MSG_STOPPED "GESTOPPT. " -#define MSG_FILAMENTCHANGE "Filament-Wechsel" -#define MSG_INIT_SDCARD "SD erkennen" -#define MSG_CNG_SDCARD "SD Karte wechsel" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Live Z einstellen" -#define(length=20) MSG_ADJUSTZ "Auto Z einstellen?" -#define(length=20) MSG_PICK_Z "Waehle Druck" - -#define MSG_SETTINGS "Einstellungen" -#define MSG_PREHEAT "Vorheizen" -#define MSG_UNLOAD_FILAMENT "Filament entnehmen" -#define MSG_LOAD_FILAMENT "Filament laden" -#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" -#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" -#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" -#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" -#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filament 1 entnehmen" -#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filament 2 entnehmen" -#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filament 3 entnehmen" -#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filament 4 entnehmen" -#define(length=20) MSG_UNLOAD_ALL "Alle entnehmen" -#define(length=20) MSG_LOAD_ALL "Alle laden" - -#define MSG_RECTRACT "Rectract" -#define MSG_ERROR "FEHLER:" -#define(length=20) MSG_PREHEAT_NOZZLE "Duese vorheizen!" -#define MSG_SUPPORT "Support" -#define(length=20) MSG_CORRECTLY "Wechsel ok?" -#define MSG_YES "Ja" -#define MSG_NO "Nein" -#define(length=20) MSG_NOT_LOADED "Fil. nicht geladen" -#define(length=20) MSG_NOT_COLOR "Farbe nicht klar." -#define(length=20) MSG_LOADING_FILAMENT "Filament laedt" -#define(length=20) MSG_PLEASE_WAIT "Bitte warten" -#define MSG_LOADING_COLOR "Lade Farbe" -#define(length=20) MSG_CHANGE_SUCCESS "Wechsel erfolgreich!" -#define(length=20) MSG_PRESS "und Knopf druecken" -#define(length=20) MSG_INSERT_FILAMENT "Filament einlegen" -#define(length=20) MSG_CHANGING_FILAMENT "Filament-Wechsel!" - - -#define MSG_SILENT_MODE_ON "Mode [leise]" -#define MSG_SILENT_MODE_OFF "Mode [Hohe Leist]" -#define(length=20) MSG_REBOOT "Reboot den Drucker" -#define(length=20, lines=2) MSG_TAKE_EFFECT " um wirksam zu werden" - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Letzes Updated: " -#define MSG_FREE_MEMORY " Freier Speicher: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "Checksum Fehler, Letzte Zeile: " -#define MSG_ERR_NO_CHECKSUM "Keine Checksum mit Zeilennummer, Letzte Zeile: " -#define MSG_BEGIN_FILE_LIST "Beginn Dateiliste" -#define MSG_END_FILE_LIST "Ende Dateiliste" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define(length=38) MSG_ERR_NO_THERMISTORS "Keine Temp.sensoren - keine Temperatur" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_HEATING "Aufheizen" -#define(length=20) MSG_HEATING_COMPLETE "Aufgeheizen klar." -#define MSG_BED_HEATING "Bett aufheizen" -#define MSG_BED_DONE "Bett OK" -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Drucker gestoppt. kill() aufgerufen!" -#define MSG_ERR_STOPPED "Der Drucker wurde aufgrund von Fehlern gestoppt. Beheben Sie den Fehler und verwenden Sie M999, um neu zu starten. (Temperatur wird reset. Stellen Sie es nach dem Neustart ein)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Endstop status anzeigen" -#define MSG_ENDSTOP_HIT "AUSGELOEST" -#define MSG_ENDSTOP_OPEN "offen" - -#define MSG_SD_CANT_OPEN_SUBDIR "Kann Unterverz. nicht oeffnen" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "Datei geoefffnet: " -#define MSG_SD_FILE_SELECTED "Datei ausgewaehlt" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Kein SD Druck" -#define MSG_SD_ERR_WRITE_TO_FILE "Fehler beim Schreiben in Datei" -#define MSG_SD_CANT_ENTER_SUBDIR "Kann nicht ins Unterverz.:" - -#define MSG_STEPPER_TOO_HIGH "Steprate too high:" -#define MSG_ENDSTOPS_HIT "endstops hit:" -#define MSG_ERR_COLD_EXTRUDE_STOP " kalte Extrusion verhindert" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Einstellen Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" - -#define MSG_LANGUAGE_NAME "Deutsch" -#define MSG_LANGUAGE_SELECT "Waehle Sprache" - -#define MSG_PRUSA3D "prusa3d.com" -#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" -#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" - -#define(length=20) MSG_SELFTEST_ERROR "Selbsttest Fehler !" -#define MSG_SELFTEST_PLEASECHECK "Bitte pruefe:" -#define(length=20) MSG_SELFTEST_NOTCONNECTED "Nicht angeschlossen" -#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" -#define MSG_SELFTEST_BEDHEATER "Bett / Heater" -#define(length=20) MSG_SELFTEST_WIRINGERROR "Verdrahtungsfehler" -#define MSG_SELFTEST_ENDSTOPS "Endschalter" -#define MSG_SELFTEST_MOTOR "Motor" -#define MSG_SELFTEST_ENDSTOP "Endstop" -#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endsch. n. erreicht" -#define MSG_SELFTEST_OK "Selbsttest OK" -#define(length=20) MSG_LOOSE_PULLEY "Loser pulley" - -#define MSG_SELFTEST_FAN "Lueftertest"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Vorderer Luefter?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Linker Luefter?"; -#define MSG_SELFTEST_FAN_YES "Dreht"; -#define(length=20) MSG_SELFTEST_FAN_NO "Dreht nicht"; - -#define(length=20) MSG_STATS_TOTALFILAMENT "Filament Gesamt:" -#define(length=20) MSG_STATS_TOTALPRINTTIME "Totale Druckzeit:" -#define(length=20) MSG_STATS_FILAMENTUSED "Filamentverbrauch:" -#define(length=20) MSG_STATS_PRINTTIME "Druckzeit: " -#define(length=20) MSG_SELFTEST_START "Selbsttest start " -#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Pruefe Endschalter " -#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Pruefe Hotend " -#define(length=20) MSG_SELFTEST_CHECK_X "Pruefe X Achse " -#define(length=20) MSG_SELFTEST_CHECK_Y "Pruefe Y Achse " -#define(length=20) MSG_SELFTEST_CHECK_Z "Pruefe Z Achse " -#define(length=20) MSG_SELFTEST_CHECK_BED "Pruefe Bett " -#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "Alles richtig " -#define MSG_SELFTEST "Selbsttest " -#define(length=20) MSG_SELFTEST_FAILED "Selbsttest misluekt" -#define MSG_STATISTICS "Statistiken " -#define MSG_USB_PRINTING "USB drucken " -#define MSG_HOMEYZ "Kalibrieren Z" -#define MSG_HOMEYZ_PROGRESS "Kalibriere Z" -#define MSG_HOMEYZ_DONE "Kalibrierung OK" - -#define MSG_SHOW_END_STOPS "Anzeigen Enschalter" -#define MSG_CALIBRATE_BED "Kalibrierung XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset XYZ Kalibr." - -#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibrieren von XYZ. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind." -#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibrieren von Z. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind." - -#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber." -#define(length=20, lines=8) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Sind beide Z Schlitten ganz oben?" - -#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Suche Bett Kalibrierpunkt" -#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " von 4" -#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Genauigkeit verbessern bei Kalibrierpunkt" -#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " von 9" -#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Messen der Referenzhoehe des Kalibrierpunktes" -#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " von 9" -#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Wiederholung " - -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander. Glueckwunsch!" -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ-Kalibrierung ok. X/Y-Achsen sind etwas schief. Schiefheit wird automatisch korrigiert. Gut gemacht!" -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ-Kalibrierung ok. X/Y-Achsen sind sehr schief. Schiefheit wird automatisch korrigiert." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ-Kalibrierung fehlgeschlagen. Linker voderer Kalibrierpunkt nicht erreichbar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt nicht erreichbar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ-Kalibrierung ungenau. Linker vorderer Kalibrierpunkt nicht erreichbar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ-Kalibrierung ungenau. Rechter vorderer Kalibrierpunkt nicht erreichbar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ-Kalibrierung ungenau. Vordere Kalibrierpunkte nicht erreichbar." - -#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bett-Nivellierung fehlgeschlagen. Sensor wurde nicht ausgeloest. Schmutzige Duese? Warte auf Reset." -#define(length=20, lines=5) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bett-Nivellierung fehlgeschlagen. Sensor wurde zu hoch ausgeloest. Warte auf Reset." -#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bett-Nivellierung fehlgeschlagen. Sensor nicht angeschlossen oder Kabel defekt. Warte auf Reset." - -#define(length=20, lines=2) MSG_NEW_FIRMWARE_AVAILABLE "Neue Firmware Version verfuegbar:" -#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Bitte aktualisieren." - -#define(length=20, lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Der Drucker wurde noch nicht kalibriert. Bitte folgen Sie dem Handbuch, Kapitel First steps, Abschnitt Calibration flow." -#define(length=20, lines=12) MSG_BABYSTEP_Z_NOT_SET "Der Abstand zwischen der Spitze der Duese und der Druckoberflaeche / Bett ist noch nicht eingestellt. Bitte folgen Sie dem Handbuch, First steps, Abschnitt First layer calibration." - -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Filament in extruder 1 einlegen. Klicken wenn fertig." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Filament in extruder 2 einlegen. Klicken wenn fertig." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Filament in extruder 3 einlegen. Klicken wenn fertig." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Filament in extruder 4 einlegen. Klicken wenn fertig." -#define(length=20, lines=1) MSG_CHANGE_EXTR "Wechsel extruder" - -#define(length=20, lines=4) MSG_FIL_ADJUSTING "Einstellen Filament. Bitte warten." -#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamente sind jetzt eingestellt. Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber." -#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" -#define(length=20, lines=1) MSG_CALIBRATE_E "Kalibriere E" -//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." -#define(length=20, lines=8) MSG_E_CAL_KNOB "Knopf drehen bis die Filamentmarkierung erreicht ist. Klicken wenn fertig." - -//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" -#define(length=20, lines=8) MSG_MARK_FIL "Filament 100mm vom Extrudergehaeuse markieren. Klicken wenn Fertig." -#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E-Kalibrierung beendet. Bitte reinigen Sie die Duese. Klicken wenn fertig." -#define(length=20, lines=3) MSG_WAITING_TEMP "Warten auf Abkuehlung von Duese und Bett." -#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Ist Farbe rein?" -#define(length=20) MSG_UNLOADING_FILAMENT "Filament auswerfen" -#define(length=20, lines=10) MSG_PAPER "Lege waehrend der Kalibrierung der ersten 4 Punkte ein Blatt Papier unter die Duese. Wenn die Duese das Papier bewegt, Drucker sofort ausschalten!" - -#define(length=20) MSG_BED_CORRECTION_MENU "Bett level korrekt" -#define MSG_BED_CORRECTION_LEFT "Links [um]" -#define MSG_BED_CORRECTION_RIGHT "Rechts [um]" -#define MSG_BED_CORRECTION_FRONT "Vorne [um]" -#define MSG_BED_CORRECTION_REAR "Hinten [um]" -#define MSG_BED_CORRECTION_RESET "Zuruecksetzen" - -#define(length=20) MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Kalibrierung" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD Karte [normal]" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD Karte [FlshAir]" -#define(length=20) MSG_PRINTER_DISCONNECTED "Drucker getrent" -#define(length=20) MSG_FINISHING_MOVEMENTS "Bewegungen beenden" -#define MSG_PRINT_PAUSED "Druck pausiert" -#define MSG_RESUMING_PRINT "Druck fortsetzen" -#define MSG_PID_EXTRUDER "PID Kalibrierung" -#define MSG_SET_TEMPERATURE "Temp.einstellen" -#define MSG_PID_FINISHED "PID Kal. fertig " -#define MSG_PID_RUNNING "PID Kal. " -#define(length=20, lines=1) MSG_PID_BED "PID Bett Kalibrier. " -#define(length=20, lines=1) MSG_PID_BED_FINISHED "PID Bett Kal. fertig" -#define(length=20, lines=1) MSG_PID_BED_RUNNING "PID Bett Kal." - -#define MSG_CALIBRATE_PINDA "PINDA Temp. Kal." -#define MSG_CALIBRATION_PINDA_MENU "PINDA Temp. Kal." -#define(length=20, lines=3) MSG_PINDA_NOT_CALIBRATED "PINDA Temperatur Kalibrierung wurde noch nicht ausgefuehrt" -#define MSG_PINDA_PREHEAT "PINDA aufwaremen" -#define(length=20) MSG_TEMP_CALIBRATION "PINDA Temp.Kal. " -#define(length=20, lines=3) MSG_TEMP_CALIBRATION_DONE "Die PINDA Temperaturkalibrierung ist beendet. Klicke um fortzufahren." -#define(length=20) MSG_TEMP_CALIBRATION_ON "PINDA T.Kal. [ON]" -#define(length=20) MSG_TEMP_CALIBRATION_OFF "PINDA T.Kal.[OFF]" - -#define(length=20) MSG_LOAD_ALL "Alle laden" -#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" -#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" -#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" -#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" -#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filam. 1 entladen" -#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filam. 2 entladen" -#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filam. 3 entladen" -#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filam. 4 entladen" -#define(length=20) MSG_UNLOAD_ALL "Alles entladen" -#define(length=20) MSG_PREPARE_FILAMENT "Filam. bereithalten" -#define(length=20) MSG_ALL "Alle" -#define(length=20) MSG_USED "Benutzt beim Druck" -#define(length=20) MSG_CURRENT "Aktuelles" -#define(length=20) MSG_CHOOSE_EXTRUDER "Waehlen Sie Extruder" -#define(length=20) MSG_EXTRUDER "Extruder" -#define(length=20) MSG_EXTRUDER_1 "Extruder 1" -#define(length=20) MSG_EXTRUDER_2 "Extruder 2" -#define(length=20) MSG_EXTRUDER_3 "Extruder 3" -#define(length=20) MSG_EXTRUDER_4 "Extruder 4" -#define MSG_DATE "Datum:" -#define MSG_XYZ_DETAILS "XYZ Kal. Details" -#define MSG_Y_DISTANCE_FROM_MIN "Y Entfernung von min" -#define MSG_LEFT "Links:" -#define MSG_CENTER "Mitte:" -#define MSG_RIGHT "Rechts:" -#define MSG_MEASURED_SKEW "Symmetrie:" -#define MSG_SLIGHT_SKEW "Geringe Asym.:" +/** + * German + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ + + #define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " bereit." +#define MSG_SD_INSERTED "SD Karte eingesetzt" +#define MSG_SD_REMOVED "SD Karte entfernt" +#define MSG_MAIN "Hauptmenue" +#define(length=20) MSG_DISABLE_STEPPERS "Motoren aus" +#define MSG_AUTO_HOME "Startposition" +#define MSG_SET_HOME_OFFSETS "Setze Homeversatz" +#define MSG_SET_ORIGIN "Setze Nullpunkt" +#define MSG_COOLDOWN "Abkuehlen" +#define MSG_SWITCH_PS_ON "Netzteil EIN" +#define MSG_SWITCH_PS_OFF "Netzteil AUS" +#define MSG_MOVE_AXIS "Bewege Achse" +#define MSG_MOVE_X "Bewege X" +#define MSG_MOVE_Y "Bewege Y" +#define MSG_MOVE_Z "Bewege Z" +#define MSG_MOVE_E "Extruder" +#define MSG_SPEED "Geschwindigkeit" +#define MSG_NOZZLE "Duese" +#define MSG_NOZZLE1 "Duese2" +#define MSG_NOZZLE2 "Duese3" +#define MSG_BED "Bett" +#define(length=20) MSG_FAN_SPEED "Luefter-Tempo" +#define MSG_FLOW "Durchfluss" +#define MSG_FLOW0 "Durchfluss 0" +#define MSG_FLOW1 "Durchfluss 1" +#define MSG_FLOW2 "Durchfluss 2" +#define MSG_CONTROL "Einstellungen" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fakt" +#define MSG_TEMPERATURE "Temperatur" +#define MSG_MOTION "Bewegung" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "EPROM speichern" +#define MSG_LOAD_EPROM "EPROM laden" +#define MSG_RESTORE_FAILSAFE "Standardkonfiguration" +#define MSG_REFRESH "Aktualisieren" +#define MSG_WATCH "Information" +#define MSG_TUNE "Feineinstellung" +#define MSG_PAUSE_PRINT "Pause" +#define MSG_RESUME_PRINT "Fortsetzen" +#define MSG_STOP_PRINT "Druck abbrechen" +#define MSG_CARD_MENU "Drucken von SD" +#define MSG_NO_CARD "Keine SD Karte" +#define MSG_DWELL "Warten..." +#define(length=20) MSG_USERWAIT "Warte auf Nutzer..." +#define(length=20) MSG_RESUMING "Druck fortgesetzt" +#define(length=20) MSG_PRINT_ABORTED "Druck abgebrochen" +#define MSG_NO_MOVE "Keine Bewegung." +#define(length=20) MSG_KILLED "ABGEBROCHEN. " +#define MSG_STOPPED "GESTOPPT. " +#define MSG_FILAMENTCHANGE "Filament-Wechsel" +#define MSG_INIT_SDCARD "SD erkennen" +#define MSG_CNG_SDCARD "SD Karte wechsel" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_BABYSTEP_Z "Live Z einstellen" +#define(length=20) MSG_ADJUSTZ "Auto Z einstellen?" +#define(length=20) MSG_PICK_Z "Waehle Druck" + +#define MSG_SETTINGS "Einstellungen" +#define MSG_PREHEAT "Vorheizen" +#define MSG_UNLOAD_FILAMENT "Filament entnehmen" +#define MSG_LOAD_FILAMENT "Filament laden" +#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" +#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" +#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" +#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" +#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filament 1 entnehmen" +#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filament 2 entnehmen" +#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filament 3 entnehmen" +#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filament 4 entnehmen" +#define(length=20) MSG_UNLOAD_ALL "Alle entnehmen" +#define(length=20) MSG_LOAD_ALL "Alle laden" + +#define MSG_RECTRACT "Rectract" +#define MSG_ERROR "FEHLER:" +#define(length=20) MSG_PREHEAT_NOZZLE "Duese vorheizen!" +#define MSG_SUPPORT "Support" +#define(length=20) MSG_CORRECTLY "Wechsel ok?" +#define MSG_YES "Ja" +#define MSG_NO "Nein" +#define(length=20) MSG_NOT_LOADED "Fil. nicht geladen" +#define(length=20) MSG_NOT_COLOR "Farbe nicht klar." +#define(length=20) MSG_LOADING_FILAMENT "Filament laedt" +#define(length=20) MSG_PLEASE_WAIT "Bitte warten" +#define MSG_LOADING_COLOR "Lade Farbe" +#define(length=20) MSG_CHANGE_SUCCESS "Wechsel erfolgreich!" +#define(length=20) MSG_PRESS "und Knopf druecken" +#define(length=20) MSG_INSERT_FILAMENT "Filament einlegen" +#define(length=20) MSG_CHANGING_FILAMENT "Filament-Wechsel!" + + +#define MSG_SILENT_MODE_ON "Mode [leise]" +#define MSG_SILENT_MODE_OFF "Mode [Hohe Leist]" +#define(length=20) MSG_REBOOT "Reboot den Drucker" +#define(length=20, lines=2) MSG_TAKE_EFFECT " um wirksam zu werden" + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Letzes Updated: " +#define MSG_FREE_MEMORY " Freier Speicher: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "Checksum Fehler, Letzte Zeile: " +#define MSG_ERR_NO_CHECKSUM "Keine Checksum mit Zeilennummer, Letzte Zeile: " +#define MSG_BEGIN_FILE_LIST "Beginn Dateiliste" +#define MSG_END_FILE_LIST "Ende Dateiliste" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define(length=38) MSG_ERR_NO_THERMISTORS "Keine Temp.sensoren - keine Temperatur" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_HEATING "Aufheizen" +#define(length=20) MSG_HEATING_COMPLETE "Aufgeheizen klar." +#define MSG_BED_HEATING "Bett aufheizen" +#define MSG_BED_DONE "Bett OK" +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Drucker gestoppt. kill() aufgerufen!" +#define MSG_ERR_STOPPED "Der Drucker wurde aufgrund von Fehlern gestoppt. Beheben Sie den Fehler und verwenden Sie M999, um neu zu starten. (Temperatur wird reset. Stellen Sie es nach dem Neustart ein)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Endstop status anzeigen" +#define MSG_ENDSTOP_HIT "AUSGELOEST" +#define MSG_ENDSTOP_OPEN "offen" + +#define MSG_SD_CANT_OPEN_SUBDIR "Kann Unterverz. nicht oeffnen" +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "Datei geoefffnet: " +#define MSG_SD_FILE_SELECTED "Datei ausgewaehlt" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Kein SD Druck" +#define MSG_SD_ERR_WRITE_TO_FILE "Fehler beim Schreiben in Datei" +#define MSG_SD_CANT_ENTER_SUBDIR "Kann nicht ins Unterverz.:" + +#define MSG_STEPPER_TOO_HIGH "Steprate too high:" +#define MSG_ENDSTOPS_HIT "endstops hit:" +#define MSG_ERR_COLD_EXTRUDE_STOP " kalte Extrusion verhindert" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Einstellen Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" + +#define MSG_LANGUAGE_NAME "Deutsch" +#define MSG_LANGUAGE_SELECT "Waehle Sprache" + +#define MSG_PRUSA3D "prusa3d.com" +#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" +#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" + +#define(length=20) MSG_SELFTEST_ERROR "Selbsttest Fehler !" +#define MSG_SELFTEST_PLEASECHECK "Bitte pruefe:" +#define(length=20) MSG_SELFTEST_NOTCONNECTED "Nicht angeschlossen" +#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" +#define MSG_SELFTEST_BEDHEATER "Bett / Heater" +#define(length=20) MSG_SELFTEST_WIRINGERROR "Verdrahtungsfehler" +#define MSG_SELFTEST_ENDSTOPS "Endschalter" +#define MSG_SELFTEST_MOTOR "Motor" +#define MSG_SELFTEST_ENDSTOP "Endstop" +#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endsch. n. erreicht" +#define MSG_SELFTEST_OK "Selbsttest OK" +#define(length=20) MSG_LOOSE_PULLEY "Loser pulley" + +#define MSG_SELFTEST_FAN "Lueftertest"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Vorderer Luefter?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Linker Luefter?"; +#define MSG_SELFTEST_FAN_YES "Dreht"; +#define(length=20) MSG_SELFTEST_FAN_NO "Dreht nicht"; + +#define(length=20) MSG_STATS_TOTALFILAMENT "Filament Gesamt:" +#define(length=20) MSG_STATS_TOTALPRINTTIME "Totale Druckzeit:" +#define(length=20) MSG_STATS_FILAMENTUSED "Filamentverbrauch:" +#define(length=20) MSG_STATS_PRINTTIME "Druckzeit: " +#define(length=20) MSG_SELFTEST_START "Selbsttest start " +#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Pruefe Endschalter " +#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Pruefe Hotend " +#define(length=20) MSG_SELFTEST_CHECK_X "Pruefe X Achse " +#define(length=20) MSG_SELFTEST_CHECK_Y "Pruefe Y Achse " +#define(length=20) MSG_SELFTEST_CHECK_Z "Pruefe Z Achse " +#define(length=20) MSG_SELFTEST_CHECK_BED "Pruefe Bett " +#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "Alles richtig " +#define MSG_SELFTEST "Selbsttest " +#define(length=20) MSG_SELFTEST_FAILED "Selbsttest misluekt" +#define MSG_STATISTICS "Statistiken " +#define MSG_USB_PRINTING "USB drucken " +#define MSG_HOMEYZ "Kalibrieren Z" +#define MSG_HOMEYZ_PROGRESS "Kalibriere Z" +#define MSG_HOMEYZ_DONE "Kalibrierung OK" + +#define MSG_SHOW_END_STOPS "Anzeigen Enschalter" +#define MSG_CALIBRATE_BED "Kalibrierung XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset XYZ Kalibr." + +#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibrieren von XYZ. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind." +#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibrieren von Z. Drehen Sie den Knopf, bis beide Z-Schlitten obere Anschaege erreichen. Klicken wenn beide ganz oben sind." + +#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber." +#define(length=20, lines=8) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Sind beide Z Schlitten ganz oben?" + +#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Suche Bett Kalibrierpunkt" +#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " von 4" +#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Genauigkeit verbessern bei Kalibrierpunkt" +#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " von 9" +#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Messen der Referenzhoehe des Kalibrierpunktes" +#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " von 9" +#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Wiederholung " + +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ-Kalibrierung fehlgeschlagen. Bett-Kalibrierpunkt nicht gefunden." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ-Kalibrierung fehlgeschlagen. Bitte schauen Sie in das Handbuch." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ-Kalibrierung ok. X/Y-Achsen sind senkrecht zueinander. Glueckwunsch!" +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ-Kalibrierung ok. X/Y-Achsen sind etwas schief. Schiefheit wird automatisch korrigiert. Gut gemacht!" +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ-Kalibrierung ok. X/Y-Achsen sind sehr schief. Schiefheit wird automatisch korrigiert." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ-Kalibrierung fehlgeschlagen. Linker voderer Kalibrierpunkt nicht erreichbar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ-Kalibrierung fehlgeschlagen. Rechter vorderer Kalibrierpunkt nicht erreichbar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ-Kalibrierung fehlgeschlagen. Vordere Kalibrierpunkte nicht erreichbar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ-Kalibrierung ungenau. Linker vorderer Kalibrierpunkt nicht erreichbar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ-Kalibrierung ungenau. Rechter vorderer Kalibrierpunkt nicht erreichbar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ-Kalibrierung ungenau. Vordere Kalibrierpunkte nicht erreichbar." + +#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bett-Nivellierung fehlgeschlagen. Sensor wurde nicht ausgeloest. Schmutzige Duese? Warte auf Reset." +#define(length=20, lines=5) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bett-Nivellierung fehlgeschlagen. Sensor wurde zu hoch ausgeloest. Warte auf Reset." +#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bett-Nivellierung fehlgeschlagen. Sensor nicht angeschlossen oder Kabel defekt. Warte auf Reset." + +#define(length=20, lines=2) MSG_NEW_FIRMWARE_AVAILABLE "Neue Firmware Version verfuegbar:" +#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Bitte aktualisieren." + +#define(length=20, lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Der Drucker wurde noch nicht kalibriert. Bitte folgen Sie dem Handbuch, Kapitel First steps, Abschnitt Calibration flow." +#define(length=20, lines=12) MSG_BABYSTEP_Z_NOT_SET "Der Abstand zwischen der Spitze der Duese und der Druckoberflaeche / Bett ist noch nicht eingestellt. Bitte folgen Sie dem Handbuch, First steps, Abschnitt First layer calibration." + +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Filament in extruder 1 einlegen. Klicken wenn fertig." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Filament in extruder 2 einlegen. Klicken wenn fertig." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Filament in extruder 3 einlegen. Klicken wenn fertig." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Filament in extruder 4 einlegen. Klicken wenn fertig." +#define(length=20, lines=1) MSG_CHANGE_EXTR "Wechsel extruder" + +#define(length=20, lines=4) MSG_FIL_ADJUSTING "Einstellen Filament. Bitte warten." +#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamente sind jetzt eingestellt. Bitte reinigen Sie die Duese zur Kalibrierung. Klicken wenn sauber." +#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" +#define(length=20, lines=1) MSG_CALIBRATE_E "Kalibriere E" +//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." +#define(length=20, lines=8) MSG_E_CAL_KNOB "Knopf drehen bis die Filamentmarkierung erreicht ist. Klicken wenn fertig." + +//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" +#define(length=20, lines=8) MSG_MARK_FIL "Filament 100mm vom Extrudergehaeuse markieren. Klicken wenn Fertig." +#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E-Kalibrierung beendet. Bitte reinigen Sie die Duese. Klicken wenn fertig." +#define(length=20, lines=3) MSG_WAITING_TEMP "Warten auf Abkuehlung von Duese und Bett." +#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Ist Farbe rein?" +#define(length=20) MSG_UNLOADING_FILAMENT "Filament auswerfen" +#define(length=20, lines=10) MSG_PAPER "Lege waehrend der Kalibrierung der ersten 4 Punkte ein Blatt Papier unter die Duese. Wenn die Duese das Papier bewegt, Drucker sofort ausschalten!" + +#define(length=20) MSG_BED_CORRECTION_MENU "Bett level korrekt" +#define MSG_BED_CORRECTION_LEFT "Links [um]" +#define MSG_BED_CORRECTION_RIGHT "Rechts [um]" +#define MSG_BED_CORRECTION_FRONT "Vorne [um]" +#define MSG_BED_CORRECTION_REAR "Hinten [um]" +#define MSG_BED_CORRECTION_RESET "Zuruecksetzen" + +#define(length=20) MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Kalibrierung" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD Karte [normal]" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD Karte [FlshAir]" +#define(length=20) MSG_PRINTER_DISCONNECTED "Drucker getrent" +#define(length=20) MSG_FINISHING_MOVEMENTS "Bewegungen beenden" +#define MSG_PRINT_PAUSED "Druck pausiert" +#define MSG_RESUMING_PRINT "Druck fortsetzen" +#define MSG_PID_EXTRUDER "PID Kalibrierung" +#define MSG_SET_TEMPERATURE "Temp.einstellen" +#define MSG_PID_FINISHED "PID Kal. fertig " +#define MSG_PID_RUNNING "PID Kal. " +#define(length=20, lines=1) MSG_PID_BED "PID Bett Kalibrier. " +#define(length=20, lines=1) MSG_PID_BED_FINISHED "PID Bett Kal. fertig" +#define(length=20, lines=1) MSG_PID_BED_RUNNING "PID Bett Kal." + +#define MSG_CALIBRATE_PINDA "PINDA Temp. Kal." +#define MSG_CALIBRATION_PINDA_MENU "PINDA Temp. Kal." +#define(length=20, lines=3) MSG_PINDA_NOT_CALIBRATED "PINDA Temperatur Kalibrierung wurde noch nicht ausgefuehrt" +#define MSG_PINDA_PREHEAT "PINDA aufwaremen" +#define(length=20) MSG_TEMP_CALIBRATION "PINDA Temp.Kal. " +#define(length=20, lines=3) MSG_TEMP_CALIBRATION_DONE "Die PINDA Temperaturkalibrierung ist beendet. Klicke um fortzufahren." +#define(length=20) MSG_TEMP_CALIBRATION_ON "PINDA T.Kal. [ON]" +#define(length=20) MSG_TEMP_CALIBRATION_OFF "PINDA T.Kal.[OFF]" + +#define(length=20) MSG_LOAD_ALL "Alle laden" +#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" +#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" +#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" +#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" +#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filam. 1 entladen" +#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filam. 2 entladen" +#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filam. 3 entladen" +#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filam. 4 entladen" +#define(length=20) MSG_UNLOAD_ALL "Alles entladen" +#define(length=20) MSG_PREPARE_FILAMENT "Filam. bereithalten" +#define(length=20) MSG_ALL "Alle" +#define(length=20) MSG_USED "Benutzt beim Druck" +#define(length=20) MSG_CURRENT "Aktuelles" +#define(length=20) MSG_CHOOSE_EXTRUDER "Waehlen Sie Extruder" +#define(length=20) MSG_EXTRUDER "Extruder" +#define(length=20) MSG_EXTRUDER_1 "Extruder 1" +#define(length=20) MSG_EXTRUDER_2 "Extruder 2" +#define(length=20) MSG_EXTRUDER_3 "Extruder 3" +#define(length=20) MSG_EXTRUDER_4 "Extruder 4" +#define MSG_DATE "Datum:" +#define MSG_XYZ_DETAILS "XYZ Kal. Details" +#define MSG_Y_DISTANCE_FROM_MIN "Y Entfernung von min" +#define MSG_LEFT "Links:" +#define MSG_CENTER "Mitte:" +#define MSG_RIGHT "Rechts:" +#define MSG_MEASURED_SKEW "Symmetrie:" +#define MSG_SLIGHT_SKEW "Geringe Asym.:" #define MSG_SEVERE_SKEW "Schwere Asym.:" \ No newline at end of file diff --git a/Firmware/language_en.h b/Firmware/language_en.h index dec7b729e..84a1df62d 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -1,322 +1,316 @@ -/** - * English - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ - -#define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " ready." -#define(length=20) MSG_SD_INSERTED "Card inserted" -#define MSG_SD_REMOVED "Card removed" -#define MSG_MAIN "Main" -#define(length=20) MSG_DISABLE_STEPPERS "Disable steppers" -#define MSG_AUTO_HOME "Auto home" -#define MSG_SET_HOME_OFFSETS "Set home offsets" -#define MSG_SET_ORIGIN "Set origin" -#define MSG_COOLDOWN "Cooldown" -#define MSG_SWITCH_PS_ON "Switch power on" -#define MSG_SWITCH_PS_OFF "Switch power off" -#define MSG_MOVE_AXIS "Move axis" -#define MSG_MOVE_X "Move X" -#define MSG_MOVE_Y "Move Y" -#define MSG_MOVE_Z "Move Z" -#define MSG_MOVE_E "Extruder" -#define MSG_SPEED "Speed" -#define MSG_NOZZLE "Nozzle" -#define MSG_NOZZLE1 "Nozzle2" -#define MSG_NOZZLE2 "Nozzle3" -#define MSG_BED "Bed" -#define(length=20) MSG_FAN_SPEED "Fan speed" -#define MSG_FLOW "Flow" -#define MSG_FLOW0 "Flow 0" -#define MSG_FLOW1 "Flow 1" -#define MSG_FLOW2 "Flow 2" -#define MSG_CONTROL "Control" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fact" -#define MSG_TEMPERATURE "Temperature" -#define MSG_MOTION "Motion" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "Store memory" -#define MSG_LOAD_EPROM "Load memory" -#define MSG_RESTORE_FAILSAFE "Restore failsafe" -#define MSG_REFRESH "\xF8" "Refresh" -#define MSG_WATCH "Info screen" -#define MSG_TUNE "Tune" -#define MSG_PAUSE_PRINT "Pause print" -#define MSG_RESUME_PRINT "Resume print" -#define MSG_STOP_PRINT "Stop print" -#define MSG_CARD_MENU "Print from SD" -#define MSG_NO_CARD "No SD card" -#define MSG_DWELL "Sleep..." -#define(length=20) MSG_USERWAIT "Wait for user..." -#define(length=20) MSG_RESUMING "Resuming print" -#define(length=20) MSG_PRINT_ABORTED "Print aborted" -#define MSG_NO_MOVE "No move." -#define(length=20) MSG_KILLED "KILLED. " -#define MSG_STOPPED "STOPPED. " -#define MSG_FILAMENTCHANGE "Change filament" -#define MSG_INIT_SDCARD "Init. SD card" -#define MSG_CNG_SDCARD "Change SD card" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Live adjust Z" -#define(length=20) MSG_ADJUSTZ "Auto adjust Z?" -#define(length=20) MSG_PICK_Z "Pick print" - -#define MSG_SETTINGS "Settings" -#define MSG_PREHEAT "Preheat" -#define(length=20) MSG_UNLOAD_FILAMENT "Unload filament" -#define(length=20) MSG_LOAD_FILAMENT "Load filament" -#define(length=20) MSG_LOAD_FILAMENT_1 "Load filament 1" -#define(length=20) MSG_LOAD_FILAMENT_2 "Load filament 2" -#define(length=20) MSG_LOAD_FILAMENT_3 "Load filament 3" -#define(length=20) MSG_LOAD_FILAMENT_4 "Load filament 4" -#define(length=20) MSG_UNLOAD_FILAMENT_1 "Unload filament 1" -#define(length=20) MSG_UNLOAD_FILAMENT_2 "Unload filament 2" -#define(length=20) MSG_UNLOAD_FILAMENT_3 "Unload filament 3" -#define(length=20) MSG_UNLOAD_FILAMENT_4 "Unload filament 4" -#define(length=20) MSG_UNLOAD_ALL "Unload all" -#define(length=20) MSG_LOAD_ALL "Load all" - - -#define MSG_RECTRACT "Rectract" -#define MSG_ERROR "ERROR:" -#define(length=20) MSG_PREHEAT_NOZZLE "Preheat the nozzle!" -#define MSG_SUPPORT "Support" -#define(length=20) MSG_CORRECTLY "Changed correctly?" -#define MSG_YES "Yes" -#define MSG_NO "No" -#define(length=19) MSG_NOT_LOADED "Filament not loaded" -#define(length=20) MSG_NOT_COLOR "Color not clear" -#define(length=20) MSG_LOADING_FILAMENT "Loading filament" -#define(length=20) MSG_PLEASE_WAIT "Please wait" -#define MSG_LOADING_COLOR "Loading color" -#define(length=20) MSG_CHANGE_SUCCESS "Change success!" -#define(length=20) MSG_PRESS "and press the knob" -#define(length=20) MSG_INSERT_FILAMENT "Insert filament" -#define(length=20) MSG_CHANGING_FILAMENT "Changing filament!" - - -#define MSG_SILENT_MODE_ON "Mode [silent]" -#define MSG_SILENT_MODE_OFF "Mode [high power]" -#define(length=20) MSG_REBOOT "Reboot the printer" -#define(length=20, lines=2) MSG_TAKE_EFFECT " for take effect" - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Last Updated: " -#define MSG_FREE_MEMORY " Free Memory: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define MSG_BEGIN_FILE_LIST "Begin file list" -#define MSG_END_FILE_LIST "End file list" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_HEATING "Heating" -#define(length=20) MSG_HEATING_COMPLETE "Heating done." -#define MSG_BED_HEATING "Bed Heating" -#define MSG_BED_DONE "Bed done" -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Printer halted. kill() called!" -#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Reporting endstop status" -#define MSG_ENDSTOP_HIT "TRIGGERED" -#define MSG_ENDSTOP_OPEN "open" - -#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "File opened: " -#define MSG_SD_FILE_SELECTED "File selected" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Not SD printing" -#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" -#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " - -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Adjusting Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" - -#define MSG_LANGUAGE_NAME "English" -#define MSG_LANGUAGE_SELECT "Select language" -#define MSG_PRUSA3D "prusa3d.com" -#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" -#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" - -#define(length=20) MSG_SELFTEST_ERROR "Selftest error !" -#define MSG_SELFTEST_PLEASECHECK "Please check :" -#define(length=20) MSG_SELFTEST_NOTCONNECTED "Not connected" -#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" -#define MSG_SELFTEST_BEDHEATER "Bed / Heater" -#define(length=20) MSG_SELFTEST_WIRINGERROR "Wiring error" -#define MSG_SELFTEST_ENDSTOPS "Endstops" -#define MSG_SELFTEST_MOTOR "Motor" -#define MSG_SELFTEST_ENDSTOP "Endstop" -#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" -#define MSG_SELFTEST_OK "Self test OK" -#define(length=20) MSG_LOOSE_PULLEY "Loose pulley" - -#define(length=20) MSG_SELFTEST_FAN "Fan test"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Front print fan?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Left hotend fan?"; -#define MSG_SELFTEST_FAN_YES "Spinning"; -#define(length=20) MSG_SELFTEST_FAN_NO "Not spinning"; - -#define(length=20) MSG_STATS_TOTALFILAMENT "Total filament :" -#define(length=20) MSG_STATS_TOTALPRINTTIME "Total print time :" -#define(length=20) MSG_STATS_FILAMENTUSED "Filament used: " -#define(length=20) MSG_STATS_PRINTTIME "Print time: " -#define(length=20) MSG_SELFTEST_START "Self test start " -#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Checking endstops" -#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Checking hotend " -#define(length=20) MSG_SELFTEST_CHECK_X "Checking X axis " -#define(length=20) MSG_SELFTEST_CHECK_Y "Checking Y axis " -#define(length=20) MSG_SELFTEST_CHECK_Z "Checking Z axis " -#define(length=20) MSG_SELFTEST_CHECK_BED "Checking bed " -#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "All correct " -#define MSG_SELFTEST "Selftest " -#define(length=20) MSG_SELFTEST_FAILED "Selftest failed " -#define MSG_STATISTICS "Statistics " -#define MSG_USB_PRINTING "USB printing " -#define MSG_HOMEYZ "Calibrate Z" -#define MSG_HOMEYZ_PROGRESS "Calibrating Z" -#define MSG_HOMEYZ_DONE "Calibration done" - -#define(length=20) MSG_SHOW_END_STOPS "Show end stops" -#define MSG_CALIBRATE_BED "Calibrate XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset XYZ calibr." - -#define(length=20,lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done." -#define(length=20,lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done." - -#define(length=20,lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Please clean the nozzle for calibration. Click when done." -#define(length=20,lines=2) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Are left and right Z~carriages all up?" - -#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Searching bed calibration point" -#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " of 4" -#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Improving bed calibration point" -#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " of 9" -#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Measuring reference height of calibration point" -#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " of 9" -#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iteration " - -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ calibration failed. Bed calibration point was not found." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ calibration failed. Please consult the manual." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!" -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ calibration all right. X/Y axes are slightly skewed. Good job!" -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ calibration all right. Skew will be corrected automatically." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ calibration failed. Left front calibration point not reachable." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ calibration failed. Right front calibration point not reachable." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ calibration failed. Front calibration points not reachable." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ calibration compromised. Left front calibration point not reachable." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ calibration compromised. Right front calibration point not reachable." -#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ calibration compromised. Front calibration points not reachable." - -#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset." -#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bed leveling failed. Sensor triggered too high. Waiting for reset." -#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset." - -#define(length=20,lines=2) MSG_NEW_FIRMWARE_AVAILABLE "New firmware version available:" -#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Please upgrade." - -#define(length=20,lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow." -#define(length=20,lines=12) MSG_BABYSTEP_Z_NOT_SET "Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration." - -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Insert filament into extruder 1. Click when done." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Insert filament into extruder 2. Click when done." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Insert filament into extruder 3. Click when done." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Insert filament into extruder 4. Click when done." -#define(length=20, lines=1) MSG_CHANGE_EXTR "Change extruder" - -#define(length=20, lines=4) MSG_FIL_ADJUSTING "Adjusting filaments. Please wait." -#define(length=20,lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filaments are now adjusted. Please clean the nozzle for calibration. Click when done." -#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" -#define(length=20, lines=1) MSG_CALIBRATE_E "Calibrate E" -//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." -#define(length=20, lines=8) MSG_E_CAL_KNOB "Rotate knob until mark reaches extruder body. Click when done." - -//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" -#define(length=20, lines=8) MSG_MARK_FIL "Mark filament 100mm from extruder body. Click when done." -#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E calibration finished. Please clean the nozzle. Click when done." -#define(length=20, lines=3) MSG_WAITING_TEMP "Waiting for nozzle and bed cooling" -#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Is color clear?" -#define(length=20, lines=1) MSG_UNLOADING_FILAMENT "Unloading filament" -#define(length=20, lines=10) MSG_PAPER "Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately." - -#define(length=20) MSG_BED_CORRECTION_MENU "Bed level correct" -#define(length=20) MSG_BED_CORRECTION_LEFT "Left side [um]" -#define(length=20) MSG_BED_CORRECTION_RIGHT "Right side[um]" -#define(length=20) MSG_BED_CORRECTION_FRONT "Front side[um]" -#define(length=20) MSG_BED_CORRECTION_REAR "Rear side [um]" -#define(length=20) MSG_BED_CORRECTION_RESET "Reset" - -#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Calibration" -<<<<<<< HEAD -#define(length=20) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" -#define(length=20) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" -#define(length=20) MSG_PRINTER_DISCONNECTED "Printer disconnected" -======= -#define(length=19, lines=1) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" -#define(length=19, lines=1) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" -#define(length=20, lines=1) MSG_PRINTER_DISCONNECTED "Printer disconnected" ->>>>>>> refs/remotes/prusa3d/MK2 -#define(length=20, lines=1) MSG_FINISHING_MOVEMENTS "Finishing movements" -#define(length=20, lines=1) MSG_PRINT_PAUSED "Print paused" -#define(length=20, lines=1) MSG_RESUMING_PRINT "Resuming print" -#define(length=20, lines=1) MSG_PID_EXTRUDER "PID calibration" -#define(length=20, lines=1) MSG_SET_TEMPERATURE "Set temperature:" -#define(length=20, lines=1) MSG_PID_FINISHED "PID cal. finished " -#define(length=20, lines=1) MSG_PID_RUNNING "PID cal. " -#define(length=20, lines=1) MSG_PID_BED "PID bed cal. " -#define(length=20, lines=1) MSG_PID_BED_FINISHED "PID bed cal. done " -#define(length=20, lines=1) MSG_PID_BED_RUNNING "PID bed cal. " - -#define(length=20, lines=1) MSG_CALIBRATE_PINDA "PINDA Temp. cal." -#define(length=20, lines=1) MSG_CALIBRATION_PINDA_MENU "PINDA Temp. cal." -#define(length=20, lines=4) MSG_PINDA_NOT_CALIBRATED "PINDA temperature calibration has not been run yet" -#define(length=20, lines=1) MSG_PINDA_PREHEAT "PINDA Heating" -#define(length=20, lines=1) MSG_TEMP_CALIBRATION "PINDA Temp.cal. " -#define(length=20, lines=5) MSG_TEMP_CALIBRATION_DONE "PINDA temperature calibration is finished. Click to continue." -#define(length=20, lines=1) MSG_TEMP_CALIBRATION_ON "PINDA T.cal. [ON]" -#define(length=20, lines=1) MSG_TEMP_CALIBRATION_OFF "PINDA T.cal.[OFF]" -#define(length=20, lines=1) MSG_PREPARE_FILAMENT "Prepare new filament" -#define(length=19, lines=1) MSG_ALL "All" -#define(length=19, lines=1) MSG_USED "Used during print" -#define(length=19, lines=1) MSG_CURRENT "Current" -#define(length=20, lines=1) MSG_CHOOSE_EXTRUDER "Choose extruder:" -#define(length=17, lines=1) MSG_EXTRUDER "Extruder" -#define(length=17, lines=1) MSG_EXTRUDER_1 "Extruder 1" -#define(length=17, lines=1) MSG_EXTRUDER_2 "Extruder 2" -#define(length=17, lines=1) MSG_EXTRUDER_3 "Extruder 3" -#define(length=17, lines=1) MSG_EXTRUDER_4 "Extruder 4" -#define(length=17, lines=1) MSG_DATE "Date:" -#define(length=19, lines=1) MSG_XYZ_DETAILS "XYZ cal. details" -#define(length=20, lines=1) MSG_Y_DISTANCE_FROM_MIN "Y distance from min:" -#define(length=12, lines=1) MSG_LEFT "Left:" -#define(length=12, lines=1) MSG_CENTER "Center:" -#define(length=12, lines=1) MSG_RIGHT "Right:" -#define(length=15, lines=1) MSG_MEASURED_SKEW "Measured skew:" -#define(length=15, lines=1) MSG_SLIGHT_SKEW "Slight skew:" -#define(length=15, lines=1) MSG_SEVERE_SKEW "Severe skew:" +/** + * English + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ + +#define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " ready." +#define(length=20) MSG_SD_INSERTED "Card inserted" +#define MSG_SD_REMOVED "Card removed" +#define MSG_MAIN "Main" +#define(length=20) MSG_DISABLE_STEPPERS "Disable steppers" +#define MSG_AUTO_HOME "Auto home" +#define MSG_SET_HOME_OFFSETS "Set home offsets" +#define MSG_SET_ORIGIN "Set origin" +#define MSG_COOLDOWN "Cooldown" +#define MSG_SWITCH_PS_ON "Switch power on" +#define MSG_SWITCH_PS_OFF "Switch power off" +#define MSG_MOVE_AXIS "Move axis" +#define MSG_MOVE_X "Move X" +#define MSG_MOVE_Y "Move Y" +#define MSG_MOVE_Z "Move Z" +#define MSG_MOVE_E "Extruder" +#define MSG_SPEED "Speed" +#define MSG_NOZZLE "Nozzle" +#define MSG_NOZZLE1 "Nozzle2" +#define MSG_NOZZLE2 "Nozzle3" +#define MSG_BED "Bed" +#define(length=20) MSG_FAN_SPEED "Fan speed" +#define MSG_FLOW "Flow" +#define MSG_FLOW0 "Flow 0" +#define MSG_FLOW1 "Flow 1" +#define MSG_FLOW2 "Flow 2" +#define MSG_CONTROL "Control" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fact" +#define MSG_TEMPERATURE "Temperature" +#define MSG_MOTION "Motion" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "Store memory" +#define MSG_LOAD_EPROM "Load memory" +#define MSG_RESTORE_FAILSAFE "Restore failsafe" +#define MSG_REFRESH "\xF8" "Refresh" +#define MSG_WATCH "Info screen" +#define MSG_TUNE "Tune" +#define MSG_PAUSE_PRINT "Pause print" +#define MSG_RESUME_PRINT "Resume print" +#define MSG_STOP_PRINT "Stop print" +#define MSG_CARD_MENU "Print from SD" +#define MSG_NO_CARD "No SD card" +#define MSG_DWELL "Sleep..." +#define(length=20) MSG_USERWAIT "Wait for user..." +#define(length=20) MSG_RESUMING "Resuming print" +#define(length=20) MSG_PRINT_ABORTED "Print aborted" +#define MSG_NO_MOVE "No move." +#define(length=20) MSG_KILLED "KILLED. " +#define MSG_STOPPED "STOPPED. " +#define MSG_FILAMENTCHANGE "Change filament" +#define MSG_INIT_SDCARD "Init. SD card" +#define MSG_CNG_SDCARD "Change SD card" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_BABYSTEP_Z "Live adjust Z" +#define(length=20) MSG_ADJUSTZ "Auto adjust Z?" +#define(length=20) MSG_PICK_Z "Pick print" + +#define MSG_SETTINGS "Settings" +#define MSG_PREHEAT "Preheat" +#define(length=20) MSG_UNLOAD_FILAMENT "Unload filament" +#define(length=20) MSG_LOAD_FILAMENT "Load filament" +#define(length=20) MSG_LOAD_FILAMENT_1 "Load filament 1" +#define(length=20) MSG_LOAD_FILAMENT_2 "Load filament 2" +#define(length=20) MSG_LOAD_FILAMENT_3 "Load filament 3" +#define(length=20) MSG_LOAD_FILAMENT_4 "Load filament 4" +#define(length=20) MSG_UNLOAD_FILAMENT_1 "Unload filament 1" +#define(length=20) MSG_UNLOAD_FILAMENT_2 "Unload filament 2" +#define(length=20) MSG_UNLOAD_FILAMENT_3 "Unload filament 3" +#define(length=20) MSG_UNLOAD_FILAMENT_4 "Unload filament 4" +#define(length=20) MSG_UNLOAD_ALL "Unload all" +#define(length=20) MSG_LOAD_ALL "Load all" + + +#define MSG_RECTRACT "Rectract" +#define MSG_ERROR "ERROR:" +#define(length=20) MSG_PREHEAT_NOZZLE "Preheat the nozzle!" +#define MSG_SUPPORT "Support" +#define(length=20) MSG_CORRECTLY "Changed correctly?" +#define MSG_YES "Yes" +#define MSG_NO "No" +#define(length=19) MSG_NOT_LOADED "Filament not loaded" +#define(length=20) MSG_NOT_COLOR "Color not clear" +#define(length=20) MSG_LOADING_FILAMENT "Loading filament" +#define(length=20) MSG_PLEASE_WAIT "Please wait" +#define MSG_LOADING_COLOR "Loading color" +#define(length=20) MSG_CHANGE_SUCCESS "Change success!" +#define(length=20) MSG_PRESS "and press the knob" +#define(length=20) MSG_INSERT_FILAMENT "Insert filament" +#define(length=20) MSG_CHANGING_FILAMENT "Changing filament!" + + +#define MSG_SILENT_MODE_ON "Mode [silent]" +#define MSG_SILENT_MODE_OFF "Mode [high power]" +#define(length=20) MSG_REBOOT "Reboot the printer" +#define(length=20, lines=2) MSG_TAKE_EFFECT " for take effect" + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Last Updated: " +#define MSG_FREE_MEMORY " Free Memory: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " +#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " +#define MSG_BEGIN_FILE_LIST "Begin file list" +#define MSG_END_FILE_LIST "End file list" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_HEATING "Heating" +#define(length=20) MSG_HEATING_COMPLETE "Heating done." +#define MSG_BED_HEATING "Bed Heating" +#define MSG_BED_DONE "Bed done" +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Printer halted. kill() called!" +#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Reporting endstop status" +#define MSG_ENDSTOP_HIT "TRIGGERED" +#define MSG_ENDSTOP_OPEN "open" + +#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "File opened: " +#define MSG_SD_FILE_SELECTED "File selected" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Not SD printing" +#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" +#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " + +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Adjusting Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" + +#define MSG_LANGUAGE_NAME "English" +#define MSG_LANGUAGE_SELECT "Select language" +#define MSG_PRUSA3D "prusa3d.com" +#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" +#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" + +#define(length=20) MSG_SELFTEST_ERROR "Selftest error !" +#define MSG_SELFTEST_PLEASECHECK "Please check :" +#define(length=20) MSG_SELFTEST_NOTCONNECTED "Not connected" +#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" +#define MSG_SELFTEST_BEDHEATER "Bed / Heater" +#define(length=20) MSG_SELFTEST_WIRINGERROR "Wiring error" +#define MSG_SELFTEST_ENDSTOPS "Endstops" +#define MSG_SELFTEST_MOTOR "Motor" +#define MSG_SELFTEST_ENDSTOP "Endstop" +#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" +#define MSG_SELFTEST_OK "Self test OK" +#define(length=20) MSG_LOOSE_PULLEY "Loose pulley" + +#define(length=20) MSG_SELFTEST_FAN "Fan test"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Front print fan?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Left hotend fan?"; +#define MSG_SELFTEST_FAN_YES "Spinning"; +#define(length=20) MSG_SELFTEST_FAN_NO "Not spinning"; + +#define(length=20) MSG_STATS_TOTALFILAMENT "Total filament :" +#define(length=20) MSG_STATS_TOTALPRINTTIME "Total print time :" +#define(length=20) MSG_STATS_FILAMENTUSED "Filament used: " +#define(length=20) MSG_STATS_PRINTTIME "Print time: " +#define(length=20) MSG_SELFTEST_START "Self test start " +#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Checking endstops" +#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Checking hotend " +#define(length=20) MSG_SELFTEST_CHECK_X "Checking X axis " +#define(length=20) MSG_SELFTEST_CHECK_Y "Checking Y axis " +#define(length=20) MSG_SELFTEST_CHECK_Z "Checking Z axis " +#define(length=20) MSG_SELFTEST_CHECK_BED "Checking bed " +#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "All correct " +#define MSG_SELFTEST "Selftest " +#define(length=20) MSG_SELFTEST_FAILED "Selftest failed " +#define MSG_STATISTICS "Statistics " +#define MSG_USB_PRINTING "USB printing " +#define MSG_HOMEYZ "Calibrate Z" +#define MSG_HOMEYZ_PROGRESS "Calibrating Z" +#define MSG_HOMEYZ_DONE "Calibration done" + +#define(length=20) MSG_SHOW_END_STOPS "Show end stops" +#define MSG_CALIBRATE_BED "Calibrate XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset XYZ calibr." + +#define(length=20,lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Calibrating XYZ. Rotate the knob to move the Z carriage up to the end stoppers. Click when done." +#define(length=20,lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Calibrating Z. Rotate the knob to move the Z carriage up to the end stoppers. Click when done." + +#define(length=20,lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Please clean the nozzle for calibration. Click when done." +#define(length=20,lines=2) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Are left and right Z~carriages all up?" + +#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Searching bed calibration point" +#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " of 4" +#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Improving bed calibration point" +#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " of 9" +#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Measuring reference height of calibration point" +#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " of 9" +#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iteration " + +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ calibration failed. Bed calibration point was not found." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ calibration failed. Please consult the manual." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ calibration ok. X/Y axes are perpendicular. Congratulations!" +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ calibration all right. X/Y axes are slightly skewed. Good job!" +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ calibration all right. Skew will be corrected automatically." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ calibration failed. Left front calibration point not reachable." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ calibration failed. Right front calibration point not reachable." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ calibration failed. Front calibration points not reachable." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ calibration compromised. Left front calibration point not reachable." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ calibration compromised. Right front calibration point not reachable." +#define(length=20,lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ calibration compromised. Front calibration points not reachable." + +#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset." +#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bed leveling failed. Sensor triggered too high. Waiting for reset." +#define(length=20,lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset." + +#define(length=20,lines=2) MSG_NEW_FIRMWARE_AVAILABLE "New firmware version available:" +#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Please upgrade." + +#define(length=20,lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow." +#define(length=20,lines=12) MSG_BABYSTEP_Z_NOT_SET "Distance between tip of the nozzle and the bed surface has not been set yet. Please follow the manual, chapter First steps, section First layer calibration." + +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Insert filament into extruder 1. Click when done." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Insert filament into extruder 2. Click when done." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Insert filament into extruder 3. Click when done." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Insert filament into extruder 4. Click when done." +#define(length=20, lines=1) MSG_CHANGE_EXTR "Change extruder" + +#define(length=20, lines=4) MSG_FIL_ADJUSTING "Adjusting filaments. Please wait." +#define(length=20,lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filaments are now adjusted. Please clean the nozzle for calibration. Click when done." +#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" +#define(length=20, lines=1) MSG_CALIBRATE_E "Calibrate E" +//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." +#define(length=20, lines=8) MSG_E_CAL_KNOB "Rotate knob until mark reaches extruder body. Click when done." + +//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" +#define(length=20, lines=8) MSG_MARK_FIL "Mark filament 100mm from extruder body. Click when done." +#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E calibration finished. Please clean the nozzle. Click when done." +#define(length=20, lines=3) MSG_WAITING_TEMP "Waiting for nozzle and bed cooling" +#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Is color clear?" +#define(length=20, lines=1) MSG_UNLOADING_FILAMENT "Unloading filament" +#define(length=20, lines=10) MSG_PAPER "Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately." + +#define(length=20) MSG_BED_CORRECTION_MENU "Bed level correct" +#define(length=20) MSG_BED_CORRECTION_LEFT "Left side [um]" +#define(length=20) MSG_BED_CORRECTION_RIGHT "Right side[um]" +#define(length=20) MSG_BED_CORRECTION_FRONT "Front side[um]" +#define(length=20) MSG_BED_CORRECTION_REAR "Rear side [um]" +#define(length=20) MSG_BED_CORRECTION_RESET "Reset" + +#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Calibration" +#define(length=20) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" +#define(length=20) MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" +#define(length=20) MSG_PRINTER_DISCONNECTED "Printer disconnected" +#define(length=20, lines=1) MSG_FINISHING_MOVEMENTS "Finishing movements" +#define(length=20, lines=1) MSG_PRINT_PAUSED "Print paused" +#define(length=20, lines=1) MSG_RESUMING_PRINT "Resuming print" +#define(length=20, lines=1) MSG_PID_EXTRUDER "PID calibration" +#define(length=20, lines=1) MSG_SET_TEMPERATURE "Set temperature:" +#define(length=20, lines=1) MSG_PID_FINISHED "PID cal. finished " +#define(length=20, lines=1) MSG_PID_RUNNING "PID cal. " +#define(length=20, lines=1) MSG_PID_BED "PID bed cal. " +#define(length=20, lines=1) MSG_PID_BED_FINISHED "PID bed cal. done " +#define(length=20, lines=1) MSG_PID_BED_RUNNING "PID bed cal. " + +#define(length=20, lines=1) MSG_CALIBRATE_PINDA "PINDA Temp. cal." +#define(length=20, lines=1) MSG_CALIBRATION_PINDA_MENU "PINDA Temp. cal." +#define(length=20, lines=4) MSG_PINDA_NOT_CALIBRATED "PINDA temperature calibration has not been run yet" +#define(length=20, lines=1) MSG_PINDA_PREHEAT "PINDA Heating" +#define(length=20, lines=1) MSG_TEMP_CALIBRATION "PINDA Temp.cal. " +#define(length=20, lines=5) MSG_TEMP_CALIBRATION_DONE "PINDA temperature calibration is finished. Click to continue." +#define(length=20, lines=1) MSG_TEMP_CALIBRATION_ON "PINDA T.cal. [ON]" +#define(length=20, lines=1) MSG_TEMP_CALIBRATION_OFF "PINDA T.cal.[OFF]" +#define(length=20, lines=1) MSG_PREPARE_FILAMENT "Prepare new filament" +#define(length=19, lines=1) MSG_ALL "All" +#define(length=19, lines=1) MSG_USED "Used during print" +#define(length=19, lines=1) MSG_CURRENT "Current" +#define(length=20, lines=1) MSG_CHOOSE_EXTRUDER "Choose extruder:" +#define(length=17, lines=1) MSG_EXTRUDER "Extruder" +#define(length=17, lines=1) MSG_EXTRUDER_1 "Extruder 1" +#define(length=17, lines=1) MSG_EXTRUDER_2 "Extruder 2" +#define(length=17, lines=1) MSG_EXTRUDER_3 "Extruder 3" +#define(length=17, lines=1) MSG_EXTRUDER_4 "Extruder 4" +#define(length=17, lines=1) MSG_DATE "Date:" +#define(length=19, lines=1) MSG_XYZ_DETAILS "XYZ cal. details" +#define(length=20, lines=1) MSG_Y_DISTANCE_FROM_MIN "Y distance from min:" +#define(length=12, lines=1) MSG_LEFT "Left:" +#define(length=12, lines=1) MSG_CENTER "Center:" +#define(length=12, lines=1) MSG_RIGHT "Right:" +#define(length=15, lines=1) MSG_MEASURED_SKEW "Measured skew:" +#define(length=15, lines=1) MSG_SLIGHT_SKEW "Slight skew:" +#define(length=15, lines=1) MSG_SEVERE_SKEW "Severe skew:" diff --git a/Firmware/language_es.h b/Firmware/language_es.h index 1d56ed025..68a8e043f 100644 --- a/Firmware/language_es.h +++ b/Firmware/language_es.h @@ -1,307 +1,307 @@ -/** - * Spanish - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ - -#define WELCOME_MSG CUSTOM_MENDEL_NAME " prep." -#define MSG_SD_INSERTED "Tarjeta insertada" -#define MSG_SD_REMOVED "Tarjeta retirada" -#define MSG_MAIN "Menu principal" -#define MSG_DISABLE_STEPPERS "Apagar motores" -#define MSG_AUTO_HOME "Llevar al origen" -#define MSG_COOLDOWN "Enfriar" -#define MSG_MOVE_AXIS "Mover ejes" -#define MSG_MOVE_X "Mover X" -#define MSG_MOVE_Y "Mover Y" -#define MSG_MOVE_Z "Mover Z" -#define MSG_MOVE_E "Extruir" -#define MSG_SPEED "Velocidad" -#define MSG_NOZZLE "Boquilla" -#define MSG_BED "Base" -#define MSG_FAN_SPEED "Velocidad Vent." -#define MSG_FLOW "Flujo" -#define MSG_TEMPERATURE "Temperatura" -#define MSG_WATCH "Monitorizar" -#define MSG_TUNE "Ajustar" -#define MSG_PAUSE_PRINT "Pausar impresion" -#define MSG_RESUME_PRINT "Reanudar impres." -#define MSG_STOP_PRINT "Detener impresion" -#define MSG_CARD_MENU "Menu tarjeta SD" -#define MSG_NO_CARD "No hay tarjeta SD" -#define MSG_DWELL "En espera" -#define MSG_USERWAIT "Esperando ordenes" -#define MSG_RESUMING "Resumiendo impresion" -#define MSG_PRINT_ABORTED "Impresion cancelada" -#define MSG_NO_MOVE "Sin movimiento" -#define MSG_KILLED "PARADA DE EMERGENCIA" -#define MSG_STOPPED "PARADA" -#define MSG_FILAMENTCHANGE "Cambiar filamento" -#define MSG_BABYSTEP_Z "Micropaso Eje Z" -#define MSG_ADJUSTZ "Ajustar Eje Z" -#define MSG_PICK_Z "Esc. Modelo Adecuado" - -#define MSG_SETTINGS "Configuracion" -#define MSG_PREHEAT "Precalentar" -#define MSG_UNLOAD_FILAMENT "Soltar filamento" -#define MSG_LOAD_FILAMENT "Introducir filam." -#define MSG_ERROR "ERROR:" -#define MSG_PREHEAT_NOZZLE "Precalentar extrusor" -#define MSG_SUPPORT "Soporte" -#define MSG_CORRECTLY "Cambiado correct.?" -#define MSG_YES "Si" -#define MSG_NO "No" -#define MSG_NOT_LOADED "Fil. no introducido" -#define MSG_NOT_COLOR "Color no homogeneo" -#define MSG_LOADING_FILAMENT "Introduciendo filam." -#define MSG_PLEASE_WAIT "Por Favor Esperar" -#define MSG_LOADING_COLOR "Cambiando color" -#define MSG_CHANGE_SUCCESS "Cambio correcto" -#define MSG_PRESS "Pulsar el mando" -#define MSG_INSERT_FILAMENT "Introducir filamento" -#define MSG_CHANGING_FILAMENT "Cambiando filamento" -#define MSG_SILENT_MODE_ON "Modo [silencio]" -#define MSG_SILENT_MODE_OFF "Modo [rend.pleno]" -#define MSG_REBOOT "Reiniciar impresora" -#define MSG_TAKE_EFFECT " para aplicar cambios" -#define MSG_HEATING "Calentando..." -#define MSG_HEATING_COMPLETE "Calentamiento final." -#define MSG_BED_HEATING "Calentando Base" -#define MSG_BED_DONE "Base preparada" -#define MSG_LANGUAGE_NAME "Espanol" -#define MSG_LANGUAGE_SELECT "Cambiae el idioma" -#define MSG_PRUSA3D "prusa3d.com" -#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" -#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" - - -// Do not translate those! - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Last Updated: " -#define MSG_FREE_MEMORY " Free Memory: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define MSG_BEGIN_FILE_LIST "Begin file list" -#define MSG_END_FILE_LIST "End file list" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Printer halted. kill() called!" -#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Reporting endstop status" -#define MSG_ENDSTOP_HIT "TRIGGERED" -#define MSG_ENDSTOP_OPEN "open" -#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "File opened: " -#define MSG_SD_FILE_SELECTED "File selected" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Not SD printing" -#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" -#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Adjusting Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" -#define MSG_SET_HOME_OFFSETS "Set home offsets" -#define MSG_SET_ORIGIN "Set origin" -#define MSG_SWITCH_PS_ON "Switch power on" -#define MSG_SWITCH_PS_OFF "Switch power off" -#define MSG_NOZZLE1 "Nozzle2" -#define MSG_NOZZLE2 "Nozzle3" -#define MSG_FLOW0 "Flow 0" -#define MSG_FLOW1 "Flow 1" -#define MSG_FLOW2 "Flow 2" -#define MSG_CONTROL "Control" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fact" -#define MSG_MOTION "Motion" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "Store memory" -#define MSG_LOAD_EPROM "Load memory" -#define MSG_RESTORE_FAILSAFE "Restore failsafe" -#define MSG_REFRESH "\xF8" "Refresh" -#define MSG_INIT_SDCARD "Init. SD card" -#define MSG_CNG_SDCARD "Change SD card" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_RECTRACT "Rectract" - -#define MSG_HOMEYZ "Calibrar Z" -#define MSG_HOMEYZ_PROGRESS "Calibrando Z" -#define MSG_HOMEYZ_DONE "Calibracion OK" - -#define MSG_SELFTEST_ERROR "Autotest error!" -#define MSG_SELFTEST_PLEASECHECK "Controla :" -#define MSG_SELFTEST_NOTCONNECTED "No hay conexion " -#define MSG_SELFTEST_HEATERTHERMISTOR "Calent./Termistor" -#define MSG_SELFTEST_BEDHEATER "Cama/Calentador" -#define MSG_SELFTEST_WIRINGERROR "Error de conexion" -#define MSG_SELFTEST_ENDSTOPS "Topes final" -#define MSG_SELFTEST_MOTOR "Motor" -#define MSG_SELFTEST_ENDSTOP "Tope final" -#define MSG_SELFTEST_ENDSTOP_NOTHIT "Tope fin. no toc." -#define MSG_SELFTEST_OK "Self test OK" - -#define(length=20) MSG_SELFTEST_FAN "Test del ventilador"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Vent. al frente?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Vent. en la izg?"; -#define MSG_SELFTEST_FAN_YES "Ventilador gira"; -#define MSG_SELFTEST_FAN_NO "Ventilador no gira"; - -#define MSG_STATS_TOTALFILAMENT "Filamento total:" -#define MSG_STATS_TOTALPRINTTIME "Tiempo total :" -#define MSG_STATS_FILAMENTUSED "Filamento : " -#define MSG_STATS_PRINTTIME "Tiempo de imp.:" - -#define MSG_SELFTEST_START "Autotest salida" -#define MSG_SELFTEST_CHECK_ENDSTOPS "Cont. topes final" -#define MSG_SELFTEST_CHECK_HOTEND "Control hotend " -#define MSG_SELFTEST_CHECK_X "Control del eje X" -#define MSG_SELFTEST_CHECK_Y "Control del eje Y" -#define MSG_SELFTEST_CHECK_Z "Control del eje Z" -#define MSG_SELFTEST_CHECK_BED "Control de cama" -#define MSG_SELFTEST_CHECK_ALLCORRECT "Todo bie " -#define MSG_SELFTEST "Autotest" -#define MSG_SELFTEST_FAILED "Autotest fallado" - -#define MSG_STATISTICS "Estadistica " -#define MSG_USB_PRINTING "Impresion de USB " - -#define MSG_SHOW_END_STOPS "Ensena tope final" -#define MSG_CALIBRATE_BED "Calibra XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset XYZ calibr." -#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Calibrando XYZ. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic." -#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Calibrando Z. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic." - -#define MSG_CONFIRM_NOZZLE_CLEAN "Limpiar boquilla para calibracion. Click cuando acabes." -#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Carros Z izq./der. estan arriba maximo?" -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Buscando cama punto de calibracion" -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " de 4" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Mejorando cama punto de calibracion" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " de 9" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Medir la altura del punto de la calibracion" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " de 9" - -#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Reiteracion " -#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados." -#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Calibracion XYZ fallada. Consultar el manual por favor." -#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Calibracion XYZ ok. Ejes X/Y perpendiculares. Felicitaciones!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Calibracion XYZ correcta. La inclinacion se corregira automaticamente." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Calibracion XYZ fallad. Punto delantero derecho no alcanzable." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Calibracion XYZ fallad. Punto delanteros no alcanzables." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Calibrazion XYZ comprometida. Punto delanteros no alcanzables." -#define MSG_BED_LEVELING_FAILED_POINT_LOW "Nivelacion fallada. Sensor no funciona. Escombros en Boqui.? Esperando reset." -#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Nivelacion fallada. Sensor funciona demasiado temprano. Esperando reset." -#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Nivelacion fallada. Sensor desconectado o cables danados. Esperando reset." -#define MSG_NEW_FIRMWARE_AVAILABLE "Nuevo firmware disponible:" -#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Actualizar por favor" -#define MSG_FOLLOW_CALIBRATION_FLOW "Impresora no esta calibrada todavia. Por favor usar el manual, el capitulo First steps, seleccion Calibration flow." -#define MSG_BABYSTEP_Z_NOT_SET "Distancia entre la punta de la boquilla y la superficie de la cama no fijada aun. Por favor siga el manual, capitulo First steps, seccion First layer calibration." -#define MSG_BED_CORRECTION_MENU "Corr. de la cama" -#define MSG_BED_CORRECTION_LEFT "Izquierda [um]" -#define MSG_BED_CORRECTION_RIGHT "Derecha [um]" -#define MSG_BED_CORRECTION_FRONT "Adelante [um]" -#define MSG_BED_CORRECTION_REAR "Atras [um]" -#define MSG_BED_CORRECTION_RESET "Reset" - -#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Calibracion" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" - -#define MSG_LOOSE_PULLEY "Polea suelta" -#define MSG_FILAMENT_LOADING_T0 "Insertar filamento en el extrusor 1. Haga clic una vez terminado." -#define MSG_FILAMENT_LOADING_T1 "Insertar filamento en el extrusor 2. Haga clic una vez terminado." -#define MSG_FILAMENT_LOADING_T2 "Insertar filamento en el extrusor 3. Haga clic una vez terminado." -#define MSG_FILAMENT_LOADING_T3 "Insertar filamento en el extrusor 4. Haga clic una vez terminado." -#define MSG_CHANGE_EXTR "Cambiar extrusor." - -#define MSG_FIL_ADJUSTING "Ajustando filamentos. Esperar por favor." -#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamentos ajustados. Limpie la boquilla para calibracion. Haga clic una vez terminado." -#define MSG_CALIBRATE_E "Calibrar E" -#define MSG_E_CAL_KNOB "Rotar el mando hasta que la marca llegue al cuerpo del extrusor. Haga clic una vez terminado." -#define MSG_MARK_FIL "Marque el filamento 100 mm por encima del final del extrusor. Hacer clic una vez terminado." -#define MSG_CLEAN_NOZZLE_E "E calibrado. Limpiar la boquilla. Haga clic una vez terminado." -#define MSG_WAITING_TEMP "Esperando enfriamiento de la cama y del extrusor." -#define MSG_FILAMENT_CLEAN "Es el nuevo color nitido?" -#define MSG_UNLOADING_FILAMENT "Soltando filamento" -#define MSG_PAPER "Colocar una hoja de papel sobre la superficie de impresion durante la calibracion de los primeros 4 puntos. Si la boquilla mueve el papel, apagar impresora inmediatamente." - -#define MSG_FINISHING_MOVEMENTS "Term. movimientos" -#define MSG_PRINT_PAUSED "Impresion en pausa" -#define MSG_RESUMING_PRINT "Reanudar impresion" -#define MSG_PID_EXTRUDER "Calibracion PID" -#define MSG_SET_TEMPERATURE "Establecer temp.:" -#define MSG_PID_FINISHED "Cal. PID terminada" -#define MSG_PID_RUNNING "Cal. PID " - -#define MSG_CALIBRATE_PINDA "Calibrar" -#define MSG_CALIBRATION_PINDA_MENU "Calibracion temp." -#define MSG_PINDA_NOT_CALIBRATED "La temperatura de calibracion no ha sido ajustada" -#define MSG_PINDA_PREHEAT "Calentando PINDA" -#define MSG_TEMP_CALIBRATION "Cal. temp. " -#define MSG_TEMP_CALIBRATION_DONE "Calibracon temperatura terminada. Presionar para continuar." -#define MSG_TEMP_CALIBRATION_ON "Cal. temp. [ON]" -#define MSG_TEMP_CALIBRATION_OFF "Cal. temp. [OFF]" - -#define MSG_PREPARE_FILAMENT "Preparar filamento" - - - -#define MSG_LOAD_ALL "Intr. todos fil." -#define MSG_LOAD_FILAMENT_1 "Introducir fil. 1" -#define MSG_LOAD_FILAMENT_2 "Introducir fil. 2" -#define MSG_LOAD_FILAMENT_3 "Introducir fil. 3" -#define MSG_LOAD_FILAMENT_4 "Introducir fil. 4" -#define MSG_UNLOAD_FILAMENT_1 "Soltar fil. 1" -#define MSG_UNLOAD_FILAMENT_2 "Soltar fil. 2" -#define MSG_UNLOAD_FILAMENT_3 "Soltar fil. 3" -#define MSG_UNLOAD_FILAMENT_4 "Soltar fil. 4" -#define MSG_UNLOAD_ALL "Soltar todos fil." -#define MSG_PREPARE_FILAMENT "Preparar filamento" -#define MSG_ALL "Todos" -#define MSG_USED "Usado en impresion" -#define MSG_CURRENT "Actual" -#define MSG_CHOOSE_EXTRUDER "Elegir extrusor:" -#define MSG_EXTRUDER "Extrusor" -#define MSG_EXTRUDER_1 "Extrusor 1" -#define MSG_EXTRUDER_2 "Extrusor 2" -#define MSG_EXTRUDER_3 "Extrusor 3" -#define MSG_EXTRUDER_4 "Extrusor 4" -#define MSG_DATE "Fecha:" -#define MSG_XYZ_DETAILS "Inform. XYZ cal." -#define MSG_Y_DISTANCE_FROM_MIN "Dist. Y desde min:" -#define MSG_LEFT "Izquierda:" -#define MSG_CENTER "Centro:" -#define MSG_RIGHT "Derecha:" -#define MSG_MEASURED_SKEW "Inclin. medida:" -#define MSG_SLIGHT_SKEW "Inclin. ligera:" +/** + * Spanish + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ + +#define WELCOME_MSG CUSTOM_MENDEL_NAME " prep." +#define MSG_SD_INSERTED "Tarjeta insertada" +#define MSG_SD_REMOVED "Tarjeta retirada" +#define MSG_MAIN "Menu principal" +#define MSG_DISABLE_STEPPERS "Apagar motores" +#define MSG_AUTO_HOME "Llevar al origen" +#define MSG_COOLDOWN "Enfriar" +#define MSG_MOVE_AXIS "Mover ejes" +#define MSG_MOVE_X "Mover X" +#define MSG_MOVE_Y "Mover Y" +#define MSG_MOVE_Z "Mover Z" +#define MSG_MOVE_E "Extruir" +#define MSG_SPEED "Velocidad" +#define MSG_NOZZLE "Boquilla" +#define MSG_BED "Base" +#define MSG_FAN_SPEED "Velocidad Vent." +#define MSG_FLOW "Flujo" +#define MSG_TEMPERATURE "Temperatura" +#define MSG_WATCH "Monitorizar" +#define MSG_TUNE "Ajustar" +#define MSG_PAUSE_PRINT "Pausar impresion" +#define MSG_RESUME_PRINT "Reanudar impres." +#define MSG_STOP_PRINT "Detener impresion" +#define MSG_CARD_MENU "Menu tarjeta SD" +#define MSG_NO_CARD "No hay tarjeta SD" +#define MSG_DWELL "En espera" +#define MSG_USERWAIT "Esperando ordenes" +#define MSG_RESUMING "Resumiendo impresion" +#define MSG_PRINT_ABORTED "Impresion cancelada" +#define MSG_NO_MOVE "Sin movimiento" +#define MSG_KILLED "PARADA DE EMERGENCIA" +#define MSG_STOPPED "PARADA" +#define MSG_FILAMENTCHANGE "Cambiar filamento" +#define MSG_BABYSTEP_Z "Micropaso Eje Z" +#define MSG_ADJUSTZ "Ajustar Eje Z" +#define MSG_PICK_Z "Esc. Modelo Adecuado" + +#define MSG_SETTINGS "Configuracion" +#define MSG_PREHEAT "Precalentar" +#define MSG_UNLOAD_FILAMENT "Soltar filamento" +#define MSG_LOAD_FILAMENT "Introducir filam." +#define MSG_ERROR "ERROR:" +#define MSG_PREHEAT_NOZZLE "Precalentar extrusor" +#define MSG_SUPPORT "Soporte" +#define MSG_CORRECTLY "Cambiado correct.?" +#define MSG_YES "Si" +#define MSG_NO "No" +#define MSG_NOT_LOADED "Fil. no introducido" +#define MSG_NOT_COLOR "Color no homogeneo" +#define MSG_LOADING_FILAMENT "Introduciendo filam." +#define MSG_PLEASE_WAIT "Por Favor Esperar" +#define MSG_LOADING_COLOR "Cambiando color" +#define MSG_CHANGE_SUCCESS "Cambio correcto" +#define MSG_PRESS "Pulsar el mando" +#define MSG_INSERT_FILAMENT "Introducir filamento" +#define MSG_CHANGING_FILAMENT "Cambiando filamento" +#define MSG_SILENT_MODE_ON "Modo [silencio]" +#define MSG_SILENT_MODE_OFF "Modo [rend.pleno]" +#define MSG_REBOOT "Reiniciar impresora" +#define MSG_TAKE_EFFECT " para aplicar cambios" +#define MSG_HEATING "Calentando..." +#define MSG_HEATING_COMPLETE "Calentamiento final." +#define MSG_BED_HEATING "Calentando Base" +#define MSG_BED_DONE "Base preparada" +#define MSG_LANGUAGE_NAME "Espanol" +#define MSG_LANGUAGE_SELECT "Cambiae el idioma" +#define MSG_PRUSA3D "prusa3d.com" +#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" +#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" + + +// Do not translate those! + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Last Updated: " +#define MSG_FREE_MEMORY " Free Memory: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " +#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " +#define MSG_BEGIN_FILE_LIST "Begin file list" +#define MSG_END_FILE_LIST "End file list" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Printer halted. kill() called!" +#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Reporting endstop status" +#define MSG_ENDSTOP_HIT "TRIGGERED" +#define MSG_ENDSTOP_OPEN "open" +#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "File opened: " +#define MSG_SD_FILE_SELECTED "File selected" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Not SD printing" +#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" +#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Adjusting Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" +#define MSG_SET_HOME_OFFSETS "Set home offsets" +#define MSG_SET_ORIGIN "Set origin" +#define MSG_SWITCH_PS_ON "Switch power on" +#define MSG_SWITCH_PS_OFF "Switch power off" +#define MSG_NOZZLE1 "Nozzle2" +#define MSG_NOZZLE2 "Nozzle3" +#define MSG_FLOW0 "Flow 0" +#define MSG_FLOW1 "Flow 1" +#define MSG_FLOW2 "Flow 2" +#define MSG_CONTROL "Control" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fact" +#define MSG_MOTION "Motion" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "Store memory" +#define MSG_LOAD_EPROM "Load memory" +#define MSG_RESTORE_FAILSAFE "Restore failsafe" +#define MSG_REFRESH "\xF8" "Refresh" +#define MSG_INIT_SDCARD "Init. SD card" +#define MSG_CNG_SDCARD "Change SD card" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_RECTRACT "Rectract" + +#define MSG_HOMEYZ "Calibrar Z" +#define MSG_HOMEYZ_PROGRESS "Calibrando Z" +#define MSG_HOMEYZ_DONE "Calibracion OK" + +#define MSG_SELFTEST_ERROR "Autotest error!" +#define MSG_SELFTEST_PLEASECHECK "Controla :" +#define MSG_SELFTEST_NOTCONNECTED "No hay conexion " +#define MSG_SELFTEST_HEATERTHERMISTOR "Calent./Termistor" +#define MSG_SELFTEST_BEDHEATER "Cama/Calentador" +#define MSG_SELFTEST_WIRINGERROR "Error de conexion" +#define MSG_SELFTEST_ENDSTOPS "Topes final" +#define MSG_SELFTEST_MOTOR "Motor" +#define MSG_SELFTEST_ENDSTOP "Tope final" +#define MSG_SELFTEST_ENDSTOP_NOTHIT "Tope fin. no toc." +#define MSG_SELFTEST_OK "Self test OK" + +#define(length=20) MSG_SELFTEST_FAN "Test del ventilador"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Vent. al frente?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Vent. en la izg?"; +#define MSG_SELFTEST_FAN_YES "Ventilador gira"; +#define MSG_SELFTEST_FAN_NO "Ventilador no gira"; + +#define MSG_STATS_TOTALFILAMENT "Filamento total:" +#define MSG_STATS_TOTALPRINTTIME "Tiempo total :" +#define MSG_STATS_FILAMENTUSED "Filamento : " +#define MSG_STATS_PRINTTIME "Tiempo de imp.:" + +#define MSG_SELFTEST_START "Autotest salida" +#define MSG_SELFTEST_CHECK_ENDSTOPS "Cont. topes final" +#define MSG_SELFTEST_CHECK_HOTEND "Control hotend " +#define MSG_SELFTEST_CHECK_X "Control del eje X" +#define MSG_SELFTEST_CHECK_Y "Control del eje Y" +#define MSG_SELFTEST_CHECK_Z "Control del eje Z" +#define MSG_SELFTEST_CHECK_BED "Control de cama" +#define MSG_SELFTEST_CHECK_ALLCORRECT "Todo bie " +#define MSG_SELFTEST "Autotest" +#define MSG_SELFTEST_FAILED "Autotest fallado" + +#define MSG_STATISTICS "Estadistica " +#define MSG_USB_PRINTING "Impresion de USB " + +#define MSG_SHOW_END_STOPS "Ensena tope final" +#define MSG_CALIBRATE_BED "Calibra XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset XYZ calibr." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Calibrando XYZ. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Calibrando Z. Gira el boton para subir el carro Z hasta golpe piezas superioras. Despues haz clic." + +#define MSG_CONFIRM_NOZZLE_CLEAN "Limpiar boquilla para calibracion. Click cuando acabes." +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Carros Z izq./der. estan arriba maximo?" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Buscando cama punto de calibracion" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " de 4" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Mejorando cama punto de calibracion" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " de 9" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Medir la altura del punto de la calibracion" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " de 9" + +#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Reiteracion " +#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Calibracion XYZ fallada. Puntos de calibracion en la cama no encontrados." +#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Calibracion XYZ fallada. Consultar el manual por favor." +#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Calibracion XYZ ok. Ejes X/Y perpendiculares. Felicitaciones!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Calibracion XYZ correcta. Los ejes X / Y estan ligeramente inclinados. Buen trabajo!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Calibracion XYZ correcta. La inclinacion se corregira automaticamente." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Calibracion XYZ fallad. Punto delantero izquierdo no alcanzable." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Calibracion XYZ fallad. Punto delantero derecho no alcanzable." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Calibracion XYZ fallad. Punto delanteros no alcanzables." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Calibrazion XYZ comprometida. Punto delantero izquierdo no alcanzable." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Calibrazion XYZ comprometida. Punto delantero derecho no alcanzable." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Calibrazion XYZ comprometida. Punto delanteros no alcanzables." +#define MSG_BED_LEVELING_FAILED_POINT_LOW "Nivelacion fallada. Sensor no funciona. Escombros en Boqui.? Esperando reset." +#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Nivelacion fallada. Sensor funciona demasiado temprano. Esperando reset." +#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Nivelacion fallada. Sensor desconectado o cables danados. Esperando reset." +#define MSG_NEW_FIRMWARE_AVAILABLE "Nuevo firmware disponible:" +#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Actualizar por favor" +#define MSG_FOLLOW_CALIBRATION_FLOW "Impresora no esta calibrada todavia. Por favor usar el manual, el capitulo First steps, seleccion Calibration flow." +#define MSG_BABYSTEP_Z_NOT_SET "Distancia entre la punta de la boquilla y la superficie de la cama no fijada aun. Por favor siga el manual, capitulo First steps, seccion First layer calibration." +#define MSG_BED_CORRECTION_MENU "Corr. de la cama" +#define MSG_BED_CORRECTION_LEFT "Izquierda [um]" +#define MSG_BED_CORRECTION_RIGHT "Derecha [um]" +#define MSG_BED_CORRECTION_FRONT "Adelante [um]" +#define MSG_BED_CORRECTION_REAR "Atras [um]" +#define MSG_BED_CORRECTION_RESET "Reset" + +#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Calibracion" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" + +#define MSG_LOOSE_PULLEY "Polea suelta" +#define MSG_FILAMENT_LOADING_T0 "Insertar filamento en el extrusor 1. Haga clic una vez terminado." +#define MSG_FILAMENT_LOADING_T1 "Insertar filamento en el extrusor 2. Haga clic una vez terminado." +#define MSG_FILAMENT_LOADING_T2 "Insertar filamento en el extrusor 3. Haga clic una vez terminado." +#define MSG_FILAMENT_LOADING_T3 "Insertar filamento en el extrusor 4. Haga clic una vez terminado." +#define MSG_CHANGE_EXTR "Cambiar extrusor." + +#define MSG_FIL_ADJUSTING "Ajustando filamentos. Esperar por favor." +#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamentos ajustados. Limpie la boquilla para calibracion. Haga clic una vez terminado." +#define MSG_CALIBRATE_E "Calibrar E" +#define MSG_E_CAL_KNOB "Rotar el mando hasta que la marca llegue al cuerpo del extrusor. Haga clic una vez terminado." +#define MSG_MARK_FIL "Marque el filamento 100 mm por encima del final del extrusor. Hacer clic una vez terminado." +#define MSG_CLEAN_NOZZLE_E "E calibrado. Limpiar la boquilla. Haga clic una vez terminado." +#define MSG_WAITING_TEMP "Esperando enfriamiento de la cama y del extrusor." +#define MSG_FILAMENT_CLEAN "Es el nuevo color nitido?" +#define MSG_UNLOADING_FILAMENT "Soltando filamento" +#define MSG_PAPER "Colocar una hoja de papel sobre la superficie de impresion durante la calibracion de los primeros 4 puntos. Si la boquilla mueve el papel, apagar impresora inmediatamente." + +#define MSG_FINISHING_MOVEMENTS "Term. movimientos" +#define MSG_PRINT_PAUSED "Impresion en pausa" +#define MSG_RESUMING_PRINT "Reanudar impresion" +#define MSG_PID_EXTRUDER "Calibracion PID" +#define MSG_SET_TEMPERATURE "Establecer temp.:" +#define MSG_PID_FINISHED "Cal. PID terminada" +#define MSG_PID_RUNNING "Cal. PID " + +#define MSG_CALIBRATE_PINDA "Calibrar" +#define MSG_CALIBRATION_PINDA_MENU "Calibracion temp." +#define MSG_PINDA_NOT_CALIBRATED "La temperatura de calibracion no ha sido ajustada" +#define MSG_PINDA_PREHEAT "Calentando PINDA" +#define MSG_TEMP_CALIBRATION "Cal. temp. " +#define MSG_TEMP_CALIBRATION_DONE "Calibracon temperatura terminada. Presionar para continuar." +#define MSG_TEMP_CALIBRATION_ON "Cal. temp. [ON]" +#define MSG_TEMP_CALIBRATION_OFF "Cal. temp. [OFF]" + +#define MSG_PREPARE_FILAMENT "Preparar filamento" + + + +#define MSG_LOAD_ALL "Intr. todos fil." +#define MSG_LOAD_FILAMENT_1 "Introducir fil. 1" +#define MSG_LOAD_FILAMENT_2 "Introducir fil. 2" +#define MSG_LOAD_FILAMENT_3 "Introducir fil. 3" +#define MSG_LOAD_FILAMENT_4 "Introducir fil. 4" +#define MSG_UNLOAD_FILAMENT_1 "Soltar fil. 1" +#define MSG_UNLOAD_FILAMENT_2 "Soltar fil. 2" +#define MSG_UNLOAD_FILAMENT_3 "Soltar fil. 3" +#define MSG_UNLOAD_FILAMENT_4 "Soltar fil. 4" +#define MSG_UNLOAD_ALL "Soltar todos fil." +#define MSG_PREPARE_FILAMENT "Preparar filamento" +#define MSG_ALL "Todos" +#define MSG_USED "Usado en impresion" +#define MSG_CURRENT "Actual" +#define MSG_CHOOSE_EXTRUDER "Elegir extrusor:" +#define MSG_EXTRUDER "Extrusor" +#define MSG_EXTRUDER_1 "Extrusor 1" +#define MSG_EXTRUDER_2 "Extrusor 2" +#define MSG_EXTRUDER_3 "Extrusor 3" +#define MSG_EXTRUDER_4 "Extrusor 4" +#define MSG_DATE "Fecha:" +#define MSG_XYZ_DETAILS "Inform. XYZ cal." +#define MSG_Y_DISTANCE_FROM_MIN "Dist. Y desde min:" +#define MSG_LEFT "Izquierda:" +#define MSG_CENTER "Centro:" +#define MSG_RIGHT "Derecha:" +#define MSG_MEASURED_SKEW "Inclin. medida:" +#define MSG_SLIGHT_SKEW "Inclin. ligera:" #define MSG_SEVERE_SKEW "Inclin. severa:" \ No newline at end of file diff --git a/Firmware/language_nl.h b/Firmware/language_nl.h index 63dafc044..f29aa7e85 100644 --- a/Firmware/language_nl.h +++ b/Firmware/language_nl.h @@ -1,326 +1,326 @@ -/** - * Dutch - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ - -#define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " gereed." -#define MSG_SD_INSERTED "SD ingestoken" -#define MSG_SD_REMOVED "SD verwijderd" -#define MSG_MAIN "Hoofdmenu" -#define(length=20) MSG_DISABLE_STEPPERS "Motoren uit" -#define MSG_AUTO_HOME "Startpositie" -#define MSG_SET_HOME_OFFSETS "Set home offsets" -#define MSG_SET_ORIGIN "Oorsprong instellen" -#define MSG_COOLDOWN "Afkoelen" -#define MSG_SWITCH_PS_ON "Opstarten" -#define MSG_SWITCH_PS_OFF "Uitschakelen" -#define MSG_MOVE_AXIS "As verplaatsen" -#define MSG_MOVE_X "Verplaats X" -#define MSG_MOVE_Y "Verplaats Y" -#define MSG_MOVE_Z "Verplaats Z" -#define MSG_MOVE_E "Extruder" -#define MSG_SPEED "Snelheid" -#define MSG_NOZZLE "Tuit" -#define MSG_NOZZLE1 "Tuit2" -#define MSG_NOZZLE2 "Tuit3" -#define MSG_BED "Bed" -#define(length=20) MSG_FAN_SPEED "Fan snelheid" -#define MSG_FLOW "Flow" -#define MSG_FLOW0 "Flow 0" -#define MSG_FLOW1 "Flow 1" -#define MSG_FLOW2 "Flow 2" -#define MSG_CONTROL "Control" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fact" -#define MSG_TEMPERATURE "Temperatuur" -#define MSG_MOTION "Beweging" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "Geheugen opslaan" -#define MSG_LOAD_EPROM "Geheugen laden" -#define MSG_RESTORE_FAILSAFE "Backup terugzetten" -#define MSG_REFRESH "\xF8" "Herladen" -#define MSG_WATCH "Info scherm" -#define MSG_TUNE "Fijninstellingen" -#define MSG_PAUSE_PRINT "Print pauzeren" -#define MSG_RESUME_PRINT "Print hervatten" -#define MSG_STOP_PRINT "Print stoppen" -#define MSG_CARD_MENU "Print van SD" -#define MSG_NO_CARD "Geen SD kaart" -#define MSG_DWELL "Slapen..." -#define(length=20) MSG_USERWAIT "Wachten op gebruiker" -#define(length=20, lines=2) MSG_RESUMING "Print hervatten" -#define(length=20) MSG_PRINT_ABORTED "Print afgebroken" -#define MSG_NO_MOVE "Geen beweging." -#define(length=20) MSG_KILLED "NOODSTOP/KILLED. " -#define MSG_STOPPED "GESTOPT. " -#define MSG_FILAMENTCHANGE "Wissel filament" -#define MSG_INIT_SDCARD "Init. SD kaart" -#define MSG_CNG_SDCARD "Wissel SD kaart" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" -#define MSG_BABYSTEP_Z "Live Z aanpassen" -#define(length=20) MSG_ADJUSTZ "Auto instellen Z?" -#define(length=20) MSG_PICK_Z "Pick print" - -#define MSG_SETTINGS "Instellingen" -#define MSG_PREHEAT "Voorverwarmen" -#define MSG_UNLOAD_FILAMENT "Filament uithalen" -#define MSG_LOAD_FILAMENT "Filament laden" -#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" -#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" -#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" -#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" -#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filament 1 uithalen" -#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filament 2 uithalen" -#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filament 3 uithalen" -#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filament 4 uithalen" -#define(length=20) MSG_UNLOAD_ALL "Alle uithalen" -#define(length=20) MSG_LOAD_ALL "Alle laden" - -#define MSG_RECTRACT "Rectract" -#define MSG_ERROR "FOUT:" -#define(length=20) MSG_PREHEAT_NOZZLE "Tuit voorverwarmen!" -#define MSG_SUPPORT "Support" -#define(length=20) MSG_CORRECTLY "Wissel ok?" -#define MSG_YES "Ja" -#define MSG_NO "Nee" -#define(length=20) MSG_NOT_LOADED "Fil. niet geladen" -#define(length=20) MSG_NOT_COLOR "Kleur niet duidelijk" -#define(length=20) MSG_LOADING_FILAMENT "Laade Filament" -#define(length=20) MSG_PLEASE_WAIT "Wacht aub" -#define MSG_LOADING_COLOR "Laade kleur" -#define(length=20) MSG_CHANGE_SUCCESS "Wissel succesvol!" -#define(length=20) MSG_PRESS "en druk op knop" -#define(length=20) MSG_INSERT_FILAMENT "Filament insteken" -#define(length=20) MSG_CHANGING_FILAMENT "Wissel filament!" - - -#define MSG_SILENT_MODE_ON "Mode [silent]" -#define MSG_SILENT_MODE_OFF "Mode [high power]" -#define(length=20) MSG_REBOOT "Herstart de printer" -#define(length=20, lines=2) MSG_TAKE_EFFECT " om effectief te worden" - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Laaste geupdatet: " -#define MSG_FREE_MEMORY " Vrij geheugen: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "checksum fout, Laatste lijn: " -#define MSG_ERR_NO_CHECKSUM "Geen Checksum met lijnnummer Laatste Lijn: " -#define MSG_BEGIN_FILE_LIST "Begin file lijst" -#define MSG_END_FILE_LIST "Eind file lijst" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define MSG_ERR_NO_THERMISTORS "Geen Temp.sensoren - geen temperatuur" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_HEATING "Opwarmen" -#define(length=20) MSG_HEATING_COMPLETE "Opwarmen klaar." -#define MSG_BED_HEATING "Bed opwarmen" -#define MSG_BED_DONE "Bed OK." -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Printer gestopt. kill() called!" -#define MSG_ERR_STOPPED "Printer vanwege fouten gestopt. Repareer de fout en gebruiken M999 te herstarten. (Temperatuur is gereset. Stel het na het herstarten)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Endstop status weergeven" -#define MSG_ENDSTOP_HIT "gesloten" -#define MSG_ENDSTOP_OPEN "open" - -#define MSG_SD_CANT_OPEN_SUBDIR "Kan map niet openen" -#define MSG_SD_INIT_FAIL "SD opstarten mislukt" -#define MSG_SD_VOL_INIT_FAIL "volume.init mislukt" -#define MSG_SD_OPENROOT_FAIL "openRoot mislukt" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir openen mislukt" -#define MSG_SD_OPEN_FILE_FAIL "openen mislukt, Bestand : " -#define MSG_SD_FILE_OPENED "Bestand geopend: " -#define MSG_SD_FILE_SELECTED "Bestand geselecteerd" -#define MSG_SD_WRITE_TO_FILE "Naar bestand schrijven: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "geen SD printen" -#define MSG_SD_ERR_WRITE_TO_FILE "fout bij schrijven naar bestand" -#define MSG_SD_CANT_ENTER_SUBDIR "Kan niet in map: " - -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " koude extrusie voorkomen" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Instellen Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" - -#define MSG_LANGUAGE_NAME "Nederlands" -#define MSG_LANGUAGE_SELECT "Kies taal" -#define MSG_PRUSA3D "prusa3d.com" -#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" -#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" - -#define(length=20) MSG_SELFTEST_ERROR "Zelftest Fout !" -#define MSG_SELFTEST_PLEASECHECK "Controleer aub:" -#define(length=20) MSG_SELFTEST_NOTCONNECTED "Niet aangesloten" -#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" -#define MSG_SELFTEST_BEDHEATER "Bed / Heater" -#define(length=20) MSG_SELFTEST_WIRINGERROR "Bedrading fout" -#define MSG_SELFTEST_ENDSTOPS "Endstops" -#define MSG_SELFTEST_MOTOR "Motor" -#define MSG_SELFTEST_ENDSTOP "Endstop" -#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop niet geraakt" -#define MSG_SELFTEST_OK "Zelftest OK" -#define(length=20) MSG_LOOSE_PULLEY "Loose pulley" - -#define MSG_SELFTEST_FAN "Fan test"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Voordere fan?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Linke fan?"; -#define MSG_SELFTEST_FAN_YES "Roteert"; -#define(length=20) MSG_SELFTEST_FAN_NO "Roteert niet"; - -#define(length=20) MSG_STATS_TOTALFILAMENT "Filament total: " -#define(length=20) MSG_STATS_TOTALPRINTTIME "Total printtijd:" -#define(length=20) MSG_STATS_FILAMENTUSED "Filamentverbruik:" -#define(length=20) MSG_STATS_PRINTTIME "Printtijd: " -#define(length=20) MSG_SELFTEST_START "Zelftest start " -#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Controleer endstops" -#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Controleer hotend " -#define(length=20) MSG_SELFTEST_CHECK_X "Controleer X as " -#define(length=20) MSG_SELFTEST_CHECK_Y "Controleer Y as " -#define(length=20) MSG_SELFTEST_CHECK_Z "Controleer Z as " -#define(length=20) MSG_SELFTEST_CHECK_BED "Controleer bed " -#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "Allemaal goed " -#define MSG_SELFTEST "Zelftest " -#define(length=20) MSG_SELFTEST_FAILED "Zelftest mislukt " -#define MSG_STATISTICS "Statistieken" -#define MSG_USB_PRINTING "USB printing " -#define MSG_HOMEYZ "Kalibreren Z" -#define MSG_HOMEYZ_PROGRESS "Kalibreren Z" -#define MSG_HOMEYZ_DONE "Kalbibratie OK" - -#define MSG_SHOW_END_STOPS "Toon endstops" -#define MSG_CALIBRATE_BED "Kalibratie XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset XYZ kalibr." - -#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar." -#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar." - -#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Reinig het tuit voor de kalibratie aub. Klik als klaar." -#define(length=20, lines=8) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Zijn beide Z wagen heelemaal boven?" - -#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Zoeke bed kalibratiepunt" -#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " van 4" -#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Nauwkeurigheid verbeteren bij kalibratiepunt" -#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " van 9" -#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Meten van reference hoogte van de kalibratiepunt" -#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " van 9" -#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Herhaling " - -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ kalibratie mislukt. Bed kalibratiepunt niet gevonden." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ kalibratie mislukt. Raadpleeg de handleiding." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ kalibratie ok. X/Y-assen staan perpendiculair. Gefeliciteerd!" -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ kalibratie ok. X/Y-assen zijn iets scheef. Scheefheid wordt automatisch gecorrigeerd. Goed gedaan!" -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ kalibratie ok. X/Y-assen zijn heel scheef. Scheefheid wordt automatisch gecorrigeerd." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ kalibratie mislukt. Linksvoor kalibratiepunt niet bereikbaar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ kalibratie mislukt. Rechtsvoor kalibratiepunt niet bereikbaar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ kalibratie mislukt. Voorzijde kalibratiepunten niet bereikbaar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ kalibratie gecompromitteerd. Linksvoor kalibratiepunt niet bereikbaar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ kalibratie gecompromitteerd. Rechtsvoor kalibratiepunt niet bereikbaar." -#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ kalibratie gecompromitteerd. Voorzijde kalibratiepunten niet bereikbaar." - -#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bed nivellering mislukt. Sensor was niet geactiveerd. Vuil op nozzle? Wacht op reset." -#define(length=20, lines=5) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bed nivellering mislukt. Een sensor heeft te hoog getriggerd. Wacht op reset." -#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bed nivellering mislukt.Sensor niet aangesloten of kabel gebroken.Wacht op reset" - -#defineMSG_NEW_FIRMWARE_AVAILABLE "Nieuwe firmware versie beschikbaar:" -#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Upgraden aub." - -#define(length=20, lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Printer is nog niet gekalibreerd. Volg de handleiding, hoofdstuk First steps, sectie Calibration flow." -#define(length=20, lines=12) MSG_BABYSTEP_Z_NOT_SET "Afstand tussen tip van het tuit en het print oppervlak nog niet vastgesteld. Volg de handleiding, First steps, sectie First layer calibration." - -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Steek filament in de extruder 1. Klik als klaar." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Steek filament in de extruder 2. Klik als klaar." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Steek filament in de extruder 3. Klik als klaar." -#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Steek filament in de extruder 4. Klik als klaar." -#define(length=20, lines=1) MSG_CHANGE_EXTR "Wissel extruder" - -#define(length=20, lines=4) MSG_FIL_ADJUSTING "Aanpassen filamenten. Even geduld aub." -#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamenten zijn nu ingesteld. Reinig het tuit voor de kalibratie. Klik als klaar." -#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" -#define(length=20, lines=1) MSG_CALIBRATE_E "Kalibratie E" -//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." -#define(length=20, lines=8) MSG_E_CAL_KNOB "Draai knop tot mark extruder bereikt is. Klik als klaar." - -//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" -#define(length=20, lines=8) MSG_MARK_FIL "Mark filament 100mm van extruder body. Klik als klaar." -#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E kalibratie voltooid. Reinig het tuit. Klik op als klaar." -#define(length=20, lines=3) MSG_WAITING_TEMP "Wachten op afkoelen van heater en bed." -#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Is kleur zuiver?" -#define(length=20) MSG_UNLOADING_FILAMENT "Filament uitwerpen" -#define(length=20, lines=10) MSG_PAPER "Leg een vel papier onder het tuit tijdens de kalibratie van de eerste 4 punten. Als het tuit het papier vangt, Printer onmiddellijk uitschakelen." - -#define(length=20) MSG_BED_CORRECTION_MENU "Bed juist" -#define MSG_BED_CORRECTION_LEFT "Links [um]" -#define MSG_BED_CORRECTION_RIGHT "Rechts [um]" -#define MSG_BED_CORRECTION_FRONT "Voorruit [um]" -#define MSG_BED_CORRECTION_REAR "Achter [um]" -#define MSG_BED_CORRECTION_RESET "Reset" - -#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Kalibratie" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" -#define MSG_PRINTER_DISCONNECTED "Printer ontbonden" -#define(length=20) MSG_FINISHING_MOVEMENTS "Bewegingen afwerken" -#define MSG_PRINT_PAUSED "Druck pauzeren" -#define MSG_RESUMING_PRINT "Print hervatten" -#define MSG_PID_EXTRUDER "PID kalibratie" -#define MSG_SET_TEMPERATURE "Temp. instellen" -#define MSG_PID_FINISHED "PID kal. klaar " -#define MSG_PID_RUNNING "PID kal. " -#define MSG_PID_BED "PID bed kalibratie " -#define MSG_PID_BED_FINISHED "PID bed kal. klaar " -#define MSG_PID_BED_RUNNING "PID bed kal. " - -#define MSG_CALIBRATE_PINDA "PINDA Temp. kal." -#define MSG_CALIBRATION_PINDA_MENU "PINDA Temp. kal." -#define(length=20, lines=3) MSG_PINDA_NOT_CALIBRATED "PINDA temperatuur calibratie was nog niet uitgevoerd" -#define MSG_PINDA_PREHEAT "PINDA warmt op" -#define(length=20) MSG_TEMP_CALIBRATION "PINDA Temp.kal." -#define(length=20, lines=3) MSG_TEMP_CALIBRATION_DONE "PINDA temperatuur calibratie is klaar. Klik om door te gaan." -#define(length=20) MSG_TEMP_CALIBRATION_ON "PINDA T.kal. [ON]" -#define(length=20) MSG_TEMP_CALIBRATION_OFF "PINDA T.kal.[OFF]" - -#define(length=20) MSG_LOAD_ALL "Alle laden" -#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" -#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" -#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" -#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" -#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filam. 1 ontladen" -#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filam. 2 ontladen" -#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filam. 3 ontladen" -#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filam. 4 ontladen" -#define(length=20) MSG_UNLOAD_ALL "Alle ontladen" -#define(length=20) MSG_PREPARE_FILAMENT "Filam. voorbereiden" -#define(length=20) MSG_ALL "Alle" -#define(length=20) MSG_USED "Gebruikt bij print" -#define(length=20) MSG_CURRENT "Actueel" -#define(length=20) MSG_CHOOSE_EXTRUDER "Kies Extruder" -#define(length=20) MSG_EXTRUDER "Extruder" -#define(length=20) MSG_EXTRUDER_1 "Extruder 1" -#define(length=20) MSG_EXTRUDER_2 "Extruder 2" -#define(length=20) MSG_EXTRUDER_3 "Extruder 3" -#define(length=20) MSG_EXTRUDER_4 "Extruder 4" -#define MSG_DATE "Datum:" -#define MSG_XYZ_DETAILS "XYZ kal. details" -#define MSG_Y_DISTANCE_FROM_MIN "Y afstand van min" -#define MSG_LEFT "Links:" -#define MSG_CENTER "Centrum:" -#define MSG_RIGHT "Rechts:" -#define MSG_MEASURED_SKEW "Symmetrie:" -#define MSG_SLIGHT_SKEW "Geringe Asym.:" +/** + * Dutch + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ + +#define(length=20) WELCOME_MSG CUSTOM_MENDEL_NAME " gereed." +#define MSG_SD_INSERTED "SD ingestoken" +#define MSG_SD_REMOVED "SD verwijderd" +#define MSG_MAIN "Hoofdmenu" +#define(length=20) MSG_DISABLE_STEPPERS "Motoren uit" +#define MSG_AUTO_HOME "Startpositie" +#define MSG_SET_HOME_OFFSETS "Set home offsets" +#define MSG_SET_ORIGIN "Oorsprong instellen" +#define MSG_COOLDOWN "Afkoelen" +#define MSG_SWITCH_PS_ON "Opstarten" +#define MSG_SWITCH_PS_OFF "Uitschakelen" +#define MSG_MOVE_AXIS "As verplaatsen" +#define MSG_MOVE_X "Verplaats X" +#define MSG_MOVE_Y "Verplaats Y" +#define MSG_MOVE_Z "Verplaats Z" +#define MSG_MOVE_E "Extruder" +#define MSG_SPEED "Snelheid" +#define MSG_NOZZLE "Tuit" +#define MSG_NOZZLE1 "Tuit2" +#define MSG_NOZZLE2 "Tuit3" +#define MSG_BED "Bed" +#define(length=20) MSG_FAN_SPEED "Fan snelheid" +#define MSG_FLOW "Flow" +#define MSG_FLOW0 "Flow 0" +#define MSG_FLOW1 "Flow 1" +#define MSG_FLOW2 "Flow 2" +#define MSG_CONTROL "Control" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fact" +#define MSG_TEMPERATURE "Temperatuur" +#define MSG_MOTION "Beweging" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "Geheugen opslaan" +#define MSG_LOAD_EPROM "Geheugen laden" +#define MSG_RESTORE_FAILSAFE "Backup terugzetten" +#define MSG_REFRESH "\xF8" "Herladen" +#define MSG_WATCH "Info scherm" +#define MSG_TUNE "Fijninstellingen" +#define MSG_PAUSE_PRINT "Print pauzeren" +#define MSG_RESUME_PRINT "Print hervatten" +#define MSG_STOP_PRINT "Print stoppen" +#define MSG_CARD_MENU "Print van SD" +#define MSG_NO_CARD "Geen SD kaart" +#define MSG_DWELL "Slapen..." +#define(length=20) MSG_USERWAIT "Wachten op gebruiker" +#define(length=20, lines=2) MSG_RESUMING "Print hervatten" +#define(length=20) MSG_PRINT_ABORTED "Print afgebroken" +#define MSG_NO_MOVE "Geen beweging." +#define(length=20) MSG_KILLED "NOODSTOP/KILLED. " +#define MSG_STOPPED "GESTOPT. " +#define MSG_FILAMENTCHANGE "Wissel filament" +#define MSG_INIT_SDCARD "Init. SD kaart" +#define MSG_CNG_SDCARD "Wissel SD kaart" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" +#define MSG_BABYSTEP_Z "Live Z aanpassen" +#define(length=20) MSG_ADJUSTZ "Auto instellen Z?" +#define(length=20) MSG_PICK_Z "Pick print" + +#define MSG_SETTINGS "Instellingen" +#define MSG_PREHEAT "Voorverwarmen" +#define MSG_UNLOAD_FILAMENT "Filament uithalen" +#define MSG_LOAD_FILAMENT "Filament laden" +#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" +#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" +#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" +#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" +#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filament 1 uithalen" +#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filament 2 uithalen" +#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filament 3 uithalen" +#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filament 4 uithalen" +#define(length=20) MSG_UNLOAD_ALL "Alle uithalen" +#define(length=20) MSG_LOAD_ALL "Alle laden" + +#define MSG_RECTRACT "Rectract" +#define MSG_ERROR "FOUT:" +#define(length=20) MSG_PREHEAT_NOZZLE "Tuit voorverwarmen!" +#define MSG_SUPPORT "Support" +#define(length=20) MSG_CORRECTLY "Wissel ok?" +#define MSG_YES "Ja" +#define MSG_NO "Nee" +#define(length=20) MSG_NOT_LOADED "Fil. niet geladen" +#define(length=20) MSG_NOT_COLOR "Kleur niet duidelijk" +#define(length=20) MSG_LOADING_FILAMENT "Laade Filament" +#define(length=20) MSG_PLEASE_WAIT "Wacht aub" +#define MSG_LOADING_COLOR "Laade kleur" +#define(length=20) MSG_CHANGE_SUCCESS "Wissel succesvol!" +#define(length=20) MSG_PRESS "en druk op knop" +#define(length=20) MSG_INSERT_FILAMENT "Filament insteken" +#define(length=20) MSG_CHANGING_FILAMENT "Wissel filament!" + + +#define MSG_SILENT_MODE_ON "Mode [silent]" +#define MSG_SILENT_MODE_OFF "Mode [high power]" +#define(length=20) MSG_REBOOT "Herstart de printer" +#define(length=20, lines=2) MSG_TAKE_EFFECT " om effectief te worden" + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Laaste geupdatet: " +#define MSG_FREE_MEMORY " Vrij geheugen: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "checksum fout, Laatste lijn: " +#define MSG_ERR_NO_CHECKSUM "Geen Checksum met lijnnummer Laatste Lijn: " +#define MSG_BEGIN_FILE_LIST "Begin file lijst" +#define MSG_END_FILE_LIST "Eind file lijst" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define MSG_ERR_NO_THERMISTORS "Geen Temp.sensoren - geen temperatuur" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_HEATING "Opwarmen" +#define(length=20) MSG_HEATING_COMPLETE "Opwarmen klaar." +#define MSG_BED_HEATING "Bed opwarmen" +#define MSG_BED_DONE "Bed OK." +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Printer gestopt. kill() called!" +#define MSG_ERR_STOPPED "Printer vanwege fouten gestopt. Repareer de fout en gebruiken M999 te herstarten. (Temperatuur is gereset. Stel het na het herstarten)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Endstop status weergeven" +#define MSG_ENDSTOP_HIT "gesloten" +#define MSG_ENDSTOP_OPEN "open" + +#define MSG_SD_CANT_OPEN_SUBDIR "Kan map niet openen" +#define MSG_SD_INIT_FAIL "SD opstarten mislukt" +#define MSG_SD_VOL_INIT_FAIL "volume.init mislukt" +#define MSG_SD_OPENROOT_FAIL "openRoot mislukt" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir openen mislukt" +#define MSG_SD_OPEN_FILE_FAIL "openen mislukt, Bestand : " +#define MSG_SD_FILE_OPENED "Bestand geopend: " +#define MSG_SD_FILE_SELECTED "Bestand geselecteerd" +#define MSG_SD_WRITE_TO_FILE "Naar bestand schrijven: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "geen SD printen" +#define MSG_SD_ERR_WRITE_TO_FILE "fout bij schrijven naar bestand" +#define MSG_SD_CANT_ENTER_SUBDIR "Kan niet in map: " + +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " koude extrusie voorkomen" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Instellen Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" + +#define MSG_LANGUAGE_NAME "Nederlands" +#define MSG_LANGUAGE_SELECT "Kies taal" +#define MSG_PRUSA3D "prusa3d.com" +#define MSG_PRUSA3D_FORUM "forum.prusa3d.com" +#define MSG_PRUSA3D_HOWTO "howto.prusa3d.com" + +#define(length=20) MSG_SELFTEST_ERROR "Zelftest Fout !" +#define MSG_SELFTEST_PLEASECHECK "Controleer aub:" +#define(length=20) MSG_SELFTEST_NOTCONNECTED "Niet aangesloten" +#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" +#define MSG_SELFTEST_BEDHEATER "Bed / Heater" +#define(length=20) MSG_SELFTEST_WIRINGERROR "Bedrading fout" +#define MSG_SELFTEST_ENDSTOPS "Endstops" +#define MSG_SELFTEST_MOTOR "Motor" +#define MSG_SELFTEST_ENDSTOP "Endstop" +#define(length=20) MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop niet geraakt" +#define MSG_SELFTEST_OK "Zelftest OK" +#define(length=20) MSG_LOOSE_PULLEY "Loose pulley" + +#define MSG_SELFTEST_FAN "Fan test"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Voordere fan?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Linke fan?"; +#define MSG_SELFTEST_FAN_YES "Roteert"; +#define(length=20) MSG_SELFTEST_FAN_NO "Roteert niet"; + +#define(length=20) MSG_STATS_TOTALFILAMENT "Filament total: " +#define(length=20) MSG_STATS_TOTALPRINTTIME "Total printtijd:" +#define(length=20) MSG_STATS_FILAMENTUSED "Filamentverbruik:" +#define(length=20) MSG_STATS_PRINTTIME "Printtijd: " +#define(length=20) MSG_SELFTEST_START "Zelftest start " +#define(length=20) MSG_SELFTEST_CHECK_ENDSTOPS "Controleer endstops" +#define(length=20) MSG_SELFTEST_CHECK_HOTEND "Controleer hotend " +#define(length=20) MSG_SELFTEST_CHECK_X "Controleer X as " +#define(length=20) MSG_SELFTEST_CHECK_Y "Controleer Y as " +#define(length=20) MSG_SELFTEST_CHECK_Z "Controleer Z as " +#define(length=20) MSG_SELFTEST_CHECK_BED "Controleer bed " +#define(length=20) MSG_SELFTEST_CHECK_ALLCORRECT "Allemaal goed " +#define MSG_SELFTEST "Zelftest " +#define(length=20) MSG_SELFTEST_FAILED "Zelftest mislukt " +#define MSG_STATISTICS "Statistieken" +#define MSG_USB_PRINTING "USB printing " +#define MSG_HOMEYZ "Kalibreren Z" +#define MSG_HOMEYZ_PROGRESS "Kalibreren Z" +#define MSG_HOMEYZ_DONE "Kalbibratie OK" + +#define MSG_SHOW_END_STOPS "Toon endstops" +#define MSG_CALIBRATE_BED "Kalibratie XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset XYZ kalibr." + +#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar." +#define(length=20, lines=8) MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibreren van XYZ. Draai de knop om de Z-wagen omhoog te gaan tot het einde stoppers. Klik als klaar." + +#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN "Reinig het tuit voor de kalibratie aub. Klik als klaar." +#define(length=20, lines=8) MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Zijn beide Z wagen heelemaal boven?" + +#define(length=60) MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Zoeke bed kalibratiepunt" +#define(length=14) MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " van 4" +#define(length=60) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Nauwkeurigheid verbeteren bij kalibratiepunt" +#define(length=14) MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " van 9" +#define(length=60) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Meten van reference hoogte van de kalibratiepunt" +#define(length=14) MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " van 9" +#define(length=20) MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Herhaling " + +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "XYZ kalibratie mislukt. Bed kalibratiepunt niet gevonden." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "XYZ kalibratie mislukt. Raadpleeg de handleiding." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "XYZ kalibratie ok. X/Y-assen staan perpendiculair. Gefeliciteerd!" +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "XYZ kalibratie ok. X/Y-assen zijn iets scheef. Scheefheid wordt automatisch gecorrigeerd. Goed gedaan!" +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "XYZ kalibratie ok. X/Y-assen zijn heel scheef. Scheefheid wordt automatisch gecorrigeerd." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "XYZ kalibratie mislukt. Linksvoor kalibratiepunt niet bereikbaar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "XYZ kalibratie mislukt. Rechtsvoor kalibratiepunt niet bereikbaar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "XYZ kalibratie mislukt. Voorzijde kalibratiepunten niet bereikbaar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "XYZ kalibratie gecompromitteerd. Linksvoor kalibratiepunt niet bereikbaar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "XYZ kalibratie gecompromitteerd. Rechtsvoor kalibratiepunt niet bereikbaar." +#define(length=20, lines=8) MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "XYZ kalibratie gecompromitteerd. Voorzijde kalibratiepunten niet bereikbaar." + +#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_POINT_LOW "Bed nivellering mislukt. Sensor was niet geactiveerd. Vuil op nozzle? Wacht op reset." +#define(length=20, lines=5) MSG_BED_LEVELING_FAILED_POINT_HIGH "Bed nivellering mislukt. Een sensor heeft te hoog getriggerd. Wacht op reset." +#define(length=20, lines=6) MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Bed nivellering mislukt.Sensor niet aangesloten of kabel gebroken.Wacht op reset" + +#defineMSG_NEW_FIRMWARE_AVAILABLE "Nieuwe firmware versie beschikbaar:" +#define(length=20) MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Upgraden aub." + +#define(length=20, lines=8) MSG_FOLLOW_CALIBRATION_FLOW "Printer is nog niet gekalibreerd. Volg de handleiding, hoofdstuk First steps, sectie Calibration flow." +#define(length=20, lines=12) MSG_BABYSTEP_Z_NOT_SET "Afstand tussen tip van het tuit en het print oppervlak nog niet vastgesteld. Volg de handleiding, First steps, sectie First layer calibration." + +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T0 "Steek filament in de extruder 1. Klik als klaar." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T1 "Steek filament in de extruder 2. Klik als klaar." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T2 "Steek filament in de extruder 3. Klik als klaar." +#define(length=20, lines=4) MSG_FILAMENT_LOADING_T3 "Steek filament in de extruder 4. Klik als klaar." +#define(length=20, lines=1) MSG_CHANGE_EXTR "Wissel extruder" + +#define(length=20, lines=4) MSG_FIL_ADJUSTING "Aanpassen filamenten. Even geduld aub." +#define(length=20, lines=8) MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Filamenten zijn nu ingesteld. Reinig het tuit voor de kalibratie. Klik als klaar." +#define(length=20, lines=4) MSG_STACK_ERROR "Error - static memory has been overwritten" +#define(length=20, lines=1) MSG_CALIBRATE_E "Kalibratie E" +//#define(length=20, lines=1) MSG_RESET_CALIBRATE_E "Reset E Cal." +#define(length=20, lines=8) MSG_E_CAL_KNOB "Draai knop tot mark extruder bereikt is. Klik als klaar." + +//#define(length=20, lines=1) MSG_FARM_CARD_MENU "Farm mode print" +#define(length=20, lines=8) MSG_MARK_FIL "Mark filament 100mm van extruder body. Klik als klaar." +#define(length=20, lines=8) MSG_CLEAN_NOZZLE_E "E kalibratie voltooid. Reinig het tuit. Klik op als klaar." +#define(length=20, lines=3) MSG_WAITING_TEMP "Wachten op afkoelen van heater en bed." +#define(length=20, lines=2) MSG_FILAMENT_CLEAN "Is kleur zuiver?" +#define(length=20) MSG_UNLOADING_FILAMENT "Filament uitwerpen" +#define(length=20, lines=10) MSG_PAPER "Leg een vel papier onder het tuit tijdens de kalibratie van de eerste 4 punten. Als het tuit het papier vangt, Printer onmiddellijk uitschakelen." + +#define(length=20) MSG_BED_CORRECTION_MENU "Bed juist" +#define MSG_BED_CORRECTION_LEFT "Links [um]" +#define MSG_BED_CORRECTION_RIGHT "Rechts [um]" +#define MSG_BED_CORRECTION_FRONT "Voorruit [um]" +#define MSG_BED_CORRECTION_REAR "Achter [um]" +#define MSG_BED_CORRECTION_RESET "Reset" + +#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Kalibratie" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "SD card [normal]" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "SD card [FlshAir]" +#define MSG_PRINTER_DISCONNECTED "Printer ontbonden" +#define(length=20) MSG_FINISHING_MOVEMENTS "Bewegingen afwerken" +#define MSG_PRINT_PAUSED "Druck pauzeren" +#define MSG_RESUMING_PRINT "Print hervatten" +#define MSG_PID_EXTRUDER "PID kalibratie" +#define MSG_SET_TEMPERATURE "Temp. instellen" +#define MSG_PID_FINISHED "PID kal. klaar " +#define MSG_PID_RUNNING "PID kal. " +#define MSG_PID_BED "PID bed kalibratie " +#define MSG_PID_BED_FINISHED "PID bed kal. klaar " +#define MSG_PID_BED_RUNNING "PID bed kal. " + +#define MSG_CALIBRATE_PINDA "PINDA Temp. kal." +#define MSG_CALIBRATION_PINDA_MENU "PINDA Temp. kal." +#define(length=20, lines=3) MSG_PINDA_NOT_CALIBRATED "PINDA temperatuur calibratie was nog niet uitgevoerd" +#define MSG_PINDA_PREHEAT "PINDA warmt op" +#define(length=20) MSG_TEMP_CALIBRATION "PINDA Temp.kal." +#define(length=20, lines=3) MSG_TEMP_CALIBRATION_DONE "PINDA temperatuur calibratie is klaar. Klik om door te gaan." +#define(length=20) MSG_TEMP_CALIBRATION_ON "PINDA T.kal. [ON]" +#define(length=20) MSG_TEMP_CALIBRATION_OFF "PINDA T.kal.[OFF]" + +#define(length=20) MSG_LOAD_ALL "Alle laden" +#define(length=20) MSG_LOAD_FILAMENT_1 "Filament 1 laden" +#define(length=20) MSG_LOAD_FILAMENT_2 "Filament 2 laden" +#define(length=20) MSG_LOAD_FILAMENT_3 "Filament 3 laden" +#define(length=20) MSG_LOAD_FILAMENT_4 "Filament 4 laden" +#define(length=20) MSG_UNLOAD_FILAMENT_1 "Filam. 1 ontladen" +#define(length=20) MSG_UNLOAD_FILAMENT_2 "Filam. 2 ontladen" +#define(length=20) MSG_UNLOAD_FILAMENT_3 "Filam. 3 ontladen" +#define(length=20) MSG_UNLOAD_FILAMENT_4 "Filam. 4 ontladen" +#define(length=20) MSG_UNLOAD_ALL "Alle ontladen" +#define(length=20) MSG_PREPARE_FILAMENT "Filam. voorbereiden" +#define(length=20) MSG_ALL "Alle" +#define(length=20) MSG_USED "Gebruikt bij print" +#define(length=20) MSG_CURRENT "Actueel" +#define(length=20) MSG_CHOOSE_EXTRUDER "Kies Extruder" +#define(length=20) MSG_EXTRUDER "Extruder" +#define(length=20) MSG_EXTRUDER_1 "Extruder 1" +#define(length=20) MSG_EXTRUDER_2 "Extruder 2" +#define(length=20) MSG_EXTRUDER_3 "Extruder 3" +#define(length=20) MSG_EXTRUDER_4 "Extruder 4" +#define MSG_DATE "Datum:" +#define MSG_XYZ_DETAILS "XYZ kal. details" +#define MSG_Y_DISTANCE_FROM_MIN "Y afstand van min" +#define MSG_LEFT "Links:" +#define MSG_CENTER "Centrum:" +#define MSG_RIGHT "Rechts:" +#define MSG_MEASURED_SKEW "Symmetrie:" +#define MSG_SLIGHT_SKEW "Geringe Asym.:" #define MSG_SEVERE_SKEW "Hevige Asym.:" \ No newline at end of file diff --git a/Firmware/language_pl.h b/Firmware/language_pl.h index e953e7c9d..767bd449d 100644 --- a/Firmware/language_pl.h +++ b/Firmware/language_pl.h @@ -1,310 +1,310 @@ -/** - * Polish - * - * LCD Menu Messages - * Please note these are limited to 17 characters! - * - */ - -#define WELCOME_MSG CUSTOM_MENDEL_NAME " gotowa" -#define MSG_SD_INSERTED "Karta wlozona" -#define MSG_SD_REMOVED "Karta wyjeta" -#define MSG_MAIN "Menu glowne" -#define MSG_DISABLE_STEPPERS "Wylaczyc silniki" -#define MSG_AUTO_HOME "Auto home" -#define MSG_COOLDOWN "Wychlodzic" -#define MSG_MOVE_AXIS "Ruch osi" -#define MSG_MOVE_X "Przesunac X" -#define MSG_MOVE_Y "Przesunac Y" -#define MSG_MOVE_Z "Przesunac Z" -#define MSG_MOVE_E "Extruder" -#define MSG_SPEED "Predkosc" -#define MSG_NOZZLE "Dysza" -#define MSG_BED "Stolik" -#define MSG_FAN_SPEED "Predkosc went." -#define MSG_FLOW "Przeplyw" -#define MSG_TEMPERATURE "Temperatura" -#define MSG_WATCH "Informacje" -#define MSG_TUNE "Nastroic" -#define MSG_PAUSE_PRINT "Przerwac druk" -#define MSG_RESUME_PRINT "Kontynuowac" -#define MSG_STOP_PRINT "Zatrzymac druk" -#define MSG_CARD_MENU "Druk z SD" -#define MSG_NO_CARD "Brak karty SD" -#define MSG_DWELL "Sleep..." -#define MSG_USERWAIT "Wait for user..." -#define MSG_RESUMING "Wznowienie druku" -#define MSG_PRINT_ABORTED "Druk przerwany" -#define MSG_NO_MOVE "No move." -#define MSG_KILLED "KILLED. " -#define MSG_STOPPED "STOPPED. " -#define MSG_FILAMENTCHANGE "Wymienic filament" -#define MSG_BABYSTEP_Z "Dostrojenie osy Z" -#define MSG_ADJUSTZ "Autodostroic Z?" -#define MSG_PICK_Z "Vyberte vytisk" -#define MSG_SETTINGS "Ustawienia" -#define MSG_PREHEAT "Grzanie" -#define MSG_UNLOAD_FILAMENT "Wyjac filament" -#define MSG_LOAD_FILAMENT "Wprowadz filament" -#define MSG_ERROR "BLAD:" -#define MSG_PREHEAT_NOZZLE "Nagrzej dysze!" -#define MSG_SUPPORT "Pomoc" -#define MSG_CORRECTLY "Wymiana ok?" -#define MSG_YES "Tak" -#define MSG_NO "Nie" -#define MSG_NOT_LOADED "Brak filamentu" -#define MSG_NOT_COLOR "Kolor zanieczysz." -#define MSG_LOADING_FILAMENT "Wprow. filamentu" -#define MSG_PLEASE_WAIT "Prosze czekac" -#define MSG_LOADING_COLOR "Czyszcz. koloru" -#define MSG_CHANGE_SUCCESS "Wymiana ok!" -#define MSG_PRESS "Nacisnij przycisk" -#define MSG_INSERT_FILAMENT "Wprowadz filament" -#define MSG_CHANGING_FILAMENT "Wymiana filamentu" -#define MSG_SILENT_MODE_ON "Mod [cichy]" -#define MSG_SILENT_MODE_OFF "Mod [w wydajnosc]" -#define MSG_REBOOT "Restart drukarki" -#define MSG_TAKE_EFFECT " wprow. zmian" -#define MSG_HEATING "Grzanie..." -#define MSG_HEATING_COMPLETE "Grzanie OK." -#define MSG_BED_HEATING "Grzanie stolika.." -#define MSG_BED_DONE "Stolik OK." -#define MSG_LANGUAGE_NAME "Polski" -#define MSG_LANGUAGE_SELECT "Wybor jezyka" -#define MSG_PRUSA3D "prusa3d.cz" -#define MSG_PRUSA3D_FORUM "forum.prusa3d.cz" -#define MSG_PRUSA3D_HOWTO "howto.prusa3d.cz" - - -// Do not translate those! - -#define MSG_Enqueing "enqueing \"" -#define MSG_POWERUP "PowerUp" -#define MSG_CONFIGURATION_VER " Last Updated: " -#define MSG_FREE_MEMORY " Free Memory: " -#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " -#define MSG_OK "ok" -#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " -#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " -#define MSG_BEGIN_FILE_LIST "Begin file list" -#define MSG_END_FILE_LIST "End file list" -#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " -#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " -#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " -#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " -#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " -#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" -#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " -#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" -#define MSG_ERR_KILLED "Printer halted. kill() called!" -#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" -#define MSG_RESEND "Resend: " -#define MSG_M119_REPORT "Reporting endstop status" -#define MSG_ENDSTOP_HIT "TRIGGERED" -#define MSG_ENDSTOP_OPEN "open" -#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" -#define MSG_SD_INIT_FAIL "SD init fail" -#define MSG_SD_VOL_INIT_FAIL "volume.init failed" -#define MSG_SD_OPENROOT_FAIL "openRoot failed" -#define MSG_SD_CARD_OK "SD card ok" -#define MSG_SD_WORKDIR_FAIL "workDir open failed" -#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " -#define MSG_SD_FILE_OPENED "File opened: " -#define MSG_SD_FILE_SELECTED "File selected" -#define MSG_SD_WRITE_TO_FILE "Writing to file: " -#define MSG_SD_PRINTING_BYTE "SD printing byte " -#define MSG_SD_NOT_PRINTING "Not SD printing" -#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" -#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " -#define MSG_STEPPER_TOO_HIGH "Steprate too high: " -#define MSG_ENDSTOPS_HIT "endstops hit: " -#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" -#define MSG_BABYSTEPPING_X "Babystepping X" -#define MSG_BABYSTEPPING_Y "Babystepping Y" -#define MSG_BABYSTEPPING_Z "Dostavovani Z" -#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" -#define MSG_SET_HOME_OFFSETS "Nastav pocatek home" -#define MSG_SET_ORIGIN "Nastav pocatek" - -#define MSG_SWITCH_PS_ON "Vypnout zdroj" -#define MSG_SWITCH_PS_OFF "Zapnout zdroj" - -#define MSG_NOZZLE1 "Tryska2" -#define MSG_NOZZLE2 "Tryska3" - - -#define MSG_FLOW0 "Prutok 0" -#define MSG_FLOW1 "Prutok 1" -#define MSG_FLOW2 "Prutok 2" -#define MSG_CONTROL "Kontrola" -#define MSG_MIN " \002 Min" -#define MSG_MAX " \002 Max" -#define MSG_FACTOR " \002 Fact" - - #define MSG_MOTION "Pohyb" -#define MSG_VOLUMETRIC "Filament" -#define MSG_VOLUMETRIC_ENABLED "E in mm3" -#define MSG_STORE_EPROM "Store memory" -#define MSG_LOAD_EPROM "Ulozit pamet" -#define MSG_RESTORE_FAILSAFE "Obnovit vychozi" -#define MSG_REFRESH "\xF8" "Obnovit" - -#define MSG_INIT_SDCARD "Inic. SD" -#define MSG_CNG_SDCARD "Vymenit SD" -#define MSG_BABYSTEP_X "Babystep X" -#define MSG_BABYSTEP_Y "Babystep Y" - - #define MSG_RECTRACT "Rectract" - -#define MSG_HOMEYZ "Kalibruj Z" -#define MSG_HOMEYZ_PROGRESS "Kalibruje Z" -#define MSG_HOMEYZ_DONE "Kalibracja OK" - -#define MSG_SELFTEST_ERROR "Selftest error !" -#define MSG_SELFTEST_PLEASECHECK "Skontroluj :" -#define MSG_SELFTEST_NOTCONNECTED "Nie podlaczono " -#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" -#define MSG_SELFTEST_BEDHEATER "Bed / Heater" -#define MSG_SELFTEST_WIRINGERROR "Blad polaczenia" -#define MSG_SELFTEST_ENDSTOPS "Endstops" -#define MSG_SELFTEST_MOTOR "Silnik" -#define MSG_SELFTEST_ENDSTOP "Endstop" -#define MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" -#define MSG_SELFTEST_OK "Self test OK" - -#define(length=20) MSG_SELFTEST_FAN "Test wentylatora"; -#define(length=20) MSG_SELFTEST_COOLING_FAN "Przodni went. druku?"; -#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Lewy went na dysze?"; -#define MSG_SELFTEST_FAN_YES "Kreci sie"; -#define MSG_SELFTEST_FAN_NO "Nekreci sie"; - -#define MSG_STATS_TOTALFILAMENT "Filament lacznie :" -#define MSG_STATS_TOTALPRINTTIME "Czas calkowity :" -#define MSG_STATS_FILAMENTUSED "Filament : " -#define MSG_STATS_PRINTTIME "Czas druku : " - -#define MSG_SELFTEST_START "Self test start " -#define MSG_SELFTEST_CHECK_ENDSTOPS "Kontrola endstops" -#define MSG_SELFTEST_CHECK_HOTEND "Kontrola hotend " -#define MSG_SELFTEST_CHECK_X "Kontrola X axis " -#define MSG_SELFTEST_CHECK_Y "Kontrola Y axis " -#define MSG_SELFTEST_CHECK_Z "Kontrola Z axis " -#define MSG_SELFTEST_CHECK_BED "Kontrola bed " -#define MSG_SELFTEST_CHECK_ALLCORRECT "Wszystko OK " -#define MSG_SELFTEST "Selftest " -#define MSG_SELFTEST_FAILED "Selftest nieudany" - -#define MSG_STATISTICS "Statystyka " -#define MSG_USB_PRINTING "Druk z USB " - -#define MSG_SHOW_END_STOPS "Pokaz krancowki" -#define MSG_CALIBRATE_BED "Kalibracja XYZ" -#define MSG_CALIBRATE_BED_RESET "Reset kalibr. XYZ" -#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibracja XYZ. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic." -#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibracja Z. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic." - -#define MSG_CONFIRM_NOZZLE_CLEAN "Dla prawidl. kalibracji prosze oczyscic dysze. Potw. guzikiem." -#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Oba wozki dojechaly do gornej ramy?" -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Szukam punktu kalibracyjnego podkladki" -#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " z 4" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Poprawiam precyzyjnosc punktu kalibracyjnego" -#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " z 9" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Okreslam wysokosc odniesienia punktu kalibracyjnego" -#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " z 9" -#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iteracja " - -#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Kalibr. XYZ nieudana. Kalibracyjny punkt podkladki nieznaleziony." -#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji." -#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Kalibracja XYZ ok. Osie X/Y sa prostopadle. Gratulacje!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!" -#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Kalibracja XYZ prawidlowa. Skosy beda automatycznie wyrownane przy druku." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Kalibr. XYZ nieudana. Lewy przedni punkt zbyt do przodu. Wyrownac drukarke." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Kalibr. XYZ nieudana. Prawy przedni punkt zbyt do przodu. Wyrownac drukarke." -#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Kalibr. XYZ nieudana. Przed. punkty kalibr. zbyt do przodu. Wyrownac drukarke." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu." -#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Kalibr. XYZ niedokladna. Przednie punkty kalibr. Zbyt wys. do przodu." -#define MSG_BED_LEVELING_FAILED_POINT_LOW "Kalibracja nieudana. Sensor nie dotknal. Zanieczysz. dysza? Czekam na reset." -#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Kalibracja Z nieudana. Sensor dotk. za wysoko. Czekam na reset." -#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Kalibracja nieudana. Sensor odlaczony lub uszkodz. kabel. Czekam na reset." -#define MSG_NEW_FIRMWARE_AVAILABLE "Wyszla nowa wersja firmware:" -#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Prosze zaktualizowac" -#define MSG_FOLLOW_CALIBRATION_FLOW "Drukarka nie zostala jeszcze skalibrowana. Prosze kierowac sie instrukcja, rozdzial Zaczynamy, podrozdzial Selftest." -#define MSG_BABYSTEP_Z_NOT_SET "Odleglosc dyszy od podkladki nie jest skalibrowana. Postepuj zgodnie z instrukcja rozdzial Zaczynamy, podrozdzial Kalibracja pierwszej warstwy." -#define MSG_BED_CORRECTION_MENU "Korekta podkladki" -#define MSG_BED_CORRECTION_LEFT "W lewo [um]" -#define MSG_BED_CORRECTION_RIGHT "W prawo [um]" -#define MSG_BED_CORRECTION_FRONT "Do przodu [um]" -#define MSG_BED_CORRECTION_REAR "Do tylu [um]" -#define MSG_BED_CORRECTION_RESET "Reset" - -#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" -#define MSG_MENU_CALIBRATION "Kalibracja" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "karta SD [normal]" -#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "karta SD[FlshAir]" - -#define MSG_LOOSE_PULLEY "Kolo pasowe" -#define MSG_FILAMENT_LOADING_T0 "Wloz filament do ekstrudera 1. Potwierdz przyciskiem." -#define MSG_FILAMENT_LOADING_T1 "Wloz filament do ekstrudera 2. Potwierdz przyciskiem." -#define MSG_FILAMENT_LOADING_T2 "Wloz filament do ekstrudera 3. Potwierdz przyciskiem." -#define MSG_FILAMENT_LOADING_T3 "Wloz filament do ekstrudera 4. Potwierdz przyciskiem." -#define MSG_CHANGE_EXTR "Zmienic ekstruder" - -#define MSG_FIL_ADJUSTING "Przebiega wyrownanie filamentow. Prosze czekac." -#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Dla prawidlowej kalibracji prosze oczyscic dysze. Potem potwierdzic przyciskiem." -#define MSG_CALIBRATE_E "Kalibruj E" -#define MSG_E_CAL_KNOB "Prosze otaczac przycisk poki znacznik nie dosiegnie ciala ekstrudera. Potwierdzic przyciskiem." -#define MSG_MARK_FIL "Prosze oznaczyc filament 100 mm od ciala ekstrudera. Potwierdzic przyciskiem." -#define MSG_CLEAN_NOZZLE_E "Kalibracja E skonczona. Prosze oczyscic dysze. Potem potwierdzic przyciskiem. " -#define MSG_WAITING_TEMP "Oczekiwanie na wychlodzenie dyszy i podkladki." -#define MSG_FILAMENT_CLEAN "Czy kolor jest czysty?" -#define MSG_UNLOADING_FILAMENT "Wysuwam filament" -#define MSG_PAPER "Umiesc kartke papieru na podkladce i trzymaj pod dysza podczas pomiaru pierwszych 4 punktow. Jesli dysza zahaczy o papier, wylacz drukarke." - -#define MSG_FINISHING_MOVEMENTS "Konczenie druku" -#define MSG_PRINT_PAUSED "Druk zatrzymany" -#define MSG_RESUMING_PRINT "Wznawianie druku" -#define MSG_PID_EXTRUDER "Kalibracja PID" -#define MSG_SET_TEMPERATURE "Ustawic temperature" -#define MSG_PID_FINISHED "Kal. PID zakonczona" -#define MSG_PID_RUNNING "Kal. PID" - -#define MSG_CALIBRATE_PINDA "Skalibrowac" -#define MSG_CALIBRATION_PINDA_MENU "Cieplna kalibr." -#define MSG_PINDA_NOT_CALIBRATED "Cieplna kalibracja nie byla przeprowadzona" -#define MSG_PINDA_PREHEAT "Grzanie PINDA" -#define MSG_TEMP_CALIBRATION "Ciepl. kal. " -#define MSG_TEMP_CALIBRATION_DONE "Cieplna kalibracja zakonczona. Kontynuuj przyciskiem" -#define MSG_TEMP_CALIBRATION_ON "Ciepl. kal. [ON]" -#define MSG_TEMP_CALIBRATION_OFF "Ciepl. kal. [OFF]" -#define MSG_PREPARE_FILAMENT "Przygotuj filament" - -#define MSG_LOAD_ALL "Zalad. wszystkie" -#define MSG_LOAD_FILAMENT_1 "Zaladowac fil. 1" -#define MSG_LOAD_FILAMENT_2 "Zaladowac fil. 2" -#define MSG_LOAD_FILAMENT_3 "Zaladowac fil. 3" -#define MSG_LOAD_FILAMENT_4 "Zaladowac fil. 4" -#define MSG_UNLOAD_FILAMENT_1 "Wyjac filament 1" -#define MSG_UNLOAD_FILAMENT_2 "Wyjac filament 2" -#define MSG_UNLOAD_FILAMENT_3 "Wyjac filament 3" -#define MSG_UNLOAD_FILAMENT_4 "Wyjac filament 4" -#define MSG_UNLOAD_ALL "Wyjac wszystkie" -#define MSG_PREPARE_FILAMENT "Przygotuj filament" -#define MSG_ALL "Wszystko" -#define MSG_USED "Uzyte przy druku" -#define MSG_CURRENT "Tylko aktualne" -#define MSG_CHOOSE_EXTRUDER "Wybierz ekstruder" -#define MSG_EXTRUDER "Ekstruder" -#define MSG_EXTRUDER_1 "Ekstruder 1" -#define MSG_EXTRUDER_2 "Ekstruder 2" -#define MSG_EXTRUDER_3 "Ekstruder 3" -#define MSG_EXTRUDER_4 "Ekstruder 4" -#define MSG_DATE "Data:" -#define MSG_XYZ_DETAILS "Szczegoly kal.XYZ" -#define MSG_Y_DISTANCE_FROM_MIN "Odleglosc Y od min.:" -#define MSG_LEFT "Lewy:" -#define MSG_CENTER "Srodek:" -#define MSG_RIGHT "Prawy:" -#define MSG_MEASURED_SKEW "Zmier. sciecie:" -#define MSG_SLIGHT_SKEW "Lekkie sciecie:" +/** + * Polish + * + * LCD Menu Messages + * Please note these are limited to 17 characters! + * + */ + +#define WELCOME_MSG CUSTOM_MENDEL_NAME " gotowa" +#define MSG_SD_INSERTED "Karta wlozona" +#define MSG_SD_REMOVED "Karta wyjeta" +#define MSG_MAIN "Menu glowne" +#define MSG_DISABLE_STEPPERS "Wylaczyc silniki" +#define MSG_AUTO_HOME "Auto home" +#define MSG_COOLDOWN "Wychlodzic" +#define MSG_MOVE_AXIS "Ruch osi" +#define MSG_MOVE_X "Przesunac X" +#define MSG_MOVE_Y "Przesunac Y" +#define MSG_MOVE_Z "Przesunac Z" +#define MSG_MOVE_E "Extruder" +#define MSG_SPEED "Predkosc" +#define MSG_NOZZLE "Dysza" +#define MSG_BED "Stolik" +#define MSG_FAN_SPEED "Predkosc went." +#define MSG_FLOW "Przeplyw" +#define MSG_TEMPERATURE "Temperatura" +#define MSG_WATCH "Informacje" +#define MSG_TUNE "Nastroic" +#define MSG_PAUSE_PRINT "Przerwac druk" +#define MSG_RESUME_PRINT "Kontynuowac" +#define MSG_STOP_PRINT "Zatrzymac druk" +#define MSG_CARD_MENU "Druk z SD" +#define MSG_NO_CARD "Brak karty SD" +#define MSG_DWELL "Sleep..." +#define MSG_USERWAIT "Wait for user..." +#define MSG_RESUMING "Wznowienie druku" +#define MSG_PRINT_ABORTED "Druk przerwany" +#define MSG_NO_MOVE "No move." +#define MSG_KILLED "KILLED. " +#define MSG_STOPPED "STOPPED. " +#define MSG_FILAMENTCHANGE "Wymienic filament" +#define MSG_BABYSTEP_Z "Dostrojenie osy Z" +#define MSG_ADJUSTZ "Autodostroic Z?" +#define MSG_PICK_Z "Vyberte vytisk" +#define MSG_SETTINGS "Ustawienia" +#define MSG_PREHEAT "Grzanie" +#define MSG_UNLOAD_FILAMENT "Wyjac filament" +#define MSG_LOAD_FILAMENT "Wprowadz filament" +#define MSG_ERROR "BLAD:" +#define MSG_PREHEAT_NOZZLE "Nagrzej dysze!" +#define MSG_SUPPORT "Pomoc" +#define MSG_CORRECTLY "Wymiana ok?" +#define MSG_YES "Tak" +#define MSG_NO "Nie" +#define MSG_NOT_LOADED "Brak filamentu" +#define MSG_NOT_COLOR "Kolor zanieczysz." +#define MSG_LOADING_FILAMENT "Wprow. filamentu" +#define MSG_PLEASE_WAIT "Prosze czekac" +#define MSG_LOADING_COLOR "Czyszcz. koloru" +#define MSG_CHANGE_SUCCESS "Wymiana ok!" +#define MSG_PRESS "Nacisnij przycisk" +#define MSG_INSERT_FILAMENT "Wprowadz filament" +#define MSG_CHANGING_FILAMENT "Wymiana filamentu" +#define MSG_SILENT_MODE_ON "Mod [cichy]" +#define MSG_SILENT_MODE_OFF "Mod [w wydajnosc]" +#define MSG_REBOOT "Restart drukarki" +#define MSG_TAKE_EFFECT " wprow. zmian" +#define MSG_HEATING "Grzanie..." +#define MSG_HEATING_COMPLETE "Grzanie OK." +#define MSG_BED_HEATING "Grzanie stolika.." +#define MSG_BED_DONE "Stolik OK." +#define MSG_LANGUAGE_NAME "Polski" +#define MSG_LANGUAGE_SELECT "Wybor jezyka" +#define MSG_PRUSA3D "prusa3d.cz" +#define MSG_PRUSA3D_FORUM "forum.prusa3d.cz" +#define MSG_PRUSA3D_HOWTO "howto.prusa3d.cz" + + +// Do not translate those! + +#define MSG_Enqueing "enqueing \"" +#define MSG_POWERUP "PowerUp" +#define MSG_CONFIGURATION_VER " Last Updated: " +#define MSG_FREE_MEMORY " Free Memory: " +#define MSG_PLANNER_BUFFER_BYTES " PlannerBufferBytes: " +#define MSG_OK "ok" +#define MSG_ERR_CHECKSUM_MISMATCH "checksum mismatch, Last Line: " +#define MSG_ERR_NO_CHECKSUM "No Checksum with line number, Last Line: " +#define MSG_BEGIN_FILE_LIST "Begin file list" +#define MSG_END_FILE_LIST "End file list" +#define MSG_M104_INVALID_EXTRUDER "M104 Invalid extruder " +#define MSG_M105_INVALID_EXTRUDER "M105 Invalid extruder " +#define MSG_M200_INVALID_EXTRUDER "M200 Invalid extruder " +#define MSG_M218_INVALID_EXTRUDER "M218 Invalid extruder " +#define MSG_M221_INVALID_EXTRUDER "M221 Invalid extruder " +#define MSG_ERR_NO_THERMISTORS "No thermistors - no temperature" +#define MSG_M109_INVALID_EXTRUDER "M109 Invalid extruder " +#define MSG_M115_REPORT "FIRMWARE_NAME:Marlin V1.0.2; Sprinter/grbl mashup for gen6 FIRMWARE_URL:" FIRMWARE_URL " PROTOCOL_VERSION:" PROTOCOL_VERSION " MACHINE_TYPE:" CUSTOM_MENDEL_NAME " EXTRUDER_COUNT:" STRINGIFY(EXTRUDERS) " UUID:" MACHINE_UUID "\n" +#define MSG_ERR_KILLED "Printer halted. kill() called!" +#define MSG_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define MSG_RESEND "Resend: " +#define MSG_M119_REPORT "Reporting endstop status" +#define MSG_ENDSTOP_HIT "TRIGGERED" +#define MSG_ENDSTOP_OPEN "open" +#define MSG_SD_CANT_OPEN_SUBDIR "Cannot open subdir" +#define MSG_SD_INIT_FAIL "SD init fail" +#define MSG_SD_VOL_INIT_FAIL "volume.init failed" +#define MSG_SD_OPENROOT_FAIL "openRoot failed" +#define MSG_SD_CARD_OK "SD card ok" +#define MSG_SD_WORKDIR_FAIL "workDir open failed" +#define MSG_SD_OPEN_FILE_FAIL "open failed, File: " +#define MSG_SD_FILE_OPENED "File opened: " +#define MSG_SD_FILE_SELECTED "File selected" +#define MSG_SD_WRITE_TO_FILE "Writing to file: " +#define MSG_SD_PRINTING_BYTE "SD printing byte " +#define MSG_SD_NOT_PRINTING "Not SD printing" +#define MSG_SD_ERR_WRITE_TO_FILE "error writing to file" +#define MSG_SD_CANT_ENTER_SUBDIR "Cannot enter subdir: " +#define MSG_STEPPER_TOO_HIGH "Steprate too high: " +#define MSG_ENDSTOPS_HIT "endstops hit: " +#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented" +#define MSG_BABYSTEPPING_X "Babystepping X" +#define MSG_BABYSTEPPING_Y "Babystepping Y" +#define MSG_BABYSTEPPING_Z "Dostavovani Z" +#define MSG_SERIAL_ERROR_MENU_STRUCTURE "Error in menu structure" +#define MSG_SET_HOME_OFFSETS "Nastav pocatek home" +#define MSG_SET_ORIGIN "Nastav pocatek" + +#define MSG_SWITCH_PS_ON "Vypnout zdroj" +#define MSG_SWITCH_PS_OFF "Zapnout zdroj" + +#define MSG_NOZZLE1 "Tryska2" +#define MSG_NOZZLE2 "Tryska3" + + +#define MSG_FLOW0 "Prutok 0" +#define MSG_FLOW1 "Prutok 1" +#define MSG_FLOW2 "Prutok 2" +#define MSG_CONTROL "Kontrola" +#define MSG_MIN " \002 Min" +#define MSG_MAX " \002 Max" +#define MSG_FACTOR " \002 Fact" + + #define MSG_MOTION "Pohyb" +#define MSG_VOLUMETRIC "Filament" +#define MSG_VOLUMETRIC_ENABLED "E in mm3" +#define MSG_STORE_EPROM "Store memory" +#define MSG_LOAD_EPROM "Ulozit pamet" +#define MSG_RESTORE_FAILSAFE "Obnovit vychozi" +#define MSG_REFRESH "\xF8" "Obnovit" + +#define MSG_INIT_SDCARD "Inic. SD" +#define MSG_CNG_SDCARD "Vymenit SD" +#define MSG_BABYSTEP_X "Babystep X" +#define MSG_BABYSTEP_Y "Babystep Y" + + #define MSG_RECTRACT "Rectract" + +#define MSG_HOMEYZ "Kalibruj Z" +#define MSG_HOMEYZ_PROGRESS "Kalibruje Z" +#define MSG_HOMEYZ_DONE "Kalibracja OK" + +#define MSG_SELFTEST_ERROR "Selftest error !" +#define MSG_SELFTEST_PLEASECHECK "Skontroluj :" +#define MSG_SELFTEST_NOTCONNECTED "Nie podlaczono " +#define MSG_SELFTEST_HEATERTHERMISTOR "Heater/Thermistor" +#define MSG_SELFTEST_BEDHEATER "Bed / Heater" +#define MSG_SELFTEST_WIRINGERROR "Blad polaczenia" +#define MSG_SELFTEST_ENDSTOPS "Endstops" +#define MSG_SELFTEST_MOTOR "Silnik" +#define MSG_SELFTEST_ENDSTOP "Endstop" +#define MSG_SELFTEST_ENDSTOP_NOTHIT "Endstop not hit" +#define MSG_SELFTEST_OK "Self test OK" + +#define(length=20) MSG_SELFTEST_FAN "Test wentylatora"; +#define(length=20) MSG_SELFTEST_COOLING_FAN "Przodni went. druku?"; +#define(length=20) MSG_SELFTEST_EXTRUDER_FAN "Lewy went na dysze?"; +#define MSG_SELFTEST_FAN_YES "Kreci sie"; +#define MSG_SELFTEST_FAN_NO "Nekreci sie"; + +#define MSG_STATS_TOTALFILAMENT "Filament lacznie :" +#define MSG_STATS_TOTALPRINTTIME "Czas calkowity :" +#define MSG_STATS_FILAMENTUSED "Filament : " +#define MSG_STATS_PRINTTIME "Czas druku : " + +#define MSG_SELFTEST_START "Self test start " +#define MSG_SELFTEST_CHECK_ENDSTOPS "Kontrola endstops" +#define MSG_SELFTEST_CHECK_HOTEND "Kontrola hotend " +#define MSG_SELFTEST_CHECK_X "Kontrola X axis " +#define MSG_SELFTEST_CHECK_Y "Kontrola Y axis " +#define MSG_SELFTEST_CHECK_Z "Kontrola Z axis " +#define MSG_SELFTEST_CHECK_BED "Kontrola bed " +#define MSG_SELFTEST_CHECK_ALLCORRECT "Wszystko OK " +#define MSG_SELFTEST "Selftest " +#define MSG_SELFTEST_FAILED "Selftest nieudany" + +#define MSG_STATISTICS "Statystyka " +#define MSG_USB_PRINTING "Druk z USB " + +#define MSG_SHOW_END_STOPS "Pokaz krancowki" +#define MSG_CALIBRATE_BED "Kalibracja XYZ" +#define MSG_CALIBRATE_BED_RESET "Reset kalibr. XYZ" +#define MSG_MOVE_CARRIAGE_TO_THE_TOP "Kalibracja XYZ. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic." +#define MSG_MOVE_CARRIAGE_TO_THE_TOP_Z "Kalibracja Z. Przekrec galke, aby przesunac os Z do gornych krancowek. Nacisnij, by potwierdzic." + +#define MSG_CONFIRM_NOZZLE_CLEAN "Dla prawidl. kalibracji prosze oczyscic dysze. Potw. guzikiem." +#define MSG_CONFIRM_CARRIAGE_AT_THE_TOP "Oba wozki dojechaly do gornej ramy?" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE1 "Szukam punktu kalibracyjnego podkladki" +#define MSG_FIND_BED_OFFSET_AND_SKEW_LINE2 " z 4" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 "Poprawiam precyzyjnosc punktu kalibracyjnego" +#define MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 " z 9" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1 "Okreslam wysokosc odniesienia punktu kalibracyjnego" +#define MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2 " z 9" +#define MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION "Iteracja " + +#define MSG_BED_SKEW_OFFSET_DETECTION_POINT_NOT_FOUND "Kalibr. XYZ nieudana. Kalibracyjny punkt podkladki nieznaleziony." +#define MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED "Kalibracja XYZ niepowiedziona. Sprawdzic w instrukcji." +#define MSG_BED_SKEW_OFFSET_DETECTION_PERFECT "Kalibracja XYZ ok. Osie X/Y sa prostopadle. Gratulacje!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_MILD "Kalibracja XYZ prawidlowa. Osie X/Y lekko skosne. Dobra robota!" +#define MSG_BED_SKEW_OFFSET_DETECTION_SKEW_EXTREME "Kalibracja XYZ prawidlowa. Skosy beda automatycznie wyrownane przy druku." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_LEFT_FAR "Kalibr. XYZ nieudana. Lewy przedni punkt zbyt do przodu. Wyrownac drukarke." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_RIGHT_FAR "Kalibr. XYZ nieudana. Prawy przedni punkt zbyt do przodu. Wyrownac drukarke." +#define MSG_BED_SKEW_OFFSET_DETECTION_FAILED_FRONT_BOTH_FAR "Kalibr. XYZ nieudana. Przed. punkty kalibr. zbyt do przodu. Wyrownac drukarke." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_LEFT_FAR "Kalibracja XYZ niedokladna. Lewy przedni punkt zbyt wysuniety do przodu." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_RIGHT_FAR "Kalibracja XYZ niedokladna. Prawy przedni punkt zbyt wysuniety do przodu." +#define MSG_BED_SKEW_OFFSET_DETECTION_WARNING_FRONT_BOTH_FAR "Kalibr. XYZ niedokladna. Przednie punkty kalibr. Zbyt wys. do przodu." +#define MSG_BED_LEVELING_FAILED_POINT_LOW "Kalibracja nieudana. Sensor nie dotknal. Zanieczysz. dysza? Czekam na reset." +#define MSG_BED_LEVELING_FAILED_POINT_HIGH "Kalibracja Z nieudana. Sensor dotk. za wysoko. Czekam na reset." +#define MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED "Kalibracja nieudana. Sensor odlaczony lub uszkodz. kabel. Czekam na reset." +#define MSG_NEW_FIRMWARE_AVAILABLE "Wyszla nowa wersja firmware:" +#define MSG_NEW_FIRMWARE_PLEASE_UPGRADE "Prosze zaktualizowac" +#define MSG_FOLLOW_CALIBRATION_FLOW "Drukarka nie zostala jeszcze skalibrowana. Prosze kierowac sie instrukcja, rozdzial Zaczynamy, podrozdzial Selftest." +#define MSG_BABYSTEP_Z_NOT_SET "Odleglosc dyszy od podkladki nie jest skalibrowana. Postepuj zgodnie z instrukcja rozdzial Zaczynamy, podrozdzial Kalibracja pierwszej warstwy." +#define MSG_BED_CORRECTION_MENU "Korekta podkladki" +#define MSG_BED_CORRECTION_LEFT "W lewo [um]" +#define MSG_BED_CORRECTION_RIGHT "W prawo [um]" +#define MSG_BED_CORRECTION_FRONT "Do przodu [um]" +#define MSG_BED_CORRECTION_REAR "Do tylu [um]" +#define MSG_BED_CORRECTION_RESET "Reset" + +#define MSG_MESH_BED_LEVELING "Mesh Bed Leveling" +#define MSG_MENU_CALIBRATION "Kalibracja" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_OFF "karta SD [normal]" +#define MSG_TOSHIBA_FLASH_AIR_COMPATIBILITY_ON "karta SD[FlshAir]" + +#define MSG_LOOSE_PULLEY "Kolo pasowe" +#define MSG_FILAMENT_LOADING_T0 "Wloz filament do ekstrudera 1. Potwierdz przyciskiem." +#define MSG_FILAMENT_LOADING_T1 "Wloz filament do ekstrudera 2. Potwierdz przyciskiem." +#define MSG_FILAMENT_LOADING_T2 "Wloz filament do ekstrudera 3. Potwierdz przyciskiem." +#define MSG_FILAMENT_LOADING_T3 "Wloz filament do ekstrudera 4. Potwierdz przyciskiem." +#define MSG_CHANGE_EXTR "Zmienic ekstruder" + +#define MSG_FIL_ADJUSTING "Przebiega wyrownanie filamentow. Prosze czekac." +#define MSG_CONFIRM_NOZZLE_CLEAN_FIL_ADJ "Dla prawidlowej kalibracji prosze oczyscic dysze. Potem potwierdzic przyciskiem." +#define MSG_CALIBRATE_E "Kalibruj E" +#define MSG_E_CAL_KNOB "Prosze otaczac przycisk poki znacznik nie dosiegnie ciala ekstrudera. Potwierdzic przyciskiem." +#define MSG_MARK_FIL "Prosze oznaczyc filament 100 mm od ciala ekstrudera. Potwierdzic przyciskiem." +#define MSG_CLEAN_NOZZLE_E "Kalibracja E skonczona. Prosze oczyscic dysze. Potem potwierdzic przyciskiem. " +#define MSG_WAITING_TEMP "Oczekiwanie na wychlodzenie dyszy i podkladki." +#define MSG_FILAMENT_CLEAN "Czy kolor jest czysty?" +#define MSG_UNLOADING_FILAMENT "Wysuwam filament" +#define MSG_PAPER "Umiesc kartke papieru na podkladce i trzymaj pod dysza podczas pomiaru pierwszych 4 punktow. Jesli dysza zahaczy o papier, wylacz drukarke." + +#define MSG_FINISHING_MOVEMENTS "Konczenie druku" +#define MSG_PRINT_PAUSED "Druk zatrzymany" +#define MSG_RESUMING_PRINT "Wznawianie druku" +#define MSG_PID_EXTRUDER "Kalibracja PID" +#define MSG_SET_TEMPERATURE "Ustawic temperature" +#define MSG_PID_FINISHED "Kal. PID zakonczona" +#define MSG_PID_RUNNING "Kal. PID" + +#define MSG_CALIBRATE_PINDA "Skalibrowac" +#define MSG_CALIBRATION_PINDA_MENU "Cieplna kalibr." +#define MSG_PINDA_NOT_CALIBRATED "Cieplna kalibracja nie byla przeprowadzona" +#define MSG_PINDA_PREHEAT "Grzanie PINDA" +#define MSG_TEMP_CALIBRATION "Ciepl. kal. " +#define MSG_TEMP_CALIBRATION_DONE "Cieplna kalibracja zakonczona. Kontynuuj przyciskiem" +#define MSG_TEMP_CALIBRATION_ON "Ciepl. kal. [ON]" +#define MSG_TEMP_CALIBRATION_OFF "Ciepl. kal. [OFF]" +#define MSG_PREPARE_FILAMENT "Przygotuj filament" + +#define MSG_LOAD_ALL "Zalad. wszystkie" +#define MSG_LOAD_FILAMENT_1 "Zaladowac fil. 1" +#define MSG_LOAD_FILAMENT_2 "Zaladowac fil. 2" +#define MSG_LOAD_FILAMENT_3 "Zaladowac fil. 3" +#define MSG_LOAD_FILAMENT_4 "Zaladowac fil. 4" +#define MSG_UNLOAD_FILAMENT_1 "Wyjac filament 1" +#define MSG_UNLOAD_FILAMENT_2 "Wyjac filament 2" +#define MSG_UNLOAD_FILAMENT_3 "Wyjac filament 3" +#define MSG_UNLOAD_FILAMENT_4 "Wyjac filament 4" +#define MSG_UNLOAD_ALL "Wyjac wszystkie" +#define MSG_PREPARE_FILAMENT "Przygotuj filament" +#define MSG_ALL "Wszystko" +#define MSG_USED "Uzyte przy druku" +#define MSG_CURRENT "Tylko aktualne" +#define MSG_CHOOSE_EXTRUDER "Wybierz ekstruder" +#define MSG_EXTRUDER "Ekstruder" +#define MSG_EXTRUDER_1 "Ekstruder 1" +#define MSG_EXTRUDER_2 "Ekstruder 2" +#define MSG_EXTRUDER_3 "Ekstruder 3" +#define MSG_EXTRUDER_4 "Ekstruder 4" +#define MSG_DATE "Data:" +#define MSG_XYZ_DETAILS "Szczegoly kal.XYZ" +#define MSG_Y_DISTANCE_FROM_MIN "Odleglosc Y od min.:" +#define MSG_LEFT "Lewy:" +#define MSG_CENTER "Srodek:" +#define MSG_RIGHT "Prawy:" +#define MSG_MEASURED_SKEW "Zmier. sciecie:" +#define MSG_SLIGHT_SKEW "Lekkie sciecie:" #define MSG_SEVERE_SKEW "Ostre sciecie:" \ No newline at end of file diff --git a/Firmware/pins.h b/Firmware/pins.h index e7bc79bad..bef334fc6 100644 --- a/Firmware/pins.h +++ b/Firmware/pins.h @@ -1,384 +1,384 @@ -#ifndef PINS_H -#define PINS_H - -#include "boards.h" - -#if !MB(5DPRINT) -#define X_MS1_PIN -1 -#define X_MS2_PIN -1 -#define Y_MS1_PIN -1 -#define Y_MS2_PIN -1 -#define Z_MS1_PIN -1 -#define Z_MS2_PIN -1 -#define E0_MS1_PIN -1 -#define E0_MS2_PIN -1 -#define E1_MS1_PIN -1 -#define E1_MS2_PIN -1 -#define DIGIPOTSS_PIN -1 -#endif - -#define LARGE_FLASH true - -/***************************************************************** -* Rambo Pin Assignments 1.3 -******************************************************************/ -#if MOTHERBOARD == 302 - #define MINI_RAMBO - -#endif -#if MOTHERBOARD == 301 || MOTHERBOARD == 302 - #define KNOWN_BOARD - #ifndef __AVR_ATmega2560__ - #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. - #endif - - - #define FR_SENS 24 - - - #define X_STEP_PIN 37 - #define X_DIR_PIN 48 - #define X_MIN_PIN 12 - #define X_MAX_PIN 30 - #define X_ENABLE_PIN 29 - #define X_MS1_PIN 40 - #define X_MS2_PIN 41 - #define Y_STEP_PIN 36 - #define Y_DIR_PIN 49 - #define Y_MIN_PIN 11 - #define Y_MAX_PIN -1 - #define Y_ENABLE_PIN 28 - #define Y_MS1_PIN 69 - #define Y_MS2_PIN 39 - #define Z_STEP_PIN 35 - #define Z_DIR_PIN 47 - #define Z_MIN_PIN 10 - #define Z_MAX_PIN 23 - #define Z_ENABLE_PIN 27 - #define Z_MS1_PIN 68 - #define Z_MS2_PIN 67 - #define TEMP_BED_PIN 2 - #define TEMP_0_PIN 0 - #define HEATER_1_PIN 7 - #define TEMP_1_PIN 1 - #define TEMP_2_PIN -1 - -#ifdef SNMM - -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 - - -#endif - -#ifdef DIS -#define D_REQUIRE 30 -#define D_DATA 20 -#define D_DATACLOCK 21 - -#endif - -// The SDSS pin uses a different pin mapping from file Sd2PinMap.h -#define SDSS 53 - -#ifndef SDSUPPORT -// these pins are defined in the SD library if building with SD support - #define SCK_PIN 52 - #define MISO_PIN 50 - #define MOSI_PIN 51 -#endif - - #define BEEPER 84 - - #define BTN_EN1 72 - #define BTN_EN2 14 - #define BTN_ENC 9 - - #define SDCARDDETECT 15 - - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 - #define LCD_PINS_D4 19 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - - - - #define E0_STEP_PIN 34 - #define E0_DIR_PIN 43 - #define E0_ENABLE_PIN 26 - #define E0_MS1_PIN 65 - #define E0_MS2_PIN 66 - #define LED_PIN 13 - #ifdef THREEMM_PRINTER - #define FAN_PIN 8 - #else - #define FAN_PIN 6 - #endif - #define KILL_PIN -1 //80 with Smart Controller LCD - #define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. - #define SDPOWER -1 - #define HEATER_2_PIN -1 - #ifdef MINI_RAMBO - - #define ELECTRONICS "RAMBo13a" - - #define HEATER_0_PIN 3 - #define HEATER_BED_PIN 4 - #define FAN_1_PIN -1 //6 - #define PS_ON_PIN 71 - #define MOTOR_CURRENT_PWM_XY_PIN 46 - #define MOTOR_CURRENT_PWM_Z_PIN 45 - #define MOTOR_CURRENT_PWM_E_PIN 44 - - #else //RAMBo - #define ELECTRONICS "RAMBoBig" - - #define E1_STEP_PIN 33 - #define E1_DIR_PIN 42 - #define E1_ENABLE_PIN 25 - #define E1_MS1_PIN 63 - #define E1_MS2_PIN 64 - #define DIGIPOTSS_PIN 38 - #define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping - #define HEATER_0_PIN 9 - #define HEATER_BED_PIN 3 - #define PS_ON_PIN 4 - #define SDSS 53 - #ifdef ULTRA_LCD - #define KILL_PIN 80 - #ifdef NEWPANEL - //arduino pin which triggers an piezzo beeper - #define BEEPER 84 // Beeper on AUX-4 - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 - #define LCD_PINS_D4 19 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - //buttons are directly attached using AUX-2 - #define BTN_EN1 76 - #define BTN_EN2 77 - #define BTN_ENC 78 //the click - #define BLEN_C 2 - #define BLEN_B 1 - #define BLEN_A 0 - #define SDCARDDETECT 81 // Ramps does not use this port - //encoder rotation values - #define encrot0 0 - #define encrot1 2 - #define encrot2 3 - #define encrot3 1 - #else //old style panel with shift register - //arduino pin witch triggers an piezzo beeper - #define BEEPER 84 //No Beeper added - //buttons are attached to a shift register - // Not wired this yet - // #define SHIFT_CLK 38 - // #define SHIFT_LD 42 - // #define SHIFT_OUT 40 - // #define SHIFT_EN 17 - #define LCD_PINS_RS 82 - #define LCD_PINS_ENABLE 18 - #define LCD_PINS_D4 19 - #define LCD_PINS_D5 70 - #define LCD_PINS_D6 85 - #define LCD_PINS_D7 71 - //encoder rotation values - #define encrot0 0 - #define encrot1 2 - #define encrot2 3 - #define encrot3 1 - //bits in the shift register that carry the buttons for: - // left up center down right red - #define BL_LE 7 - #define BL_UP 6 - #define BL_MI 5 - #define BL_DW 4 - #define BL_RI 3 - #define BL_ST 2 - #define BLEN_B 1 - #define BLEN_A 0 - #endif - #endif //ULTRA_LCD - #endif //RAMBo/MiniRambo option -#endif - - - - - - - - -/***************************************************************** -* Rambo mini Pin Assignments 1.0 -******************************************************************/ -#if MOTHERBOARD == 102 - #define ELECTRONICS "RAMBo10a" - #define KNOWN_BOARD - #ifndef __AVR_ATmega2560__ - #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. - #endif - - #define FR_SENS 24 - -#ifdef SNMM - -#define E_MUX0_PIN 17 -#define E_MUX1_PIN 16 - - -#endif - #define LARGE_FLASH true - #define X_STEP_PIN 37 - #define X_DIR_PIN 48 - #define X_MIN_PIN 12 - #define X_MAX_PIN 30 - #define X_ENABLE_PIN 29 - #define X_MS1_PIN 40 - #define X_MS2_PIN 41 - #define Y_STEP_PIN 36 - #define Y_DIR_PIN 49 - #define Y_MIN_PIN 11 - #define Y_MAX_PIN -1 - #define Y_ENABLE_PIN 28 - #define Y_MS1_PIN 69 - #define Y_MS2_PIN 39 - #define Z_STEP_PIN 35 - #define Z_DIR_PIN 47 - #define Z_MIN_PIN 10 - #define Z_MAX_PIN 23 - #define Z_ENABLE_PIN 27 - #define Z_MS1_PIN 68 - #define Z_MS2_PIN 67 - #define TEMP_BED_PIN 2 - #define TEMP_0_PIN 0 - #define HEATER_1_PIN 7 - #define TEMP_1_PIN 1 - #define TEMP_2_PIN -1 - - // The SDSS pin uses a different pin mapping from file Sd2PinMap.h -#define SDSS 53 - -#ifndef SDSUPPORT -// these pins are defined in the SD library if building with SD support - #define SCK_PIN 52 - #define MISO_PIN 50 - #define MOSI_PIN 51 -#endif - - #define BEEPER 78 - - #define BTN_EN1 80 - #define BTN_EN2 73 - #define BTN_ENC 21 - - #define SDCARDDETECT 72 - - #define LCD_PINS_RS 38 - #define LCD_PINS_ENABLE 5 - #define LCD_PINS_D4 14 - #define LCD_PINS_D5 15 - #define LCD_PINS_D6 32 - #define LCD_PINS_D7 31 - - - - #define E0_STEP_PIN 34 - #define E0_DIR_PIN 43 - #define E0_ENABLE_PIN 26 - #define E0_MS1_PIN 65 - #define E0_MS2_PIN 66 - #define LED_PIN 13 - #ifdef THREEMM_PRINTER - #define FAN_PIN 8 - #else - #define FAN_PIN 6 - #endif - #define KILL_PIN -1 //80 with Smart Controller LCD - #define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. - #define SDPOWER -1 - #define HEATER_2_PIN -1 - - #define HEATER_0_PIN 3 - #define HEATER_BED_PIN 4 - #define FAN_1_PIN -1 //6 - #define PS_ON_PIN 71 - #define MOTOR_CURRENT_PWM_XY_PIN 46 - #define MOTOR_CURRENT_PWM_Z_PIN 45 - #define MOTOR_CURRENT_PWM_E_PIN 44 - - -#endif - - - - - -#ifndef KNOWN_BOARD -#error Unknown MOTHERBOARD value in configuration.h -#endif - -//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those! -#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, HEATER_0_PIN, -#if EXTRUDERS > 1 - #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, HEATER_1_PIN, -#else - #define _E1_PINS -#endif -#if EXTRUDERS > 2 - #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, HEATER_2_PIN, -#else - #define _E2_PINS -#endif - -#ifdef X_STOP_PIN - #if X_HOME_DIR < 0 - #define X_MIN_PIN X_STOP_PIN - #define X_MAX_PIN -1 - #else - #define X_MIN_PIN -1 - #define X_MAX_PIN X_STOP_PIN - #endif -#endif - -#ifdef Y_STOP_PIN - #if Y_HOME_DIR < 0 - #define Y_MIN_PIN Y_STOP_PIN - #define Y_MAX_PIN -1 - #else - #define Y_MIN_PIN -1 - #define Y_MAX_PIN Y_STOP_PIN - #endif -#endif - -#ifdef Z_STOP_PIN - #if Z_HOME_DIR < 0 - #define Z_MIN_PIN Z_STOP_PIN - #define Z_MAX_PIN -1 - #else - #define Z_MIN_PIN -1 - #define Z_MAX_PIN Z_STOP_PIN - #endif -#endif - -#ifdef DISABLE_MAX_ENDSTOPS -#define X_MAX_PIN -1 -#define Y_MAX_PIN -1 -#define Z_MAX_PIN -1 -#endif - -#ifdef DISABLE_MIN_ENDSTOPS -#define X_MIN_PIN -1 -#define Y_MIN_PIN -1 -#define Z_MIN_PIN -1 -#endif - -#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, PS_ON_PIN, \ - HEATER_BED_PIN, FAN_PIN, \ - _E0_PINS _E1_PINS _E2_PINS \ - analogInputToDigitalPin(TEMP_0_PIN), analogInputToDigitalPin(TEMP_1_PIN), analogInputToDigitalPin(TEMP_2_PIN), analogInputToDigitalPin(TEMP_BED_PIN) } - -#endif //__PINS_H +#ifndef PINS_H +#define PINS_H + +#include "boards.h" + +#if !MB(5DPRINT) +#define X_MS1_PIN -1 +#define X_MS2_PIN -1 +#define Y_MS1_PIN -1 +#define Y_MS2_PIN -1 +#define Z_MS1_PIN -1 +#define Z_MS2_PIN -1 +#define E0_MS1_PIN -1 +#define E0_MS2_PIN -1 +#define E1_MS1_PIN -1 +#define E1_MS2_PIN -1 +#define DIGIPOTSS_PIN -1 +#endif + +#define LARGE_FLASH true + +/***************************************************************** +* Rambo Pin Assignments 1.3 +******************************************************************/ +#if MOTHERBOARD == 302 + #define MINI_RAMBO + +#endif +#if MOTHERBOARD == 301 || MOTHERBOARD == 302 + #define KNOWN_BOARD + #ifndef __AVR_ATmega2560__ + #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. + #endif + + + #define FR_SENS 24 + + + #define X_STEP_PIN 37 + #define X_DIR_PIN 48 + #define X_MIN_PIN 12 + #define X_MAX_PIN 30 + #define X_ENABLE_PIN 29 + #define X_MS1_PIN 40 + #define X_MS2_PIN 41 + #define Y_STEP_PIN 36 + #define Y_DIR_PIN 49 + #define Y_MIN_PIN 11 + #define Y_MAX_PIN -1 + #define Y_ENABLE_PIN 28 + #define Y_MS1_PIN 69 + #define Y_MS2_PIN 39 + #define Z_STEP_PIN 35 + #define Z_DIR_PIN 47 + #define Z_MIN_PIN 10 + #define Z_MAX_PIN 23 + #define Z_ENABLE_PIN 27 + #define Z_MS1_PIN 68 + #define Z_MS2_PIN 67 + #define TEMP_BED_PIN 2 + #define TEMP_0_PIN 0 + #define HEATER_1_PIN 7 + #define TEMP_1_PIN 1 + #define TEMP_2_PIN -1 + +#ifdef SNMM + +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 + + +#endif + +#ifdef DIS +#define D_REQUIRE 30 +#define D_DATA 20 +#define D_DATACLOCK 21 + +#endif + +// The SDSS pin uses a different pin mapping from file Sd2PinMap.h +#define SDSS 53 + +#ifndef SDSUPPORT +// these pins are defined in the SD library if building with SD support + #define SCK_PIN 52 + #define MISO_PIN 50 + #define MOSI_PIN 51 +#endif + + #define BEEPER 84 + + #define BTN_EN1 72 + #define BTN_EN2 14 + #define BTN_ENC 9 + + #define SDCARDDETECT 15 + + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + + + + #define E0_STEP_PIN 34 + #define E0_DIR_PIN 43 + #define E0_ENABLE_PIN 26 + #define E0_MS1_PIN 65 + #define E0_MS2_PIN 66 + #define LED_PIN 13 + #ifdef THREEMM_PRINTER + #define FAN_PIN 8 + #else + #define FAN_PIN 6 + #endif + #define KILL_PIN -1 //80 with Smart Controller LCD + #define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. + #define SDPOWER -1 + #define HEATER_2_PIN -1 + #ifdef MINI_RAMBO + + #define ELECTRONICS "RAMBo13a" + + #define HEATER_0_PIN 3 + #define HEATER_BED_PIN 4 + #define FAN_1_PIN -1 //6 + #define PS_ON_PIN 71 + #define MOTOR_CURRENT_PWM_XY_PIN 46 + #define MOTOR_CURRENT_PWM_Z_PIN 45 + #define MOTOR_CURRENT_PWM_E_PIN 44 + + #else //RAMBo + #define ELECTRONICS "RAMBoBig" + + #define E1_STEP_PIN 33 + #define E1_DIR_PIN 42 + #define E1_ENABLE_PIN 25 + #define E1_MS1_PIN 63 + #define E1_MS2_PIN 64 + #define DIGIPOTSS_PIN 38 + #define DIGIPOT_CHANNELS {4,5,3,0,1} // X Y Z E0 E1 digipot channels to stepper driver mapping + #define HEATER_0_PIN 9 + #define HEATER_BED_PIN 3 + #define PS_ON_PIN 4 + #define SDSS 53 + #ifdef ULTRA_LCD + #define KILL_PIN 80 + #ifdef NEWPANEL + //arduino pin which triggers an piezzo beeper + #define BEEPER 84 // Beeper on AUX-4 + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + //buttons are directly attached using AUX-2 + #define BTN_EN1 76 + #define BTN_EN2 77 + #define BTN_ENC 78 //the click + #define BLEN_C 2 + #define BLEN_B 1 + #define BLEN_A 0 + #define SDCARDDETECT 81 // Ramps does not use this port + //encoder rotation values + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 + #else //old style panel with shift register + //arduino pin witch triggers an piezzo beeper + #define BEEPER 84 //No Beeper added + //buttons are attached to a shift register + // Not wired this yet + // #define SHIFT_CLK 38 + // #define SHIFT_LD 42 + // #define SHIFT_OUT 40 + // #define SHIFT_EN 17 + #define LCD_PINS_RS 82 + #define LCD_PINS_ENABLE 18 + #define LCD_PINS_D4 19 + #define LCD_PINS_D5 70 + #define LCD_PINS_D6 85 + #define LCD_PINS_D7 71 + //encoder rotation values + #define encrot0 0 + #define encrot1 2 + #define encrot2 3 + #define encrot3 1 + //bits in the shift register that carry the buttons for: + // left up center down right red + #define BL_LE 7 + #define BL_UP 6 + #define BL_MI 5 + #define BL_DW 4 + #define BL_RI 3 + #define BL_ST 2 + #define BLEN_B 1 + #define BLEN_A 0 + #endif + #endif //ULTRA_LCD + #endif //RAMBo/MiniRambo option +#endif + + + + + + + + +/***************************************************************** +* Rambo mini Pin Assignments 1.0 +******************************************************************/ +#if MOTHERBOARD == 102 + #define ELECTRONICS "RAMBo10a" + #define KNOWN_BOARD + #ifndef __AVR_ATmega2560__ + #error Oops! Make sure you have 'Arduino Mega 2560' selected from the 'Tools -> Boards' menu. + #endif + + #define FR_SENS 24 + +#ifdef SNMM + +#define E_MUX0_PIN 17 +#define E_MUX1_PIN 16 + + +#endif + #define LARGE_FLASH true + #define X_STEP_PIN 37 + #define X_DIR_PIN 48 + #define X_MIN_PIN 12 + #define X_MAX_PIN 30 + #define X_ENABLE_PIN 29 + #define X_MS1_PIN 40 + #define X_MS2_PIN 41 + #define Y_STEP_PIN 36 + #define Y_DIR_PIN 49 + #define Y_MIN_PIN 11 + #define Y_MAX_PIN -1 + #define Y_ENABLE_PIN 28 + #define Y_MS1_PIN 69 + #define Y_MS2_PIN 39 + #define Z_STEP_PIN 35 + #define Z_DIR_PIN 47 + #define Z_MIN_PIN 10 + #define Z_MAX_PIN 23 + #define Z_ENABLE_PIN 27 + #define Z_MS1_PIN 68 + #define Z_MS2_PIN 67 + #define TEMP_BED_PIN 2 + #define TEMP_0_PIN 0 + #define HEATER_1_PIN 7 + #define TEMP_1_PIN 1 + #define TEMP_2_PIN -1 + + // The SDSS pin uses a different pin mapping from file Sd2PinMap.h +#define SDSS 53 + +#ifndef SDSUPPORT +// these pins are defined in the SD library if building with SD support + #define SCK_PIN 52 + #define MISO_PIN 50 + #define MOSI_PIN 51 +#endif + + #define BEEPER 78 + + #define BTN_EN1 80 + #define BTN_EN2 73 + #define BTN_ENC 21 + + #define SDCARDDETECT 72 + + #define LCD_PINS_RS 38 + #define LCD_PINS_ENABLE 5 + #define LCD_PINS_D4 14 + #define LCD_PINS_D5 15 + #define LCD_PINS_D6 32 + #define LCD_PINS_D7 31 + + + + #define E0_STEP_PIN 34 + #define E0_DIR_PIN 43 + #define E0_ENABLE_PIN 26 + #define E0_MS1_PIN 65 + #define E0_MS2_PIN 66 + #define LED_PIN 13 + #ifdef THREEMM_PRINTER + #define FAN_PIN 8 + #else + #define FAN_PIN 6 + #endif + #define KILL_PIN -1 //80 with Smart Controller LCD + #define SUICIDE_PIN -1 //PIN that has to be turned on right after start, to keep power flowing. + #define SDPOWER -1 + #define HEATER_2_PIN -1 + + #define HEATER_0_PIN 3 + #define HEATER_BED_PIN 4 + #define FAN_1_PIN -1 //6 + #define PS_ON_PIN 71 + #define MOTOR_CURRENT_PWM_XY_PIN 46 + #define MOTOR_CURRENT_PWM_Z_PIN 45 + #define MOTOR_CURRENT_PWM_E_PIN 44 + + +#endif + + + + + +#ifndef KNOWN_BOARD +#error Unknown MOTHERBOARD value in configuration.h +#endif + +//List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those! +#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, HEATER_0_PIN, +#if EXTRUDERS > 1 + #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, HEATER_1_PIN, +#else + #define _E1_PINS +#endif +#if EXTRUDERS > 2 + #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, HEATER_2_PIN, +#else + #define _E2_PINS +#endif + +#ifdef X_STOP_PIN + #if X_HOME_DIR < 0 + #define X_MIN_PIN X_STOP_PIN + #define X_MAX_PIN -1 + #else + #define X_MIN_PIN -1 + #define X_MAX_PIN X_STOP_PIN + #endif +#endif + +#ifdef Y_STOP_PIN + #if Y_HOME_DIR < 0 + #define Y_MIN_PIN Y_STOP_PIN + #define Y_MAX_PIN -1 + #else + #define Y_MIN_PIN -1 + #define Y_MAX_PIN Y_STOP_PIN + #endif +#endif + +#ifdef Z_STOP_PIN + #if Z_HOME_DIR < 0 + #define Z_MIN_PIN Z_STOP_PIN + #define Z_MAX_PIN -1 + #else + #define Z_MIN_PIN -1 + #define Z_MAX_PIN Z_STOP_PIN + #endif +#endif + +#ifdef DISABLE_MAX_ENDSTOPS +#define X_MAX_PIN -1 +#define Y_MAX_PIN -1 +#define Z_MAX_PIN -1 +#endif + +#ifdef DISABLE_MIN_ENDSTOPS +#define X_MIN_PIN -1 +#define Y_MIN_PIN -1 +#define Z_MIN_PIN -1 +#endif + +#define SENSITIVE_PINS {0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, PS_ON_PIN, \ + HEATER_BED_PIN, FAN_PIN, \ + _E0_PINS _E1_PINS _E2_PINS \ + analogInputToDigitalPin(TEMP_0_PIN), analogInputToDigitalPin(TEMP_1_PIN), analogInputToDigitalPin(TEMP_2_PIN), analogInputToDigitalPin(TEMP_BED_PIN) } + +#endif //__PINS_H diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index 896a0fedf..e56b690a5 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -1,1295 +1,1228 @@ -/* - planner.c - buffers movement commands and manages the acceleration profile plan - Part of Grbl - - Copyright (c) 2009-2011 Simen Svale Skogsrud - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . - */ - -/* The ring buffer implementation gleaned from the wiring_serial library by David A. Mellis. */ - -/* - Reasoning behind the mathematics in this module (in the key of 'Mathematica'): - - s == speed, a == acceleration, t == time, d == distance - - Basic definitions: - - Speed[s_, a_, t_] := s + (a*t) - Travel[s_, a_, t_] := Integrate[Speed[s, a, t], t] - - Distance to reach a specific speed with a constant acceleration: - - Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, d, t] - d -> (m^2 - s^2)/(2 a) --> estimate_acceleration_distance() - - Speed after a given distance of travel with constant acceleration: - - Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, m, t] - m -> Sqrt[2 a d + s^2] - - DestinationSpeed[s_, a_, d_] := Sqrt[2 a d + s^2] - - When to start braking (di) to reach a specified destionation speed (s2) after accelerating - from initial speed s1 without ever stopping at a plateau: - - Solve[{DestinationSpeed[s1, a, di] == DestinationSpeed[s2, a, d - di]}, di] - di -> (2 a d - s1^2 + s2^2)/(4 a) --> intersection_distance() - - IntersectionDistance[s1_, s2_, a_, d_] := (2 a d - s1^2 + s2^2)/(4 a) - */ - -#include "Marlin.h" -#include "planner.h" -#include "stepper.h" -#include "temperature.h" -#include "ultralcd.h" -#include "language.h" - -#ifdef MESH_BED_LEVELING -#include "mesh_bed_leveling.h" -#include "mesh_bed_calibration.h" -#endif - -//=========================================================================== -//=============================public variables ============================ -//=========================================================================== - -unsigned long minsegmenttime; -float max_feedrate[NUM_AXIS]; // set the max speeds -float axis_steps_per_unit[NUM_AXIS]; -unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software -float minimumfeedrate; -float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX -float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX -// Jerk is a maximum immediate velocity change. -float max_jerk[NUM_AXIS]; -float mintravelfeedrate; -unsigned long axis_steps_per_sqr_second[NUM_AXIS]; - -#ifdef ENABLE_AUTO_BED_LEVELING -// this holds the required transform to compensate for bed level -matrix_3x3 plan_bed_level_matrix = { - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0, -}; -#endif // #ifdef ENABLE_AUTO_BED_LEVELING - -// The current position of the tool in absolute steps -long position[NUM_AXIS]; //rescaled from extern when axis_steps_per_unit are changed by gcode -static float previous_speed[NUM_AXIS]; // Speed of previous path line segment -static float previous_nominal_speed; // Nominal speed of previous path line segment -static float previous_safe_speed; // Exit speed limited by a jerk to full halt of a previous last segment. - -#ifdef AUTOTEMP -float autotemp_max=250; -float autotemp_min=210; -float autotemp_factor=0.1; -bool autotemp_enabled=false; -#endif - -unsigned char g_uc_extruder_last_move[3] = {0,0,0}; - -//=========================================================================== -//=================semi-private variables, used in inline functions ===== -//=========================================================================== -block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions -volatile unsigned char block_buffer_head; // Index of the next block to be pushed -volatile unsigned char block_buffer_tail; // Index of the block to process now - -#ifdef PLANNER_DIAGNOSTICS -// Diagnostic function: Minimum number of planned moves since the last -static uint8_t g_cntr_planner_queue_min = 0; -#endif /* PLANNER_DIAGNOSTICS */ - -//=========================================================================== -//=============================private variables ============================ -//=========================================================================== -#ifdef PREVENT_DANGEROUS_EXTRUDE -float extrude_min_temp=EXTRUDE_MINTEMP; -#endif - -#ifdef FILAMENT_SENSOR - static char meas_sample; //temporary variable to hold filament measurement sample -#endif - -#ifdef LIN_ADVANCE - float extruder_advance_k = LIN_ADVANCE_K, - advance_ed_ratio = LIN_ADVANCE_E_D_RATIO, - position_float[NUM_AXIS] = { 0 }; -#endif - -// Returns the index of the next block in the ring buffer -// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication. -static inline int8_t next_block_index(int8_t block_index) { - if (++ block_index == BLOCK_BUFFER_SIZE) - block_index = 0; - return block_index; -} - - -// Returns the index of the previous block in the ring buffer -static inline int8_t prev_block_index(int8_t block_index) { - if (block_index == 0) - block_index = BLOCK_BUFFER_SIZE; - -- block_index; - return block_index; -} - -//=========================================================================== -//=============================functions ============================ -//=========================================================================== - -// Calculates the distance (not time) it takes to accelerate from initial_rate to target_rate using the -// given acceleration: -FORCE_INLINE float estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) -{ - if (acceleration!=0) { - return((target_rate*target_rate-initial_rate*initial_rate)/ - (2.0*acceleration)); - } - else { - return 0.0; // acceleration was 0, set acceleration distance to 0 - } -} - -// This function gives you the point at which you must start braking (at the rate of -acceleration) if -// you started at speed initial_rate and accelerated until this point and want to end at the final_rate after -// a total travel of distance. This can be used to compute the intersection point between acceleration and -// deceleration in the cases where the trapezoid has no plateau (i.e. never reaches maximum speed) - -FORCE_INLINE float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) -{ - if (acceleration!=0) { - return((2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/ - (4.0*acceleration) ); - } - else { - return 0.0; // acceleration was 0, set intersection distance to 0 - } -} - -#define MINIMAL_STEP_RATE 120 - -// Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors. -void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit_speed) -{ - // These two lines are the only floating point calculations performed in this routine. - uint32_t initial_rate = ceil(entry_speed * block->speed_factor); // (step/min) - uint32_t final_rate = ceil(exit_speed * block->speed_factor); // (step/min) - - // Limit minimal step rate (Otherwise the timer will overflow.) - if (initial_rate < MINIMAL_STEP_RATE) - initial_rate = MINIMAL_STEP_RATE; - if (initial_rate > block->nominal_rate) - initial_rate = block->nominal_rate; - if (final_rate < MINIMAL_STEP_RATE) - final_rate = MINIMAL_STEP_RATE; - if (final_rate > block->nominal_rate) - final_rate = block->nominal_rate; - - uint32_t acceleration = block->acceleration_st; - if (acceleration == 0) - // Don't allow zero acceleration. - acceleration = 1; - // estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) - // (target_rate*target_rate-initial_rate*initial_rate)/(2.0*acceleration)); - uint32_t initial_rate_sqr = initial_rate*initial_rate; - //FIXME assert that this result fits a 64bit unsigned int. - uint32_t nominal_rate_sqr = block->nominal_rate*block->nominal_rate; - uint32_t final_rate_sqr = final_rate*final_rate; - uint32_t acceleration_x2 = acceleration << 1; - // ceil(estimate_acceleration_distance(initial_rate, block->nominal_rate, acceleration)); - uint32_t accelerate_steps = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2; - // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration)); - uint32_t decelerate_steps = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2; - uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; - // Size of Plateau of Nominal Rate. - uint32_t plateau_steps = 0; - - // Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will - // have to use intersection_distance() to calculate when to abort acceleration and start braking - // in order to reach the final_rate exactly at the end of this block. - if (accel_decel_steps < block->step_event_count) { - plateau_steps = block->step_event_count - accel_decel_steps; - } else { - uint32_t acceleration_x4 = acceleration << 2; - // Avoid negative numbers - if (final_rate_sqr >= initial_rate_sqr) { - // accelerate_steps = ceil(intersection_distance(initial_rate, final_rate, acceleration, block->step_event_count)); - // intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) - // (2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4.0*acceleration); -#if 0 - accelerate_steps = (block->step_event_count >> 1) + (final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1 + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; -#else - accelerate_steps = final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1; - if (block->step_event_count & 1) - accelerate_steps += acceleration_x2; - accelerate_steps /= acceleration_x4; - accelerate_steps += (block->step_event_count >> 1); -#endif - if (accelerate_steps > block->step_event_count) - accelerate_steps = block->step_event_count; - } else { -#if 0 - decelerate_steps = (block->step_event_count >> 1) + (initial_rate_sqr - final_rate_sqr + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; -#else - decelerate_steps = initial_rate_sqr - final_rate_sqr; - if (block->step_event_count & 1) - decelerate_steps += acceleration_x2; - decelerate_steps /= acceleration_x4; - decelerate_steps += (block->step_event_count >> 1); -#endif - if (decelerate_steps > block->step_event_count) - decelerate_steps = block->step_event_count; - accelerate_steps = block->step_event_count - decelerate_steps; - } - } - - CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section - if (! block->busy) { // Don't update variables if block is busy. - block->accelerate_until = accelerate_steps; - block->decelerate_after = accelerate_steps+plateau_steps; - block->initial_rate = initial_rate; - block->final_rate = final_rate; - } - CRITICAL_SECTION_END; -} - -// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the -// decceleration within the allotted distance. -FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) -{ - // assert(decceleration < 0); - return sqrt(target_velocity*target_velocity-2*decceleration*distance); -} - -// Recalculates the motion plan according to the following algorithm: -// -// 1. Go over every block in reverse order and calculate a junction speed reduction (i.e. block_t.entry_factor) -// so that: -// a. The junction jerk is within the set limit -// b. No speed reduction within one block requires faster deceleration than the one, true constant -// acceleration. -// 2. Go over every block in chronological order and dial down junction speed reduction values if -// a. The speed increase within one block would require faster accelleration than the one, true -// constant acceleration. -// -// When these stages are complete all blocks have an entry_factor that will allow all speed changes to -// be performed using only the one, true constant acceleration, and where no junction jerk is jerkier than -// the set limit. Finally it will: -// -// 3. Recalculate trapezoids for all blocks. -// -//FIXME This routine is called 15x every time a new line is added to the planner, -// therefore it is a bottle neck and it shall be rewritten into a Fixed Point arithmetics, -// if the CPU is found lacking computational power. -// -// Following sources may be used to optimize the 8-bit AVR code: -// http://www.mikrocontroller.net/articles/AVR_Arithmetik -// http://darcy.rsgc.on.ca/ACES/ICE4M/FixedPoint/avrfix.pdf -// -// https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/avr/lib1funcs-fixed.S -// https://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html -// https://gcc.gnu.org/onlinedocs/gccint/Fixed-point-fractional-library-routines.html -// -// https://ucexperiment.wordpress.com/2015/04/04/arduino-s15-16-fixed-point-math-routines/ -// https://mekonik.wordpress.com/2009/03/18/arduino-avr-gcc-multiplication/ -// https://github.com/rekka/avrmultiplication -// -// https://people.ece.cornell.edu/land/courses/ece4760/Math/Floating_point/ -// https://courses.cit.cornell.edu/ee476/Math/ -// https://courses.cit.cornell.edu/ee476/Math/GCC644/fixedPt/multASM.S -// -void planner_recalculate(const float &safe_final_speed) -{ - // Reverse pass - // Make a local copy of block_buffer_tail, because the interrupt can alter it - // by consuming the blocks, therefore shortening the queue. - unsigned char tail = block_buffer_tail; - uint8_t block_index; - block_t *prev, *current, *next; - -// SERIAL_ECHOLNPGM("planner_recalculate - 1"); - - // At least three blocks are in the queue? - unsigned char n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); - if (n_blocks >= 3) { - // Initialize the last tripple of blocks. - block_index = prev_block_index(block_buffer_head); - next = block_buffer + block_index; - current = block_buffer + (block_index = prev_block_index(block_index)); - // No need to recalculate the last block, it has already been set by the plan_buffer_line() function. - // Vojtech thinks, that one shall not touch the entry speed of the very first block as well, because - // 1) it may already be running at the stepper interrupt, - // 2) there is no way to limit it when going in the forward direction. - while (block_index != tail) { - if (current->flag & BLOCK_FLAG_START_FROM_FULL_HALT) { - // Don't modify the entry velocity of the starting block. - // Also don't modify the trapezoids before this block, they are finalized already, prepared - // for the stepper interrupt routine to use them. - tail = block_index; - // Update the number of blocks to process. - n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); - // SERIAL_ECHOLNPGM("START"); - break; - } - // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. - // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and - // check for maximum allowable speed reductions to ensure maximum possible planned speed. - if (current->entry_speed != current->max_entry_speed) { - // assert(current->entry_speed < current->max_entry_speed); - // Entry speed could be increased up to the max_entry_speed, limited by the length of the current - // segment and the maximum acceleration allowed for this segment. - // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity. - // Only compute for max allowable speed if block is decelerating and nominal length is false. - // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um. - // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient - // together with an assembly 32bit->16bit sqrt function. - current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? - current->max_entry_speed : - // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); - min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); - current->flag |= BLOCK_FLAG_RECALCULATE; - } - next = current; - current = block_buffer + (block_index = prev_block_index(block_index)); - } - } - -// SERIAL_ECHOLNPGM("planner_recalculate - 2"); - - // Forward pass and recalculate the trapezoids. - if (n_blocks >= 2) { - // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail. - block_index = tail; - prev = block_buffer + block_index; - current = block_buffer + (block_index = next_block_index(block_index)); - do { - // If the previous block is an acceleration block, but it is not long enough to complete the - // full speed change within the block, we need to adjust the entry speed accordingly. Entry - // speeds have already been reset, maximized, and reverse planned by reverse planner. - // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. - if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) { - float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters)); - // Check for junction speed change - if (current->entry_speed != entry_speed) { - current->entry_speed = entry_speed; - current->flag |= BLOCK_FLAG_RECALCULATE; - } - } - // Recalculate if current block entry or exit junction speed has changed. - if ((prev->flag | current->flag) & BLOCK_FLAG_RECALCULATE) { - // NOTE: Entry and exit factors always > 0 by all previous logic operations. - calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); - // Reset current only to ensure next trapezoid is computed. - prev->flag &= ~BLOCK_FLAG_RECALCULATE; - } - prev = current; - current = block_buffer + (block_index = next_block_index(block_index)); - } while (block_index != block_buffer_head); - } - -// SERIAL_ECHOLNPGM("planner_recalculate - 3"); - - // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated. - current = block_buffer + prev_block_index(block_buffer_head); - calculate_trapezoid_for_block(current, current->entry_speed, safe_final_speed); - current->flag &= ~BLOCK_FLAG_RECALCULATE; - -// SERIAL_ECHOLNPGM("planner_recalculate - 4"); -} - -void plan_init() { - block_buffer_head = 0; - block_buffer_tail = 0; - memset(position, 0, sizeof(position)); // clear position - #ifdef LIN_ADVANCE - memset(position_float, 0, sizeof(position)); // clear position - #endif - previous_speed[0] = 0.0; - previous_speed[1] = 0.0; - previous_speed[2] = 0.0; - previous_speed[3] = 0.0; - previous_nominal_speed = 0.0; -} - - - - -#ifdef AUTOTEMP -void getHighESpeed() -{ - static float oldt=0; - if(!autotemp_enabled){ - return; - } - if(degTargetHotend0()+2high) - { - high=se; - } - } - block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); - } - - float g=autotemp_min+high*autotemp_factor; - float t=g; - if(tautotemp_max) - t=autotemp_max; - if(oldt>t) - { - t=AUTOTEMP_OLDWEIGHT*oldt+(1-AUTOTEMP_OLDWEIGHT)*t; - } - oldt=t; - setTargetHotend0(t); -} -#endif - -void check_axes_activity() -{ - unsigned char x_active = 0; - unsigned char y_active = 0; - unsigned char z_active = 0; - unsigned char e_active = 0; - unsigned char tail_fan_speed = fanSpeed; - block_t *block; - - if(block_buffer_tail != block_buffer_head) - { - uint8_t block_index = block_buffer_tail; - tail_fan_speed = block_buffer[block_index].fan_speed; - while(block_index != block_buffer_head) - { - block = &block_buffer[block_index]; - if(block->steps_x != 0) x_active++; - if(block->steps_y != 0) y_active++; - if(block->steps_z != 0) z_active++; - if(block->steps_e != 0) e_active++; - block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); - } - } - if((DISABLE_X) && (x_active == 0)) disable_x(); - if((DISABLE_Y) && (y_active == 0)) disable_y(); - if((DISABLE_Z) && (z_active == 0)) disable_z(); - if((DISABLE_E) && (e_active == 0)) - { - disable_e0(); - disable_e1(); - disable_e2(); - } -#if defined(FAN_PIN) && FAN_PIN > -1 - #ifdef FAN_KICKSTART_TIME - static unsigned long fan_kick_end; - if (tail_fan_speed) { - if (fan_kick_end == 0) { - // Just starting up fan - run at full power. - fan_kick_end = millis() + FAN_KICKSTART_TIME; - tail_fan_speed = 255; - } else if (fan_kick_end > millis()) - // Fan still spinning up. - tail_fan_speed = 255; - } else { - fan_kick_end = 0; - } - #endif//FAN_KICKSTART_TIME - #ifdef FAN_SOFT_PWM - fanSpeedSoftPwm = tail_fan_speed; - #else - analogWrite(FAN_PIN,tail_fan_speed); - #endif//!FAN_SOFT_PWM -#endif//FAN_PIN > -1 -#ifdef AUTOTEMP - getHighESpeed(); -#endif -} - -bool waiting_inside_plan_buffer_line_print_aborted = false; -/* -void planner_abort_soft() -{ - // Empty the queue. - while (blocks_queued()) plan_discard_current_block(); - // Relay to planner wait routine, that the current line shall be canceled. - waiting_inside_plan_buffer_line_print_aborted = true; - //current_position[i] -} -*/ - -#ifdef PLANNER_DIAGNOSTICS -static inline void planner_update_queue_min_counter() -{ - uint8_t new_counter = moves_planned(); - if (new_counter < g_cntr_planner_queue_min) - g_cntr_planner_queue_min = new_counter; -} -#endif /* PLANNER_DIAGNOSTICS */ - -void planner_abort_hard() -{ - // Abort the stepper routine and flush the planner queue. - quickStop(); - - // Now the front-end (the Marlin_main.cpp with its current_position) is out of sync. - // First update the planner's current position in the physical motor steps. - position[X_AXIS] = st_get_position(X_AXIS); - position[Y_AXIS] = st_get_position(Y_AXIS); - position[Z_AXIS] = st_get_position(Z_AXIS); - position[E_AXIS] = st_get_position(E_AXIS); - - // Second update the current position of the front end. - 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); - current_position[E_AXIS] = st_get_position_mm(E_AXIS); - // Apply the mesh bed leveling correction to the Z axis. -#ifdef MESH_BED_LEVELING - if (mbl.active) - current_position[Z_AXIS] -= mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS]); -#endif - // Apply inverse world correction matrix. - machine2world(current_position[X_AXIS], current_position[Y_AXIS]); - memcpy(destination, current_position, sizeof(destination)); - - // Resets planner junction speeds. Assumes start from rest. - previous_nominal_speed = 0.0; - previous_speed[0] = 0.0; - previous_speed[1] = 0.0; - previous_speed[2] = 0.0; - previous_speed[3] = 0.0; - - // Relay to planner wait routine, that the current line shall be canceled. - waiting_inside_plan_buffer_line_print_aborted = true; -} - -float junction_deviation = 0.1; -// Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in -// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration -// calculation the caller must also provide the physical length of the line in millimeters. -void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder) -{ - // Calculate the buffer head after we push this byte - int next_buffer_head = next_block_index(block_buffer_head); - - // If the buffer is full: good! That means we are well ahead of the robot. - // Rest here until there is room in the buffer. - if (block_buffer_tail == next_buffer_head) { - waiting_inside_plan_buffer_line_print_aborted = false; - do { - manage_heater(); - // Vojtech: Don't disable motors inside the planner! - manage_inactivity(false); - lcd_update(); - } while (block_buffer_tail == next_buffer_head); - if (waiting_inside_plan_buffer_line_print_aborted) { - // Inside the lcd_update() routine the print has been aborted. - // Cancel the print, do not plan the current line this routine is waiting on. -#ifdef PLANNER_DIAGNOSTICS - planner_update_queue_min_counter(); -#endif /* PLANNER_DIAGNOSTICS */ - return; - } - } -#ifdef PLANNER_DIAGNOSTICS - planner_update_queue_min_counter(); -#endif /* PLANNER_DIAGNOSTICS */ - -#ifdef ENABLE_AUTO_BED_LEVELING - apply_rotation_xyz(plan_bed_level_matrix, x, y, z); -#endif // ENABLE_AUTO_BED_LEVELING - - // Apply the machine correction matrix. - { - #if 0 - SERIAL_ECHOPGM("Planner, current position - servos: "); - MYSERIAL.print(st_get_position_mm(X_AXIS), 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(st_get_position_mm(Y_AXIS), 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(st_get_position_mm(Z_AXIS), 5); - SERIAL_ECHOLNPGM(""); - - SERIAL_ECHOPGM("Planner, target position, initial: "); - MYSERIAL.print(x, 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(y, 5); - SERIAL_ECHOLNPGM(""); - - SERIAL_ECHOPGM("Planner, world2machine: "); - MYSERIAL.print(world2machine_rotation_and_skew[0][0], 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(world2machine_rotation_and_skew[0][1], 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(world2machine_rotation_and_skew[1][0], 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(world2machine_rotation_and_skew[1][1], 5); - SERIAL_ECHOLNPGM(""); - SERIAL_ECHOPGM("Planner, offset: "); - MYSERIAL.print(world2machine_shift[0], 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(world2machine_shift[1], 5); - SERIAL_ECHOLNPGM(""); - #endif - - world2machine(x, y); - - #if 0 - SERIAL_ECHOPGM("Planner, target position, corrected: "); - MYSERIAL.print(x, 5); - SERIAL_ECHOPGM(", "); - MYSERIAL.print(y, 5); - SERIAL_ECHOLNPGM(""); - #endif - } - - // The target position of the tool in absolute steps - // Calculate target position in absolute steps - //this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow - long target[4]; - target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]); - target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]); -#ifdef MESH_BED_LEVELING - if (mbl.active){ - target[Z_AXIS] = lround((z+mbl.get_z(x, y))*axis_steps_per_unit[Z_AXIS]); - }else{ - target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); - } -#else - target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); -#endif // ENABLE_MESH_BED_LEVELING - target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); - - #ifdef LIN_ADVANCE - const float mm_D_float = sqrt(sq(x - position_float[X_AXIS]) + sq(y - position_float[Y_AXIS])); - float de_float = e - position_float[E_AXIS]; - #endif - - #ifdef PREVENT_DANGEROUS_EXTRUDE - if(target[E_AXIS]!=position[E_AXIS]) - { - if(degHotend(active_extruder)axis_steps_per_unit[E_AXIS]*EXTRUDE_MAXLENGTH) - { - position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part - #ifdef LIN_ADVANCE - position_float[E_AXIS] = e; - de_float = 0; - #endif - SERIAL_ECHO_START; - SERIAL_ECHOLNRPGM(MSG_ERR_LONG_EXTRUDE_STOP); - } - #endif - } - #endif - - // Prepare to set up new block - block_t *block = &block_buffer[block_buffer_head]; - - // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) - block->busy = false; - - // Number of steps for each axis -#ifndef COREXY -// default non-h-bot planning -block->steps_x = labs(target[X_AXIS]-position[X_AXIS]); -block->steps_y = labs(target[Y_AXIS]-position[Y_AXIS]); -#else -// corexy planning -// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html -block->steps_x = labs((target[X_AXIS]-position[X_AXIS]) + (target[Y_AXIS]-position[Y_AXIS])); -block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS])); -#endif - block->steps_z = labs(target[Z_AXIS]-position[Z_AXIS]); - block->steps_e = labs(target[E_AXIS]-position[E_AXIS]); - if (volumetric_multiplier[active_extruder] != 1.f) - block->steps_e *= volumetric_multiplier[active_extruder]; - if (extrudemultiply != 100) { - block->steps_e *= extrudemultiply; - block->steps_e /= 100; - } - block->step_event_count = max(block->steps_x, max(block->steps_y, max(block->steps_z, block->steps_e))); - - // Bail if this is a zero-length block - if (block->step_event_count <= dropsegments) - { -#ifdef PLANNER_DIAGNOSTICS - planner_update_queue_min_counter(); -#endif /* PLANNER_DIAGNOSTICS */ - return; - } - - block->fan_speed = fanSpeed; - - // Compute direction bits for this block - block->direction_bits = 0; -#ifndef COREXY - if (target[X_AXIS] < position[X_AXIS]) - { - block->direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<active_extruder = extruder; - - //enable active axes - #ifdef COREXY - if((block->steps_x != 0) || (block->steps_y != 0)) - { - enable_x(); - enable_y(); - } - #else - if(block->steps_x != 0) enable_x(); - if(block->steps_y != 0) enable_y(); - #endif -#ifndef Z_LATE_ENABLE - if(block->steps_z != 0) enable_z(); -#endif - - // Enable extruder(s) - if(block->steps_e != 0) - { - if (DISABLE_INACTIVE_EXTRUDER) //enable only selected extruder - { - - if(g_uc_extruder_last_move[0] > 0) g_uc_extruder_last_move[0]--; - if(g_uc_extruder_last_move[1] > 0) g_uc_extruder_last_move[1]--; - if(g_uc_extruder_last_move[2] > 0) g_uc_extruder_last_move[2]--; - - switch(extruder) - { - case 0: - enable_e0(); - g_uc_extruder_last_move[0] = BLOCK_BUFFER_SIZE*2; - - if(g_uc_extruder_last_move[1] == 0) disable_e1(); - if(g_uc_extruder_last_move[2] == 0) disable_e2(); - break; - case 1: - enable_e1(); - g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE*2; - - if(g_uc_extruder_last_move[0] == 0) disable_e0(); - if(g_uc_extruder_last_move[2] == 0) disable_e2(); - break; - case 2: - enable_e2(); - g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE*2; - - if(g_uc_extruder_last_move[0] == 0) disable_e0(); - if(g_uc_extruder_last_move[1] == 0) disable_e1(); - break; - } - } - else //enable all - { - enable_e0(); - enable_e1(); - enable_e2(); - } - } - - if (block->steps_e == 0) - { - if(feed_ratesteps_x <=dropsegments && block->steps_y <=dropsegments && block->steps_z <=dropsegments ) - { - block->millimeters = fabs(delta_mm[E_AXIS]); - } - else - { - #ifndef COREXY - block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS])); - #else - block->millimeters = sqrt(square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS])); - #endif - } - float inverse_millimeters = 1.0/block->millimeters; // Inverse millimeters to remove multiple divides - - // Calculate speed in mm/second for each axis. No divide by zero due to previous checks. - float inverse_second = feed_rate * inverse_millimeters; - - int moves_queued = moves_planned(); - - // slow down when de buffer starts to empty, rather than wait at the corner for a buffer refill -#ifdef SLOWDOWN - //FIXME Vojtech: Why moves_queued > 1? Why not >=1? - // Can we somehow differentiate the filling of the buffer at the start of a g-code from a buffer draining situation? - if (moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE >> 1)) { - // segment time in micro seconds - unsigned long segment_time = lround(1000000.0/inverse_second); - if (segment_time < minsegmenttime) - // buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more. - inverse_second=1000000.0/(segment_time+lround(2*(minsegmenttime-segment_time)/moves_queued)); - } -#endif // SLOWDOWN - - block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0 - block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0 - -#ifdef FILAMENT_SENSOR - //FMM update ring buffer used for delay with filament measurements - - - if((extruder==FILAMENT_SENSOR_EXTRUDER_NUM) && (delay_index2 > -1)) //only for extruder with filament sensor and if ring buffer is initialized - { - delay_dist = delay_dist + delta_mm[E_AXIS]; //increment counter with next move in e axis - - while (delay_dist >= (10*(MAX_MEASUREMENT_DELAY+1))) //check if counter is over max buffer size in mm - delay_dist = delay_dist - 10*(MAX_MEASUREMENT_DELAY+1); //loop around the buffer - while (delay_dist<0) - delay_dist = delay_dist + 10*(MAX_MEASUREMENT_DELAY+1); //loop around the buffer - - delay_index1=delay_dist/10.0; //calculate index - - //ensure the number is within range of the array after converting from floating point - if(delay_index1<0) - delay_index1=0; - else if (delay_index1>MAX_MEASUREMENT_DELAY) - delay_index1=MAX_MEASUREMENT_DELAY; - - if(delay_index1 != delay_index2) //moved index - { - meas_sample=widthFil_to_size_ratio()-100; //subtract off 100 to reduce magnitude - to store in a signed char - } - while( delay_index1 != delay_index2) - { - delay_index2 = delay_index2 + 1; - if(delay_index2>MAX_MEASUREMENT_DELAY) - delay_index2=delay_index2-(MAX_MEASUREMENT_DELAY+1); //loop around buffer when incrementing - if(delay_index2<0) - delay_index2=0; - else if (delay_index2>MAX_MEASUREMENT_DELAY) - delay_index2=MAX_MEASUREMENT_DELAY; - - measurement_delay[delay_index2]=meas_sample; - } - - - } -#endif - - - // Calculate and limit speed in mm/sec for each axis - float current_speed[4]; - float speed_factor = 1.0; //factor <=1 do decrease speed - for(int i=0; i < 4; i++) - { - current_speed[i] = delta_mm[i] * inverse_second; - if(fabs(current_speed[i]) > max_feedrate[i]) - speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); - } - - // Correct the speed - if( speed_factor < 1.0) - { - for(unsigned char i=0; i < 4; i++) - { - current_speed[i] *= speed_factor; - } - block->nominal_speed *= speed_factor; - block->nominal_rate *= speed_factor; - } - - // Compute and limit the acceleration rate for the trapezoid generator. - // block->step_event_count ... event count of the fastest axis - // block->millimeters ... Euclidian length of the XYZ movement or the E length, if no XYZ movement. - float steps_per_mm = block->step_event_count/block->millimeters; - if(block->steps_x == 0 && block->steps_y == 0 && block->steps_z == 0) - { - block->acceleration_st = ceil(retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 - } - else - { - block->acceleration_st = ceil(acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 - // Limit acceleration per axis - //FIXME Vojtech: One shall rather limit a projection of the acceleration vector instead of using the limit. - if(((float)block->acceleration_st * (float)block->steps_x / (float)block->step_event_count) > axis_steps_per_sqr_second[X_AXIS]) - block->acceleration_st = axis_steps_per_sqr_second[X_AXIS]; - if(((float)block->acceleration_st * (float)block->steps_y / (float)block->step_event_count) > axis_steps_per_sqr_second[Y_AXIS]) - block->acceleration_st = axis_steps_per_sqr_second[Y_AXIS]; - if(((float)block->acceleration_st * (float)block->steps_e / (float)block->step_event_count) > axis_steps_per_sqr_second[E_AXIS]) - block->acceleration_st = axis_steps_per_sqr_second[E_AXIS]; - if(((float)block->acceleration_st * (float)block->steps_z / (float)block->step_event_count ) > axis_steps_per_sqr_second[Z_AXIS]) - block->acceleration_st = axis_steps_per_sqr_second[Z_AXIS]; - } - // Acceleration of the segment, in mm/sec^2 - block->acceleration = block->acceleration_st / steps_per_mm; - -#if 1 - // Oversample diagonal movements by a power of 2 up to 8x - // to achieve more accurate diagonal movements. - uint8_t bresenham_oversample = 1; - for (uint8_t i = 0; i < 3; ++ i) { - if (block->nominal_rate >= 5000) // 5kHz - break; - block->nominal_rate << 1; - bresenham_oversample << 1; - block->step_event_count << 1; - } - if (bresenham_oversample > 1) - // Lower the acceleration steps/sec^2 to account for the oversampling. - block->acceleration_st = (block->acceleration_st + (bresenham_oversample >> 1)) / bresenham_oversample; -#endif - - block->acceleration_rate = (long)((float)block->acceleration_st * (16777216.0 / (F_CPU / 8.0))); - - // Start with a safe speed. - // Safe speed is the speed, from which the machine may halt to stop immediately. - float safe_speed = block->nominal_speed; - bool limited = false; - for (uint8_t axis = 0; axis < 4; ++ axis) { - float jerk = fabs(current_speed[axis]); - if (jerk > max_jerk[axis]) { - // The actual jerk is lower, if it has been limited by the XY jerk. - if (limited) { - // Spare one division by a following gymnastics: - // Instead of jerk *= safe_speed / block->nominal_speed, - // multiply max_jerk[axis] by the divisor. - jerk *= safe_speed; - float mjerk = max_jerk[axis] * block->nominal_speed; - if (jerk > mjerk) { - safe_speed *= mjerk / jerk; - limited = true; - } - } else { - safe_speed = max_jerk[axis]; - limited = true; - } - } - } - - // Reset the block flag. - block->flag = 0; - - // Initial limit on the segment entry velocity. - float vmax_junction; - - //FIXME Vojtech: Why only if at least two lines are planned in the queue? - // Is it because we don't want to tinker with the first buffer line, which - // is likely to be executed by the stepper interrupt routine soon? - if (moves_queued > 1 && previous_nominal_speed > 0.0001f) { - // Estimate a maximum velocity allowed at a joint of two successive segments. - // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, - // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. - - // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. - bool prev_speed_larger = previous_nominal_speed > block->nominal_speed; - float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed); - // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. - vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed; - // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. - float v_factor = 1.f; - limited = false; - // Now limit the jerk in all axes. - for (uint8_t axis = 0; axis < 4; ++ axis) { - // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. - float v_exit = previous_speed[axis]; - float v_entry = current_speed [axis]; - if (prev_speed_larger) - v_exit *= smaller_speed_factor; - if (limited) { - v_exit *= v_factor; - v_entry *= v_factor; - } - // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. - float jerk = - (v_exit > v_entry) ? - ((v_entry > 0.f || v_exit < 0.f) ? - // coasting - (v_exit - v_entry) : - // axis reversal - max(v_exit, - v_entry)) : - // v_exit <= v_entry - ((v_entry < 0.f || v_exit > 0.f) ? - // coasting - (v_entry - v_exit) : - // axis reversal - max(- v_exit, v_entry)); - if (jerk > max_jerk[axis]) { - v_factor *= max_jerk[axis] / jerk; - limited = true; - } - } - if (limited) - vmax_junction *= v_factor; - // Now the transition velocity is known, which maximizes the shared exit / entry velocity while - // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. - float vmax_junction_threshold = vmax_junction * 0.99f; - if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) { - // Not coasting. The machine will stop and start the movements anyway, - // better to start the segment from start. - block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; - vmax_junction = safe_speed; - } - } else { - block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; - vmax_junction = safe_speed; - } - - // Max entry speed of this block equals the max exit speed of the previous block. - block->max_entry_speed = vmax_junction; - - // Initialize block entry speed. Compute based on deceleration to safe_speed. - double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters); - block->entry_speed = min(vmax_junction, v_allowable); - - // Initialize planner efficiency flags - // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. - // If a block can de/ac-celerate from nominal speed to zero within the length of the block, then - // the current block and next block junction speeds are guaranteed to always be at their maximum - // junction speeds in deceleration and acceleration, respectively. This is due to how the current - // block nominal speed limits both the current and next maximum junction speeds. Hence, in both - // the reverse and forward planners, the corresponding block junction speed will always be at the - // the maximum junction speed and may always be ignored for any speed reduction checks. - // Always calculate trapezoid for new block - block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE; - - // Update previous path unit_vector and nominal speed - memcpy(previous_speed, current_speed, sizeof(previous_speed)); // previous_speed[] = current_speed[] - previous_nominal_speed = block->nominal_speed; - previous_safe_speed = safe_speed; - - #ifdef LIN_ADVANCE - - // - // Use LIN_ADVANCE for blocks if all these are true: - // - // esteps : We have E steps todo (a printing move) - // - // block->steps[X_AXIS] || block->steps[Y_AXIS] : We have a movement in XY direction (i.e., not retract / prime). - // - // extruder_advance_k : There is an advance factor set. - // - // block->steps[E_AXIS] != block->step_event_count : A problem occurs if the move before a retract is too small. - // In that case, the retract and move will be executed together. - // This leads to too many advance steps due to a huge e_acceleration. - // The math is good, but we must avoid retract moves with advance! - // de_float > 0.0 : Extruder is running forward (e.g., for "Wipe while retracting" (Slic3r) or "Combing" (Cura) moves) - // - block->use_advance_lead = block->steps_e - && (block->steps_x || block->steps_y) - && extruder_advance_k - && (uint32_t)block->steps_e != block->step_event_count - && de_float > 0.0; - if (block->use_advance_lead) - block->abs_adv_steps_multiplier8 = lround( - extruder_advance_k - * ((advance_ed_ratio < 0.000001) ? de_float / mm_D_float : advance_ed_ratio) // Use the fixed ratio, if set - * (block->nominal_speed / (float)block->nominal_rate) - * axis_steps_per_unit[E_AXIS] * 256.0 - ); - #endif - - // Precalculate the division, so when all the trapezoids in the planner queue get recalculated, the division is not repeated. - block->speed_factor = block->nominal_rate / block->nominal_speed; - calculate_trapezoid_for_block(block, block->entry_speed, safe_speed); - - // Move the buffer head. From now the block may be picked up by the stepper interrupt controller. - block_buffer_head = next_buffer_head; - - // Update position - memcpy(position, target, sizeof(target)); // position[] = target[] - #ifdef LIN_ADVANCE - position_float[X_AXIS] = x; - position_float[Y_AXIS] = y; - position_float[Z_AXIS] = z; - position_float[E_AXIS] = e; - #endif - - // Recalculate the trapezoids to maximize speed at the segment transitions while respecting - // the machine limits (maximum acceleration and maximum jerk). - // This runs asynchronously with the stepper interrupt controller, which may - // interfere with the process. - planner_recalculate(safe_speed); - -// SERIAL_ECHOPGM("Q"); -// SERIAL_ECHO(int(moves_planned())); -// SERIAL_ECHOLNPGM(""); - -#ifdef PLANNER_DIAGNOSTICS - planner_update_queue_min_counter(); -#endif /* PLANNER_DIAGNOSTIC */ - st_wake_up(); -} - -#ifdef ENABLE_AUTO_BED_LEVELING -vector_3 plan_get_position() { - vector_3 position = vector_3(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS), st_get_position_mm(Z_AXIS)); - - //position.debug("in plan_get position"); - //plan_bed_level_matrix.debug("in plan_get bed_level"); - matrix_3x3 inverse = matrix_3x3::transpose(plan_bed_level_matrix); - //inverse.debug("in plan_get inverse"); - position.apply_rotation(inverse); - //position.debug("after rotation"); - - return position; -} -#endif // ENABLE_AUTO_BED_LEVELING - -void plan_set_position(float x, float y, float z, const float &e) -{ -#ifdef ENABLE_AUTO_BED_LEVELING - apply_rotation_xyz(plan_bed_level_matrix, x, y, z); -#endif // ENABLE_AUTO_BED_LEVELING - - // Apply the machine correction matrix. - { - float tmpx = x; - float tmpy = y; - x = world2machine_rotation_and_skew[0][0] * tmpx + world2machine_rotation_and_skew[0][1] * tmpy + world2machine_shift[0]; - y = world2machine_rotation_and_skew[1][0] * tmpx + world2machine_rotation_and_skew[1][1] * tmpy + world2machine_shift[1]; - } - - position[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]); - position[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]); -#ifdef MESH_BED_LEVELING - if (mbl.active){ - position[Z_AXIS] = lround((z+mbl.get_z(x, y))*axis_steps_per_unit[Z_AXIS]); - }else{ - position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); - } -#else - position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); -#endif // ENABLE_MESH_BED_LEVELING - position[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); - #ifdef LIN_ADVANCE - position_float[X_AXIS] = x; - position_float[Y_AXIS] = y; - position_float[Z_AXIS] = z; - position_float[E_AXIS] = e; - #endif - st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]); - previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. - previous_speed[0] = 0.0; - previous_speed[1] = 0.0; - previous_speed[2] = 0.0; - previous_speed[3] = 0.0; -} - -// Only useful in the bed leveling routine, when the mesh bed leveling is off. -void plan_set_z_position(const float &z) -{ - position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); - st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]); -} - -void plan_set_e_position(const float &e) -{ - position[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); - st_set_e_position(position[E_AXIS]); -} - -#ifdef PREVENT_DANGEROUS_EXTRUDE -void set_extrude_min_temp(float temp) -{ - extrude_min_temp=temp; -} -#endif - -// Calculate the steps/s^2 acceleration rates, based on the mm/s^s -void reset_acceleration_rates() -{ - for(int8_t i=0; i < NUM_AXIS; i++) - { - axis_steps_per_sqr_second[i] = max_acceleration_units_per_sq_second[i] * axis_steps_per_unit[i]; - } -} - -#ifdef PLANNER_DIAGNOSTICS -uint8_t planner_queue_min() -{ - return g_cntr_planner_queue_min; -} - -void planner_queue_min_reset() -{ - g_cntr_planner_queue_min = moves_planned(); -} -#endif /* PLANNER_DIAGNOSTICS */ +/* + planner.c - buffers movement commands and manages the acceleration profile plan + Part of Grbl + + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . + */ + +/* The ring buffer implementation gleaned from the wiring_serial library by David A. Mellis. */ + +/* + Reasoning behind the mathematics in this module (in the key of 'Mathematica'): + + s == speed, a == acceleration, t == time, d == distance + + Basic definitions: + + Speed[s_, a_, t_] := s + (a*t) + Travel[s_, a_, t_] := Integrate[Speed[s, a, t], t] + + Distance to reach a specific speed with a constant acceleration: + + Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, d, t] + d -> (m^2 - s^2)/(2 a) --> estimate_acceleration_distance() + + Speed after a given distance of travel with constant acceleration: + + Solve[{Speed[s, a, t] == m, Travel[s, a, t] == d}, m, t] + m -> Sqrt[2 a d + s^2] + + DestinationSpeed[s_, a_, d_] := Sqrt[2 a d + s^2] + + When to start braking (di) to reach a specified destionation speed (s2) after accelerating + from initial speed s1 without ever stopping at a plateau: + + Solve[{DestinationSpeed[s1, a, di] == DestinationSpeed[s2, a, d - di]}, di] + di -> (2 a d - s1^2 + s2^2)/(4 a) --> intersection_distance() + + IntersectionDistance[s1_, s2_, a_, d_] := (2 a d - s1^2 + s2^2)/(4 a) + */ + +#include "Marlin.h" +#include "planner.h" +#include "stepper.h" +#include "temperature.h" +#include "ultralcd.h" +#include "language.h" + +#ifdef MESH_BED_LEVELING +#include "mesh_bed_leveling.h" +#include "mesh_bed_calibration.h" +#endif + +//=========================================================================== +//=============================public variables ============================ +//=========================================================================== + +unsigned long minsegmenttime; +float max_feedrate[NUM_AXIS]; // set the max speeds +float axis_steps_per_unit[NUM_AXIS]; +unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software +float minimumfeedrate; +float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX +float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX +// Jerk is a maximum immediate velocity change. +float max_jerk[NUM_AXIS]; +float mintravelfeedrate; +unsigned long axis_steps_per_sqr_second[NUM_AXIS]; + +#ifdef ENABLE_AUTO_BED_LEVELING +// this holds the required transform to compensate for bed level +matrix_3x3 plan_bed_level_matrix = { + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0, +}; +#endif // #ifdef ENABLE_AUTO_BED_LEVELING + +// The current position of the tool in absolute steps +long position[NUM_AXIS]; //rescaled from extern when axis_steps_per_unit are changed by gcode +static float previous_speed[NUM_AXIS]; // Speed of previous path line segment +static float previous_nominal_speed; // Nominal speed of previous path line segment +static float previous_safe_speed; // Exit speed limited by a jerk to full halt of a previous last segment. + +#ifdef AUTOTEMP +float autotemp_max=250; +float autotemp_min=210; +float autotemp_factor=0.1; +bool autotemp_enabled=false; +#endif + +unsigned char g_uc_extruder_last_move[3] = {0,0,0}; + +//=========================================================================== +//=================semi-private variables, used in inline functions ===== +//=========================================================================== +block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions +volatile unsigned char block_buffer_head; // Index of the next block to be pushed +volatile unsigned char block_buffer_tail; // Index of the block to process now + +#ifdef PLANNER_DIAGNOSTICS +// Diagnostic function: Minimum number of planned moves since the last +static uint8_t g_cntr_planner_queue_min = 0; +#endif /* PLANNER_DIAGNOSTICS */ + +//=========================================================================== +//=============================private variables ============================ +//=========================================================================== +#ifdef PREVENT_DANGEROUS_EXTRUDE +float extrude_min_temp=EXTRUDE_MINTEMP; +#endif + +#ifdef FILAMENT_SENSOR + static char meas_sample; //temporary variable to hold filament measurement sample +#endif + +// Returns the index of the next block in the ring buffer +// NOTE: Removed modulo (%) operator, which uses an expensive divide and multiplication. +static inline int8_t next_block_index(int8_t block_index) { + if (++ block_index == BLOCK_BUFFER_SIZE) + block_index = 0; + return block_index; +} + + +// Returns the index of the previous block in the ring buffer +static inline int8_t prev_block_index(int8_t block_index) { + if (block_index == 0) + block_index = BLOCK_BUFFER_SIZE; + -- block_index; + return block_index; +} + +//=========================================================================== +//=============================functions ============================ +//=========================================================================== + +// Calculates the distance (not time) it takes to accelerate from initial_rate to target_rate using the +// given acceleration: +FORCE_INLINE float estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) +{ + if (acceleration!=0) { + return((target_rate*target_rate-initial_rate*initial_rate)/ + (2.0*acceleration)); + } + else { + return 0.0; // acceleration was 0, set acceleration distance to 0 + } +} + +// This function gives you the point at which you must start braking (at the rate of -acceleration) if +// you started at speed initial_rate and accelerated until this point and want to end at the final_rate after +// a total travel of distance. This can be used to compute the intersection point between acceleration and +// deceleration in the cases where the trapezoid has no plateau (i.e. never reaches maximum speed) + +FORCE_INLINE float intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) +{ + if (acceleration!=0) { + return((2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/ + (4.0*acceleration) ); + } + else { + return 0.0; // acceleration was 0, set intersection distance to 0 + } +} + +#define MINIMAL_STEP_RATE 120 + +// Calculates trapezoid parameters so that the entry- and exit-speed is compensated by the provided factors. +void calculate_trapezoid_for_block(block_t *block, float entry_speed, float exit_speed) +{ + // These two lines are the only floating point calculations performed in this routine. + uint32_t initial_rate = ceil(entry_speed * block->speed_factor); // (step/min) + uint32_t final_rate = ceil(exit_speed * block->speed_factor); // (step/min) + + // Limit minimal step rate (Otherwise the timer will overflow.) + if (initial_rate < MINIMAL_STEP_RATE) + initial_rate = MINIMAL_STEP_RATE; + if (initial_rate > block->nominal_rate) + initial_rate = block->nominal_rate; + if (final_rate < MINIMAL_STEP_RATE) + final_rate = MINIMAL_STEP_RATE; + if (final_rate > block->nominal_rate) + final_rate = block->nominal_rate; + + uint32_t acceleration = block->acceleration_st; + if (acceleration == 0) + // Don't allow zero acceleration. + acceleration = 1; + // estimate_acceleration_distance(float initial_rate, float target_rate, float acceleration) + // (target_rate*target_rate-initial_rate*initial_rate)/(2.0*acceleration)); + uint32_t initial_rate_sqr = initial_rate*initial_rate; + //FIXME assert that this result fits a 64bit unsigned int. + uint32_t nominal_rate_sqr = block->nominal_rate*block->nominal_rate; + uint32_t final_rate_sqr = final_rate*final_rate; + uint32_t acceleration_x2 = acceleration << 1; + // ceil(estimate_acceleration_distance(initial_rate, block->nominal_rate, acceleration)); + uint32_t accelerate_steps = (nominal_rate_sqr - initial_rate_sqr + acceleration_x2 - 1) / acceleration_x2; + // floor(estimate_acceleration_distance(block->nominal_rate, final_rate, -acceleration)); + uint32_t decelerate_steps = (nominal_rate_sqr - final_rate_sqr) / acceleration_x2; + uint32_t accel_decel_steps = accelerate_steps + decelerate_steps; + // Size of Plateau of Nominal Rate. + uint32_t plateau_steps = 0; + + // Is the Plateau of Nominal Rate smaller than nothing? That means no cruising, and we will + // have to use intersection_distance() to calculate when to abort acceleration and start braking + // in order to reach the final_rate exactly at the end of this block. + if (accel_decel_steps < block->step_event_count) { + plateau_steps = block->step_event_count - accel_decel_steps; + } else { + uint32_t acceleration_x4 = acceleration << 2; + // Avoid negative numbers + if (final_rate_sqr >= initial_rate_sqr) { + // accelerate_steps = ceil(intersection_distance(initial_rate, final_rate, acceleration, block->step_event_count)); + // intersection_distance(float initial_rate, float final_rate, float acceleration, float distance) + // (2.0*acceleration*distance-initial_rate*initial_rate+final_rate*final_rate)/(4.0*acceleration); +#if 0 + accelerate_steps = (block->step_event_count >> 1) + (final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1 + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; +#else + accelerate_steps = final_rate_sqr - initial_rate_sqr + acceleration_x4 - 1; + if (block->step_event_count & 1) + accelerate_steps += acceleration_x2; + accelerate_steps /= acceleration_x4; + accelerate_steps += (block->step_event_count >> 1); +#endif + if (accelerate_steps > block->step_event_count) + accelerate_steps = block->step_event_count; + } else { +#if 0 + decelerate_steps = (block->step_event_count >> 1) + (initial_rate_sqr - final_rate_sqr + (block->step_event_count & 1) * acceleration_x2) / acceleration_x4; +#else + decelerate_steps = initial_rate_sqr - final_rate_sqr; + if (block->step_event_count & 1) + decelerate_steps += acceleration_x2; + decelerate_steps /= acceleration_x4; + decelerate_steps += (block->step_event_count >> 1); +#endif + if (decelerate_steps > block->step_event_count) + decelerate_steps = block->step_event_count; + accelerate_steps = block->step_event_count - decelerate_steps; + } + } + + CRITICAL_SECTION_START; // Fill variables used by the stepper in a critical section + if (! block->busy) { // Don't update variables if block is busy. + block->accelerate_until = accelerate_steps; + block->decelerate_after = accelerate_steps+plateau_steps; + block->initial_rate = initial_rate; + block->final_rate = final_rate; + } + CRITICAL_SECTION_END; +} + +// Calculates the maximum allowable entry speed, when you must be able to reach target_velocity using the +// decceleration within the allotted distance. +FORCE_INLINE float max_allowable_entry_speed(float decceleration, float target_velocity, float distance) +{ + // assert(decceleration < 0); + return sqrt(target_velocity*target_velocity-2*decceleration*distance); +} + +// Recalculates the motion plan according to the following algorithm: +// +// 1. Go over every block in reverse order and calculate a junction speed reduction (i.e. block_t.entry_factor) +// so that: +// a. The junction jerk is within the set limit +// b. No speed reduction within one block requires faster deceleration than the one, true constant +// acceleration. +// 2. Go over every block in chronological order and dial down junction speed reduction values if +// a. The speed increase within one block would require faster accelleration than the one, true +// constant acceleration. +// +// When these stages are complete all blocks have an entry_factor that will allow all speed changes to +// be performed using only the one, true constant acceleration, and where no junction jerk is jerkier than +// the set limit. Finally it will: +// +// 3. Recalculate trapezoids for all blocks. +// +//FIXME This routine is called 15x every time a new line is added to the planner, +// therefore it is a bottle neck and it shall be rewritten into a Fixed Point arithmetics, +// if the CPU is found lacking computational power. +// +// Following sources may be used to optimize the 8-bit AVR code: +// http://www.mikrocontroller.net/articles/AVR_Arithmetik +// http://darcy.rsgc.on.ca/ACES/ICE4M/FixedPoint/avrfix.pdf +// +// https://github.com/gcc-mirror/gcc/blob/master/libgcc/config/avr/lib1funcs-fixed.S +// https://gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html +// https://gcc.gnu.org/onlinedocs/gccint/Fixed-point-fractional-library-routines.html +// +// https://ucexperiment.wordpress.com/2015/04/04/arduino-s15-16-fixed-point-math-routines/ +// https://mekonik.wordpress.com/2009/03/18/arduino-avr-gcc-multiplication/ +// https://github.com/rekka/avrmultiplication +// +// https://people.ece.cornell.edu/land/courses/ece4760/Math/Floating_point/ +// https://courses.cit.cornell.edu/ee476/Math/ +// https://courses.cit.cornell.edu/ee476/Math/GCC644/fixedPt/multASM.S +// +void planner_recalculate(const float &safe_final_speed) +{ + // Reverse pass + // Make a local copy of block_buffer_tail, because the interrupt can alter it + // by consuming the blocks, therefore shortening the queue. + unsigned char tail = block_buffer_tail; + uint8_t block_index; + block_t *prev, *current, *next; + +// SERIAL_ECHOLNPGM("planner_recalculate - 1"); + + // At least three blocks are in the queue? + unsigned char n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); + if (n_blocks >= 3) { + // Initialize the last tripple of blocks. + block_index = prev_block_index(block_buffer_head); + next = block_buffer + block_index; + current = block_buffer + (block_index = prev_block_index(block_index)); + // No need to recalculate the last block, it has already been set by the plan_buffer_line() function. + // Vojtech thinks, that one shall not touch the entry speed of the very first block as well, because + // 1) it may already be running at the stepper interrupt, + // 2) there is no way to limit it when going in the forward direction. + while (block_index != tail) { + if (current->flag & BLOCK_FLAG_START_FROM_FULL_HALT) { + // Don't modify the entry velocity of the starting block. + // Also don't modify the trapezoids before this block, they are finalized already, prepared + // for the stepper interrupt routine to use them. + tail = block_index; + // Update the number of blocks to process. + n_blocks = (block_buffer_head + BLOCK_BUFFER_SIZE - tail) & (BLOCK_BUFFER_SIZE - 1); + // SERIAL_ECHOLNPGM("START"); + break; + } + // If entry speed is already at the maximum entry speed, no need to recheck. Block is cruising. + // If not, block in state of acceleration or deceleration. Reset entry speed to maximum and + // check for maximum allowable speed reductions to ensure maximum possible planned speed. + if (current->entry_speed != current->max_entry_speed) { + // assert(current->entry_speed < current->max_entry_speed); + // Entry speed could be increased up to the max_entry_speed, limited by the length of the current + // segment and the maximum acceleration allowed for this segment. + // If nominal length true, max junction speed is guaranteed to be reached even if decelerating to a jerk-from-zero velocity. + // Only compute for max allowable speed if block is decelerating and nominal length is false. + // entry_speed is uint16_t, 24 bits would be sufficient for block->acceleration and block->millimiteres, if scaled to um. + // therefore an optimized assembly 24bit x 24bit -> 32bit multiply would be more than sufficient + // together with an assembly 32bit->16bit sqrt function. + current->entry_speed = ((current->flag & BLOCK_FLAG_NOMINAL_LENGTH) || current->max_entry_speed <= next->entry_speed) ? + current->max_entry_speed : + // min(current->max_entry_speed, sqrt(next->entry_speed*next->entry_speed+2*current->acceleration*current->millimeters)); + min(current->max_entry_speed, max_allowable_entry_speed(-current->acceleration,next->entry_speed,current->millimeters)); + current->flag |= BLOCK_FLAG_RECALCULATE; + } + next = current; + current = block_buffer + (block_index = prev_block_index(block_index)); + } + } + +// SERIAL_ECHOLNPGM("planner_recalculate - 2"); + + // Forward pass and recalculate the trapezoids. + if (n_blocks >= 2) { + // Better to limit the velocities using the already processed block, if it is available, so rather use the saved tail. + block_index = tail; + prev = block_buffer + block_index; + current = block_buffer + (block_index = next_block_index(block_index)); + do { + // If the previous block is an acceleration block, but it is not long enough to complete the + // full speed change within the block, we need to adjust the entry speed accordingly. Entry + // speeds have already been reset, maximized, and reverse planned by reverse planner. + // If nominal length is true, max junction speed is guaranteed to be reached. No need to recheck. + if (! (prev->flag & BLOCK_FLAG_NOMINAL_LENGTH) && prev->entry_speed < current->entry_speed) { + float entry_speed = min(current->entry_speed, max_allowable_entry_speed(-prev->acceleration,prev->entry_speed,prev->millimeters)); + // Check for junction speed change + if (current->entry_speed != entry_speed) { + current->entry_speed = entry_speed; + current->flag |= BLOCK_FLAG_RECALCULATE; + } + } + // Recalculate if current block entry or exit junction speed has changed. + if ((prev->flag | current->flag) & BLOCK_FLAG_RECALCULATE) { + // NOTE: Entry and exit factors always > 0 by all previous logic operations. + calculate_trapezoid_for_block(prev, prev->entry_speed, current->entry_speed); + // Reset current only to ensure next trapezoid is computed. + prev->flag &= ~BLOCK_FLAG_RECALCULATE; + } + prev = current; + current = block_buffer + (block_index = next_block_index(block_index)); + } while (block_index != block_buffer_head); + } + +// SERIAL_ECHOLNPGM("planner_recalculate - 3"); + + // Last/newest block in buffer. Exit speed is set with safe_final_speed. Always recalculated. + current = block_buffer + prev_block_index(block_buffer_head); + calculate_trapezoid_for_block(current, current->entry_speed, safe_final_speed); + current->flag &= ~BLOCK_FLAG_RECALCULATE; + +// SERIAL_ECHOLNPGM("planner_recalculate - 4"); +} + +void plan_init() { + block_buffer_head = 0; + block_buffer_tail = 0; + memset(position, 0, sizeof(position)); // clear position + previous_speed[0] = 0.0; + previous_speed[1] = 0.0; + previous_speed[2] = 0.0; + previous_speed[3] = 0.0; + previous_nominal_speed = 0.0; +} + + + + +#ifdef AUTOTEMP +void getHighESpeed() +{ + static float oldt=0; + if(!autotemp_enabled){ + return; + } + if(degTargetHotend0()+2high) + { + high=se; + } + } + block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); + } + + float g=autotemp_min+high*autotemp_factor; + float t=g; + if(tautotemp_max) + t=autotemp_max; + if(oldt>t) + { + t=AUTOTEMP_OLDWEIGHT*oldt+(1-AUTOTEMP_OLDWEIGHT)*t; + } + oldt=t; + setTargetHotend0(t); +} +#endif + +void check_axes_activity() +{ + unsigned char x_active = 0; + unsigned char y_active = 0; + unsigned char z_active = 0; + unsigned char e_active = 0; + unsigned char tail_fan_speed = fanSpeed; + block_t *block; + + if(block_buffer_tail != block_buffer_head) + { + uint8_t block_index = block_buffer_tail; + tail_fan_speed = block_buffer[block_index].fan_speed; + while(block_index != block_buffer_head) + { + block = &block_buffer[block_index]; + if(block->steps_x != 0) x_active++; + if(block->steps_y != 0) y_active++; + if(block->steps_z != 0) z_active++; + if(block->steps_e != 0) e_active++; + block_index = (block_index+1) & (BLOCK_BUFFER_SIZE - 1); + } + } + if((DISABLE_X) && (x_active == 0)) disable_x(); + if((DISABLE_Y) && (y_active == 0)) disable_y(); + if((DISABLE_Z) && (z_active == 0)) disable_z(); + if((DISABLE_E) && (e_active == 0)) + { + disable_e0(); + disable_e1(); + disable_e2(); + } +#if defined(FAN_PIN) && FAN_PIN > -1 + #ifdef FAN_KICKSTART_TIME + static unsigned long fan_kick_end; + if (tail_fan_speed) { + if (fan_kick_end == 0) { + // Just starting up fan - run at full power. + fan_kick_end = millis() + FAN_KICKSTART_TIME; + tail_fan_speed = 255; + } else if (fan_kick_end > millis()) + // Fan still spinning up. + tail_fan_speed = 255; + } else { + fan_kick_end = 0; + } + #endif//FAN_KICKSTART_TIME + #ifdef FAN_SOFT_PWM + fanSpeedSoftPwm = tail_fan_speed; + #else + analogWrite(FAN_PIN,tail_fan_speed); + #endif//!FAN_SOFT_PWM +#endif//FAN_PIN > -1 +#ifdef AUTOTEMP + getHighESpeed(); +#endif +} + +bool waiting_inside_plan_buffer_line_print_aborted = false; +/* +void planner_abort_soft() +{ + // Empty the queue. + while (blocks_queued()) plan_discard_current_block(); + // Relay to planner wait routine, that the current line shall be canceled. + waiting_inside_plan_buffer_line_print_aborted = true; + //current_position[i] +} +*/ + +#ifdef PLANNER_DIAGNOSTICS +static inline void planner_update_queue_min_counter() +{ + uint8_t new_counter = moves_planned(); + if (new_counter < g_cntr_planner_queue_min) + g_cntr_planner_queue_min = new_counter; +} +#endif /* PLANNER_DIAGNOSTICS */ + +void planner_abort_hard() +{ + // Abort the stepper routine and flush the planner queue. + quickStop(); + + // Now the front-end (the Marlin_main.cpp with its current_position) is out of sync. + // First update the planner's current position in the physical motor steps. + position[X_AXIS] = st_get_position(X_AXIS); + position[Y_AXIS] = st_get_position(Y_AXIS); + position[Z_AXIS] = st_get_position(Z_AXIS); + position[E_AXIS] = st_get_position(E_AXIS); + + // Second update the current position of the front end. + 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); + current_position[E_AXIS] = st_get_position_mm(E_AXIS); + // Apply the mesh bed leveling correction to the Z axis. +#ifdef MESH_BED_LEVELING + if (mbl.active) + current_position[Z_AXIS] -= mbl.get_z(current_position[X_AXIS], current_position[Y_AXIS]); +#endif + // Apply inverse world correction matrix. + machine2world(current_position[X_AXIS], current_position[Y_AXIS]); + memcpy(destination, current_position, sizeof(destination)); + + // Resets planner junction speeds. Assumes start from rest. + previous_nominal_speed = 0.0; + previous_speed[0] = 0.0; + previous_speed[1] = 0.0; + previous_speed[2] = 0.0; + previous_speed[3] = 0.0; + + // Relay to planner wait routine, that the current line shall be canceled. + waiting_inside_plan_buffer_line_print_aborted = true; +} + +float junction_deviation = 0.1; +// Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in +// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration +// calculation the caller must also provide the physical length of the line in millimeters. +void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder) +{ + // Calculate the buffer head after we push this byte + int next_buffer_head = next_block_index(block_buffer_head); + + // If the buffer is full: good! That means we are well ahead of the robot. + // Rest here until there is room in the buffer. + if (block_buffer_tail == next_buffer_head) { + waiting_inside_plan_buffer_line_print_aborted = false; + do { + manage_heater(); + // Vojtech: Don't disable motors inside the planner! + manage_inactivity(false); + lcd_update(); + } while (block_buffer_tail == next_buffer_head); + if (waiting_inside_plan_buffer_line_print_aborted) { + // Inside the lcd_update() routine the print has been aborted. + // Cancel the print, do not plan the current line this routine is waiting on. +#ifdef PLANNER_DIAGNOSTICS + planner_update_queue_min_counter(); +#endif /* PLANNER_DIAGNOSTICS */ + return; + } + } +#ifdef PLANNER_DIAGNOSTICS + planner_update_queue_min_counter(); +#endif /* PLANNER_DIAGNOSTICS */ + +#ifdef ENABLE_AUTO_BED_LEVELING + apply_rotation_xyz(plan_bed_level_matrix, x, y, z); +#endif // ENABLE_AUTO_BED_LEVELING + + // Apply the machine correction matrix. + { + #if 0 + SERIAL_ECHOPGM("Planner, current position - servos: "); + MYSERIAL.print(st_get_position_mm(X_AXIS), 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(st_get_position_mm(Y_AXIS), 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(st_get_position_mm(Z_AXIS), 5); + SERIAL_ECHOLNPGM(""); + + SERIAL_ECHOPGM("Planner, target position, initial: "); + MYSERIAL.print(x, 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(y, 5); + SERIAL_ECHOLNPGM(""); + + SERIAL_ECHOPGM("Planner, world2machine: "); + MYSERIAL.print(world2machine_rotation_and_skew[0][0], 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(world2machine_rotation_and_skew[0][1], 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(world2machine_rotation_and_skew[1][0], 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(world2machine_rotation_and_skew[1][1], 5); + SERIAL_ECHOLNPGM(""); + SERIAL_ECHOPGM("Planner, offset: "); + MYSERIAL.print(world2machine_shift[0], 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(world2machine_shift[1], 5); + SERIAL_ECHOLNPGM(""); + #endif + + world2machine(x, y); + + #if 0 + SERIAL_ECHOPGM("Planner, target position, corrected: "); + MYSERIAL.print(x, 5); + SERIAL_ECHOPGM(", "); + MYSERIAL.print(y, 5); + SERIAL_ECHOLNPGM(""); + #endif + } + + // The target position of the tool in absolute steps + // Calculate target position in absolute steps + //this should be done after the wait, because otherwise a M92 code within the gcode disrupts this calculation somehow + long target[4]; + target[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]); + target[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]); +#ifdef MESH_BED_LEVELING + if (mbl.active){ + target[Z_AXIS] = lround((z+mbl.get_z(x, y))*axis_steps_per_unit[Z_AXIS]); + }else{ + target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); + } +#else + target[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); +#endif // ENABLE_MESH_BED_LEVELING + target[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); + #ifdef PREVENT_DANGEROUS_EXTRUDE + if(target[E_AXIS]!=position[E_AXIS]) + { + if(degHotend(active_extruder)axis_steps_per_unit[E_AXIS]*EXTRUDE_MAXLENGTH) + { + position[E_AXIS]=target[E_AXIS]; //behave as if the move really took place, but ignore E part + SERIAL_ECHO_START; + SERIAL_ECHOLNRPGM(MSG_ERR_LONG_EXTRUDE_STOP); + } + #endif + } + #endif + + // Prepare to set up new block + block_t *block = &block_buffer[block_buffer_head]; + + // Mark block as not busy (Not executed by the stepper interrupt, could be still tinkered with.) + block->busy = false; + + // Number of steps for each axis +#ifndef COREXY +// default non-h-bot planning +block->steps_x = labs(target[X_AXIS]-position[X_AXIS]); +block->steps_y = labs(target[Y_AXIS]-position[Y_AXIS]); +#else +// corexy planning +// these equations follow the form of the dA and dB equations on http://www.corexy.com/theory.html +block->steps_x = labs((target[X_AXIS]-position[X_AXIS]) + (target[Y_AXIS]-position[Y_AXIS])); +block->steps_y = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-position[Y_AXIS])); +#endif + block->steps_z = labs(target[Z_AXIS]-position[Z_AXIS]); + block->steps_e = labs(target[E_AXIS]-position[E_AXIS]); + if (volumetric_multiplier[active_extruder] != 1.f) + block->steps_e *= volumetric_multiplier[active_extruder]; + if (extrudemultiply != 100) { + block->steps_e *= extrudemultiply; + block->steps_e /= 100; + } + block->step_event_count = max(block->steps_x, max(block->steps_y, max(block->steps_z, block->steps_e))); + + // Bail if this is a zero-length block + if (block->step_event_count <= dropsegments) + { +#ifdef PLANNER_DIAGNOSTICS + planner_update_queue_min_counter(); +#endif /* PLANNER_DIAGNOSTICS */ + return; + } + + block->fan_speed = fanSpeed; + + // Compute direction bits for this block + block->direction_bits = 0; +#ifndef COREXY + if (target[X_AXIS] < position[X_AXIS]) + { + block->direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<direction_bits |= (1<active_extruder = extruder; + + //enable active axes + #ifdef COREXY + if((block->steps_x != 0) || (block->steps_y != 0)) + { + enable_x(); + enable_y(); + } + #else + if(block->steps_x != 0) enable_x(); + if(block->steps_y != 0) enable_y(); + #endif +#ifndef Z_LATE_ENABLE + if(block->steps_z != 0) enable_z(); +#endif + + // Enable extruder(s) + if(block->steps_e != 0) + { + if (DISABLE_INACTIVE_EXTRUDER) //enable only selected extruder + { + + if(g_uc_extruder_last_move[0] > 0) g_uc_extruder_last_move[0]--; + if(g_uc_extruder_last_move[1] > 0) g_uc_extruder_last_move[1]--; + if(g_uc_extruder_last_move[2] > 0) g_uc_extruder_last_move[2]--; + + switch(extruder) + { + case 0: + enable_e0(); + g_uc_extruder_last_move[0] = BLOCK_BUFFER_SIZE*2; + + if(g_uc_extruder_last_move[1] == 0) disable_e1(); + if(g_uc_extruder_last_move[2] == 0) disable_e2(); + break; + case 1: + enable_e1(); + g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE*2; + + if(g_uc_extruder_last_move[0] == 0) disable_e0(); + if(g_uc_extruder_last_move[2] == 0) disable_e2(); + break; + case 2: + enable_e2(); + g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE*2; + + if(g_uc_extruder_last_move[0] == 0) disable_e0(); + if(g_uc_extruder_last_move[1] == 0) disable_e1(); + break; + } + } + else //enable all + { + enable_e0(); + enable_e1(); + enable_e2(); + } + } + + if (block->steps_e == 0) + { + if(feed_ratesteps_x <=dropsegments && block->steps_y <=dropsegments && block->steps_z <=dropsegments ) + { + block->millimeters = fabs(delta_mm[E_AXIS]); + } + else + { + #ifndef COREXY + block->millimeters = sqrt(square(delta_mm[X_AXIS]) + square(delta_mm[Y_AXIS]) + square(delta_mm[Z_AXIS])); + #else + block->millimeters = sqrt(square(delta_mm[X_HEAD]) + square(delta_mm[Y_HEAD]) + square(delta_mm[Z_AXIS])); + #endif + } + float inverse_millimeters = 1.0/block->millimeters; // Inverse millimeters to remove multiple divides + + // Calculate speed in mm/second for each axis. No divide by zero due to previous checks. + float inverse_second = feed_rate * inverse_millimeters; + + int moves_queued = moves_planned(); + + // slow down when de buffer starts to empty, rather than wait at the corner for a buffer refill +#ifdef SLOWDOWN + //FIXME Vojtech: Why moves_queued > 1? Why not >=1? + // Can we somehow differentiate the filling of the buffer at the start of a g-code from a buffer draining situation? + if (moves_queued > 1 && moves_queued < (BLOCK_BUFFER_SIZE >> 1)) { + // segment time in micro seconds + unsigned long segment_time = lround(1000000.0/inverse_second); + if (segment_time < minsegmenttime) + // buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more. + inverse_second=1000000.0/(segment_time+lround(2*(minsegmenttime-segment_time)/moves_queued)); + } +#endif // SLOWDOWN + + block->nominal_speed = block->millimeters * inverse_second; // (mm/sec) Always > 0 + block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0 + +#ifdef FILAMENT_SENSOR + //FMM update ring buffer used for delay with filament measurements + + + if((extruder==FILAMENT_SENSOR_EXTRUDER_NUM) && (delay_index2 > -1)) //only for extruder with filament sensor and if ring buffer is initialized + { + delay_dist = delay_dist + delta_mm[E_AXIS]; //increment counter with next move in e axis + + while (delay_dist >= (10*(MAX_MEASUREMENT_DELAY+1))) //check if counter is over max buffer size in mm + delay_dist = delay_dist - 10*(MAX_MEASUREMENT_DELAY+1); //loop around the buffer + while (delay_dist<0) + delay_dist = delay_dist + 10*(MAX_MEASUREMENT_DELAY+1); //loop around the buffer + + delay_index1=delay_dist/10.0; //calculate index + + //ensure the number is within range of the array after converting from floating point + if(delay_index1<0) + delay_index1=0; + else if (delay_index1>MAX_MEASUREMENT_DELAY) + delay_index1=MAX_MEASUREMENT_DELAY; + + if(delay_index1 != delay_index2) //moved index + { + meas_sample=widthFil_to_size_ratio()-100; //subtract off 100 to reduce magnitude - to store in a signed char + } + while( delay_index1 != delay_index2) + { + delay_index2 = delay_index2 + 1; + if(delay_index2>MAX_MEASUREMENT_DELAY) + delay_index2=delay_index2-(MAX_MEASUREMENT_DELAY+1); //loop around buffer when incrementing + if(delay_index2<0) + delay_index2=0; + else if (delay_index2>MAX_MEASUREMENT_DELAY) + delay_index2=MAX_MEASUREMENT_DELAY; + + measurement_delay[delay_index2]=meas_sample; + } + + + } +#endif + + + // Calculate and limit speed in mm/sec for each axis + float current_speed[4]; + float speed_factor = 1.0; //factor <=1 do decrease speed + for(int i=0; i < 4; i++) + { + current_speed[i] = delta_mm[i] * inverse_second; + if(fabs(current_speed[i]) > max_feedrate[i]) + speed_factor = min(speed_factor, max_feedrate[i] / fabs(current_speed[i])); + } + + // Correct the speed + if( speed_factor < 1.0) + { + for(unsigned char i=0; i < 4; i++) + { + current_speed[i] *= speed_factor; + } + block->nominal_speed *= speed_factor; + block->nominal_rate *= speed_factor; + } + + // Compute and limit the acceleration rate for the trapezoid generator. + // block->step_event_count ... event count of the fastest axis + // block->millimeters ... Euclidian length of the XYZ movement or the E length, if no XYZ movement. + float steps_per_mm = block->step_event_count/block->millimeters; + if(block->steps_x == 0 && block->steps_y == 0 && block->steps_z == 0) + { + block->acceleration_st = ceil(retract_acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 + } + else + { + block->acceleration_st = ceil(acceleration * steps_per_mm); // convert to: acceleration steps/sec^2 + // Limit acceleration per axis + //FIXME Vojtech: One shall rather limit a projection of the acceleration vector instead of using the limit. + if(((float)block->acceleration_st * (float)block->steps_x / (float)block->step_event_count) > axis_steps_per_sqr_second[X_AXIS]) + block->acceleration_st = axis_steps_per_sqr_second[X_AXIS]; + if(((float)block->acceleration_st * (float)block->steps_y / (float)block->step_event_count) > axis_steps_per_sqr_second[Y_AXIS]) + block->acceleration_st = axis_steps_per_sqr_second[Y_AXIS]; + if(((float)block->acceleration_st * (float)block->steps_e / (float)block->step_event_count) > axis_steps_per_sqr_second[E_AXIS]) + block->acceleration_st = axis_steps_per_sqr_second[E_AXIS]; + if(((float)block->acceleration_st * (float)block->steps_z / (float)block->step_event_count ) > axis_steps_per_sqr_second[Z_AXIS]) + block->acceleration_st = axis_steps_per_sqr_second[Z_AXIS]; + } + // Acceleration of the segment, in mm/sec^2 + block->acceleration = block->acceleration_st / steps_per_mm; + +#if 1 + // Oversample diagonal movements by a power of 2 up to 8x + // to achieve more accurate diagonal movements. + uint8_t bresenham_oversample = 1; + for (uint8_t i = 0; i < 3; ++ i) { + if (block->nominal_rate >= 5000) // 5kHz + break; + block->nominal_rate << 1; + bresenham_oversample << 1; + block->step_event_count << 1; + } + if (bresenham_oversample > 1) + // Lower the acceleration steps/sec^2 to account for the oversampling. + block->acceleration_st = (block->acceleration_st + (bresenham_oversample >> 1)) / bresenham_oversample; +#endif + + block->acceleration_rate = (long)((float)block->acceleration_st * (16777216.0 / (F_CPU / 8.0))); + + // Start with a safe speed. + // Safe speed is the speed, from which the machine may halt to stop immediately. + float safe_speed = block->nominal_speed; + bool limited = false; + for (uint8_t axis = 0; axis < 4; ++ axis) { + float jerk = fabs(current_speed[axis]); + if (jerk > max_jerk[axis]) { + // The actual jerk is lower, if it has been limited by the XY jerk. + if (limited) { + // Spare one division by a following gymnastics: + // Instead of jerk *= safe_speed / block->nominal_speed, + // multiply max_jerk[axis] by the divisor. + jerk *= safe_speed; + float mjerk = max_jerk[axis] * block->nominal_speed; + if (jerk > mjerk) { + safe_speed *= mjerk / jerk; + limited = true; + } + } else { + safe_speed = max_jerk[axis]; + limited = true; + } + } + } + + // Reset the block flag. + block->flag = 0; + + // Initial limit on the segment entry velocity. + float vmax_junction; + + //FIXME Vojtech: Why only if at least two lines are planned in the queue? + // Is it because we don't want to tinker with the first buffer line, which + // is likely to be executed by the stepper interrupt routine soon? + if (moves_queued > 1 && previous_nominal_speed > 0.0001f) { + // Estimate a maximum velocity allowed at a joint of two successive segments. + // If this maximum velocity allowed is lower than the minimum of the entry / exit safe velocities, + // then the machine is not coasting anymore and the safe entry / exit velocities shall be used. + + // The junction velocity will be shared between successive segments. Limit the junction velocity to their minimum. + bool prev_speed_larger = previous_nominal_speed > block->nominal_speed; + float smaller_speed_factor = prev_speed_larger ? (block->nominal_speed / previous_nominal_speed) : (previous_nominal_speed / block->nominal_speed); + // Pick the smaller of the nominal speeds. Higher speed shall not be achieved at the junction during coasting. + vmax_junction = prev_speed_larger ? block->nominal_speed : previous_nominal_speed; + // Factor to multiply the previous / current nominal velocities to get componentwise limited velocities. + float v_factor = 1.f; + limited = false; + // Now limit the jerk in all axes. + for (uint8_t axis = 0; axis < 4; ++ axis) { + // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop. + float v_exit = previous_speed[axis]; + float v_entry = current_speed [axis]; + if (prev_speed_larger) + v_exit *= smaller_speed_factor; + if (limited) { + v_exit *= v_factor; + v_entry *= v_factor; + } + // Calculate the jerk depending on whether the axis is coasting in the same direction or reversing a direction. + float jerk = + (v_exit > v_entry) ? + ((v_entry > 0.f || v_exit < 0.f) ? + // coasting + (v_exit - v_entry) : + // axis reversal + max(v_exit, - v_entry)) : + // v_exit <= v_entry + ((v_entry < 0.f || v_exit > 0.f) ? + // coasting + (v_entry - v_exit) : + // axis reversal + max(- v_exit, v_entry)); + if (jerk > max_jerk[axis]) { + v_factor *= max_jerk[axis] / jerk; + limited = true; + } + } + if (limited) + vmax_junction *= v_factor; + // Now the transition velocity is known, which maximizes the shared exit / entry velocity while + // respecting the jerk factors, it may be possible, that applying separate safe exit / entry velocities will achieve faster prints. + float vmax_junction_threshold = vmax_junction * 0.99f; + if (previous_safe_speed > vmax_junction_threshold && safe_speed > vmax_junction_threshold) { + // Not coasting. The machine will stop and start the movements anyway, + // better to start the segment from start. + block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; + vmax_junction = safe_speed; + } + } else { + block->flag |= BLOCK_FLAG_START_FROM_FULL_HALT; + vmax_junction = safe_speed; + } + + // Max entry speed of this block equals the max exit speed of the previous block. + block->max_entry_speed = vmax_junction; + + // Initialize block entry speed. Compute based on deceleration to safe_speed. + double v_allowable = max_allowable_entry_speed(-block->acceleration,safe_speed,block->millimeters); + block->entry_speed = min(vmax_junction, v_allowable); + + // Initialize planner efficiency flags + // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. + // If a block can de/ac-celerate from nominal speed to zero within the length of the block, then + // the current block and next block junction speeds are guaranteed to always be at their maximum + // junction speeds in deceleration and acceleration, respectively. This is due to how the current + // block nominal speed limits both the current and next maximum junction speeds. Hence, in both + // the reverse and forward planners, the corresponding block junction speed will always be at the + // the maximum junction speed and may always be ignored for any speed reduction checks. + // Always calculate trapezoid for new block + block->flag |= (block->nominal_speed <= v_allowable) ? (BLOCK_FLAG_NOMINAL_LENGTH | BLOCK_FLAG_RECALCULATE) : BLOCK_FLAG_RECALCULATE; + + // Update previous path unit_vector and nominal speed + memcpy(previous_speed, current_speed, sizeof(previous_speed)); // previous_speed[] = current_speed[] + previous_nominal_speed = block->nominal_speed; + previous_safe_speed = safe_speed; + // Precalculate the division, so when all the trapezoids in the planner queue get recalculated, the division is not repeated. + block->speed_factor = block->nominal_rate / block->nominal_speed; + calculate_trapezoid_for_block(block, block->entry_speed, safe_speed); + + // Move the buffer head. From now the block may be picked up by the stepper interrupt controller. + block_buffer_head = next_buffer_head; + + // Update position + memcpy(position, target, sizeof(target)); // position[] = target[] + + // Recalculate the trapezoids to maximize speed at the segment transitions while respecting + // the machine limits (maximum acceleration and maximum jerk). + // This runs asynchronously with the stepper interrupt controller, which may + // interfere with the process. + planner_recalculate(safe_speed); + +// SERIAL_ECHOPGM("Q"); +// SERIAL_ECHO(int(moves_planned())); +// SERIAL_ECHOLNPGM(""); + +#ifdef PLANNER_DIAGNOSTICS + planner_update_queue_min_counter(); +#endif /* PLANNER_DIAGNOSTIC */ + st_wake_up(); +} + +#ifdef ENABLE_AUTO_BED_LEVELING +vector_3 plan_get_position() { + vector_3 position = vector_3(st_get_position_mm(X_AXIS), st_get_position_mm(Y_AXIS), st_get_position_mm(Z_AXIS)); + + //position.debug("in plan_get position"); + //plan_bed_level_matrix.debug("in plan_get bed_level"); + matrix_3x3 inverse = matrix_3x3::transpose(plan_bed_level_matrix); + //inverse.debug("in plan_get inverse"); + position.apply_rotation(inverse); + //position.debug("after rotation"); + + return position; +} +#endif // ENABLE_AUTO_BED_LEVELING + +void plan_set_position(float x, float y, float z, const float &e) +{ +#ifdef ENABLE_AUTO_BED_LEVELING + apply_rotation_xyz(plan_bed_level_matrix, x, y, z); +#endif // ENABLE_AUTO_BED_LEVELING + + // Apply the machine correction matrix. + { + float tmpx = x; + float tmpy = y; + x = world2machine_rotation_and_skew[0][0] * tmpx + world2machine_rotation_and_skew[0][1] * tmpy + world2machine_shift[0]; + y = world2machine_rotation_and_skew[1][0] * tmpx + world2machine_rotation_and_skew[1][1] * tmpy + world2machine_shift[1]; + } + + position[X_AXIS] = lround(x*axis_steps_per_unit[X_AXIS]); + position[Y_AXIS] = lround(y*axis_steps_per_unit[Y_AXIS]); +#ifdef MESH_BED_LEVELING + if (mbl.active){ + position[Z_AXIS] = lround((z+mbl.get_z(x, y))*axis_steps_per_unit[Z_AXIS]); + }else{ + position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); + } +#else + position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); +#endif // ENABLE_MESH_BED_LEVELING + position[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); + st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]); + previous_nominal_speed = 0.0; // Resets planner junction speeds. Assumes start from rest. + previous_speed[0] = 0.0; + previous_speed[1] = 0.0; + previous_speed[2] = 0.0; + previous_speed[3] = 0.0; +} + +// Only useful in the bed leveling routine, when the mesh bed leveling is off. +void plan_set_z_position(const float &z) +{ + position[Z_AXIS] = lround(z*axis_steps_per_unit[Z_AXIS]); + st_set_position(position[X_AXIS], position[Y_AXIS], position[Z_AXIS], position[E_AXIS]); +} + +void plan_set_e_position(const float &e) +{ + position[E_AXIS] = lround(e*axis_steps_per_unit[E_AXIS]); + st_set_e_position(position[E_AXIS]); +} + +#ifdef PREVENT_DANGEROUS_EXTRUDE +void set_extrude_min_temp(float temp) +{ + extrude_min_temp=temp; +} +#endif + +// Calculate the steps/s^2 acceleration rates, based on the mm/s^s +void reset_acceleration_rates() +{ + for(int8_t i=0; i < NUM_AXIS; i++) + { + axis_steps_per_sqr_second[i] = max_acceleration_units_per_sq_second[i] * axis_steps_per_unit[i]; + } +} + +#ifdef PLANNER_DIAGNOSTICS +uint8_t planner_queue_min() +{ + return g_cntr_planner_queue_min; +} + +void planner_queue_min_reset() +{ + g_cntr_planner_queue_min = moves_planned(); +} +#endif /* PLANNER_DIAGNOSTICS */ \ No newline at end of file diff --git a/Firmware/planner.h b/Firmware/planner.h index 0858bda30..77c81d821 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -1,217 +1,208 @@ -/* - planner.h - buffers movement commands and manages the acceleration profile plan - Part of Grbl - - Copyright (c) 2009-2011 Simen Svale Skogsrud - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ - -// This module is to be considered a sub-module of stepper.c. Please don't include -// this file from any other module. - -#ifndef planner_h -#define planner_h - -#include "Marlin.h" - -#ifdef ENABLE_AUTO_BED_LEVELING -#include "vector_3.h" -#endif // ENABLE_AUTO_BED_LEVELING - -enum BlockFlag { - // Planner flag to recalculate trapezoids on entry junction. - // This flag has an optimization purpose only. - BLOCK_FLAG_RECALCULATE = 1, - // Planner flag for nominal speed always reached. That means, the segment is long enough, that the nominal speed - // may be reached if accelerating from a safe speed (in the regard of jerking from zero speed). - BLOCK_FLAG_NOMINAL_LENGTH = 2, - // If set, the machine will start from a halt at the start of this block, - // respecting the maximum allowed jerk. - BLOCK_FLAG_START_FROM_FULL_HALT = 4, -}; - -// This struct is used when buffering the setup for each linear movement "nominal" values are as specified in -// the source g-code and may never actually be reached if acceleration management is active. -typedef struct { - // Fields used by the bresenham algorithm for tracing the line - // steps_x.y,z, step_event_count, acceleration_rate, direction_bits and active_extruder are set by plan_buffer_line(). - long steps_x, steps_y, steps_z, steps_e; // Step count along each axis - unsigned long step_event_count; // The number of step events required to complete this block - long acceleration_rate; // The acceleration rate used for acceleration calculation - unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) - unsigned char active_extruder; // Selects the active extruder - // accelerate_until and decelerate_after are set by calculate_trapezoid_for_block() and they need to be synchronized with the stepper interrupt controller. - long accelerate_until; // The index of the step event on which to stop acceleration - long decelerate_after; // The index of the step event on which to start decelerating - - // Fields used by the motion planner to manage acceleration -// float speed_x, speed_y, speed_z, speed_e; // Nominal mm/sec for each axis - // The nominal speed for this block in mm/sec. - // This speed may or may not be reached due to the jerk and acceleration limits. - float nominal_speed; - // Entry speed at previous-current junction in mm/sec, respecting the acceleration and jerk limits. - // The entry speed limit of the current block equals the exit speed of the preceding block. - float entry_speed; - // Maximum allowable junction entry speed in mm/sec. This value is also a maximum exit speed of the previous block. - float max_entry_speed; - // The total travel of this block in mm - float millimeters; - // acceleration mm/sec^2 - float acceleration; - - // Bit flags defined by the BlockFlag enum. - bool flag; - - // Settings for the trapezoid generator (runs inside an interrupt handler). - // Changing the following values in the planner needs to be synchronized with the interrupt handler by disabling the interrupts. - //FIXME nominal_rate, initial_rate and final_rate are limited to uint16_t by MultiU24X24toH16 in the stepper interrupt anyway! - unsigned long nominal_rate; // The nominal step rate for this block in step_events/sec - unsigned long initial_rate; // The jerk-adjusted step rate at start of block - unsigned long final_rate; // The minimal rate at exit - unsigned long acceleration_st; // acceleration steps/sec^2 - //FIXME does it have to be unsigned long? Probably uint8_t would be just fine. - unsigned long fan_speed; - volatile char busy; - - - // Pre-calculated division for the calculate_trapezoid_for_block() routine to run faster. - float speed_factor; - - #ifdef LIN_ADVANCE - bool use_advance_lead; - unsigned long abs_adv_steps_multiplier8; // Factorised by 2^8 to avoid float - #endif -} block_t; - -#ifdef LIN_ADVANCE - extern float extruder_advance_k, advance_ed_ratio; -#endif - -#ifdef ENABLE_AUTO_BED_LEVELING -// this holds the required transform to compensate for bed level -extern matrix_3x3 plan_bed_level_matrix; -#endif // #ifdef ENABLE_AUTO_BED_LEVELING - -// Initialize the motion plan subsystem -void plan_init(); - -// Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in -// millimaters. Feed rate specifies the speed of the motion. - -#ifdef ENABLE_AUTO_BED_LEVELING -void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder); - -// Get the position applying the bed level matrix if enabled -vector_3 plan_get_position(); -#else -void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder); -//void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder); -#endif // ENABLE_AUTO_BED_LEVELING - -// Set position. Used for G92 instructions. -//#ifdef ENABLE_AUTO_BED_LEVELING -void plan_set_position(float x, float y, float z, const float &e); -//#else -//void plan_set_position(const float &x, const float &y, const float &z, const float &e); -//#endif // ENABLE_AUTO_BED_LEVELING - -void plan_set_z_position(const float &z); -void plan_set_e_position(const float &e); - - - -void check_axes_activity(); - -extern unsigned long minsegmenttime; -extern float max_feedrate[NUM_AXIS]; // set the max speeds -extern float axis_steps_per_unit[NUM_AXIS]; -extern unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software -extern float minimumfeedrate; -extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX -extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX -// Jerk is a maximum immediate velocity change. -extern float max_jerk[NUM_AXIS]; -extern float mintravelfeedrate; -extern unsigned long axis_steps_per_sqr_second[NUM_AXIS]; - -#ifdef AUTOTEMP - extern bool autotemp_enabled; - extern float autotemp_max; - extern float autotemp_min; - extern float autotemp_factor; -#endif - - - - -extern block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions -extern volatile unsigned char block_buffer_head; // Index of the next block to be pushed -extern volatile unsigned char block_buffer_tail; -// Called when the current block is no longer needed. Discards the block and makes the memory -// available for new blocks. -FORCE_INLINE void plan_discard_current_block() -{ - if (block_buffer_head != block_buffer_tail) { - block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); - } -} - -// Gets the current block. Returns NULL if buffer empty -FORCE_INLINE block_t *plan_get_current_block() -{ - if (block_buffer_head == block_buffer_tail) { - return(NULL); - } - block_t *block = &block_buffer[block_buffer_tail]; - block->busy = true; - return(block); -} - -// Returns true if the buffer has a queued block, false otherwise -FORCE_INLINE bool blocks_queued() { - return (block_buffer_head != block_buffer_tail); -} - -//return the nr of buffered moves -FORCE_INLINE uint8_t moves_planned() { - return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); -} - -FORCE_INLINE bool planner_queue_full() { - unsigned char next_block_index = block_buffer_head; - if (++ next_block_index == BLOCK_BUFFER_SIZE) - next_block_index = 0; - return block_buffer_tail == next_block_index; -} - -// Abort the stepper routine, clean up the block queue, -// wait for the steppers to stop, -// update planner's current position and the current_position of the front end. -extern void planner_abort_hard(); - -#ifdef PREVENT_DANGEROUS_EXTRUDE -void set_extrude_min_temp(float temp); -#endif - -void reset_acceleration_rates(); -#endif - -// #define PLANNER_DIAGNOSTICS -#ifdef PLANNER_DIAGNOSTICS -// Diagnostic functions to display planner buffer underflow on the display. -extern uint8_t planner_queue_min(); -// Diagnostic function: Reset the minimum planner segments. -extern void planner_queue_min_reset(); -#endif /* PLANNER_DIAGNOSTICS */ +/* + planner.h - buffers movement commands and manages the acceleration profile plan + Part of Grbl + + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +// This module is to be considered a sub-module of stepper.c. Please don't include +// this file from any other module. + +#ifndef planner_h +#define planner_h + +#include "Marlin.h" + +#ifdef ENABLE_AUTO_BED_LEVELING +#include "vector_3.h" +#endif // ENABLE_AUTO_BED_LEVELING + +enum BlockFlag { + // Planner flag to recalculate trapezoids on entry junction. + // This flag has an optimization purpose only. + BLOCK_FLAG_RECALCULATE = 1, + // Planner flag for nominal speed always reached. That means, the segment is long enough, that the nominal speed + // may be reached if accelerating from a safe speed (in the regard of jerking from zero speed). + BLOCK_FLAG_NOMINAL_LENGTH = 2, + // If set, the machine will start from a halt at the start of this block, + // respecting the maximum allowed jerk. + BLOCK_FLAG_START_FROM_FULL_HALT = 4, +}; + +// This struct is used when buffering the setup for each linear movement "nominal" values are as specified in +// the source g-code and may never actually be reached if acceleration management is active. +typedef struct { + // Fields used by the bresenham algorithm for tracing the line + // steps_x.y,z, step_event_count, acceleration_rate, direction_bits and active_extruder are set by plan_buffer_line(). + long steps_x, steps_y, steps_z, steps_e; // Step count along each axis + unsigned long step_event_count; // The number of step events required to complete this block + long acceleration_rate; // The acceleration rate used for acceleration calculation + unsigned char direction_bits; // The direction bit set for this block (refers to *_DIRECTION_BIT in config.h) + unsigned char active_extruder; // Selects the active extruder + // accelerate_until and decelerate_after are set by calculate_trapezoid_for_block() and they need to be synchronized with the stepper interrupt controller. + long accelerate_until; // The index of the step event on which to stop acceleration + long decelerate_after; // The index of the step event on which to start decelerating + + // Fields used by the motion planner to manage acceleration +// float speed_x, speed_y, speed_z, speed_e; // Nominal mm/sec for each axis + // The nominal speed for this block in mm/sec. + // This speed may or may not be reached due to the jerk and acceleration limits. + float nominal_speed; + // Entry speed at previous-current junction in mm/sec, respecting the acceleration and jerk limits. + // The entry speed limit of the current block equals the exit speed of the preceding block. + float entry_speed; + // Maximum allowable junction entry speed in mm/sec. This value is also a maximum exit speed of the previous block. + float max_entry_speed; + // The total travel of this block in mm + float millimeters; + // acceleration mm/sec^2 + float acceleration; + + // Bit flags defined by the BlockFlag enum. + bool flag; + + // Settings for the trapezoid generator (runs inside an interrupt handler). + // Changing the following values in the planner needs to be synchronized with the interrupt handler by disabling the interrupts. + //FIXME nominal_rate, initial_rate and final_rate are limited to uint16_t by MultiU24X24toH16 in the stepper interrupt anyway! + unsigned long nominal_rate; // The nominal step rate for this block in step_events/sec + unsigned long initial_rate; // The jerk-adjusted step rate at start of block + unsigned long final_rate; // The minimal rate at exit + unsigned long acceleration_st; // acceleration steps/sec^2 + //FIXME does it have to be unsigned long? Probably uint8_t would be just fine. + unsigned long fan_speed; + volatile char busy; + + + // Pre-calculated division for the calculate_trapezoid_for_block() routine to run faster. + float speed_factor; +} block_t; + +#ifdef ENABLE_AUTO_BED_LEVELING +// this holds the required transform to compensate for bed level +extern matrix_3x3 plan_bed_level_matrix; +#endif // #ifdef ENABLE_AUTO_BED_LEVELING + +// Initialize the motion plan subsystem +void plan_init(); + +// Add a new linear movement to the buffer. x, y and z is the signed, absolute target position in +// millimaters. Feed rate specifies the speed of the motion. + +#ifdef ENABLE_AUTO_BED_LEVELING +void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder); + +// Get the position applying the bed level matrix if enabled +vector_3 plan_get_position(); +#else +void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder); +//void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder); +#endif // ENABLE_AUTO_BED_LEVELING + +// Set position. Used for G92 instructions. +//#ifdef ENABLE_AUTO_BED_LEVELING +void plan_set_position(float x, float y, float z, const float &e); +//#else +//void plan_set_position(const float &x, const float &y, const float &z, const float &e); +//#endif // ENABLE_AUTO_BED_LEVELING + +void plan_set_z_position(const float &z); +void plan_set_e_position(const float &e); + + + +void check_axes_activity(); + +extern unsigned long minsegmenttime; +extern float max_feedrate[NUM_AXIS]; // set the max speeds +extern float axis_steps_per_unit[NUM_AXIS]; +extern unsigned long max_acceleration_units_per_sq_second[NUM_AXIS]; // Use M201 to override by software +extern float minimumfeedrate; +extern float acceleration; // Normal acceleration mm/s^2 THIS IS THE DEFAULT ACCELERATION for all moves. M204 SXXXX +extern float retract_acceleration; // mm/s^2 filament pull-pack and push-forward while standing still in the other axis M204 TXXXX +// Jerk is a maximum immediate velocity change. +extern float max_jerk[NUM_AXIS]; +extern float mintravelfeedrate; +extern unsigned long axis_steps_per_sqr_second[NUM_AXIS]; + +#ifdef AUTOTEMP + extern bool autotemp_enabled; + extern float autotemp_max; + extern float autotemp_min; + extern float autotemp_factor; +#endif + + + + +extern block_t block_buffer[BLOCK_BUFFER_SIZE]; // A ring buffer for motion instfructions +extern volatile unsigned char block_buffer_head; // Index of the next block to be pushed +extern volatile unsigned char block_buffer_tail; +// Called when the current block is no longer needed. Discards the block and makes the memory +// available for new blocks. +FORCE_INLINE void plan_discard_current_block() +{ + if (block_buffer_head != block_buffer_tail) { + block_buffer_tail = (block_buffer_tail + 1) & (BLOCK_BUFFER_SIZE - 1); + } +} + +// Gets the current block. Returns NULL if buffer empty +FORCE_INLINE block_t *plan_get_current_block() +{ + if (block_buffer_head == block_buffer_tail) { + return(NULL); + } + block_t *block = &block_buffer[block_buffer_tail]; + block->busy = true; + return(block); +} + +// Returns true if the buffer has a queued block, false otherwise +FORCE_INLINE bool blocks_queued() { + return (block_buffer_head != block_buffer_tail); +} + +//return the nr of buffered moves +FORCE_INLINE uint8_t moves_planned() { + return (block_buffer_head + BLOCK_BUFFER_SIZE - block_buffer_tail) & (BLOCK_BUFFER_SIZE - 1); +} + +FORCE_INLINE bool planner_queue_full() { + unsigned char next_block_index = block_buffer_head; + if (++ next_block_index == BLOCK_BUFFER_SIZE) + next_block_index = 0; + return block_buffer_tail == next_block_index; +} + +// Abort the stepper routine, clean up the block queue, +// wait for the steppers to stop, +// update planner's current position and the current_position of the front end. +extern void planner_abort_hard(); + +#ifdef PREVENT_DANGEROUS_EXTRUDE +void set_extrude_min_temp(float temp); +#endif + +void reset_acceleration_rates(); +#endif + +// #define PLANNER_DIAGNOSTICS +#ifdef PLANNER_DIAGNOSTICS +// Diagnostic functions to display planner buffer underflow on the display. +extern uint8_t planner_queue_min(); +// Diagnostic function: Reset the minimum planner segments. +extern void planner_queue_min_reset(); +#endif /* PLANNER_DIAGNOSTICS */ diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index 1fce528d3..339cb48f3 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -1,1296 +1,1161 @@ -/* - stepper.c - stepper motor driver: executes motion plans using stepper motors - Part of Grbl - - Copyright (c) 2009-2011 Simen Svale Skogsrud - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ - -/* The timer calculations of this module informed by the 'RepRap cartesian firmware' by Zack Smith - and Philipp Tiefenbacher. */ - -#include "Marlin.h" -#include "stepper.h" -#include "planner.h" -#include "temperature.h" -#include "ultralcd.h" -#include "language.h" -#include "cardreader.h" -#include "speed_lookuptable.h" -#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 -#include -#endif - - -//=========================================================================== -//=============================public variables ============================ -//=========================================================================== -block_t *current_block; // A pointer to the block currently being traced - - -//=========================================================================== -//=============================private variables ============================ -//=========================================================================== -//static makes it inpossible to be called from outside of this file by extern.! - -// Variables used by The Stepper Driver Interrupt -static unsigned char out_bits; // The next stepping-bits to be output -static int32_t counter_x, // Counter variables for the bresenham line tracer - counter_y, - counter_z, - counter_e; -volatile static uint32_t step_events_completed; // The number of step events executed in the current block -static int32_t acceleration_time, deceleration_time; -//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate; -static uint16_t acc_step_rate; // needed for deccelaration start point -static uint8_t step_loops; -static uint16_t OCR1A_nominal; -static uint8_t step_loops_nominal; - -volatile long endstops_trigsteps[3]={0,0,0}; -volatile long endstops_stepsTotal,endstops_stepsDone; -static volatile bool endstop_x_hit=false; -static volatile bool endstop_y_hit=false; -static volatile bool endstop_z_hit=false; -#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED -bool abort_on_endstop_hit = false; -#endif -#ifdef MOTOR_CURRENT_PWM_XY_PIN - int motor_current_setting[3] = DEFAULT_PWM_MOTOR_CURRENT; - int motor_current_setting_silent[3] = DEFAULT_PWM_MOTOR_CURRENT; - int motor_current_setting_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD; -#endif - -static bool old_x_min_endstop=false; -static bool old_x_max_endstop=false; -static bool old_y_min_endstop=false; -static bool old_y_max_endstop=false; -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; - -volatile long count_position[NUM_AXIS] = { 0, 0, 0, 0}; -volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1}; - -#ifdef LIN_ADVANCE - - uint16_t ADV_NEVER = 65535; - - static uint16_t nextMainISR = 0; - static uint16_t nextAdvanceISR = ADV_NEVER; - static uint16_t eISR_Rate = ADV_NEVER; - - static volatile int e_steps; //Extrusion steps to be executed by the stepper - static int final_estep_rate; //Speed of extruder at cruising speed - static int current_estep_rate; //The current speed of the extruder - static int current_adv_steps; //The current pretension of filament expressed in steps - - #define ADV_RATE(T, L) (e_steps ? (T) * (L) / abs(e_steps) : ADV_NEVER) - #define _NEXT_ISR(T) nextMainISR = T - -#else - #define _NEXT_ISR(T) OCR1A = T -#endif - -//=========================================================================== -//=============================functions ============================ -//=========================================================================== - -#define CHECK_ENDSTOPS if(check_endstops) - -// intRes = intIn1 * intIn2 >> 16 -// uses: -// r26 to store 0 -// r27 to store the byte 1 of the 24 bit result -#define MultiU16X8toH16(intRes, charIn1, intIn2) \ -asm volatile ( \ -"clr r26 \n\t" \ -"mul %A1, %B2 \n\t" \ -"movw %A0, r0 \n\t" \ -"mul %A1, %A2 \n\t" \ -"add %A0, r1 \n\t" \ -"adc %B0, r26 \n\t" \ -"lsr r0 \n\t" \ -"adc %A0, r26 \n\t" \ -"adc %B0, r26 \n\t" \ -"clr r1 \n\t" \ -: \ -"=&r" (intRes) \ -: \ -"d" (charIn1), \ -"d" (intIn2) \ -: \ -"r26" \ -) - -// intRes = longIn1 * longIn2 >> 24 -// uses: -// r26 to store 0 -// r27 to store the byte 1 of the 48bit result -#define MultiU24X24toH16(intRes, longIn1, longIn2) \ -asm volatile ( \ -"clr r26 \n\t" \ -"mul %A1, %B2 \n\t" \ -"mov r27, r1 \n\t" \ -"mul %B1, %C2 \n\t" \ -"movw %A0, r0 \n\t" \ -"mul %C1, %C2 \n\t" \ -"add %B0, r0 \n\t" \ -"mul %C1, %B2 \n\t" \ -"add %A0, r0 \n\t" \ -"adc %B0, r1 \n\t" \ -"mul %A1, %C2 \n\t" \ -"add r27, r0 \n\t" \ -"adc %A0, r1 \n\t" \ -"adc %B0, r26 \n\t" \ -"mul %B1, %B2 \n\t" \ -"add r27, r0 \n\t" \ -"adc %A0, r1 \n\t" \ -"adc %B0, r26 \n\t" \ -"mul %C1, %A2 \n\t" \ -"add r27, r0 \n\t" \ -"adc %A0, r1 \n\t" \ -"adc %B0, r26 \n\t" \ -"mul %B1, %A2 \n\t" \ -"add r27, r1 \n\t" \ -"adc %A0, r26 \n\t" \ -"adc %B0, r26 \n\t" \ -"lsr r27 \n\t" \ -"adc %A0, r26 \n\t" \ -"adc %B0, r26 \n\t" \ -"clr r1 \n\t" \ -: \ -"=&r" (intRes) \ -: \ -"d" (longIn1), \ -"d" (longIn2) \ -: \ -"r26" , "r27" \ -) - -// Some useful constants - -#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= (1< -// -// The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates -// first block->accelerate_until step_events_completed, then keeps going at constant speed until -// step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. -// The slope of acceleration is calculated with the leib ramp alghorithm. - -void st_wake_up() { - // TCNT1 = 0; - ENABLE_STEPPER_DRIVER_INTERRUPT(); -} - -void step_wait(){ - for(int8_t i=0; i < 6; i++){ - } -} - - -FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { - unsigned short timer; - if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; - - if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times - step_rate = (step_rate >> 2)&0x3fff; - step_loops = 4; - } - else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times - step_rate = (step_rate >> 1)&0x7fff; - step_loops = 2; - } - else { - step_loops = 1; - } - - if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); - step_rate -= (F_CPU/500000); // Correct for minimal speed - if(step_rate >= (8*256)){ // higher step rate - unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; - unsigned char tmp_step_rate = (step_rate & 0x00ff); - unsigned short gain = (unsigned short)pgm_read_word_near(table_address+2); - MultiU16X8toH16(timer, tmp_step_rate, gain); - timer = (unsigned short)pgm_read_word_near(table_address) - timer; - } - else { // lower step rates - unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; - table_address += ((step_rate)>>1) & 0xfffc; - timer = (unsigned short)pgm_read_word_near(table_address); - timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); - } - if(timer < 100) { timer = 100; MYSERIAL.print(MSG_STEPPER_TOO_HIGH); MYSERIAL.println(step_rate); }//(20kHz this should never happen) - return timer; -} - -// Initializes the trapezoid generator from the current block. Called whenever a new -// block begins. -FORCE_INLINE void trapezoid_generator_reset() { - deceleration_time = 0; - // step_rate to timer interval - OCR1A_nominal = calc_timer(current_block->nominal_rate); - // make a note of the number of step loops required at nominal speed - step_loops_nominal = step_loops; - acc_step_rate = current_block->initial_rate; - acceleration_time = calc_timer(acc_step_rate); - _NEXT_ISR(acceleration_time); - - #ifdef LIN_ADVANCE - if (current_block->use_advance_lead) { - current_estep_rate = ((unsigned long)acc_step_rate * current_block->abs_adv_steps_multiplier8) >> 17; - final_estep_rate = (current_block->nominal_rate * current_block->abs_adv_steps_multiplier8) >> 17; - } - #endif -} - -// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse. -// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately. -ISR(TIMER1_COMPA_vect) { - #ifdef LIN_ADVANCE - advance_isr_scheduler(); - #else - isr(); - #endif -} - -void isr() { - // If there is no current block, attempt to pop one from the buffer - if (current_block == NULL) { - // Anything in the buffer? - current_block = plan_get_current_block(); - if (current_block != NULL) { - // The busy flag is set by the plan_get_current_block() call. - // current_block->busy = true; - trapezoid_generator_reset(); - counter_x = -(current_block->step_event_count >> 1); - counter_y = counter_x; - counter_z = counter_x; - counter_e = counter_x; - step_events_completed = 0; - - #ifdef Z_LATE_ENABLE - if(current_block->steps_z > 0) { - enable_z(); - _NEXT_ISR(2000); //1ms wait - return; - } - #endif - } - else { - _NEXT_ISR(2000); // 1kHz. - } - } - - if (current_block != NULL) { - // Set directions TO DO This should be done once during init of trapezoid. Endstops -> interrupt - out_bits = current_block->direction_bits; - - - // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY) - if((out_bits & (1< -1 - bool x_min_endstop=(READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING); - if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { - endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; - endstop_x_hit=true; - step_events_completed = current_block->step_event_count; - } - old_x_min_endstop = x_min_endstop; - #endif - } - } - } - else { // +direction - CHECK_ENDSTOPS - { - { - #if defined(X_MAX_PIN) && X_MAX_PIN > -1 - bool x_max_endstop=(READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING); - if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ - endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; - endstop_x_hit=true; - step_events_completed = current_block->step_event_count; - } - old_x_max_endstop = x_max_endstop; - #endif - } - } - } - - #ifndef COREXY - if ((out_bits & (1< -1 - bool y_min_endstop=(READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING); - if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { - endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; - endstop_y_hit=true; - step_events_completed = current_block->step_event_count; - } - old_y_min_endstop = y_min_endstop; - #endif - } - } - else { // +direction - CHECK_ENDSTOPS - { - #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 - bool y_max_endstop=(READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING); - if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ - endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; - endstop_y_hit=true; - step_events_completed = current_block->step_event_count; - } - old_y_max_endstop = y_max_endstop; - #endif - } - } - - if ((out_bits & (1< -1 - bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); - if(z_min_endstop && old_z_min_endstop && (current_block->steps_z > 0)) { - 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 - } - } - else { // +direction - WRITE(Z_DIR_PIN,!INVERT_Z_DIR); - - #ifdef Z_DUAL_STEPPER_DRIVERS - WRITE(Z2_DIR_PIN,!INVERT_Z_DIR); - #endif - - count_direction[Z_AXIS]=1; - CHECK_ENDSTOPS - { - #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 - bool z_max_endstop=(READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING); - if(z_max_endstop && old_z_max_endstop && (current_block->steps_z > 0)) { - endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; - endstop_z_hit=true; - step_events_completed = current_block->step_event_count; - } - old_z_max_endstop = z_max_endstop; - #endif - } - } - - // 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 - - if ((out_bits & (1 << E_AXIS)) != 0) - { // -direction - //AKU -#ifdef SNMM - if (snmm_extruder == 0 || snmm_extruder == 2) - { - NORM_E_DIR(); - } - else - { - REV_E_DIR(); - } -#else - REV_E_DIR(); -#endif // SNMM - count_direction[E_AXIS] = -1; - } - else - { // +direction -#ifdef SNMM - if (snmm_extruder == 0 || snmm_extruder == 2) - { - REV_E_DIR(); - } - else - { - NORM_E_DIR(); - } -#else - NORM_E_DIR(); -#endif // SNMM - count_direction[E_AXIS] = 1; - } - - for(uint8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves) - #ifndef AT90USB - MSerial.checkRx(); // Check for serial chars. - #endif - - #ifdef LIN_ADVANCE - counter_e += current_block->steps_e; - if (counter_e > 0) { - counter_e -= current_block->step_event_count; - count_position[E_AXIS] += count_direction[E_AXIS]; - ((out_bits&(1<steps_x; - if (counter_x > 0) { - WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); - counter_x -= current_block->step_event_count; - count_position[X_AXIS]+=count_direction[X_AXIS]; - WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); - } - - counter_y += current_block->steps_y; - if (counter_y > 0) { - WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN); - - #ifdef Y_DUAL_STEPPER_DRIVERS - WRITE(Y2_STEP_PIN, !INVERT_Y_STEP_PIN); - #endif - - counter_y -= current_block->step_event_count; - count_position[Y_AXIS]+=count_direction[Y_AXIS]; - WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); - - #ifdef Y_DUAL_STEPPER_DRIVERS - WRITE(Y2_STEP_PIN, INVERT_Y_STEP_PIN); - #endif - } - - counter_z += current_block->steps_z; - if (counter_z > 0) { - WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN); - - #ifdef Z_DUAL_STEPPER_DRIVERS - WRITE(Z2_STEP_PIN, !INVERT_Z_STEP_PIN); - #endif - - counter_z -= current_block->step_event_count; - count_position[Z_AXIS]+=count_direction[Z_AXIS]; - WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); - - #ifdef Z_DUAL_STEPPER_DRIVERS - WRITE(Z2_STEP_PIN, INVERT_Z_STEP_PIN); - #endif - } - - #ifndef LIN_ADVANCE - counter_e += current_block->steps_e; - if (counter_e > 0) { - WRITE_E_STEP(!INVERT_E_STEP_PIN); - counter_e -= current_block->step_event_count; - count_position[E_AXIS]+=count_direction[E_AXIS]; - WRITE_E_STEP(INVERT_E_STEP_PIN); - } - #endif - step_events_completed += 1; - if(step_events_completed >= current_block->step_event_count) break; - } - - #ifdef LIN_ADVANCE - if (current_block->use_advance_lead) { - const int delta_adv_steps = current_estep_rate - current_adv_steps; - current_adv_steps += delta_adv_steps; - e_steps += delta_adv_steps; - } - // If we have esteps to execute, fire the next advance_isr "now" - if (e_steps) nextAdvanceISR = 0; - #endif - - // Calculare new timer value - unsigned short timer; - unsigned short step_rate; - if (step_events_completed <= (unsigned long int)current_block->accelerate_until) { - // v = t * a -> acc_step_rate = acceleration_time * current_block->acceleration_rate - MultiU24X24toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); - acc_step_rate += current_block->initial_rate; - - // upper limit - if(acc_step_rate > current_block->nominal_rate) - acc_step_rate = current_block->nominal_rate; - - // step_rate to timer interval - timer = calc_timer(acc_step_rate); - _NEXT_ISR(timer); - acceleration_time += timer; - - #ifdef LIN_ADVANCE - if (current_block->use_advance_lead) { - current_estep_rate = ((uint32_t)acc_step_rate * current_block->abs_adv_steps_multiplier8) >> 17; - } - eISR_Rate = ADV_RATE(timer, step_loops); - #endif - } - else if (step_events_completed > (unsigned long int)current_block->decelerate_after) { - MultiU24X24toH16(step_rate, deceleration_time, current_block->acceleration_rate); - - if(step_rate > acc_step_rate) { // Check step_rate stays positive - step_rate = current_block->final_rate; - } - else { - step_rate = acc_step_rate - step_rate; // Decelerate from aceleration end point. - } - - // lower limit - if(step_rate < current_block->final_rate) - step_rate = current_block->final_rate; - - // step_rate to timer interval - timer = calc_timer(step_rate); - _NEXT_ISR(timer); - deceleration_time += timer; - - #ifdef LIN_ADVANCE - if (current_block->use_advance_lead) { - current_estep_rate = ((uint32_t)step_rate * current_block->abs_adv_steps_multiplier8) >> 17; - } - eISR_Rate = ADV_RATE(timer, step_loops); - #endif - } - else { - #ifdef LIN_ADVANCE - if (current_block->use_advance_lead) - current_estep_rate = final_estep_rate; - - eISR_Rate = ADV_RATE(OCR1A_nominal, step_loops_nominal); - #endif - - _NEXT_ISR(OCR1A_nominal); - // ensure we're running at the correct step rate, even if we just came off an acceleration - step_loops = step_loops_nominal; - } - - // If current block is finished, reset pointer - if (step_events_completed >= current_block->step_event_count) { - current_block = NULL; - plan_discard_current_block(); - } - } -} - -#ifdef LIN_ADVANCE - - // Timer interrupt for E. e_steps is set in the main routine. - - void advance_isr() { - - nextAdvanceISR = eISR_Rate; - - if (e_steps) { - bool dir = - #ifdef SNMM - ((e_steps < 0) == (snmm_extruder & 1)) - #else - (e_steps < 0) - #endif - ? INVERT_E0_DIR : !INVERT_E0_DIR; //If we have SNMM, reverse every second extruder. - WRITE(E0_DIR_PIN, dir); - - for (uint8_t i = step_loops; e_steps && i--;) { - WRITE(E0_STEP_PIN, !INVERT_E_STEP_PIN); - e_steps < 0 ? ++e_steps : --e_steps; - WRITE(E0_STEP_PIN, INVERT_E_STEP_PIN); - } - } - } - - void advance_isr_scheduler() { - // Run main stepping ISR if flagged - if (!nextMainISR) isr(); - - // Run Advance stepping ISR if flagged - if (!nextAdvanceISR) advance_isr(); - - // Is the next advance ISR scheduled before the next main ISR? - if (nextAdvanceISR <= nextMainISR) { - // Set up the next interrupt - OCR1A = nextAdvanceISR; - // New interval for the next main ISR - if (nextMainISR) nextMainISR -= nextAdvanceISR; - // Will call Stepper::advance_isr on the next interrupt - nextAdvanceISR = 0; - } - else { - // The next main ISR comes first - OCR1A = nextMainISR; - // New interval for the next advance ISR, if any - if (nextAdvanceISR && nextAdvanceISR != ADV_NEVER) - nextAdvanceISR -= nextMainISR; - // Will call Stepper::isr on the next interrupt - nextMainISR = 0; - } - - // Don't run the ISR faster than possible - if (OCR1A < TCNT1 + 16) OCR1A = TCNT1 + 16; - } - - void clear_current_adv_vars() { - e_steps = 0; //Should be already 0 at an filament change event, but just to be sure.. - current_adv_steps = 0; - } - -#endif // LIN_ADVANCE - -void st_init() -{ - digipot_init(); //Initialize Digipot Motor Current - microstep_init(); //Initialize Microstepping Pins - - //Initialize Dir Pins - #if defined(X_DIR_PIN) && X_DIR_PIN > -1 - SET_OUTPUT(X_DIR_PIN); - #endif - #if defined(X2_DIR_PIN) && X2_DIR_PIN > -1 - SET_OUTPUT(X2_DIR_PIN); - #endif - #if defined(Y_DIR_PIN) && Y_DIR_PIN > -1 - SET_OUTPUT(Y_DIR_PIN); - - #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_DIR_PIN) && (Y2_DIR_PIN > -1) - SET_OUTPUT(Y2_DIR_PIN); - #endif - #endif - #if defined(Z_DIR_PIN) && Z_DIR_PIN > -1 - SET_OUTPUT(Z_DIR_PIN); - - #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_DIR_PIN) && (Z2_DIR_PIN > -1) - SET_OUTPUT(Z2_DIR_PIN); - #endif - #endif - #if defined(E0_DIR_PIN) && E0_DIR_PIN > -1 - SET_OUTPUT(E0_DIR_PIN); - #endif - #if defined(E1_DIR_PIN) && (E1_DIR_PIN > -1) - SET_OUTPUT(E1_DIR_PIN); - #endif - #if defined(E2_DIR_PIN) && (E2_DIR_PIN > -1) - SET_OUTPUT(E2_DIR_PIN); - #endif - - //Initialize Enable Pins - steppers default to disabled. - - #if defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1 - SET_OUTPUT(X_ENABLE_PIN); - if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH); - #endif - #if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1 - SET_OUTPUT(X2_ENABLE_PIN); - if(!X_ENABLE_ON) WRITE(X2_ENABLE_PIN,HIGH); - #endif - #if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1 - SET_OUTPUT(Y_ENABLE_PIN); - if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH); - - #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_ENABLE_PIN) && (Y2_ENABLE_PIN > -1) - SET_OUTPUT(Y2_ENABLE_PIN); - if(!Y_ENABLE_ON) WRITE(Y2_ENABLE_PIN,HIGH); - #endif - #endif - #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1 - SET_OUTPUT(Z_ENABLE_PIN); - if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH); - - #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_ENABLE_PIN) && (Z2_ENABLE_PIN > -1) - SET_OUTPUT(Z2_ENABLE_PIN); - if(!Z_ENABLE_ON) WRITE(Z2_ENABLE_PIN,HIGH); - #endif - #endif - #if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1) - SET_OUTPUT(E0_ENABLE_PIN); - if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH); - #endif - #if defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1) - SET_OUTPUT(E1_ENABLE_PIN); - if(!E_ENABLE_ON) WRITE(E1_ENABLE_PIN,HIGH); - #endif - #if defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1) - SET_OUTPUT(E2_ENABLE_PIN); - if(!E_ENABLE_ON) WRITE(E2_ENABLE_PIN,HIGH); - #endif - - //endstops and pullups - - #if defined(X_MIN_PIN) && X_MIN_PIN > -1 - SET_INPUT(X_MIN_PIN); - #ifdef ENDSTOPPULLUP_XMIN - WRITE(X_MIN_PIN,HIGH); - #endif - #endif - - #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 - SET_INPUT(Y_MIN_PIN); - #ifdef ENDSTOPPULLUP_YMIN - WRITE(Y_MIN_PIN,HIGH); - #endif - #endif - - #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 - SET_INPUT(Z_MIN_PIN); - #ifdef ENDSTOPPULLUP_ZMIN - WRITE(Z_MIN_PIN,HIGH); - #endif - #endif - - #if defined(X_MAX_PIN) && X_MAX_PIN > -1 - SET_INPUT(X_MAX_PIN); - #ifdef ENDSTOPPULLUP_XMAX - WRITE(X_MAX_PIN,HIGH); - #endif - #endif - - #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 - SET_INPUT(Y_MAX_PIN); - #ifdef ENDSTOPPULLUP_YMAX - WRITE(Y_MAX_PIN,HIGH); - #endif - #endif - - #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 - SET_INPUT(Z_MAX_PIN); - #ifdef ENDSTOPPULLUP_ZMAX - WRITE(Z_MAX_PIN,HIGH); - #endif - #endif - - - //Initialize Step Pins - #if defined(X_STEP_PIN) && (X_STEP_PIN > -1) - SET_OUTPUT(X_STEP_PIN); - WRITE(X_STEP_PIN,INVERT_X_STEP_PIN); - disable_x(); - #endif - #if defined(X2_STEP_PIN) && (X2_STEP_PIN > -1) - SET_OUTPUT(X2_STEP_PIN); - WRITE(X2_STEP_PIN,INVERT_X_STEP_PIN); - disable_x(); - #endif - #if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1) - SET_OUTPUT(Y_STEP_PIN); - WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN); - #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_STEP_PIN) && (Y2_STEP_PIN > -1) - SET_OUTPUT(Y2_STEP_PIN); - WRITE(Y2_STEP_PIN,INVERT_Y_STEP_PIN); - #endif - disable_y(); - #endif - #if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) - SET_OUTPUT(Z_STEP_PIN); - WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN); - #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_STEP_PIN) && (Z2_STEP_PIN > -1) - SET_OUTPUT(Z2_STEP_PIN); - WRITE(Z2_STEP_PIN,INVERT_Z_STEP_PIN); - #endif - disable_z(); - #endif - #if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1) - SET_OUTPUT(E0_STEP_PIN); - WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN); - disable_e0(); - #endif - #if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1) - SET_OUTPUT(E1_STEP_PIN); - WRITE(E1_STEP_PIN,INVERT_E_STEP_PIN); - disable_e1(); - #endif - #if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1) - SET_OUTPUT(E2_STEP_PIN); - WRITE(E2_STEP_PIN,INVERT_E_STEP_PIN); - disable_e2(); - #endif - - // waveform generation = 0100 = CTC - TCCR1B &= ~(1< -1 - digitalWrite(DIGIPOTSS_PIN,LOW); // take the SS pin low to select the chip - SPI.transfer(address); // send in the address and value via SPI: - SPI.transfer(value); - digitalWrite(DIGIPOTSS_PIN,HIGH); // take the SS pin high to de-select the chip: - //delay(10); - #endif -} - -void EEPROM_read_st(int pos, uint8_t* value, uint8_t size) -{ - do - { - *value = eeprom_read_byte((unsigned char*)pos); - pos++; - value++; - }while(--size); -} - - -void digipot_init() //Initialize Digipot Motor Current -{ - - EEPROM_read_st(EEPROM_SILENT,(uint8_t*)&SilentMode,sizeof(SilentMode)); - - #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 - if(SilentMode == 0){ - const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT_LOUD; - }else{ - const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; - } - SPI.begin(); - pinMode(DIGIPOTSS_PIN, OUTPUT); - for(int i=0;i<=4;i++) - //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); - digipot_current(i,digipot_motor_current[i]); - #endif - #ifdef MOTOR_CURRENT_PWM_XY_PIN - pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT); - pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT); - pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT); - if((SilentMode == 0) || (farm_mode) ){ - - motor_current_setting[0] = motor_current_setting_loud[0]; - motor_current_setting[1] = motor_current_setting_loud[1]; - motor_current_setting[2] = motor_current_setting_loud[2]; - - }else{ - - motor_current_setting[0] = motor_current_setting_silent[0]; - motor_current_setting[1] = motor_current_setting_silent[1]; - motor_current_setting[2] = motor_current_setting_silent[2]; - - } - digipot_current(0, motor_current_setting[0]); - digipot_current(1, motor_current_setting[1]); - digipot_current(2, motor_current_setting[2]); - //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) - TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50); - #endif -} - - - - -void digipot_current(uint8_t driver, int current) -{ - #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 - const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; - digitalPotWrite(digipot_ch[driver], current); - #endif - #ifdef MOTOR_CURRENT_PWM_XY_PIN - if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); - if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); - if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); - #endif -} - -void microstep_init() -{ - const uint8_t microstep_modes[] = MICROSTEP_MODES; - - #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 - pinMode(E1_MS1_PIN,OUTPUT); - pinMode(E1_MS2_PIN,OUTPUT); - #endif - - #if defined(X_MS1_PIN) && X_MS1_PIN > -1 - pinMode(X_MS1_PIN,OUTPUT); - pinMode(X_MS2_PIN,OUTPUT); - pinMode(Y_MS1_PIN,OUTPUT); - pinMode(Y_MS2_PIN,OUTPUT); - pinMode(Z_MS1_PIN,OUTPUT); - pinMode(Z_MS2_PIN,OUTPUT); - pinMode(E0_MS1_PIN,OUTPUT); - pinMode(E0_MS2_PIN,OUTPUT); - for(int i=0;i<=4;i++) microstep_mode(i,microstep_modes[i]); - #endif -} - -void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) -{ - if(ms1 > -1) switch(driver) - { - case 0: digitalWrite( X_MS1_PIN,ms1); break; - case 1: digitalWrite( Y_MS1_PIN,ms1); break; - case 2: digitalWrite( Z_MS1_PIN,ms1); break; - case 3: digitalWrite(E0_MS1_PIN,ms1); break; - #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 - case 4: digitalWrite(E1_MS1_PIN,ms1); break; - #endif - } - if(ms2 > -1) switch(driver) - { - case 0: digitalWrite( X_MS2_PIN,ms2); break; - case 1: digitalWrite( Y_MS2_PIN,ms2); break; - case 2: digitalWrite( Z_MS2_PIN,ms2); break; - case 3: digitalWrite(E0_MS2_PIN,ms2); break; - #if defined(E1_MS2_PIN) && E1_MS2_PIN > -1 - case 4: digitalWrite(E1_MS2_PIN,ms2); break; - #endif - } -} - -void microstep_mode(uint8_t driver, uint8_t stepping_mode) -{ - switch(stepping_mode) - { - case 1: microstep_ms(driver,MICROSTEP1); break; - case 2: microstep_ms(driver,MICROSTEP2); break; - case 4: microstep_ms(driver,MICROSTEP4); break; - case 8: microstep_ms(driver,MICROSTEP8); break; - case 16: microstep_ms(driver,MICROSTEP16); break; - } -} - -void microstep_readings() -{ - SERIAL_PROTOCOLPGM("MS1,MS2 Pins\n"); - SERIAL_PROTOCOLPGM("X: "); - SERIAL_PROTOCOL( digitalRead(X_MS1_PIN)); - SERIAL_PROTOCOLLN( digitalRead(X_MS2_PIN)); - SERIAL_PROTOCOLPGM("Y: "); - SERIAL_PROTOCOL( digitalRead(Y_MS1_PIN)); - SERIAL_PROTOCOLLN( digitalRead(Y_MS2_PIN)); - SERIAL_PROTOCOLPGM("Z: "); - SERIAL_PROTOCOL( digitalRead(Z_MS1_PIN)); - SERIAL_PROTOCOLLN( digitalRead(Z_MS2_PIN)); - SERIAL_PROTOCOLPGM("E0: "); - SERIAL_PROTOCOL( digitalRead(E0_MS1_PIN)); - SERIAL_PROTOCOLLN( digitalRead(E0_MS2_PIN)); - #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 - SERIAL_PROTOCOLPGM("E1: "); - SERIAL_PROTOCOL( digitalRead(E1_MS1_PIN)); - SERIAL_PROTOCOLLN( digitalRead(E1_MS2_PIN)); - #endif -} - +/* + stepper.c - stepper motor driver: executes motion plans using stepper motors + Part of Grbl + + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +/* The timer calculations of this module informed by the 'RepRap cartesian firmware' by Zack Smith + and Philipp Tiefenbacher. */ + +#include "Marlin.h" +#include "stepper.h" +#include "planner.h" +#include "temperature.h" +#include "ultralcd.h" +#include "language.h" +#include "cardreader.h" +#include "speed_lookuptable.h" +#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 +#include +#endif + + +//=========================================================================== +//=============================public variables ============================ +//=========================================================================== +block_t *current_block; // A pointer to the block currently being traced + + +//=========================================================================== +//=============================private variables ============================ +//=========================================================================== +//static makes it inpossible to be called from outside of this file by extern.! + +// Variables used by The Stepper Driver Interrupt +static unsigned char out_bits; // The next stepping-bits to be output +static int32_t counter_x, // Counter variables for the bresenham line tracer + counter_y, + counter_z, + counter_e; +volatile static uint32_t step_events_completed; // The number of step events executed in the current block +static int32_t acceleration_time, deceleration_time; +//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate; +static uint16_t acc_step_rate; // needed for deccelaration start point +static uint8_t step_loops; +static uint16_t OCR1A_nominal; +static uint8_t step_loops_nominal; + +volatile long endstops_trigsteps[3]={0,0,0}; +volatile long endstops_stepsTotal,endstops_stepsDone; +static volatile bool endstop_x_hit=false; +static volatile bool endstop_y_hit=false; +static volatile bool endstop_z_hit=false; +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED +bool abort_on_endstop_hit = false; +#endif +#ifdef MOTOR_CURRENT_PWM_XY_PIN + int motor_current_setting[3] = DEFAULT_PWM_MOTOR_CURRENT; + int motor_current_setting_silent[3] = DEFAULT_PWM_MOTOR_CURRENT; + int motor_current_setting_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD; +#endif + +static bool old_x_min_endstop=false; +static bool old_x_max_endstop=false; +static bool old_y_min_endstop=false; +static bool old_y_max_endstop=false; +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; + +volatile long count_position[NUM_AXIS] = { 0, 0, 0, 0}; +volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1}; + +//=========================================================================== +//=============================functions ============================ +//=========================================================================== + +#define CHECK_ENDSTOPS if(check_endstops) + +// intRes = intIn1 * intIn2 >> 16 +// uses: +// r26 to store 0 +// r27 to store the byte 1 of the 24 bit result +#define MultiU16X8toH16(intRes, charIn1, intIn2) \ +asm volatile ( \ +"clr r26 \n\t" \ +"mul %A1, %B2 \n\t" \ +"movw %A0, r0 \n\t" \ +"mul %A1, %A2 \n\t" \ +"add %A0, r1 \n\t" \ +"adc %B0, r26 \n\t" \ +"lsr r0 \n\t" \ +"adc %A0, r26 \n\t" \ +"adc %B0, r26 \n\t" \ +"clr r1 \n\t" \ +: \ +"=&r" (intRes) \ +: \ +"d" (charIn1), \ +"d" (intIn2) \ +: \ +"r26" \ +) + +// intRes = longIn1 * longIn2 >> 24 +// uses: +// r26 to store 0 +// r27 to store the byte 1 of the 48bit result +#define MultiU24X24toH16(intRes, longIn1, longIn2) \ +asm volatile ( \ +"clr r26 \n\t" \ +"mul %A1, %B2 \n\t" \ +"mov r27, r1 \n\t" \ +"mul %B1, %C2 \n\t" \ +"movw %A0, r0 \n\t" \ +"mul %C1, %C2 \n\t" \ +"add %B0, r0 \n\t" \ +"mul %C1, %B2 \n\t" \ +"add %A0, r0 \n\t" \ +"adc %B0, r1 \n\t" \ +"mul %A1, %C2 \n\t" \ +"add r27, r0 \n\t" \ +"adc %A0, r1 \n\t" \ +"adc %B0, r26 \n\t" \ +"mul %B1, %B2 \n\t" \ +"add r27, r0 \n\t" \ +"adc %A0, r1 \n\t" \ +"adc %B0, r26 \n\t" \ +"mul %C1, %A2 \n\t" \ +"add r27, r0 \n\t" \ +"adc %A0, r1 \n\t" \ +"adc %B0, r26 \n\t" \ +"mul %B1, %A2 \n\t" \ +"add r27, r1 \n\t" \ +"adc %A0, r26 \n\t" \ +"adc %B0, r26 \n\t" \ +"lsr r27 \n\t" \ +"adc %A0, r26 \n\t" \ +"adc %B0, r26 \n\t" \ +"clr r1 \n\t" \ +: \ +"=&r" (intRes) \ +: \ +"d" (longIn1), \ +"d" (longIn2) \ +: \ +"r26" , "r27" \ +) + +// Some useful constants + +#define ENABLE_STEPPER_DRIVER_INTERRUPT() TIMSK1 |= (1< +// +// The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates +// first block->accelerate_until step_events_completed, then keeps going at constant speed until +// step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. +// The slope of acceleration is calculated with the leib ramp alghorithm. + +void st_wake_up() { + // TCNT1 = 0; + ENABLE_STEPPER_DRIVER_INTERRUPT(); +} + +void step_wait(){ + for(int8_t i=0; i < 6; i++){ + } +} + + +FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { + unsigned short timer; + if(step_rate > MAX_STEP_FREQUENCY) step_rate = MAX_STEP_FREQUENCY; + + if(step_rate > 20000) { // If steprate > 20kHz >> step 4 times + step_rate = (step_rate >> 2)&0x3fff; + step_loops = 4; + } + else if(step_rate > 10000) { // If steprate > 10kHz >> step 2 times + step_rate = (step_rate >> 1)&0x7fff; + step_loops = 2; + } + else { + step_loops = 1; + } + + if(step_rate < (F_CPU/500000)) step_rate = (F_CPU/500000); + step_rate -= (F_CPU/500000); // Correct for minimal speed + if(step_rate >= (8*256)){ // higher step rate + unsigned short table_address = (unsigned short)&speed_lookuptable_fast[(unsigned char)(step_rate>>8)][0]; + unsigned char tmp_step_rate = (step_rate & 0x00ff); + unsigned short gain = (unsigned short)pgm_read_word_near(table_address+2); + MultiU16X8toH16(timer, tmp_step_rate, gain); + timer = (unsigned short)pgm_read_word_near(table_address) - timer; + } + else { // lower step rates + unsigned short table_address = (unsigned short)&speed_lookuptable_slow[0][0]; + table_address += ((step_rate)>>1) & 0xfffc; + timer = (unsigned short)pgm_read_word_near(table_address); + timer -= (((unsigned short)pgm_read_word_near(table_address+2) * (unsigned char)(step_rate & 0x0007))>>3); + } + if(timer < 100) { timer = 100; MYSERIAL.print(MSG_STEPPER_TOO_HIGH); MYSERIAL.println(step_rate); }//(20kHz this should never happen) + return timer; +} + +// Initializes the trapezoid generator from the current block. Called whenever a new +// block begins. +FORCE_INLINE void trapezoid_generator_reset() { + deceleration_time = 0; + // step_rate to timer interval + OCR1A_nominal = calc_timer(current_block->nominal_rate); + // make a note of the number of step loops required at nominal speed + step_loops_nominal = step_loops; + acc_step_rate = current_block->initial_rate; + acceleration_time = calc_timer(acc_step_rate); + OCR1A = acceleration_time; + +// SERIAL_ECHO_START; +// SERIAL_ECHOPGM("advance :"); +// SERIAL_ECHO(current_block->advance/256.0); +// SERIAL_ECHOPGM("advance rate :"); +// SERIAL_ECHO(current_block->advance_rate/256.0); +// SERIAL_ECHOPGM("initial advance :"); +// SERIAL_ECHO(current_block->initial_advance/256.0); +// SERIAL_ECHOPGM("final advance :"); +// SERIAL_ECHOLN(current_block->final_advance/256.0); + +} + +// "The Stepper Driver Interrupt" - This timer interrupt is the workhorse. +// It pops blocks from the block_buffer and executes them by pulsing the stepper pins appropriately. +ISR(TIMER1_COMPA_vect) +{ + // If there is no current block, attempt to pop one from the buffer + if (current_block == NULL) { + // Anything in the buffer? + current_block = plan_get_current_block(); + if (current_block != NULL) { + // The busy flag is set by the plan_get_current_block() call. + // current_block->busy = true; + trapezoid_generator_reset(); + counter_x = -(current_block->step_event_count >> 1); + counter_y = counter_x; + counter_z = counter_x; + counter_e = counter_x; + step_events_completed = 0; + + #ifdef Z_LATE_ENABLE + if(current_block->steps_z > 0) { + enable_z(); + OCR1A = 2000; //1ms wait + return; + } + #endif + } + else { + OCR1A=2000; // 1kHz. + } + } + + if (current_block != NULL) { + // Set directions TO DO This should be done once during init of trapezoid. Endstops -> interrupt + out_bits = current_block->direction_bits; + + + // Set the direction bits (X_AXIS=A_AXIS and Y_AXIS=B_AXIS for COREXY) + if((out_bits & (1< -1 + bool x_min_endstop=(READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING); + if(x_min_endstop && old_x_min_endstop && (current_block->steps_x > 0)) { + endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; + endstop_x_hit=true; + step_events_completed = current_block->step_event_count; + } + old_x_min_endstop = x_min_endstop; + #endif + } + } + } + else { // +direction + CHECK_ENDSTOPS + { + { + #if defined(X_MAX_PIN) && X_MAX_PIN > -1 + bool x_max_endstop=(READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING); + if(x_max_endstop && old_x_max_endstop && (current_block->steps_x > 0)){ + endstops_trigsteps[X_AXIS] = count_position[X_AXIS]; + endstop_x_hit=true; + step_events_completed = current_block->step_event_count; + } + old_x_max_endstop = x_max_endstop; + #endif + } + } + } + + #ifndef COREXY + if ((out_bits & (1< -1 + bool y_min_endstop=(READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING); + if(y_min_endstop && old_y_min_endstop && (current_block->steps_y > 0)) { + endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; + endstop_y_hit=true; + step_events_completed = current_block->step_event_count; + } + old_y_min_endstop = y_min_endstop; + #endif + } + } + else { // +direction + CHECK_ENDSTOPS + { + #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 + bool y_max_endstop=(READ(Y_MAX_PIN) != Y_MAX_ENDSTOP_INVERTING); + if(y_max_endstop && old_y_max_endstop && (current_block->steps_y > 0)){ + endstops_trigsteps[Y_AXIS] = count_position[Y_AXIS]; + endstop_y_hit=true; + step_events_completed = current_block->step_event_count; + } + old_y_max_endstop = y_max_endstop; + #endif + } + } + + if ((out_bits & (1< -1 + bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING); + if(z_min_endstop && old_z_min_endstop && (current_block->steps_z > 0)) { + 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 + } + } + else { // +direction + WRITE(Z_DIR_PIN,!INVERT_Z_DIR); + + #ifdef Z_DUAL_STEPPER_DRIVERS + WRITE(Z2_DIR_PIN,!INVERT_Z_DIR); + #endif + + count_direction[Z_AXIS]=1; + CHECK_ENDSTOPS + { + #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 + bool z_max_endstop=(READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING); + if(z_max_endstop && old_z_max_endstop && (current_block->steps_z > 0)) { + endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS]; + endstop_z_hit=true; + step_events_completed = current_block->step_event_count; + } + old_z_max_endstop = z_max_endstop; + #endif + } + } + + // 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 + + if ((out_bits & (1 << E_AXIS)) != 0) + { // -direction + //AKU +#ifdef SNMM + if (snmm_extruder == 0 || snmm_extruder == 2) + { + NORM_E_DIR(); + } + else + { + REV_E_DIR(); + } +#else + REV_E_DIR(); +#endif // SNMM + count_direction[E_AXIS] = -1; + } + else + { // +direction +#ifdef SNMM + if (snmm_extruder == 0 || snmm_extruder == 2) + { + REV_E_DIR(); + } + else + { + NORM_E_DIR(); + } +#else + NORM_E_DIR(); +#endif // SNMM + count_direction[E_AXIS] = 1; + } + + for(uint8_t i=0; i < step_loops; i++) { // Take multiple steps per interrupt (For high speed moves) + #ifndef AT90USB + MSerial.checkRx(); // Check for serial chars. + #endif + + counter_x += current_block->steps_x; + if (counter_x > 0) { + WRITE(X_STEP_PIN, !INVERT_X_STEP_PIN); + counter_x -= current_block->step_event_count; + count_position[X_AXIS]+=count_direction[X_AXIS]; + WRITE(X_STEP_PIN, INVERT_X_STEP_PIN); + } + + counter_y += current_block->steps_y; + if (counter_y > 0) { + WRITE(Y_STEP_PIN, !INVERT_Y_STEP_PIN); + + #ifdef Y_DUAL_STEPPER_DRIVERS + WRITE(Y2_STEP_PIN, !INVERT_Y_STEP_PIN); + #endif + + counter_y -= current_block->step_event_count; + count_position[Y_AXIS]+=count_direction[Y_AXIS]; + WRITE(Y_STEP_PIN, INVERT_Y_STEP_PIN); + + #ifdef Y_DUAL_STEPPER_DRIVERS + WRITE(Y2_STEP_PIN, INVERT_Y_STEP_PIN); + #endif + } + + counter_z += current_block->steps_z; + if (counter_z > 0) { + WRITE(Z_STEP_PIN, !INVERT_Z_STEP_PIN); + + #ifdef Z_DUAL_STEPPER_DRIVERS + WRITE(Z2_STEP_PIN, !INVERT_Z_STEP_PIN); + #endif + + counter_z -= current_block->step_event_count; + count_position[Z_AXIS]+=count_direction[Z_AXIS]; + WRITE(Z_STEP_PIN, INVERT_Z_STEP_PIN); + + #ifdef Z_DUAL_STEPPER_DRIVERS + WRITE(Z2_STEP_PIN, INVERT_Z_STEP_PIN); + #endif + } + + counter_e += current_block->steps_e; + if (counter_e > 0) { + WRITE_E_STEP(!INVERT_E_STEP_PIN); + counter_e -= current_block->step_event_count; + count_position[E_AXIS]+=count_direction[E_AXIS]; + WRITE_E_STEP(INVERT_E_STEP_PIN); + } + step_events_completed += 1; + if(step_events_completed >= current_block->step_event_count) break; + } + // Calculare new timer value + unsigned short timer; + unsigned short step_rate; + if (step_events_completed <= (unsigned long int)current_block->accelerate_until) { + // v = t * a -> acc_step_rate = acceleration_time * current_block->acceleration_rate + MultiU24X24toH16(acc_step_rate, acceleration_time, current_block->acceleration_rate); + acc_step_rate += current_block->initial_rate; + + // upper limit + if(acc_step_rate > current_block->nominal_rate) + acc_step_rate = current_block->nominal_rate; + + // step_rate to timer interval + timer = calc_timer(acc_step_rate); + OCR1A = timer; + acceleration_time += timer; + } + else if (step_events_completed > (unsigned long int)current_block->decelerate_after) { + MultiU24X24toH16(step_rate, deceleration_time, current_block->acceleration_rate); + + if(step_rate > acc_step_rate) { // Check step_rate stays positive + step_rate = current_block->final_rate; + } + else { + step_rate = acc_step_rate - step_rate; // Decelerate from aceleration end point. + } + + // lower limit + if(step_rate < current_block->final_rate) + step_rate = current_block->final_rate; + + // step_rate to timer interval + timer = calc_timer(step_rate); + OCR1A = timer; + deceleration_time += timer; + } + else { + OCR1A = OCR1A_nominal; + // ensure we're running at the correct step rate, even if we just came off an acceleration + step_loops = step_loops_nominal; + } + + // If current block is finished, reset pointer + if (step_events_completed >= current_block->step_event_count) { + current_block = NULL; + plan_discard_current_block(); + } + } +} + +void st_init() +{ + digipot_init(); //Initialize Digipot Motor Current + microstep_init(); //Initialize Microstepping Pins + + //Initialize Dir Pins + #if defined(X_DIR_PIN) && X_DIR_PIN > -1 + SET_OUTPUT(X_DIR_PIN); + #endif + #if defined(X2_DIR_PIN) && X2_DIR_PIN > -1 + SET_OUTPUT(X2_DIR_PIN); + #endif + #if defined(Y_DIR_PIN) && Y_DIR_PIN > -1 + SET_OUTPUT(Y_DIR_PIN); + + #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_DIR_PIN) && (Y2_DIR_PIN > -1) + SET_OUTPUT(Y2_DIR_PIN); + #endif + #endif + #if defined(Z_DIR_PIN) && Z_DIR_PIN > -1 + SET_OUTPUT(Z_DIR_PIN); + + #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_DIR_PIN) && (Z2_DIR_PIN > -1) + SET_OUTPUT(Z2_DIR_PIN); + #endif + #endif + #if defined(E0_DIR_PIN) && E0_DIR_PIN > -1 + SET_OUTPUT(E0_DIR_PIN); + #endif + #if defined(E1_DIR_PIN) && (E1_DIR_PIN > -1) + SET_OUTPUT(E1_DIR_PIN); + #endif + #if defined(E2_DIR_PIN) && (E2_DIR_PIN > -1) + SET_OUTPUT(E2_DIR_PIN); + #endif + + //Initialize Enable Pins - steppers default to disabled. + + #if defined(X_ENABLE_PIN) && X_ENABLE_PIN > -1 + SET_OUTPUT(X_ENABLE_PIN); + if(!X_ENABLE_ON) WRITE(X_ENABLE_PIN,HIGH); + #endif + #if defined(X2_ENABLE_PIN) && X2_ENABLE_PIN > -1 + SET_OUTPUT(X2_ENABLE_PIN); + if(!X_ENABLE_ON) WRITE(X2_ENABLE_PIN,HIGH); + #endif + #if defined(Y_ENABLE_PIN) && Y_ENABLE_PIN > -1 + SET_OUTPUT(Y_ENABLE_PIN); + if(!Y_ENABLE_ON) WRITE(Y_ENABLE_PIN,HIGH); + + #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_ENABLE_PIN) && (Y2_ENABLE_PIN > -1) + SET_OUTPUT(Y2_ENABLE_PIN); + if(!Y_ENABLE_ON) WRITE(Y2_ENABLE_PIN,HIGH); + #endif + #endif + #if defined(Z_ENABLE_PIN) && Z_ENABLE_PIN > -1 + SET_OUTPUT(Z_ENABLE_PIN); + if(!Z_ENABLE_ON) WRITE(Z_ENABLE_PIN,HIGH); + + #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_ENABLE_PIN) && (Z2_ENABLE_PIN > -1) + SET_OUTPUT(Z2_ENABLE_PIN); + if(!Z_ENABLE_ON) WRITE(Z2_ENABLE_PIN,HIGH); + #endif + #endif + #if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1) + SET_OUTPUT(E0_ENABLE_PIN); + if(!E_ENABLE_ON) WRITE(E0_ENABLE_PIN,HIGH); + #endif + #if defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1) + SET_OUTPUT(E1_ENABLE_PIN); + if(!E_ENABLE_ON) WRITE(E1_ENABLE_PIN,HIGH); + #endif + #if defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1) + SET_OUTPUT(E2_ENABLE_PIN); + if(!E_ENABLE_ON) WRITE(E2_ENABLE_PIN,HIGH); + #endif + + //endstops and pullups + + #if defined(X_MIN_PIN) && X_MIN_PIN > -1 + SET_INPUT(X_MIN_PIN); + #ifdef ENDSTOPPULLUP_XMIN + WRITE(X_MIN_PIN,HIGH); + #endif + #endif + + #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 + SET_INPUT(Y_MIN_PIN); + #ifdef ENDSTOPPULLUP_YMIN + WRITE(Y_MIN_PIN,HIGH); + #endif + #endif + + #if defined(Z_MIN_PIN) && Z_MIN_PIN > -1 + SET_INPUT(Z_MIN_PIN); + #ifdef ENDSTOPPULLUP_ZMIN + WRITE(Z_MIN_PIN,HIGH); + #endif + #endif + + #if defined(X_MAX_PIN) && X_MAX_PIN > -1 + SET_INPUT(X_MAX_PIN); + #ifdef ENDSTOPPULLUP_XMAX + WRITE(X_MAX_PIN,HIGH); + #endif + #endif + + #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 + SET_INPUT(Y_MAX_PIN); + #ifdef ENDSTOPPULLUP_YMAX + WRITE(Y_MAX_PIN,HIGH); + #endif + #endif + + #if defined(Z_MAX_PIN) && Z_MAX_PIN > -1 + SET_INPUT(Z_MAX_PIN); + #ifdef ENDSTOPPULLUP_ZMAX + WRITE(Z_MAX_PIN,HIGH); + #endif + #endif + + + //Initialize Step Pins + #if defined(X_STEP_PIN) && (X_STEP_PIN > -1) + SET_OUTPUT(X_STEP_PIN); + WRITE(X_STEP_PIN,INVERT_X_STEP_PIN); + disable_x(); + #endif + #if defined(X2_STEP_PIN) && (X2_STEP_PIN > -1) + SET_OUTPUT(X2_STEP_PIN); + WRITE(X2_STEP_PIN,INVERT_X_STEP_PIN); + disable_x(); + #endif + #if defined(Y_STEP_PIN) && (Y_STEP_PIN > -1) + SET_OUTPUT(Y_STEP_PIN); + WRITE(Y_STEP_PIN,INVERT_Y_STEP_PIN); + #if defined(Y_DUAL_STEPPER_DRIVERS) && defined(Y2_STEP_PIN) && (Y2_STEP_PIN > -1) + SET_OUTPUT(Y2_STEP_PIN); + WRITE(Y2_STEP_PIN,INVERT_Y_STEP_PIN); + #endif + disable_y(); + #endif + #if defined(Z_STEP_PIN) && (Z_STEP_PIN > -1) + SET_OUTPUT(Z_STEP_PIN); + WRITE(Z_STEP_PIN,INVERT_Z_STEP_PIN); + #if defined(Z_DUAL_STEPPER_DRIVERS) && defined(Z2_STEP_PIN) && (Z2_STEP_PIN > -1) + SET_OUTPUT(Z2_STEP_PIN); + WRITE(Z2_STEP_PIN,INVERT_Z_STEP_PIN); + #endif + disable_z(); + #endif + #if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1) + SET_OUTPUT(E0_STEP_PIN); + WRITE(E0_STEP_PIN,INVERT_E_STEP_PIN); + disable_e0(); + #endif + #if defined(E1_STEP_PIN) && (E1_STEP_PIN > -1) + SET_OUTPUT(E1_STEP_PIN); + WRITE(E1_STEP_PIN,INVERT_E_STEP_PIN); + disable_e1(); + #endif + #if defined(E2_STEP_PIN) && (E2_STEP_PIN > -1) + SET_OUTPUT(E2_STEP_PIN); + WRITE(E2_STEP_PIN,INVERT_E_STEP_PIN); + disable_e2(); + #endif + + // waveform generation = 0100 = CTC + TCCR1B &= ~(1< -1 + digitalWrite(DIGIPOTSS_PIN,LOW); // take the SS pin low to select the chip + SPI.transfer(address); // send in the address and value via SPI: + SPI.transfer(value); + digitalWrite(DIGIPOTSS_PIN,HIGH); // take the SS pin high to de-select the chip: + //delay(10); + #endif +} + +void EEPROM_read_st(int pos, uint8_t* value, uint8_t size) +{ + do + { + *value = eeprom_read_byte((unsigned char*)pos); + pos++; + value++; + }while(--size); +} + + +void digipot_init() //Initialize Digipot Motor Current +{ + + EEPROM_read_st(EEPROM_SILENT,(uint8_t*)&SilentMode,sizeof(SilentMode)); + + #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 + if(SilentMode == 0){ + const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT_LOUD; + }else{ + const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; + } + SPI.begin(); + pinMode(DIGIPOTSS_PIN, OUTPUT); + for(int i=0;i<=4;i++) + //digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); + digipot_current(i,digipot_motor_current[i]); + #endif + #ifdef MOTOR_CURRENT_PWM_XY_PIN + pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT); + pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT); + pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT); + if((SilentMode == 0) || (farm_mode) ){ + + motor_current_setting[0] = motor_current_setting_loud[0]; + motor_current_setting[1] = motor_current_setting_loud[1]; + motor_current_setting[2] = motor_current_setting_loud[2]; + + }else{ + + motor_current_setting[0] = motor_current_setting_silent[0]; + motor_current_setting[1] = motor_current_setting_silent[1]; + motor_current_setting[2] = motor_current_setting_silent[2]; + + } + digipot_current(0, motor_current_setting[0]); + digipot_current(1, motor_current_setting[1]); + digipot_current(2, motor_current_setting[2]); + //Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise) + TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50); + #endif +} + + + + +void digipot_current(uint8_t driver, int current) +{ + #if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1 + const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; + digitalPotWrite(digipot_ch[driver], current); + #endif + #ifdef MOTOR_CURRENT_PWM_XY_PIN + if (driver == 0) analogWrite(MOTOR_CURRENT_PWM_XY_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); + if (driver == 1) analogWrite(MOTOR_CURRENT_PWM_Z_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); + if (driver == 2) analogWrite(MOTOR_CURRENT_PWM_E_PIN, (long)current * 255L / (long)MOTOR_CURRENT_PWM_RANGE); + #endif +} + +void microstep_init() +{ + const uint8_t microstep_modes[] = MICROSTEP_MODES; + + #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 + pinMode(E1_MS1_PIN,OUTPUT); + pinMode(E1_MS2_PIN,OUTPUT); + #endif + + #if defined(X_MS1_PIN) && X_MS1_PIN > -1 + pinMode(X_MS1_PIN,OUTPUT); + pinMode(X_MS2_PIN,OUTPUT); + pinMode(Y_MS1_PIN,OUTPUT); + pinMode(Y_MS2_PIN,OUTPUT); + pinMode(Z_MS1_PIN,OUTPUT); + pinMode(Z_MS2_PIN,OUTPUT); + pinMode(E0_MS1_PIN,OUTPUT); + pinMode(E0_MS2_PIN,OUTPUT); + for(int i=0;i<=4;i++) microstep_mode(i,microstep_modes[i]); + #endif +} + +void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) +{ + if(ms1 > -1) switch(driver) + { + case 0: digitalWrite( X_MS1_PIN,ms1); break; + case 1: digitalWrite( Y_MS1_PIN,ms1); break; + case 2: digitalWrite( Z_MS1_PIN,ms1); break; + case 3: digitalWrite(E0_MS1_PIN,ms1); break; + #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 + case 4: digitalWrite(E1_MS1_PIN,ms1); break; + #endif + } + if(ms2 > -1) switch(driver) + { + case 0: digitalWrite( X_MS2_PIN,ms2); break; + case 1: digitalWrite( Y_MS2_PIN,ms2); break; + case 2: digitalWrite( Z_MS2_PIN,ms2); break; + case 3: digitalWrite(E0_MS2_PIN,ms2); break; + #if defined(E1_MS2_PIN) && E1_MS2_PIN > -1 + case 4: digitalWrite(E1_MS2_PIN,ms2); break; + #endif + } +} + +void microstep_mode(uint8_t driver, uint8_t stepping_mode) +{ + switch(stepping_mode) + { + case 1: microstep_ms(driver,MICROSTEP1); break; + case 2: microstep_ms(driver,MICROSTEP2); break; + case 4: microstep_ms(driver,MICROSTEP4); break; + case 8: microstep_ms(driver,MICROSTEP8); break; + case 16: microstep_ms(driver,MICROSTEP16); break; + } +} + +void microstep_readings() +{ + SERIAL_PROTOCOLPGM("MS1,MS2 Pins\n"); + SERIAL_PROTOCOLPGM("X: "); + SERIAL_PROTOCOL( digitalRead(X_MS1_PIN)); + SERIAL_PROTOCOLLN( digitalRead(X_MS2_PIN)); + SERIAL_PROTOCOLPGM("Y: "); + SERIAL_PROTOCOL( digitalRead(Y_MS1_PIN)); + SERIAL_PROTOCOLLN( digitalRead(Y_MS2_PIN)); + SERIAL_PROTOCOLPGM("Z: "); + SERIAL_PROTOCOL( digitalRead(Z_MS1_PIN)); + SERIAL_PROTOCOLLN( digitalRead(Z_MS2_PIN)); + SERIAL_PROTOCOLPGM("E0: "); + SERIAL_PROTOCOL( digitalRead(E0_MS1_PIN)); + SERIAL_PROTOCOLLN( digitalRead(E0_MS2_PIN)); + #if defined(E1_MS1_PIN) && E1_MS1_PIN > -1 + SERIAL_PROTOCOLPGM("E1: "); + SERIAL_PROTOCOL( digitalRead(E1_MS1_PIN)); + SERIAL_PROTOCOLLN( digitalRead(E1_MS2_PIN)); + #endif +} + diff --git a/Firmware/stepper.h b/Firmware/stepper.h index 3427f12fa..c89521441 100644 --- a/Firmware/stepper.h +++ b/Firmware/stepper.h @@ -1,107 +1,97 @@ -/* - stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors - Part of Grbl - - Copyright (c) 2009-2011 Simen Svale Skogsrud - - Grbl is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Grbl is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Grbl. If not, see . -*/ - -#ifndef stepper_h -#define stepper_h - -#include "planner.h" - -#if EXTRUDERS > 2 - #define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}} - #define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, !INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}} - #define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}} -#elif EXTRUDERS > 1 - #define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }} - #define NORM_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }} - #define REV_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }} -#else - #define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v) - #define NORM_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR) - #define REV_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR) -#endif - -#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED -extern bool abort_on_endstop_hit; -#endif - -// Initialize and start the stepper motor subsystem -void st_init(); - -// Interrupt Service Routines - -void isr(); - -#ifdef LIN_ADVANCE - void advance_isr(); - void advance_isr_scheduler(); - void clear_current_adv_vars(); //Used to reset the built up pretension and remaining esteps on filament change. -#endif - -// Block until all buffered steps are executed -void st_synchronize(); - -// Set current position in steps -void st_set_position(const long &x, const long &y, const long &z, const long &e); -void st_set_e_position(const long &e); - -// Get current position in steps -long st_get_position(uint8_t axis); - - -// Get current position in mm -float st_get_position_mm(uint8_t axis); - - -// The stepper subsystem goes to sleep when it runs out of things to execute. Call this -// to notify the subsystem that it is time to go to work. -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 -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(); - - -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 - -void finishAndDisableSteppers(); - -extern block_t *current_block; // A pointer to the block currently being traced - -void quickStop(); - -void digitalPotWrite(int address, int value); -void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2); -void microstep_mode(uint8_t driver, uint8_t stepping); -void digipot_init(); -void digipot_current(uint8_t driver, int current); -void microstep_init(); -void microstep_readings(); - -#ifdef BABYSTEPPING - void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention -#endif - - - -#endif +/* + stepper.h - stepper motor driver: executes motion plans of planner.c using the stepper motors + Part of Grbl + + Copyright (c) 2009-2011 Simen Svale Skogsrud + + Grbl is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Grbl is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Grbl. If not, see . +*/ + +#ifndef stepper_h +#define stepper_h + +#include "planner.h" + +#if EXTRUDERS > 2 + #define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}} + #define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, !INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}} + #define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}} +#elif EXTRUDERS > 1 + #define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }} + #define NORM_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }} + #define REV_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }} +#else + #define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v) + #define NORM_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR) + #define REV_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR) +#endif + +#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED +extern bool abort_on_endstop_hit; +#endif + +// Initialize and start the stepper motor subsystem +void st_init(); + +// Block until all buffered steps are executed +void st_synchronize(); + +// Set current position in steps +void st_set_position(const long &x, const long &y, const long &z, const long &e); +void st_set_e_position(const long &e); + +// Get current position in steps +long st_get_position(uint8_t axis); + + +// Get current position in mm +float st_get_position_mm(uint8_t axis); + + +// The stepper subsystem goes to sleep when it runs out of things to execute. Call this +// to notify the subsystem that it is time to go to work. +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 +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(); + + +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 + +void finishAndDisableSteppers(); + +extern block_t *current_block; // A pointer to the block currently being traced + +void quickStop(); + +void digitalPotWrite(int address, int value); +void microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2); +void microstep_mode(uint8_t driver, uint8_t stepping); +void digipot_init(); +void digipot_current(uint8_t driver, int current); +void microstep_init(); +void microstep_readings(); + +#ifdef BABYSTEPPING + void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention +#endif + + + +#endif diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 479c146c2..cd4f0aba9 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4051,7 +4051,6 @@ void lcd_sdcard_stop() lcd_return_to_status(); lcd_ignore_click(true); - lcd_commands_type = LCD_COMMAND_STOP_PRINT; // Turn off the print fan @@ -4902,9 +4901,6 @@ static void menu_action_sdfile(const char* filename, char* longFilename) for (c = &cmd[4]; *c; c++) *c = tolower(*c); enquecommand(cmd); - for (int i = 0; i < 8; i++) { - eeprom_write_byte((uint8_t*)EEPROM_FILENAME+i, filename[i]); - } enquecommand_P(PSTR("M24")); lcd_return_to_status(); } diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index f68e2e45c..eded03b36 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -1,1371 +1,1370 @@ -#ifndef ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H -#define ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H - - -int scrollstuff = 0; -char longFilenameOLD[LONG_FILENAME_LENGTH]; - -#include "Configuration_prusa.h" -#include "Marlin.h" -/** -* Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays. -* When selecting the Russian language, a slightly different LCD implementation is used to handle UTF8 characters. -**/ - -#ifndef REPRAPWORLD_KEYPAD -extern volatile uint8_t buttons; //the last checked buttons in a bit array. -#else -extern volatile uint16_t buttons; //an extended version of the last checked buttons in a bit array. -#endif - -//////////////////////////////////// -// Setup button and encode mappings for each panel (into 'buttons' variable -// -// This is just to map common functions (across different panels) onto the same -// macro name. The mapping is independent of whether the button is directly connected or -// via a shift/i2c register. - -#ifdef ULTIPANEL -// All UltiPanels might have an encoder - so this is always be mapped onto first two bits -#define BLEN_B 1 -#define BLEN_A 0 - -#define EN_B (1< -1 - // encoder click is directly connected - #define BLEN_C 2 - #define EN_C (1< -1 - // the pause/stop/restart button is connected to BTN_ENC when used - #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name - #define LCD_CLICKED (buttons&(B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop. - #else - #define LCD_CLICKED (buttons&(B_MI|B_RI)) - #endif - - // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update - #define LCD_HAS_SLOW_BUTTONS - -#elif defined(LCD_I2C_PANELOLU2) - // encoder click can be read through I2C if not directly connected - #if BTN_ENC <= 0 - #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) - - #define B_MI (PANELOLU2_ENCODER_C< - #include - #include - #define LCD_CLASS LiquidCrystal_I2C - LCD_CLASS lcd(LCD_I2C_ADDRESS,LCD_I2C_PIN_EN,LCD_I2C_PIN_RW,LCD_I2C_PIN_RS,LCD_I2C_PIN_D4,LCD_I2C_PIN_D5,LCD_I2C_PIN_D6,LCD_I2C_PIN_D7); - -#elif defined(LCD_I2C_TYPE_MCP23017) - //for the LED indicators (which maybe mapped to different things in lcd_implementation_update_indicators()) - #define LED_A 0x04 //100 - #define LED_B 0x02 //010 - #define LED_C 0x01 //001 - - #define LCD_HAS_STATUS_INDICATORS - - #include - #include - #define LCD_CLASS LiquidTWI2 - #if defined(DETECT_DEVICE) - LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); - #else - LCD_CLASS lcd(LCD_I2C_ADDRESS); - #endif - -#elif defined(LCD_I2C_TYPE_MCP23008) - #include - #include - #define LCD_CLASS LiquidTWI2 - #if defined(DETECT_DEVICE) - LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); - #else - LCD_CLASS lcd(LCD_I2C_ADDRESS); - #endif - -#elif defined(LCD_I2C_TYPE_PCA8574) - #include - #define LCD_CLASS LiquidCrystal_I2C - LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); - -// 2 wire Non-latching LCD SR from: -// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection -#elif defined(SR_LCD_2W_NL) - - extern "C" void __cxa_pure_virtual() { while (1); } - #include - #include - #define LCD_CLASS LiquidCrystal_SR - LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); - -#else - // Standard directly connected LCD implementations - #ifdef LANGUAGE_RU - #include "LiquidCrystalRus.h" - #define LCD_CLASS LiquidCrystalRus - #else - #include "LiquidCrystal.h" - #define LCD_CLASS LiquidCrystal - #endif - LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 -#endif - -#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - static uint16_t progressBarTick = 0; - #if PROGRESS_MSG_EXPIRE > 0 - static uint16_t messageTick = 0; - #endif - #define LCD_STR_PROGRESS "\x03\x04\x05" -#endif - -/* Custom characters defined in the first 8 characters of the LCD */ -#define LCD_STR_BEDTEMP "\x00" -#define LCD_STR_DEGREE "\x01" -#define LCD_STR_THERMOMETER "\x02" -#define LCD_STR_UPLEVEL "\x03" -#define LCD_STR_REFRESH "\x04" -#define LCD_STR_FOLDER "\x05" -#define LCD_STR_FEEDRATE "\x06" -#define LCD_STR_CLOCK "\x07" -#define LCD_STR_ARROW_UP "\x0B" -#define LCD_STR_ARROW_DOWN "\x01" -#define LCD_STR_ARROW_RIGHT "\x7E" /* from the default character set */ - -static void lcd_set_custom_characters( - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - bool progress_bar_set=true - #endif -) { - byte bedTemp[8] = { - B00000, - B11111, - B10101, - B10001, - B10101, - B11111, - B00000, - B00000 - }; //thanks Sonny Mounicou - byte degree[8] = { - B01100, - B10010, - B10010, - B01100, - B00000, - B00000, - B00000, - B00000 - }; - byte thermometer[8] = { - B00100, - B01010, - B01010, - B01010, - B01010, - B10001, - B10001, - B01110 - }; - byte uplevel[8] = { - B00100, - B01110, - B11111, - B00100, - B11100, - B00000, - B00000, - B00000 - }; //thanks joris - byte refresh[8] = { - B00000, - B00110, - B11001, - B11000, - B00011, - B10011, - B01100, - B00000, - }; //thanks joris - byte folder[8] = { - B00000, - B11100, - B11111, - B10001, - B10001, - B11111, - B00000, - B00000 - }; //thanks joris - #ifdef LANGUAGE_EN_H - byte feedrate[8] = { - B11100, - B10000, - B11000, - B10111, - B00101, - B00110, - B00101, - B00000 - }; //thanks Sonny Mounicou - #else - /* - byte feedrate[8] = { - B11100, - B10100, - B11000, - B10100, - B00000, - B00111, - B00010, - B00010 - }; - */ - /* - byte feedrate[8] = { - B01100, - B10011, - B00000, - B01100, - B10011, - B00000, - B01100, - B10011 - }; - */ - byte feedrate[8] = { - B00000, - B00100, - B10010, - B01001, - B10010, - B00100, - B00000, - B00000 - }; - #endif - - byte clock[8] = { - B00000, - B01110, - B10011, - B10101, - B10001, - B01110, - B00000, - B00000 - }; //thanks Sonny Mounicou - - byte arrup[8] = { - B00100, - B01110, - B11111, - B00000, - B00000, - B00000, - B00000, - B00000 - }; - - byte arrdown[8] = { - B00000, - B00000, - B00000, - B00000, - B00000, - B10001, - B01010, - B00100 - }; - - - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - static bool char_mode = false; - byte progress[3][8] = { { - B00000, - B10000, - B10000, - B10000, - B10000, - B10000, - B10000, - B00000 - }, { - B00000, - B10100, - B10100, - B10100, - B10100, - B10100, - B10100, - B00000 - }, { - B00000, - B10101, - B10101, - B10101, - B10101, - B10101, - B10101, - B00000 - } }; - if (progress_bar_set != char_mode) { - char_mode = progress_bar_set; - lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp); - lcd.createChar(LCD_STR_DEGREE[0], degree); - lcd.createChar(LCD_STR_THERMOMETER[0], thermometer); - lcd.createChar(LCD_STR_FEEDRATE[0], feedrate); - lcd.createChar(LCD_STR_CLOCK[0], clock); - if (progress_bar_set) { - // Progress bar characters for info screen - for (int i=3; i--;) lcd.createChar(LCD_STR_PROGRESS[i], progress[i]); - } - else { - // Custom characters for submenus - lcd.createChar(LCD_STR_UPLEVEL[0], uplevel); - lcd.createChar(LCD_STR_REFRESH[0], refresh); - lcd.createChar(LCD_STR_FOLDER[0], folder); - } - } - #else - lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp); - lcd.createChar(LCD_STR_DEGREE[0], degree); - lcd.createChar(LCD_STR_THERMOMETER[0], thermometer); - lcd.createChar(LCD_STR_UPLEVEL[0], uplevel); - lcd.createChar(LCD_STR_REFRESH[0], refresh); - lcd.createChar(LCD_STR_FOLDER[0], folder); - lcd.createChar(LCD_STR_FEEDRATE[0], feedrate); - lcd.createChar(LCD_STR_CLOCK[0], clock); - //lcd.createChar(LCD_STR_ARROW_UP[0], arrup); - //lcd.createChar(LCD_STR_ARROW_DOWN[0], arrdown); - #endif -} - -void lcd_set_custom_characters_arrows() - { - - byte arrdown[8] = { - B00000, - B00000, - B00000, - B00000, - B00000, - B10001, - B01010, - B00100 - }; - - lcd.createChar(1, arrdown); -} - -void lcd_set_custom_characters_nextpage() - { - - byte arrdown[8] = { - B00000, - B00000, - B10001, - B01010, - B00100, - B10001, - B01010, - B00100 - }; - - lcd.createChar(1, arrdown); -} - -void lcd_set_custom_characters_degree() - { - byte degree[8] = { - B01100, - B10010, - B10010, - B01100, - B00000, - B00000, - B00000, - B00000 - }; - - lcd.createChar(1, degree); -} - - -static void lcd_implementation_init( - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - bool progress_bar_set=true - #endif -) { - -#if defined(LCD_I2C_TYPE_PCF8575) - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - #ifdef LCD_I2C_PIN_BL - lcd.setBacklightPin(LCD_I2C_PIN_BL,POSITIVE); - lcd.setBacklight(HIGH); - #endif - -#elif defined(LCD_I2C_TYPE_MCP23017) - lcd.setMCPType(LTI_TYPE_MCP23017); - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - lcd.setBacklight(0); //set all the LEDs off to begin with - -#elif defined(LCD_I2C_TYPE_MCP23008) - lcd.setMCPType(LTI_TYPE_MCP23008); - lcd.begin(LCD_WIDTH, LCD_HEIGHT); - -#elif defined(LCD_I2C_TYPE_PCA8574) - lcd.init(); - lcd.backlight(); - -#else - lcd.begin(LCD_WIDTH, LCD_HEIGHT); -#endif - - lcd_set_custom_characters( - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - progress_bar_set - #endif - ); - - lcd.clear(); -} - - -static void lcd_implementation_init_noclear( - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - bool progress_bar_set=true - #endif -) { - -#if defined(LCD_I2C_TYPE_PCF8575) - lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); - #ifdef LCD_I2C_PIN_BL - lcd.setBacklightPin(LCD_I2C_PIN_BL,POSITIVE); - lcd.setBacklight(HIGH); - #endif - -#elif defined(LCD_I2C_TYPE_MCP23017) - lcd.setMCPType(LTI_TYPE_MCP23017); - lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); - lcd.setBacklight(0); //set all the LEDs off to begin with - -#elif defined(LCD_I2C_TYPE_MCP23008) - lcd.setMCPType(LTI_TYPE_MCP23008); - lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); - -#elif defined(LCD_I2C_TYPE_PCA8574) - lcd.init(); - lcd.backlight(); - -#else - lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); -#endif - - lcd_set_custom_characters( - #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) - progress_bar_set - #endif - ); - - -} - - -static void lcd_implementation_nodisplay() -{ - lcd.noDisplay(); -} -static void lcd_implementation_display() -{ - lcd.display(); -} - -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 */ -void lcd_printPGM(const char* str) -{ - char c; - while((c = pgm_read_byte(str++)) != '\0') - { - 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_write(char c) -{ - 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| - |T 000/000D Z000.0 | - |B 000/000D F100% | - |SD100% T--:-- | - |Status line.........| -*/ -static void lcd_implementation_status_screen() -{ - - int tHotend=int(degHotend(0) + 0.5); - int tTarget=int(degTargetHotend(0) + 0.5); - - //Print the hotend temperature - lcd.setCursor(0, 0); - lcd.print(LCD_STR_THERMOMETER[0]); - lcd.print(itostr3(tHotend)); - lcd.print('/'); - lcd.print(itostr3left(tTarget)); - lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); - lcd_printPGM(PSTR(" ")); - - //Print the Z coordinates - lcd.setCursor(LCD_WIDTH - 8-2, 0); -#if 1 - lcd_printPGM(PSTR(" Z")); - if (custom_message_type == 1) { - // In a bed calibration mode. - lcd_printPGM(PSTR(" --- ")); - } else { - lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001)); - lcd.print(' '); - } -#else - lcd_printPGM(PSTR(" Queue:")); - lcd.print(int(moves_planned())); - lcd.print(' '); -#endif - - //Print the Bedtemperature - lcd.setCursor(0, 1); - tHotend=int(degBed() + 0.5); - tTarget=int(degTargetBed() + 0.5); - lcd.print(LCD_STR_BEDTEMP[0]); - lcd.print(itostr3(tHotend)); - lcd.print('/'); - lcd.print(itostr3left(tTarget)); - lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); - lcd_printPGM(PSTR(" ")); - -#if 1 - //Print Feedrate - lcd.setCursor(LCD_WIDTH - 8-2, 1); - lcd_printPGM(PSTR(" ")); - lcd.print(LCD_STR_FEEDRATE[0]); - lcd.print(itostr3(feedmultiply)); - lcd_printPGM(PSTR("% ")); -#else - //Print Feedrate - lcd.setCursor(LCD_WIDTH - 8-2, 1); - lcd.print(LCD_STR_FEEDRATE[0]); - lcd.print(itostr3(feedmultiply)); - lcd_printPGM(PSTR("% Q")); - { - uint8_t queue = planner_queue_min(); - if (queue < (BLOCK_BUFFER_SIZE >> 1)) { - lcd.print('!'); - } else { - lcd.print((char)(queue / 10) + '0'); - queue %= 10; - } - lcd.print((char)queue + '0'); - planner_queue_min_reset(); - } -#endif - - //Print SD status - lcd.setCursor(0, 2); - if (is_usb_printing) - { - lcd_printPGM(PSTR("--")); - } - else - { - lcd_printPGM(PSTR("SD")); - } - if (IS_SD_PRINTING) - { - lcd.print(itostr3(card.percentDone())); - card.get_sdpos(); - lcd.print('%'); - } - else - { - if (is_usb_printing) - { - lcd_printPGM(PSTR(">USB")); - } - else - { - lcd_printPGM(PSTR("---")); - lcd.print('%'); - } - } - - // Farm number display - if (farm_mode) - { - lcd_printPGM(PSTR(" F")); - lcd.print(farm_no); - lcd_printPGM(PSTR(" ")); - - // Beat display - lcd.setCursor(LCD_WIDTH - 1, 0); - if ( (millis() - kicktime) < 60000 ) { - - lcd_printPGM(PSTR("L")); - - }else{ - lcd_printPGM(PSTR(" ")); - } - - } - else { -#ifdef SNMM - lcd_printPGM(PSTR(" E")); - lcd.print(get_ext_nr() + 1); - -#else - lcd.setCursor(LCD_WIDTH - 8 - 2, 2); - lcd_printPGM(PSTR(" ")); -#endif - } - - - - //Print time elapsed - lcd.setCursor(LCD_WIDTH - 8 -1, 2); - lcd_printPGM(PSTR(" ")); - lcd.print(LCD_STR_CLOCK[0]); - if(starttime != 0) - { - uint16_t time = millis() / 60000 - starttime / 60000; - lcd.print(itostr2(time/60)); - lcd.print(':'); - lcd.print(itostr2(time%60)); - }else{ - lcd_printPGM(PSTR("--:--")); - } - lcd_printPGM(PSTR(" ")); - - - //Print status line - lcd.setCursor(0, 3); - - // If heating in progress, set flag - if (heating_status != 0) { custom_message = true; } - - // If printing from SD, show what we are printing - if ((IS_SD_PRINTING) && !custom_message) - { - - if(strcmp(longFilenameOLD, card.longFilename) != 0) - { - memset(longFilenameOLD,'\0',strlen(longFilenameOLD)); - sprintf_P(longFilenameOLD, PSTR("%s"), card.longFilename); - scrollstuff = 0; - } - - if(strlen(card.longFilename) > LCD_WIDTH) - { - - int inters = 0; - int gh = scrollstuff; - while( ((gh-scrollstuff) 13) - { - heating_status_counter = 0; - } - lcd.setCursor(7, 3); - lcd_printPGM(PSTR(" ")); - - for (int dots = 0; dots < heating_status_counter; dots++) - { - lcd.setCursor(7 + dots, 3); - lcd.print('.'); - } - - switch (heating_status) - { - case 1: - lcd.setCursor(0, 3); - lcd_printPGM(MSG_HEATING); - break; - case 2: - lcd.setCursor(0, 3); - lcd_printPGM(MSG_HEATING_COMPLETE); - heating_status = 0; - heating_status_counter = 0; - custom_message = false; - break; - case 3: - lcd.setCursor(0, 3); - lcd_printPGM(MSG_BED_HEATING); - break; - case 4: - lcd.setCursor(0, 3); - lcd_printPGM(MSG_BED_DONE); - heating_status = 0; - heating_status_counter = 0; - custom_message = false; - break; - default: - break; - } - } - - // If mesh bed leveling in progress, show the status - - if (custom_message_type == 1) - { - if (custom_message_state > 10) - { - lcd.setCursor(0, 3); - lcd_printPGM(PSTR(" ")); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_HOMEYZ_PROGRESS); - lcd_printPGM(PSTR(" : ")); - lcd.print(custom_message_state-10); - } - else - { - if (custom_message_state == 3) - { - lcd_printPGM(WELCOME_MSG); - lcd_setstatuspgm(WELCOME_MSG); - custom_message = false; - custom_message_type = 0; - } - if (custom_message_state > 3 && custom_message_state < 10 ) - { - lcd.setCursor(0, 3); - lcd_printPGM(PSTR(" ")); - lcd.setCursor(0, 3); - lcd_printPGM(MSG_HOMEYZ_DONE); - custom_message_state--; - } - if (custom_message_state == 10) - { - lcd_printPGM(MSG_HOMEYZ_DONE); - custom_message_state = 9; - } - } - - } - // If loading filament, print status - if (custom_message_type == 2) - { - lcd.print(lcd_status_message); - } - // PID tuning in progress - if (custom_message_type == 3) { - lcd.print(lcd_status_message); - if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) { - lcd.setCursor(15, 3); - lcd.print(itostr3(pid_cycle)); - - lcd.print('/'); - lcd.print(itostr3left(pid_number_of_cycles)); - } - } - // PINDA temp calibration in progress - if (custom_message_type == 4) { - char progress[4]; - lcd.setCursor(0, 3); - lcd_printPGM(MSG_TEMP_CALIBRATION); - lcd.setCursor(15, 3); - sprintf(progress, "%d/6", custom_message_state); - lcd.print(progress); - } - // temp compensation preheat - if (custom_message_type == 5) { - lcd.setCursor(0, 3); - lcd_printPGM(MSG_PINDA_PREHEAT); - if (custom_message_state <= PINDA_HEAT_T) { - lcd_printPGM(PSTR(": ")); - lcd.print(custom_message_state); //seconds - lcd.print(' '); - - } - } - - - } - else - { - // Nothing special, print status message normally - lcd.print(lcd_status_message); - } - } - - // Fill the rest of line to have nice and clean output - for(int fillspace = 0; fillspace<20;fillspace++) - { - if((lcd_status_message[fillspace] > 31 )) - { - } - else - { - lcd.print(' '); - } - } - -} - - -static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, char pre_char, char post_char) -{ - char c; - //Use all characters in narrow LCDs - #if LCD_WIDTH < 20 - uint8_t n = LCD_WIDTH - 1 - 1; - #else - uint8_t n = LCD_WIDTH - 1 - 2; - #endif - lcd.setCursor(0, row); - lcd.print(pre_char); - while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) - { - lcd.print(c); - pstr++; - n--; - } - while(n--) - lcd.print(' '); - lcd.print(post_char); - lcd.print(' '); -} - -static void lcd_implementation_drawmenu_generic_RAM(uint8_t row, const char* str, char pre_char, char post_char) -{ - char c; - //Use all characters in narrow LCDs - #if LCD_WIDTH < 20 - uint8_t n = LCD_WIDTH - 1 - 1; - #else - uint8_t n = LCD_WIDTH - 1 - 2; - #endif - lcd.setCursor(0, row); - lcd.print(pre_char); - while( ((c = *str) != '\0') && (n>0) ) - { - lcd.print(c); - str++; - n--; - } - while(n--) - lcd.print(' '); - lcd.print(post_char); - lcd.print(' '); -} - -static void lcd_implementation_drawmenu_setting_edit_generic(uint8_t row, const char* pstr, char pre_char, char* data) -{ - char c; - //Use all characters in narrow LCDs - #if LCD_WIDTH < 20 - uint8_t n = LCD_WIDTH - 1 - 1 - strlen(data); - #else - uint8_t n = LCD_WIDTH - 1 - 2 - strlen(data); - #endif - lcd.setCursor(0, row); - lcd.print(pre_char); - while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) - { - lcd.print(c); - pstr++; - n--; - } - lcd.print(':'); - while(n--) - lcd.print(' '); - lcd.print(data); -} -static void lcd_implementation_drawmenu_setting_edit_generic_P(uint8_t row, const char* pstr, char pre_char, const char* data) -{ - char c; - //Use all characters in narrow LCDs - #if LCD_WIDTH < 20 - uint8_t n = LCD_WIDTH - 1 - 1 - strlen_P(data); - #else - uint8_t n = LCD_WIDTH - 1 - 2 - strlen_P(data); - #endif - lcd.setCursor(0, row); - lcd.print(pre_char); - while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) - { - lcd.print(c); - pstr++; - n--; - } - lcd.print(':'); - while(n--) - lcd.print(' '); - lcd_printPGM(data); -} -#define lcd_implementation_drawmenu_setting_edit_int3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_int3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float32_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float32(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float43_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float43(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float52_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float52(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float51_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data))) -#define lcd_implementation_drawmenu_setting_edit_float51(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data))) -#define lcd_implementation_drawmenu_setting_edit_long5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_long5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_bool_selected(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) -#define lcd_implementation_drawmenu_setting_edit_bool(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) - -//Add version for callback functions -#define lcd_implementation_drawmenu_setting_edit_callback_int3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_int3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float32_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float32(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float43_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float43(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float52_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float52(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float51_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_float51(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_long5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_long5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) -#define lcd_implementation_drawmenu_setting_edit_callback_bool_selected(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) -#define lcd_implementation_drawmenu_setting_edit_callback_bool(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) - - -void lcd_implementation_drawedit(const char* pstr, char* value) -{ - lcd.setCursor(1, 1); - lcd_printPGM(pstr); - lcd.print(':'); - #if LCD_WIDTH < 20 - lcd.setCursor(LCD_WIDTH - strlen(value), 1); - #else - lcd.setCursor(LCD_WIDTH -1 - strlen(value), 1); - #endif - lcd.print(value); -} - -void lcd_implementation_drawedit_2(const char* pstr, char* value) -{ - lcd.setCursor(0, 1); - lcd_printPGM(pstr); - lcd.print(':'); - - lcd.setCursor((LCD_WIDTH - strlen(value))/2, 3); - - lcd.print(value); - lcd.print(" mm"); -} - -static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* pstr, const char* filename, char* longFilename) -{ - char c; - int enc_dif = encoderDiff; - uint8_t n = LCD_WIDTH - 1; - for(int g = 0; g<4;g++){ - lcd.setCursor(0, g); - lcd.print(' '); - } - - lcd.setCursor(0, row); - lcd.print('>'); - if (longFilename[0] != '\0') - { - - filename = longFilename; - //longFilename[LCD_WIDTH-1] = '\0'; - } - - int i = 1; - int j = 0; - int inter = 0; - char* longFilenameTMP = longFilename; - - while( ((c = *longFilenameTMP) != '\0') && (inter == 0) ) - { - - lcd.setCursor(i, row); - lcd.print(c); - i++; - longFilenameTMP++; - if(i==LCD_WIDTH){ - i=1; - j++; - longFilenameTMP = longFilename; - longFilenameTMP = longFilenameTMP+j; - n = LCD_WIDTH - 1; - for(int g = 0; ((g<300)&&(inter == 0)) ;g++){ - if(LCD_CLICKED || ( enc_dif != encoderDiff )){ - - // inter = 1; - }else{ - delay(1); - } - - } - } - - } - if(c!='\0'){ - lcd.setCursor(i, row); - lcd.print(c); - i++; - } - n=n-i+1; - while(n--) - lcd.print(' '); -} -static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* pstr, const char* filename, char* longFilename) -{ - char c; - uint8_t n = LCD_WIDTH - 1; - lcd.setCursor(0, row); - lcd.print(' '); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-1] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) - { - lcd.print(c); - filename++; - n--; - } - while(n--) - lcd.print(' '); -} -static void lcd_implementation_drawmenu_sddirectory_selected(uint8_t row, const char* pstr, const char* filename, char* longFilename) -{ - char c; - uint8_t n = LCD_WIDTH - 2; - lcd.setCursor(0, row); - lcd.print('>'); - lcd.print(LCD_STR_FOLDER[0]); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-2] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) - { - lcd.print(c); - filename++; - n--; - } - while(n--) - lcd.print(' '); -} -static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* pstr, const char* filename, char* longFilename) -{ - char c; - uint8_t n = LCD_WIDTH - 2; - lcd.setCursor(0, row); - lcd.print(' '); - lcd.print(LCD_STR_FOLDER[0]); - if (longFilename[0] != '\0') - { - filename = longFilename; - longFilename[LCD_WIDTH-2] = '\0'; - } - while( ((c = *filename) != '\0') && (n>0) ) - { - lcd.print(c); - filename++; - n--; - } - while(n--) - lcd.print(' '); -} -#define lcd_implementation_drawmenu_back_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) -#define lcd_implementation_drawmenu_back(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_UPLEVEL[0]) -#define lcd_implementation_drawmenu_back_RAM_selected(row, str, data) lcd_implementation_drawmenu_generic_RAM(row, str, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) -#define lcd_implementation_drawmenu_back_RAM(row, str, data) lcd_implementation_drawmenu_generic_RAM(row, str, ' ', LCD_STR_UPLEVEL[0]) -#define lcd_implementation_drawmenu_submenu_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', LCD_STR_ARROW_RIGHT[0]) -#define lcd_implementation_drawmenu_submenu(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_ARROW_RIGHT[0]) -#define lcd_implementation_drawmenu_gcode_selected(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') -#define lcd_implementation_drawmenu_gcode(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') -#define lcd_implementation_drawmenu_function_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') -#define lcd_implementation_drawmenu_function(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') -#define lcd_implementation_drawmenu_setlang_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') -#define lcd_implementation_drawmenu_setlang(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') - -static void lcd_implementation_quick_feedback() -{ -#ifdef LCD_USE_I2C_BUZZER - #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) - lcd_buzz(1000/6,100); - #else - lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS,LCD_FEEDBACK_FREQUENCY_HZ); - #endif -#elif defined(BEEPER) && BEEPER > -1 - SET_OUTPUT(BEEPER); - #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) - for(int8_t i=0;i<10;i++) - { - WRITE(BEEPER,HIGH); - delayMicroseconds(100); - WRITE(BEEPER,LOW); - delayMicroseconds(100); - } - #else - for(int8_t i=0;i<(LCD_FEEDBACK_FREQUENCY_DURATION_MS / (1000 / LCD_FEEDBACK_FREQUENCY_HZ));i++) - { - WRITE(BEEPER,HIGH); - delayMicroseconds(1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2); - WRITE(BEEPER,LOW); - delayMicroseconds(1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2); - } - #endif -#endif -} - -#ifdef LCD_HAS_STATUS_INDICATORS -static void lcd_implementation_update_indicators() -{ - #if defined(LCD_I2C_PANELOLU2) || defined(LCD_I2C_VIKI) - //set the LEDS - referred to as backlights by the LiquidTWI2 library - static uint8_t ledsprev = 0; - uint8_t leds = 0; - if (target_temperature_bed > 0) leds |= LED_A; - if (target_temperature[0] > 0) leds |= LED_B; - if (fanSpeed) leds |= LED_C; - #if EXTRUDERS > 1 - if (target_temperature[1] > 0) leds |= LED_C; - #endif - if (leds != ledsprev) { - lcd.setBacklight(leds); - ledsprev = leds; - } - #endif -} -#endif - -#ifdef LCD_HAS_SLOW_BUTTONS -extern uint32_t blocking_enc; - -static uint8_t lcd_implementation_read_slow_buttons() -{ - #ifdef LCD_I2C_TYPE_MCP23017 - uint8_t slow_buttons; - // Reading these buttons this is likely to be too slow to call inside interrupt context - // so they are called during normal lcd_update - slow_buttons = lcd.readButtons() << B_I2C_BTN_OFFSET; - #if defined(LCD_I2C_VIKI) - if(slow_buttons & (B_MI|B_RI)) { //LCD clicked - if(blocking_enc > millis()) { - slow_buttons &= ~(B_MI|B_RI); // Disable LCD clicked buttons if screen is updated - } - } - #endif - return slow_buttons; - #endif -} -#endif - -#endif//ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H +#ifndef ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H +#define ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H + + +int scrollstuff = 0; +char longFilenameOLD[LONG_FILENAME_LENGTH]; + +#include "Configuration_prusa.h" +#include "Marlin.h" +/** +* Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays. +* When selecting the Russian language, a slightly different LCD implementation is used to handle UTF8 characters. +**/ + +#ifndef REPRAPWORLD_KEYPAD +extern volatile uint8_t buttons; //the last checked buttons in a bit array. +#else +extern volatile uint16_t buttons; //an extended version of the last checked buttons in a bit array. +#endif + +//////////////////////////////////// +// Setup button and encode mappings for each panel (into 'buttons' variable +// +// This is just to map common functions (across different panels) onto the same +// macro name. The mapping is independent of whether the button is directly connected or +// via a shift/i2c register. + +#ifdef ULTIPANEL +// All UltiPanels might have an encoder - so this is always be mapped onto first two bits +#define BLEN_B 1 +#define BLEN_A 0 + +#define EN_B (1< -1 + // encoder click is directly connected + #define BLEN_C 2 + #define EN_C (1< -1 + // the pause/stop/restart button is connected to BTN_ENC when used + #define B_ST (EN_C) // Map the pause/stop/resume button into its normalized functional name + #define LCD_CLICKED (buttons&(B_MI|B_RI|B_ST)) // pause/stop button also acts as click until we implement proper pause/stop. + #else + #define LCD_CLICKED (buttons&(B_MI|B_RI)) + #endif + + // I2C buttons take too long to read inside an interrupt context and so we read them during lcd_update + #define LCD_HAS_SLOW_BUTTONS + +#elif defined(LCD_I2C_PANELOLU2) + // encoder click can be read through I2C if not directly connected + #if BTN_ENC <= 0 + #define B_I2C_BTN_OFFSET 3 // (the first three bit positions reserved for EN_A, EN_B, EN_C) + + #define B_MI (PANELOLU2_ENCODER_C< + #include + #include + #define LCD_CLASS LiquidCrystal_I2C + LCD_CLASS lcd(LCD_I2C_ADDRESS,LCD_I2C_PIN_EN,LCD_I2C_PIN_RW,LCD_I2C_PIN_RS,LCD_I2C_PIN_D4,LCD_I2C_PIN_D5,LCD_I2C_PIN_D6,LCD_I2C_PIN_D7); + +#elif defined(LCD_I2C_TYPE_MCP23017) + //for the LED indicators (which maybe mapped to different things in lcd_implementation_update_indicators()) + #define LED_A 0x04 //100 + #define LED_B 0x02 //010 + #define LED_C 0x01 //001 + + #define LCD_HAS_STATUS_INDICATORS + + #include + #include + #define LCD_CLASS LiquidTWI2 + #if defined(DETECT_DEVICE) + LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); + #else + LCD_CLASS lcd(LCD_I2C_ADDRESS); + #endif + +#elif defined(LCD_I2C_TYPE_MCP23008) + #include + #include + #define LCD_CLASS LiquidTWI2 + #if defined(DETECT_DEVICE) + LCD_CLASS lcd(LCD_I2C_ADDRESS, 1); + #else + LCD_CLASS lcd(LCD_I2C_ADDRESS); + #endif + +#elif defined(LCD_I2C_TYPE_PCA8574) + #include + #define LCD_CLASS LiquidCrystal_I2C + LCD_CLASS lcd(LCD_I2C_ADDRESS, LCD_WIDTH, LCD_HEIGHT); + +// 2 wire Non-latching LCD SR from: +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics#!shiftregister-connection +#elif defined(SR_LCD_2W_NL) + + extern "C" void __cxa_pure_virtual() { while (1); } + #include + #include + #define LCD_CLASS LiquidCrystal_SR + LCD_CLASS lcd(SR_DATA_PIN, SR_CLK_PIN); + +#else + // Standard directly connected LCD implementations + #ifdef LANGUAGE_RU + #include "LiquidCrystalRus.h" + #define LCD_CLASS LiquidCrystalRus + #else + #include "LiquidCrystal.h" + #define LCD_CLASS LiquidCrystal + #endif + LCD_CLASS lcd(LCD_PINS_RS, LCD_PINS_ENABLE, LCD_PINS_D4, LCD_PINS_D5,LCD_PINS_D6,LCD_PINS_D7); //RS,Enable,D4,D5,D6,D7 +#endif + +#if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + static uint16_t progressBarTick = 0; + #if PROGRESS_MSG_EXPIRE > 0 + static uint16_t messageTick = 0; + #endif + #define LCD_STR_PROGRESS "\x03\x04\x05" +#endif + +/* Custom characters defined in the first 8 characters of the LCD */ +#define LCD_STR_BEDTEMP "\x00" +#define LCD_STR_DEGREE "\x01" +#define LCD_STR_THERMOMETER "\x02" +#define LCD_STR_UPLEVEL "\x03" +#define LCD_STR_REFRESH "\x04" +#define LCD_STR_FOLDER "\x05" +#define LCD_STR_FEEDRATE "\x06" +#define LCD_STR_CLOCK "\x07" +#define LCD_STR_ARROW_UP "\x0B" +#define LCD_STR_ARROW_DOWN "\x01" +#define LCD_STR_ARROW_RIGHT "\x7E" /* from the default character set */ + +static void lcd_set_custom_characters( + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + bool progress_bar_set=true + #endif +) { + byte bedTemp[8] = { + B00000, + B11111, + B10101, + B10001, + B10101, + B11111, + B00000, + B00000 + }; //thanks Sonny Mounicou + byte degree[8] = { + B01100, + B10010, + B10010, + B01100, + B00000, + B00000, + B00000, + B00000 + }; + byte thermometer[8] = { + B00100, + B01010, + B01010, + B01010, + B01010, + B10001, + B10001, + B01110 + }; + byte uplevel[8] = { + B00100, + B01110, + B11111, + B00100, + B11100, + B00000, + B00000, + B00000 + }; //thanks joris + byte refresh[8] = { + B00000, + B00110, + B11001, + B11000, + B00011, + B10011, + B01100, + B00000, + }; //thanks joris + byte folder[8] = { + B00000, + B11100, + B11111, + B10001, + B10001, + B11111, + B00000, + B00000 + }; //thanks joris + #ifdef LANGUAGE_EN_H + byte feedrate[8] = { + B11100, + B10000, + B11000, + B10111, + B00101, + B00110, + B00101, + B00000 + }; //thanks Sonny Mounicou + #else + /* + byte feedrate[8] = { + B11100, + B10100, + B11000, + B10100, + B00000, + B00111, + B00010, + B00010 + }; + */ + /* + byte feedrate[8] = { + B01100, + B10011, + B00000, + B01100, + B10011, + B00000, + B01100, + B10011 + }; + */ + byte feedrate[8] = { + B00000, + B00100, + B10010, + B01001, + B10010, + B00100, + B00000, + B00000 + }; + #endif + + byte clock[8] = { + B00000, + B01110, + B10011, + B10101, + B10001, + B01110, + B00000, + B00000 + }; //thanks Sonny Mounicou + + byte arrup[8] = { + B00100, + B01110, + B11111, + B00000, + B00000, + B00000, + B00000, + B00000 + }; + + byte arrdown[8] = { + B00000, + B00000, + B00000, + B00000, + B00000, + B10001, + B01010, + B00100 + }; + + + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + static bool char_mode = false; + byte progress[3][8] = { { + B00000, + B10000, + B10000, + B10000, + B10000, + B10000, + B10000, + B00000 + }, { + B00000, + B10100, + B10100, + B10100, + B10100, + B10100, + B10100, + B00000 + }, { + B00000, + B10101, + B10101, + B10101, + B10101, + B10101, + B10101, + B00000 + } }; + if (progress_bar_set != char_mode) { + char_mode = progress_bar_set; + lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp); + lcd.createChar(LCD_STR_DEGREE[0], degree); + lcd.createChar(LCD_STR_THERMOMETER[0], thermometer); + lcd.createChar(LCD_STR_FEEDRATE[0], feedrate); + lcd.createChar(LCD_STR_CLOCK[0], clock); + if (progress_bar_set) { + // Progress bar characters for info screen + for (int i=3; i--;) lcd.createChar(LCD_STR_PROGRESS[i], progress[i]); + } + else { + // Custom characters for submenus + lcd.createChar(LCD_STR_UPLEVEL[0], uplevel); + lcd.createChar(LCD_STR_REFRESH[0], refresh); + lcd.createChar(LCD_STR_FOLDER[0], folder); + } + } + #else + lcd.createChar(LCD_STR_BEDTEMP[0], bedTemp); + lcd.createChar(LCD_STR_DEGREE[0], degree); + lcd.createChar(LCD_STR_THERMOMETER[0], thermometer); + lcd.createChar(LCD_STR_UPLEVEL[0], uplevel); + lcd.createChar(LCD_STR_REFRESH[0], refresh); + lcd.createChar(LCD_STR_FOLDER[0], folder); + lcd.createChar(LCD_STR_FEEDRATE[0], feedrate); + lcd.createChar(LCD_STR_CLOCK[0], clock); + //lcd.createChar(LCD_STR_ARROW_UP[0], arrup); + //lcd.createChar(LCD_STR_ARROW_DOWN[0], arrdown); + #endif +} + +void lcd_set_custom_characters_arrows() + { + + byte arrdown[8] = { + B00000, + B00000, + B00000, + B00000, + B00000, + B10001, + B01010, + B00100 + }; + + lcd.createChar(1, arrdown); +} + +void lcd_set_custom_characters_nextpage() + { + + byte arrdown[8] = { + B00000, + B00000, + B10001, + B01010, + B00100, + B10001, + B01010, + B00100 + }; + + lcd.createChar(1, arrdown); +} + +void lcd_set_custom_characters_degree() + { + byte degree[8] = { + B01100, + B10010, + B10010, + B01100, + B00000, + B00000, + B00000, + B00000 + }; + + lcd.createChar(1, degree); +} + + +static void lcd_implementation_init( + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + bool progress_bar_set=true + #endif +) { + +#if defined(LCD_I2C_TYPE_PCF8575) + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + #ifdef LCD_I2C_PIN_BL + lcd.setBacklightPin(LCD_I2C_PIN_BL,POSITIVE); + lcd.setBacklight(HIGH); + #endif + +#elif defined(LCD_I2C_TYPE_MCP23017) + lcd.setMCPType(LTI_TYPE_MCP23017); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + lcd.setBacklight(0); //set all the LEDs off to begin with + +#elif defined(LCD_I2C_TYPE_MCP23008) + lcd.setMCPType(LTI_TYPE_MCP23008); + lcd.begin(LCD_WIDTH, LCD_HEIGHT); + +#elif defined(LCD_I2C_TYPE_PCA8574) + lcd.init(); + lcd.backlight(); + +#else + lcd.begin(LCD_WIDTH, LCD_HEIGHT); +#endif + + lcd_set_custom_characters( + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + progress_bar_set + #endif + ); + + lcd.clear(); +} + + +static void lcd_implementation_init_noclear( + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + bool progress_bar_set=true + #endif +) { + +#if defined(LCD_I2C_TYPE_PCF8575) + lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); + #ifdef LCD_I2C_PIN_BL + lcd.setBacklightPin(LCD_I2C_PIN_BL,POSITIVE); + lcd.setBacklight(HIGH); + #endif + +#elif defined(LCD_I2C_TYPE_MCP23017) + lcd.setMCPType(LTI_TYPE_MCP23017); + lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); + lcd.setBacklight(0); //set all the LEDs off to begin with + +#elif defined(LCD_I2C_TYPE_MCP23008) + lcd.setMCPType(LTI_TYPE_MCP23008); + lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); + +#elif defined(LCD_I2C_TYPE_PCA8574) + lcd.init(); + lcd.backlight(); + +#else + lcd.begin_noclear(LCD_WIDTH, LCD_HEIGHT); +#endif + + lcd_set_custom_characters( + #if defined(LCD_PROGRESS_BAR) && defined(SDSUPPORT) + progress_bar_set + #endif + ); + + +} + + +static void lcd_implementation_nodisplay() +{ + lcd.noDisplay(); +} +static void lcd_implementation_display() +{ + lcd.display(); +} + +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 */ +void lcd_printPGM(const char* str) +{ + char c; + while((c = pgm_read_byte(str++)) != '\0') + { + 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_write(char c) +{ + 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| + |T 000/000D Z000.0 | + |B 000/000D F100% | + |SD100% T--:-- | + |Status line.........| +*/ +static void lcd_implementation_status_screen() +{ + + int tHotend=int(degHotend(0) + 0.5); + int tTarget=int(degTargetHotend(0) + 0.5); + + //Print the hotend temperature + lcd.setCursor(0, 0); + lcd.print(LCD_STR_THERMOMETER[0]); + lcd.print(itostr3(tHotend)); + lcd.print('/'); + lcd.print(itostr3left(tTarget)); + lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); + lcd_printPGM(PSTR(" ")); + + //Print the Z coordinates + lcd.setCursor(LCD_WIDTH - 8-2, 0); +#if 1 + lcd_printPGM(PSTR(" Z")); + if (custom_message_type == 1) { + // In a bed calibration mode. + lcd_printPGM(PSTR(" --- ")); + } else { + lcd.print(ftostr32sp(current_position[Z_AXIS] + 0.00001)); + lcd.print(' '); + } +#else + lcd_printPGM(PSTR(" Queue:")); + lcd.print(int(moves_planned())); + lcd.print(' '); +#endif + + //Print the Bedtemperature + lcd.setCursor(0, 1); + tHotend=int(degBed() + 0.5); + tTarget=int(degTargetBed() + 0.5); + lcd.print(LCD_STR_BEDTEMP[0]); + lcd.print(itostr3(tHotend)); + lcd.print('/'); + lcd.print(itostr3left(tTarget)); + lcd_printPGM(PSTR(LCD_STR_DEGREE " ")); + lcd_printPGM(PSTR(" ")); + +#if 1 + //Print Feedrate + lcd.setCursor(LCD_WIDTH - 8-2, 1); + lcd_printPGM(PSTR(" ")); + lcd.print(LCD_STR_FEEDRATE[0]); + lcd.print(itostr3(feedmultiply)); + lcd_printPGM(PSTR("% ")); +#else + //Print Feedrate + lcd.setCursor(LCD_WIDTH - 8-2, 1); + lcd.print(LCD_STR_FEEDRATE[0]); + lcd.print(itostr3(feedmultiply)); + lcd_printPGM(PSTR("% Q")); + { + uint8_t queue = planner_queue_min(); + if (queue < (BLOCK_BUFFER_SIZE >> 1)) { + lcd.print('!'); + } else { + lcd.print((char)(queue / 10) + '0'); + queue %= 10; + } + lcd.print((char)queue + '0'); + planner_queue_min_reset(); + } +#endif + + //Print SD status + lcd.setCursor(0, 2); + if (is_usb_printing) + { + lcd_printPGM(PSTR("--")); + } + else + { + lcd_printPGM(PSTR("SD")); + } + if (IS_SD_PRINTING) + { + lcd.print(itostr3(card.percentDone())); + lcd.print('%'); + } + else + { + if (is_usb_printing) + { + lcd_printPGM(PSTR(">USB")); + } + else + { + lcd_printPGM(PSTR("---")); + lcd.print('%'); + } + } + + // Farm number display + if (farm_mode) + { + lcd_printPGM(PSTR(" F")); + lcd.print(farm_no); + lcd_printPGM(PSTR(" ")); + + // Beat display + lcd.setCursor(LCD_WIDTH - 1, 0); + if ( (millis() - kicktime) < 60000 ) { + + lcd_printPGM(PSTR("L")); + + }else{ + lcd_printPGM(PSTR(" ")); + } + + } + else { +#ifdef SNMM + lcd_printPGM(PSTR(" E")); + lcd.print(get_ext_nr() + 1); + +#else + lcd.setCursor(LCD_WIDTH - 8 - 2, 2); + lcd_printPGM(PSTR(" ")); +#endif + } + + + + //Print time elapsed + lcd.setCursor(LCD_WIDTH - 8 -1, 2); + lcd_printPGM(PSTR(" ")); + lcd.print(LCD_STR_CLOCK[0]); + if(starttime != 0) + { + uint16_t time = millis() / 60000 - starttime / 60000; + lcd.print(itostr2(time/60)); + lcd.print(':'); + lcd.print(itostr2(time%60)); + }else{ + lcd_printPGM(PSTR("--:--")); + } + lcd_printPGM(PSTR(" ")); + + + //Print status line + lcd.setCursor(0, 3); + + // If heating in progress, set flag + if (heating_status != 0) { custom_message = true; } + + // If printing from SD, show what we are printing + if ((IS_SD_PRINTING) && !custom_message) + { + + if(strcmp(longFilenameOLD, card.longFilename) != 0) + { + memset(longFilenameOLD,'\0',strlen(longFilenameOLD)); + sprintf_P(longFilenameOLD, PSTR("%s"), card.longFilename); + scrollstuff = 0; + } + + if(strlen(card.longFilename) > LCD_WIDTH) + { + + int inters = 0; + int gh = scrollstuff; + while( ((gh-scrollstuff) 13) + { + heating_status_counter = 0; + } + lcd.setCursor(7, 3); + lcd_printPGM(PSTR(" ")); + + for (int dots = 0; dots < heating_status_counter; dots++) + { + lcd.setCursor(7 + dots, 3); + lcd.print('.'); + } + + switch (heating_status) + { + case 1: + lcd.setCursor(0, 3); + lcd_printPGM(MSG_HEATING); + break; + case 2: + lcd.setCursor(0, 3); + lcd_printPGM(MSG_HEATING_COMPLETE); + heating_status = 0; + heating_status_counter = 0; + custom_message = false; + break; + case 3: + lcd.setCursor(0, 3); + lcd_printPGM(MSG_BED_HEATING); + break; + case 4: + lcd.setCursor(0, 3); + lcd_printPGM(MSG_BED_DONE); + heating_status = 0; + heating_status_counter = 0; + custom_message = false; + break; + default: + break; + } + } + + // If mesh bed leveling in progress, show the status + + if (custom_message_type == 1) + { + if (custom_message_state > 10) + { + lcd.setCursor(0, 3); + lcd_printPGM(PSTR(" ")); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_HOMEYZ_PROGRESS); + lcd_printPGM(PSTR(" : ")); + lcd.print(custom_message_state-10); + } + else + { + if (custom_message_state == 3) + { + lcd_printPGM(WELCOME_MSG); + lcd_setstatuspgm(WELCOME_MSG); + custom_message = false; + custom_message_type = 0; + } + if (custom_message_state > 3 && custom_message_state < 10 ) + { + lcd.setCursor(0, 3); + lcd_printPGM(PSTR(" ")); + lcd.setCursor(0, 3); + lcd_printPGM(MSG_HOMEYZ_DONE); + custom_message_state--; + } + if (custom_message_state == 10) + { + lcd_printPGM(MSG_HOMEYZ_DONE); + custom_message_state = 9; + } + } + + } + // If loading filament, print status + if (custom_message_type == 2) + { + lcd.print(lcd_status_message); + } + // PID tuning in progress + if (custom_message_type == 3) { + lcd.print(lcd_status_message); + if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) { + lcd.setCursor(15, 3); + lcd.print(itostr3(pid_cycle)); + + lcd.print('/'); + lcd.print(itostr3left(pid_number_of_cycles)); + } + } + // PINDA temp calibration in progress + if (custom_message_type == 4) { + char progress[4]; + lcd.setCursor(0, 3); + lcd_printPGM(MSG_TEMP_CALIBRATION); + lcd.setCursor(15, 3); + sprintf(progress, "%d/6", custom_message_state); + lcd.print(progress); + } + // temp compensation preheat + if (custom_message_type == 5) { + lcd.setCursor(0, 3); + lcd_printPGM(MSG_PINDA_PREHEAT); + if (custom_message_state <= PINDA_HEAT_T) { + lcd_printPGM(PSTR(": ")); + lcd.print(custom_message_state); //seconds + lcd.print(' '); + + } + } + + + } + else + { + // Nothing special, print status message normally + lcd.print(lcd_status_message); + } + } + + // Fill the rest of line to have nice and clean output + for(int fillspace = 0; fillspace<20;fillspace++) + { + if((lcd_status_message[fillspace] > 31 )) + { + } + else + { + lcd.print(' '); + } + } + +} + + +static void lcd_implementation_drawmenu_generic(uint8_t row, const char* pstr, char pre_char, char post_char) +{ + char c; + //Use all characters in narrow LCDs + #if LCD_WIDTH < 20 + uint8_t n = LCD_WIDTH - 1 - 1; + #else + uint8_t n = LCD_WIDTH - 1 - 2; + #endif + lcd.setCursor(0, row); + lcd.print(pre_char); + while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) + { + lcd.print(c); + pstr++; + n--; + } + while(n--) + lcd.print(' '); + lcd.print(post_char); + lcd.print(' '); +} + +static void lcd_implementation_drawmenu_generic_RAM(uint8_t row, const char* str, char pre_char, char post_char) +{ + char c; + //Use all characters in narrow LCDs + #if LCD_WIDTH < 20 + uint8_t n = LCD_WIDTH - 1 - 1; + #else + uint8_t n = LCD_WIDTH - 1 - 2; + #endif + lcd.setCursor(0, row); + lcd.print(pre_char); + while( ((c = *str) != '\0') && (n>0) ) + { + lcd.print(c); + str++; + n--; + } + while(n--) + lcd.print(' '); + lcd.print(post_char); + lcd.print(' '); +} + +static void lcd_implementation_drawmenu_setting_edit_generic(uint8_t row, const char* pstr, char pre_char, char* data) +{ + char c; + //Use all characters in narrow LCDs + #if LCD_WIDTH < 20 + uint8_t n = LCD_WIDTH - 1 - 1 - strlen(data); + #else + uint8_t n = LCD_WIDTH - 1 - 2 - strlen(data); + #endif + lcd.setCursor(0, row); + lcd.print(pre_char); + while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) + { + lcd.print(c); + pstr++; + n--; + } + lcd.print(':'); + while(n--) + lcd.print(' '); + lcd.print(data); +} +static void lcd_implementation_drawmenu_setting_edit_generic_P(uint8_t row, const char* pstr, char pre_char, const char* data) +{ + char c; + //Use all characters in narrow LCDs + #if LCD_WIDTH < 20 + uint8_t n = LCD_WIDTH - 1 - 1 - strlen_P(data); + #else + uint8_t n = LCD_WIDTH - 1 - 2 - strlen_P(data); + #endif + lcd.setCursor(0, row); + lcd.print(pre_char); + while( ((c = pgm_read_byte(pstr)) != '\0') && (n>0) ) + { + lcd.print(c); + pstr++; + n--; + } + lcd.print(':'); + while(n--) + lcd.print(' '); + lcd_printPGM(data); +} +#define lcd_implementation_drawmenu_setting_edit_int3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_int3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float3_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float3(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float32_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float32(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float43_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float43(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float52_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float52(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float51_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data))) +#define lcd_implementation_drawmenu_setting_edit_float51(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data))) +#define lcd_implementation_drawmenu_setting_edit_long5_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_long5(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_bool_selected(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) +#define lcd_implementation_drawmenu_setting_edit_bool(row, pstr, pstr2, data) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) + +//Add version for callback functions +#define lcd_implementation_drawmenu_setting_edit_callback_int3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', itostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_int3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', itostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float3_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float3(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr3(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float32_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr32(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float32(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr32(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float43_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr43(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float43(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr43(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float52_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr52(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float52(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr52(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float51_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr51(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_float51(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr51(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_long5_selected(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_long5(row, pstr, pstr2, data, minValue, maxValue, callback) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, ' ', ftostr5(*(data))) +#define lcd_implementation_drawmenu_setting_edit_callback_bool_selected(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, '>', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) +#define lcd_implementation_drawmenu_setting_edit_callback_bool(row, pstr, pstr2, data, callback) lcd_implementation_drawmenu_setting_edit_generic_P(row, pstr, ' ', (*(data))?PSTR(MSG_ON):PSTR(MSG_OFF)) + + +void lcd_implementation_drawedit(const char* pstr, char* value) +{ + lcd.setCursor(1, 1); + lcd_printPGM(pstr); + lcd.print(':'); + #if LCD_WIDTH < 20 + lcd.setCursor(LCD_WIDTH - strlen(value), 1); + #else + lcd.setCursor(LCD_WIDTH -1 - strlen(value), 1); + #endif + lcd.print(value); +} + +void lcd_implementation_drawedit_2(const char* pstr, char* value) +{ + lcd.setCursor(0, 1); + lcd_printPGM(pstr); + lcd.print(':'); + + lcd.setCursor((LCD_WIDTH - strlen(value))/2, 3); + + lcd.print(value); + lcd.print(" mm"); +} + +static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* pstr, const char* filename, char* longFilename) +{ + char c; + int enc_dif = encoderDiff; + uint8_t n = LCD_WIDTH - 1; + for(int g = 0; g<4;g++){ + lcd.setCursor(0, g); + lcd.print(' '); + } + + lcd.setCursor(0, row); + lcd.print('>'); + if (longFilename[0] != '\0') + { + + filename = longFilename; + //longFilename[LCD_WIDTH-1] = '\0'; + } + + int i = 1; + int j = 0; + int inter = 0; + char* longFilenameTMP = longFilename; + + while( ((c = *longFilenameTMP) != '\0') && (inter == 0) ) + { + + lcd.setCursor(i, row); + lcd.print(c); + i++; + longFilenameTMP++; + if(i==LCD_WIDTH){ + i=1; + j++; + longFilenameTMP = longFilename; + longFilenameTMP = longFilenameTMP+j; + n = LCD_WIDTH - 1; + for(int g = 0; ((g<300)&&(inter == 0)) ;g++){ + if(LCD_CLICKED || ( enc_dif != encoderDiff )){ + + // inter = 1; + }else{ + delay(1); + } + + } + } + + } + if(c!='\0'){ + lcd.setCursor(i, row); + lcd.print(c); + i++; + } + n=n-i+1; + while(n--) + lcd.print(' '); +} +static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* pstr, const char* filename, char* longFilename) +{ + char c; + uint8_t n = LCD_WIDTH - 1; + lcd.setCursor(0, row); + lcd.print(' '); + if (longFilename[0] != '\0') + { + filename = longFilename; + longFilename[LCD_WIDTH-1] = '\0'; + } + while( ((c = *filename) != '\0') && (n>0) ) + { + lcd.print(c); + filename++; + n--; + } + while(n--) + lcd.print(' '); +} +static void lcd_implementation_drawmenu_sddirectory_selected(uint8_t row, const char* pstr, const char* filename, char* longFilename) +{ + char c; + uint8_t n = LCD_WIDTH - 2; + lcd.setCursor(0, row); + lcd.print('>'); + lcd.print(LCD_STR_FOLDER[0]); + if (longFilename[0] != '\0') + { + filename = longFilename; + longFilename[LCD_WIDTH-2] = '\0'; + } + while( ((c = *filename) != '\0') && (n>0) ) + { + lcd.print(c); + filename++; + n--; + } + while(n--) + lcd.print(' '); +} +static void lcd_implementation_drawmenu_sddirectory(uint8_t row, const char* pstr, const char* filename, char* longFilename) +{ + char c; + uint8_t n = LCD_WIDTH - 2; + lcd.setCursor(0, row); + lcd.print(' '); + lcd.print(LCD_STR_FOLDER[0]); + if (longFilename[0] != '\0') + { + filename = longFilename; + longFilename[LCD_WIDTH-2] = '\0'; + } + while( ((c = *filename) != '\0') && (n>0) ) + { + lcd.print(c); + filename++; + n--; + } + while(n--) + lcd.print(' '); +} +#define lcd_implementation_drawmenu_back_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) +#define lcd_implementation_drawmenu_back(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_UPLEVEL[0]) +#define lcd_implementation_drawmenu_back_RAM_selected(row, str, data) lcd_implementation_drawmenu_generic_RAM(row, str, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0]) +#define lcd_implementation_drawmenu_back_RAM(row, str, data) lcd_implementation_drawmenu_generic_RAM(row, str, ' ', LCD_STR_UPLEVEL[0]) +#define lcd_implementation_drawmenu_submenu_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', LCD_STR_ARROW_RIGHT[0]) +#define lcd_implementation_drawmenu_submenu(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', LCD_STR_ARROW_RIGHT[0]) +#define lcd_implementation_drawmenu_gcode_selected(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') +#define lcd_implementation_drawmenu_gcode(row, pstr, gcode) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') +#define lcd_implementation_drawmenu_function_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') +#define lcd_implementation_drawmenu_function(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') +#define lcd_implementation_drawmenu_setlang_selected(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, '>', ' ') +#define lcd_implementation_drawmenu_setlang(row, pstr, data) lcd_implementation_drawmenu_generic(row, pstr, ' ', ' ') + +static void lcd_implementation_quick_feedback() +{ +#ifdef LCD_USE_I2C_BUZZER + #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) + lcd_buzz(1000/6,100); + #else + lcd_buzz(LCD_FEEDBACK_FREQUENCY_DURATION_MS,LCD_FEEDBACK_FREQUENCY_HZ); + #endif +#elif defined(BEEPER) && BEEPER > -1 + SET_OUTPUT(BEEPER); + #if !defined(LCD_FEEDBACK_FREQUENCY_HZ) || !defined(LCD_FEEDBACK_FREQUENCY_DURATION_MS) + for(int8_t i=0;i<10;i++) + { + WRITE(BEEPER,HIGH); + delayMicroseconds(100); + WRITE(BEEPER,LOW); + delayMicroseconds(100); + } + #else + for(int8_t i=0;i<(LCD_FEEDBACK_FREQUENCY_DURATION_MS / (1000 / LCD_FEEDBACK_FREQUENCY_HZ));i++) + { + WRITE(BEEPER,HIGH); + delayMicroseconds(1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2); + WRITE(BEEPER,LOW); + delayMicroseconds(1000000 / LCD_FEEDBACK_FREQUENCY_HZ / 2); + } + #endif +#endif +} + +#ifdef LCD_HAS_STATUS_INDICATORS +static void lcd_implementation_update_indicators() +{ + #if defined(LCD_I2C_PANELOLU2) || defined(LCD_I2C_VIKI) + //set the LEDS - referred to as backlights by the LiquidTWI2 library + static uint8_t ledsprev = 0; + uint8_t leds = 0; + if (target_temperature_bed > 0) leds |= LED_A; + if (target_temperature[0] > 0) leds |= LED_B; + if (fanSpeed) leds |= LED_C; + #if EXTRUDERS > 1 + if (target_temperature[1] > 0) leds |= LED_C; + #endif + if (leds != ledsprev) { + lcd.setBacklight(leds); + ledsprev = leds; + } + #endif +} +#endif + +#ifdef LCD_HAS_SLOW_BUTTONS +extern uint32_t blocking_enc; + +static uint8_t lcd_implementation_read_slow_buttons() +{ + #ifdef LCD_I2C_TYPE_MCP23017 + uint8_t slow_buttons; + // Reading these buttons this is likely to be too slow to call inside interrupt context + // so they are called during normal lcd_update + slow_buttons = lcd.readButtons() << B_I2C_BTN_OFFSET; + #if defined(LCD_I2C_VIKI) + if(slow_buttons & (B_MI|B_RI)) { //LCD clicked + if(blocking_enc > millis()) { + slow_buttons &= ~(B_MI|B_RI); // Disable LCD clicked buttons if screen is updated + } + } + #endif + return slow_buttons; + #endif +} +#endif + +#endif//ULTRA_LCD_IMPLEMENTATION_HITACHI_HD44780_H