New ML support - migration - replaced source, removed original ML support files (backup)

This commit is contained in:
Robert Pelnar 2018-05-22 03:20:03 +02:00
parent bb01e20ad6
commit bd587faab9
26 changed files with 661 additions and 267 deletions

View file

@ -308,7 +308,7 @@ unsigned long t_fan_rising_edge = millis();
bool mesh_bed_leveling_flag = false; bool mesh_bed_leveling_flag = false;
bool mesh_bed_run_from_menu = false; bool mesh_bed_run_from_menu = false;
unsigned char lang_selected = 0; //unsigned char lang_selected = 0;
int8_t FarmMode = 0; int8_t FarmMode = 0;
bool prusa_sd_card_upload = false; bool prusa_sd_card_upload = false;
@ -915,8 +915,8 @@ void factory_reset()
void show_fw_version_warnings() { void show_fw_version_warnings() {
if (FW_DEV_VERSION == FW_VERSION_GOLD || FW_DEV_VERSION == FW_VERSION_RC) return; if (FW_DEV_VERSION == FW_VERSION_GOLD || FW_DEV_VERSION == FW_VERSION_RC) return;
switch (FW_DEV_VERSION) { switch (FW_DEV_VERSION) {
case(FW_VERSION_ALPHA): lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_ALPHA); break; case(FW_VERSION_ALPHA): lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware alpha version. This is development version. Using this version is not recommended and may cause printer damage.")); break;////MSG_FW_VERSION_ALPHA c=20 r=8
case(FW_VERSION_BETA): lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_BETA); break; case(FW_VERSION_BETA): lcd_show_fullscreen_message_and_wait_P(_i("You are using firmware beta version. This is development version. Using this version is not recommended and may cause printer damage.")); break;////MSG_FW_VERSION_BETA c=20 r=8
case(FW_VERSION_DEVEL): case(FW_VERSION_DEVEL):
case(FW_VERSION_DEBUG): case(FW_VERSION_DEBUG):
lcd_update_enable(false); lcd_update_enable(false);
@ -931,7 +931,7 @@ void show_fw_version_warnings() {
lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY)); lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY));
lcd_wait_for_click(); lcd_wait_for_click();
break; break;
default: lcd_show_fullscreen_message_and_wait_P(MSG_FW_VERSION_UNKNOWN); break; default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8
} }
lcd_update_enable(true); lcd_update_enable(true);
} }
@ -1026,9 +1026,9 @@ void setup()
#ifdef STRING_VERSION_CONFIG_H #ifdef STRING_VERSION_CONFIG_H
#ifdef STRING_CONFIG_H_AUTHOR #ifdef STRING_CONFIG_H_AUTHOR
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_CONFIGURATION_VER); SERIAL_ECHORPGM(_i(" Last Updated: "));////MSG_CONFIGURATION_VER c=0 r=0
SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H); SERIAL_ECHOPGM(STRING_VERSION_CONFIG_H);
SERIAL_ECHORPGM(MSG_AUTHOR); SERIAL_ECHORPGM(_n(" | Author: "));////MSG_AUTHOR c=0 r=0
SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR); SERIAL_ECHOLNPGM(STRING_CONFIG_H_AUTHOR);
SERIAL_ECHOPGM("Compiled: "); SERIAL_ECHOPGM("Compiled: ");
SERIAL_ECHOLNPGM(__DATE__); SERIAL_ECHOLNPGM(__DATE__);
@ -1036,9 +1036,9 @@ void setup()
#endif #endif
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_FREE_MEMORY); SERIAL_ECHORPGM(_i(" Free Memory: "));////MSG_FREE_MEMORY c=0 r=0
SERIAL_ECHO(freeMemory()); SERIAL_ECHO(freeMemory());
SERIAL_ECHORPGM(MSG_PLANNER_BUFFER_BYTES); SERIAL_ECHORPGM(_i(" PlannerBufferBytes: "));////MSG_PLANNER_BUFFER_BYTES c=0 r=0
SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE);
//lcd_update_enable(false); // why do we need this?? - andre //lcd_update_enable(false); // why do we need this?? - andre
// loads data from EEPROM if available else uses defaults (and resets step acceleration rate) // loads data from EEPROM if available else uses defaults (and resets step acceleration rate)
@ -1309,15 +1309,15 @@ void setup()
//if motherboard or printer type was changed inform user as it can indicate flashing wrong firmware version //if motherboard or printer type was changed inform user as it can indicate flashing wrong firmware version
//if user confirms with knob, new hw version (printer and/or motherboard) is written to eeprom and message will be not shown next time //if user confirms with knob, new hw version (printer and/or motherboard) is written to eeprom and message will be not shown next time
case(0b01): case(0b01):
lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_MOTHERBOARD); lcd_show_fullscreen_message_and_wait_P(_i("Warning: motherboard type changed.")); ////MSG_CHANGED_MOTHERBOARD c=20 r=4
eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);
break; break;
case(0b10): case(0b10):
lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_PRINTER); lcd_show_fullscreen_message_and_wait_P(_i("Warning: printer type changed.")); ////MSG_CHANGED_PRINTER c=20 r=4
eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
break; break;
case(0b11): case(0b11):
lcd_show_fullscreen_message_and_wait_P(MSG_CHANGED_BOTH); lcd_show_fullscreen_message_and_wait_P(_i("Warning: both printer type and motherboard type changed.")); ////MSG_CHANGED_BOTH c=20 r=4
eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE); eeprom_write_word((uint16_t*)EEPROM_PRINTER_TYPE, PRINTER_TYPE);
eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD); eeprom_write_word((uint16_t*)EEPROM_BOARD_TYPE, MOTHERBOARD);
break; break;
@ -1325,7 +1325,7 @@ void setup()
} }
if (!previous_settings_retrieved) { if (!previous_settings_retrieved) {
lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); //if EEPROM version or printer type was changed, inform user that default setting were loaded lcd_show_fullscreen_message_and_wait_P(_i("Old settings found. Default PID, Esteps etc. will be set.")); //if EEPROM version or printer type was changed, inform user that default setting were loaded////MSG_DEFAULT_SETTINGS_LOADED c=20 r=4
erase_eeprom_section(EEPROM_OFFSET, 156); //erase M500 part of eeprom erase_eeprom_section(EEPROM_OFFSET, 156); //erase M500 part of eeprom
} }
if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) { if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) {
@ -1346,7 +1346,7 @@ void setup()
lcd_update_enable(true); lcd_update_enable(true);
} }
else if (calibration_status() == CALIBRATION_STATUS_CALIBRATED && temp_cal_active == true && calibration_status_pinda() == false) { else if (calibration_status() == CALIBRATION_STATUS_CALIBRATED && temp_cal_active == true && calibration_status_pinda() == false) {
//lcd_show_fullscreen_message_and_wait_P(MSG_PINDA_NOT_CALIBRATED); //lcd_show_fullscreen_message_and_wait_P(_i("Temperature calibration has not been run yet"));////MSG_PINDA_NOT_CALIBRATED c=20 r=4
lcd_update_enable(true); lcd_update_enable(true);
} }
else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) { else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) {
@ -1357,7 +1357,7 @@ void setup()
#if !defined (DEBUG_DISABLE_FORCE_SELFTEST) && defined (TMC2130) #if !defined (DEBUG_DISABLE_FORCE_SELFTEST) && defined (TMC2130)
if (force_selftest_if_fw_version() && calibration_status() < CALIBRATION_STATUS_ASSEMBLED) { if (force_selftest_if_fw_version() && calibration_status() < CALIBRATION_STATUS_ASSEMBLED) {
lcd_show_fullscreen_message_and_wait_P(MSG_FORCE_SELFTEST); lcd_show_fullscreen_message_and_wait_P(_i("Selftest will be run to calibrate accurate sensorless rehoming."));////MSG_FORCE_SELFTEST c=20 r=8
update_current_firmware_version_to_eeprom(); update_current_firmware_version_to_eeprom();
lcd_selftest(); lcd_selftest();
} }
@ -2454,7 +2454,7 @@ void gcode_M114()
SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL(current_position[E_AXIS]); SERIAL_PROTOCOL(current_position[E_AXIS]);
SERIAL_PROTOCOLRPGM(MSG_COUNT_X); SERIAL_PROTOCOLRPGM(_n(" Count X: "));////MSG_COUNT_X c=0 r=0
SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / axis_steps_per_unit[X_AXIS]); SERIAL_PROTOCOL(float(st_get_position(X_AXIS)) / axis_steps_per_unit[X_AXIS]);
SERIAL_PROTOCOLPGM(" Y:"); SERIAL_PROTOCOLPGM(" Y:");
SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / axis_steps_per_unit[Y_AXIS]); SERIAL_PROTOCOL(float(st_get_position(Y_AXIS)) / axis_steps_per_unit[Y_AXIS]);
@ -2934,7 +2934,7 @@ void process_commands()
codenum = 0; codenum = 0;
if(code_seen('P')) codenum = code_value(); // milliseconds to wait if(code_seen('P')) codenum = code_value(); // milliseconds to wait
if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
if(codenum != 0) LCD_MESSAGERPGM(MSG_DWELL); if(codenum != 0) LCD_MESSAGERPGM(_i("Sleep..."));////MSG_DWELL c=0 r=0
st_synchronize(); st_synchronize();
codenum += millis(); // keep track of when we started waiting codenum += millis(); // keep track of when we started waiting
previous_millis_cmd = millis(); previous_millis_cmd = millis();
@ -3464,7 +3464,7 @@ void process_commands()
enquecommand_front_P((PSTR("G28 W0"))); enquecommand_front_P((PSTR("G28 W0")));
break; break;
} }
lcd_show_fullscreen_message_and_wait_P(MSG_TEMP_CAL_WARNING); lcd_show_fullscreen_message_and_wait_P(_i("Stable ambient temperature 21-26C is needed a rigid stand is required."));////MSG_TEMP_CAL_WARNING c=20 r=4
bool result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_STEEL_SHEET_CHECK, false, false); bool result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_STEEL_SHEET_CHECK, false, false);
if (result) if (result)
@ -3949,11 +3949,11 @@ void process_commands()
break; break;
} }
if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) { if (MESH_HOME_Z_SEARCH - current_position[Z_AXIS] < 0.1f) {
kill_message = MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED; kill_message = _i("Bed leveling failed. Sensor disconnected or cable broken. Waiting for reset.");////MSG_BED_LEVELING_FAILED_PROBE_DISCONNECTED c=20 r=4
break; break;
} }
if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point if (has_z && fabs(z0 - current_position[Z_AXIS]) > Z_CALIBRATION_THRESHOLD) { //if we have data from z calibration, max. allowed difference is 1mm for each point
kill_message = MSG_BED_LEVELING_FAILED_POINT_HIGH; kill_message = _i("Bed leveling failed. Sensor triggered too high. Waiting for reset.");////MSG_BED_LEVELING_FAILED_POINT_HIGH c=20 r=4
break; break;
} }
#ifdef SUPPORT_VERBOSITY #ifdef SUPPORT_VERBOSITY
@ -4277,7 +4277,7 @@ void process_commands()
if (!hasP && !hasS && *src != '\0') { if (!hasP && !hasS && *src != '\0') {
lcd_setstatus(src); lcd_setstatus(src);
} else { } else {
LCD_MESSAGERPGM(MSG_USERWAIT); LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT c=0 r=0
} }
lcd_ignore_click(); //call lcd_ignore_click aslo for else ??? lcd_ignore_click(); //call lcd_ignore_click aslo for else ???
@ -4305,14 +4305,14 @@ void process_commands()
KEEPALIVE_STATE(IN_HANDLER); KEEPALIVE_STATE(IN_HANDLER);
} }
if (IS_SD_PRINTING) if (IS_SD_PRINTING)
LCD_MESSAGERPGM(MSG_RESUMING); LCD_MESSAGERPGM(_i("Resuming print"));////MSG_RESUMING c=0 r=0
else else
LCD_MESSAGERPGM(WELCOME_MSG); LCD_MESSAGERPGM(WELCOME_MSG);
} }
break; break;
#endif #endif
case 17: case 17:
LCD_MESSAGERPGM(MSG_NO_MOVE); LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE c=0 r=0
enable_x(); enable_x();
enable_y(); enable_y();
enable_z(); enable_z();
@ -4323,9 +4323,9 @@ void process_commands()
#ifdef SDSUPPORT #ifdef SDSUPPORT
case 20: // M20 - list SD card case 20: // M20 - list SD card
SERIAL_PROTOCOLLNRPGM(MSG_BEGIN_FILE_LIST); SERIAL_PROTOCOLLNRPGM(_i("Begin file list"));////MSG_BEGIN_FILE_LIST c=0 r=0
card.ls(); card.ls();
SERIAL_PROTOCOLLNRPGM(MSG_END_FILE_LIST); SERIAL_PROTOCOLLNRPGM(_i("End file list"));////MSG_END_FILE_LIST c=0 r=0
break; break;
case 21: // M21 - init SD card case 21: // M21 - init SD card
@ -4864,7 +4864,7 @@ Sigma_Exit:
} }
#else #else
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNRPGM(MSG_ERR_NO_THERMISTORS); SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS c=0 r=0
#endif #endif
SERIAL_PROTOCOLPGM(" @:"); SERIAL_PROTOCOLPGM(" @:");
@ -5215,10 +5215,10 @@ Sigma_Exit:
enable_endstops(true) ; enable_endstops(true) ;
break; break;
case 119: // M119 case 119: // M119
SERIAL_PROTOCOLRPGM(MSG_M119_REPORT); SERIAL_PROTOCOLRPGM(_i("Reporting endstop status"));////MSG_M119_REPORT c=0 r=0
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
#if defined(X_MIN_PIN) && X_MIN_PIN > -1 #if defined(X_MIN_PIN) && X_MIN_PIN > -1
SERIAL_PROTOCOLRPGM(MSG_X_MIN); SERIAL_PROTOCOLRPGM(_n("x_min: "));////MSG_X_MIN c=0 r=0
if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){ if(READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING){
SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
}else{ }else{
@ -5227,7 +5227,7 @@ Sigma_Exit:
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
#endif #endif
#if defined(X_MAX_PIN) && X_MAX_PIN > -1 #if defined(X_MAX_PIN) && X_MAX_PIN > -1
SERIAL_PROTOCOLRPGM(MSG_X_MAX); SERIAL_PROTOCOLRPGM(_n("x_max: "));////MSG_X_MAX c=0 r=0
if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){ if(READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING){
SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
}else{ }else{
@ -5236,7 +5236,7 @@ Sigma_Exit:
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
#endif #endif
#if defined(Y_MIN_PIN) && Y_MIN_PIN > -1 #if defined(Y_MIN_PIN) && Y_MIN_PIN > -1
SERIAL_PROTOCOLRPGM(MSG_Y_MIN); SERIAL_PROTOCOLRPGM(_n("y_min: "));////MSG_Y_MIN c=0 r=0
if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){ if(READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING){
SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
}else{ }else{
@ -5245,7 +5245,7 @@ Sigma_Exit:
SERIAL_PROTOCOLLN(""); SERIAL_PROTOCOLLN("");
#endif #endif
#if defined(Y_MAX_PIN) && Y_MAX_PIN > -1 #if defined(Y_MAX_PIN) && Y_MAX_PIN > -1
SERIAL_PROTOCOLRPGM(MSG_Y_MAX); SERIAL_PROTOCOLRPGM(_n("y_max: "));////MSG_Y_MAX c=0 r=0
if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){ if(READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING){
SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT); SERIAL_PROTOCOLRPGM(MSG_ENDSTOP_HIT);
}else{ }else{
@ -5296,7 +5296,7 @@ Sigma_Exit:
tmp_extruder = code_value(); tmp_extruder = code_value();
if(tmp_extruder >= EXTRUDERS) { if(tmp_extruder >= EXTRUDERS) {
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER); SERIAL_ECHO(_i("M200 Invalid extruder "));////MSG_M200_INVALID_EXTRUDER c=0 r=0
break; break;
} }
} }
@ -5943,7 +5943,7 @@ Sigma_Exit:
delay_keep_alive(4); delay_keep_alive(4);
if (millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) { if (millis() > waiting_start_time + (unsigned long)M600_TIMEOUT * 1000) {
lcd_display_message_fullscreen_P(MSG_PRESS_TO_PREHEAT); lcd_display_message_fullscreen_P(_i("Press knob to preheat nozzle and continue."));////MSG_PRESS_TO_PREHEAT c=20 r=4
wait_for_user_state = 1; wait_for_user_state = 1;
setTargetHotend(0, 0); setTargetHotend(0, 0);
setTargetHotend(0, 1); setTargetHotend(0, 1);
@ -6083,8 +6083,8 @@ Sigma_Exit:
WRITE(BEEPER, LOW); WRITE(BEEPER, LOW);
KEEPALIVE_STATE(PAUSED_FOR_USER); KEEPALIVE_STATE(PAUSED_FOR_USER);
lcd_change_fil_state = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_UNLOAD_SUCCESSFUL, false, true); lcd_change_fil_state = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Was filament unload successful?"), false, true);////MSG_UNLOAD_SUCCESSFUL c=20 r=2
if (lcd_change_fil_state == 0) lcd_show_fullscreen_message_and_wait_P(MSG_CHECK_IDLER); if (lcd_change_fil_state == 0) lcd_show_fullscreen_message_and_wait_P(_i("Please open idler and remove filament manually."));////MSG_CHECK_IDLER c=20 r=4
//lcd_return_to_status(); //lcd_return_to_status();
lcd_update_enable(true); lcd_update_enable(true);
@ -6729,7 +6729,7 @@ Sigma_Exit:
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOPGM("T"); SERIAL_ECHOPGM("T");
SERIAL_PROTOCOLLN((int)tmp_extruder); SERIAL_PROTOCOLLN((int)tmp_extruder);
SERIAL_ECHOLNRPGM(MSG_INVALID_EXTRUDER); SERIAL_ECHOLNRPGM(_n("Invalid extruder"));////MSG_INVALID_EXTRUDER c=0 r=0
} }
else { else {
boolean make_move = false; boolean make_move = false;
@ -6761,7 +6761,7 @@ Sigma_Exit:
} }
#endif #endif
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_ACTIVE_EXTRUDER); SERIAL_ECHORPGM(_n("Active Extruder: "));////MSG_ACTIVE_EXTRUDER c=0 r=0
SERIAL_PROTOCOLLN((int)active_extruder); SERIAL_PROTOCOLLN((int)active_extruder);
} }
@ -6831,7 +6831,7 @@ void FlushSerialRequestResend()
{ {
//char cmdbuffer[bufindr][100]="Resend:"; //char cmdbuffer[bufindr][100]="Resend:";
MYSERIAL.flush(); MYSERIAL.flush();
SERIAL_PROTOCOLRPGM(MSG_RESEND); SERIAL_PROTOCOLRPGM(_i("Resend: "));////MSG_RESEND c=0 r=0
SERIAL_PROTOCOLLN(gcode_LastN + 1); SERIAL_PROTOCOLLN(gcode_LastN + 1);
previous_millis_cmd = millis(); previous_millis_cmd = millis();
SERIAL_PROTOCOLLNRPGM(MSG_OK); SERIAL_PROTOCOLLNRPGM(MSG_OK);
@ -7152,7 +7152,7 @@ static void handleSafetyTimer()
{ {
setTargetBed(0); setTargetBed(0);
setTargetHotend(0, 0); setTargetHotend(0, 0);
lcd_show_fullscreen_message_and_wait_P(MSG_BED_HEATING_SAFETY_DISABLED); lcd_show_fullscreen_message_and_wait_P(_i("Heating disabled by safety timer."));////MSG_BED_HEATING_SAFETY_DISABLED c=0 r=0
} }
} }
#endif //SAFETYTIMER #endif //SAFETYTIMER
@ -7308,12 +7308,12 @@ void kill(const char *full_screen_message, unsigned char id)
pinMode(PS_ON_PIN,INPUT); pinMode(PS_ON_PIN,INPUT);
#endif #endif
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNRPGM(MSG_ERR_KILLED); SERIAL_ERRORLNRPGM(_i("Printer halted. kill() called!"));////MSG_ERR_KILLED c=0 r=0
if (full_screen_message != NULL) { if (full_screen_message != NULL) {
SERIAL_ERRORLNRPGM(full_screen_message); SERIAL_ERRORLNRPGM(full_screen_message);
lcd_display_message_fullscreen_P(full_screen_message); lcd_display_message_fullscreen_P(full_screen_message);
} else { } else {
LCD_ALERTMESSAGERPGM(MSG_KILLED); LCD_ALERTMESSAGERPGM(_i("KILLED. "));////MSG_KILLED c=0 r=0
} }
// FMC small patch to update the LCD before ending // FMC small patch to update the LCD before ending
@ -7426,19 +7426,19 @@ bool setTargetedHotend(int code){
SERIAL_ECHO_START; SERIAL_ECHO_START;
switch(code){ switch(code){
case 104: case 104:
SERIAL_ECHORPGM(MSG_M104_INVALID_EXTRUDER); SERIAL_ECHORPGM(_i("M104 Invalid extruder "));////MSG_M104_INVALID_EXTRUDER c=0 r=0
break; break;
case 105: case 105:
SERIAL_ECHO(MSG_M105_INVALID_EXTRUDER); SERIAL_ECHO(_i("M105 Invalid extruder "));////MSG_M105_INVALID_EXTRUDER c=0 r=0
break; break;
case 109: case 109:
SERIAL_ECHO(MSG_M109_INVALID_EXTRUDER); SERIAL_ECHO(_i("M109 Invalid extruder "));////MSG_M109_INVALID_EXTRUDER c=0 r=0
break; break;
case 218: case 218:
SERIAL_ECHO(MSG_M218_INVALID_EXTRUDER); SERIAL_ECHO(_i("M218 Invalid extruder "));////MSG_M218_INVALID_EXTRUDER c=0 r=0
break; break;
case 221: case 221:
SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER); SERIAL_ECHO(_i("M221 Invalid extruder "));////MSG_M221_INVALID_EXTRUDER c=0 r=0
break; break;
} }
SERIAL_PROTOCOLLN((int)tmp_extruder); SERIAL_PROTOCOLLN((int)tmp_extruder);
@ -8209,7 +8209,7 @@ void recover_print(uint8_t automatic) {
char cmd[30]; char cmd[30];
lcd_update_enable(true); lcd_update_enable(true);
lcd_update(2); lcd_update(2);
lcd_setstatuspgm(MSG_RECOVERING_PRINT); lcd_setstatuspgm(_i("Recovering print "));////MSG_RECOVERING_PRINT c=20 r=1
recover_machine_state_after_power_panic(); recover_machine_state_after_power_panic();

View file

@ -94,7 +94,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m
if (!dir.open(parent, lfilename, O_READ)) { if (!dir.open(parent, lfilename, O_READ)) {
if (lsAction == LS_SerialPrint) { if (lsAction == LS_SerialPrint) {
//SERIAL_ECHO_START(); //SERIAL_ECHO_START();
//SERIAL_ECHOPGM(MSG_SD_CANT_OPEN_SUBDIR); //SERIAL_ECHOPGM(_i("Cannot open subdir"));////MSG_SD_CANT_OPEN_SUBDIR c=0 r=0
//SERIAL_ECHOLN(lfilename); //SERIAL_ECHOLN(lfilename);
} }
} }
@ -183,23 +183,23 @@ void CardReader::initsd()
{ {
//if (!card.init(SPI_HALF_SPEED,SDSS)) //if (!card.init(SPI_HALF_SPEED,SDSS))
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(MSG_SD_INIT_FAIL); SERIAL_ECHOLNRPGM(_i("SD init fail"));////MSG_SD_INIT_FAIL c=0 r=0
} }
else if (!volume.init(&card)) else if (!volume.init(&card))
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNRPGM(MSG_SD_VOL_INIT_FAIL); SERIAL_ERRORLNRPGM(_i("volume.init failed"));////MSG_SD_VOL_INIT_FAIL c=0 r=0
} }
else if (!root.openRoot(&volume)) else if (!root.openRoot(&volume))
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORLNRPGM(MSG_SD_OPENROOT_FAIL); SERIAL_ERRORLNRPGM(_i("openRoot failed"));////MSG_SD_OPENROOT_FAIL c=0 r=0
} }
else else
{ {
cardOK = true; cardOK = true;
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(MSG_SD_CARD_OK); SERIAL_ECHOLNRPGM(_i("SD card ok"));////MSG_SD_CARD_OK c=0 r=0
} }
workDir=root; workDir=root;
curDir=&root; curDir=&root;
@ -392,13 +392,13 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/)
if (file.open(curDir, fname, O_READ)) if (file.open(curDir, fname, O_READ))
{ {
filesize = file.fileSize(); filesize = file.fileSize();
SERIAL_PROTOCOLRPGM(MSG_SD_FILE_OPENED); SERIAL_PROTOCOLRPGM(_i("File opened: "));////MSG_SD_FILE_OPENED c=0 r=0
SERIAL_PROTOCOL(fname); SERIAL_PROTOCOL(fname);
SERIAL_PROTOCOLRPGM(MSG_SD_SIZE); SERIAL_PROTOCOLRPGM(_n(" Size: "));////MSG_SD_SIZE c=0 r=0
SERIAL_PROTOCOLLN(filesize); SERIAL_PROTOCOLLN(filesize);
sdpos = 0; sdpos = 0;
SERIAL_PROTOCOLLNRPGM(MSG_SD_FILE_SELECTED); SERIAL_PROTOCOLLNRPGM(_i("File selected"));////MSG_SD_FILE_SELECTED c=0 r=0
getfilename(0, fname); getfilename(0, fname);
lcd_setstatus(longFilename[0] ? longFilename : fname); lcd_setstatus(longFilename[0] ? longFilename : fname);
lcd_setstatus("SD-PRINTING "); lcd_setstatus("SD-PRINTING ");
@ -421,7 +421,7 @@ void CardReader::openFile(char* name,bool read, bool replace_current/*=true*/)
else else
{ {
saving = true; saving = true;
SERIAL_PROTOCOLRPGM(MSG_SD_WRITE_TO_FILE); SERIAL_PROTOCOLRPGM(_i("Writing to file: "));////MSG_SD_WRITE_TO_FILE c=0 r=0
SERIAL_PROTOCOLLN(name); SERIAL_PROTOCOLLN(name);
lcd_setstatus(fname); lcd_setstatus(fname);
} }
@ -513,7 +513,7 @@ void CardReader::getStatus()
if(sdprinting){ if(sdprinting){
SERIAL_PROTOCOL(longFilename); SERIAL_PROTOCOL(longFilename);
SERIAL_PROTOCOLPGM("\n"); SERIAL_PROTOCOLPGM("\n");
SERIAL_PROTOCOLRPGM(MSG_SD_PRINTING_BYTE); SERIAL_PROTOCOLRPGM(_i("SD printing byte "));////MSG_SD_PRINTING_BYTE c=0 r=0
SERIAL_PROTOCOL(sdpos); SERIAL_PROTOCOL(sdpos);
SERIAL_PROTOCOLPGM("/"); SERIAL_PROTOCOLPGM("/");
SERIAL_PROTOCOLLN(filesize); SERIAL_PROTOCOLLN(filesize);
@ -673,7 +673,7 @@ void CardReader::chdir(const char * relpath)
if(!newfile.open(*parent,relpath, O_READ)) if(!newfile.open(*parent,relpath, O_READ))
{ {
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHORPGM(MSG_SD_CANT_ENTER_SUBDIR); SERIAL_ECHORPGM(_i("Cannot enter subdir: "));////MSG_SD_CANT_ENTER_SUBDIR c=0 r=0
SERIAL_ECHOLN(relpath); SERIAL_ECHOLN(relpath);
} }
else else
@ -748,14 +748,14 @@ void CardReader::presort() {
// Never sort more than the max allowed // Never sort more than the max allowed
// If you use folders to organize, 20 may be enough // If you use folders to organize, 20 may be enough
if (fileCnt > SDSORT_LIMIT) { if (fileCnt > SDSORT_LIMIT) {
lcd_show_fullscreen_message_and_wait_P(MSG_FILE_CNT); lcd_show_fullscreen_message_and_wait_P(_i("Some files will not be sorted. Max. No. of files in 1 folder for sorting is 100."));////MSG_FILE_CNT c=20 r=4
fileCnt = SDSORT_LIMIT; fileCnt = SDSORT_LIMIT;
} }
lcd_implementation_clear(); lcd_implementation_clear();
#if !SDSORT_USES_RAM #if !SDSORT_USES_RAM
lcd_set_progress(); lcd_set_progress();
#endif #endif
lcd_print_at_PGM(0, 1, MSG_SORTING); lcd_print_at_PGM(0, 1, _i("Sorting files"));////MSG_SORTING c=20 r=1
// Sort order is always needed. May be static or dynamic. // Sort order is always needed. May be static or dynamic.
#if SDSORT_DYNAMIC_RAM #if SDSORT_DYNAMIC_RAM

View file

@ -425,7 +425,7 @@ void get_command()
// M110 - set current line number. // M110 - set current line number.
// Line numbers not sent in succession. // Line numbers not sent in succession.
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORRPGM(MSG_ERR_LINE_NO); SERIAL_ERRORRPGM(_n("Line Number is not Last Line Number+1, Last Line: "));////MSG_ERR_LINE_NO c=0 r=0
SERIAL_ERRORLN(gcode_LastN); SERIAL_ERRORLN(gcode_LastN);
//Serial.println(gcode_N); //Serial.println(gcode_N);
FlushSerialRequestResend(); FlushSerialRequestResend();
@ -441,7 +441,7 @@ void get_command()
checksum = checksum^(*p++); checksum = checksum^(*p++);
if (int(strtol(strchr_pointer+1, NULL, 10)) != int(checksum)) { if (int(strtol(strchr_pointer+1, NULL, 10)) != int(checksum)) {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORRPGM(MSG_ERR_CHECKSUM_MISMATCH); SERIAL_ERRORRPGM(_i("checksum mismatch, Last Line: "));////MSG_ERR_CHECKSUM_MISMATCH c=0 r=0
SERIAL_ERRORLN(gcode_LastN); SERIAL_ERRORLN(gcode_LastN);
FlushSerialRequestResend(); FlushSerialRequestResend();
serial_count = 0; serial_count = 0;
@ -453,7 +453,7 @@ void get_command()
else else
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORRPGM(MSG_ERR_NO_CHECKSUM); SERIAL_ERRORRPGM(_i("No Checksum with line number, Last Line: "));////MSG_ERR_NO_CHECKSUM c=0 r=0
SERIAL_ERRORLN(gcode_LastN); SERIAL_ERRORLN(gcode_LastN);
FlushSerialRequestResend(); FlushSerialRequestResend();
serial_count = 0; serial_count = 0;
@ -470,7 +470,7 @@ void get_command()
{ {
SERIAL_ERROR_START; SERIAL_ERROR_START;
SERIAL_ERRORRPGM(MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM); SERIAL_ERRORRPGM(_n("No Line Number with checksum, Last Line: "));////MSG_ERR_NO_LINENUMBER_WITH_CHECKSUM c=0 r=0
SERIAL_ERRORLN(gcode_LastN); SERIAL_ERRORLN(gcode_LastN);
serial_count = 0; serial_count = 0;
return; return;
@ -580,7 +580,7 @@ void get_command()
serial_count >= (MAX_CMD_SIZE - 1) || n==-1) serial_count >= (MAX_CMD_SIZE - 1) || n==-1)
{ {
if(card.eof()){ if(card.eof()){
SERIAL_PROTOCOLLNRPGM(MSG_FILE_PRINTED); SERIAL_PROTOCOLLNRPGM(_n("Done printing file"));////MSG_FILE_PRINTED c=0 r=0
stoptime=millis(); stoptime=millis();
char time[30]; char time[30];
unsigned long t=(stoptime-starttime-pause_time)/1000; unsigned long t=(stoptime-starttime-pause_time)/1000;

View file

@ -18,4 +18,10 @@
#define TMC2130_SPCR SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0) #define TMC2130_SPCR SPI_SPCR(TMC2130_SPI_RATE, 1, 1, 1, 0)
#define TMC2130_SPSR SPI_SPSR(TMC2130_SPI_RATE) #define TMC2130_SPSR SPI_SPSR(TMC2130_SPI_RATE)
//LANG - Multi-language support
#define LANG_MODE 0 // primary language only
//#define LANG_MODE 1 // sec. language support
#define LANG_SIZE_RESERVED 0x3000 // reserved space for secondary language (12kb)
#endif //_CONFIG_H #endif //_CONFIG_H

63
Firmware/language.c Normal file
View file

@ -0,0 +1,63 @@
//language.c
#include "language.h"
#include <inttypes.h>
#include <avr/pgmspace.h>
// Currectly active language selection.
unsigned char lang_selected = 0;
#if (LANG_MODE == 0) //primary language only
#else //(LANG_MODE == 0)
//reserved xx kbytes for secondary language table
static const char _SEC_LANG[LANG_SIZE_RESERVED] PROGMEM_I2 = "_SEC_LANG";
#endif //(LANG_MODE == 0)
//lang_table_t structure - 16byte header
typedef struct
{
struct
{
uint32_t magic;
uint16_t size;
uint16_t count;
uint16_t checksum;
uint16_t reserved0;
uint32_t reserved1;
} header;
uint16_t table[];
} lang_table_t;
//lang_table pointer
lang_table_t* lang_table = 0;
const char* lang_get_translation(const char* s)
{
if (lang_selected == 0) return s + 2; //primary language selected
if (lang_table == 0) return s + 2; //sec. lang table not found
uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
if (ui == 0xffff) return s + 2; //translation not found
ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16 + ui*2)))); //read relative offset
return (const char*)((char*)lang_table + ui + 16); //return calculated pointer
}
const char* lang_select(unsigned char lang)
{
#if (LANG_MODE == 0) //primary language only
return 0;
#else //(LANG_MODE == 0)
if (lang == 0) //primary language
{
lang_table = 0;
lang_selected = 0;
return;
}
uint16_t ui = (uint16_t)&_SEC_LANG; //pointer to _SEC_LANG reserved space
ui += 0x0100; //add 1 page
ui &= 0xff00; //align to page
lang_table = ui; //set table pointer
ui = pgm_read_word(((uint16_t*)(((char*)lang_table + 16)))); //read relative offset of first string (language name)
return (const char*)((char*)lang_table + ui + 16); //return calculated pointer
#endif //(LANG_MODE == 0)
}

View file

@ -1,6 +1,9 @@
//language.h
#ifndef LANGUAGE_H #ifndef LANGUAGE_H
#define LANGUAGE_H #define LANGUAGE_H
#include "config.h"
#define PROTOCOL_VERSION "1.0" #define PROTOCOL_VERSION "1.0"
#ifdef CUSTOM_MENDEL_NAME #ifdef CUSTOM_MENDEL_NAME
@ -9,8 +12,6 @@
#define MACHINE_NAME "Mendel" #define MACHINE_NAME "Mendel"
#endif #endif
#ifndef MACHINE_UUID #ifndef MACHINE_UUID
#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" #define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
#endif #endif
@ -20,14 +21,67 @@
#define STRINGIFY_(n) #n #define STRINGIFY_(n) #n
#define STRINGIFY(n) STRINGIFY_(n) #define STRINGIFY(n) STRINGIFY_(n)
#if (LANG_MODE == 0)
//#define _i PSTR
//#define _I(s) (__extension__({static const char __c[] __attribute__((section("Txt_i"))) = s; &__c[0];}))
#endif //(LANG_MODE == 0)
// Common serial messages //section progmem0 will be used for localized translated strings
#define MSG_MARLIN "Marlin" #define PROGMEM_I2 __attribute__((section(".progmem0")))
//section progmem1 will be used for localized strings in english
#define PROGMEM_I1 __attribute__((section(".progmem1")))
//section progmem2 will be used for not localized strings in english
#define PROGMEM_N1 __attribute__((section(".progmem2")))
// Serial Console Messages (do not translate those!) #if (LANG_MODE == 0) //primary language only
#define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = s; &__c[0];}))
#define ISTR(s) s
#define _i(s) _I(s)
#define _T(s) s
#else //(LANG_MODE == 0)
#define _I(s) (__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff"s; &__c[0];}))
#define ISTR(s) "\xff\xff"s
#define _i(s) lang_get_translation(_I(s))
#define _T(s) lang_get_translation(s)
#endif //(LANG_MODE == 0)
#define _N(s) (__extension__({static const char __c[] PROGMEM_N1 = s; &__c[0];}))
#define _n(s) _N(s)
// LCD Menu Messages // Language indices into their particular symbol tables.
#include "language_all.h" #define LANG_ID_EN 0
#define LANG_ID_CZ 1
// 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_CZ
// Number of languages available in the language table.
#define LANG_NUM 2
#if defined(__cplusplus)
extern "C" {
#endif //defined(__cplusplus)
// Currectly active language selection.
extern unsigned char lang_selected;
extern const char* lang_get_translation(const char* s);
extern const char* lang_select(unsigned char lang);
#if defined(__cplusplus)
}
#endif //defined(__cplusplus)
#define CAT2(_s1, _s2) _s1
#define CAT4(_s1, _s2, _s3, _s4) _s1
#define MSG_LANGUAGE_NAME_EXPLICIT(i) ((i==0)?PSTR("ENG"):PSTR("CZE"))
#include "messages.h"
#endif //__LANGUAGE_H #endif //__LANGUAGE_H

View file

@ -2197,7 +2197,7 @@ BedSkewOffsetDetectionResultType find_bed_offset_and_skew(int8_t verbosity_level
lcd_printPGM(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2); lcd_printPGM(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2);
if (iteration > 0) { if (iteration > 0) {
lcd_print_at_PGM(0, next_line + 1, MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION); lcd_print_at_PGM(0, next_line + 1, _i("Iteration "));////MSG_FIND_BED_OFFSET_AND_SKEW_ITERATION c=20 r=0
lcd_implementation_print(int(iteration + 1)); lcd_implementation_print(int(iteration + 1));
} }
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@ -2455,7 +2455,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
#ifdef MESH_BED_CALIBRATION_SHOW_LCD #ifdef MESH_BED_CALIBRATION_SHOW_LCD
uint8_t next_line; uint8_t next_line;
lcd_display_message_fullscreen_P(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1, next_line); lcd_display_message_fullscreen_P(_i("Improving bed calibration point"), next_line);////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE1 c=60 r=0
if (next_line > 3) if (next_line > 3)
next_line = 3; next_line = 3;
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
@ -2468,7 +2468,7 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8
// Print the decrasing ID of the measurement point. // Print the decrasing ID of the measurement point.
#ifdef MESH_BED_CALIBRATION_SHOW_LCD #ifdef MESH_BED_CALIBRATION_SHOW_LCD
lcd_implementation_print_at(0, next_line, mesh_point+1); lcd_implementation_print_at(0, next_line, mesh_point+1);
lcd_printPGM(MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2); lcd_printPGM(_i(" of 4"));////MSG_IMPROVE_BED_OFFSET_AND_SKEW_LINE2 c=14 r=0
#endif /* MESH_BED_CALIBRATION_SHOW_LCD */ #endif /* MESH_BED_CALIBRATION_SHOW_LCD */
// Move up. // Move up.

120
Firmware/messages.c Normal file
View file

@ -0,0 +1,120 @@
//messages.c
#include "language.h"
//this is because we need include Configuration_prusa.h (CUSTOM_MENDEL_NAME)
#define bool char
#define true 1
#define false 0
#include "Configuration_prusa.h"
//internationalized messages
const char MSG_ALL[] PROGMEM_I1 = ISTR("All"); ////c=19 r=1
const char MSG_AUTO_HOME[] PROGMEM_I1 = ISTR("Auto home"); ////c=0 r=0
const char MSG_AUTO_MODE_ON[] PROGMEM_I1 = ISTR("Mode [auto power]"); ////c=0 r=0
const char MSG_BABYSTEP_Z[] PROGMEM_I1 = ISTR("Live adjust Z"); ////c=0 r=0
const char MSG_BABYSTEP_Z_NOT_SET[] PROGMEM_I1 = ISTR("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."); ////c=20 r=12
const char MSG_BED[] PROGMEM_I1 = ISTR("Bed"); ////c=0 r=0
const char MSG_BED_DONE[] PROGMEM_I1 = ISTR("Bed done"); ////c=0 r=0
const char MSG_BED_HEATING[] PROGMEM_I1 = ISTR("Bed Heating"); ////c=0 r=0
const char MSG_BED_LEVELING_FAILED_POINT_LOW[] PROGMEM_I1 = ISTR("Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."); ////c=20 r=4
const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[] PROGMEM_I1 = ISTR("XYZ calibration failed. Please consult the manual."); ////c=20 r=8
const char MSG_CALIBRATE_Z_AUTO[] PROGMEM_I1 = ISTR("Calibrating Z"); ////c=20 r=2
const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////c=0 r=0
const char MSG_CONFIRM_NOZZLE_CLEAN[] PROGMEM_I1 = ISTR("Please clean the nozzle for calibration. Click when done."); ////c=20 r=8
const char MSG_COOLDOWN[] PROGMEM_I1 = ISTR("Cooldown"); ////c=0 r=0
const char MSG_CRASH_DETECTED[] PROGMEM_I1 = ISTR("Crash detected."); ////c=20 r=1
const char MSG_CRASHDETECT_NA[] PROGMEM_I1 = ISTR("Crash det. [N/A]"); ////c=0 r=0
const char MSG_CRASHDETECT_OFF[] PROGMEM_I1 = ISTR("Crash det. [off]"); ////c=0 r=0
const char MSG_CRASHDETECT_ON[] PROGMEM_I1 = ISTR("Crash det. [on]"); ////c=0 r=0
const char MSG_ENDSTOP_HIT[] PROGMEM_I1 = ISTR("TRIGGERED"); ////c=0 r=0
const char MSG_ENDSTOP_OPEN[] PROGMEM_I1 = ISTR("open"); ////c=0 r=0
const char MSG_ENDSTOPS_HIT[] PROGMEM_I1 = ISTR("endstops hit: "); ////c=0 r=0
const char MSG_Enqueing[] PROGMEM_I1 = ISTR("enqueing \""); ////c=0 r=0
const char MSG_ERR_STOPPED[] PROGMEM_I1 = ISTR("Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"); ////c=0 r=0
const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////c=0 r=0
const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17 r=1
const char MSG_FAN_SPEED[] PROGMEM_I1 = ISTR("Fan speed"); ////c=14 r=0
const char MSG_FILAMENT_CLEAN[] PROGMEM_I1 = ISTR("Filament extruding & with correct color?"); ////c=20 r=2
const char MSG_FILAMENT_LOADING_T0[] PROGMEM_I1 = ISTR("Insert filament into extruder 1. Click when done."); ////c=20 r=4
const char MSG_FILAMENT_LOADING_T1[] PROGMEM_I1 = ISTR("Insert filament into extruder 2. Click when done."); ////c=20 r=4
const char MSG_FILAMENT_LOADING_T2[] PROGMEM_I1 = ISTR("Insert filament into extruder 3. Click when done."); ////c=20 r=4
const char MSG_FILAMENT_LOADING_T3[] PROGMEM_I1 = ISTR("Insert filament into extruder 4. Click when done."); ////c=20 r=4
const char MSG_FILAMENTCHANGE[] PROGMEM_I1 = ISTR("Change filament"); ////c=0 r=0
const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[] PROGMEM_I1 = ISTR("Searching bed calibration point"); ////c=60 r=0
const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[] PROGMEM_I1 = ISTR(" of 4"); ////c=14 r=0
const char MSG_FINISHING_MOVEMENTS[] PROGMEM_I1 = ISTR("Finishing movements"); ////c=20 r=1
const char MSG_FOLLOW_CALIBRATION_FLOW[] PROGMEM_I1 = ISTR("Printer has not been calibrated yet. Please follow the manual, chapter First steps, section Calibration flow."); ////c=20 r=8
const char MSG_FSENS_AUTOLOAD_NA[] PROGMEM_I1 = ISTR("F. autoload [N/A]"); ////c=17 r=1
const char MSG_FSENSOR_OFF[] PROGMEM_I1 = ISTR("Fil. sensor [off]"); ////c=0 r=0
const char MSG_FSENSOR_ON[] PROGMEM_I1 = ISTR("Fil. sensor [on]"); ////c=0 r=0
const char MSG_HEATING[] PROGMEM_I1 = ISTR("Heating"); ////c=0 r=0
const char MSG_HEATING_COMPLETE[] PROGMEM_I1 = ISTR("Heating done."); ////c=20 r=0
const char MSG_HOMEYZ[] PROGMEM_I1 = ISTR("Calibrate Z"); ////c=0 r=0
const char MSG_CHOOSE_EXTRUDER[] PROGMEM_I1 = ISTR("Choose extruder:"); ////c=20 r=1
const char MSG_LOAD_FILAMENT[] PROGMEM_I1 = ISTR("Load filament"); ////c=17 r=0
const char MSG_LOADING_FILAMENT[] PROGMEM_I1 = ISTR("Loading filament"); ////c=20 r=0
const char MSG_M117_V2_CALIBRATION[] PROGMEM_I1 = ISTR("M117 First layer cal."); ////c=25 r=1
const char MSG_MAIN[] PROGMEM_I1 = ISTR("Main"); ////c=0 r=0
const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[] PROGMEM_I1 = ISTR("Measuring reference height of calibration point"); ////c=60 r=0
const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[] PROGMEM_I1 = ISTR(" of 9"); ////c=14 r=0
const char MSG_MENU_CALIBRATION[] PROGMEM_I1 = ISTR("Calibration"); ////c=0 r=0
const char MSG_NO[] PROGMEM_I1 = ISTR("No"); ////c=0 r=0
const char MSG_NOZZLE[] PROGMEM_I1 = ISTR("Nozzle"); ////c=0 r=0
const char MSG_OK[] PROGMEM_I1 = ISTR("ok"); ////c=0 r=0
const char MSG_PAPER[] PROGMEM_I1 = ISTR("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."); ////c=20 r=8
const char MSG_PLACE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please place steel sheet on heatbed."); ////c=20 r=4
const char MSG_PLEASE_WAIT[] PROGMEM_I1 = ISTR("Please wait"); ////c=20 r=0
const char MSG_POWERUP[] PROGMEM_I1 = ISTR("PowerUp"); ////c=0 r=0
const char MSG_PREHEAT_NOZZLE[] PROGMEM_I1 = ISTR("Preheat the nozzle!"); ////c=20 r=0
const char MSG_PRESS_TO_UNLOAD[] PROGMEM_I1 = ISTR("Please press the knob to unload filament"); ////c=20 r=4
const char MSG_PRINT_ABORTED[] PROGMEM_I1 = ISTR("Print aborted"); ////c=20 r=0
const char MSG_PULL_OUT_FILAMENT[] PROGMEM_I1 = ISTR("Please pull out filament immediately"); ////c=20 r=4
const char MSG_RECOVER_PRINT[] PROGMEM_I1 = ISTR("Blackout occurred. Recover print?"); ////c=20 r=2
const char MSG_REFRESH[] PROGMEM_I1 = ISTR("\xF8" "Refresh"); ////c=0 r=0
const char MSG_REMOVE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please remove steel sheet from heatbed."); ////c=20 r=4
const char MSG_SD_ERR_WRITE_TO_FILE[] PROGMEM_I1 = ISTR("error writing to file"); ////c=0 r=0
const char MSG_SD_OPEN_FILE_FAIL[] PROGMEM_I1 = ISTR("open failed, File: "); ////c=0 r=0
const char MSG_SD_WORKDIR_FAIL[] PROGMEM_I1 = ISTR("workDir open failed"); ////c=0 r=0
const char MSG_SELFTEST_COOLING_FAN[] PROGMEM_I1 = ISTR("Front print fan?"); ////c=20 r=0
const char MSG_SELFTEST_EXTRUDER_FAN[] PROGMEM_I1 = ISTR("Left hotend fan?"); ////c=20 r=0
const char MSG_SELFTEST_FAILED[] PROGMEM_I1 = ISTR("Selftest failed "); ////c=20 r=0
const char MSG_SELFTEST_FAN[] PROGMEM_I1 = ISTR("Fan test"); ////c=20 r=0
const char MSG_SELFTEST_FAN_NO[] PROGMEM_I1 = ISTR("Not spinning"); ////c=19 r=0
const char MSG_SELFTEST_FAN_YES[] PROGMEM_I1 = ISTR("Spinning"); ////c=19 r=0
const char MSG_SELFTEST_CHECK_BED[] PROGMEM_I1 = ISTR("Checking bed "); ////c=20 r=0
const char MSG_SELFTEST_CHECK_FSENSOR[] PROGMEM_I1 = ISTR("Checking sensors "); ////c=20 r=0
const char MSG_SELFTEST_MOTOR[] PROGMEM_I1 = ISTR("Motor"); ////c=0 r=0
const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////c=0 r=0
const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////c=0 r=0
const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////c=0 r=0
const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode [silent]"); ////c=0 r=0
const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [Normal]"); ////c=0 r=0
const char MSG_STEALTH_MODE_ON[] PROGMEM_I1 = ISTR("Mode [Stealth]"); ////c=0 r=0
const char MSG_STEEL_SHEET_CHECK[] PROGMEM_I1 = ISTR("Is steel sheet on heatbed?"); ////c=20 r=2
const char MSG_STOP_PRINT[] PROGMEM_I1 = ISTR("Stop print"); ////c=0 r=0
const char MSG_STOPPED[] PROGMEM_I1 = ISTR("STOPPED. "); ////c=0 r=0
const char MSG_TEMP_CALIBRATION[] PROGMEM_I1 = ISTR("Temp. cal. "); ////c=20 r=1
const char MSG_TEMP_CALIBRATION_DONE[] PROGMEM_I1 = ISTR("Temperature calibration is finished and active. Temp. calibration can be disabled in menu Settings->Temp. cal."); ////c=20 r=12
const char MSG_UNLOAD_FILAMENT[] PROGMEM_I1 = ISTR("Unload filament"); ////c=17 r=0
const char MSG_UNLOADING_FILAMENT[] PROGMEM_I1 = ISTR("Unloading filament"); ////c=20 r=1
const char MSG_WATCH[] PROGMEM_I1 = ISTR("Info screen"); ////c=0 r=0
const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."); ////c=20 r=8
const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!"); ////c=20 r=8
const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////c=20 r=3
const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////c=20 r=8
const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////c=0 r=0
const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " ready."); ////c=20 r=0
//not internationalized messages
const char MSG_BROWNOUT_RESET[] PROGMEM_N1 = " Brown out Reset"; ////c=0 r=0
const char MSG_EXTERNAL_RESET[] PROGMEM_N1 = " External Reset"; ////c=0 r=0
const char MSG_FILE_SAVED[] PROGMEM_N1 = "Done saving file."; ////c=0 r=0
const char MSG_OFF[] PROGMEM_N1 = "Off"; ////c=0 r=0
const char MSG_ON[] PROGMEM_N1 = "On "; ////c=0 r=0
const char MSG_POSITION_UNKNOWN[] PROGMEM_N1 = "Home X/Y before Z"; ////c=0 r=0
const char MSG_SOFTWARE_RESET[] PROGMEM_N1 = " Software Reset"; ////c=0 r=0
const char MSG_UNKNOWN_COMMAND[] PROGMEM_N1 = "Unknown command: \""; ////c=0 r=0
const char MSG_WATCHDOG_RESET[] PROGMEM_N1 = " Watchdog Reset"; ////c=0 r=0
const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////c=0 r=0
const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////c=0 r=0
const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////c=0 r=0
const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////c=0 r=0

117
Firmware/messages.h Normal file
View file

@ -0,0 +1,117 @@
//messages.h
// Common serial messages
#define MSG_MARLIN "Marlin"
// LCD Menu Messages
//internationalized messages
extern const char MSG_ALL[];
extern const char MSG_AUTO_HOME[];
extern const char MSG_AUTO_MODE_ON[];
extern const char MSG_BABYSTEP_Z[];
extern const char MSG_BABYSTEP_Z_NOT_SET[];
extern const char MSG_BED[];
extern const char MSG_BED_DONE[];
extern const char MSG_BED_HEATING[];
extern const char MSG_BED_LEVELING_FAILED_POINT_LOW[];
extern const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[];
extern const char MSG_CALIBRATE_Z_AUTO[];
extern const char MSG_CARD_MENU[];
extern const char MSG_CONFIRM_NOZZLE_CLEAN[];
extern const char MSG_COOLDOWN[];
extern const char MSG_CRASH_DETECTED[];
extern const char MSG_CRASHDETECT_NA[];
extern const char MSG_CRASHDETECT_OFF[];
extern const char MSG_CRASHDETECT_ON[];
extern const char MSG_ENDSTOP_HIT[];
extern const char MSG_ENDSTOP_OPEN[];
extern const char MSG_ENDSTOPS_HIT[];
extern const char MSG_Enqueing[];
extern const char MSG_ERR_STOPPED[];
extern const char MSG_ERROR[];
extern const char MSG_EXTRUDER[];
extern const char MSG_FAN_SPEED[];
extern const char MSG_FILAMENT_CLEAN[];
extern const char MSG_FILAMENT_LOADING_T0[];
extern const char MSG_FILAMENT_LOADING_T1[];
extern const char MSG_FILAMENT_LOADING_T2[];
extern const char MSG_FILAMENT_LOADING_T3[];
extern const char MSG_FILAMENTCHANGE[];
extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE1[];
extern const char MSG_FIND_BED_OFFSET_AND_SKEW_LINE2[];
extern const char MSG_FINISHING_MOVEMENTS[];
extern const char MSG_FOLLOW_CALIBRATION_FLOW[];
extern const char MSG_FSENS_AUTOLOAD_NA[];
extern const char MSG_FSENSOR_OFF[];
extern const char MSG_FSENSOR_ON[];
extern const char MSG_HEATING[];
extern const char MSG_HEATING_COMPLETE[];
extern const char MSG_HOMEYZ[];
extern const char MSG_CHOOSE_EXTRUDER[];
extern const char MSG_LOAD_FILAMENT[];
extern const char MSG_LOADING_FILAMENT[];
extern const char MSG_M117_V2_CALIBRATION[];
extern const char MSG_MAIN[];
extern const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[];
extern const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[];
extern const char MSG_MENU_CALIBRATION[];
extern const char MSG_NO[];
extern const char MSG_NOZZLE[];
extern const char MSG_OK[];
extern const char MSG_PAPER[];
extern const char MSG_PLACE_STEEL_SHEET[];
extern const char MSG_PLEASE_WAIT[];
extern const char MSG_POWERUP[];
extern const char MSG_PREHEAT_NOZZLE[];
extern const char MSG_PRESS_TO_UNLOAD[];
extern const char MSG_PRINT_ABORTED[];
extern const char MSG_PULL_OUT_FILAMENT[];
extern const char MSG_RECOVER_PRINT[];
extern const char MSG_REFRESH[];
extern const char MSG_REMOVE_STEEL_SHEET[];
extern const char MSG_SD_ERR_WRITE_TO_FILE[];
extern const char MSG_SD_OPEN_FILE_FAIL[];
extern const char MSG_SD_WORKDIR_FAIL[];
extern const char MSG_SELFTEST_COOLING_FAN[];
extern const char MSG_SELFTEST_EXTRUDER_FAN[];
extern const char MSG_SELFTEST_FAILED[];
extern const char MSG_SELFTEST_FAN[];
extern const char MSG_SELFTEST_FAN_NO[];
extern const char MSG_SELFTEST_FAN_YES[];
extern const char MSG_SELFTEST_CHECK_BED[];
extern const char MSG_SELFTEST_CHECK_FSENSOR[];
extern const char MSG_SELFTEST_MOTOR[];
extern const char MSG_SELFTEST_WIRINGERROR[];
extern const char MSG_SETTINGS[];
extern const char MSG_SILENT_MODE_OFF[];
extern const char MSG_SILENT_MODE_ON[];
extern const char MSG_STEALTH_MODE_OFF[];
extern const char MSG_STEALTH_MODE_ON[];
extern const char MSG_STEEL_SHEET_CHECK[];
extern const char MSG_STOP_PRINT[];
extern const char MSG_STOPPED[];
extern const char MSG_TEMP_CALIBRATION[];
extern const char MSG_TEMP_CALIBRATION_DONE[];
extern const char MSG_UNLOAD_FILAMENT[];
extern const char MSG_UNLOADING_FILAMENT[];
extern const char MSG_WATCH[];
extern const char MSG_WIZARD_CALIBRATION_FAILED[];
extern const char MSG_WIZARD_DONE[];
extern const char MSG_WIZARD_HEATING[];
extern const char MSG_WIZARD_QUIT[];
extern const char MSG_YES[];
extern const char WELCOME_MSG[];
//not internationalized messages
extern const char MSG_BROWNOUT_RESET[];
extern const char MSG_EXTERNAL_RESET[];
extern const char MSG_FILE_SAVED[];
extern const char MSG_OFF[];
extern const char MSG_ON[];
extern const char MSG_POSITION_UNKNOWN[];
extern const char MSG_SOFTWARE_RESET[];
extern const char MSG_UNKNOWN_COMMAND[];
extern const char MSG_WATCHDOG_RESET[];
extern const char MSG_Z_MAX[];
extern const char MSG_Z_MIN[];
extern const char MSG_ZPROBE_OUT[];
extern const char MSG_ZPROBE_ZOFFSET[];

View file

@ -742,7 +742,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
de_float = 0; de_float = 0;
#endif #endif
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(MSG_ERR_COLD_EXTRUDE_STOP); SERIAL_ECHOLNRPGM(_i(" cold extrusion prevented"));////MSG_ERR_COLD_EXTRUDE_STOP c=0 r=0
} }
#ifdef PREVENT_LENGTHY_EXTRUDE #ifdef PREVENT_LENGTHY_EXTRUDE
@ -754,7 +754,7 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
de_float = 0; de_float = 0;
#endif #endif
SERIAL_ECHO_START; SERIAL_ECHO_START;
SERIAL_ECHOLNRPGM(MSG_ERR_LONG_EXTRUDE_STOP); SERIAL_ECHOLNRPGM(_n(" too long extrusion prevented"));////MSG_ERR_LONG_EXTRUDE_STOP c=0 r=0
} }
#endif #endif
} }

View file

@ -342,7 +342,7 @@ FORCE_INLINE unsigned short calc_timer(uint16_t step_rate) {
timer = (unsigned short)pgm_read_word_near(table_address); 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); 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) if(timer < 100) { timer = 100; MYSERIAL.print(_i("Steprate too high: ")); MYSERIAL.println(step_rate); }//(20kHz this should never happen)////MSG_STEPPER_TOO_HIGH c=0 r=0
return timer; return timer;
} }

File diff suppressed because it is too large Load diff

View file

@ -968,7 +968,7 @@ if (print_sd_status)
lcd.setCursor(0, 3); lcd.setCursor(0, 3);
lcd_printPGM(PSTR(" ")); lcd_printPGM(PSTR(" "));
lcd.setCursor(0, 3); lcd.setCursor(0, 3);
lcd_printPGM(MSG_HOMEYZ_PROGRESS); lcd_printPGM(_i("Calibrating Z"));////MSG_HOMEYZ_PROGRESS c=0 r=0
lcd_printPGM(PSTR(" : ")); lcd_printPGM(PSTR(" : "));
lcd.print(custom_message_state-10); lcd.print(custom_message_state-10);
} }
@ -986,7 +986,7 @@ if (print_sd_status)
lcd.setCursor(0, 3); lcd.setCursor(0, 3);
lcd_printPGM(PSTR(" ")); lcd_printPGM(PSTR(" "));
lcd.setCursor(0, 3); lcd.setCursor(0, 3);
lcd_printPGM(MSG_HOMEYZ_DONE); lcd_printPGM(_i("Calibration done"));////MSG_HOMEYZ_DONE c=0 r=0
custom_message_state--; custom_message_state--;
} }
} }
@ -1020,7 +1020,7 @@ if (print_sd_status)
// temp compensation preheat // temp compensation preheat
if (custom_message_type == 5) { if (custom_message_type == 5) {
lcd.setCursor(0, 3); lcd.setCursor(0, 3);
lcd_printPGM(MSG_PINDA_PREHEAT); lcd_printPGM(_i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
if (custom_message_state <= PINDA_HEAT_T) { if (custom_message_state <= PINDA_HEAT_T) {
lcd_printPGM(PSTR(": ")); lcd_printPGM(PSTR(": "));
lcd.print(custom_message_state); //seconds lcd.print(custom_message_state); //seconds

View file

@ -289,11 +289,11 @@ bool show_upgrade_dialog_if_version_newer(const char *version_string)
} }
if (upgrade) { if (upgrade) {
lcd_display_message_fullscreen_P(MSG_NEW_FIRMWARE_AVAILABLE); lcd_display_message_fullscreen_P(_i("New firmware version available:"));////MSG_NEW_FIRMWARE_AVAILABLE c=20 r=2
lcd_print_at_PGM(0, 2, PSTR("")); lcd_print_at_PGM(0, 2, PSTR(""));
for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c) for (const char *c = version_string; ! is_whitespace_or_nl_or_eol(*c); ++ c)
lcd_implementation_write(*c); lcd_implementation_write(*c);
lcd_print_at_PGM(0, 3, MSG_NEW_FIRMWARE_PLEASE_UPGRADE); lcd_print_at_PGM(0, 3, _i("Please upgrade."));////MSG_NEW_FIRMWARE_PLEASE_UPGRADE c=20 r=0
tone(BEEPER, 1000); tone(BEEPER, 1000);
delay_keep_alive(50); delay_keep_alive(50);
noTone(BEEPER); noTone(BEEPER);

0
Firmware/langtool.pl → lang_backup/langtool.pl Executable file → Normal file
View file

34
lang_backup/language.h Normal file
View file

@ -0,0 +1,34 @@
#ifndef LANGUAGE_H
#define LANGUAGE_H
#define PROTOCOL_VERSION "1.0"
#ifdef CUSTOM_MENDEL_NAME
// #define CUSTOM_MENDEL_NAME CUSTOM_MENDEL_NAME
#else
#define MACHINE_NAME "Mendel"
#endif
#define _i PSTR
#define _n PSTR
#ifndef MACHINE_UUID
#define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
#endif
#define MSG_FW_VERSION "Firmware"
#define STRINGIFY_(n) #n
#define STRINGIFY(n) STRINGIFY_(n)
// Common serial messages
#define MSG_MARLIN "Marlin"
// Serial Console Messages (do not translate those!)
// LCD Menu Messages
#include "language_all.h"
#endif //__LANGUAGE_H