March 2024 (20240410)

Adjust icon blink background
M115 can show PROUI AML capability
Other minor fixes to save program memory
Ender3V2S1-Released
Miguel Risco-Castillo 4 weeks ago
parent bf7777ee8d
commit ac6b670136

@ -1,2 +1,3 @@
custom: ["https://www.paypal.com/donate/?business=85SPAAR6UZEE8"]
patreon: mriscoc
github: [mriscoc]

@ -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++;

@ -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;
}

@ -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:

@ -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},

@ -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); }

@ -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))

@ -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 {

@ -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

@ -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

@ -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

@ -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;

Loading…
Cancel
Save