2016-03-25 07:19:46 +01:00
|
|
|
/**
|
2016-03-24 19:01:20 +01:00
|
|
|
* Marlin 3D Printer Firmware
|
|
|
|
* Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
|
|
|
|
*
|
|
|
|
* Based on Sprinter and grbl.
|
|
|
|
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-03-25 07:19:46 +01:00
|
|
|
/**
|
2015-04-26 06:04:54 +02:00
|
|
|
* configuration_store.cpp
|
2015-01-28 10:08:48 +01:00
|
|
|
*
|
2017-04-10 04:47:49 +02:00
|
|
|
* Settings and EEPROM storage
|
2015-01-28 10:08:48 +01:00
|
|
|
*
|
2015-04-04 01:38:05 +02:00
|
|
|
* IMPORTANT: Whenever there are changes made to the variables stored in EEPROM
|
|
|
|
* in the functions below, also increment the version number. This makes sure that
|
|
|
|
* the default values are used whenever there is a change to the data, to prevent
|
|
|
|
* wrong data being written to the variables.
|
|
|
|
*
|
|
|
|
* ALSO: Variables in the Store and Retrieve sections must be in the same order.
|
|
|
|
* If a feature is disabled, some data must still be written that, when read,
|
|
|
|
* either sets a Sane Default, or results in No Change to the existing value.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2018-01-04 03:39:08 +01:00
|
|
|
// Change EEPROM version if the structure changes
|
2018-01-07 07:06:21 +01:00
|
|
|
#define EEPROM_VERSION "V49"
|
2016-06-30 03:18:46 +02:00
|
|
|
#define EEPROM_OFFSET 100
|
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
// Check the integrity of data offsets.
|
|
|
|
// Can be disabled for production build.
|
|
|
|
//#define DEBUG_EEPROM_READWRITE
|
|
|
|
|
2017-04-10 04:47:49 +02:00
|
|
|
#include "configuration_store.h"
|
2012-11-07 23:16:43 +01:00
|
|
|
#include "Marlin.h"
|
2015-01-29 06:19:51 +01:00
|
|
|
#include "language.h"
|
2016-07-15 01:12:20 +02:00
|
|
|
#include "endstops.h"
|
2012-11-07 23:16:43 +01:00
|
|
|
#include "planner.h"
|
|
|
|
#include "temperature.h"
|
|
|
|
#include "ultralcd.h"
|
2017-06-03 07:38:07 +02:00
|
|
|
#include "stepper.h"
|
2017-11-10 09:38:53 +01:00
|
|
|
#include "gcode.h"
|
2018-01-04 03:39:08 +01:00
|
|
|
#include "vector_3.h"
|
2017-05-20 10:03:08 +02:00
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
2015-04-28 04:48:34 +02:00
|
|
|
#include "mesh_bed_leveling.h"
|
|
|
|
#endif
|
2015-03-15 23:18:11 +01:00
|
|
|
|
2017-12-25 11:03:40 +01:00
|
|
|
#if HAS_TRINAMIC
|
2017-03-07 06:00:43 +01:00
|
|
|
#include "stepper_indirection.h"
|
|
|
|
#endif
|
|
|
|
|
2017-03-18 16:15:54 +01:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
2017-04-06 02:25:36 +02:00
|
|
|
#include "ubl.h"
|
2017-03-18 16:15:54 +01:00
|
|
|
#endif
|
|
|
|
|
2018-01-04 23:42:56 +01:00
|
|
|
#if ENABLED(FWRETRACT)
|
|
|
|
#include "fwretract.h"
|
|
|
|
#endif
|
|
|
|
|
2018-01-04 03:39:08 +01:00
|
|
|
typedef struct PID { float Kp, Ki, Kd; } PID;
|
|
|
|
typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Current EEPROM Layout
|
|
|
|
*
|
|
|
|
* Keep this data structure up to date so
|
|
|
|
* EEPROM size is known at compile time!
|
|
|
|
*/
|
|
|
|
typedef struct SettingsDataStruct {
|
|
|
|
char version[4]; // Vnn\0
|
|
|
|
uint16_t crc; // Data Checksum
|
|
|
|
|
|
|
|
//
|
|
|
|
// DISTINCT_E_FACTORS
|
|
|
|
//
|
|
|
|
uint8_t esteppers; // XYZE_N - XYZ
|
|
|
|
|
|
|
|
float planner_axis_steps_per_mm[XYZE_N], // M92 XYZE planner.axis_steps_per_mm[XYZE_N]
|
|
|
|
planner_max_feedrate_mm_s[XYZE_N]; // M203 XYZE planner.max_feedrate_mm_s[XYZE_N]
|
|
|
|
uint32_t planner_max_acceleration_mm_per_s2[XYZE_N]; // M201 XYZE planner.max_acceleration_mm_per_s2[XYZE_N]
|
|
|
|
float planner_acceleration, // M204 P planner.acceleration
|
|
|
|
planner_retract_acceleration, // M204 R planner.retract_acceleration
|
|
|
|
planner_travel_acceleration, // M204 T planner.travel_acceleration
|
|
|
|
planner_min_feedrate_mm_s, // M205 S planner.min_feedrate_mm_s
|
|
|
|
planner_min_travel_feedrate_mm_s; // M205 T planner.min_travel_feedrate_mm_s
|
|
|
|
uint32_t planner_min_segment_time_us; // M205 B planner.min_segment_time_us
|
|
|
|
float planner_max_jerk[XYZE]; // M205 XYZE planner.max_jerk[XYZE]
|
|
|
|
|
|
|
|
float home_offset[XYZ]; // M206 XYZ
|
|
|
|
|
|
|
|
#if HOTENDS > 1
|
|
|
|
float hotend_offset[XYZ][HOTENDS - 1]; // M218 XYZ
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// ENABLE_LEVELING_FADE_HEIGHT
|
|
|
|
//
|
|
|
|
float planner_z_fade_height; // M420 Zn planner.z_fade_height
|
|
|
|
|
|
|
|
//
|
|
|
|
// MESH_BED_LEVELING
|
|
|
|
//
|
|
|
|
float mbl_z_offset; // mbl.z_offset
|
|
|
|
uint8_t mesh_num_x, mesh_num_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y
|
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
|
|
|
float mbl_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // mbl.z_values
|
|
|
|
#else
|
|
|
|
float mbl_z_values[3][3];
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// HAS_BED_PROBE
|
|
|
|
//
|
|
|
|
float zprobe_zoffset; // M851 Z
|
|
|
|
|
|
|
|
//
|
|
|
|
// ABL_PLANAR
|
|
|
|
//
|
|
|
|
matrix_3x3 planner_bed_level_matrix; // planner.bed_level_matrix
|
|
|
|
|
|
|
|
//
|
|
|
|
// AUTO_BED_LEVELING_BILINEAR
|
|
|
|
//
|
|
|
|
uint8_t grid_max_x, grid_max_y; // GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y
|
|
|
|
int bilinear_grid_spacing[2],
|
|
|
|
bilinear_start[2]; // G29 L F
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
|
|
|
float z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; // G29
|
|
|
|
#else
|
|
|
|
float z_values[3][3];
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// AUTO_BED_LEVELING_UBL
|
|
|
|
//
|
|
|
|
bool planner_leveling_active; // M420 S planner.leveling_active
|
|
|
|
int8_t ubl_storage_slot; // ubl.storage_slot
|
|
|
|
|
|
|
|
//
|
|
|
|
// DELTA / [XYZ]_DUAL_ENDSTOPS
|
|
|
|
//
|
|
|
|
#if ENABLED(DELTA)
|
|
|
|
float delta_height, // M666 H
|
|
|
|
delta_endstop_adj[ABC], // M666 XYZ
|
|
|
|
delta_radius, // M665 R
|
|
|
|
delta_diagonal_rod, // M665 L
|
|
|
|
delta_segments_per_second, // M665 S
|
|
|
|
delta_calibration_radius, // M665 B
|
|
|
|
delta_tower_angle_trim[ABC]; // M665 XYZ
|
|
|
|
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
float x_endstop_adj, // M666 X
|
|
|
|
y_endstop_adj, // M666 Y
|
|
|
|
z_endstop_adj; // M666 Z
|
|
|
|
float xyz_dual_reserved[8];
|
|
|
|
#else
|
|
|
|
float xyz_dual_placeholder[11];
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//
|
|
|
|
// ULTIPANEL
|
|
|
|
//
|
|
|
|
int lcd_preheat_hotend_temp[2], // M145 S0 H
|
|
|
|
lcd_preheat_bed_temp[2], // M145 S0 B
|
|
|
|
lcd_preheat_fan_speed[2]; // M145 S0 F
|
|
|
|
|
|
|
|
//
|
|
|
|
// PIDTEMP
|
|
|
|
//
|
|
|
|
PIDC hotendPID[MAX_EXTRUDERS]; // M301 En PIDC / M303 En U
|
|
|
|
|
|
|
|
int lpq_len; // M301 L
|
|
|
|
|
|
|
|
//
|
|
|
|
// PIDTEMPBED
|
|
|
|
//
|
|
|
|
PID bedPID; // M304 PID / M303 E-1 U
|
|
|
|
|
|
|
|
//
|
|
|
|
// HAS_LCD_CONTRAST
|
|
|
|
//
|
|
|
|
uint16_t lcd_contrast; // M250 C
|
|
|
|
|
|
|
|
//
|
|
|
|
// FWRETRACT
|
|
|
|
//
|
|
|
|
bool autoretract_enabled; // M209 S
|
|
|
|
float retract_length, // M207 S
|
|
|
|
retract_feedrate_mm_s, // M207 F
|
|
|
|
retract_zlift, // M207 Z
|
|
|
|
retract_recover_length, // M208 S
|
|
|
|
retract_recover_feedrate_mm_s, // M208 F
|
|
|
|
swap_retract_length, // M207 W
|
|
|
|
swap_retract_recover_length, // M208 W
|
|
|
|
swap_retract_recover_feedrate_mm_s; // M208 R
|
|
|
|
|
|
|
|
//
|
|
|
|
// !NO_VOLUMETRIC
|
|
|
|
//
|
|
|
|
bool parser_volumetric_enabled; // M200 D parser.volumetric_enabled
|
|
|
|
float planner_filament_size[MAX_EXTRUDERS]; // M200 T D planner.filament_size[]
|
|
|
|
|
|
|
|
//
|
|
|
|
// HAS_TRINAMIC
|
|
|
|
//
|
|
|
|
uint16_t tmc_stepper_current[11]; // M906 X Y Z X2 Y2 Z2 E0 E1 E2 E3 E4
|
|
|
|
int16_t tmc_sgt[2]; // M914 X Y
|
|
|
|
|
|
|
|
//
|
|
|
|
// LIN_ADVANCE
|
|
|
|
//
|
|
|
|
float planner_extruder_advance_k, // M900 K planner.extruder_advance_k
|
|
|
|
planner_advance_ed_ratio; // M900 WHD planner.advance_ed_ratio
|
|
|
|
|
|
|
|
//
|
|
|
|
// HAS_MOTOR_CURRENT_PWM
|
|
|
|
//
|
|
|
|
uint32_t motor_current_setting[XYZ]; // M907 X Z E
|
|
|
|
|
|
|
|
//
|
|
|
|
// CNC_COORDINATE_SYSTEMS
|
|
|
|
//
|
|
|
|
float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ]; // G54-G59.3
|
|
|
|
|
|
|
|
//
|
|
|
|
// SKEW_CORRECTION
|
|
|
|
//
|
|
|
|
float planner_xy_skew_factor, // M852 I planner.xy_skew_factor
|
|
|
|
planner_xz_skew_factor, // M852 J planner.xz_skew_factor
|
|
|
|
planner_yz_skew_factor; // M852 K planner.yz_skew_factor
|
|
|
|
|
|
|
|
//
|
|
|
|
// ADVANCED_PAUSE_FEATURE
|
|
|
|
//
|
|
|
|
float filament_change_unload_length[MAX_EXTRUDERS], // M603 T U
|
|
|
|
filament_change_load_length[MAX_EXTRUDERS]; // M603 T L
|
|
|
|
|
|
|
|
} SettingsData;
|
|
|
|
|
|
|
|
MarlinSettings settings;
|
|
|
|
|
2017-04-22 05:45:02 +02:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
|
|
|
extern void refresh_bed_level();
|
2016-12-10 07:17:49 +01:00
|
|
|
#endif
|
|
|
|
|
2018-01-04 03:39:08 +01:00
|
|
|
uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); }
|
2017-10-13 23:16:32 +02:00
|
|
|
|
2015-04-27 03:44:01 +02:00
|
|
|
/**
|
2017-11-16 07:23:21 +01:00
|
|
|
* Post-process after Retrieve or Reset
|
|
|
|
*/
|
2018-01-04 03:39:08 +01:00
|
|
|
|
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
|
|
|
float new_z_fade_height;
|
|
|
|
#endif
|
|
|
|
|
2017-04-10 04:47:49 +02:00
|
|
|
void MarlinSettings::postprocess() {
|
2017-12-11 03:24:13 +01:00
|
|
|
const float oldpos[] = { current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] };
|
|
|
|
|
2016-06-30 03:19:26 +02:00
|
|
|
// steps per s2 needs to be updated to agree with units per s2
|
|
|
|
planner.reset_acceleration_rates();
|
|
|
|
|
2016-07-24 04:36:26 +02:00
|
|
|
// Make sure delta kinematics are updated before refreshing the
|
|
|
|
// planner position so the stepper counts will be set correctly.
|
2016-06-30 03:19:26 +02:00
|
|
|
#if ENABLED(DELTA)
|
2017-11-08 09:43:29 +01:00
|
|
|
recalc_delta_settings();
|
2016-06-30 03:19:26 +02:00
|
|
|
#endif
|
2012-11-07 23:16:43 +01:00
|
|
|
|
2016-06-30 03:19:26 +02:00
|
|
|
#if ENABLED(PIDTEMP)
|
|
|
|
thermalManager.updatePID();
|
|
|
|
#endif
|
2012-11-07 23:16:43 +01:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
#if DISABLED(NO_VOLUMETRICS)
|
|
|
|
planner.calculate_volumetric_multipliers();
|
2017-12-27 02:39:39 +01:00
|
|
|
#else
|
|
|
|
for (uint8_t i = COUNT(planner.e_factor); i--;)
|
|
|
|
planner.refresh_e_factor(i);
|
2017-12-20 03:33:41 +01:00
|
|
|
#endif
|
2016-08-19 08:00:46 +02:00
|
|
|
|
2017-04-15 04:41:21 +02:00
|
|
|
#if HAS_HOME_OFFSET || ENABLED(DUAL_X_CARRIAGE)
|
2017-03-05 01:01:33 +01:00
|
|
|
// Software endstops depend on home_offset
|
|
|
|
LOOP_XYZ(i) update_software_endstops((AxisEnum)i);
|
|
|
|
#endif
|
2017-02-21 13:49:31 +01:00
|
|
|
|
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
2017-12-11 03:24:13 +01:00
|
|
|
set_z_fade_height(new_z_fade_height, false); // false = no report
|
2017-02-21 13:49:31 +01:00
|
|
|
#endif
|
2017-04-11 12:05:23 +02:00
|
|
|
|
2017-04-22 05:45:02 +02:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
|
|
|
refresh_bed_level();
|
|
|
|
//set_bed_leveling_enabled(leveling_is_on);
|
|
|
|
#endif
|
2017-06-03 07:38:07 +02:00
|
|
|
|
|
|
|
#if HAS_MOTOR_CURRENT_PWM
|
|
|
|
stepper.refresh_motor_power();
|
|
|
|
#endif
|
2017-11-01 19:08:46 +01:00
|
|
|
|
2017-12-11 03:24:13 +01:00
|
|
|
// Refresh steps_to_mm with the reciprocal of axis_steps_per_mm
|
|
|
|
// and init stepper.count[], planner.position[] with current_position
|
|
|
|
planner.refresh_positioning();
|
|
|
|
|
|
|
|
// Various factors can change the current position
|
|
|
|
if (memcmp(oldpos, current_position, sizeof(oldpos)))
|
|
|
|
report_current_position();
|
2016-06-30 03:19:26 +02:00
|
|
|
}
|
2012-11-07 23:16:43 +01:00
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(EEPROM_SETTINGS)
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
#define DUMMY_PID_VALUE 3000.0f
|
|
|
|
#define EEPROM_START() int eeprom_index = EEPROM_OFFSET
|
|
|
|
#define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR)
|
|
|
|
#define EEPROM_WRITE(VAR) write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc)
|
|
|
|
#define EEPROM_READ(VAR) read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc)
|
2018-01-03 00:22:48 +01:00
|
|
|
#define EEPROM_READ_ALWAYS(VAR) read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, true)
|
2018-01-04 03:24:42 +01:00
|
|
|
#define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START(); SERIAL_ERRORLNPGM(ERR); eeprom_error = true; }while(0)
|
|
|
|
|
|
|
|
#if ENABLED(DEBUG_EEPROM_READWRITE)
|
2018-01-06 01:57:54 +01:00
|
|
|
#define _FIELD_TEST(FIELD) \
|
|
|
|
EEPROM_ASSERT( \
|
|
|
|
eeprom_error || eeprom_index == offsetof(SettingsData, FIELD) + EEPROM_OFFSET, \
|
|
|
|
"Field " STRINGIFY(FIELD) " mismatch." \
|
2018-01-04 03:24:42 +01:00
|
|
|
)
|
|
|
|
#else
|
|
|
|
#define _FIELD_TEST(FIELD) NOOP
|
|
|
|
#endif
|
2017-05-07 03:00:56 +02:00
|
|
|
|
2016-12-09 13:13:44 +01:00
|
|
|
const char version[4] = EEPROM_VERSION;
|
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
bool MarlinSettings::eeprom_error, MarlinSettings::validating;
|
2017-04-10 04:47:49 +02:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
void MarlinSettings::write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) {
|
2018-01-04 03:40:28 +01:00
|
|
|
if (eeprom_error) { pos += size; return; }
|
2016-12-09 13:13:44 +01:00
|
|
|
while (size--) {
|
|
|
|
uint8_t * const p = (uint8_t * const)pos;
|
2017-05-07 03:00:56 +02:00
|
|
|
uint8_t v = *value;
|
2016-12-09 13:13:44 +01:00
|
|
|
// EEPROM has only ~100,000 write cycles,
|
|
|
|
// so only write bytes that have changed!
|
|
|
|
if (v != eeprom_read_byte(p)) {
|
|
|
|
eeprom_write_byte(p, v);
|
|
|
|
if (eeprom_read_byte(p) != v) {
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_ECHO_START();
|
2016-12-09 13:13:44 +01:00
|
|
|
SERIAL_ECHOLNPGM(MSG_ERR_EEPROM_WRITE);
|
2017-05-07 03:00:56 +02:00
|
|
|
eeprom_error = true;
|
2016-12-09 13:13:44 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2017-05-07 03:00:56 +02:00
|
|
|
crc16(crc, &v, 1);
|
2016-12-09 13:13:44 +01:00
|
|
|
pos++;
|
|
|
|
value++;
|
|
|
|
};
|
|
|
|
}
|
2017-05-07 03:00:56 +02:00
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
void MarlinSettings::read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool force/*=false*/) {
|
2018-01-04 03:40:28 +01:00
|
|
|
if (eeprom_error) { pos += size; return; }
|
2016-12-09 13:13:44 +01:00
|
|
|
do {
|
|
|
|
uint8_t c = eeprom_read_byte((unsigned char*)pos);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating || force) *value = c;
|
2017-05-07 03:00:56 +02:00
|
|
|
crc16(crc, &c, 1);
|
2016-12-09 13:13:44 +01:00
|
|
|
pos++;
|
|
|
|
value++;
|
|
|
|
} while (--size);
|
|
|
|
}
|
|
|
|
|
2018-01-04 03:40:28 +01:00
|
|
|
bool MarlinSettings::size_error(const uint16_t size) {
|
|
|
|
if (size != datasize()) {
|
|
|
|
SERIAL_ERROR_START();
|
|
|
|
SERIAL_ERRORLNPGM("EEPROM datasize error.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
/**
|
|
|
|
* M500 - Store Configuration
|
|
|
|
*/
|
2017-04-10 04:47:49 +02:00
|
|
|
bool MarlinSettings::save() {
|
2016-10-29 01:55:42 +02:00
|
|
|
float dummy = 0.0f;
|
2018-01-06 01:57:54 +01:00
|
|
|
char ver[4] = "ERR";
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
uint16_t working_crc = 0;
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_START();
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
eeprom_error = false;
|
2016-12-09 12:45:04 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(ver); // invalidate data first
|
2017-05-07 03:00:56 +02:00
|
|
|
EEPROM_SKIP(working_crc); // Skip the checksum slot
|
2016-06-30 03:12:23 +02:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
working_crc = 0; // clear before first "real data"
|
2016-07-24 19:19:49 +02:00
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(esteppers);
|
|
|
|
|
2016-12-16 06:15:12 +01:00
|
|
|
const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ;
|
2016-12-09 12:45:55 +01:00
|
|
|
EEPROM_WRITE(esteppers);
|
2016-12-14 14:13:25 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(planner.axis_steps_per_mm);
|
|
|
|
EEPROM_WRITE(planner.max_feedrate_mm_s);
|
|
|
|
EEPROM_WRITE(planner.max_acceleration_mm_per_s2);
|
2016-12-09 12:45:55 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(planner.acceleration);
|
|
|
|
EEPROM_WRITE(planner.retract_acceleration);
|
|
|
|
EEPROM_WRITE(planner.travel_acceleration);
|
|
|
|
EEPROM_WRITE(planner.min_feedrate_mm_s);
|
|
|
|
EEPROM_WRITE(planner.min_travel_feedrate_mm_s);
|
2017-10-14 22:47:53 +02:00
|
|
|
EEPROM_WRITE(planner.min_segment_time_us);
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(planner.max_jerk);
|
2018-01-04 03:24:42 +01:00
|
|
|
|
|
|
|
_FIELD_TEST(home_offset);
|
|
|
|
|
2017-04-15 04:41:21 +02:00
|
|
|
#if !HAS_HOME_OFFSET
|
2017-03-31 21:58:40 +02:00
|
|
|
const float home_offset[XYZ] = { 0 };
|
|
|
|
#endif
|
2017-11-09 06:21:02 +01:00
|
|
|
EEPROM_WRITE(home_offset);
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-10-29 01:39:23 +02:00
|
|
|
#if HOTENDS > 1
|
|
|
|
// Skip hotend 0 which must be 0
|
|
|
|
for (uint8_t e = 1; e < HOTENDS; e++)
|
2016-10-29 01:55:42 +02:00
|
|
|
LOOP_XYZ(i) EEPROM_WRITE(hotend_offset[i][e]);
|
2016-10-29 01:39:23 +02:00
|
|
|
#endif
|
|
|
|
|
2017-02-21 13:49:31 +01:00
|
|
|
//
|
2017-04-22 23:04:28 +02:00
|
|
|
// Global Leveling
|
2017-02-21 13:49:31 +01:00
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
2017-04-22 23:04:28 +02:00
|
|
|
const float zfh = planner.z_fade_height;
|
2017-02-21 13:49:31 +01:00
|
|
|
#else
|
2017-04-22 23:04:28 +02:00
|
|
|
const float zfh = 10.0;
|
2017-02-21 13:49:31 +01:00
|
|
|
#endif
|
2017-04-22 23:04:28 +02:00
|
|
|
EEPROM_WRITE(zfh);
|
2017-02-21 13:49:31 +01:00
|
|
|
|
2016-12-10 07:17:49 +01:00
|
|
|
//
|
|
|
|
// Mesh Bed Leveling
|
|
|
|
//
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
2016-10-29 01:55:42 +02:00
|
|
|
// Compile time test that sizeof(mbl.z_values) is as expected
|
2017-04-18 22:26:27 +02:00
|
|
|
static_assert(
|
2017-05-12 06:22:35 +02:00
|
|
|
sizeof(mbl.z_values) == GRID_MAX_POINTS * sizeof(mbl.z_values[0][0]),
|
2017-04-18 22:26:27 +02:00
|
|
|
"MBL Z array is the wrong size."
|
|
|
|
);
|
2017-04-06 05:29:44 +02:00
|
|
|
const uint8_t mesh_num_x = GRID_MAX_POINTS_X, mesh_num_y = GRID_MAX_POINTS_Y;
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(mbl.z_offset);
|
|
|
|
EEPROM_WRITE(mesh_num_x);
|
|
|
|
EEPROM_WRITE(mesh_num_y);
|
|
|
|
EEPROM_WRITE(mbl.z_values);
|
2017-04-22 23:04:28 +02:00
|
|
|
#else // For disabled MBL write a default mesh
|
2016-10-29 01:55:42 +02:00
|
|
|
dummy = 0.0f;
|
2016-12-14 08:44:39 +01:00
|
|
|
const uint8_t mesh_num_x = 3, mesh_num_y = 3;
|
2016-12-10 07:17:49 +01:00
|
|
|
EEPROM_WRITE(dummy); // z_offset
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(mesh_num_x);
|
|
|
|
EEPROM_WRITE(mesh_num_y);
|
2016-12-10 07:17:49 +01:00
|
|
|
for (uint8_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_WRITE(dummy);
|
2015-04-27 06:06:04 +02:00
|
|
|
#endif // MESH_BED_LEVELING
|
2015-03-15 23:18:11 +01:00
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(zprobe_zoffset);
|
|
|
|
|
2016-06-15 03:05:20 +02:00
|
|
|
#if !HAS_BED_PROBE
|
2017-04-11 12:05:23 +02:00
|
|
|
const float zprobe_zoffset = 0;
|
2015-03-26 05:14:00 +01:00
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(zprobe_zoffset);
|
2015-03-26 05:14:00 +01:00
|
|
|
|
2016-12-14 08:50:06 +01:00
|
|
|
//
|
|
|
|
// Planar Bed Leveling matrix
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ABL_PLANAR
|
|
|
|
EEPROM_WRITE(planner.bed_level_matrix);
|
|
|
|
#else
|
|
|
|
dummy = 0.0;
|
|
|
|
for (uint8_t q = 9; q--;) EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
2016-12-10 07:17:49 +01:00
|
|
|
//
|
|
|
|
// Bilinear Auto Bed Leveling
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
2017-04-22 05:46:19 +02:00
|
|
|
// Compile time test that sizeof(z_values) is as expected
|
2017-04-18 22:26:27 +02:00
|
|
|
static_assert(
|
2017-05-12 06:22:35 +02:00
|
|
|
sizeof(z_values) == GRID_MAX_POINTS * sizeof(z_values[0][0]),
|
2017-04-18 22:26:27 +02:00
|
|
|
"Bilinear Z array is the wrong size."
|
|
|
|
);
|
2017-04-06 05:29:44 +02:00
|
|
|
const uint8_t grid_max_x = GRID_MAX_POINTS_X, grid_max_y = GRID_MAX_POINTS_Y;
|
2016-12-10 07:17:49 +01:00
|
|
|
EEPROM_WRITE(grid_max_x); // 1 byte
|
|
|
|
EEPROM_WRITE(grid_max_y); // 1 byte
|
|
|
|
EEPROM_WRITE(bilinear_grid_spacing); // 2 ints
|
|
|
|
EEPROM_WRITE(bilinear_start); // 2 ints
|
2017-04-22 05:46:19 +02:00
|
|
|
EEPROM_WRITE(z_values); // 9-256 floats
|
2016-12-10 07:17:49 +01:00
|
|
|
#else
|
|
|
|
// For disabled Bilinear Grid write an empty 3x3 grid
|
|
|
|
const uint8_t grid_max_x = 3, grid_max_y = 3;
|
|
|
|
const int bilinear_start[2] = { 0 }, bilinear_grid_spacing[2] = { 0 };
|
|
|
|
dummy = 0.0f;
|
|
|
|
EEPROM_WRITE(grid_max_x);
|
|
|
|
EEPROM_WRITE(grid_max_y);
|
|
|
|
EEPROM_WRITE(bilinear_grid_spacing);
|
|
|
|
EEPROM_WRITE(bilinear_start);
|
|
|
|
for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_WRITE(dummy);
|
|
|
|
#endif // AUTO_BED_LEVELING_BILINEAR
|
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(planner_leveling_active);
|
|
|
|
|
2017-04-22 23:04:28 +02:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
2017-10-13 23:16:32 +02:00
|
|
|
EEPROM_WRITE(planner.leveling_active);
|
2017-10-14 04:58:45 +02:00
|
|
|
EEPROM_WRITE(ubl.storage_slot);
|
2017-04-22 23:04:28 +02:00
|
|
|
#else
|
2017-05-16 09:34:36 +02:00
|
|
|
const bool ubl_active = false;
|
2017-05-07 03:00:56 +02:00
|
|
|
const int8_t storage_slot = -1;
|
2017-04-22 23:04:28 +02:00
|
|
|
EEPROM_WRITE(ubl_active);
|
2017-05-07 03:00:56 +02:00
|
|
|
EEPROM_WRITE(storage_slot);
|
2017-05-09 19:35:43 +02:00
|
|
|
#endif // AUTO_BED_LEVELING_UBL
|
2017-04-22 23:04:28 +02:00
|
|
|
|
2017-12-01 05:22:15 +01:00
|
|
|
// 11 floats for DELTA / [XYZ]_DUAL_ENDSTOPS
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(DELTA)
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(delta_height);
|
2017-11-09 06:21:02 +01:00
|
|
|
EEPROM_WRITE(delta_height); // 1 float
|
2017-10-27 06:49:20 +02:00
|
|
|
EEPROM_WRITE(delta_endstop_adj); // 3 floats
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(delta_radius); // 1 float
|
|
|
|
EEPROM_WRITE(delta_diagonal_rod); // 1 float
|
|
|
|
EEPROM_WRITE(delta_segments_per_second); // 1 float
|
2017-04-29 16:36:33 +02:00
|
|
|
EEPROM_WRITE(delta_calibration_radius); // 1 float
|
2017-09-24 08:45:31 +02:00
|
|
|
EEPROM_WRITE(delta_tower_angle_trim); // 3 floats
|
2017-10-27 23:24:34 +02:00
|
|
|
|
|
|
|
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS)
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(x_endstop_adj);
|
2017-10-27 23:24:34 +02:00
|
|
|
// Write dual endstops in X, Y, Z order. Unused = 0.0
|
2017-04-29 16:36:33 +02:00
|
|
|
dummy = 0.0f;
|
2017-10-27 23:24:34 +02:00
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_WRITE(x_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_WRITE(y_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_WRITE(z_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
2017-12-01 05:22:15 +01:00
|
|
|
for (uint8_t q = 8; q--;) EEPROM_WRITE(dummy);
|
2017-10-27 23:24:34 +02:00
|
|
|
|
2015-01-28 10:08:48 +01:00
|
|
|
#else
|
2015-03-24 18:06:44 +01:00
|
|
|
dummy = 0.0f;
|
2017-12-01 05:22:15 +01:00
|
|
|
for (uint8_t q = 11; q--;) EEPROM_WRITE(dummy);
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(lcd_preheat_hotend_temp);
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if DISABLED(ULTIPANEL)
|
2017-06-06 00:41:38 +02:00
|
|
|
constexpr int lcd_preheat_hotend_temp[2] = { PREHEAT_1_TEMP_HOTEND, PREHEAT_2_TEMP_HOTEND },
|
|
|
|
lcd_preheat_bed_temp[2] = { PREHEAT_1_TEMP_BED, PREHEAT_2_TEMP_BED },
|
|
|
|
lcd_preheat_fan_speed[2] = { PREHEAT_1_FAN_SPEED, PREHEAT_2_FAN_SPEED };
|
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2016-10-27 09:40:37 +02:00
|
|
|
EEPROM_WRITE(lcd_preheat_hotend_temp);
|
|
|
|
EEPROM_WRITE(lcd_preheat_bed_temp);
|
|
|
|
EEPROM_WRITE(lcd_preheat_fan_speed);
|
2016-10-29 01:55:42 +02:00
|
|
|
|
|
|
|
for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
|
|
|
|
|
|
|
|
#if ENABLED(PIDTEMP)
|
|
|
|
if (e < HOTENDS) {
|
|
|
|
EEPROM_WRITE(PID_PARAM(Kp, e));
|
|
|
|
EEPROM_WRITE(PID_PARAM(Ki, e));
|
|
|
|
EEPROM_WRITE(PID_PARAM(Kd, e));
|
2016-08-01 02:49:34 +02:00
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(PID_PARAM(Kc, e));
|
2015-01-28 10:08:48 +01:00
|
|
|
#else
|
2016-10-29 01:55:42 +02:00
|
|
|
dummy = 1.0f; // 1.0 = default kc
|
|
|
|
EEPROM_WRITE(dummy);
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
else
|
|
|
|
#endif // !PIDTEMP
|
|
|
|
{
|
|
|
|
dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
|
|
|
|
EEPROM_WRITE(dummy); // Kp
|
|
|
|
dummy = 0.0f;
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
|
2015-01-28 10:08:48 +01:00
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
|
|
|
|
} // Hotends Loop
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-08-01 02:49:34 +02:00
|
|
|
#if DISABLED(PID_EXTRUSION_SCALING)
|
2016-10-29 01:55:42 +02:00
|
|
|
int lpq_len = 20;
|
2015-08-31 04:04:30 +02:00
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(lpq_len);
|
|
|
|
|
|
|
|
#if DISABLED(PIDTEMPBED)
|
|
|
|
dummy = DUMMY_PID_VALUE;
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy);
|
2016-04-29 03:18:13 +02:00
|
|
|
#else
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(thermalManager.bedKp);
|
|
|
|
EEPROM_WRITE(thermalManager.bedKi);
|
|
|
|
EEPROM_WRITE(thermalManager.bedKd);
|
2015-04-04 01:38:05 +02:00
|
|
|
#endif
|
|
|
|
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(lcd_contrast);
|
|
|
|
|
2016-05-31 20:47:02 +02:00
|
|
|
#if !HAS_LCD_CONTRAST
|
2017-05-21 02:54:23 +02:00
|
|
|
const uint16_t lcd_contrast = 32;
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_WRITE(lcd_contrast);
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-07-18 05:01:41 +02:00
|
|
|
#if DISABLED(FWRETRACT)
|
|
|
|
const bool autoretract_enabled = false;
|
2018-01-04 23:42:56 +01:00
|
|
|
const float autoretract_defaults[] = { 3, 45, 0, 0, 0, 13, 0, 8 };
|
|
|
|
EEPROM_WRITE(autoretract_enabled);
|
|
|
|
EEPROM_WRITE(autoretract_defaults);
|
|
|
|
#else
|
|
|
|
EEPROM_WRITE(fwretract.autoretract_enabled);
|
|
|
|
EEPROM_WRITE(fwretract.retract_length);
|
|
|
|
EEPROM_WRITE(fwretract.retract_feedrate_mm_s);
|
|
|
|
EEPROM_WRITE(fwretract.retract_zlift);
|
|
|
|
EEPROM_WRITE(fwretract.retract_recover_length);
|
|
|
|
EEPROM_WRITE(fwretract.retract_recover_feedrate_mm_s);
|
|
|
|
EEPROM_WRITE(fwretract.swap_retract_length);
|
|
|
|
EEPROM_WRITE(fwretract.swap_retract_recover_length);
|
|
|
|
EEPROM_WRITE(fwretract.swap_retract_recover_feedrate_mm_s);
|
2017-07-18 05:01:41 +02:00
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
//
|
|
|
|
// Volumetric & Filament Size
|
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(parser_volumetric_enabled);
|
2017-12-20 03:33:41 +01:00
|
|
|
#if DISABLED(NO_VOLUMETRICS)
|
|
|
|
|
|
|
|
EEPROM_WRITE(parser.volumetric_enabled);
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
// Save filament sizes
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q];
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
}
|
|
|
|
|
2018-01-04 03:40:59 +01:00
|
|
|
#else
|
|
|
|
|
|
|
|
const bool volumetric_enabled = false;
|
|
|
|
dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
|
|
|
|
EEPROM_WRITE(volumetric_enabled);
|
|
|
|
for (uint8_t q = MAX_EXTRUDERS; q--;) EEPROM_WRITE(dummy);
|
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2018-01-04 04:17:43 +01:00
|
|
|
//
|
2017-12-15 22:02:39 +01:00
|
|
|
// Save TMC2130 or TMC2208 Configuration, and placeholder values
|
2018-01-04 04:17:43 +01:00
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(tmc_stepper_current);
|
2018-01-04 04:17:43 +01:00
|
|
|
uint16_t currents[11] = {
|
|
|
|
#if HAS_TRINAMIC
|
|
|
|
#if X_IS_TRINAMIC
|
|
|
|
stepperX.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if Y_IS_TRINAMIC
|
|
|
|
stepperY.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if Z_IS_TRINAMIC
|
|
|
|
stepperZ.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if X2_IS_TRINAMIC
|
|
|
|
stepperX2.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if Y2_IS_TRINAMIC
|
|
|
|
stepperY2.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if Z2_IS_TRINAMIC
|
|
|
|
stepperZ2.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if E0_IS_TRINAMIC
|
|
|
|
stepperE0.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if E1_IS_TRINAMIC
|
|
|
|
stepperE1.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if E2_IS_TRINAMIC
|
|
|
|
stepperE2.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if E3_IS_TRINAMIC
|
|
|
|
stepperE3.getCurrent(),
|
|
|
|
#else
|
|
|
|
0,
|
|
|
|
#endif
|
|
|
|
#if E4_IS_TRINAMIC
|
|
|
|
stepperE4.getCurrent()
|
|
|
|
#else
|
|
|
|
0
|
|
|
|
#endif
|
2017-03-31 21:58:40 +02:00
|
|
|
#else
|
2018-01-04 04:17:43 +01:00
|
|
|
0
|
2017-03-31 21:58:40 +02:00
|
|
|
#endif
|
2018-01-04 04:17:43 +01:00
|
|
|
};
|
|
|
|
EEPROM_WRITE(currents);
|
2017-03-07 06:00:43 +01:00
|
|
|
|
2017-12-15 22:02:39 +01:00
|
|
|
//
|
|
|
|
// TMC2130 Sensorless homing threshold
|
|
|
|
//
|
|
|
|
int16_t thrs;
|
|
|
|
#if ENABLED(SENSORLESS_HOMING)
|
|
|
|
#if ENABLED(X_IS_TMC2130)
|
|
|
|
thrs = stepperX.sgt();
|
|
|
|
#else
|
|
|
|
thrs = 0;
|
|
|
|
#endif
|
|
|
|
EEPROM_WRITE(thrs);
|
|
|
|
#if ENABLED(Y_IS_TMC2130)
|
|
|
|
thrs = stepperY.sgt();
|
|
|
|
#else
|
|
|
|
thrs = 0;
|
|
|
|
#endif
|
|
|
|
EEPROM_WRITE(thrs);
|
|
|
|
#else
|
|
|
|
thrs = 0;
|
|
|
|
for (uint8_t q = 2; q--;) EEPROM_WRITE(thrs);
|
|
|
|
#endif
|
|
|
|
|
2017-04-16 05:18:10 +02:00
|
|
|
//
|
|
|
|
// Linear Advance
|
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(planner_extruder_advance_k);
|
2017-04-16 05:18:10 +02:00
|
|
|
#if ENABLED(LIN_ADVANCE)
|
2017-04-22 05:30:36 +02:00
|
|
|
EEPROM_WRITE(planner.extruder_advance_k);
|
|
|
|
EEPROM_WRITE(planner.advance_ed_ratio);
|
|
|
|
#else
|
|
|
|
dummy = 0.0f;
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
EEPROM_WRITE(dummy);
|
2017-04-16 05:18:10 +02:00
|
|
|
#endif
|
|
|
|
|
2017-06-03 07:38:07 +02:00
|
|
|
#if HAS_MOTOR_CURRENT_PWM
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_WRITE(stepper.motor_current_setting[q]);
|
|
|
|
#else
|
|
|
|
const uint32_t dummyui32 = 0;
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummyui32);
|
|
|
|
#endif
|
|
|
|
|
2017-11-05 01:21:41 +01:00
|
|
|
//
|
|
|
|
// CNC Coordinate Systems
|
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(coordinate_system);
|
2017-11-01 19:08:46 +01:00
|
|
|
#if ENABLED(CNC_COORDINATE_SYSTEMS)
|
|
|
|
EEPROM_WRITE(coordinate_system); // 27 floats
|
|
|
|
#else
|
|
|
|
dummy = 0.0f;
|
2018-01-04 03:39:08 +01:00
|
|
|
for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_WRITE(dummy);
|
2017-11-01 19:08:46 +01:00
|
|
|
#endif
|
|
|
|
|
2017-11-05 01:21:41 +01:00
|
|
|
//
|
|
|
|
// Skew correction factors
|
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(planner_xy_skew_factor);
|
2017-11-05 01:21:41 +01:00
|
|
|
#if ENABLED(SKEW_CORRECTION)
|
|
|
|
EEPROM_WRITE(planner.xy_skew_factor);
|
|
|
|
EEPROM_WRITE(planner.xz_skew_factor);
|
|
|
|
EEPROM_WRITE(planner.yz_skew_factor);
|
|
|
|
#else
|
|
|
|
dummy = 0.0f;
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
2017-12-27 05:51:55 +01:00
|
|
|
//
|
|
|
|
// Advanced Pause filament load & unload lengths
|
|
|
|
//
|
2018-01-04 03:24:42 +01:00
|
|
|
_FIELD_TEST(filament_change_unload_length);
|
2017-12-27 05:51:55 +01:00
|
|
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
if (q < COUNT(filament_change_unload_length)) dummy = filament_change_unload_length[q];
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
}
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
if (q < COUNT(filament_change_load_length)) dummy = filament_change_load_length[q];
|
|
|
|
EEPROM_WRITE(dummy);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
dummy = 0.0f;
|
|
|
|
for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
|
|
|
|
#endif
|
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
//
|
2018-01-04 03:40:28 +01:00
|
|
|
// Validate CRC and Data Size
|
2018-01-03 00:22:48 +01:00
|
|
|
//
|
2017-05-07 03:00:56 +02:00
|
|
|
if (!eeprom_error) {
|
2018-01-04 03:39:08 +01:00
|
|
|
const uint16_t eeprom_size = eeprom_index - (EEPROM_OFFSET),
|
|
|
|
final_crc = working_crc;
|
2017-05-11 16:48:16 +02:00
|
|
|
|
2016-12-14 08:48:42 +01:00
|
|
|
// Write the EEPROM header
|
|
|
|
eeprom_index = EEPROM_OFFSET;
|
2017-05-11 16:48:16 +02:00
|
|
|
|
2016-12-14 08:48:42 +01:00
|
|
|
EEPROM_WRITE(version);
|
2017-05-17 23:16:38 +02:00
|
|
|
EEPROM_WRITE(final_crc);
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2016-12-14 08:48:42 +01:00
|
|
|
// Report storage size
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHO_START();
|
2018-01-04 03:39:08 +01:00
|
|
|
SERIAL_ECHOPAIR("Settings Stored (", eeprom_size);
|
2017-08-21 23:30:08 +02:00
|
|
|
SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)final_crc);
|
2017-07-02 04:48:18 +02:00
|
|
|
SERIAL_ECHOLNPGM(")");
|
|
|
|
#endif
|
2018-01-04 03:40:28 +01:00
|
|
|
|
|
|
|
eeprom_error |= size_error(eeprom_size);
|
2016-12-14 08:48:42 +01:00
|
|
|
}
|
2017-03-20 12:10:31 +01:00
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
//
|
|
|
|
// UBL Mesh
|
|
|
|
//
|
2017-04-22 23:04:28 +02:00
|
|
|
#if ENABLED(UBL_SAVE_ACTIVE_ON_M500)
|
2017-10-14 04:58:45 +02:00
|
|
|
if (ubl.storage_slot >= 0)
|
|
|
|
store_mesh(ubl.storage_slot);
|
2017-03-18 16:15:54 +01:00
|
|
|
#endif
|
2017-03-20 12:10:31 +01:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
return !eeprom_error;
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* M501 - Retrieve Configuration
|
|
|
|
*/
|
2018-01-03 00:22:48 +01:00
|
|
|
bool MarlinSettings::_load() {
|
2017-05-07 03:00:56 +02:00
|
|
|
uint16_t working_crc = 0;
|
2016-10-29 01:55:42 +02:00
|
|
|
|
|
|
|
EEPROM_START();
|
|
|
|
|
|
|
|
char stored_ver[4];
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(stored_ver);
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
uint16_t stored_crc;
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(stored_crc);
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2016-12-09 12:45:55 +01:00
|
|
|
// Version has to match or defaults are used
|
2016-10-29 01:55:42 +02:00
|
|
|
if (strncmp(version, stored_ver, 3) != 0) {
|
2018-01-06 01:57:54 +01:00
|
|
|
if (stored_ver[3] != '\0') {
|
2017-03-04 08:20:36 +01:00
|
|
|
stored_ver[0] = '?';
|
|
|
|
stored_ver[1] = '\0';
|
|
|
|
}
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHO_START();
|
|
|
|
SERIAL_ECHOPGM("EEPROM version mismatch ");
|
|
|
|
SERIAL_ECHOPAIR("(EEPROM=", stored_ver);
|
|
|
|
SERIAL_ECHOLNPGM(" Marlin=" EEPROM_VERSION ")");
|
|
|
|
#endif
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) reset();
|
|
|
|
eeprom_error = true;
|
2016-06-30 03:12:23 +02:00
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
else {
|
|
|
|
float dummy = 0;
|
2017-12-20 06:59:19 +01:00
|
|
|
#if DISABLED(AUTO_BED_LEVELING_UBL) || DISABLED(FWRETRACT)
|
|
|
|
bool dummyb;
|
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
working_crc = 0; // Init to 0. Accumulated by EEPROM_READ
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2016-12-09 12:45:55 +01:00
|
|
|
// Number of esteppers may change
|
|
|
|
uint8_t esteppers;
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(esteppers);
|
2016-12-09 12:45:55 +01:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Planner Motion
|
|
|
|
//
|
|
|
|
|
2016-12-09 12:45:55 +01:00
|
|
|
// Get only the number of E stepper parameters previously stored
|
|
|
|
// Any steppers added later are set to their defaults
|
|
|
|
const float def1[] = DEFAULT_AXIS_STEPS_PER_UNIT, def2[] = DEFAULT_MAX_FEEDRATE;
|
2016-12-16 05:04:18 +01:00
|
|
|
const uint32_t def3[] = DEFAULT_MAX_ACCELERATION;
|
2016-12-09 12:45:55 +01:00
|
|
|
float tmp1[XYZ + esteppers], tmp2[XYZ + esteppers];
|
2016-12-16 05:04:18 +01:00
|
|
|
uint32_t tmp3[XYZ + esteppers];
|
2016-12-09 12:45:55 +01:00
|
|
|
EEPROM_READ(tmp1);
|
|
|
|
EEPROM_READ(tmp2);
|
|
|
|
EEPROM_READ(tmp3);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) LOOP_XYZE_N(i) {
|
2016-12-09 12:45:55 +01:00
|
|
|
planner.axis_steps_per_mm[i] = i < XYZ + esteppers ? tmp1[i] : def1[i < COUNT(def1) ? i : COUNT(def1) - 1];
|
|
|
|
planner.max_feedrate_mm_s[i] = i < XYZ + esteppers ? tmp2[i] : def2[i < COUNT(def2) ? i : COUNT(def2) - 1];
|
|
|
|
planner.max_acceleration_mm_per_s2[i] = i < XYZ + esteppers ? tmp3[i] : def3[i < COUNT(def3) ? i : COUNT(def3) - 1];
|
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
|
|
|
|
EEPROM_READ(planner.acceleration);
|
|
|
|
EEPROM_READ(planner.retract_acceleration);
|
|
|
|
EEPROM_READ(planner.travel_acceleration);
|
|
|
|
EEPROM_READ(planner.min_feedrate_mm_s);
|
|
|
|
EEPROM_READ(planner.min_travel_feedrate_mm_s);
|
2017-10-14 22:47:53 +02:00
|
|
|
EEPROM_READ(planner.min_segment_time_us);
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_READ(planner.max_jerk);
|
2017-03-05 01:01:33 +01:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Home Offset (M206)
|
|
|
|
//
|
|
|
|
|
2017-04-15 04:41:21 +02:00
|
|
|
#if !HAS_HOME_OFFSET
|
2017-03-05 01:01:33 +01:00
|
|
|
float home_offset[XYZ];
|
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_READ(home_offset);
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Hotend Offsets, if any
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if HOTENDS > 1
|
|
|
|
// Skip hotend 0 which must be 0
|
|
|
|
for (uint8_t e = 1; e < HOTENDS; e++)
|
|
|
|
LOOP_XYZ(i) EEPROM_READ(hotend_offset[i][e]);
|
|
|
|
#endif
|
|
|
|
|
2017-02-21 13:49:31 +01:00
|
|
|
//
|
2017-04-22 23:04:28 +02:00
|
|
|
// Global Leveling
|
2017-02-21 13:49:31 +01:00
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
2017-10-13 23:16:32 +02:00
|
|
|
EEPROM_READ(new_z_fade_height);
|
2017-02-21 13:49:31 +01:00
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
|
2016-12-10 07:17:49 +01:00
|
|
|
//
|
|
|
|
// Mesh (Manual) Bed Leveling
|
|
|
|
//
|
|
|
|
|
2016-12-14 08:44:39 +01:00
|
|
|
bool leveling_is_on;
|
|
|
|
uint8_t mesh_num_x, mesh_num_y;
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(leveling_is_on);
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_READ(dummy);
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(mesh_num_x);
|
|
|
|
EEPROM_READ_ALWAYS(mesh_num_y);
|
2016-12-14 08:44:39 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
2018-01-07 07:06:21 +01:00
|
|
|
if (!validating) mbl.z_offset = dummy;
|
2017-04-06 05:29:44 +02:00
|
|
|
if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) {
|
2016-10-29 01:55:42 +02:00
|
|
|
// EEPROM data fits the current mesh
|
|
|
|
EEPROM_READ(mbl.z_values);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// EEPROM data is stale
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) mbl.reset();
|
2016-12-10 07:17:49 +01:00
|
|
|
for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummy);
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
#else
|
|
|
|
// MBL is disabled - skip the stored data
|
2016-12-10 07:17:49 +01:00
|
|
|
for (uint16_t q = mesh_num_x * mesh_num_y; q--;) EEPROM_READ(dummy);
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif // MESH_BED_LEVELING
|
|
|
|
|
|
|
|
#if !HAS_BED_PROBE
|
2017-04-11 12:05:23 +02:00
|
|
|
float zprobe_zoffset;
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
|
|
|
EEPROM_READ(zprobe_zoffset);
|
|
|
|
|
2016-12-14 08:50:06 +01:00
|
|
|
//
|
|
|
|
// Planar Bed Leveling matrix
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ABL_PLANAR
|
|
|
|
EEPROM_READ(planner.bed_level_matrix);
|
|
|
|
#else
|
|
|
|
for (uint8_t q = 9; q--;) EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
|
2016-12-10 07:17:49 +01:00
|
|
|
//
|
|
|
|
// Bilinear Auto Bed Leveling
|
|
|
|
//
|
|
|
|
|
|
|
|
uint8_t grid_max_x, grid_max_y;
|
2018-01-03 00:22:48 +01:00
|
|
|
EEPROM_READ_ALWAYS(grid_max_x); // 1 byte
|
|
|
|
EEPROM_READ_ALWAYS(grid_max_y); // 1 byte
|
2016-12-10 07:17:49 +01:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_BILINEAR)
|
2017-04-06 05:29:44 +02:00
|
|
|
if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) {
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) set_bed_leveling_enabled(false);
|
2016-12-10 07:17:49 +01:00
|
|
|
EEPROM_READ(bilinear_grid_spacing); // 2 ints
|
|
|
|
EEPROM_READ(bilinear_start); // 2 ints
|
2017-04-22 05:46:19 +02:00
|
|
|
EEPROM_READ(z_values); // 9 to 256 floats
|
2016-12-10 07:17:49 +01:00
|
|
|
}
|
|
|
|
else // EEPROM data is stale
|
|
|
|
#endif // AUTO_BED_LEVELING_BILINEAR
|
|
|
|
{
|
|
|
|
// Skip past disabled (or stale) Bilinear Grid data
|
|
|
|
int bgs[2], bs[2];
|
|
|
|
EEPROM_READ(bgs);
|
|
|
|
EEPROM_READ(bs);
|
|
|
|
for (uint16_t q = grid_max_x * grid_max_y; q--;) EEPROM_READ(dummy);
|
|
|
|
}
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Unified Bed Leveling active state
|
|
|
|
//
|
|
|
|
|
2017-04-22 23:04:28 +02:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
2017-10-13 23:16:32 +02:00
|
|
|
EEPROM_READ(planner.leveling_active);
|
2017-10-14 04:58:45 +02:00
|
|
|
EEPROM_READ(ubl.storage_slot);
|
2017-04-22 23:04:28 +02:00
|
|
|
#else
|
|
|
|
uint8_t dummyui8;
|
|
|
|
EEPROM_READ(dummyb);
|
|
|
|
EEPROM_READ(dummyui8);
|
2017-05-09 19:35:43 +02:00
|
|
|
#endif // AUTO_BED_LEVELING_UBL
|
2017-04-22 23:04:28 +02:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// DELTA Geometry or Dual Endstops offsets
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(DELTA)
|
2017-11-09 06:21:02 +01:00
|
|
|
EEPROM_READ(delta_height); // 1 float
|
2017-10-27 06:49:20 +02:00
|
|
|
EEPROM_READ(delta_endstop_adj); // 3 floats
|
2017-03-08 00:42:04 +01:00
|
|
|
EEPROM_READ(delta_radius); // 1 float
|
|
|
|
EEPROM_READ(delta_diagonal_rod); // 1 float
|
|
|
|
EEPROM_READ(delta_segments_per_second); // 1 float
|
2017-04-29 16:36:33 +02:00
|
|
|
EEPROM_READ(delta_calibration_radius); // 1 float
|
2017-09-24 08:45:31 +02:00
|
|
|
EEPROM_READ(delta_tower_angle_trim); // 3 floats
|
2017-10-27 23:24:34 +02:00
|
|
|
|
|
|
|
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
|
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_READ(x_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_READ(y_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
EEPROM_READ(z_endstop_adj); // 1 float
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
|
2017-12-03 02:04:52 +01:00
|
|
|
for (uint8_t q=8; q--;) EEPROM_READ(dummy);
|
2017-10-27 23:24:34 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#else
|
2017-10-27 23:24:34 +02:00
|
|
|
|
2017-12-03 02:04:52 +01:00
|
|
|
for (uint8_t q=11; q--;) EEPROM_READ(dummy);
|
2017-10-27 23:24:34 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// LCD Preheat settings
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if DISABLED(ULTIPANEL)
|
2016-10-27 09:40:37 +02:00
|
|
|
int lcd_preheat_hotend_temp[2], lcd_preheat_bed_temp[2], lcd_preheat_fan_speed[2];
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
2017-11-01 20:51:57 +01:00
|
|
|
EEPROM_READ(lcd_preheat_hotend_temp); // 2 floats
|
|
|
|
EEPROM_READ(lcd_preheat_bed_temp); // 2 floats
|
|
|
|
EEPROM_READ(lcd_preheat_fan_speed); // 2 floats
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2017-04-10 04:47:49 +02:00
|
|
|
//EEPROM_ASSERT(
|
|
|
|
// WITHIN(lcd_preheat_fan_speed, 0, 255),
|
|
|
|
// "lcd_preheat_fan_speed out of range"
|
|
|
|
//);
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Hotend PID
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(PIDTEMP)
|
|
|
|
for (uint8_t e = 0; e < MAX_EXTRUDERS; e++) {
|
|
|
|
EEPROM_READ(dummy); // Kp
|
|
|
|
if (e < HOTENDS && dummy != DUMMY_PID_VALUE) {
|
|
|
|
// do not need to scale PID values as the values in EEPROM are already scaled
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) PID_PARAM(Kp, e) = dummy;
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_READ(PID_PARAM(Ki, e));
|
|
|
|
EEPROM_READ(PID_PARAM(Kd, e));
|
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
|
|
|
EEPROM_READ(PID_PARAM(Kc, e));
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#else // !PIDTEMP
|
|
|
|
// 4 x 4 = 16 slots for PID parameters
|
|
|
|
for (uint8_t q = MAX_EXTRUDERS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc
|
|
|
|
#endif // !PIDTEMP
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// PID Extrusion Scaling
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if DISABLED(PID_EXTRUSION_SCALING)
|
|
|
|
int lpq_len;
|
|
|
|
#endif
|
|
|
|
EEPROM_READ(lpq_len);
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Heated Bed PID
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(PIDTEMPBED)
|
|
|
|
EEPROM_READ(dummy); // bedKp
|
|
|
|
if (dummy != DUMMY_PID_VALUE) {
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) thermalManager.bedKp = dummy;
|
2016-10-29 01:55:42 +02:00
|
|
|
EEPROM_READ(thermalManager.bedKi);
|
|
|
|
EEPROM_READ(thermalManager.bedKd);
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
for (uint8_t q=3; q--;) EEPROM_READ(dummy); // bedKp, bedKi, bedKd
|
|
|
|
#endif
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// LCD Contrast
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if !HAS_LCD_CONTRAST
|
2017-05-21 02:54:23 +02:00
|
|
|
uint16_t lcd_contrast;
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
|
|
|
EEPROM_READ(lcd_contrast);
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Firmware Retraction
|
|
|
|
//
|
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(FWRETRACT)
|
2018-01-04 23:42:56 +01:00
|
|
|
EEPROM_READ(fwretract.autoretract_enabled);
|
|
|
|
EEPROM_READ(fwretract.retract_length);
|
|
|
|
EEPROM_READ(fwretract.retract_feedrate_mm_s);
|
|
|
|
EEPROM_READ(fwretract.retract_zlift);
|
|
|
|
EEPROM_READ(fwretract.retract_recover_length);
|
|
|
|
EEPROM_READ(fwretract.retract_recover_feedrate_mm_s);
|
|
|
|
EEPROM_READ(fwretract.swap_retract_length);
|
|
|
|
EEPROM_READ(fwretract.swap_retract_recover_length);
|
|
|
|
EEPROM_READ(fwretract.swap_retract_recover_feedrate_mm_s);
|
2017-07-18 05:01:41 +02:00
|
|
|
#else
|
|
|
|
EEPROM_READ(dummyb);
|
|
|
|
for (uint8_t q=8; q--;) EEPROM_READ(dummy);
|
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Volumetric & Filament Size
|
|
|
|
//
|
2017-12-20 03:33:41 +01:00
|
|
|
#if DISABLED(NO_VOLUMETRICS)
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
EEPROM_READ(parser.volumetric_enabled);
|
|
|
|
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
EEPROM_READ(dummy);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating && q < COUNT(planner.filament_size))
|
|
|
|
planner.filament_size[q] = dummy;
|
2017-12-20 03:33:41 +01:00
|
|
|
}
|
|
|
|
|
2018-01-04 03:40:59 +01:00
|
|
|
#else
|
|
|
|
|
|
|
|
EEPROM_READ(dummyb);
|
|
|
|
for (uint8_t q=MAX_EXTRUDERS; q--;) EEPROM_READ(dummy);
|
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// TMC2130 Stepper Current
|
|
|
|
//
|
2017-12-15 22:02:39 +01:00
|
|
|
#if HAS_TRINAMIC
|
2018-01-08 03:46:55 +01:00
|
|
|
#define SET_CURR(N,Q) stepper##Q.setCurrent(val[N] ? val[N] : Q##_CURRENT, R_SENSE, HOLD_MULTIPLIER)
|
2018-01-03 00:22:48 +01:00
|
|
|
uint16_t val[11];
|
2017-03-07 06:00:43 +01:00
|
|
|
EEPROM_READ(val);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) {
|
|
|
|
#if X_IS_TRINAMIC
|
|
|
|
SET_CURR(0, X);
|
|
|
|
#endif
|
|
|
|
#if Y_IS_TRINAMIC
|
|
|
|
SET_CURR(1, Y);
|
|
|
|
#endif
|
|
|
|
#if Z_IS_TRINAMIC
|
|
|
|
SET_CURR(2, Z);
|
|
|
|
#endif
|
|
|
|
#if X2_IS_TRINAMIC
|
|
|
|
SET_CURR(3, X2);
|
|
|
|
#endif
|
|
|
|
#if Y2_IS_TRINAMIC
|
|
|
|
SET_CURR(4, Y2);
|
|
|
|
#endif
|
|
|
|
#if Z2_IS_TRINAMIC
|
|
|
|
SET_CURR(5, Z2);
|
|
|
|
#endif
|
|
|
|
#if E0_IS_TRINAMIC
|
|
|
|
SET_CURR(6, E0);
|
|
|
|
#endif
|
|
|
|
#if E1_IS_TRINAMIC
|
|
|
|
SET_CURR(7, E1);
|
|
|
|
#endif
|
|
|
|
#if E2_IS_TRINAMIC
|
|
|
|
SET_CURR(8, E2);
|
|
|
|
#endif
|
|
|
|
#if E3_IS_TRINAMIC
|
|
|
|
SET_CURR(9, E3);
|
|
|
|
#endif
|
|
|
|
#if E4_IS_TRINAMIC
|
|
|
|
SET_CURR(10, E4);
|
|
|
|
#endif
|
|
|
|
}
|
2017-03-07 06:00:43 +01:00
|
|
|
#else
|
2018-01-03 00:22:48 +01:00
|
|
|
uint16_t val;
|
|
|
|
for (uint8_t q=11; q--;) EEPROM_READ(val);
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
|
|
|
|
2017-12-15 22:02:39 +01:00
|
|
|
/*
|
|
|
|
* TMC2130 Sensorless homing threshold.
|
|
|
|
* X and X2 use the same value
|
|
|
|
* Y and Y2 use the same value
|
|
|
|
*/
|
|
|
|
int16_t thrs;
|
|
|
|
#if ENABLED(SENSORLESS_HOMING)
|
|
|
|
EEPROM_READ(thrs);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) {
|
|
|
|
#if ENABLED(X_IS_TMC2130)
|
|
|
|
stepperX.sgt(thrs);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(X2_IS_TMC2130)
|
|
|
|
stepperX2.sgt(thrs);
|
|
|
|
#endif
|
|
|
|
}
|
2017-12-15 22:02:39 +01:00
|
|
|
EEPROM_READ(thrs);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) {
|
|
|
|
#if ENABLED(Y_IS_TMC2130)
|
|
|
|
stepperY.sgt(thrs);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Y2_IS_TMC2130)
|
|
|
|
stepperY2.sgt(thrs);
|
|
|
|
#endif
|
|
|
|
}
|
2017-12-15 22:02:39 +01:00
|
|
|
#else
|
|
|
|
for (uint8_t q = 0; q < 2; q++) EEPROM_READ(thrs);
|
|
|
|
#endif
|
|
|
|
|
2017-04-16 05:18:10 +02:00
|
|
|
//
|
|
|
|
// Linear Advance
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(LIN_ADVANCE)
|
2017-04-22 05:30:36 +02:00
|
|
|
EEPROM_READ(planner.extruder_advance_k);
|
|
|
|
EEPROM_READ(planner.advance_ed_ratio);
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
EEPROM_READ(dummy);
|
2017-04-16 05:18:10 +02:00
|
|
|
#endif
|
|
|
|
|
2017-11-01 20:51:57 +01:00
|
|
|
//
|
|
|
|
// Motor Current PWM
|
|
|
|
//
|
|
|
|
|
2017-06-03 07:38:07 +02:00
|
|
|
#if HAS_MOTOR_CURRENT_PWM
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_READ(stepper.motor_current_setting[q]);
|
|
|
|
#else
|
|
|
|
uint32_t dummyui32;
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_READ(dummyui32);
|
|
|
|
#endif
|
|
|
|
|
2017-11-01 19:08:46 +01:00
|
|
|
//
|
|
|
|
// CNC Coordinate System
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(CNC_COORDINATE_SYSTEMS)
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) (void)select_coordinate_system(-1); // Go back to machine space
|
2017-11-01 19:08:46 +01:00
|
|
|
EEPROM_READ(coordinate_system); // 27 floats
|
|
|
|
#else
|
2018-01-04 03:39:08 +01:00
|
|
|
for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_READ(dummy);
|
2017-11-01 19:08:46 +01:00
|
|
|
#endif
|
|
|
|
|
2017-11-05 01:21:41 +01:00
|
|
|
//
|
|
|
|
// Skew correction factors
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(SKEW_CORRECTION_GCODE)
|
|
|
|
EEPROM_READ(planner.xy_skew_factor);
|
|
|
|
#if ENABLED(SKEW_CORRECTION_FOR_Z)
|
|
|
|
EEPROM_READ(planner.xz_skew_factor);
|
|
|
|
EEPROM_READ(planner.yz_skew_factor);
|
|
|
|
#else
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
#else
|
|
|
|
for (uint8_t q = 3; q--;) EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
|
2017-12-27 05:51:55 +01:00
|
|
|
//
|
|
|
|
// Advanced Pause filament load & unload lengths
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
EEPROM_READ(dummy);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy;
|
2017-12-27 05:51:55 +01:00
|
|
|
}
|
|
|
|
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
|
|
|
|
EEPROM_READ(dummy);
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy;
|
2017-12-27 05:51:55 +01:00
|
|
|
}
|
|
|
|
#else
|
|
|
|
for (uint8_t q = MAX_EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
|
|
|
|
#endif
|
|
|
|
|
2018-01-04 03:40:28 +01:00
|
|
|
eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
|
|
|
|
if (eeprom_error) {
|
|
|
|
SERIAL_ECHO_START();
|
|
|
|
SERIAL_ECHOPAIR("Index: ", int(eeprom_index - (EEPROM_OFFSET)));
|
|
|
|
SERIAL_ECHOLNPAIR(" Size: ", datasize());
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2018-01-04 03:40:28 +01:00
|
|
|
else if (working_crc != stored_crc) {
|
2018-01-03 00:22:48 +01:00
|
|
|
eeprom_error = true;
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ERROR_START();
|
|
|
|
SERIAL_ERRORPGM("EEPROM CRC mismatch - (stored) ");
|
|
|
|
SERIAL_ERROR(stored_crc);
|
|
|
|
SERIAL_ERRORPGM(" != ");
|
|
|
|
SERIAL_ERROR(working_crc);
|
|
|
|
SERIAL_ERRORLNPGM(" (calculated)!");
|
|
|
|
#endif
|
2018-01-04 03:40:28 +01:00
|
|
|
}
|
|
|
|
else if (!validating) {
|
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHO_START();
|
|
|
|
SERIAL_ECHO(version);
|
|
|
|
SERIAL_ECHOPAIR(" stored settings retrieved (", eeprom_index - (EEPROM_OFFSET));
|
|
|
|
SERIAL_ECHOPAIR(" bytes; crc ", (uint32_t)working_crc);
|
|
|
|
SERIAL_ECHOLNPGM(")");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!validating) {
|
|
|
|
if (eeprom_error) reset(); else postprocess();
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
|
2017-03-18 16:15:54 +01:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
2017-05-16 09:34:36 +02:00
|
|
|
ubl.report_state();
|
2017-03-18 16:15:54 +01:00
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) {
|
|
|
|
if (!ubl.sanity_check()) {
|
|
|
|
SERIAL_EOL();
|
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
ubl.echo_name();
|
|
|
|
SERIAL_ECHOLNPGM(" initialized.\n");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
eeprom_error = true;
|
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_PROTOCOLPGM("?Can't enable ");
|
|
|
|
ubl.echo_name();
|
|
|
|
SERIAL_PROTOCOLLNPGM(".");
|
|
|
|
#endif
|
|
|
|
ubl.reset();
|
|
|
|
}
|
2017-03-18 16:15:54 +01:00
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
if (ubl.storage_slot >= 0) {
|
|
|
|
load_mesh(ubl.storage_slot);
|
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHOPAIR("Mesh ", ubl.storage_slot);
|
|
|
|
SERIAL_ECHOLNPGM(" loaded from storage.");
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ubl.reset();
|
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHOLNPGM("UBL System reset()");
|
|
|
|
#endif
|
|
|
|
}
|
2017-03-18 16:15:54 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
2017-04-22 23:04:28 +02:00
|
|
|
|
2017-07-02 04:30:46 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT) && DISABLED(DISABLE_M503)
|
2018-01-03 00:22:48 +01:00
|
|
|
if (!validating) report();
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
2017-03-20 12:10:31 +01:00
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
return !eeprom_error;
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2018-01-03 00:22:48 +01:00
|
|
|
bool MarlinSettings::validate() {
|
|
|
|
validating = true;
|
|
|
|
const bool success = _load();
|
|
|
|
validating = false;
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool MarlinSettings::load() {
|
|
|
|
if (validate()) return _load();
|
|
|
|
reset();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2017-05-07 03:00:56 +02:00
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
|
|
|
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
void ubl_invalid_slot(const int s) {
|
|
|
|
SERIAL_PROTOCOLLNPGM("?Invalid slot.");
|
|
|
|
SERIAL_PROTOCOL(s);
|
|
|
|
SERIAL_PROTOCOLLNPGM(" mesh slots available.");
|
|
|
|
}
|
|
|
|
#endif
|
2017-05-16 09:34:36 +02:00
|
|
|
|
2018-01-05 03:58:09 +01:00
|
|
|
int16_t MarlinSettings::meshes_start_index() {
|
|
|
|
return (datasize() + EEPROM_OFFSET + 32) & 0xFFF8; // Pad the end of configuration data so it can float up
|
|
|
|
// or down a little bit without disrupting the mesh data
|
|
|
|
}
|
2017-05-07 03:00:56 +02:00
|
|
|
|
2018-01-05 03:58:09 +01:00
|
|
|
uint16_t MarlinSettings::calc_num_meshes() {
|
|
|
|
return (meshes_end - meshes_start_index()) / sizeof(ubl.z_values);
|
2017-05-07 03:00:56 +02:00
|
|
|
}
|
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
void MarlinSettings::store_mesh(const int8_t slot) {
|
2017-05-07 03:00:56 +02:00
|
|
|
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
2018-01-02 03:21:54 +01:00
|
|
|
const int16_t a = calc_num_meshes();
|
2017-05-07 03:00:56 +02:00
|
|
|
if (!WITHIN(slot, 0, a - 1)) {
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
ubl_invalid_slot(a);
|
|
|
|
SERIAL_PROTOCOLPAIR("E2END=", E2END);
|
|
|
|
SERIAL_PROTOCOLPAIR(" meshes_end=", meshes_end);
|
|
|
|
SERIAL_PROTOCOLLNPAIR(" slot=", slot);
|
|
|
|
SERIAL_EOL();
|
|
|
|
#endif
|
2017-05-07 03:00:56 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t crc = 0;
|
|
|
|
int pos = meshes_end - (slot + 1) * sizeof(ubl.z_values);
|
|
|
|
|
|
|
|
write_data(pos, (uint8_t *)&ubl.z_values, sizeof(ubl.z_values), &crc);
|
|
|
|
|
|
|
|
// Write crc to MAT along with other data, or just tack on to the beginning or end
|
|
|
|
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_PROTOCOLLNPAIR("Mesh saved in slot ", slot);
|
|
|
|
#endif
|
2017-05-07 03:00:56 +02:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
// Other mesh types
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
void MarlinSettings::load_mesh(const int8_t slot, void * const into/*=NULL*/) {
|
2017-05-07 03:00:56 +02:00
|
|
|
|
|
|
|
#if ENABLED(AUTO_BED_LEVELING_UBL)
|
|
|
|
|
2018-01-02 03:21:54 +01:00
|
|
|
const int16_t a = settings.calc_num_meshes();
|
2017-05-07 03:00:56 +02:00
|
|
|
|
|
|
|
if (!WITHIN(slot, 0, a - 1)) {
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
ubl_invalid_slot(a);
|
|
|
|
#endif
|
2017-05-07 03:00:56 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t crc = 0;
|
|
|
|
int pos = meshes_end - (slot + 1) * sizeof(ubl.z_values);
|
|
|
|
uint8_t * const dest = into ? (uint8_t*)into : (uint8_t*)&ubl.z_values;
|
|
|
|
read_data(pos, dest, sizeof(ubl.z_values), &crc);
|
|
|
|
|
|
|
|
// Compare crc with crc from MAT, or read from end
|
|
|
|
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_PROTOCOLLNPAIR("Mesh loaded from slot ", slot);
|
|
|
|
#endif
|
2017-05-07 03:00:56 +02:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
// Other mesh types
|
|
|
|
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//void MarlinSettings::delete_mesh() { return; }
|
|
|
|
//void MarlinSettings::defrag_meshes() { return; }
|
|
|
|
|
|
|
|
#endif // AUTO_BED_LEVELING_UBL
|
|
|
|
|
2016-10-29 01:53:48 +02:00
|
|
|
#else // !EEPROM_SETTINGS
|
|
|
|
|
2017-04-10 04:47:49 +02:00
|
|
|
bool MarlinSettings::save() {
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_ERROR_START();
|
2016-10-29 01:53:48 +02:00
|
|
|
SERIAL_ERRORLNPGM("EEPROM disabled");
|
2017-03-20 12:10:31 +01:00
|
|
|
return false;
|
2016-10-29 01:53:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif // !EEPROM_SETTINGS
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2015-04-27 03:44:01 +02:00
|
|
|
/**
|
2016-06-30 03:18:46 +02:00
|
|
|
* M502 - Reset Configuration
|
2015-04-27 03:44:01 +02:00
|
|
|
*/
|
2017-04-10 04:47:49 +02:00
|
|
|
void MarlinSettings::reset() {
|
2017-06-06 11:03:01 +02:00
|
|
|
static const float tmp1[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT, tmp2[] PROGMEM = DEFAULT_MAX_FEEDRATE;
|
|
|
|
static const uint32_t tmp3[] PROGMEM = DEFAULT_MAX_ACCELERATION;
|
2016-12-04 05:02:27 +01:00
|
|
|
LOOP_XYZE_N(i) {
|
2017-06-06 11:03:01 +02:00
|
|
|
planner.axis_steps_per_mm[i] = pgm_read_float(&tmp1[i < COUNT(tmp1) ? i : COUNT(tmp1) - 1]);
|
|
|
|
planner.max_feedrate_mm_s[i] = pgm_read_float(&tmp2[i < COUNT(tmp2) ? i : COUNT(tmp2) - 1]);
|
2017-06-08 23:15:02 +02:00
|
|
|
planner.max_acceleration_mm_per_s2[i] = pgm_read_dword_near(&tmp3[i < COUNT(tmp3) ? i : COUNT(tmp3) - 1]);
|
2015-01-28 10:08:48 +01:00
|
|
|
}
|
|
|
|
|
2016-04-28 03:06:32 +02:00
|
|
|
planner.acceleration = DEFAULT_ACCELERATION;
|
|
|
|
planner.retract_acceleration = DEFAULT_RETRACT_ACCELERATION;
|
|
|
|
planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION;
|
2016-07-16 03:49:34 +02:00
|
|
|
planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE;
|
|
|
|
planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE;
|
2017-12-25 10:42:51 +01:00
|
|
|
planner.min_segment_time_us = DEFAULT_MINSEGMENTTIME;
|
2016-10-02 11:37:13 +02:00
|
|
|
planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
|
|
|
|
planner.max_jerk[Y_AXIS] = DEFAULT_YJERK;
|
|
|
|
planner.max_jerk[Z_AXIS] = DEFAULT_ZJERK;
|
|
|
|
planner.max_jerk[E_AXIS] = DEFAULT_EJERK;
|
2017-02-21 13:49:31 +01:00
|
|
|
|
2017-04-15 04:41:21 +02:00
|
|
|
#if HAS_HOME_OFFSET
|
2017-03-05 01:01:33 +01:00
|
|
|
ZERO(home_offset);
|
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-10-29 01:39:23 +02:00
|
|
|
#if HOTENDS > 1
|
|
|
|
constexpr float tmp4[XYZ][HOTENDS] = {
|
|
|
|
HOTEND_OFFSET_X,
|
|
|
|
HOTEND_OFFSET_Y
|
|
|
|
#ifdef HOTEND_OFFSET_Z
|
|
|
|
, HOTEND_OFFSET_Z
|
|
|
|
#else
|
|
|
|
, { 0 }
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
static_assert(
|
|
|
|
tmp4[X_AXIS][0] == 0 && tmp4[Y_AXIS][0] == 0 && tmp4[Z_AXIS][0] == 0,
|
|
|
|
"Offsets for the first hotend must be 0.0."
|
|
|
|
);
|
|
|
|
LOOP_XYZ(i) HOTEND_LOOP() hotend_offset[i][e] = tmp4[i][e];
|
|
|
|
#endif
|
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
//
|
|
|
|
// Global Leveling
|
|
|
|
//
|
|
|
|
|
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
|
|
|
new_z_fade_height = 0.0;
|
|
|
|
#endif
|
|
|
|
|
2017-05-01 23:13:09 +02:00
|
|
|
#if HAS_LEVELING
|
2016-12-10 07:17:49 +01:00
|
|
|
reset_bed_level();
|
2015-03-26 07:06:33 +01:00
|
|
|
#endif
|
|
|
|
|
2016-06-15 03:05:20 +02:00
|
|
|
#if HAS_BED_PROBE
|
2015-05-27 02:47:04 +02:00
|
|
|
zprobe_zoffset = Z_PROBE_OFFSET_FROM_EXTRUDER;
|
2015-03-26 07:06:33 +01:00
|
|
|
#endif
|
2015-03-15 23:18:11 +01:00
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(DELTA)
|
2017-03-08 00:42:04 +01:00
|
|
|
const float adj[ABC] = DELTA_ENDSTOP_ADJ,
|
2017-04-29 16:36:33 +02:00
|
|
|
dta[ABC] = DELTA_TOWER_ANGLE_TRIM;
|
2017-11-09 06:21:02 +01:00
|
|
|
delta_height = DELTA_HEIGHT;
|
2017-10-27 06:49:20 +02:00
|
|
|
COPY(delta_endstop_adj, adj);
|
2016-12-10 07:17:49 +01:00
|
|
|
delta_radius = DELTA_RADIUS;
|
|
|
|
delta_diagonal_rod = DELTA_DIAGONAL_ROD;
|
|
|
|
delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
|
2017-04-18 14:43:25 +02:00
|
|
|
delta_calibration_radius = DELTA_CALIBRATION_RADIUS;
|
2017-09-24 08:45:31 +02:00
|
|
|
COPY(delta_tower_angle_trim, dta);
|
2017-04-15 04:41:21 +02:00
|
|
|
|
2017-10-27 23:24:34 +02:00
|
|
|
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS)
|
2017-04-15 04:41:21 +02:00
|
|
|
|
2017-10-27 23:24:34 +02:00
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS)
|
|
|
|
x_endstop_adj = (
|
|
|
|
#ifdef X_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
X_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
#else
|
|
|
|
0
|
|
|
|
#endif
|
|
|
|
);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS)
|
|
|
|
y_endstop_adj = (
|
|
|
|
#ifdef Y_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
Y_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
#else
|
|
|
|
0
|
|
|
|
#endif
|
|
|
|
);
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
z_endstop_adj = (
|
|
|
|
#ifdef Z_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
Z_DUAL_ENDSTOPS_ADJUSTMENT
|
|
|
|
#else
|
|
|
|
0
|
|
|
|
#endif
|
|
|
|
);
|
|
|
|
#endif
|
2017-04-15 04:41:21 +02:00
|
|
|
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(ULTIPANEL)
|
2016-10-27 09:40:37 +02:00
|
|
|
lcd_preheat_hotend_temp[0] = PREHEAT_1_TEMP_HOTEND;
|
|
|
|
lcd_preheat_hotend_temp[1] = PREHEAT_2_TEMP_HOTEND;
|
|
|
|
lcd_preheat_bed_temp[0] = PREHEAT_1_TEMP_BED;
|
|
|
|
lcd_preheat_bed_temp[1] = PREHEAT_2_TEMP_BED;
|
|
|
|
lcd_preheat_fan_speed[0] = PREHEAT_1_FAN_SPEED;
|
|
|
|
lcd_preheat_fan_speed[1] = PREHEAT_2_FAN_SPEED;
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(PIDTEMP)
|
2016-07-13 15:11:23 +02:00
|
|
|
#if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1
|
2016-07-11 20:48:15 +02:00
|
|
|
HOTEND_LOOP()
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif
|
|
|
|
{
|
|
|
|
PID_PARAM(Kp, e) = DEFAULT_Kp;
|
|
|
|
PID_PARAM(Ki, e) = scalePID_i(DEFAULT_Ki);
|
|
|
|
PID_PARAM(Kd, e) = scalePID_d(DEFAULT_Kd);
|
2016-08-01 02:49:34 +02:00
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
2015-01-28 10:08:48 +01:00
|
|
|
PID_PARAM(Kc, e) = DEFAULT_Kc;
|
|
|
|
#endif
|
|
|
|
}
|
2016-08-01 02:49:34 +02:00
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
2015-08-31 04:04:30 +02:00
|
|
|
lpq_len = 20; // default last-position-queue size
|
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif // PIDTEMP
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(PIDTEMPBED)
|
2016-04-29 03:18:13 +02:00
|
|
|
thermalManager.bedKp = DEFAULT_bedKp;
|
|
|
|
thermalManager.bedKi = scalePID_i(DEFAULT_bedKi);
|
|
|
|
thermalManager.bedKd = scalePID_d(DEFAULT_bedKd);
|
2015-04-04 01:38:05 +02:00
|
|
|
#endif
|
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
#if HAS_LCD_CONTRAST
|
|
|
|
lcd_contrast = DEFAULT_LCD_CONTRAST;
|
|
|
|
#endif
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if ENABLED(FWRETRACT)
|
2018-01-04 23:42:56 +01:00
|
|
|
fwretract.reset();
|
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
#if DISABLED(NO_VOLUMETRICS)
|
|
|
|
|
|
|
|
parser.volumetric_enabled =
|
|
|
|
#if ENABLED(VOLUMETRIC_DEFAULT_ON)
|
|
|
|
true
|
|
|
|
#else
|
|
|
|
false
|
|
|
|
#endif
|
|
|
|
;
|
|
|
|
for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
|
|
|
|
planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA;
|
|
|
|
|
|
|
|
#endif
|
2016-06-30 03:19:26 +02:00
|
|
|
|
2016-07-15 01:12:20 +02:00
|
|
|
endstops.enable_globally(
|
|
|
|
#if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)
|
2017-06-06 11:03:01 +02:00
|
|
|
true
|
2016-07-15 01:12:20 +02:00
|
|
|
#else
|
2017-06-06 11:03:01 +02:00
|
|
|
false
|
2016-07-15 01:12:20 +02:00
|
|
|
#endif
|
|
|
|
);
|
|
|
|
|
2017-12-15 22:02:39 +01:00
|
|
|
#if X_IS_TRINAMIC
|
|
|
|
stepperX.setCurrent(X_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if Y_IS_TRINAMIC
|
|
|
|
stepperY.setCurrent(Y_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if Z_IS_TRINAMIC
|
|
|
|
stepperZ.setCurrent(Z_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if X2_IS_TRINAMIC
|
|
|
|
stepperX2.setCurrent(X2_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if Y2_IS_TRINAMIC
|
|
|
|
stepperY2.setCurrent(Y2_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if Z2_IS_TRINAMIC
|
|
|
|
stepperZ2.setCurrent(Z2_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if E0_IS_TRINAMIC
|
|
|
|
stepperE0.setCurrent(E0_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if E1_IS_TRINAMIC
|
|
|
|
stepperE1.setCurrent(E1_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if E2_IS_TRINAMIC
|
|
|
|
stepperE2.setCurrent(E2_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if E3_IS_TRINAMIC
|
|
|
|
stepperE3.setCurrent(E3_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
#if E4_IS_TRINAMIC
|
|
|
|
stepperE4.setCurrent(E4_CURRENT, R_SENSE, HOLD_MULTIPLIER);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if ENABLED(SENSORLESS_HOMING)
|
2017-03-07 06:00:43 +01:00
|
|
|
#if ENABLED(X_IS_TMC2130)
|
2017-12-15 22:02:39 +01:00
|
|
|
stepperX.sgt(X_HOMING_SENSITIVITY);
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
|
|
|
#if ENABLED(X2_IS_TMC2130)
|
2017-12-15 22:02:39 +01:00
|
|
|
stepperX2.sgt(X_HOMING_SENSITIVITY);
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Y_IS_TMC2130)
|
|
|
|
stepperY.sgt(Y_HOMING_SENSITIVITY);
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Y2_IS_TMC2130)
|
|
|
|
stepperY2.sgt(Y_HOMING_SENSITIVITY);
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2017-04-16 05:18:10 +02:00
|
|
|
#if ENABLED(LIN_ADVANCE)
|
2017-04-22 05:30:36 +02:00
|
|
|
planner.extruder_advance_k = LIN_ADVANCE_K;
|
|
|
|
planner.advance_ed_ratio = LIN_ADVANCE_E_D_RATIO;
|
2017-04-16 05:18:10 +02:00
|
|
|
#endif
|
|
|
|
|
2017-06-03 07:38:07 +02:00
|
|
|
#if HAS_MOTOR_CURRENT_PWM
|
|
|
|
uint32_t tmp_motor_current_setting[3] = PWM_MOTOR_CURRENT;
|
|
|
|
for (uint8_t q = 3; q--;)
|
|
|
|
stepper.digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q]));
|
|
|
|
#endif
|
|
|
|
|
2017-11-05 01:21:41 +01:00
|
|
|
#if ENABLED(SKEW_CORRECTION_GCODE)
|
|
|
|
planner.xy_skew_factor = XY_SKEW_FACTOR;
|
|
|
|
#if ENABLED(SKEW_CORRECTION_FOR_Z)
|
|
|
|
planner.xz_skew_factor = XZ_SKEW_FACTOR;
|
|
|
|
planner.yz_skew_factor = YZ_SKEW_FACTOR;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
2017-12-27 05:51:55 +01:00
|
|
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
|
|
|
for (uint8_t e = 0; e < E_STEPPERS; e++) {
|
|
|
|
filament_change_unload_length[e] = FILAMENT_CHANGE_UNLOAD_LENGTH;
|
|
|
|
filament_change_load_length[e] = FILAMENT_CHANGE_LOAD_LENGTH;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2017-04-10 04:47:49 +02:00
|
|
|
postprocess();
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-07-02 04:48:18 +02:00
|
|
|
#if ENABLED(EEPROM_CHITCHAT)
|
|
|
|
SERIAL_ECHO_START();
|
|
|
|
SERIAL_ECHOLNPGM("Hardcoded Default Settings Loaded");
|
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
}
|
|
|
|
|
2015-07-31 07:31:45 +02:00
|
|
|
#if DISABLED(DISABLE_M503)
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-06-09 17:51:23 +02:00
|
|
|
#define CONFIG_ECHO_START do{ if (!forReplay) SERIAL_ECHO_START(); }while(0)
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
/**
|
2017-04-10 04:47:49 +02:00
|
|
|
* M503 - Report current settings in RAM
|
2017-03-31 21:58:40 +02:00
|
|
|
*
|
2017-04-10 04:47:49 +02:00
|
|
|
* Unless specifically disabled, M503 is available even without EEPROM
|
2016-10-29 01:55:42 +02:00
|
|
|
*/
|
2017-12-07 03:57:05 +01:00
|
|
|
void MarlinSettings::report(const bool forReplay) {
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-04-17 06:24:30 +02:00
|
|
|
/**
|
|
|
|
* Announce current units, in case inches are being displayed
|
|
|
|
*/
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
#if ENABLED(INCH_MODE_SUPPORT)
|
2017-11-25 00:30:54 +01:00
|
|
|
#define LINEAR_UNIT(N) (float(N) / parser.linear_unit_factor)
|
|
|
|
#define VOLUMETRIC_UNIT(N) (float(N) / (parser.volumetric_enabled ? parser.volumetric_unit_factor : parser.linear_unit_factor))
|
2017-05-07 02:41:50 +02:00
|
|
|
SERIAL_ECHOPGM(" G2");
|
2017-05-20 10:03:08 +02:00
|
|
|
SERIAL_CHAR(parser.linear_unit_factor == 1.0 ? '1' : '0');
|
2017-05-07 02:41:50 +02:00
|
|
|
SERIAL_ECHOPGM(" ; Units in ");
|
2017-05-20 10:03:08 +02:00
|
|
|
serialprintPGM(parser.linear_unit_factor == 1.0 ? PSTR("mm\n") : PSTR("inches\n"));
|
2017-04-17 06:24:30 +02:00
|
|
|
#else
|
2017-11-25 00:30:54 +01:00
|
|
|
#define LINEAR_UNIT(N) (N)
|
|
|
|
#define VOLUMETRIC_UNIT(N) (N)
|
2017-05-26 01:02:29 +02:00
|
|
|
SERIAL_ECHOLNPGM(" G21 ; Units in mm");
|
2017-04-17 06:24:30 +02:00
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-05-07 02:41:50 +02:00
|
|
|
#if ENABLED(ULTIPANEL)
|
|
|
|
|
|
|
|
// Temperature units - for Ultipanel temperature options
|
|
|
|
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
#if ENABLED(TEMPERATURE_UNITS_SUPPORT)
|
2017-05-20 10:03:08 +02:00
|
|
|
#define TEMP_UNIT(N) parser.to_temp_units(N)
|
2017-05-07 02:41:50 +02:00
|
|
|
SERIAL_ECHOPGM(" M149 ");
|
2017-05-20 10:03:08 +02:00
|
|
|
SERIAL_CHAR(parser.temp_units_code());
|
2017-05-07 02:41:50 +02:00
|
|
|
SERIAL_ECHOPGM(" ; Units in ");
|
2017-05-20 10:03:08 +02:00
|
|
|
serialprintPGM(parser.temp_units_name());
|
2017-05-07 02:41:50 +02:00
|
|
|
#else
|
2017-11-25 00:30:54 +01:00
|
|
|
#define TEMP_UNIT(N) (N)
|
2017-05-26 01:02:29 +02:00
|
|
|
SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius");
|
2017-05-07 02:41:50 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-05-26 01:02:29 +02:00
|
|
|
|
2017-12-20 03:33:41 +01:00
|
|
|
#if DISABLED(NO_VOLUMETRICS)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Volumetric extrusion M200
|
|
|
|
*/
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPGM("Filament settings:");
|
|
|
|
if (parser.volumetric_enabled)
|
|
|
|
SERIAL_EOL();
|
|
|
|
else
|
|
|
|
SERIAL_ECHOLNPGM(" Disabled");
|
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
|
|
|
|
CONFIG_ECHO_START;
|
2017-12-20 03:33:41 +01:00
|
|
|
SERIAL_ECHOPAIR(" M200 D", LINEAR_UNIT(planner.filament_size[0]));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-12-20 03:33:41 +01:00
|
|
|
#if EXTRUDERS > 1
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-12-20 03:33:41 +01:00
|
|
|
SERIAL_ECHOPAIR(" M200 T1 D", LINEAR_UNIT(planner.filament_size[1]));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-12-20 03:33:41 +01:00
|
|
|
#if EXTRUDERS > 2
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-12-20 03:33:41 +01:00
|
|
|
SERIAL_ECHOPAIR(" M200 T2 D", LINEAR_UNIT(planner.filament_size[2]));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-12-20 03:33:41 +01:00
|
|
|
#if EXTRUDERS > 3
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-12-20 03:33:41 +01:00
|
|
|
SERIAL_ECHOPAIR(" M200 T3 D", LINEAR_UNIT(planner.filament_size[3]));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-12-20 03:33:41 +01:00
|
|
|
#if EXTRUDERS > 4
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M200 T4 D", LINEAR_UNIT(planner.filament_size[4]));
|
|
|
|
SERIAL_EOL();
|
|
|
|
#endif // EXTRUDERS > 4
|
|
|
|
#endif // EXTRUDERS > 3
|
|
|
|
#endif // EXTRUDERS > 2
|
|
|
|
#endif // EXTRUDERS > 1
|
|
|
|
|
|
|
|
if (!parser.volumetric_enabled) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM(" M200 D0");
|
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
|
2017-12-25 10:42:51 +01:00
|
|
|
#endif // !NO_VOLUMETRICS
|
2017-04-17 06:24:30 +02:00
|
|
|
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Steps per unit:");
|
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M92 X", LINEAR_UNIT(planner.axis_steps_per_mm[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.axis_steps_per_mm[Y_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.axis_steps_per_mm[Z_AXIS]));
|
2016-12-12 02:37:29 +01:00
|
|
|
#if DISABLED(DISTINCT_E_FACTORS)
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS]));
|
2016-12-04 05:02:27 +01:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-12-04 05:02:27 +01:00
|
|
|
#if ENABLED(DISTINCT_E_FACTORS)
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2016-12-04 05:02:27 +01:00
|
|
|
for (uint8_t i = 0; i < E_STEPPERS; i++) {
|
|
|
|
SERIAL_ECHOPAIR(" M92 T", (int)i);
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS + i]));
|
2016-12-04 05:02:27 +01:00
|
|
|
}
|
|
|
|
#endif
|
2016-10-29 01:55:42 +02:00
|
|
|
|
2015-04-27 03:44:01 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Maximum feedrates (units/s):");
|
2015-04-27 03:44:01 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M203 X", LINEAR_UNIT(planner.max_feedrate_mm_s[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_feedrate_mm_s[Y_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_feedrate_mm_s[Z_AXIS]));
|
2016-12-12 02:37:29 +01:00
|
|
|
#if DISABLED(DISTINCT_E_FACTORS)
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS]));
|
2016-12-04 05:02:27 +01:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-12-04 05:02:27 +01:00
|
|
|
#if ENABLED(DISTINCT_E_FACTORS)
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2016-12-04 05:02:27 +01:00
|
|
|
for (uint8_t i = 0; i < E_STEPPERS; i++) {
|
|
|
|
SERIAL_ECHOPAIR(" M203 T", (int)i);
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS + i]));
|
2016-12-04 05:02:27 +01:00
|
|
|
}
|
|
|
|
#endif
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2015-01-28 10:08:48 +01:00
|
|
|
if (!forReplay) {
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Maximum Acceleration (units/s2):");
|
2015-01-28 10:08:48 +01:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M201 X", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Y_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Z_AXIS]));
|
2016-12-12 02:37:29 +01:00
|
|
|
#if DISABLED(DISTINCT_E_FACTORS)
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS]));
|
2016-12-04 05:02:27 +01:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-12-04 05:02:27 +01:00
|
|
|
#if ENABLED(DISTINCT_E_FACTORS)
|
2017-05-24 23:56:36 +02:00
|
|
|
CONFIG_ECHO_START;
|
2016-12-04 05:02:27 +01:00
|
|
|
for (uint8_t i = 0; i < E_STEPPERS; i++) {
|
|
|
|
SERIAL_ECHOPAIR(" M201 T", (int)i);
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPAIR(" E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS + i]));
|
2016-12-04 05:02:27 +01:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2016-02-17 22:05:12 +01:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Acceleration (units/s2): P<print_accel> R<retract_accel> T<travel_accel>");
|
2016-02-17 22:05:12 +01:00
|
|
|
}
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" M204 P", LINEAR_UNIT(planner.acceleration));
|
|
|
|
SERIAL_ECHOPAIR(" R", LINEAR_UNIT(planner.retract_acceleration));
|
|
|
|
SERIAL_ECHOLNPAIR(" T", LINEAR_UNIT(planner.travel_acceleration));
|
|
|
|
|
2015-03-24 18:06:44 +01:00
|
|
|
if (!forReplay) {
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-10-14 22:47:53 +02:00
|
|
|
SERIAL_ECHOLNPGM("Advanced: S<min_feedrate> T<min_travel_feedrate> B<min_segment_time_us> X<max_xy_jerk> Z<max_z_jerk> E<max_e_jerk>");
|
2015-03-24 18:06:44 +01:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M205 S", LINEAR_UNIT(planner.min_feedrate_mm_s));
|
|
|
|
SERIAL_ECHOPAIR(" T", LINEAR_UNIT(planner.min_travel_feedrate_mm_s));
|
2017-10-14 22:47:53 +02:00
|
|
|
SERIAL_ECHOPAIR(" B", planner.min_segment_time_us);
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" X", LINEAR_UNIT(planner.max_jerk[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(planner.max_jerk[Y_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.max_jerk[Z_AXIS]));
|
|
|
|
SERIAL_ECHOLNPAIR(" E", LINEAR_UNIT(planner.max_jerk[E_AXIS]));
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-04-15 04:41:21 +02:00
|
|
|
#if HAS_M206_COMMAND
|
2017-03-05 01:01:33 +01:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Home offset:");
|
2017-03-05 01:01:33 +01:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M206 X", LINEAR_UNIT(home_offset[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(home_offset[Y_AXIS]));
|
|
|
|
SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(home_offset[Z_AXIS]));
|
2017-03-05 01:01:33 +01:00
|
|
|
#endif
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if HOTENDS > 1
|
|
|
|
if (!forReplay) {
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Hotend offsets:");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2016-10-29 01:55:42 +02:00
|
|
|
for (uint8_t e = 1; e < HOTENDS; e++) {
|
|
|
|
SERIAL_ECHOPAIR(" M218 T", (int)e);
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" X", LINEAR_UNIT(hotend_offset[X_AXIS][e]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(hotend_offset[Y_AXIS][e]));
|
2017-08-13 23:35:59 +02:00
|
|
|
#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(SWITCHING_NOZZLE) ||ENABLED(PARKING_EXTRUDER)
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(hotend_offset[Z_AXIS][e]));
|
2015-08-31 04:04:30 +02:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2015-04-27 03:44:01 +02:00
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
/**
|
|
|
|
* Bed Leveling
|
|
|
|
*/
|
|
|
|
#if HAS_LEVELING
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
|
|
|
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Mesh Bed Leveling:");
|
|
|
|
}
|
|
|
|
|
|
|
|
#elif ENABLED(AUTO_BED_LEVELING_UBL)
|
|
|
|
|
|
|
|
if (!forReplay) {
|
2016-10-29 01:55:42 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-10-13 23:16:32 +02:00
|
|
|
ubl.echo_name();
|
|
|
|
SERIAL_ECHOLNPGM(":");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
#elif HAS_ABL
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Auto Bed Leveling:");
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-10-13 23:16:32 +02:00
|
|
|
SERIAL_ECHOPAIR(" M420 S", planner.leveling_active ? 1 : 0);
|
2017-04-21 00:45:58 +02:00
|
|
|
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
2017-10-13 23:16:32 +02:00
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(planner.z_fade_height));
|
2017-04-21 00:45:58 +02:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
#if ENABLED(MESH_BED_LEVELING)
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
for (uint8_t py = 0; py < GRID_MAX_POINTS_Y; py++) {
|
|
|
|
for (uint8_t px = 0; px < GRID_MAX_POINTS_X; px++) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" G29 S3 X", (int)px + 1);
|
|
|
|
SERIAL_ECHOPAIR(" Y", (int)py + 1);
|
|
|
|
SERIAL_ECHOPGM(" Z");
|
|
|
|
SERIAL_PROTOCOL_F(LINEAR_UNIT(mbl.z_values[px][py]), 5);
|
|
|
|
SERIAL_EOL();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#elif ENABLED(AUTO_BED_LEVELING_UBL)
|
|
|
|
|
|
|
|
if (!forReplay) {
|
|
|
|
SERIAL_EOL();
|
|
|
|
ubl.report_state();
|
2017-10-14 04:58:45 +02:00
|
|
|
SERIAL_ECHOLNPAIR("\nActive Mesh Slot: ", ubl.storage_slot);
|
2017-10-13 23:16:32 +02:00
|
|
|
SERIAL_ECHOPAIR("EEPROM can hold ", calc_num_meshes());
|
|
|
|
SERIAL_ECHOLNPGM(" meshes.\n");
|
|
|
|
}
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-02-21 13:49:31 +01:00
|
|
|
#endif
|
2017-03-24 06:53:37 +01:00
|
|
|
|
2017-10-13 23:16:32 +02:00
|
|
|
#endif // HAS_LEVELING
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(DELTA)
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Endstop adjustment:");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
2017-10-27 06:49:20 +02:00
|
|
|
SERIAL_ECHOPAIR(" M666 X", LINEAR_UNIT(delta_endstop_adj[X_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(delta_endstop_adj[Y_AXIS]));
|
|
|
|
SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(delta_endstop_adj[Z_AXIS]));
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-18 14:43:25 +02:00
|
|
|
SERIAL_ECHOLNPGM("Delta settings: L<diagonal_rod> R<radius> H<height> S<segments_per_s> B<calibration radius> XYZ<tower angle corrections>");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M665 L", LINEAR_UNIT(delta_diagonal_rod));
|
|
|
|
SERIAL_ECHOPAIR(" R", LINEAR_UNIT(delta_radius));
|
2017-11-09 06:21:02 +01:00
|
|
|
SERIAL_ECHOPAIR(" H", LINEAR_UNIT(delta_height));
|
2016-10-29 01:55:42 +02:00
|
|
|
SERIAL_ECHOPAIR(" S", delta_segments_per_second);
|
2017-04-18 16:49:33 +02:00
|
|
|
SERIAL_ECHOPAIR(" B", LINEAR_UNIT(delta_calibration_radius));
|
2017-04-18 14:43:25 +02:00
|
|
|
SERIAL_ECHOPAIR(" X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS]));
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS]));
|
2017-09-24 08:45:31 +02:00
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(delta_tower_angle_trim[C_AXIS]));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-10-27 23:24:34 +02:00
|
|
|
|
|
|
|
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS)
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-10-27 23:24:34 +02:00
|
|
|
SERIAL_ECHOLNPGM("Endstop adjustment:");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-10-27 23:24:34 +02:00
|
|
|
SERIAL_ECHOPGM(" M666");
|
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS)
|
|
|
|
SERIAL_ECHOPAIR(" X", LINEAR_UNIT(x_endstop_adj));
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS)
|
|
|
|
SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(y_endstop_adj));
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Z_DUAL_ENDSTOPS)
|
|
|
|
SERIAL_ECHOPAIR(" Z", LINEAR_UNIT(z_endstop_adj));
|
|
|
|
#endif
|
|
|
|
SERIAL_EOL();
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif // DELTA
|
2015-04-27 03:44:01 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(ULTIPANEL)
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Material heatup parameters:");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2016-10-27 09:40:37 +02:00
|
|
|
for (uint8_t i = 0; i < COUNT(lcd_preheat_hotend_temp); i++) {
|
2017-11-15 10:59:23 +01:00
|
|
|
CONFIG_ECHO_START;
|
2016-10-27 09:40:37 +02:00
|
|
|
SERIAL_ECHOPAIR(" M145 S", (int)i);
|
2017-05-07 02:41:50 +02:00
|
|
|
SERIAL_ECHOPAIR(" H", TEMP_UNIT(lcd_preheat_hotend_temp[i]));
|
|
|
|
SERIAL_ECHOPAIR(" B", TEMP_UNIT(lcd_preheat_bed_temp[i]));
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPAIR(" F", lcd_preheat_fan_speed[i]);
|
2016-10-27 09:40:37 +02:00
|
|
|
}
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif // ULTIPANEL
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if HAS_PID_HEATING
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2016-10-29 01:55:42 +02:00
|
|
|
SERIAL_ECHOLNPGM("PID settings:");
|
|
|
|
}
|
|
|
|
#if ENABLED(PIDTEMP)
|
|
|
|
#if HOTENDS > 1
|
|
|
|
if (forReplay) {
|
|
|
|
HOTEND_LOOP() {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M301 E", e);
|
|
|
|
SERIAL_ECHOPAIR(" P", PID_PARAM(Kp, e));
|
|
|
|
SERIAL_ECHOPAIR(" I", unscalePID_i(PID_PARAM(Ki, e)));
|
|
|
|
SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, e)));
|
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
|
|
|
SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, e));
|
|
|
|
if (e == 0) SERIAL_ECHOPAIR(" L", lpq_len);
|
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif // HOTENDS > 1
|
|
|
|
// !forReplay || HOTENDS == 1
|
|
|
|
{
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M301 P", PID_PARAM(Kp, 0)); // for compatibility with hosts, only echo values for E0
|
|
|
|
SERIAL_ECHOPAIR(" I", unscalePID_i(PID_PARAM(Ki, 0)));
|
|
|
|
SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, 0)));
|
|
|
|
#if ENABLED(PID_EXTRUSION_SCALING)
|
|
|
|
SERIAL_ECHOPAIR(" C", PID_PARAM(Kc, 0));
|
|
|
|
SERIAL_ECHOPAIR(" L", lpq_len);
|
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
|
|
|
#endif // PIDTEMP
|
|
|
|
|
|
|
|
#if ENABLED(PIDTEMPBED)
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOPAIR(" M304 P", thermalManager.bedKp);
|
|
|
|
SERIAL_ECHOPAIR(" I", unscalePID_i(thermalManager.bedKi));
|
|
|
|
SERIAL_ECHOPAIR(" D", unscalePID_d(thermalManager.bedKd));
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // PIDTEMP || PIDTEMPBED
|
|
|
|
|
|
|
|
#if HAS_LCD_CONTRAST
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("LCD Contrast:");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPAIR(" M250 C", lcd_contrast);
|
2015-04-27 03:44:01 +02:00
|
|
|
#endif
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
#if ENABLED(FWRETRACT)
|
2012-11-07 23:16:43 +01:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Retract: S<length> F<units/m> Z<lift>");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 23:42:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M207 S", LINEAR_UNIT(fwretract.retract_length));
|
|
|
|
SERIAL_ECHOPAIR(" W", LINEAR_UNIT(fwretract.swap_retract_length));
|
|
|
|
SERIAL_ECHOPAIR(" F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_feedrate_mm_s)));
|
|
|
|
SERIAL_ECHOLNPAIR(" Z", LINEAR_UNIT(fwretract.retract_zlift));
|
2017-04-17 06:24:30 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Recover: S<length> F<units/m>");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 23:42:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M208 S", LINEAR_UNIT(fwretract.retract_recover_length));
|
|
|
|
SERIAL_ECHOPAIR(" W", LINEAR_UNIT(fwretract.swap_retract_recover_length));
|
|
|
|
SERIAL_ECHOLNPAIR(" F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_recover_feedrate_mm_s)));
|
2017-04-17 06:24:30 +02:00
|
|
|
|
2016-10-29 01:55:42 +02:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-07-24 01:56:56 +02:00
|
|
|
SERIAL_ECHOLNPGM("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2015-04-27 03:44:01 +02:00
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 23:42:56 +01:00
|
|
|
SERIAL_ECHOLNPAIR(" M209 S", fwretract.autoretract_enabled ? 1 : 0);
|
2015-01-28 10:08:48 +01:00
|
|
|
|
2017-04-17 06:24:30 +02:00
|
|
|
#endif // FWRETRACT
|
2016-10-29 01:55:42 +02:00
|
|
|
|
|
|
|
/**
|
2017-10-13 23:16:32 +02:00
|
|
|
* Probe Offset
|
2016-10-29 01:55:42 +02:00
|
|
|
*/
|
|
|
|
#if HAS_BED_PROBE
|
|
|
|
if (!forReplay) {
|
2017-03-07 06:00:43 +01:00
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Z-Probe Offset (mm):");
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPAIR(" M851 Z", LINEAR_UNIT(zprobe_zoffset));
|
2016-10-29 01:55:42 +02:00
|
|
|
#endif
|
2017-11-05 01:21:41 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Bed Skew Correction
|
|
|
|
*/
|
|
|
|
#if ENABLED(SKEW_CORRECTION_GCODE)
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Skew Factor: ");
|
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
#if ENABLED(SKEW_CORRECTION_FOR_Z)
|
2018-01-04 23:07:20 +01:00
|
|
|
SERIAL_ECHO(" M852 I");
|
2018-01-05 17:18:43 +01:00
|
|
|
SERIAL_ECHO_F(LINEAR_UNIT(planner.xy_skew_factor), 6);
|
2017-11-05 01:21:41 +01:00
|
|
|
SERIAL_ECHOPAIR(" J", LINEAR_UNIT(planner.xz_skew_factor));
|
|
|
|
SERIAL_ECHOLNPAIR(" K", LINEAR_UNIT(planner.yz_skew_factor));
|
|
|
|
#else
|
2018-01-04 23:07:20 +01:00
|
|
|
SERIAL_ECHO(" M852 S");
|
2018-01-07 03:53:33 +01:00
|
|
|
SERIAL_ECHO_F(LINEAR_UNIT(planner.xy_skew_factor), 6);
|
2018-01-04 23:18:00 +01:00
|
|
|
SERIAL_EOL();
|
2017-11-05 01:21:41 +01:00
|
|
|
#endif
|
|
|
|
#endif
|
2017-03-07 06:00:43 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2130 stepper driver current
|
|
|
|
*/
|
2017-12-25 11:03:40 +01:00
|
|
|
#if HAS_TRINAMIC
|
2017-03-07 06:00:43 +01:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-17 06:24:30 +02:00
|
|
|
SERIAL_ECHOLNPGM("Stepper driver current:");
|
2017-03-07 06:00:43 +01:00
|
|
|
}
|
2017-04-17 06:24:30 +02:00
|
|
|
CONFIG_ECHO_START;
|
2017-03-07 06:00:43 +01:00
|
|
|
SERIAL_ECHO(" M906");
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(X_IS_TMC2130) || ENABLED(X_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" X ", stepperX.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Y_IS_TMC2130) || ENABLED(Y_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" Y ", stepperY.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Z_IS_TMC2130) || ENABLED(Z_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" Z ", stepperZ.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(X2_IS_TMC2130) || ENABLED(X2_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" X2 ", stepperX2.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Y2_IS_TMC2130) || ENABLED(Y2_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" Y2 ", stepperY2.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(Z2_IS_TMC2130) || ENABLED(Z2_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" Z2 ", stepperZ2.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(E0_IS_TMC2130) || ENABLED(E0_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" E0 ", stepperE0.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(E1_IS_TMC2130) || ENABLED(E1_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" E1 ", stepperE1.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(E2_IS_TMC2130) || ENABLED(E2_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" E2 ", stepperE2.getCurrent());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-12-15 22:02:39 +01:00
|
|
|
#if ENABLED(E3_IS_TMC2130) || ENABLED(E3_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" E3 ", stepperE3.getCurrent());
|
|
|
|
#endif
|
|
|
|
#if ENABLED(E4_IS_TMC2130) || ENABLED(E4_IS_TMC2208)
|
|
|
|
SERIAL_ECHOPAIR(" E4 ", stepperE4.getCurrent());
|
|
|
|
#endif
|
|
|
|
SERIAL_EOL();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* TMC2130 Sensorless homing thresholds
|
|
|
|
*/
|
2017-12-25 11:03:40 +01:00
|
|
|
#if ENABLED(SENSORLESS_HOMING)
|
2017-12-15 22:02:39 +01:00
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Sensorless homing threshold:");
|
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHO(" M914");
|
|
|
|
#if ENABLED(X_IS_TMC2130)
|
|
|
|
SERIAL_ECHOPAIR(" X", stepperX.sgt());
|
|
|
|
#endif
|
|
|
|
#if ENABLED(X2_IS_TMC2130)
|
|
|
|
SERIAL_ECHOPAIR(" X2 ", stepperX2.sgt());
|
|
|
|
#endif
|
|
|
|
#if ENABLED(Y_IS_TMC2130)
|
|
|
|
SERIAL_ECHOPAIR(" Y", stepperY.sgt());
|
|
|
|
#endif
|
|
|
|
#if ENABLED(X2_IS_TMC2130)
|
|
|
|
SERIAL_ECHOPAIR(" Y2 ", stepperY2.sgt());
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-06-09 17:51:23 +02:00
|
|
|
SERIAL_EOL();
|
2017-03-07 06:00:43 +01:00
|
|
|
#endif
|
2017-04-16 05:18:10 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Linear Advance
|
|
|
|
*/
|
|
|
|
#if ENABLED(LIN_ADVANCE)
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
SERIAL_ECHOLNPGM("Linear Advance:");
|
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
2017-04-22 05:30:36 +02:00
|
|
|
SERIAL_ECHOPAIR(" M900 K", planner.extruder_advance_k);
|
|
|
|
SERIAL_ECHOLNPAIR(" R", planner.advance_ed_ratio);
|
2017-04-16 05:18:10 +02:00
|
|
|
#endif
|
2017-06-03 07:38:07 +02:00
|
|
|
|
|
|
|
#if HAS_MOTOR_CURRENT_PWM
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
if (!forReplay) {
|
|
|
|
SERIAL_ECHOLNPGM("Stepper motor currents:");
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
}
|
|
|
|
SERIAL_ECHOPAIR(" M907 X", stepper.motor_current_setting[0]);
|
|
|
|
SERIAL_ECHOPAIR(" Z", stepper.motor_current_setting[1]);
|
|
|
|
SERIAL_ECHOPAIR(" E", stepper.motor_current_setting[2]);
|
|
|
|
SERIAL_EOL();
|
|
|
|
#endif
|
2017-12-27 05:51:55 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Advanced Pause filament load & unload lengths
|
|
|
|
*/
|
|
|
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
|
|
|
if (!forReplay) {
|
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 23:42:56 +01:00
|
|
|
SERIAL_ECHOLNPGM("Filament load/unload lengths:");
|
2017-12-27 05:51:55 +01:00
|
|
|
}
|
|
|
|
CONFIG_ECHO_START;
|
|
|
|
#if EXTRUDERS == 1
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 L", LINEAR_UNIT(filament_change_load_length[0]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[0]));
|
2017-12-27 05:51:55 +01:00
|
|
|
#else
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 T0 L", LINEAR_UNIT(filament_change_load_length[0]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[0]));
|
2017-12-27 05:51:55 +01:00
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 T1 L", LINEAR_UNIT(filament_change_load_length[1]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[1]));
|
2017-12-27 05:51:55 +01:00
|
|
|
#if EXTRUDERS > 2
|
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 T2 L", LINEAR_UNIT(filament_change_load_length[2]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[2]));
|
2017-12-27 05:51:55 +01:00
|
|
|
#if EXTRUDERS > 3
|
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 T3 L", LINEAR_UNIT(filament_change_load_length[3]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[3]));
|
2017-12-27 05:51:55 +01:00
|
|
|
#if EXTRUDERS > 4
|
|
|
|
CONFIG_ECHO_START;
|
2018-01-04 12:20:56 +01:00
|
|
|
SERIAL_ECHOPAIR(" M603 T4 L", LINEAR_UNIT(filament_change_load_length[4]));
|
|
|
|
SERIAL_ECHOLNPAIR(" U", LINEAR_UNIT(filament_change_unload_length[4]));
|
2017-12-27 05:51:55 +01:00
|
|
|
#endif // EXTRUDERS > 4
|
|
|
|
#endif // EXTRUDERS > 3
|
|
|
|
#endif // EXTRUDERS > 2
|
|
|
|
#endif // EXTRUDERS == 1
|
|
|
|
#endif // ADVANCED_PAUSE_FEATURE
|
2016-10-29 01:55:42 +02:00
|
|
|
}
|
Allow Edit menu to call fn after edit; Fix PID Ki and Kd display in menus; Actually use changed PID and Max Accel values
Add new 'callback' edit-menu types that call a function after the edit is done. Use this to display and edit Ki and Kd correctly (removing the scaling first and reapplying it after). Also use it to reset maximum stepwise acceleration rates, after updating mm/s^2 rates via menus. (Previously, changes did nothing to affect planner unless saved back to EEPROM, and the machine reset).
Add calls to updatePID() so that PID loop uses updated values whether set by gcode (it already did this), or by restoring defaults, or loading from EEPROM (it didn't do those last two). Similarly, update the maximum step/s^2 accel rates when the mm/s^2 values are changed - whether by menu edits, restore defaults, or EEPROM read.
Refactor the acceleration rate update logic, and the PID scaling logic, into new functions that can be called from wherever, including the callbacks.
Add menu items to allow the z jerk and e jerk to be viewed/edited in the Control->Motion menu, as per xy jerk.
Conflicts:
Marlin/language.h
2013-03-19 15:05:11 +01:00
|
|
|
|
2015-01-28 10:08:48 +01:00
|
|
|
#endif // !DISABLE_M503
|