From 1d561601c7c861d5107114078cc4dcbbe0d63ff4 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 29 Jun 2017 13:32:17 +0200 Subject: [PATCH 01/15] comments added --- Firmware/Marlin_main.cpp | 10 +++++----- Firmware/mesh_bed_calibration.cpp | 5 +++++ Firmware/temperature.cpp | 9 ++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 30035559d..b10b20426 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2540,7 +2540,7 @@ void process_commands() // and correct the current_position to match the transformed coordinate system. world2machine_update_current(); -#if (defined(MESH_BED_LEVELING) && !defined(MK1BP)) +#if (defined(MESH_BED_LEVELING) && !defined(MK1BP)) if (code_seen(axis_codes[X_AXIS]) || code_seen(axis_codes[Y_AXIS]) || code_seen('W') || code_seen(axis_codes[Z_AXIS])) { } @@ -2930,9 +2930,9 @@ void process_commands() */ case 80: -#ifdef MK1BP - break; -#endif //MK1BP +#ifdef MK1BP + break; +#endif //MK1BP case_G80: { mesh_bed_leveling_flag = true; @@ -6602,4 +6602,4 @@ void serialecho_temperatures() { SERIAL_PROTOCOLPGM(" B:"); SERIAL_PROTOCOL_F(degBed(), 1); SERIAL_PROTOCOLLN(""); -} \ No newline at end of file +} diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index ca5312ace..5220c1aff 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -2448,7 +2448,12 @@ void count_xyz_details() { eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 4)) }; a2 = -1 * asin(vec_y[0] / MACHINE_AXIS_SCALE_Y); +/* SERIAL_ECHOLNPGM("par:"); + MYSERIAL.println(vec_y[0]); + MYSERIAL.println(a2);*/ a1 = asin(vec_x[1] / MACHINE_AXIS_SCALE_X); +/* MYSERIAL.println(vec_x[1]); + MYSERIAL.println(a1);*/ angleDiff = fabs(a2 - a1); for (uint8_t mesh_point = 0; mesh_point < 3; ++mesh_point) { float y = vec_x[1] * pgm_read_float(bed_ref_points + mesh_point * 2) + vec_y[1] * pgm_read_float(bed_ref_points + mesh_point * 2 + 1) + cntr[1]; diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 27ceb7d3f..0eae8ded4 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -1074,7 +1074,7 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren static int __preheat_counter[2] = { 0,0}; static int __preheat_errors[2] = { 0,0}; - + #ifdef TEMP_RUNAWAY_BED_TIMEOUT if (_isbed) { @@ -1121,11 +1121,14 @@ void temp_runaway_check(int _heater_id, float _target_temperature, float _curren if (_current_temperature < ((_isbed) ? (0.8 * _target_temperature) : 150)) //check only in area where temperature is changing fastly for heater, check to 0.8 x target temperature for bed { __preheat_counter[_heater_id]++; + //SERIAL_ECHOPGM("counter[0]:"); MYSERIAL.println(__preheat_counter[0]); + //SERIAL_ECHOPGM("counter[1]:"); MYSERIAL.println(__preheat_counter[1]); + //SERIAL_ECHOPGM("_isbed"); MYSERIAL.println(_isbed); if (__preheat_counter[_heater_id] > ((_isbed) ? 16 : 8)) // periodicaly check if current temperature changes { - /*SERIAL_ECHOPGM("Heater:"); + /*SERIAL_ECHOLNPGM("Heater:"); MYSERIAL.print(_heater_id); - SERIAL_ECHOPGM(" T:"); + SERIAL_ECHOPGM(" Current temperature:"); MYSERIAL.print(_current_temperature); SERIAL_ECHOPGM(" Tstart:"); MYSERIAL.print(__preheat_start[_heater_id]);*/ From 5611852e1b9ec51d6110ae7d6deb557bfe5a7560 Mon Sep 17 00:00:00 2001 From: Ted Hess Date: Thu, 29 Jun 2017 14:12:35 -0400 Subject: [PATCH 02/15] Fix/implement M110 command. Allow colons in command - don't treat as EOL. --- Firmware/Marlin_main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 30035559d..3a33aeedd 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1379,7 +1379,6 @@ 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 @@ -1388,7 +1387,6 @@ void get_command() } cmdbuffer[bufindw+serial_count+1] = 0; //terminate string if(!comment_mode){ - comment_mode = false; //for new command if ((strchr_pointer = strstr(cmdbuffer+bufindw+1, "PRUSA")) == NULL && (strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { if ((strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { @@ -4336,6 +4334,12 @@ 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. From 2e57e4822752f6bbfa6668d2ab023b23e5e2808b Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 4 Jul 2017 14:35:58 +0200 Subject: [PATCH 03/15] long beep in multimaterial colorprint fixed --- Firmware/Marlin_main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b10b20426..9aaaa1920 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5054,7 +5054,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp lastpos[Z_AXIS]=current_position[Z_AXIS]; lastpos[E_AXIS]=current_position[E_AXIS]; - //Restract extruder + //Retract extruder if(code_seen('E')) { target[E_AXIS]+= code_value(); @@ -5200,6 +5200,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } } + WRITE(BEEPER, LOW); #ifdef SNMM display_loading(); do { @@ -5215,7 +5216,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp #endif //Filament inserted - WRITE(BEEPER,LOW); + //Feed the filament to the end of nozzle quickly #ifdef SNMM From f89ba2c46aed55d0bfd7464a7057183526d7772b Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 10 Jul 2017 17:30:47 +0200 Subject: [PATCH 04/15] axis steps per unit excluded from M500, version changed --- Firmware/Configuration.h | 2 +- Firmware/ConfigurationStore.cpp | 6 +++--- Firmware/mesh_bed_calibration.cpp | 24 +++++++++++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 387b10e15..4563c66bb 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-RC2" +#define FW_version "3.0.12" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index f7f64094c..e914bf794 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -43,7 +43,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) // 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" +#define EEPROM_VERSION "V2" #ifdef EEPROM_SETTINGS void Config_StoreSettings() @@ -51,7 +51,7 @@ 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,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); @@ -274,7 +274,7 @@ void Config_RetrieveSettings() if (strncmp(ver,stored_ver,3) == 0) { // version number match - EEPROM_READ_VAR(i,axis_steps_per_unit); + //EEPROM_READ_VAR(i,axis_steps_per_unit); EEPROM_READ_VAR(i,max_feedrate); EEPROM_READ_VAR(i,max_acceleration_units_per_sq_second); diff --git a/Firmware/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index 5220c1aff..6176d24db 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -2083,12 +2083,21 @@ BedSkewOffsetDetectionResultType improve_bed_offset_and_skew(int8_t method, int8 for (uint8_t mesh_point = 0; mesh_point < 3; ++ mesh_point) if (pts[mesh_point * 2 + 1] < Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH) too_far_mask |= 1 << mesh_point; - result = calculate_machine_skew_and_offset_LS(pts, 9, bed_ref_points, vec_x, vec_y, cntr, verbosity_level); + + if (verbosity_level >= 20) { + SERIAL_ECHOPGM("Distance from min before calculate_machine skew and offset LS:"); + MYSERIAL.print(int(too_far_mask)); + } + + result = calculate_machine_skew_and_offset_LS(pts, 9, bed_ref_points, vec_x, vec_y, cntr, verbosity_level); if (result < 0) { SERIAL_ECHOLNPGM("Calculation of the machine skew and offset failed."); goto canceled; } // In case of success, update the too_far_mask from the calculated points. + too_far_mask = 0; + if(verbosity_level >= 20) SERIAL_ECHOPGM("Reseting too far mask."); + for (uint8_t mesh_point = 0; mesh_point < 3; ++ mesh_point) { float y = vec_x[1] * pgm_read_float(bed_ref_points+mesh_point*2) + vec_y[1] * pgm_read_float(bed_ref_points+mesh_point*2+1) + cntr[1]; distance_from_min[mesh_point] = (y - Y_MIN_POS_CALIBRATION_POINT_OUT_OF_REACH); @@ -2447,6 +2456,19 @@ void count_xyz_details() { eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 0)), eeprom_read_float((float*)(EEPROM_BED_CALIBRATION_VEC_Y + 4)) }; + SERIAL_ECHOPGM("cntr[0]:"); + MYSERIAL.println(cntr[0]); + SERIAL_ECHOPGM("cntr[1]:"); + MYSERIAL.println(cntr[1]); + SERIAL_ECHOPGM("vec_x[0]:"); + MYSERIAL.println(vec_x[0]); + SERIAL_ECHOPGM("vec_x[1]:"); + MYSERIAL.println(vec_x[1]); + SERIAL_ECHOPGM("vec_y[0]:"); + MYSERIAL.println(vec_y[0]); + SERIAL_ECHOPGM("vec_y[1]:"); + MYSERIAL.println(vec_y[1]); + a2 = -1 * asin(vec_y[0] / MACHINE_AXIS_SCALE_Y); /* SERIAL_ECHOLNPGM("par:"); MYSERIAL.println(vec_y[0]); From 2ace5fc8274842e61c0a7f4511239aa44294cd59 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 11 Jul 2017 16:28:43 +0200 Subject: [PATCH 05/15] tranlations of support menu, retrieving settings from eeprom changed to exclude E steps per unit --- Firmware/ConfigurationStore.cpp | 9 +- Firmware/language_all.cpp | 135 ++++++++++++++++++++++++++++++ Firmware/language_all.h | 18 ++++ Firmware/language_cz.h | 11 ++- Firmware/language_de.h | 11 ++- Firmware/language_en.h | 10 ++- Firmware/language_es.h | 11 ++- Firmware/language_it.h | 11 ++- Firmware/language_pl.h | 11 ++- Firmware/mesh_bed_calibration.cpp | 2 + Firmware/ultralcd.cpp | 27 +++--- 11 files changed, 234 insertions(+), 22 deletions(-) diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index e914bf794..5586ee3d3 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -43,7 +43,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) // 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 "V2" +#define EEPROM_VERSION "V1" #ifdef EEPROM_SETTINGS void Config_StoreSettings() @@ -51,7 +51,7 @@ 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,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); @@ -274,7 +274,7 @@ void Config_RetrieveSettings() if (strncmp(ver,stored_ver,3) == 0) { // version number match - //EEPROM_READ_VAR(i,axis_steps_per_unit); + EEPROM_READ_VAR(i,axis_steps_per_unit); EEPROM_READ_VAR(i,max_feedrate); EEPROM_READ_VAR(i,max_acceleration_units_per_sq_second); @@ -350,6 +350,9 @@ void Config_RetrieveSettings() 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"); } diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 9ba394cc9..9c967baf6 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -560,6 +560,21 @@ const char * const MSG_CARD_MENU_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_CARD_MENU_DE }; +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 * 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 +}; + 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."; @@ -745,6 +760,21 @@ const char * const MSG_CURRENT_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_CURRENT_DE }; +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 * 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 +}; + 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"; @@ -1369,6 +1399,21 @@ const char * const MSG_LANGUAGE_SELECT_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_LANGUAGE_SELECT_DE }; +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 * 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 +}; + 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"; @@ -1584,6 +1629,21 @@ 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 = "Schraeglauf:"; +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 +}; + 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"; @@ -2273,6 +2333,21 @@ const char * const MSG_RESUMING_PRINT_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_RESUMING_PRINT_DE }; +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 * 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 +}; + 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 @@ -2788,6 +2863,21 @@ const char * const MSG_SET_TEMPERATURE_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_SET_TEMPERATURE_DE }; +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 = "Schwerer Schr.:"; +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 +}; + 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"; @@ -2833,6 +2923,21 @@ const char * const MSG_SILENT_MODE_ON_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_SILENT_MODE_ON_DE }; +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 = "Leichter Schr.:"; +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 +}; + const char MSG_SOFTWARE_RESET_EN[] PROGMEM = " Software Reset"; const char * const MSG_SOFTWARE_RESET_LANG_TABLE[1] PROGMEM = { MSG_SOFTWARE_RESET_EN @@ -3347,6 +3452,21 @@ 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 * 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 +}; + const char MSG_X_MAX_EN[] PROGMEM = "x_max: "; const char * const MSG_X_MAX_LANG_TABLE[1] PROGMEM = { MSG_X_MAX_EN @@ -3372,6 +3492,21 @@ const char * const MSG_YES_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_YES_DE }; +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 vom 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 +}; + const char MSG_Y_MAX_EN[] PROGMEM = "y_max: "; const char * const MSG_Y_MAX_LANG_TABLE[1] PROGMEM = { MSG_Y_MAX_EN diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 0ca88d66a..00775307d 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -116,6 +116,8 @@ 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]; @@ -146,6 +148,8 @@ 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]; @@ -268,6 +272,8 @@ extern const char* const MSG_LANGUAGE_NAME_LANG_TABLE[LANG_NUM]; 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]; @@ -310,6 +316,8 @@ 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]; @@ -430,6 +438,8 @@ 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]; @@ -526,12 +536,16 @@ 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]; @@ -616,12 +630,16 @@ 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]; diff --git a/Firmware/language_cz.h b/Firmware/language_cz.h index 5f2e36af5..d9f3715d9 100644 --- a/Firmware/language_cz.h +++ b/Firmware/language_cz.h @@ -301,4 +301,13 @@ #define MSG_EXTRUDER_1 "Extruder 1" #define MSG_EXTRUDER_2 "Extruder 2" #define MSG_EXTRUDER_3 "Extruder 3" -#define MSG_EXTRUDER_4 "Extruder 4" \ No newline at end of file +#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 fe5f41825..aab7c91b9 100644 --- a/Firmware/language_de.h +++ b/Firmware/language_de.h @@ -314,4 +314,13 @@ #define MSG_EXTRUDER_1 "Extruder 1" #define MSG_EXTRUDER_2 "Extruder 2" #define MSG_EXTRUDER_3 "Extruder 3" -#define MSG_EXTRUDER_4 "Extruder 4" \ No newline at end of file +#define MSG_EXTRUDER_4 "Extruder 4" +#define MSG_DATE "Datum" +#define MSG_XYZ_DETAILS "XYZ Kal. Details" +#define MSG_Y_DISTANCE_FROM_MIN "Y Entfernung vom min" +#define MSG_LEFT "Links:" +#define MSG_CENTER "Mitte:" +#define MSG_RIGHT "Rechts:" +#define MSG_MEASURED_SKEW "Schraeglauf:" +#define MSG_SLIGHT_SKEW "Leichter Schr.:" +#define MSG_SEVERE_SKEW "Schwerer Schr.:" \ No newline at end of file diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 2cc2824e6..721385648 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -302,4 +302,12 @@ #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:" \ No newline at end of file diff --git a/Firmware/language_es.h b/Firmware/language_es.h index d44cda831..1d56ed025 100644 --- a/Firmware/language_es.h +++ b/Firmware/language_es.h @@ -295,4 +295,13 @@ #define MSG_EXTRUDER_1 "Extrusor 1" #define MSG_EXTRUDER_2 "Extrusor 2" #define MSG_EXTRUDER_3 "Extrusor 3" -#define MSG_EXTRUDER_4 "Extrusor 4" \ No newline at end of file +#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_it.h b/Firmware/language_it.h index 629754760..d25a17200 100644 --- a/Firmware/language_it.h +++ b/Firmware/language_it.h @@ -286,4 +286,13 @@ #define MSG_EXTRUDER_1 "Estrusore 1" #define MSG_EXTRUDER_2 "Estrusore 2" #define MSG_EXTRUDER_3 "Estrusore 3" -#define MSG_EXTRUDER_4 "Estrusore 4" \ No newline at end of file +#define MSG_EXTRUDER_4 "Estrusore 4" +#define MSG_DATE "Data" +#define MSG_XYZ_DETAILS "XYZ Cal. dettagli" +#define MSG_Y_DISTANCE_FROM_MIN "Distanza Y da min:" +#define MSG_LEFT "Sinistra:" +#define MSG_CENTER "Centro:" +#define MSG_RIGHT "Destra:" +#define MSG_MEASURED_SKEW "Incl. misurata:" +#define MSG_SLIGHT_SKEW "Incl. leggera:" +#define MSG_SEVERE_SKEW "Inc. rilevante:" \ No newline at end of file diff --git a/Firmware/language_pl.h b/Firmware/language_pl.h index 3cd283ded..e953e7c9d 100644 --- a/Firmware/language_pl.h +++ b/Firmware/language_pl.h @@ -298,4 +298,13 @@ #define MSG_EXTRUDER_1 "Ekstruder 1" #define MSG_EXTRUDER_2 "Ekstruder 2" #define MSG_EXTRUDER_3 "Ekstruder 3" -#define MSG_EXTRUDER_4 "Ekstruder 4" \ No newline at end of file +#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/mesh_bed_calibration.cpp b/Firmware/mesh_bed_calibration.cpp index 6176d24db..4d795b0d6 100644 --- a/Firmware/mesh_bed_calibration.cpp +++ b/Firmware/mesh_bed_calibration.cpp @@ -2468,6 +2468,8 @@ void count_xyz_details() { MYSERIAL.println(vec_y[0]); SERIAL_ECHOPGM("vec_y[1]:"); MYSERIAL.println(vec_y[1]); + SERIAL_ECHOPGM("Calibration status:"); + MYSERIAL.println(int(calibration_status())); a2 = -1 * asin(vec_y[0] / MACHINE_AXIS_SCALE_Y); /* SERIAL_ECHOLNPGM("par:"); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 040f5a74b..c731651c5 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -930,7 +930,7 @@ static void lcd_support_menu() MENU_ITEM(back, PSTR(ELECTRONICS),lcd_main_menu); MENU_ITEM(back, PSTR(NOZZLE_TYPE),lcd_main_menu); MENU_ITEM(back, PSTR("------------"), lcd_main_menu); - MENU_ITEM(back, PSTR("Date: "), lcd_main_menu); + MENU_ITEM(back, MSG_DATE, lcd_main_menu); MENU_ITEM(back, PSTR(__DATE__), lcd_main_menu); // Show the FlashAir IP address, if the card is available. @@ -941,7 +941,7 @@ static void lcd_support_menu() } #ifndef MK1BP MENU_ITEM(back, PSTR("------------"), lcd_main_menu); - MENU_ITEM(function, PSTR("XYZ cal. details"), lcd_service_mode_show_result); + if(!IS_SD_PRINTING) MENU_ITEM(function, MSG_XYZ_DETAILS, lcd_service_mode_show_result); #endif //MK1BP END_MENU(); } @@ -1352,16 +1352,16 @@ void lcd_service_mode_show_result() { count_xyz_details(); lcd_update_enable(false); lcd_implementation_clear(); - lcd_printPGM(PSTR("Y distance from min:")); - lcd_print_at_PGM(0, 1, PSTR("Left:")); - lcd_print_at_PGM(0, 2, PSTR("Center:")); - lcd_print_at_PGM(0, 3, PSTR("Right:")); + lcd_printPGM(MSG_Y_DISTANCE_FROM_MIN); + lcd_print_at_PGM(0, 1, MSG_LEFT); + lcd_print_at_PGM(0, 2, MSG_CENTER); + lcd_print_at_PGM(0, 3, MSG_RIGHT); for (int i = 0; i < 3; i++) { if(distance_from_min[i] < 200) { - lcd_print_at_PGM(8, i + 1, PSTR("")); + lcd_print_at_PGM(11, i + 1, PSTR("")); lcd.print(distance_from_min[i]); - lcd_print_at_PGM((distance_from_min[i] < 0) ? 14 : 13, i + 1, PSTR("mm")); - } else lcd_print_at_PGM(8, i + 1, PSTR("N/A")); + lcd_print_at_PGM((distance_from_min[i] < 0) ? 17 : 16, i + 1, PSTR("mm")); + } else lcd_print_at_PGM(11, i + 1, PSTR("N/A")); } delay_keep_alive(500); while (!lcd_clicked()) { @@ -1371,17 +1371,18 @@ void lcd_service_mode_show_result() { lcd_implementation_clear(); - lcd_printPGM(PSTR("Measured skew: ")); + lcd_printPGM(MSG_MEASURED_SKEW); if (angleDiff < 100) { + lcd.setCursor(15, 0); lcd.print(angleDiff * 180 / M_PI); lcd.print(LCD_STR_DEGREE); - }else lcd_print_at_PGM(15, 0, PSTR("N/A")); + }else lcd_print_at_PGM(16, 0, PSTR("N/A")); lcd_print_at_PGM(0, 1, PSTR("--------------------")); - lcd_print_at_PGM(0, 2, PSTR("Slight skew:")); + lcd_print_at_PGM(0, 2, MSG_SLIGHT_SKEW); lcd_print_at_PGM(15, 2, PSTR("")); lcd.print(bed_skew_angle_mild * 180 / M_PI); lcd.print(LCD_STR_DEGREE); - lcd_print_at_PGM(0, 3, PSTR("Severe skew:")); + lcd_print_at_PGM(0, 3, MSG_SEVERE_SKEW); lcd_print_at_PGM(15, 3, PSTR("")); lcd.print(bed_skew_angle_extreme * 180 / M_PI); lcd.print(LCD_STR_DEGREE); From d5fba084e28bf5cd28756aa38875f7eb16e69dd9 Mon Sep 17 00:00:00 2001 From: Sebastianv650 Date: Wed, 14 Jun 2017 17:54:17 +0200 Subject: [PATCH 06/15] LIN_ADVANCE basic port from Marlin This integrates LIN_ADVANCE into the Prusa FW. Note that further checks or updates may be necessary for MM printing! --- Firmware/Configuration_adv.h | 53 +++++++---- Firmware/Marlin_main.cpp | 49 ++++++++++ Firmware/planner.cpp | 70 ++++++++++++++- Firmware/planner.h | 9 ++ Firmware/stepper.cpp | 170 +++++++++++++++++++++++++++++++---- Firmware/stepper.h | 9 ++ 6 files changed, 323 insertions(+), 37 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 54e74ba0a..306496fa0 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -265,24 +265,45 @@ #endif #endif -// extruder advance constant (s2/mm3) -// -// advance (steps) = STEPS_PER_CUBIC_MM_E * EXTRUDER_ADVANCE_K * cubic mm per second ^ 2 -// -// Hooke's law says: force = k * distance -// Bernoulli's principle says: v ^ 2 / 2 + g . h + pressure / density = constant -// so: v ^ 2 is proportional to number of steps we advance the extruder -//#define ADVANCE +/** + * Implementation of linear pressure control + * + * Assumption: advance = k * (delta velocity) + * K=0 means advance disabled. + * See Marlin documentation for calibration instructions. + */ +//#define LIN_ADVANCE -#ifdef ADVANCE - #define EXTRUDER_ADVANCE_K .006 +#ifdef LIN_ADVANCE + #define LIN_ADVANCE_K 0 //Try around 45 for PLA - #define D_FILAMENT 1.75 - #define STEPS_MM_E 174.6 - #define EXTRUSION_AREA (0.25 * D_FILAMENT * D_FILAMENT * 3.14159) - #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS]/ EXTRUSION_AREA) - -#endif // ADVANCE + /** + * Some Slicers produce Gcode with randomly jumping extrusion widths occasionally. + * For example within a 0.4mm perimeter it may produce a single segment of 0.05mm width. + * While this is harmless for normal printing (the fluid nature of the filament will + * close this very, very tiny gap), it throws off the LIN_ADVANCE pressure adaption. + * + * For this case LIN_ADVANCE_E_D_RATIO can be used to set the extrusion:distance ratio + * to a fixed value. Note that using a fixed ratio will lead to wrong nozzle pressures + * if the slicer is using variable widths or layer heights within one print! + * + * This option sets the default E:D ratio at startup. Use `M900` to override this value. + * + * Example: `M900 W0.4 H0.2 D1.75`, where: + * - W is the extrusion width in mm + * - H is the layer height in mm + * - D is the filament diameter in mm + * + * Example: `M900 R0.0458` to set the ratio directly. + * + * Set to 0 to auto-detect the ratio based on given Gcode G1 print moves. + * + * Slic3r (including Prusa Slic3r) produces Gcode compatible with the automatic mode. + * Cura (as of this writing) may produce Gcode incompatible with the automatic mode. + */ + #define LIN_ADVANCE_E_D_RATIO 0 // The calculated ratio (or 0) according to the formula W * H / ((D / 2) ^ 2 * PI) + // Example: 0.4 * 0.2 / ((1.75 / 2) ^ 2 * PI) = 0.033260135 +#endif // Arc interpretation settings: #define MM_PER_ARC_SEGMENT 1 diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 30035559d..f2aaa8ff7 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -199,6 +199,7 @@ // 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. @@ -1610,6 +1611,15 @@ 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); } @@ -1795,6 +1805,39 @@ 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)) @@ -5349,6 +5392,12 @@ 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 diff --git a/Firmware/planner.cpp b/Firmware/planner.cpp index bdfc4ca21..896a0fedf 100644 --- a/Firmware/planner.cpp +++ b/Firmware/planner.cpp @@ -126,6 +126,12 @@ float extrude_min_temp=EXTRUDE_MINTEMP; 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) { @@ -411,6 +417,9 @@ 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; @@ -676,12 +685,22 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate 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); } @@ -1111,7 +1134,38 @@ Having the real displacement of the head, we can calculate the total movement le 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); @@ -1121,6 +1175,12 @@ Having the real displacement of the head, we can calculate the total movement le // 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). @@ -1178,7 +1238,13 @@ void plan_set_position(float x, float y, float z, const float &e) #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]); + 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; @@ -1226,4 +1292,4 @@ void planner_queue_min_reset() { g_cntr_planner_queue_min = moves_planned(); } -#endif /* PLANNER_DIAGNOSTICS */ \ No newline at end of file +#endif /* PLANNER_DIAGNOSTICS */ diff --git a/Firmware/planner.h b/Firmware/planner.h index 30194952d..0858bda30 100644 --- a/Firmware/planner.h +++ b/Firmware/planner.h @@ -88,8 +88,17 @@ typedef struct { // 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; diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index b92f54ee1..f39a9f0f6 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -88,6 +88,26 @@ 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 ============================ //=========================================================================== @@ -308,24 +328,27 @@ FORCE_INLINE void trapezoid_generator_reset() { 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); - + _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) -{ +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? @@ -343,13 +366,13 @@ ISR(TIMER1_COMPA_vect) #ifdef Z_LATE_ENABLE if(current_block->steps_z > 0) { enable_z(); - OCR1A = 2000; //1ms wait + _NEXT_ISR(2000); //1ms wait return; } #endif } else { - OCR1A=2000; // 1kHz. + _NEXT_ISR(2000); // 1kHz. } } @@ -553,6 +576,15 @@ ISR(TIMER1_COMPA_vect) #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) { @@ -596,6 +628,7 @@ ISR(TIMER1_COMPA_vect) #endif } + #ifndef LIN_ADVANCE counter_e += current_block->steps_e; if (counter_e > 0) { WRITE_E_STEP(!INVERT_E_STEP_PIN); @@ -603,9 +636,21 @@ ISR(TIMER1_COMPA_vect) 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; @@ -620,8 +665,15 @@ ISR(TIMER1_COMPA_vect) // step_rate to timer interval timer = calc_timer(acc_step_rate); - OCR1A = timer; + _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); @@ -639,11 +691,25 @@ ISR(TIMER1_COMPA_vect) // step_rate to timer interval timer = calc_timer(step_rate); - OCR1A = timer; + _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 { - OCR1A = OCR1A_nominal; + #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; } @@ -656,6 +722,67 @@ ISR(TIMER1_COMPA_vect) } } +#ifdef LIN_ADVANCE + + // Timer interrupt for E. e_steps is set in the main routine. + + void advance_isr() { + + nextAdvanceISR = eISR_Rate; + + #define SET_E_STEP_DIR(INDEX) \ + if (e_steps) WRITE(E## INDEX ##_DIR_PIN, e_steps < 0 ? INVERT_E## INDEX ##_DIR : !INVERT_E## INDEX ##_DIR) + + #define START_E_PULSE(INDEX) \ + if (e_steps) WRITE(E## INDEX ##_STEP_PIN, !INVERT_E_STEP_PIN) + + #define STOP_E_PULSE(INDEX) \ + if (e_steps) { \ + e_steps < 0 ? ++e_steps : --e_steps; \ + WRITE(E## INDEX ##_STEP_PIN, INVERT_E_STEP_PIN); \ + } + + SET_E_STEP_DIR(0); + + for (uint8_t i = step_loops; i--;) { + START_E_PULSE(0); + + STOP_E_PULSE(0); + } + } + + 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; + } + +#endif // LIN_ADVANCE + void st_init() { digipot_init(); //Initialize Digipot Motor Current @@ -843,6 +970,11 @@ void st_init() OCR1A = 0x4000; TCNT1 = 0; ENABLE_STEPPER_DRIVER_INTERRUPT(); + + #ifdef LIN_ADVANCE + e_steps = 0; + current_adv_steps = 0; + #endif enable_endstops(true); // Start with endstops active. After homing they can be disabled sei(); diff --git a/Firmware/stepper.h b/Firmware/stepper.h index f39fa6012..39c14abba 100644 --- a/Firmware/stepper.h +++ b/Firmware/stepper.h @@ -44,6 +44,15 @@ extern bool abort_on_endstop_hit; // 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(); +#endif + // Block until all buffered steps are executed void st_synchronize(); From d1d3949717656e8effc467a088682988fed19f65 Mon Sep 17 00:00:00 2001 From: Sebastianv650 Date: Wed, 28 Jun 2017 17:48:49 +0200 Subject: [PATCH 07/15] Add SNMM functionality to LIN_ADVANCE --- Firmware/Configuration_adv.h | 2 +- Firmware/Marlin_main.cpp | 7 ++++++- Firmware/stepper.cpp | 36 +++++++++++++++++++----------------- Firmware/stepper.h | 1 + 4 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 306496fa0..1bc928a10 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -275,7 +275,7 @@ //#define LIN_ADVANCE #ifdef LIN_ADVANCE - #define LIN_ADVANCE_K 0 //Try around 45 for PLA + #define LIN_ADVANCE_K 0 //Try around 45 for PLA, around 25 for ABS. /** * Some Slicers produce Gcode with randomly jumping extrusion widths occasionally. diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f2aaa8ff7..8c91d877f 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5549,7 +5549,12 @@ 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 - snmm_extruder = tmp_extruder; + #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; st_synchronize(); delay(100); diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp index f39a9f0f6..7c6a23397 100644 --- a/Firmware/stepper.cpp +++ b/Firmware/stepper.cpp @@ -730,24 +730,21 @@ void isr() { nextAdvanceISR = eISR_Rate; - #define SET_E_STEP_DIR(INDEX) \ - if (e_steps) WRITE(E## INDEX ##_DIR_PIN, e_steps < 0 ? INVERT_E## INDEX ##_DIR : !INVERT_E## INDEX ##_DIR) - - #define START_E_PULSE(INDEX) \ - if (e_steps) WRITE(E## INDEX ##_STEP_PIN, !INVERT_E_STEP_PIN) - - #define STOP_E_PULSE(INDEX) \ - if (e_steps) { \ - e_steps < 0 ? ++e_steps : --e_steps; \ - WRITE(E## INDEX ##_STEP_PIN, INVERT_E_STEP_PIN); \ + 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); } - - SET_E_STEP_DIR(0); - - for (uint8_t i = step_loops; i--;) { - START_E_PULSE(0); - - STOP_E_PULSE(0); } } @@ -780,6 +777,11 @@ void isr() { // 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 diff --git a/Firmware/stepper.h b/Firmware/stepper.h index 39c14abba..3427f12fa 100644 --- a/Firmware/stepper.h +++ b/Firmware/stepper.h @@ -51,6 +51,7 @@ 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 From 625b8acc8e986f4066611cc848f60842b21e0fed Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 19 Jul 2017 16:59:53 +0200 Subject: [PATCH 08/15] eeprom version for multimaterial changed, show message that hardcoded default settings were loaded during printer setup, improved scrolling in sd card menu --- Firmware/ConfigurationStore.cpp | 20 +++++++++++---- Firmware/ConfigurationStore.h | 2 +- Firmware/Marlin_main.cpp | 7 ++++-- Firmware/language_all.cpp | 5 ++++ Firmware/language_all.h | 2 ++ Firmware/language_en.h | 3 ++- .../ultralcd_implementation_hitachi_HD44780.h | 25 ++++++++++--------- 7 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index 5586ee3d3..437836941 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -43,7 +43,13 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) // 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 SNMM + #define EEPROM_VERSION "V1M" +#else + #define EEPROM_VERSION "V1" +#endif + + #ifdef EEPROM_SETTINGS void Config_StoreSettings() @@ -264,12 +270,15 @@ void Config_PrintSettings() #ifdef EEPROM_SETTINGS -void Config_RetrieveSettings() +bool Config_RetrieveSettings() { int i=EEPROM_OFFSET; + bool settings_from_eeprom; char stored_ver[4]; char ver[4]=EEPROM_VERSION; EEPROM_READ_VAR(i,stored_ver); //read stored version + SERIAL_ECHOLNPGM("Stored EEPROM version:"); + MYSERIAL.println(stored_ver); // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]"); if (strncmp(ver,stored_ver,3) == 0) { @@ -350,19 +359,20 @@ void Config_RetrieveSettings() 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_ECHO_START; SERIAL_ECHOLNPGM("Stored settings retrieved"); + settings_from_eeprom = true; } else { Config_ResetDefault(); + settings_from_eeprom = false; } #ifdef EEPROM_CHITCHAT Config_PrintSettings(); #endif + return settings_from_eeprom; } #endif diff --git a/Firmware/ConfigurationStore.h b/Firmware/ConfigurationStore.h index 164aed681..f3254318a 100644 --- a/Firmware/ConfigurationStore.h +++ b/Firmware/ConfigurationStore.h @@ -14,7 +14,7 @@ FORCE_INLINE void Config_PrintSettings() {} #ifdef EEPROM_SETTINGS void Config_StoreSettings(); -void Config_RetrieveSettings(); +bool Config_RetrieveSettings(); #else FORCE_INLINE void Config_StoreSettings() {} FORCE_INLINE void Config_RetrieveSettings() { Config_ResetDefault(); Config_PrintSettings(); } diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 9aaaa1920..a40a97910 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1045,7 +1045,7 @@ void setup() SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); lcd_update_enable(false); // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) - Config_RetrieveSettings(); + settings_from_eeprom = Config_RetrieveSettings(); SdFatUtil::set_stack_guard(); //writes magic number at the end of static variables to protect against overwriting static memory by stack tp_init(); // Initialize temperature loop plan_init(); // Initialize planner; @@ -1211,6 +1211,9 @@ void setup() for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); lcd_update_enable(true); + //If eeprom version for storing parameters to eeprom using M500 changed, default settings are used. Inform user in this case. + if(!setting_from_eeprom) lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); + // Store the currently running firmware into an eeprom, // so the next time the firmware gets updated, it will know from which version it has been updated. update_current_firmware_version_to_eeprom(); @@ -4952,7 +4955,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp #endif - + case 500: // M500 Store settings in EEPROM diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 9c967baf6..d72f1dc17 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -775,6 +775,11 @@ const char * const MSG_DATE_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_DATE_DE }; +const char MSG_DEFAULT_SETTINGS_LOADED_EN[] PROGMEM = "Hardcoded default settings loaded"; +const char * const MSG_DEFAULT_SETTINGS_LOADED_LANG_TABLE[1] PROGMEM = { + MSG_DEFAULT_SETTINGS_LOADED_EN +}; + 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"; diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 00775307d..979123e35 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -150,6 +150,8 @@ 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_DEFAULT_SETTINGS_LOADED_LANG_TABLE[1]; +#define MSG_DEFAULT_SETTINGS_LOADED LANG_TABLE_SELECT_EXPLICIT(MSG_DEFAULT_SETTINGS_LOADED_LANG_TABLE, 0) 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]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 721385648..eb986789a 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -310,4 +310,5 @@ #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:" \ No newline at end of file +#define(length=15, lines=1) MSG_SEVERE_SKEW "Severe skew:" +#define(length=20, lines=4) MSG_DEFAULT_SETTINGS_LOADED "Hardcoded default settings loaded" \ No newline at end of file diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index ba0df06bc..228a75d49 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -1182,33 +1182,34 @@ static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* int i = 1; int j = 0; - int inter = 0; char* longFilenameTMP = longFilename; - - while( ((c = *longFilenameTMP) != '\0') && (inter == 0) ) + + while((c = *longFilenameTMP) != '\0') { lcd.setCursor(i, row); lcd.print(c); i++; longFilenameTMP++; - if(i==LCD_WIDTH){ + if(i==LCD_WIDTH) { i=1; j++; - longFilenameTMP = longFilename; - longFilenameTMP = longFilenameTMP+j; + longFilenameTMP = longFilename + j; n = LCD_WIDTH - 1; - for(int g = 0; ((g<300)&&(inter == 0)) ;g++){ + for(int g = 0; g<300 ;g++){ if(LCD_CLICKED || ( enc_dif != encoderDiff )){ - - // inter = 1; + longFilenameTMP = longFilename; + *(longFilenameTMP + LCD_WIDTH - 2) = '\0'; + int i = 1; + int j = 0; + break; }else{ - delay(1); + if (j == 1) delay(3); //wait around 1.2 s to start scrolling text + delay(1); //then scroll with redrawing every 300 ms } } } - } if(c!='\0'){ lcd.setCursor(i, row); @@ -1217,7 +1218,7 @@ static void lcd_implementation_drawmenu_sdfile_selected(uint8_t row, const char* } n=n-i+1; while(n--) - lcd.print(' '); + lcd.print(' '); } static void lcd_implementation_drawmenu_sdfile(uint8_t row, const char* pstr, const char* filename, char* longFilename) { From 63847b5b162257f61a5ff054ebce28a3bf9f79d1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 19 Jul 2017 17:00:15 +0200 Subject: [PATCH 09/15] changed version --- Firmware/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 4563c66bb..d20e4bb3d 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12" +#define FW_version "3.0.12-1" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 From f2d34d4cd9c9b510def741f1eec22293cbab4a24 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 19 Jul 2017 17:05:36 +0200 Subject: [PATCH 10/15] changed multimaterial eeprom version --- Firmware/ConfigurationStore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index 437836941..b4e58831a 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -44,7 +44,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size) // ALSO: always make sure the variables in the Store and retrieve sections are in the same order. #ifdef SNMM - #define EEPROM_VERSION "V1M" + #define EEPROM_VERSION "M1" #else #define EEPROM_VERSION "V1" #endif From df342c646dff4e295d277e01693166bd1adf53b1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 19 Jul 2017 20:59:38 +0200 Subject: [PATCH 11/15] dont show message that default settings are used if user has never run M500 --- Firmware/ConfigurationStore.cpp | 19 ++++++++++++------- Firmware/Marlin_main.cpp | 15 +++++++-------- Firmware/language_all.cpp | 2 +- Firmware/language_en.h | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Firmware/ConfigurationStore.cpp b/Firmware/ConfigurationStore.cpp index b4e58831a..0011e71df 100644 --- a/Firmware/ConfigurationStore.cpp +++ b/Firmware/ConfigurationStore.cpp @@ -273,13 +273,12 @@ void Config_PrintSettings() bool Config_RetrieveSettings() { int i=EEPROM_OFFSET; - bool settings_from_eeprom; + bool previous_settings_retrieved = true; char stored_ver[4]; char ver[4]=EEPROM_VERSION; EEPROM_READ_VAR(i,stored_ver); //read stored version - SERIAL_ECHOLNPGM("Stored EEPROM version:"); - MYSERIAL.println(stored_ver); - // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]"); + + // SERIAL_ECHOLN("Version: [" << ver << "] Stored version: [" << stored_ver << "]"); if (strncmp(ver,stored_ver,3) == 0) { // version number match @@ -362,17 +361,23 @@ bool Config_RetrieveSettings() SERIAL_ECHO_START; SERIAL_ECHOLNPGM("Stored settings retrieved"); - settings_from_eeprom = true; } else { Config_ResetDefault(); - settings_from_eeprom = false; + + //Return false to inform user that eeprom version was changed and firmware is using default hardcoded settings now. + //In case that storing to eeprom was not used yet, do not inform user that hardcoded settings are used. + if (eeprom_read_byte((uint8_t *)EEPROM_OFFSET) != 0xFF || + eeprom_read_byte((uint8_t *)EEPROM_OFFSET + 1) != 0xFF || + eeprom_read_byte((uint8_t *)EEPROM_OFFSET + 2) != 0xFF) { + previous_settings_retrieved = false; + } } #ifdef EEPROM_CHITCHAT Config_PrintSettings(); #endif - return settings_from_eeprom; + return previous_settings_retrieved; } #endif diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index a40a97910..0d7d5c6e2 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1045,7 +1045,7 @@ void setup() SERIAL_ECHOLN((int)sizeof(block_t)*BLOCK_BUFFER_SIZE); lcd_update_enable(false); // loads data from EEPROM if available else uses defaults (and resets step acceleration rate) - settings_from_eeprom = Config_RetrieveSettings(); + bool previous_settings_retrieved = Config_RetrieveSettings(); SdFatUtil::set_stack_guard(); //writes magic number at the end of static variables to protect against overwriting static memory by stack tp_init(); // Initialize temperature loop plan_init(); // Initialize planner; @@ -1209,11 +1209,14 @@ void setup() lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); } for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); + + //If eeprom version for storing parameters to eeprom using M500 changed, default settings are used. Inform user in this case + if (!previous_settings_retrieved) { + lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); + } + lcd_update_enable(true); - //If eeprom version for storing parameters to eeprom using M500 changed, default settings are used. Inform user in this case. - if(!setting_from_eeprom) lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); - // Store the currently running firmware into an eeprom, // so the next time the firmware gets updated, it will know from which version it has been updated. update_current_firmware_version_to_eeprom(); @@ -4953,10 +4956,6 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } break; #endif - - - - case 500: // M500 Store settings in EEPROM { diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index d72f1dc17..73f8477e1 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -775,7 +775,7 @@ const char * const MSG_DATE_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_DATE_DE }; -const char MSG_DEFAULT_SETTINGS_LOADED_EN[] PROGMEM = "Hardcoded default settings loaded"; +const char MSG_DEFAULT_SETTINGS_LOADED_EN[] PROGMEM = "Default settings loaded"; const char * const MSG_DEFAULT_SETTINGS_LOADED_LANG_TABLE[1] PROGMEM = { MSG_DEFAULT_SETTINGS_LOADED_EN }; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index eb986789a..9a275fa30 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -311,4 +311,4 @@ #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:" -#define(length=20, lines=4) MSG_DEFAULT_SETTINGS_LOADED "Hardcoded default settings loaded" \ No newline at end of file +#define(length=20, lines=4) MSG_DEFAULT_SETTINGS_LOADED "Default settings loaded" \ No newline at end of file From c3fb6e43fd1f354dad1fcac16f676cb3cae16510 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 21 Jul 2017 16:51:36 +0200 Subject: [PATCH 12/15] fan kickstart enabled --- Firmware/Configuration_adv.h | 2 +- Firmware/Marlin_main.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 54e74ba0a..52e2fcc69 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -68,7 +68,7 @@ // When first starting the main fan, run it at full speed for the // given number of milliseconds. This gets the fan spinning reliably // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) -//#define FAN_KICKSTART_TIME 100 +#define FAN_KICKSTART_TIME 1000 diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 0d7d5c6e2..af91a5b65 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1385,7 +1385,7 @@ void get_command() continue; if(serial_char == '\n' || serial_char == '\r' || - (serial_char == ':' && comment_mode == false) || + (serial_char == ':' && comment_mode == false) || serial_count >= (MAX_CMD_SIZE - 1) ) { if(!serial_count) { //if empty line @@ -1394,7 +1394,7 @@ void get_command() } cmdbuffer[bufindw+serial_count+1] = 0; //terminate string if(!comment_mode){ - comment_mode = false; //for new command + comment_mode = false; //for new command if ((strchr_pointer = strstr(cmdbuffer+bufindw+1, "PRUSA")) == NULL && (strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { if ((strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { From 6bbbf3f88ee365b39090f9557bb66ca4272cfb11 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 21 Jul 2017 17:39:36 +0200 Subject: [PATCH 13/15] removed redundant code --- Firmware/Marlin_main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 548001dd3..4ded6e3d6 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1394,8 +1394,7 @@ void get_command() } cmdbuffer[bufindw+serial_count+1] = 0; //terminate string if(!comment_mode){ - comment_mode = false; //for new command - if ((strchr_pointer = strstr(cmdbuffer+bufindw+1, "PRUSA")) == NULL && (strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { + if ((strchr_pointer = strstr(cmdbuffer+bufindw+1, "PRUSA")) == NULL && (strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { if ((strchr_pointer = strchr(cmdbuffer+bufindw+1, 'N')) != NULL) { // Line number met. When sending a G-code over a serial line, each line may be stamped with its index, From 2a7c4f0926141ebcb6425fd50974e2636aeedf0e Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 21 Jul 2017 20:17:00 +0200 Subject: [PATCH 14/15] Farm mode: when print finishes, ask which filament was used for print; statistics modified --- Firmware/ultralcd.cpp | 101 +++++++++++++++++++++++++++++++++++++++--- Firmware/ultralcd.h | 3 +- 2 files changed, 96 insertions(+), 8 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index c731651c5..ec4e9c092 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2042,7 +2042,7 @@ void lcd_diag_show_end_stops() -void prusa_statistics(int _message) { +void prusa_statistics(int _message, uint8_t _fil_nr) { switch (_message) @@ -2111,14 +2111,18 @@ void prusa_statistics(int _message) { break; case 4: // print succesfull - SERIAL_ECHOLN("{[RES:1]"); + SERIAL_ECHO("{[RES:1][FIL:"); + MYSERIAL.print(int(_fil_nr)); + SERIAL_ECHO("]"); prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); farm_timer = 2; break; case 5: // print not succesfull - SERIAL_ECHOLN("{[RES:0]"); + SERIAL_ECHO("{[RES:0][FIL:"); + MYSERIAL.print(int(_fil_nr)); + SERIAL_ECHO("]"); prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); @@ -3603,8 +3607,91 @@ static void lcd_farm_no() } + +unsigned char lcd_choose_color() { + //function returns index of currently chosen item + //following part can be modified from 2 to 255 items: + //----------------------------------------------------- + unsigned char items_no = 2; + const char *item[items_no]; + item[0] = "Black"; + item[1] = "Orange"; + //----------------------------------------------------- + unsigned char active_rows; + static int first = 0; + int enc_dif = 0; + unsigned char cursor_pos = 1; + enc_dif = encoderDiff; + lcd_implementation_clear(); + lcd.setCursor(0, 1); + lcd.print(">"); + + active_rows = items_no < 3 ? items_no : 3; + + while (1) { + lcd_print_at_PGM(0, 0, PSTR("Choose color:")); + for (int i = 0; i < active_rows; i++) { + lcd.setCursor(1, i+1); + lcd.print(item[first + i]); + } + + manage_heater(); + manage_inactivity(true); + + if (abs((enc_dif - encoderDiff)) > 4) { + + if ((abs(enc_dif - encoderDiff)) > 1) { + if (enc_dif > encoderDiff) { + cursor_pos--; + } + + if (enc_dif < encoderDiff) { + cursor_pos++; + } + + if (cursor_pos > active_rows) { + cursor_pos = active_rows; + if (first < items_no - active_rows) { + first++; + lcd_implementation_clear(); + } + } + + if (cursor_pos < 1) { + cursor_pos = 1; + if (first > 0) { + first--; + lcd_implementation_clear(); + } + } + lcd.setCursor(0, 1); + lcd.print(" "); + lcd.setCursor(0, 2); + lcd.print(" "); + lcd.setCursor(0, 3); + lcd.print(" "); + lcd.setCursor(0, cursor_pos); + lcd.print(">"); + enc_dif = encoderDiff; + delay(100); + } + + } + + if (lcd_clicked()) { + while (lcd_clicked()); + delay(10); + while (lcd_clicked()); + return(cursor_pos + first - 1); + } + + } + +} + void lcd_confirm_print() { + uint8_t filament_type; int enc_dif = 0; int cursor_pos = 1; int _ret = 0; @@ -3653,14 +3740,14 @@ void lcd_confirm_print() if (cursor_pos == 1) { _ret = 1; - prusa_statistics(20); - prusa_statistics(4); + filament_type = lcd_choose_color(); + prusa_statistics(4, filament_type); } if (cursor_pos == 2) { _ret = 2; - prusa_statistics(20); - prusa_statistics(5); + filament_type = lcd_choose_color(); + prusa_statistics(5, filament_type); } } diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index a9a1cbf05..2a8fb89e0 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -26,8 +26,9 @@ void lcd_loading_color(); void lcd_force_language_selection(); void lcd_sdcard_stop(); - void prusa_statistics(int _message); + void prusa_statistics(int _message, uint8_t _col_nr = 0); void lcd_confirm_print(); + unsigned char lcd_choose_color(); void lcd_mylang(); bool lcd_detected(void); From fe44e60e5f43c40cadad3b1bb749358a478d6b83 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 21 Jul 2017 20:26:16 +0200 Subject: [PATCH 15/15] version changed --- Firmware/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index d20e4bb3d..56058b0f9 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-1" +#define FW_version "3.0.12-2" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10