diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d6e0409..164e327 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,2 +1,3 @@ custom: ["https://www.paypal.com/donate/?business=85SPAAR6UZEE8"] patreon: mriscoc +github: [mriscoc] \ No newline at end of file diff --git a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp index 3e0bb58..025bad4 100644 --- a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp @@ -54,6 +54,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // SERIAL_ECHOLNPGM("Addr:", (unsigned)pos, ", real:", (unsigned)p, ", value:", v); if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes @@ -72,6 +73,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { do { const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + // SERIAL_ECHOLNPGM("Addr:", (unsigned)pos, ", real:", (unsigned)REAL_EEPROM_ADDR(pos), ", value:", c); if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/feature/bedlevel/bedlevel_tools.cpp b/Marlin/src/feature/bedlevel/bedlevel_tools.cpp index 4efd2f8..8b0e835 100644 --- a/Marlin/src/feature/bedlevel/bedlevel_tools.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel_tools.cpp @@ -162,6 +162,7 @@ void BedLevelTools::probeXY() { } void BedLevelTools::meshReset() { + set_bed_leveling_enabled(false); ZERO(bedlevel.z_values); #if ENABLED(AUTO_BED_LEVELING_BILINEAR) bedlevel.refresh_bed_level(); @@ -170,10 +171,10 @@ void BedLevelTools::meshReset() { // Return 'true' if mesh is good and within limits bool BedLevelTools::meshValidate() { - if (MESH_MAX_X <= MESH_MIN_X || MESH_MAX_Y <= MESH_MIN_Y) return false; + if ((MESH_MAX_X <= MESH_MIN_X) || (MESH_MAX_Y <= MESH_MIN_Y)) return false; GRID_LOOP(x, y) { const float v = bedlevel.z_values[x][y]; - if (isnan(v) || !WITHIN(v, UBL_Z_OFFSET_MIN, UBL_Z_OFFSET_MAX)) return false; + if (isnan(v) || !WITHIN(v, Z_OFFSET_MIN, Z_OFFSET_MAX)) return false; } return true; } diff --git a/Marlin/src/feature/bedlevel/bedlevel_tools.h b/Marlin/src/feature/bedlevel/bedlevel_tools.h index 40fc37f..5091fe3 100644 --- a/Marlin/src/feature/bedlevel/bedlevel_tools.h +++ b/Marlin/src/feature/bedlevel/bedlevel_tools.h @@ -25,8 +25,8 @@ #include "../../inc/MarlinConfigPre.h" -#define UBL_Z_OFFSET_MIN -3.0 -#define UBL_Z_OFFSET_MAX 3.0 +#define Z_OFFSET_MIN -3.0 +#define Z_OFFSET_MAX 3.0 class BedLevelTools { public: diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 3ce0398..67698d3 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -222,6 +222,9 @@ void GcodeSuite::M115() { // CONFIG_EXPORT cap_line(F("CONFIG_EXPORT"), ENABLED(CONFIGURATION_EMBEDDING)); + // PROUI AML + cap_line(F("PROUI_AML"), ENABLED(PROUI_EX)); + // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) TERN(PROUI_EX, const, constexpr) xyz_pos_t bmin{0}, diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index f14e807..8e4cd2c 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -680,14 +680,14 @@ void _drawIconBlink(bool &flag, const bool sensor, const uint8_t icon1, const ui #if HAS_HOTEND void _drawHotendIcon() { static bool _isHeatingHotend = false; - _drawIconBlink(_isHeatingHotend, thermalManager.isHeatingHotend(EXT), ICON_HotendTemp, ICON_SetEndTemp, 10, 383); + _drawIconBlink(_isHeatingHotend, thermalManager.isHeatingHotend(EXT), ICON_HotendTemp, ICON_SetEndTemp, DASH_ICO_COL1, 383); } #endif #if HAS_HEATED_BED void _drawBedIcon() { static bool _isHeatingBed = false; - _drawIconBlink(_isHeatingBed, thermalManager.isHeatingBed(), ICON_BedTemp, ICON_SetBedTemp, 10, 416); + _drawIconBlink(_isHeatingBed, thermalManager.isHeatingBed(), ICON_BedTemp, ICON_SetBedTemp, DASH_ICO_COL1, 416); } #endif @@ -712,18 +712,18 @@ void _drawFeedrate() { int16_t _value; if (blink) { _value = feedrate_percentage; - DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 4 * STAT_CHR_W + 2, 384, F(" %")); + DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 4 * DASH_CHR_W + 2, 384, F(" %")); } else { _value = round(feedrate_mm_s * feedrate_percentage / 100); - dwinDrawBox(1, hmiData.colorBackground, 116 + 5 * STAT_CHR_W + 2, 384, 20, 20); + dwinDrawBox(1, hmiData.colorBackground, 116 + 5 * DASH_CHR_W + 2, 384, 20, 20); } - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * STAT_CHR_W, 384, _value); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * DASH_CHR_W, 384, _value); #else static int16_t _feedrate = 100; if (_feedrate != feedrate_percentage) { _feedrate = feedrate_percentage; - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * STAT_CHR_W, 384, _feedrate); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * DASH_CHR_W, 384, _feedrate); } #endif } @@ -779,13 +779,13 @@ void updateVariable() { if (_new_hotend_temp) DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 384, _hotendtemp); if (_new_hotend_target) - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 384, _hotendtarget); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * DASH_CHR_W + 6, 384, _hotendtarget); _drawHotendIcon(); static int16_t _flow = planner.flow_percentage[EXT]; if (_flow != planner.flow_percentage[EXT]) { _flow = planner.flow_percentage[EXT]; - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * STAT_CHR_W, 417, _flow); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * DASH_CHR_W, 417, _flow); } #endif @@ -793,7 +793,7 @@ void updateVariable() { if (_new_bed_temp) DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 417, _bedtemp); if (_new_bed_target) - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 417, _bedtarget); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * DASH_CHR_W + 6, 417, _bedtarget); _drawBedIcon(); #endif @@ -801,7 +801,7 @@ void updateVariable() { #if HAS_FAN if (_new_fanspeed) - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 195 + 2 * STAT_CHR_W, 384, _fanspeed); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 195 + 2 * DASH_CHR_W, 384, _fanspeed); #endif static float _offset = 0; @@ -1001,30 +1001,30 @@ void dwinDrawDashboard() { TERN_(CV_LASER_MODULE, if (laser_device.is_laser_device()) return); #if HAS_HOTEND - DWINUI::drawIcon(ICON_HotendTemp, 10, 383); + DWINUI::drawIcon(ICON_HotendTemp, DASH_ICO_COL1, 383); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 384, thermalManager.wholeDegHotend(EXT)); - DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(EXT)); + DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * DASH_CHR_W + 5, 384, F("/")); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * DASH_CHR_W + 6, 384, thermalManager.degTargetHotend(EXT)); DWINUI::drawIcon(ICON_StepE, 112, 417); - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[EXT]); - DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 5 * STAT_CHR_W + 2, 417, F("%")); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * DASH_CHR_W, 417, planner.flow_percentage[EXT]); + DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 5 * DASH_CHR_W + 2, 417, F("%")); #endif #if HAS_HEATED_BED - DWINUI::drawIcon(ICON_BedTemp, 10, 416); + DWINUI::drawIcon(ICON_BedTemp, DASH_ICO_COL1, 416); DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 28, 417, thermalManager.wholeDegBed()); - DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); + DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 25 + 3 * DASH_CHR_W + 5, 417, F("/")); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 25 + 4 * DASH_CHR_W + 6, 417, thermalManager.degTargetBed()); #endif DWINUI::drawIcon(ICON_Speed, 113, 383); - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * STAT_CHR_W, 384, feedrate_percentage); - IF_DISABLED(SHOW_SPEED_IND, DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 5 * STAT_CHR_W + 2, 384, F("%"))); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 116 + 2 * DASH_CHR_W, 384, feedrate_percentage); + IF_DISABLED(SHOW_SPEED_IND, DWINUI::drawString(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 116 + 5 * DASH_CHR_W + 2, 384, F("%"))); #if HAS_FAN DWINUI::drawIcon(ICON_FanSpeed, 186, 383); - DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 195 + 2 * STAT_CHR_W, 384, thermalManager.fan_speed[FAN]); + DWINUI::drawInt(DWIN_FONT_STAT, hmiData.colorIndicator, hmiData.colorBackground, 3, 195 + 2 * DASH_CHR_W, 384, thermalManager.fan_speed[FAN]); #endif #if HAS_ZOFFSET_ITEM @@ -1469,7 +1469,7 @@ void dwinHomingDone() { proUIEx.cancel_lev = 0; DWINUI::drawButton(BTN_Cancel, 86, 305); #else - dwinShowPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), GET_TEXT_F(MSG_PLEASE_WAIT), TERN(PROUI_EX, BTN_Cancel, 0)); + dwinShowPopup(ICON_AutoLeveling, GET_TEXT_F(MSG_BED_LEVELING), GET_TEXT_F(MSG_PLEASE_WAIT)); #endif #if ALL(AUTO_BED_LEVELING_UBL, PREHEAT_BEFORE_LEVELING) #if HAS_BED_PROBE @@ -3676,8 +3676,6 @@ void drawStepsMenu() { #if ENABLED(MESH_EDIT_MENU) bool autoMovToMesh = false; - #define Z_OFFSET_MIN -3 - #define Z_OFFSET_MAX 3 void applyEditMeshX() { bedLevelTools.mesh_x = menuData.value; if (autoMovToMesh) bedLevelTools.moveToXY(); } void applyEditMeshY() { bedLevelTools.mesh_y = menuData.value; if (autoMovToMesh) bedLevelTools.moveToXY(); } void liveEditMesh() { getMenuItem(editZValueItem)->value = &bedlevel.z_values[hmiValue.select ? bedLevelTools.mesh_x : menuData.value][hmiValue.select ? menuData.value : bedLevelTools.mesh_y]; redrawItem(editZValueItem); } diff --git a/Marlin/src/lcd/e3v2/proui/dwinui.h b/Marlin/src/lcd/e3v2/proui/dwinui.h index 32c4148..d845faf 100644 --- a/Marlin/src/lcd/e3v2/proui/dwinui.h +++ b/Marlin/src/lcd/e3v2/proui/dwinui.h @@ -209,7 +209,8 @@ constexpr uint8_t TITLE_HEIGHT = 30, // Title bar heig LBLX = 55, // Menu item label X position VALX = 210, // Menu item value X position MENU_CHR_W = 8, MENU_CHR_H = 16, // Menu font 8x16 - STAT_CHR_W = 10; + DASH_CHR_W = 10, // Width of Dashboard fonts + DASH_ICO_COL1 = 7; // First column of dashboard icons // Menuitem Y position #define MYPOS(L) (TITLE_HEIGHT + MLINE * (L)) diff --git a/Marlin/src/lcd/e3v2/proui/menus.h b/Marlin/src/lcd/e3v2/proui/menus.h index 5ed7312..976d84b 100644 --- a/Marlin/src/lcd/e3v2/proui/menus.h +++ b/Marlin/src/lcd/e3v2/proui/menus.h @@ -51,7 +51,6 @@ typedef struct { } MenuData_t; extern MenuData_t menuData; -struct MenuItem_t; typedef void (*OnDrawItem)(int8_t pos, int8_t line); typedef void (*OnClickItem)(); struct MenuItem_t { diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 52123d1..5090ebe 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -625,7 +625,7 @@ void menu_configuration() { #endif #if ENABLED(FWRETRACT) - SUBMENU(MSG_RETRACT, menu_config_retract); + SUBMENU(MSG_FWRETRACT, menu_config_retract); #endif #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 29b7423..fb08501 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -712,7 +712,7 @@ static_assert(settingsdata_size <= MARLIN_EEPROM_SIZE, "EEPROM too small to cont MarlinSettings settings; -uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); } +uint16_t MarlinSettings::datasize() { return settingsdata_size; } /** * Post-process after Retrieve or Reset @@ -848,9 +848,9 @@ void MarlinSettings::postprocess() { #endif #if ENABLED(DEBUG_EEPROM_OBSERVE) - #define EEPROM_READ(V...) do{ SERIAL_ECHOPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) - #define EEPROM_READ_ALWAYS(V...) do{ SERIAL_ECHOPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_ALWAYS_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) - #define EEPROM_WRITE(V...) do{ SERIAL_ECHOPGM("WRITE: ", F(STRINGIFY(FIRST(V)))); EEPROM_WRITE_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) + #define EEPROM_READ(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) + #define EEPROM_READ_ALWAYS(V...) do{ SERIAL_ECHOLNPGM("READ: ", F(STRINGIFY(FIRST(V)))); EEPROM_READ_ALWAYS_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) + #define EEPROM_WRITE(V...) do{ SERIAL_ECHOLNPGM("WRITE: ", F(STRINGIFY(FIRST(V)))); EEPROM_WRITE_(V); SERIAL_ECHOLNPGM(" CRC: ", working_crc); }while(0) #else #define EEPROM_READ(V...) EEPROM_READ_(V) #define EEPROM_READ_ALWAYS(V...) EEPROM_READ_ALWAYS_(V) @@ -3302,7 +3302,7 @@ void MarlinSettings::reset() { #endif #endif #if HAS_BED_PROBE - PRO_data.probezfix = DEF_PROBEZFIX; + PRO_data.probezfix = TERN0(DEF_PROBEZFIX, DEF_PROBEZFIX); PRO_data.zprobefeedslow = DEF_Z_PROBE_FEEDRATE_SLOW; PRO_data.multiple_probing = MULTIPLE_PROBING; #endif diff --git a/Marlin/src/prouiex/custom_gcodes.cpp b/Marlin/src/prouiex/custom_gcodes.cpp index 3a9ff16..2109242 100644 --- a/Marlin/src/prouiex/custom_gcodes.cpp +++ b/Marlin/src/prouiex/custom_gcodes.cpp @@ -109,12 +109,17 @@ void C250() { } #endif -#if DEBUG_DWIN +#if ENABLED(DEBUG_DWIN) void C997() { SERIAL_ECHOLNPGM("Simulating a printer freeze"); TERN_(DWIN_LCD_PROUI, dwinRebootScreen()); while (1) {}; } +#elif NONE(PLATFORM_M997_SUPPORT, DWIN_LCD_PROUI) + void C997() { + SERIAL_ECHOLNPGM("Reboot printer"); + hal.reboot(); + } #endif // Special Creality DWIN GCodes @@ -130,8 +135,8 @@ void customGcode(const int16_t codenum) { #if HAS_LOCKSCREEN case 510: C510(); break; // lock screen #endif - #if DEBUG_DWIN - case 997: C997(); break; // Simulate a printer freeze + #if ENABLED(DEBUG_DWIN) || NONE(PLATFORM_M997_SUPPORT, DWIN_LCD_PROUI) + case 997: C997(); break; // Simulate a printer freeze (or reboot) #endif #if HAS_MEDIA case 10: proUIEx.C10(); break; // Mark the G-code file as a Configuration file diff --git a/Marlin/src/prouiex/proui_ex.h b/Marlin/src/prouiex/proui_ex.h index 5a374bf..72ba375 100644 --- a/Marlin/src/prouiex/proui_ex.h +++ b/Marlin/src/prouiex/proui_ex.h @@ -126,7 +126,7 @@ typedef struct { // Do not change this data structure int16_t x_max_pos = DEF_X_MAX_POS; int16_t y_max_pos = DEF_Y_MAX_POS; int16_t z_max_pos = DEF_Z_MAX_POS; - float probezfix = DEF_PROBEZFIX; + float probezfix = TERN0(DEF_PROBEZFIX,DEF_PROBEZFIX); uint16_t zprobefeedslow = DEF_Z_PROBE_FEEDRATE_SLOW; uint8_t multiple_probing = MULTIPLE_PROBING; bool Invert_E0 = DEF_INVERT_E0_DIR;