From 4e2d7f581d736e9d10922ad1c63a06b9d95d8601 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Sat, 13 Apr 2024 12:28:54 +0300 Subject: [PATCH 1/4] Export setting to file --- Marlin/Configuration_adv.h | 9 +++++++++ Marlin/src/core/serial.cpp | 26 ++++++++++++++++++++++++++ Marlin/src/core/serial.h | 4 ++++ Marlin/src/core/serial_hook.h | 5 +++++ Marlin/src/inc/SanityCheck.h | 2 ++ Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/marlinui.cpp | 10 ++++++++++ Marlin/src/lcd/marlinui.h | 4 ++++ Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++++ 9 files changed, 65 insertions(+) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 84fbd6f8ed..076fa53bb1 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1,3 +1,4 @@ + /** * Marlin 3D Printer Firmware * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] @@ -4855,3 +4856,11 @@ // Shrink the build for smaller boards by sacrificing some serial feedback //#define MARLIN_SMALL_BUILD + +#if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) + //#define EXPORT_SETTINGS // Export memory settings to file M503.gc in SD card root for replay +#endif + +#if ENABLED(EXPORT_SETTINGS) + #define SERIAL_2_FILE // Dump serial output to file, needed for export settings +#endif \ No newline at end of file diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 852cfc77f6..4e6eebfac0 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -144,3 +144,29 @@ void print_xyze(LOGICAL_AXIS_ARGS_(const float) FSTR_P const prefix/*=nullptr*/, #endif if (suffix) SERIAL_ECHO(suffix); else SERIAL_EOL(); } + +#if ENABLED(SERIAL_2_FILE) + #include + #include + + MediaFile sr_dump_file; + size_t sr_write_res; + + bool sr_file_open(const char * filename) + { + sr_write_res = 0; + MediaFile root = card.getroot(); + return sr_dump_file.open(&root, filename, O_CREAT | O_WRITE | O_TRUNC); + } + + void serial2file(uint8_t c) + { + if (sr_dump_file.isOpen() && sr_write_res != -1) + sr_write_res = sr_dump_file.write(c); + } + + bool sr_file_close() + { + return sr_dump_file.close(); + } +#endif \ No newline at end of file diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 6c73d72a22..1330d419f5 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -250,6 +250,10 @@ inline void print_xyze(const xyze_pos_t &xyze, FSTR_P const prefix=nullptr, FSTR print_xyze(LOGICAL_AXIS_ELEM_LC_(xyze) prefix, suffix); } +bool sr_file_open(const char * filename); +bool sr_file_close(); +extern size_t sr_write_res; + #define SERIAL_POS(SUFFIX,VAR) do { print_xyz(VAR, F(" " STRINGIFY(VAR) "="), F(" : " SUFFIX "\n")); }while(0) #define SERIAL_XYZ(PREFIX,V...) do { print_xyz(V, F(PREFIX)); }while(0) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 06efce1dc5..a653fbdbc5 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -200,6 +200,8 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria #define _S_CLASS(N) class Serial##N##T, #define _S_NAME(N) Serial##N##T, +void serial2file(uint8_t c); + template < REPEAT(NUM_SERIAL, _S_CLASS) const uint8_t offset=0, const uint8_t step=1 > struct MultiSerial : public SerialBase< MultiSerial< REPEAT(NUM_SERIAL, _S_NAME) offset, step > > { typedef SerialBase< MultiSerial< REPEAT(NUM_SERIAL, _S_NAME) offset, step > > BaseClassT; @@ -227,6 +229,9 @@ struct MultiSerial : public SerialBase< MultiSerial< REPEAT(NUM_SERIAL, _S_NAME) #define _S_WRITE(N) if (portMask.enabled(output[N])) serial##N.write(c); REPEAT(NUM_SERIAL, _S_WRITE); #undef _S_WRITE + #if ENABLED(SERIAL_2_FILE) + serial2file(c); + #endif } NO_INLINE void msgDone() { #define _S_DONE(N) if (portMask.enabled(output[N])) serial##N.msgDone(); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 761125d790..ee88aee8c7 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2799,6 +2799,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #error "Either disable SDCARD_READONLY or disable BINARY_FILE_TRANSFER." #elif ENABLED(SDCARD_EEPROM_EMULATION) #error "Either disable SDCARD_READONLY or disable SDCARD_EEPROM_EMULATION." + #elif ENABLED(EXPORT_SETTINGS) + #error "Either disable SDCARD_READONLY or disable EXPORT_SETTINGS." #endif #endif diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 0472c9e4ec..8cd7552003 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -411,6 +411,7 @@ namespace LanguageNarrow_en { LSTR MSG_FILAMENT_LOAD = _UxGT("Load mm"); LSTR MSG_ADVANCE_K = _UxGT("Advance K"); LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *"); + LSTR MSG_EXPORT_SETTINGS = _UxGT("Export Settings"); LSTR MSG_INIT_EEPROM = _UxGT("Initialize EEPROM"); LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update"); LSTR MSG_RESET_PRINTER = _UxGT("Reset Printer"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index d1d4bfd0a6..91e98785f5 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -2020,6 +2020,16 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, zoffset_overlay(dir); } #endif +#if ENABLED(EXPORT_SETTINGS) + void MarlinUI::export_settings() { + if (sr_file_open("M503.gc")) { + settings.report(true); + completion_feedback(sr_file_close() && sr_write_res != -1); + } else + completion_feedback(false); + } +#endif + #endif // HAS_MARLINUI_MENU diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 8ec25ab5c6..5a0e7e8d39 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -796,6 +796,10 @@ public: static void eeprom_alert(const EEPROM_Error) TERN_(EEPROM_AUTO_INIT, {}); #endif + #if ENABLED(EXPORT_SETTINGS) + static void export_settings(); + #endif + // // Special handling if a move is underway // diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index 94e3ee41b2..fa6fdc80d2 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -818,6 +818,10 @@ void menu_advanced_settings() { ); #endif + #if ENABLED(EXPORT_SETTINGS) + ACTION_ITEM(MSG_EXPORT_SETTINGS, ui.export_settings); + #endif + END_MENU(); } From ba2f7c1cde620dd755ecb6ac76cf317c3d5f2886 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Sat, 13 Apr 2024 12:47:20 +0300 Subject: [PATCH 2/4] Tests with export enabled --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 076fa53bb1..cf4c9a9d1c 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4858,7 +4858,7 @@ //#define MARLIN_SMALL_BUILD #if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) - //#define EXPORT_SETTINGS // Export memory settings to file M503.gc in SD card root for replay + #define EXPORT_SETTINGS // Export memory settings to file M503.gc in SD card root for replay #endif #if ENABLED(EXPORT_SETTINGS) From 9b778cb67af9fdf3c33af2a587ad434a500d3b21 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Sat, 13 Apr 2024 12:53:26 +0300 Subject: [PATCH 3/4] Turn off with SDCARD_READONLY --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index cf4c9a9d1c..0796ec9acd 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4857,7 +4857,7 @@ // Shrink the build for smaller boards by sacrificing some serial feedback //#define MARLIN_SMALL_BUILD -#if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) +#if ALL(HAS_MEDIA, HAS_MARLINUI_MENU) && DISABLED(SDCARD_READONLY) #define EXPORT_SETTINGS // Export memory settings to file M503.gc in SD card root for replay #endif From 43bdb719556a260cd28393d5a7c503333457a315 Mon Sep 17 00:00:00 2001 From: vovodroid Date: Tue, 28 May 2024 20:33:42 +0300 Subject: [PATCH 4/4] Pass file name to export function --- Marlin/src/lcd/marlinui.cpp | 4 ++-- Marlin/src/lcd/marlinui.h | 4 ++++ Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 91e98785f5..653ed2d343 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -2021,8 +2021,8 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, } #endif #if ENABLED(EXPORT_SETTINGS) - void MarlinUI::export_settings() { - if (sr_file_open("M503.gc")) { + void MarlinUI::export_settings(const char* filename) { + if (sr_file_open(filename)) { settings.report(true); completion_feedback(sr_file_close() && sr_write_res != -1); } else diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 5a0e7e8d39..fbf88d8667 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -800,6 +800,10 @@ public: static void export_settings(); #endif + #if ENABLED(EXPORT_SETTINGS) + static void export_settings(const char* filename); + #endif + // // Special handling if a move is underway // diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index fa6fdc80d2..a76049e736 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -819,7 +819,7 @@ void menu_advanced_settings() { #endif #if ENABLED(EXPORT_SETTINGS) - ACTION_ITEM(MSG_EXPORT_SETTINGS, ui.export_settings); + ACTION_ITEM(MSG_EXPORT_SETTINGS, []{ui.export_settings("M503.GC");}); #endif END_MENU();