Bump to match community head

This commit is contained in:
InsanityAutomation
2021-01-17 16:56:40 -05:00
parent bcc28b118c
commit c4e0d50ad8
16 changed files with 1123 additions and 256 deletions
Binary file not shown.
+10 -27
View File
@@ -991,7 +991,7 @@
#define XY_PROBE_SPEED (133*60)
// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2)
#define Z_PROBE_SPEED_FAST (HOMING_FEEDRATE_Z / 2)
#define Z_PROBE_SPEED_FAST ((4 * 60) / 2)
// Feedrate (mm/min) for the "accurate" probe of each point
#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2)
@@ -1004,21 +1004,6 @@
//#define PROBE_ENABLE_PIN PC6 // Override default pin
#endif
// Probe should be tared prior to each probe
// Useful for strain or piezo sensors which must exclude strain such
// as that from cables or bowden cables pulling on the carriage.
#define PROBE_TARE
#if ENABLED(PROBE_TARE)
#define PROBE_TARE_TIME 200 // Time to hold tare pin (milliseconds)
#define PROBE_TARE_DELAY 200 // Delay after tare before (milliseconds)
#define PROBE_TARE_STATE LOW // State to write pin for tare
//#define PROBE_TARE_PIN PA5 // Override default pin
#if ENABLED(PROBE_ACTIVE_INPUT)
// Fail to tare/probe if PROBE_ACTIVE_INPUT reports the probe to be active
//#define PROBE_TARE_ONLY_WHILE_INACTIVE
#endif
#endif
/**
* Probe Activation Switch
@@ -1031,19 +1016,18 @@
//#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin
#endif
/**
* Tare Probe (determine zero-point) prior to each probe.
* Useful for a strain gauge or piezo sensor that needs to factor out
* elements such as cables pulling on the carriage.
*/
//#define PROBE_TARE
// Probe should be tared prior to each probe
// Useful for strain or piezo sensors which must exclude strain such
// as that from cables or bowden cables pulling on the carriage.
#define PROBE_TARE
#if ENABLED(PROBE_TARE)
#define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin
#define PROBE_TARE_DELAY 200 // (ms) Delay after tare before
#define PROBE_TARE_TIME 200 // Time to hold tare pin (milliseconds)
#define PROBE_TARE_DELAY 200 // Delay after tare before (milliseconds)
#define PROBE_TARE_STATE HIGH // State to write pin for tare
//#define PROBE_TARE_PIN PA5 // Override default pin
#if ENABLED(PROBE_ACTIVATION_SWITCH)
//#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active
#if ENABLED(PROBE_ACTIVE_INPUT)
// Fail to tare/probe if PROBE_ACTIVE_INPUT reports the probe to be active
//#define PROBE_TARE_ONLY_WHILE_INACTIVE
#endif
#endif
@@ -1421,7 +1405,6 @@
#define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points
#define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points
//#define LEVEL_CENTER_TOO // Move to the center after the last corner
#endif
/**
* Corner Leveling Order
+2 -2
View File
@@ -2050,7 +2050,7 @@
*/
#define FWRETRACT
#if ENABLED(FWRETRACT)
//#define FWRETRACT_AUTORETRACT // Override slicer retractions
#define FWRETRACT_AUTORETRACT // Override slicer retractions
#if ENABLED(FWRETRACT_AUTORETRACT)
#define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length
#define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length
@@ -2169,7 +2169,7 @@
// For direct drive, the full length of the nozzle.
//#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted.
#define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate.
#define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading.
#define ADVANCED_PAUSE_PURGE_LENGTH 0 // (mm) Length to extrude after loading.
// Set to 0 for manual extrusion.
// Filament can be extruded repeatedly from the Filament Change menu
// until extrusion is consistent, and to purge old filament.
+1 -1
View File
@@ -121,7 +121,7 @@
#else
#error "LCD_SERIAL_PORT must be -1 or from 1 to 3. Please update your configuration."
#endif
#if HAS_DGUS_LCD
#if HAS_DGUS_LCD || ENABLED(DGUS_LCD_UI_CREALITY_TOUCH)
#define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite()
#endif
#endif
+63 -50
View File
@@ -31,16 +31,22 @@
#if ENABLED(DGUS_LCD_UI_CREALITY_TOUCH)
#include "ui_api.h"
#include "../marlinui.h"
#include "lib/dgus_creality/DGUSDisplay.h"
#include "lib/dgus_creality/DGUSDisplayDef.h"
#include "lib/dgus_creality/DGUSScreenHandler.h"
#include "lib/dgus_creality/creality_touch/PIDHandler.h"
#if ENABLED(POWER_LOSS_RECOVERY)
#include "../../feature/powerloss.h"
#endif
extern const char NUL_STR[];
namespace ExtUI {
void onStartup() {
dgusdisplay.InitDisplay();
ScreenHandler.Init();
ScreenHandler.UpdateScreenVPData();
}
@@ -58,15 +64,21 @@ namespace ExtUI {
} else {
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_KILL);
}
ScreenHandler.KillScreenCalled();
while (!ScreenHandler.loop()); // Wait while anything is left to be sent
}
}
void onMediaInserted() { TERN_(SDSUPPORT, ScreenHandler.SDCardInserted()); }
void onMediaError() { TERN_(SDSUPPORT, ScreenHandler.SDCardError()); }
void onMediaRemoved() { TERN_(SDSUPPORT, ScreenHandler.SDCardRemoved()); }
void onPlayTone(const uint16_t frequency, const uint16_t duration) {
if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_FEED) {
// We're in the feed (load filament) workflow - no beep - there is no confirmation
return;
}
ScreenHandler.Buzzer(frequency, duration);
}
@@ -75,9 +87,14 @@ bool hasPrintTimer = false;
void onPrintTimerStarted() {
hasPrintTimer = true;
if (!ExtUI::isPrintingFromMedia()) {
if (!ExtUI::isPrintingFromMedia() && !(PrintJobRecovery::valid() && PrintJobRecovery::exists())) {
ScreenHandler.SetPrintingFromHost();
}
#if ENABLED(LCD_SET_PROGRESS_MANUALLY)
ui.progress_reset();
#endif
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PRINT_RUNNING);
}
@@ -96,7 +113,10 @@ bool hasPrintTimer = false;
}
void onFilamentRunout(const extruder_t extruder) {
ScreenHandler.FilamentRunout();
// Only navigate to filament runout screen when we don't use M600 for changing the filament - otherwise it gets confusing for the user
if (strcmp_P(FILAMENT_RUNOUT_SCRIPT, PSTR("M600")) != 0) {
ScreenHandler.FilamentRunout();
}
}
void onUserConfirmed() {
@@ -109,23 +129,27 @@ bool hasPrintTimer = false;
if (msg) {
DEBUG_ECHOLNPAIR("User confirmation requested: ", msg);
if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_FEED) {
// We're in the feed (load filament) workflow - immediately assume confirmed
onUserConfirmed();
return;
}
ScreenHandler.setstatusmessagePGM(msg);
ScreenHandler.sendinfoscreen(PSTR("Confirmation required"), msg, NUL_STR, PSTR("Ok"), true, true, false, true);
//if (hasPrintTimer) {
// ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PRINT_PAUSED);
//} else {
if (ExtUI::isPrinting()) {
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_DIALOG_PAUSE);
} else {
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP);
// }
}
}
//else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP) {
// DEBUG_ECHOLNPAIR("User confirmation canceled");
else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP) {
DEBUG_ECHOLNPAIR("User confirmation canceled");
// ScreenHandler.setstatusmessagePGM(nullptr);
// ScreenHandler.PopToOldScreen();
// }
//while (!ScreenHandler.loop()); // Wait while anything is left to be sent
ScreenHandler.setstatusmessagePGM(nullptr);
ScreenHandler.PopToOldScreen();
}
}
void onStatusChanged(const char * const msg) { ScreenHandler.setstatusmessage(msg); }
@@ -145,25 +169,13 @@ bool hasPrintTimer = false;
void onPrintFinished() {
ScreenHandler.OnPrintFinished();
}
void onStoreSettings(char *buff) {
// Called when saving to EEPROM (i.e. M500). If the ExtUI needs
// permanent data to be stored, it can write up to eeprom_data_size bytes
// into buff.
// Example:
// static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size);
// memcpy(buff, &myDataStruct, sizeof(myDataStruct));
ScreenHandler.StoreSettings(buff);
}
void onLoadSettings(const char *buff) {
// Called while loading settings from EEPROM. If the ExtUI
// needs to retrieve data, it should copy up to eeprom_data_size bytes
// from buff
// Example:
// static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size);
// memcpy(&myDataStruct, buff, sizeof(myDataStruct));
ScreenHandler.LoadSettings(buff);
}
void onConfigurationStoreWritten(bool success) {
@@ -200,38 +212,39 @@ bool hasPrintTimer = false;
#if ENABLED(POWER_LOSS_RECOVERY)
void onPowerLossResume() {
// Called on resume from power-loss
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS);
ScreenHandler.OnPowerlossResume();
}
#endif
#if HAS_PID_HEATING
void onPidTuning(const result_t rst) {
//Called for temperature PID tuning result
switch (rst) {
case PID_BAD_EXTRUDER_NUM:
ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM));
break;
case PID_TEMP_TOO_HIGH:
ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TEMP_TOO_HIGH));
break;
case PID_TUNING_TIMEOUT:
ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_TIMEOUT));
break;
case PID_DONE:
ScreenHandler.setstatusmessagePGM(GET_TEXT(MSG_PID_AUTOTUNE_DONE));
break;
}
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
// Called for temperature PID tuning result
switch (rst) {
case PID_BAD_EXTRUDER_NUM:
PIDHandler::result_message = GET_TEXT(MSG_PID_BAD_EXTRUDER_NUM);
ScreenHandler.setstatusmessagePGM(PIDHandler::result_message);
break;
case PID_TEMP_TOO_HIGH:
PIDHandler::result_message = GET_TEXT(MSG_PID_TEMP_TOO_HIGH);
ScreenHandler.setstatusmessagePGM(PIDHandler::result_message);
break;
case PID_TUNING_TIMEOUT:
PIDHandler::result_message = GET_TEXT(MSG_PID_TIMEOUT);
ScreenHandler.setstatusmessagePGM(PIDHandler::result_message);
break;
case PID_DONE:
PIDHandler::result_message = GET_TEXT(MSG_PID_AUTOTUNE_DONE);
ScreenHandler.setstatusmessagePGM(PIDHandler::result_message);
break;
}
}
#endif
void onSteppersDisabled() {
ScreenHandler.HandleStepperState(false);
}
void onSteppersEnabled() {
ScreenHandler.HandleStepperState(true);
}
}
@@ -156,6 +156,22 @@ void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t val
}
}
void DGUSDisplay::SetVariableDisplayColor(uint16_t sp, uint16_t color) {
WriteVariable(sp + 0x03, color);
}
void DGUSDisplay::SetVariableAppendText(uint16_t sp, PGM_P appendText) {
// High byte is length, low byte is first char
if (!appendText) {
WriteVariable(sp + 0x07, static_cast<uint8_t>(0));
return;
}
uint8_t lengthFirstChar = strlen_P(appendText);// << 8;
WriteVariable(sp + 0x07, lengthFirstChar);
WriteVariablePGM(sp + 0x08, appendText, strlen_P(appendText));
}
void DGUSDisplay::ProcessRx() {
#if ENABLED(DGUS_SERIAL_STATS_RX_BUFFER_OVERRUNS)
@@ -230,22 +246,11 @@ void DGUSDisplay::ProcessRx() {
if (vp == 0x14 /*PIC_Now*/) {
const uint16_t screen_id = tmp[3] << 8 | tmp[4];
// In the code below DGUSLCD_SCREEN_BOOT acts as a sentinel
if (screen_id == 255) {
// DGUS OS sometimes randomly sends 255 back as an answer. Possible buffer overrun?
ReadCurrentScreen(); // Request again
} else if (displayRequest != DGUSLCD_SCREEN_BOOT && screen_id != displayRequest) {
// A display was requested. If the screen didn't yet switch to that display, we won't give that value back, otherwise the code gets confused.
// The DWIN display mostly honours the PIC_SET requests from the firmware, so after a while we may want to nudge it to the correct screen
DEBUG_ECHOPAIR(" Got a response on the current screen: ", screen_id);
DEBUG_ECHOLNPAIR(" - however, we've requested screen ", displayRequest);
} else {
displayRequest = DGUSLCD_SCREEN_BOOT;
if (current_screen_update_callback != nullptr) {
current_screen_update_callback(static_cast<DGUSLCD_Screens>(screen_id));
}
}
// A display was requested. If the screen didn't yet switch to that display, we won't give that value back, otherwise the code gets confused.
// The DWIN display mostly honours the PIC_SET requests from the firmware, so after a while we may want to nudge it to the correct screen
DEBUG_ECHOPAIR(" Got a response on the current screen: ", screen_id);
DEBUG_ECHOLNPAIR(" - however, we've requested screen ", displayRequest);
UNUSED(screen_id);
} else {
//const uint8_t dlen = tmp[2] << 1; // Convert to Bytes. (Display works with words)
//DEBUG_ECHOPAIR(" vp=", vp, " dlen=", dlen);
@@ -259,9 +264,6 @@ void DGUSDisplay::ProcessRx() {
}
else
DEBUG_ECHOLNPAIR(" VPVar not found:", vp);
// Always ask for a screen update so we can send a screen update earlier, this prevents a flash of unstyled screen
ReadCurrentScreen();
}
rx_datagram_state = DGUS_IDLE;
@@ -306,8 +308,25 @@ void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) {
WriteVariable(0x84, gotoscreen, sizeof(gotoscreen));
}
void DGUSDisplay::ReadCurrentScreen() {
ReadVariable(0x14 /*PIC_NOW*/);
void DGUSDisplay::SetTouchScreenConfiguration(bool enable_standby, bool enable_sound, uint8_t standby_brightness) {
// Main configuration (System_Config)
unsigned char cfg_bits = 0x0;
cfg_bits |= 1UL << 5; // 5: load 22 touch file
cfg_bits |= 1UL << 4; // 4: auto-upload should always be enabled
if (enable_sound) cfg_bits |= 1UL << 3; // 3: audio
if (enable_standby) cfg_bits |= 1UL << 2; // 2: backlight on standby
cfg_bits |= 1UL << 1; // 1 & 0: 270 degrees orientation of display
cfg_bits |= 1UL << 0;
DEBUG_ECHOLNPAIR("Update touch screen config - standby ", enable_standby);
DEBUG_ECHOLNPAIR("Update touch screen config - sound ", enable_sound);
const unsigned char config_set[] = { 0x5A, 0x00, (unsigned char) (cfg_bits >> 8U), (unsigned char) (cfg_bits & 0xFFU) };
WriteVariable(0x80 /*System_Config*/, config_set, sizeof(config_set));
// Standby brightness (LED_Config)
const unsigned char brightness_set[] = { 100 /*% active*/, standby_brightness /*% standby*/ };
WriteVariable(0x82 /*LED_Config*/, brightness_set, sizeof(brightness_set));
}
rx_datagram_state_t DGUSDisplay::rx_datagram_state = DGUS_IDLE;
@@ -68,6 +68,9 @@ public:
static void WriteVariable(uint16_t adr, int8_t value);
static void WriteVariable(uint16_t adr, long value);
static void SetVariableDisplayColor(uint16_t sp, uint16_t color);
static void SetVariableAppendText(uint16_t sp, PGM_P appendText);
static void ReadVariable(uint16_t adr);
// Utility functions for bridging ui_api and dgus
@@ -82,16 +85,12 @@ public:
Setter(newvalue, selector);
}
// Until now I did not need to actively read from the display. That's why there is no ReadVariable
// (I extensively use the auto upload of the display)
// Force display into another screen.
// (And trigger update of containing VPs)
// (to implement a pop up message, which may not be nested)
static void RequestScreen(DGUSLCD_Screens screen);
// Request the current displayed screen - will be passed to current_screen_update_callback
static void ReadCurrentScreen();
static void SetTouchScreenConfiguration(bool enable_standby, bool enable_sound, uint8_t standby_brightness);
// Periodic tasks, eg. Rx-Queue handling.
static void loop();
@@ -104,8 +103,6 @@ public:
// (both boils down that the display answered to our chatting)
static inline bool isInitialized() { return Initialized; }
static UPDATE_CURRENT_SCREEN_CALLBACK current_screen_update_callback;
private:
static void WriteHeader(uint16_t adr, uint8_t cmd, uint8_t payloadlen);
static void WritePGM(const char str[], uint8_t len);
@@ -61,20 +61,17 @@ uint16_t DGUSScreenHandler::ConfirmVP;
static ExtUI::FileList filelist;
#endif
// Storage initialization
creality_dwin_settings_t DGUSScreenHandler::Settings = {.settings_size = sizeof(creality_dwin_settings_t)};
DGUSLCD_Screens DGUSScreenHandler::current_screen;
DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS] = {DGUSLCD_SCREEN_MAIN};
uint8_t DGUSScreenHandler::update_ptr;
uint16_t DGUSScreenHandler::skipVP;
bool DGUSScreenHandler::ScreenComplete;
bool DGUSScreenHandler::SaveSettingsRequested;
uint8_t DGUSScreenHandler::MeshLevelIndex = -1;
bool DGUSScreenHandler::are_steppers_enabled = true;
float DGUSScreenHandler::feed_amount = true;
//DGUSDisplay dgusdisplay;
UPDATE_CURRENT_SCREEN_CALLBACK DGUSDisplay::current_screen_update_callback = &DGUSScreenHandler::updateCurrentScreen;
// endianness swap
uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); }
float DGUSScreenHandler::feed_amount = 100;
bool DGUSScreenHandler::fwretract_available = TERN(FWRETRACT, true, false);
void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) {
DGUS_VP_Variable ramcopy;
@@ -96,6 +93,87 @@ void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, con
}
}
void DGUSScreenHandler::Init() {
dgusdisplay.InitDisplay();
}
void DGUSScreenHandler::RequestSaveSettings() {
SaveSettingsRequested = true;
}
void DGUSScreenHandler::DefaultSettings() {
Settings.settings_size = sizeof(creality_dwin_settings_t);
Settings.led_state = false;
Settings.display_standby = true;
Settings.display_sound = true;
Settings.standby_screen_brightness = 10;
}
void DGUSScreenHandler::LoadSettings(const char* buff) {
static_assert(
ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t),
"Insufficient space in EEPROM for UI parameters"
);
creality_dwin_settings_t eepromSettings;
memcpy(&eepromSettings, buff, sizeof(creality_dwin_settings_t));
// If size is not the same, discard settings
if (eepromSettings.settings_size != sizeof(creality_dwin_settings_t)) {
SERIAL_ECHOLNPGM("Discarding DWIN LCD setting from EEPROM - size incorrect");
ScreenHandler.DefaultSettings();
return;
} else {
// Copy into final location
SERIAL_ECHOLNPGM("Loading DWIN LCD setting from EEPROM");
memcpy(&Settings, &eepromSettings, sizeof(creality_dwin_settings_t));
}
// Apply settings
caselight.on = Settings.led_state;
caselight.update(Settings.led_state);
ScreenHandler.SetTouchScreenConfiguration();
}
void DGUSScreenHandler::StoreSettings(char* buff) {
static_assert(
ExtUI::eeprom_data_size >= sizeof(creality_dwin_settings_t),
"Insufficient space in EEPROM for UI parameters"
);
// Update settings from Marlin state, if necessary
Settings.led_state = caselight.on;
// Write to buffer
SERIAL_ECHOLNPGM("Saving DWIN LCD setting from EEPROM");
memcpy(buff, &Settings, sizeof(creality_dwin_settings_t));
}
void DGUSScreenHandler::SetTouchScreenConfiguration() {
dgusdisplay.SetTouchScreenConfiguration(Settings.display_standby, Settings.display_sound, Settings.standby_screen_brightness);
}
void DGUSScreenHandler::KillScreenCalled() {
// If killed, always fully wake up
dgusdisplay.SetTouchScreenConfiguration(false, true, 100);
// Hey! Something is going on!
Buzzer(1000 /*ignored*/, 880);
}
void DGUSScreenHandler::OnPowerlossResume() {
GotoScreen(DGUSLCD_SCREEN_POWER_LOSS);
// Send print filename
dgusdisplay.WriteVariable(VP_SD_Print_Filename, PrintJobRecovery::info.sd_filename, VP_SD_FileName_LEN, true);
}
void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) {
if (current_screen == DGUSLCD_SCREEN_CONFIRM) {
// Already showing a pop up, so we need to cancel that first.
@@ -163,17 +241,21 @@ void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) {
dgusdisplay.WriteVariable(VP_PrintTime, buf, var.size, true);
}
void DGUSScreenHandler::DGUSLCD_SendAboutFirmwareWebsite(DGUS_VP_Variable &var) {
const char* websiteUrl = PSTR(WEBSITE_URL);
dgusdisplay.WriteVariablePGM(var.VP, websiteUrl, strlen(websiteUrl), true);
}
void DGUSScreenHandler::DGUSLCD_SendAboutFirmwareVersion(DGUS_VP_Variable &var) {
const char* fwVersion = PSTR(SOFTVERSION);
const char* fwWebsite = PSTR(WEBSITE_URL);
const char* fwVersion = PSTR(SHORT_BUILD_VERSION);
dgusdisplay.WriteVariablePGM(var.VP, fwVersion, strlen(fwVersion), true);
dgusdisplay.WriteVariablePGM(VP_MARLIN_WEBSITE, fwWebsite, strlen(fwWebsite), true);
}
void DGUSScreenHandler::DGUSLCD_SendAboutPrintSize(DGUS_VP_Variable &var) {
char PRINTSIZE[VP_PRINTER_BEDSIZE_LEN] = {0};
sprintf(PRINTSIZE,"%dx%dx%d",MAC_LENGTH, MAC_WIDTH, MAC_HEIGHT);
sprintf(PRINTSIZE,"%dx%dx%d", X_BED_SIZE, Y_BED_SIZE, Z_MAX_POS);
dgusdisplay.WriteVariablePGM(var.VP, &PRINTSIZE, sizeof(PRINTSIZE), true);
}
@@ -243,6 +325,13 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) {
dgusdisplay.WriteVariable(var.VP, data_to_send);
}
}
void DGUSScreenHandler::DGUSLCD_SendFanSpeedToDisplay(DGUS_VP_Variable &var) {
if (var.memadr) {
int16_t data_to_send = static_cast<int16_t>(round(ExtUI::getTargetFan_percent(ExtUI::fan_t::FAN0)));
dgusdisplay.WriteVariable(var.VP, data_to_send);
}
}
#endif
// Send heater status value to the display.
@@ -351,7 +440,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var)
// Setup Confirmation screen
file_to_print = touched_nr;
HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), PSTR("?"), true, false, true, true);
HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), nullptr, true, false, true, true);
}
void DGUSScreenHandler::SetPrintingFromHost() {
@@ -423,7 +512,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var)
void DGUSScreenHandler::SDCardError() {
DGUSScreenHandler::SDCardRemoved();
ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), PSTR("Ok"), true, true, true, true);
ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true);
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP);
}
@@ -434,6 +523,7 @@ void DGUSScreenHandler::FilamentRunout() {
}
void DGUSScreenHandler::OnFactoryReset() {
ScreenHandler.DefaultSettings();
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
}
@@ -455,6 +545,9 @@ bool DGUSScreenHandler::HandlePendingUserConfirmation() {
return false;
}
// Switch to the resume screen
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PRINT_RUNNING);
// We might be re-entrant here
ExtUI::setUserConfirmed();
@@ -633,21 +726,22 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
}
void DGUSScreenHandler::HandleFanSpeedChanged(DGUS_VP_Variable &var, void *val_ptr) {
uint16_t newValue = swap16(*(uint16_t*)val_ptr);
SERIAL_ECHOLNPAIR("Fan speed changed: ", newValue);
ExtUI::setTargetFan_percent(newValue, ExtUI::fan_t::FAN0);
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
}
void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) {
#if EXTRUDERS
uint16_t newvalue = swap16(*(uint16_t*)val_ptr);
uint8_t target_extruder;
switch (var.VP) {
default: return;
#if HOTENDS >= 1
case VP_Flowrate_E0: target_extruder = 0; break;
#endif
#if HOTENDS >= 2
case VP_Flowrate_E1: target_extruder = 1; break;
#endif
}
uint16_t newValue = swap16(*(uint16_t*)val_ptr);
SERIAL_ECHOLNPAIR("Flow rate changed: ", newValue);
ExtUI::setFlow_percent(newValue, ExtUI::E0);
planner.set_flow(target_extruder, newvalue);
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
#else
UNUSED(var); UNUSED(val_ptr);
@@ -842,7 +936,7 @@ void DGUSScreenHandler::HandleFeedAmountChanged(DGUS_VP_Variable &var, void *val
void DGUSScreenHandler::HandlePositionChange(DGUS_VP_Variable &var, void *val_ptr) {
DEBUG_ECHOLNPGM("HandlePositionChange");
unsigned int speed = HOMING_FEEDRATE_XY;
unsigned int speed = homing_feedrate_mm_m.x;
float target_position = ((float)swap16(*(uint16_t*)val_ptr)) / 10.0;
switch (var.VP) {
@@ -850,18 +944,18 @@ void DGUSScreenHandler::HandlePositionChange(DGUS_VP_Variable &var, void *val_pt
case VP_X_POSITION:
if (!ExtUI::canMove(ExtUI::axis_t::X)) return;
current_position.x = target_position;
current_position.x = min(target_position, static_cast<float>(X_MAX_POS));
break;
case VP_Y_POSITION:
if (!ExtUI::canMove(ExtUI::axis_t::Y)) return;
current_position.y = target_position;
current_position.y = min(target_position, static_cast<float>(Y_MAX_POS));
break;
case VP_Z_POSITION:
if (!ExtUI::canMove(ExtUI::axis_t::Z)) return;
speed = HOMING_FEEDRATE_Z;
current_position.z = target_position;
speed = homing_feedrate_mm_m.z;
current_position.z = min(target_position, static_cast<float>(Z_MAX_POS));
break;
}
@@ -871,34 +965,34 @@ void DGUSScreenHandler::HandlePositionChange(DGUS_VP_Variable &var, void *val_pt
DEBUG_ECHOLNPGM("poschg done.");
}
#if ENABLED(BABYSTEPPING)
void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) {
DEBUG_ECHOLNPGM("HandleLiveAdjustZ");
void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) {
DEBUG_ECHOLNPGM("HandleLiveAdjustZ");
float absoluteAmount = float(swap16(*(uint16_t*)val_ptr)) / 100.0f;
float existingAmount = ExtUI::getZOffset_mm();
float difference = (absoluteAmount - existingAmount) < 0 ? -0.01 : 0.01;
float absoluteAmount = float(swap16(*(uint16_t*)val_ptr)) / 100.0f;
float existingAmount = ExtUI::getZOffset_mm();
float difference = (absoluteAmount - existingAmount) < 0 ? -0.01 : 0.01;
SERIAL_ECHO("- Absolute: ");
SERIAL_ECHO_F(absoluteAmount);
SERIAL_ECHO("- Existing: ");
SERIAL_ECHO_F(existingAmount);
SERIAL_ECHO(" - Difference: ");
SERIAL_ECHO_F(difference);
SERIAL_ECHO("- Absolute: ");
SERIAL_ECHO_F(absoluteAmount);
SERIAL_ECHO("- Existing: ");
SERIAL_ECHO_F(existingAmount);
SERIAL_ECHO(" - Difference: ");
SERIAL_ECHO_F(difference);
int16_t steps = ExtUI::mmToWholeSteps(difference, ExtUI::axis_t::Z);
int16_t steps = ExtUI::mmToWholeSteps(difference, ExtUI::axis_t::Z);
SERIAL_ECHO(" - Steps: ");
SERIAL_ECHO_F(steps);
SERIAL_ECHOLN(";");
SERIAL_ECHO(" - Steps: ");
SERIAL_ECHO_F(steps);
SERIAL_ECHOLN(";");
ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true);
ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true);
ScreenHandler.ForceCompleteUpdate();
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
return;
}
#endif
RequestSaveSettings();
ScreenHandler.ForceCompleteUpdate();
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
return;
}
void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr) {
DEBUG_ECHOLNPGM("HandleHeaterControl");
@@ -1040,19 +1134,42 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr
}
#endif
void DGUSScreenHandler::HandleStepperState(bool is_enabled) {
bool steppers_were_enabled = are_steppers_enabled;
are_steppers_enabled = is_enabled;
if (steppers_were_enabled != are_steppers_enabled) ForceCompleteUpdate();
}
void DGUSScreenHandler::HandleLEDToggle() {
bool newState = !caselight.on;
caselight.on = newState;
caselight.update(newState);
RequestSaveSettings();
ForceCompleteUpdate();
}
void DGUSScreenHandler::HandleToggleTouchScreenMute(DGUS_VP_Variable &var, void *val_ptr) {
Settings.display_sound = !Settings.display_sound;
ScreenHandler.SetTouchScreenConfiguration();
RequestSaveSettings();
ForceCompleteUpdate();
ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel
}
void DGUSScreenHandler::HandleTouchScreenStandbyBrightnessSetting(DGUS_VP_Variable &var, void *val_ptr) {
uint16_t newvalue = swap16(*(uint16_t*)val_ptr);
SERIAL_ECHOLNPAIR("HandleTouchScreenStandbyBrightnessSetting: ", newvalue);
Settings.standby_screen_brightness = newvalue;
ScreenHandler.SetTouchScreenConfiguration();
RequestSaveSettings();
ForceCompleteUpdate();
}
void DGUSScreenHandler::HandleToggleTouchScreenStandbySetting(DGUS_VP_Variable &var, void *val_ptr) {
Settings.display_standby = !Settings.display_standby;
ScreenHandler.SetTouchScreenConfiguration();
RequestSaveSettings();
ForceCompleteUpdate();
}
@@ -1066,7 +1183,7 @@ void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool save_cur
DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen);
if (save_current_screen && current_screen != DGUSLCD_SCREEN_POPUP && current_screen != DGUSLCD_SCREEN_CONFIRM) {
DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen);
DEBUG_ECHOLNPAIR("SetNewScreen (saving): ", newscreen);
memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1);
past_screens[0] = current_screen;
}
@@ -1078,25 +1195,22 @@ void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool save_cur
void DGUSScreenHandler::PopToOldScreen() {
DEBUG_ECHOLNPAIR("PopToOldScreen s=", past_screens[0]);
if(past_screens[0] != 0) {
GotoScreen(past_screens[0], false);
memmove(&past_screens[0], &past_screens[1], sizeof(past_screens) - 1);
past_screens[sizeof(past_screens) - 1] = DGUSLCD_SCREEN_MAIN;
} else {
if(ExtUI::isPrinting())
if(ExtUI::isPrinting()) {
GotoScreen(DGUSLCD_SCREEN_PRINT_RUNNING, false);
else
} else {
GotoScreen(DGUSLCD_SCREEN_MAIN, false);
}
}
}
void DGUSScreenHandler::updateCurrentScreen(DGUSLCD_Screens current) {
if (current_screen != current) {
DEBUG_ECHOPAIR("Screen updated at display side: Was ", current_screen);
DEBUG_ECHOLNPAIR(", is now: ", current);
UpdateNewScreen(current, current != DGUSLCD_SCREEN_POPUP && current != DGUSLCD_SCREEN_CONFIRM);
}
void DGUSScreenHandler::OnBackButton(DGUS_VP_Variable &var, void *val_ptr) {
PopToOldScreen();
}
void DGUSScreenHandler::UpdateScreenVPData() {
@@ -1153,6 +1267,11 @@ void DGUSScreenHandler::UpdateScreenVPData() {
}
void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool save_current_screen) {
if (current_screen == screen) {
// Ignore this request
return;
}
DEBUG_ECHOLNPAIR("Issuing command to go to screen: ", screen);
dgusdisplay.RequestScreen(screen);
UpdateNewScreen(screen, save_current_screen);
@@ -1171,25 +1290,30 @@ bool DGUSScreenHandler::loop() {
GotoScreen(DGUSLCD_SCREEN_PRINT_PAUSED, true);
}
if (ELAPSED(ms, next_event_ms) && SaveSettingsRequested) {
// Only save settings so many times in a second - otherwise the EEPROM chip gets overloaded and the watchdog reboots the CPU
settings.save();
SaveSettingsRequested = false;
}
if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) {
next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS;
UpdateScreenVPData();
// Read which screen is currently triggered - navigation at display side may occur
if (dgusdisplay.isInitialized()) dgusdisplay.ReadCurrentScreen();
UpdateScreenVPData();
}
if (dgusdisplay.isInitialized()) {
static bool booted = false;
if (!booted) {
progmem_str message = GET_TEXT_F(WELCOME_MSG);
char buff[strlen_P((const char * const)message)+1];
strcpy_P(buff, (const char * const) message);
ExtUI::onStatusChanged((const char *)buff);
int16_t percentage = static_cast<int16_t>(((float) ms / (float)BOOTSCREEN_TIMEOUT) * 100);
if (percentage > 100) percentage = 100;
dgusdisplay.WriteVariable(VP_STARTPROGRESSBAR, percentage);
}
@@ -1200,6 +1324,10 @@ bool DGUSScreenHandler::loop() {
if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) {
booted = true;
// Ensure to pick up the settings
SetTouchScreenConfiguration();
#if HAS_MESH
if (ExtUI::getMeshValid())
{
@@ -28,12 +28,34 @@
enum DGUSLCD_Screens : uint8_t;
struct creality_dwin_settings_t {
size_t settings_size;
bool led_state;
bool display_standby;
bool display_sound;
int16_t standby_screen_brightness;
};
// endianness swap
inline uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); }
class DGUSScreenHandler {
public:
DGUSScreenHandler() = default;
static bool loop();
static void Init();
static void DefaultSettings();
static void LoadSettings(const char* buff);
static void StoreSettings(char* buff);
static void SetTouchScreenConfiguration();
static void KillScreenCalled();
static void OnPowerlossResume();
static void RequestSaveSettings();
/// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen
/// The bools specifing whether the strings are in RAM or FLASH.
static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash);
@@ -52,6 +74,7 @@ public:
static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr);
// Hook for "Change this temperature"
static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr);
static void HandleFanSpeedChanged(DGUS_VP_Variable &var, void *val_ptr);
// Hook for "Change Flowrate"
static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr);
// Hook for manual extrude.
@@ -66,12 +89,15 @@ public:
static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr);
static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr);
static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr);
static void HandleFeedAmountChanged(DGUS_VP_Variable &var, void *val_ptr);
// Hook for move to position
static void HandlePositionChange(DGUS_VP_Variable &var, void *val_ptr);
static void HandleToggleTouchScreenMute(DGUS_VP_Variable &var, void *val_ptr);
static void HandleToggleTouchScreenStandbySetting(DGUS_VP_Variable &var, void *val_ptr);
static void HandleTouchScreenStandbyBrightnessSetting(DGUS_VP_Variable &var, void *val_ptr);
#if HAS_PID_HEATING
// Hook for "Change this temperature PID para"
static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr);
@@ -86,10 +112,10 @@ public:
static void OnMeshLevelingUpdate(const int8_t xpos, const int8_t ypos);
#endif
#if ENABLED(BABYSTEPPING)
// Hook for live z adjust action
static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr);
#endif
// Hook for live z adjust action
static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr);
// Hook for heater control
static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr);
#if ENABLED(DGUS_PREHEAT_UI)
@@ -134,8 +160,6 @@ public:
static void HandleFanToggle();
static void HandleStepperState(bool is_enabled);
static void FilamentRunout();
static void OnFactoryReset();
@@ -158,6 +182,7 @@ public:
// Recall the remembered screen.
static void PopToOldScreen();
static void OnBackButton(DGUS_VP_Variable &var, void *val_ptr);
// Make the display show the screen and update all VPs in it.
static void GotoScreen(DGUSLCD_Screens screen, bool save_current_screen = true);
@@ -178,12 +203,14 @@ public:
#endif
#if HAS_FAN
static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var);
static void DGUSLCD_SendFanSpeedToDisplay(DGUS_VP_Variable &var);
#endif
static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var);
#if ENABLED(DGUS_UI_WAITING)
static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var);
#endif
static void DGUSLCD_SendAboutFirmwareWebsite(DGUS_VP_Variable &var);
static void DGUSLCD_SendAboutFirmwareVersion(DGUS_VP_Variable &var);
static void DGUSLCD_SendAboutPrintSize(DGUS_VP_Variable &var);
@@ -199,6 +226,17 @@ public:
*(T*)var.memadr = x.t;
}
template<DGUSLCD_Screens TPage>
static void DGUSLCD_NavigateToPage(DGUS_VP_Variable &var, void *val_ptr) {
GotoScreen(TPage);
}
template<DGUSLCD_Screens TPage, typename Handler>
static void DGUSLCD_NavigateToPage(DGUS_VP_Variable &var, void *val_ptr) {
GotoScreen(TPage);
Handler::Init();
}
/// Send a float value to the display.
/// Display will get a 4-byte integer scaled to the number of digits:
/// Tell the display the number of digits and it cheats by displaying a dot between...
@@ -207,7 +245,10 @@ public:
if (var.memadr) {
float f = *(float *)var.memadr;
f *= cpow(10, decimals);
dgusdisplay.WriteVariable(var.VP, (long)f);
// Round - truncated values look like skipped numbers
long roundedValue = static_cast<long>(round(f));
dgusdisplay.WriteVariable(var.VP, roundedValue);
}
}
@@ -217,6 +258,24 @@ public:
dgusdisplay.WriteVariable(vp, (long)var);
}
// Receive a float from the display - Display will send a 2-byte integer scaled to the number of digits
template<unsigned int decimals>
static void DGUSLCD_SetFloatAsIntFromDisplay(DGUS_VP_Variable &var, void *val_ptr) {
if (var.memadr) {
uint16_t value_raw = swap16(*(uint16_t*)val_ptr);
float value = (float)value_raw/10;
*(float *)var.memadr = value;
}
}
// Toggle a boolean at the specified memory address
static void DGUSLCD_ToggleBoolean(DGUS_VP_Variable &var, void *val_ptr) {
if (var.memadr) {
bool* val = (bool *)var.memadr;
*val = !*val;
}
}
// Send an icon to the display, depending on whether it is true or false
template<unsigned int value_if_true, unsigned int value_if_false>
static void DGUSLCD_SendIconValue(DGUS_VP_Variable &var) {
@@ -236,7 +295,10 @@ public:
float f = *(float *)var.memadr;
DEBUG_ECHOLNPAIR_F(" >> ", f, 6);
f *= cpow(10, decimals);
dgusdisplay.WriteVariable(var.VP, (int16_t)f);
// Round - truncated values look like skipped numbers
int16_t roundedValue = static_cast<int16_t>(round(f));
dgusdisplay.WriteVariable(var.VP, roundedValue);
}
}
@@ -247,6 +309,18 @@ public:
dgusdisplay.WriteVariable(vp, (int16_t)var);
}
template<AxisEnum Axis>
static void SendAxisTrustValue(DGUS_VP_Variable &var) {
bool trust = axis_is_trusted(Axis);
uint16_t color = trust ? 0xFFFF /*White*/ : 0XF800 /*Red*/;
dgusdisplay.SetVariableDisplayColor(var.VP, color);
//PGM_P suffix = trust ? nullptr : "???";
//dgusdisplay.SetVariableAppendText(var.VP, suffix);
}
/// Force an update of all VP on the current screen.
static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; }
/// Has all VPs sent to the screen
@@ -259,7 +333,7 @@ public:
static bool HandlePendingUserConfirmation();
static float feed_amount;
static bool are_steppers_enabled;
static bool fwretract_available;
private:
static DGUSLCD_Screens current_screen; ///< currently on screen
@@ -273,11 +347,15 @@ private:
static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK").
static uint8_t MeshLevelIndex;
static bool SaveSettingsRequested;
#if ENABLED(SDSUPPORT)
static int16_t top_file; ///< file on top of file chooser
static int16_t file_to_print; ///< touched file to be confirmed
#endif
public: // Needed for VP auto-upload
static creality_dwin_settings_t Settings;
};
extern DGUSScreenHandler ScreenHandler;
@@ -29,6 +29,8 @@
#include "../DGUSDisplayDef.h"
#include "../DGUSDisplay.h"
#include "../DGUSScreenHandler.h"
#include "../creality_touch/EstepsHandler.h"
#include "../creality_touch/PIDHandler.h"
#include "../../../../../module/temperature.h"
#include "../../../../../module/motion.h"
@@ -36,8 +38,12 @@
#include "../../../../../feature/caselight.h"
#include "../../../../marlinui.h"
#if ENABLED(FWRETRACT)
#include "../../../../../feature/fwretract.h"
#endif
#include "../../../ui_api.h"
#include "../../../../marlinui.h"
#include "PageHandlers.h"
@@ -113,6 +119,9 @@ const uint16_t VPList_Control[] PROGMEM = {
#endif
VP_LED_TOGGLE,
VP_MUTE_ICON,
VP_STANDBY_BACKLIGHT_ICON,
VP_SCREEN_BACKLIGHT_STANDBY,
0x0000
};
@@ -128,6 +137,7 @@ const uint16_t VPList_Feed[] PROGMEM = {
//VP_Fan0_Percentage,
VP_Feedrate_Percentage,
VP_FEED_AMOUNT,
0x0000
};
@@ -194,8 +204,12 @@ const uint16_t VPList_PrintPausingError[] PROGMEM = {
#if HAS_HEATED_BED
VP_T_Bed_Is, VP_T_Bed_Set,// VP_BED_STATUS,
#endif
VP_X_POSITION,
VP_Y_POSITION,
VP_Z_POSITION,
VP_Z_OFFSET,
//VP_Fan0_Percentage,
VP_Fan0_Percentage,
VP_Feedrate_Percentage,
VP_PrintProgress_Percentage,
@@ -216,14 +230,19 @@ const uint16_t VPList_PrintScreen[] PROGMEM = {
#endif
VP_X_POSITION, VP_Y_POSITION, VP_Z_POSITION,
SP_X_POSITION, SP_Y_POSITION, SP_Z_POSITION,
VP_Z_OFFSET,
//VP_Fan0_Percentage,
VP_Flowrate_E0,
VP_Fan0_Percentage,
VP_Feedrate_Percentage,
VP_PrintProgress_Percentage,
VP_PrintTimeProgressBar,
VP_PrintTime,
VP_FWRETRACT_INDICATOR_ICON,
0x0000
};
@@ -260,6 +279,8 @@ const uint16_t VPList_ZOffsetLevel[] PROGMEM = {
const uint16_t VPList_TuneScreen[] PROGMEM = {
VP_PrintTime,
VP_Flowrate_E0,
#if HOTENDS >= 1
VP_T_E0_Is, VP_T_E0_Set,// VP_E0_STATUS,
#endif
@@ -272,7 +293,8 @@ const uint16_t VPList_TuneScreen[] PROGMEM = {
VP_LED_TOGGLE,
VP_FAN_TOGGLE,
VP_Fan0_Percentage,
VP_FWRETRACT_NAV_BUTTON_ICON,
0x0000
};
@@ -290,8 +312,6 @@ const uint16_t VPList_Prepare[] PROGMEM = {
//VP_Fan0_Percentage,
VP_Feedrate_Percentage,
VP_STEPPERS,
0x0000
};
@@ -309,11 +329,65 @@ const uint16_t VPList_Info[] PROGMEM = {
VP_Feedrate_Percentage,
VP_PRINTER_BEDSIZE,
VP_MARLIN_WEBSITE,
VP_MARLIN_VERSION,
0x0000
};
const uint16_t VPList_EstepsCalibration[] PROGMEM = {
VP_ESTEPS_CURRENT,
VP_ESTEPS_CALIBRATION_TEMP,
VP_ESTEPS_CALIBRATION_LENGTH,
VP_ESTEPS_CALIBRATION_LEFTOVER_LENGTH,
VP_ESTEPS_CALIBRATION_MARK_LENGTH,
VP_ESTEPS_CALCULATED_ESTEPS,
#if HOTENDS >= 1
VP_T_E0_Is, VP_T_E0_Set,// VP_E0_STATUS,
#endif
#if HAS_HEATED_BED
VP_T_Bed_Is, VP_T_Bed_Set,// VP_BED_STATUS,
#endif
0x0000
};
const uint16_t VPList_PidTune[] PROGMEM = {
VP_PIDTUNE_TARGET_TEMP,
VP_PIDTUNE_CYCLES,
#if HOTENDS >= 1
VP_T_E0_Is, VP_T_E0_Set,// VP_E0_STATUS,
#endif
#if HAS_HEATED_BED
VP_T_Bed_Is, VP_T_Bed_Set,// VP_BED_STATUS,
#endif
0x0000
};
const uint16_t VPList_FWRetractTune[] PROGMEM = {
#if HOTENDS >= 1
VP_T_E0_Is, VP_T_E0_Set,// VP_E0_STATUS,
#endif
#if HAS_HEATED_BED
VP_T_Bed_Is, VP_T_Bed_Set,// VP_BED_STATUS,
#endif
VP_Z_OFFSET,
VP_Feedrate_Percentage,
VP_FWRETRACT_RETRACT_LENGTH,
VP_FWRETRACT_RETRACT_FEEDRATE,
VP_FWRETRACT_RETRACT_ZHOP,
VP_FWRETRACT_RESTART_LENGTH,
VP_FWRETRACT_RESTART_FEEDRATE,
VP_FWRETRACT_TOGGLE_BUTTON_ICON,
0x0000
};
// Toggle button handler
void DGUSCrealityDisplay_HandleToggleButton(DGUS_VP_Variable &var, void *val_ptr) {
switch (*(uint16_t*)var.memadr) {
@@ -337,6 +411,7 @@ const struct VPMapping VPMap[] PROGMEM = {
{ DGUSLCD_SCREEN_MAIN, VPList_Main },
{ DGUSLCD_SCREEN_SDFILELIST, VPList_SDFileList },
{ DGUSLCD_SCREEN_FILAMENTRUNOUT1, VPList_PrintPausingError },
{ DGUSLCD_SCREEN_FILAMENTRUNOUT2, VPList_PrintPausingError },
@@ -360,7 +435,7 @@ const struct VPMapping VPMap[] PROGMEM = {
{ DGUSLCD_SCREEN_TEMP_PLA, VPList_PreheatPLASettings },
{ DGUSLCD_SCREEN_TEMP_ABS, VPList_PreheatABSSettings },
{ DGUSLCD_SCREEN_INFO, VPList_Info },
{ DGUSLCD_SCREEN_INFO, VPList_PrintScreen },
{ DGUSLCD_SCREEN_ZOFFSET_LEVEL, VPList_ZOffsetLevel },
{ DGUSLCD_SCREEN_LEVELING, VPList_Leveling },
@@ -377,6 +452,10 @@ const struct VPMapping VPMap[] PROGMEM = {
{ DGUSLCD_SCREEN_CONFIRM, VPList_None },
{ DGUSLCD_SCREEN_POPUP, VPList_None },
{ DGUSLCD_SCREEN_ESTEPS_CALIBRATION, VPList_EstepsCalibration },
{ DGUSLCD_SCREEN_PIDTUNE_CALIBRATION, VPList_PidTune },
{ DGUSLCD_SCREEN_TUNEFWRETRACT, VPList_FWRetractTune },
{ 0 , nullptr } // List is terminated with an nullptr as table entry.
};
@@ -390,9 +469,8 @@ const struct VPMapping VPMap[] PROGMEM = {
.set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR }
const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
// TODO:
#if HOTENDS >= 1
VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay),
VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay),
#endif
@@ -411,6 +489,29 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay),
VPHELPER(VP_PrintTimeProgressBar, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay),
// Calibration
// ... e-steps
VPHELPER(VP_ESTEPS_CURRENT, &EstepsHandler::set_esteps, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_ESTEPS_CALIBRATION_TEMP, &EstepsHandler::calibration_temperature, ScreenHandler.DGUSLCD_SetValueDirectly<uint16_t>, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
VPHELPER(VP_ESTEPS_CALIBRATION_LENGTH, &EstepsHandler::filament_to_extrude, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_ESTEPS_CALIBRATION_MARK_LENGTH, &EstepsHandler::mark_filament_mm, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_ESTEPS_CALIBRATION_LEFTOVER_LENGTH, &EstepsHandler::remaining_filament, EstepsHandler::HandleRemainingFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_ESTEPS_CALCULATED_ESTEPS, &EstepsHandler::calculated_esteps, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_ESTEPS_CALIBRATESTART_BUTTON, nullptr, EstepsHandler::HandleStartButton, nullptr),
VPHELPER(VP_ESTEPS_APPLY_BUTTON, nullptr, EstepsHandler::HandleApplyButton, nullptr),
VPHELPER(VP_ESTEP_NAV_BUTTON, nullptr, (ScreenHandler.DGUSLCD_NavigateToPage<DGUSLCD_SCREEN_ESTEPS_CALIBRATION, EstepsHandler>), nullptr),
// ... PID
VPHELPER(VP_PIDTUNE_TARGET_TEMP, &PIDHandler::calibration_temperature, ScreenHandler.DGUSLCD_SetValueDirectly<uint16_t>, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
VPHELPER(VP_PIDTUNE_CYCLES, &PIDHandler::cycles, ScreenHandler.DGUSLCD_SetValueDirectly<uint16_t>, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
VPHELPER(VP_PIDTUNE_START_BUTTON, nullptr, PIDHandler::HandleStartButton, nullptr),
VPHELPER(VP_PIDTUNE_NAV_BUTTON, nullptr, (ScreenHandler.DGUSLCD_NavigateToPage<DGUSLCD_SCREEN_PIDTUNE_CALIBRATION, PIDHandler>), nullptr),
VPHELPER(VP_GENERIC_BACK_BUTTON, nullptr, ScreenHandler.OnBackButton, nullptr),
// Preheat settings
#ifdef PREHEAT_1_LABEL
VPHELPER(VP_PREHEAT_PLA_HOTEND_TEMP, &ui.material_preset[0].hotend_temp, ScreenHandler.DGUSLCD_SetValueDirectly<int16_t>, &ScreenHandler.DGUSLCD_SendWordValueToDisplay),
@@ -423,6 +524,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
#endif
// About info
VPHELPER(VP_MARLIN_WEBSITE, nullptr, nullptr, ScreenHandler.DGUSLCD_SendAboutFirmwareWebsite),
VPHELPER(VP_MARLIN_VERSION, nullptr, nullptr, ScreenHandler.DGUSLCD_SendAboutFirmwareVersion),
VPHELPER(VP_PRINTER_BEDSIZE, nullptr, nullptr, ScreenHandler.DGUSLCD_SendAboutPrintSize),
@@ -431,9 +533,14 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
VPHELPER(VP_Y_POSITION, &current_position.y, ScreenHandler.HandlePositionChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_Z_POSITION, &current_position.z, ScreenHandler.HandlePositionChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(SP_X_POSITION, nullptr, nullptr, ScreenHandler.SendAxisTrustValue<X_AXIS>),
VPHELPER(SP_Y_POSITION, nullptr, nullptr, ScreenHandler.SendAxisTrustValue<Y_AXIS>),
VPHELPER(SP_Z_POSITION, nullptr, nullptr, ScreenHandler.SendAxisTrustValue<Z_AXIS>),
VPHELPER(VP_Z_OFFSET, &probe.offset.z, ScreenHandler.HandleZoffsetChange, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>),
VPHELPER(VP_FAN_TOGGLE, &thermalManager.fan_speed[0], nullptr, ScreenHandler.DGUSLCD_SendFanStatusToDisplay),
VPHELPER(VP_Fan0_Percentage, &thermalManager.fan_speed[0], ScreenHandler.HandleFanSpeedChanged, ScreenHandler.DGUSLCD_SendFanSpeedToDisplay),
#if ENABLED(POWER_LOSS_RECOVERY)
VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr),
@@ -444,7 +551,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr),
// Feed
VPHELPER(VP_FEED_AMOUNT, &ScreenHandler.feed_amount, ScreenHandler.HandleFeedAmountChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>),
VPHELPER(VP_FEED_AMOUNT, &ScreenHandler.feed_amount, ScreenHandler.HandleFeedAmountChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
// Creality has the same button ID mapped all over the place, so let the generic handler figure it out
VPHELPER(VP_BUTTON_MAINENTERKEY, nullptr, DGUSCrealityDisplay_HandleReturnKeyEvent, nullptr),
@@ -472,9 +579,42 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename),
VPHELPER_STR(VP_SD_FileName5, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename),
// Firmware retract
#if ENABLED(FWRETRACT)
VPHELPER(VP_FWRETRACT_NAV_BUTTON, nullptr, ScreenHandler.DGUSLCD_NavigateToPage<DGUSLCD_SCREEN_TUNEFWRETRACT>, nullptr),
VPHELPER(VP_FWRETRACT_RETRACT_LENGTH, &fwretract.settings.retract_length, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_FWRETRACT_RETRACT_FEEDRATE, &fwretract.settings.retract_feedrate_mm_s, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_FWRETRACT_RETRACT_ZHOP, &fwretract.settings.retract_zraise, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_FWRETRACT_RESTART_LENGTH, &fwretract.settings.retract_recover_extra, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
VPHELPER(VP_FWRETRACT_RESTART_FEEDRATE, &fwretract.settings.retract_recover_feedrate_mm_s, ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
#if ENABLED(FWRETRACT_AUTORETRACT)
VPHELPER(VP_FWRETRACT_INDICATOR_ICON, &fwretract.autoretract_enabled, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_FWRETRACT_AUTO_ENGAGED, ICON_FWRETRACT_AUTO_DISENGAGED>)),
VPHELPER(VP_FWRETRACT_TOGGLE_BUTTON_ICON, &fwretract.autoretract_enabled, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_FWRETRACT_AUTO_TOGGLE_ON, ICON_FWRETRACT_AUTO_TOGGLE_OFF>)),
VPHELPER(VP_FWRETRACT_TOGGLE_BUTTON, &fwretract.autoretract_enabled, ScreenHandler.DGUSLCD_ToggleBoolean, nullptr),
#else
VPHELPER(VP_FWRETRACT_INDICATOR_ICON, nullptr, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_FWRETRACT_AUTO_ENGAGED, ICON_FWRETRACT_AUTO_DISENGAGED>)),
VPHELPER(VP_FWRETRACT_TOGGLE_BUTTON_ICON, nullptr, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_FWRETRACT_AUTO_TOGGLE_ON, ICON_FWRETRACT_AUTO_TOGGLE_OFF>)),
VPHELPER(VP_FWRETRACT_TOGGLE_BUTTON, nullptr, ScreenHandler.DGUSLCD_ToggleBoolean, nullptr),
#endif
#endif
// ... Sending after init does not always work
VPHELPER(VP_FWRETRACT_NAV_BUTTON_ICON, &ScreenHandler.fwretract_available, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_FWRETRACT_NAV_AVAILABLE, ICON_FWRETRACT_NAV_UNAVAILABLE>)),
// Additional buttons
VPHELPER(VP_MUTE_TOGGLE, nullptr, ScreenHandler.HandleToggleTouchScreenMute, nullptr),
VPHELPER(VP_STANDBY_BACKLIGHT_TOGGLE, nullptr, ScreenHandler.HandleToggleTouchScreenStandbySetting, nullptr),
// Additional settings
VPHELPER(VP_SCREEN_BACKLIGHT_STANDBY, &ScreenHandler.Settings.standby_screen_brightness, ScreenHandler.HandleTouchScreenStandbyBrightnessSetting, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
// Icons
VPHELPER(VP_STEPPERS, &ScreenHandler.are_steppers_enabled, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_TOGGLE_OFF, ICON_TOGGLE_ON>)),
VPHELPER(VP_LED_TOGGLE, &caselight.on, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_TOGGLE_ON, ICON_TOGGLE_OFF>)),
VPHELPER(VP_LED_TOGGLE, &caselight.on, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_LED_TOGGLE_ON, ICON_LED_TOGGLE_OFF>)),
VPHELPER(VP_STANDBY_BACKLIGHT_ICON, &ScreenHandler.Settings.display_standby, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_STANDBY_TOGGLE_ON, ICON_STANDBY_TOGGLE_OFF>)),
VPHELPER(VP_MUTE_ICON, &ScreenHandler.Settings.display_sound, nullptr, (ScreenHandler.DGUSLCD_SendIconValue<ICON_SOUND_TOGGLE_ON, ICON_SOUND_TOGGLE_OFF>)),
// M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr
{ .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay },
@@ -69,6 +69,11 @@ enum DGUSLCD_Screens : uint8_t {
DGUSLCD_SCREEN_POPUP = 63, // NEW - does not exist in original display
DGUSLCD_SCREEN_KILL = 64, // NEW - does not exist in original display
DGUSLCD_SCREEN_PIDTUNE_CALIBRATION = 68,
DGUSLCD_SCREEN_ESTEPS_CALIBRATION = 69,
DGUSLCD_SCREEN_TUNEFWRETRACT = 70
};
// Display Memory layout used (T5UID)
@@ -186,7 +191,16 @@ constexpr uint16_t VP_MARLIN_VERSION = 0x2222;
constexpr uint8_t VP_MARLIN_VERSION_LEN = 20; // there is more space on the display, if needed.
constexpr uint16_t VP_MARLIN_WEBSITE = 0x2242;
constexpr uint8_t VP_MARLIN_WEBSITE_LEN = 32;
constexpr uint8_t VP_MARLIN_WEBSITE_LEN = 32;
constexpr uint16_t VP_STANDBY_BACKLIGHT_ICON = 0x2280;
constexpr uint16_t VP_STANDBY_BACKLIGHT_TOGGLE = 0x2282;
constexpr uint16_t VP_MUTE_ICON = 0x2284;
constexpr uint16_t VP_MUTE_TOGGLE = 0x2286;
constexpr uint16_t VP_SCREEN_BACKLIGHT_STANDBY = 0x228D;
// Material preheat settings
constexpr uint16_t VP_PREHEAT_PLA_HOTEND_TEMP = 0x1102;
@@ -220,10 +234,9 @@ constexpr uint16_t VP_T_E0_Set = 0x1034; // 2 Byte Integer - HEAD_SET_TEMP_VP
constexpr uint16_t VP_T_Bed_Is = 0x103c; // 4 Byte Integer - BED_SET_TEMP_VP
constexpr uint16_t VP_T_Bed_Set = 0x103A; // 2 Byte Integer - BED_CURRENT_TEMP_VP
constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer
// constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer
constexpr uint16_t VP_Flowrate_E0 = 0x228A; // 2 Byte Integer
// constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100)
constexpr uint16_t VP_Fan0_Percentage = 0x228F; // 2 Byte Integer (0..100)
// constexpr uint16_t VP_Fan1_Percentage = 0x33A2; // 2 Byte Integer (0..100)
// //constexpr uint16_t VP_Fan2_Percentage = 0x33A4; // 2 Byte Integer (0..100)
// //constexpr uint16_t VP_Fan3_Percentage = 0x33A6; // 2 Byte Integer (0..100)
@@ -248,7 +261,7 @@ constexpr uint16_t VP_Z_OFFSET = 0x1026;
constexpr uint16_t VP_SD_ScrollEvent = 0x20D4; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down
constexpr uint16_t VP_SD_FileSelected = 0x2200; // Number of file field selected.
constexpr uint16_t VP_SD_FileName_LEN = 21; // LEN is shared for all entries.
constexpr uint16_t VP_SD_FileName_CNT = 6; // LEN is shared for all entries.
constexpr uint16_t VP_SD_FileName_CNT = 5; // LEN is shared for all entries.
constexpr uint16_t DGUS_SD_FILESPERSCREEN = VP_SD_FileName_CNT; // FIXME move that info to the display and read it from there.
constexpr uint16_t VP_SD_FileName0 = 0x20D5;
constexpr uint16_t VP_SD_FileName1 = VP_SD_FileName0 + VP_SD_FileName_LEN;
@@ -338,7 +351,6 @@ constexpr uint16_t VP_BUTTON_HEATLOADSTARTKEY = 0x1056;
// Additional stuff defined by Creality
constexpr uint16_t VP_FAN_TOGGLE = 0x101E;
constexpr uint16_t VP_LED_TOGGLE = 0x101F;
constexpr uint16_t VP_STEPPERS = 0x1200;
constexpr uint16_t VP_MESH_LEVEL_TEMP = 0x108A;
constexpr uint16_t VP_MESH_LEVEL_STATUS = 0x108D;
constexpr uint16_t VP_MESH_VALUE_START = 0x1300;
@@ -347,10 +359,69 @@ constexpr uint16_t VP_FEED_PROGRESS = 0x108e;
// Movement screen
constexpr uint16_t VP_X_POSITION = 0x1048;
constexpr uint16_t SP_X_POSITION = 0x4000;
constexpr uint16_t VP_Y_POSITION = 0x104A;
constexpr uint16_t SP_Y_POSITION = 0x4030;
constexpr uint16_t VP_Z_POSITION = 0x104C;
constexpr uint16_t SP_Z_POSITION = 0x4060;
constexpr uint16_t VP_BUTTON_MOVEKEY = 0x1046;
// Buttons
constexpr uint16_t VP_ESTEP_NAV_BUTTON = 0x2291;
constexpr uint16_t VP_PIDTUNE_NAV_BUTTON = 0x2293;
constexpr uint16_t VP_GENERIC_BACK_BUTTON = 0x2295; // Generic button for popping back to the old display
// PID tuning
constexpr uint16_t VP_PIDTUNE_TARGET_TEMP = 0x2297;
constexpr uint16_t VP_PIDTUNE_CYCLES = 0x2299;
constexpr uint16_t VP_PIDTUNE_START_BUTTON = 0x229B;
// FWRetract
constexpr uint16_t VP_FWRETRACT_NAV_BUTTON = 0x22AD;
constexpr uint16_t VP_FWRETRACT_NAV_BUTTON_ICON = 0x22AF;
constexpr uint16_t VP_FWRETRACT_RETRACT_LENGTH = 0x22B1;
constexpr uint16_t VP_FWRETRACT_RETRACT_FEEDRATE = 0x22B3;
constexpr uint16_t VP_FWRETRACT_RETRACT_ZHOP = 0x22B5;
constexpr uint16_t VP_FWRETRACT_RESTART_LENGTH = 0x22B7;
constexpr uint16_t VP_FWRETRACT_RESTART_FEEDRATE = 0x22B9;
constexpr uint16_t VP_FWRETRACT_TOGGLE_BUTTON = 0x22BB;
constexpr uint16_t VP_FWRETRACT_TOGGLE_BUTTON_ICON = 0x22BD;
constexpr uint16_t VP_FWRETRACT_INDICATOR_ICON = 0x22BF;
// E-steps calibration
constexpr uint16_t VP_ESTEPS_CURRENT = 0x229d;
constexpr uint16_t VP_ESTEPS_CALIBRATION_TEMP = 0x229f;
constexpr uint16_t VP_ESTEPS_CALIBRATION_LENGTH = 0x22a1;
constexpr uint16_t VP_ESTEPS_CALIBRATION_MARK_LENGTH = 0x22ab;
constexpr uint16_t VP_ESTEPS_CALIBRATION_LEFTOVER_LENGTH = 0x22a3;
constexpr uint16_t VP_ESTEPS_CALCULATED_ESTEPS = 0x22a5;
constexpr uint16_t VP_ESTEPS_CALIBRATESTART_BUTTON = 0x22a7;
constexpr uint16_t VP_ESTEPS_APPLY_BUTTON = 0x22a9;
// Icons
constexpr uint16_t ICON_TOGGLE_ON = 1;
constexpr uint16_t ICON_TOGGLE_OFF = 2;
// Toggles
constexpr uint16_t ICON_FAN_TOGGLE_ON = 1;
constexpr uint16_t ICON_FAN_TOGGLE_OFF = 2;
constexpr uint16_t ICON_LED_TOGGLE_ON = 3;
constexpr uint16_t ICON_LED_TOGGLE_OFF = 4;
constexpr uint16_t ICON_SOUND_TOGGLE_ON = 5;
constexpr uint16_t ICON_SOUND_TOGGLE_OFF = 6;
constexpr uint16_t ICON_STANDBY_TOGGLE_ON = 7;
constexpr uint16_t ICON_STANDBY_TOGGLE_OFF = 8;
constexpr uint16_t ICON_FWRETRACT_AUTO_TOGGLE_ON = 9;
constexpr uint16_t ICON_FWRETRACT_AUTO_TOGGLE_OFF = 10;
constexpr uint16_t ICON_FWRETRACT_NAV_UNAVAILABLE = 14;
constexpr uint16_t ICON_FWRETRACT_NAV_AVAILABLE = 15;
constexpr uint16_t ICON_FWRETRACT_AUTO_DISENGAGED = 16; // This icon deliberately does not exist
constexpr uint16_t ICON_FWRETRACT_AUTO_ENGAGED = 17;
@@ -0,0 +1,159 @@
#include "../../../../../inc/MarlinConfigPre.h"
#if ENABLED(DGUS_LCD_UI_CREALITY_TOUCH)
#include "../DGUSDisplayDef.h"
#include "../DGUSDisplay.h"
#include "../DGUSScreenHandler.h"
#include "EstepsHandler.h"
#include "../../../ui_api.h"
#include "../../../../marlinui.h"
#include "../../../../../module/temperature.h"
#include "../../../../../module/settings.h"
#include "../../../../../module/planner.h"
#include "../../../../../gcode/gcode.h"
// Storage init
float EstepsHandler::set_esteps = 0;
float EstepsHandler::calculated_esteps = 0;
float EstepsHandler::remaining_filament = 0;
float EstepsHandler::mark_filament_mm = 0;
float EstepsHandler::filament_to_extrude = 0;
uint16_t EstepsHandler::calibration_temperature = 0;
void EstepsHandler::Init() {
// Use steps
set_esteps = ExtUI::getAxisSteps_per_mm(ExtUI::E0);
calculated_esteps = 0;
// Reset
filament_to_extrude = 100;
mark_filament_mm = 120;
remaining_filament = 0;
// Use configured PLA temps + 10 degrees
calibration_temperature = ui.material_preset[0].hotend_temp + 10;
// Welcome message
SetStatusMessage(PSTR("Ready"));
}
void EstepsHandler::HandleStartButton(DGUS_VP_Variable &var, void *val_ptr) {
static_assert(ADVANCED_PAUSE_PURGE_LENGTH == 0, "Assuming PURGE_LENGTH is 0 so we can use M701");
// Validate
if (calibration_temperature < EXTRUDE_MINTEMP) {
SetStatusMessage(PSTR("Invalid temperature set"));
return;
}
if (filament_to_extrude < 10) {
SetStatusMessage(PSTR("Invalid extrusion length set"));
return;
}
if (mark_filament_mm < filament_to_extrude) {
SetStatusMessage(PSTR("Invalid mark length set"));
return;
}
// Prepare
bool zAxisWasRelative = GcodeSuite::axis_is_relative(Z_AXIS);
bool eAxisWasRelative = GcodeSuite::axis_is_relative(E_AXIS);
GcodeSuite::set_e_relative();
GcodeSuite::set_relative_mode(true);
ExtUI::injectCommands_P("G0 Z5 F150");
queue.advance();
// Heat up if necessary
if (ExtUI::getActualTemp_celsius(ExtUI::E0) < calibration_temperature && abs(ExtUI::getActualTemp_celsius(ExtUI::E0) - calibration_temperature) > 2) {
thermalManager.setTargetHotend(calibration_temperature, ExtUI::H0);
SetStatusMessage(PSTR("Heating up..."));
thermalManager.wait_for_hotend(ExtUI::H0, false);
}
planner.synchronize();
// Set-up command
SetStatusMessage(PSTR("Extruding..."));
char cmd[64];
sprintf_P(cmd, PSTR("G1 E%f F50"), filament_to_extrude);
ExtUI::injectCommands(cmd);
queue.advance();
planner.synchronize();
// Restore position
ExtUI::injectCommands_P("G0 Z-5 F150");
queue.advance();
planner.synchronize();
// Restore defaults
if (!zAxisWasRelative) GcodeSuite::set_relative_mode(false);
if (!eAxisWasRelative) GcodeSuite::set_e_absolute();
// Done
ScreenHandler.Buzzer(0, 250);
SetStatusMessage(PSTR("Please measure remaining filament"));
}
void EstepsHandler::HandleApplyButton(DGUS_VP_Variable &var, void *val_ptr) {
if (abs(calculated_esteps) < 1) {
// User intented to set e-steps directly
ExtUI::setAxisSteps_per_mm(set_esteps, ExtUI::E0);
} else {
ExtUI::setAxisSteps_per_mm(calculated_esteps, ExtUI::E0);
}
// Save & reset
settings.save();
Init();
ScreenHandler.Buzzer(0, 250);
SetStatusMessage(PSTR("New e-steps value saved"));
}
void EstepsHandler::HandleRemainingFilament(DGUS_VP_Variable &var, void *val_ptr) {
ScreenHandler.DGUSLCD_SetFloatAsIntFromDisplay<1>(var, val_ptr);
// Calculate
constexpr float precision = 0.01;
float actualExtrusion = mark_filament_mm - remaining_filament;
if (actualExtrusion < (-precision)) {
SetStatusMessage(PSTR("Mark filament further"));
return;
}
if (actualExtrusion < precision) {
SetStatusMessage(PSTR("E-steps are correct"));
calculated_esteps = set_esteps;
return;
}
float current_steps = ExtUI::getAxisSteps_per_mm(ExtUI::E0);
SERIAL_ECHOLNPAIR("Current steps: ", current_steps);
SERIAL_ECHOLNPAIR("Actual extrusion: ", actualExtrusion);
float new_steps = (current_steps * filament_to_extrude) / actualExtrusion;
SERIAL_ECHOLNPAIR("New steps: ", new_steps);
calculated_esteps = new_steps;
// Status update
SetStatusMessage(PSTR("Calculated new e-steps"));
}
void EstepsHandler::SetStatusMessage(PGM_P statusMessage) {
ScreenHandler.setstatusmessagePGM(statusMessage);
}
#endif
@@ -0,0 +1,28 @@
#pragma once
#include <cstdint>
class EstepsHandler {
public:
static void Init();
static void HandleStartButton(DGUS_VP_Variable &var, void *val_ptr);
static void HandleApplyButton(DGUS_VP_Variable &var, void *val_ptr);
static void HandleRemainingFilament(DGUS_VP_Variable &var, void *val_ptr);
public:
static float set_esteps;
static float calculated_esteps;
static float mark_filament_mm;
static float remaining_filament;
static float filament_to_extrude;
static uint16_t calibration_temperature;
private:
static void SetStatusMessage(PGM_P statusMessage);
};
@@ -0,0 +1,72 @@
#include "../../../../../inc/MarlinConfigPre.h"
#if ENABLED(DGUS_LCD_UI_CREALITY_TOUCH)
#include "../DGUSDisplayDef.h"
#include "../DGUSDisplay.h"
#include "../DGUSScreenHandler.h"
#include "PIDHandler.h"
#include "../../../ui_api.h"
#include "../../../../marlinui.h"
#include "../../../../../module/temperature.h"
#include "../../../../../module/settings.h"
#include "../../../../../module/planner.h"
#include "../../../../../gcode/gcode.h"
// Storage init
uint16_t PIDHandler::cycles = 0;
uint16_t PIDHandler::calibration_temperature = 0;
PGM_P PIDHandler::result_message = nullptr;
void PIDHandler::Init() {
// Reset
cycles = 3;
// Use configured PLA temps + 10 degrees
calibration_temperature = ui.material_preset[0].hotend_temp + 15;
// Welcome message
SetStatusMessage(PSTR("Ready"));
}
void PIDHandler::HandleStartButton(DGUS_VP_Variable &var, void *val_ptr) {
static_assert(ADVANCED_PAUSE_PURGE_LENGTH == 0, "Assuming PURGE_LENGTH is 0 so we can use M701");
// Validate
if (calibration_temperature < EXTRUDE_MINTEMP) {
SetStatusMessage(PSTR("Invalid temperature set"));
return;
}
if (cycles < 1) {
SetStatusMessage(PSTR("Invalid number of cycles"));
return;
}
// Set-up command
SetStatusMessage(PSTR("PID tuning. Please wait..."));
char cmd[64];
sprintf_P(cmd, PSTR("M303 S%d C%d U1"), calibration_temperature, cycles);
ExtUI::injectCommands(cmd);
queue.advance();
planner.synchronize();
// Done
ScreenHandler.Buzzer(0, 250);
settings.save();
SetStatusMessage(result_message);
}
void PIDHandler::SetStatusMessage(PGM_P statusMessage) {
ScreenHandler.setstatusmessagePGM(statusMessage);
}
#endif
@@ -0,0 +1,20 @@
#pragma once
#include <cstdint>
class PIDHandler {
public:
static void Init();
static void HandleStartButton(DGUS_VP_Variable &var, void *val_ptr);
public:
static uint16_t cycles;
static uint16_t calibration_temperature;
static PGM_P result_message;
private:
static void SetStatusMessage(PGM_P statusMessage);
};
@@ -8,6 +8,7 @@
#include "../../../../../module/motion.h"
#include "../../../../../module/planner.h"
#include "../../../../../feature/pause.h"
#include "../../../../../gcode/gcode.h"
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
#include "../../../../../feature/runout.h"
@@ -15,8 +16,8 @@
#include "../../../../../module/settings.h"
#include "../../../../marlinui.h"
#include "../../../ui_api.h"
#include "../../../../marlinui.h"
#include "PageHandlers.h"
@@ -25,7 +26,36 @@
// Definitions of page handlers
void MainMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
// Nothing
switch (var.VP) {
case VP_BUTTON_MAINENTERKEY:
switch (buttonValue) {
case 1:
// Try to mount an unmounted card
if (!card.isMounted()) {
card.mount();
if (card.isMounted()) {
ExtUI::onMediaInserted();
}
}
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST);
break;
case 2:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PREPARE);
break;
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONTROL);
break;
case 4:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_ZOFFSET_LEVEL);
break;
}
break;
}
}
void ControlMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
@@ -33,20 +63,28 @@ void ControlMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
case VP_BUTTON_PREPAREENTERKEY:
switch(buttonValue) {
case 5: // About
// Automatically handled
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_INFO);
break;
case 7: // Reset to factory settings
settings.reset();
settings.save();
ExtUI::injectCommands_P(PSTR("M300"));
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
break;
case 9: // Back button
// TODO: should navigate automatically
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
break;
}
break;
case VP_BUTTON_TEMPCONTROL:
if (buttonValue == 2) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TEMP);
break;
case VP_BUTTON_ADJUSTENTERKEY:
ScreenHandler.HandleLEDToggle();
break;
@@ -58,29 +96,46 @@ void LevelingModeHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
case VP_BUTTON_BEDLEVELKEY:
switch (buttonValue) {
case 1:
ExtUI::injectCommands_P("G28\nG0 Z0");
ExtUI::injectCommands_P("G28");
queue.advance();
planner.synchronize();
ExtUI::injectCommands_P("G0 Z0");
queue.advance();
break;
case 2:
// Increase Z-offset
ExtUI::smartAdjustAxis_steps(ExtUI::mmToWholeSteps(0.01, ExtUI::axis_t::Z), ExtUI::axis_t::Z, true);;
ScreenHandler.ForceCompleteUpdate();
settings.save();
ScreenHandler.RequestSaveSettings();
break;
case 3:
// Decrease Z-offset
ExtUI::smartAdjustAxis_steps(ExtUI::mmToWholeSteps(-0.01, ExtUI::axis_t::Z), ExtUI::axis_t::Z, true);;
ScreenHandler.ForceCompleteUpdate();
settings.save();
ScreenHandler.RequestSaveSettings();
break;
}
break;
case VP_BUTTON_PREPAREENTERKEY:
if (buttonValue == 9) {
// If we're in the workflow of calibration from the home screen, there is no need to keep the heaters on at this point
thermalManager.disable_all_heaters();
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
}
break;
case VP_BUTTON_MAINENTERKEY:
// Go to leveling screen
ExtUI::injectCommands_P("G28\nG29");
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_LEVELING);
break;
}
}
@@ -104,14 +159,46 @@ void TempMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
}
break;
case VP_BUTTON_TEMPCONTROL:
switch (buttonValue){
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TEMP_PLA);
break;
case 4:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TEMP_ABS);
break;
case 7:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONTROL);
break;
}
break;
}
}
void PrepareMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
switch (var.VP) {
case VP_BUTTON_PREPAREENTERKEY:
// Disable steppers
ScreenHandler.HandleMotorLockUnlock(var, &buttonValue);
switch (buttonValue){
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE10MM);
break;
case 6:
// Disable steppers
ScreenHandler.HandleMotorLockUnlock(var, &buttonValue);
break;
case 9:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
break;
}
break;
case VP_BUTTON_HEATLOADSTARTKEY:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_FEED);
break;
case VP_BUTTON_COOLDOWN:
@@ -157,30 +244,61 @@ void TuneMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
}
void PrintRunningMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
// There are actually no buttons to handle here: all buttons navigate to other screens (like confirmation screens)
switch (var.VP) {
case VP_BUTTON_ADJUSTENTERKEY:
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TUNING);
break;
}
break;
case VP_BUTTON_PAUSEPRINTKEY:
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_DIALOG_PAUSE);
break;
}
break;
case VP_BUTTON_STOPPRINTKEY:
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_DIALOG_STOP);
break;
}
break;
}
}
void PrintPausedMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
switch (var.VP) {
case VP_BUTTON_RESUMEPRINTKEY:
//SERIAL_ECHOLN("Handling VP_BUTTON_RESUMEPRINTKEY");
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
runout.reset();
//SERIAL_ECHOLN("Runout Reset");
#endif
if(ExtUI::isWaitingOnUser()) {
ScreenHandler.HandlePendingUserConfirmation();
//SERIAL_ECHOLN("User Confirmed");
}
else if(ExtUI::isPrintingFromMediaPaused()) {
//SERIAL_ECHOLN("SD Resume");
ExtUI::resumePrint();
}
//SERIAL_ECHOLN("Reasons handled");
if(!ExtUI::isMoving()) {
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PRINT_RUNNING);
#endif
if (!ScreenHandler.HandlePendingUserConfirmation()) {
ExtUI::resumePrint();
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PRINT_RUNNING);
}
break;
case VP_BUTTON_ADJUSTENTERKEY:
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TUNING);
break;
}
break;
case VP_BUTTON_STOPPRINTKEY:
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_DIALOG_STOP);
break;
}
break;
}
}
@@ -201,6 +319,18 @@ void PrintPauseDialogHandler(DGUS_VP_Variable &var, unsigned short buttonValue)
}
}
void PrintFinishMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
switch (var.VP){
case VP_BUTTON_MAINENTERKEY:
switch (buttonValue) {
case 5:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN);
break;
}
break;
}
}
void FilamentRunoutHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
switch (var.VP){
case VP_BUTTON_RESUMEPRINTKEY:
@@ -225,7 +355,7 @@ void StopConfirmScreenHandler(DGUS_VP_Variable &var, unsigned short buttonValue)
break;
case 3:
ScreenHandler.GotoScreen(ExtUI::isPrintingFromMediaPaused() ? DGUSLCD_SCREEN_PRINT_PAUSED : DGUSLCD_SCREEN_PRINT_RUNNING);
ScreenHandler.GotoScreen(ExtUI::isPrintingPaused() ? DGUSLCD_SCREEN_PRINT_PAUSED : DGUSLCD_SCREEN_PRINT_RUNNING);
break;
}
break;
@@ -236,28 +366,45 @@ void PreheatSettingsScreenHandler(DGUS_VP_Variable &var, unsigned short buttonVa
switch (var.VP){
case VP_BUTTON_PREPAREENTERKEY:
// Save button, save settings and go back
settings.save();
ScreenHandler.RequestSaveSettings();
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TEMP);
break;
case VP_BUTTON_COOLDOWN:
case VP_BUTTON_COOLDOWN: // You can't make this up
// Back button, discard settings
settings.load();
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_TEMP);
break;
}
}
void InfoMenuHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
switch (var.VP){
case VP_BUTTON_TEMPCONTROL:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONTROL);
break;
}
}
void change_filament_with_temp(PGM_P command, const uint16_t celsius) {
thermalManager.setTargetHotend(celsius, ExtUI::H0);
// Heat if necessary
if (ExtUI::getActualTemp_celsius(ExtUI::E0) < celsius && abs(ExtUI::getActualTemp_celsius(ExtUI::E0) - celsius) > 2) {
thermalManager.setTargetHotend(celsius, ExtUI::H0);
thermalManager.wait_for_hotend(ExtUI::H0, false);
}
char cmd[32];
// Inject load filament command
char cmd[64];
sprintf_P(cmd, command, ScreenHandler.feed_amount);
SERIAL_ECHOPAIR("Injecting command: ", cmd);
ExtUI::injectCommands(cmd);
// Handle commands
SERIAL_ECHOPGM_P("- waiting for queue");
queue.advance();
planner.synchronize();
SERIAL_ECHOPGM_P("- done");
}
@@ -287,28 +434,36 @@ void FeedHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
dgusdisplay.WriteVariable(VP_FEED_PROGRESS, static_cast<int16_t>(0));
break;
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PREPARE);
break;
}
ScreenHandler.ForceCompleteUpdate();
}
void MoveHandler(DGUS_VP_Variable &var, unsigned short buttonValue) {
if (var.VP != VP_BUTTON_MOVEKEY) return;
if (var.VP == VP_BUTTON_HEATLOADSTARTKEY) {
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_PREPARE);
}
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE10MM);
break;
case 2:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE1MM);
break;
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE01MM);
break;
case 4:
ExtUI::injectCommands_P("G28");
break;
}
if (var.VP == VP_BUTTON_MOVEKEY) {
switch (buttonValue) {
case 1:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE10MM);
break;
case 2:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE1MM);
break;
case 3:
ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MOVE01MM);
break;
case 4:
ExtUI::injectCommands_P("G28");
break;
}
}
}
// Register the page handlers
@@ -321,6 +476,8 @@ const struct PageHandler PageHandlers[] PROGMEM = {
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_ZOFFSET_LEVEL, LevelingModeHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_LEVELING, LevelingHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_INFO, InfoMenuHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_TEMP, TempMenuHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_TEMP_PLA, PreheatSettingsScreenHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_TEMP_ABS, PreheatSettingsScreenHandler)
@@ -332,11 +489,13 @@ const struct PageHandler PageHandlers[] PROGMEM = {
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_MOVE10MM, MoveHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_FILAMENTRUNOUT1, FilamentRunoutHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_FILAMENTRUNOUT2, FilamentRunoutHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_DIALOG_STOP, StopConfirmScreenHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_PRINT_RUNNING, PrintRunningMenuHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_PRINT_PAUSED, PrintPausedMenuHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_PRINT_FINISH, PrintFinishMenuHandler)
PAGE_HANDLER(DGUSLCD_Screens::DGUSLCD_SCREEN_DIALOG_PAUSE, PrintPauseDialogHandler)