From ee63edee9293d63f052adb97246129b35f71a166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Thu, 25 Aug 2022 11:21:28 +0200 Subject: [PATCH 1/7] Add timestamps in M20 (M20 T support) Add new TIMESTAMP_FILENAME_SUPPORT option which enables timestamps support in M20 g-code output (M20 T command). https://reprap.org/wiki/G-code#M20:_List_SD_card --- Marlin/Configuration_adv.h | 1 + Marlin/src/gcode/sd/M20.cpp | 6 +++++- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/sd/cardreader.cpp | 36 ++++++++++++++++++++++++++----- Marlin/src/sd/cardreader.h | 7 +++++- 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 6ec969474d9f..34eca397a036 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1578,6 +1578,7 @@ //#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 ' and list long filenames with 'M20 L' //#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol + //#define TIMESTAMP_FILENAME_SUPPORT // Show timestamp for filename in 'M20 T' / 'M20 L T' //#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index c640309be8c8..c7d704c37ef0 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -35,10 +35,14 @@ void GcodeSuite::M20() { SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); card.ls( TERN_(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F')) - #if BOTH(CUSTOM_FIRMWARE_UPLOAD, LONG_FILENAME_HOST_SUPPORT) + #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && EITHER(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) , #endif TERN_(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L')) + #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) + , + #endif + TERN_(TIMESTAMP_FILENAME_SUPPORT, parser.boolval('T')) ); SERIAL_ECHOLNPGM(STR_END_FILE_LIST); } diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 21bc424f5940..d9f70e6be769 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -1003,7 +1003,7 @@ #endif // Flag whether hex_print.cpp is used -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER) +#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, TIMESTAMP_FILENAME_SUPPORT) #define NEED_HEX_PRINT 1 #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3fff79653933..624a62c930fd 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -29,6 +29,7 @@ #include "cardreader.h" #include "../MarlinCore.h" +#include "../libs/hex_print.h" #include "../lcd/marlinui.h" #if ENABLED(DWIN_CREALITY_LCD) @@ -283,6 +284,7 @@ void CardReader::printListing( SdFile parent, const char * const prepend OPTARG(CUSTOM_FIRMWARE_UPLOAD, bool onlyBin/*=false*/) OPTARG(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames/*=false*/) + OPTARG(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps/*=false*/) OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong/*=nullptr*/) ) { dir_t p; @@ -307,12 +309,16 @@ void CardReader::printListing( char pathLong[lenPrependLong + strlen(longFilename) + 1]; if (prependLong) { strcpy(pathLong, prependLong); pathLong[lenPrependLong - 1] = '/'; } strcpy(pathLong + lenPrependLong, longFilename); - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin), true, pathLong); + printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin), + true OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps), + pathLong); } else - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin)); + printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) + OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); #else - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin)); + printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) + OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); #endif } else { @@ -325,6 +331,20 @@ void CardReader::printListing( SERIAL_ECHO(createFilename(filename, p)); SERIAL_CHAR(' '); SERIAL_ECHO(p.fileSize); + #if ENABLED(TIMESTAMP_FILENAME_SUPPORT) + if (includeTimestamps) { + SERIAL_CHAR(' '); + uint16_t crmodDate = p.lastWriteDate; + uint16_t crmodTime = p.lastWriteTime; + if (crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime )) { + crmodDate = p.creationDate; + crmodTime = p.creationTime; + } + SERIAL_ECHO("0x"); + print_hex_word(crmodDate); + print_hex_word(crmodTime); + } + #endif #if ENABLED(LONG_FILENAME_HOST_SUPPORT) if (includeLongNames) { SERIAL_CHAR(' '); @@ -342,14 +362,20 @@ void CardReader::printListing( // void CardReader::ls( TERN_(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin/*=false*/) - #if BOTH(CUSTOM_FIRMWARE_UPLOAD, LONG_FILENAME_HOST_SUPPORT) + #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && ANY(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) , #endif TERN_(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames/*=false*/) + #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) + , + #endif + TERN_(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps/*=false*/) ) { if (flag.mounted) { root.rewind(); - printListing(root, nullptr OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) OPTARG(LONG_FILENAME_HOST_SUPPORT, includeLongNames)); + printListing(root, nullptr OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) + OPTARG(LONG_FILENAME_HOST_SUPPORT, includeLongNames) + OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); } } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index d2f462c2a777..ee2a72777a29 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -209,10 +209,14 @@ class CardReader { static void ls( TERN_(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin=false) - #if BOTH(CUSTOM_FIRMWARE_UPLOAD, LONG_FILENAME_HOST_SUPPORT) + #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && ANY(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) , #endif TERN_(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames=false) + #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) + , + #endif + TERN_(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps=false) ); #if ENABLED(POWER_LOSS_RECOVERY) @@ -352,6 +356,7 @@ class CardReader { SdFile parent, const char * const prepend OPTARG(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin=false) OPTARG(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames=false) + OPTARG(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps=false) OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong=nullptr) ); From 221a5fed7f9341de8f8d9964a5a436be395d5950 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Aug 2022 11:21:16 -0500 Subject: [PATCH 2/7] minor refactor --- Marlin/Configuration_adv.h | 2 +- Marlin/src/gcode/sd/M20.cpp | 25 ++++++----- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/sd/cardreader.cpp | 74 ++++++++++++------------------- Marlin/src/sd/cardreader.h | 24 ++++------ 5 files changed, 51 insertions(+), 76 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 34eca397a036..43fce4150fc2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1578,7 +1578,7 @@ //#define LONG_FILENAME_HOST_SUPPORT // Get the long filename of a file/folder with 'M33 ' and list long filenames with 'M20 L' //#define LONG_FILENAME_WRITE_SUPPORT // Create / delete files with long filenames via M28, M30, and Binary Transfer Protocol - //#define TIMESTAMP_FILENAME_SUPPORT // Show timestamp for filename in 'M20 T' / 'M20 L T' + //#define M20_TIMESTAMP_SUPPORT // Include timestamps by adding the 'T' flag to M20 commands //#define SCROLL_LONG_FILENAMES // Scroll long filenames in the SD card menu diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index c7d704c37ef0..0a4309c6fbaf 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -28,22 +28,23 @@ #include "../../sd/cardreader.h" /** - * M20: List SD card to serial output + * M20: List SD card to serial output in [name] [size] format. + * + * With CUSTOM_FIRMWARE_UPLOAD: + * F - List BIN files only, for use with firmware upload + * + * With LONG_FILENAME_HOST_SUPPORT: + * L - List long filenames (instead of DOS8.3 names) + * + * With M20_TIMESTAMP_SUPPORT: + * T - Include timestamps */ void GcodeSuite::M20() { if (card.flag.mounted) { SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls( - TERN_(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F')) - #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && EITHER(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L')) - #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(TIMESTAMP_FILENAME_SUPPORT, parser.boolval('T')) - ); + card.ls(TERN0(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F') * LS_ONLY_BIN) + + TERN0(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L') * LS_LONG_FILENAME) + + TERN0(M20_TIMESTAMP_SUPPORT, parser.boolval('T') * LS_TIMESTAMP)); SERIAL_ECHOLNPGM(STR_END_FILE_LIST); } else diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index d9f70e6be769..ae8dcfc73849 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -1003,7 +1003,7 @@ #endif // Flag whether hex_print.cpp is used -#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, TIMESTAMP_FILENAME_SUPPORT) +#if ANY(AUTO_BED_LEVELING_UBL, M100_FREE_MEMORY_WATCHER, DEBUG_GCODE_PARSER, TMC_DEBUG, MARLIN_DEV_MODE, DEBUG_CARDREADER, M20_TIMESTAMP_SUPPORT) #define NEED_HEX_PRINT 1 #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 624a62c930fd..3057bf68af09 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -198,7 +198,7 @@ char *createFilename(char * const buffer, const dir_t &p) { // // Return 'true' if the item is a folder, G-code file or Binary file // -bool CardReader::is_visible_entity(const dir_t &p OPTARG(CUSTOM_FIRMWARE_UPLOAD, bool onlyBin/*=false*/)) { +bool CardReader::is_visible_entity(const dir_t &p OPTARG(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin/*=false*/)) { //uint8_t pn0 = p.name[0]; #if DISABLED(CUSTOM_FIRMWARE_UPLOAD) @@ -280,13 +280,17 @@ void CardReader::selectByName(SdFile dir, const char * const match) { * this can blow up the stack, so a 'depth' parameter would be a * good addition. */ -void CardReader::printListing( - SdFile parent, const char * const prepend - OPTARG(CUSTOM_FIRMWARE_UPLOAD, bool onlyBin/*=false*/) - OPTARG(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames/*=false*/) - OPTARG(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps/*=false*/) +void CardReader::printListing(SdFile parent, const char * const prepend, const uint8_t lsflags OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong/*=nullptr*/) ) { + const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, TEST(lsflags, LS_TIMESTAMP)); + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + const bool includeLong = TEST(lsflags, LS_LONG_FILENAME); + #endif + #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) + const bool onlyBin = TEST(lsflags, LS_ONLY_BIN); + #endif + UNUSED(lsflags); dir_t p; while (parent.readDir(&p, longFilename) > 0) { if (DIR_IS_SUBDIR(&p)) { @@ -303,23 +307,17 @@ void CardReader::printListing( SdFile child; // child.close() in destructor if (child.open(&parent, dosFilename, O_READ)) { #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - if (includeLongNames) { - size_t lenPrependLong = prependLong ? strlen(prependLong) + 1 : 0; + if (includeLong) { + const size_t lenPrependLong = prependLong ? strlen(prependLong) + 1 : 0; // Allocate enough stack space for the full long path including / separator char pathLong[lenPrependLong + strlen(longFilename) + 1]; if (prependLong) { strcpy(pathLong, prependLong); pathLong[lenPrependLong - 1] = '/'; } strcpy(pathLong + lenPrependLong, longFilename); - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin), - true OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps), - pathLong); + printListing(child, path, lsflags, pathLong); + continue; } - else - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) - OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); - #else - printListing(child, path OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) - OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); #endif + printListing(child, path, lsflags); } else { SERIAL_ECHO_MSG(STR_SD_CANT_OPEN_SUBDIR, dosFilename); @@ -331,22 +329,18 @@ void CardReader::printListing( SERIAL_ECHO(createFilename(filename, p)); SERIAL_CHAR(' '); SERIAL_ECHO(p.fileSize); - #if ENABLED(TIMESTAMP_FILENAME_SUPPORT) - if (includeTimestamps) { - SERIAL_CHAR(' '); - uint16_t crmodDate = p.lastWriteDate; - uint16_t crmodTime = p.lastWriteTime; - if (crmodDate < p.creationDate || ( crmodDate == p.creationDate && crmodTime < p.creationTime )) { - crmodDate = p.creationDate; - crmodTime = p.creationTime; - } - SERIAL_ECHO("0x"); - print_hex_word(crmodDate); - print_hex_word(crmodTime); - } - #endif + if (includeTime) { + SERIAL_CHAR(' '); + uint16_t crmodDate = p.lastWriteDate, crmodTime = p.lastWriteTime; + if (crmodDate < p.creationDate || (crmodDate == p.creationDate && crmodTime < p.creationTime)) { + crmodDate = p.creationDate; + crmodTime = p.creationTime; + } + SERIAL_ECHOPGM("0x", hex_word(crmodDate)); + print_hex_word(crmodTime); + } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - if (includeLongNames) { + if (includeLong) { SERIAL_CHAR(' '); if (prependLong) { SERIAL_ECHO(prependLong); SERIAL_CHAR('/'); } SERIAL_ECHO(longFilename[0] ? longFilename : filename); @@ -360,22 +354,10 @@ void CardReader::printListing( // // List all files on the SD card // -void CardReader::ls( - TERN_(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin/*=false*/) - #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && ANY(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames/*=false*/) - #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps/*=false*/) -) { +void CardReader::ls(const uint8_t lsflags) { if (flag.mounted) { root.rewind(); - printListing(root, nullptr OPTARG(CUSTOM_FIRMWARE_UPLOAD, onlyBin) - OPTARG(LONG_FILENAME_HOST_SUPPORT, includeLongNames) - OPTARG(TIMESTAMP_FILENAME_SUPPORT, includeTimestamps)); + printListing(root, nullptr, lsflags); } } diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index ee2a72777a29..19d652d0b9ba 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -89,6 +89,12 @@ typedef struct { ; } card_flags_t; +enum ListingFlags : uint8_t { + LS_LONG_FILENAME = _BV(0), + LS_ONLY_BIN = _BV(1), + LS_TIMESTAMP = _BV(2) +}; + #if ENABLED(AUTO_REPORT_SD_STATUS) #include "../libs/autoreport.h" #endif @@ -207,17 +213,7 @@ class CardReader { FORCE_INLINE static void getfilename_sorted(const uint16_t nr) { selectFileByIndex(nr); } #endif - static void ls( - TERN_(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin=false) - #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) && ANY(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames=false) - #if BOTH(LONG_FILENAME_HOST_SUPPORT, TIMESTAMP_FILENAME_SUPPORT) - , - #endif - TERN_(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps=false) - ); + static void ls(const uint8_t lsflags); #if ENABLED(POWER_LOSS_RECOVERY) static bool jobRecoverFileExists(); @@ -352,11 +348,7 @@ class CardReader { static int countItems(SdFile dir); static void selectByIndex(SdFile dir, const uint8_t index); static void selectByName(SdFile dir, const char * const match); - static void printListing( - SdFile parent, const char * const prepend - OPTARG(CUSTOM_FIRMWARE_UPLOAD, const bool onlyBin=false) - OPTARG(LONG_FILENAME_HOST_SUPPORT, const bool includeLongNames=false) - OPTARG(TIMESTAMP_FILENAME_SUPPORT, const bool includeTimestamps=false) + static void printListing(SdFile parent, const char * const prepend, const uint8_t lsflags OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong=nullptr) ); From cce23c77af6182910a7d6c42062d96ee751df3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Thu, 25 Aug 2022 21:28:13 +0200 Subject: [PATCH 3/7] Test flag bits --- Marlin/src/sd/cardreader.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3057bf68af09..45133f9b400f 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -283,12 +283,12 @@ void CardReader::selectByName(SdFile dir, const char * const match) { void CardReader::printListing(SdFile parent, const char * const prepend, const uint8_t lsflags OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong/*=nullptr*/) ) { - const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, TEST(lsflags, LS_TIMESTAMP)); + const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, lsflags & LS_TIMESTAMP); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - const bool includeLong = TEST(lsflags, LS_LONG_FILENAME); + const bool includeLong = lsflags & LS_LONG_FILENAME; #endif #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) - const bool onlyBin = TEST(lsflags, LS_ONLY_BIN); + const bool onlyBin = lsflags & LS_ONLY_BIN; #endif UNUSED(lsflags); dir_t p; From c54cd79774ba05efb18bee11ddf2824bc4033f0b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Aug 2022 16:40:20 -0500 Subject: [PATCH 4/7] add tests --- buildroot/tests/SAMD51_grandcentral_m4 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildroot/tests/SAMD51_grandcentral_m4 b/buildroot/tests/SAMD51_grandcentral_m4 index e6e27d8cb8c9..c8e08c19e6b8 100755 --- a/buildroot/tests/SAMD51_grandcentral_m4 +++ b/buildroot/tests/SAMD51_grandcentral_m4 @@ -22,7 +22,8 @@ opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_R EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER Z_STEPPER_AUTO_ALIGN ADAPTIVE_STEP_SMOOTHING \ STATUS_MESSAGE_SCROLLING LCD_SET_PROGRESS_MANUALLY SHOW_REMAINING_TIME USE_M73_REMAINING_TIME \ - LONG_FILENAME_HOST_SUPPORT SCROLL_LONG_FILENAMES BABYSTEPPING DOUBLECLICK_FOR_Z_BABYSTEPPING \ + LONG_FILENAME_HOST_SUPPORT CUSTOM_FIRMWARE_UPLOAD M20_TIMESTAMP_SUPPORT \ + SCROLL_LONG_FILENAMES BABYSTEPPING DOUBLECLICK_FOR_Z_BABYSTEPPING \ MOVE_Z_WHEN_IDLE BABYSTEP_ZPROBE_OFFSET BABYSTEP_ZPROBE_GFX_OVERLAY \ LIN_ADVANCE ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE MONITOR_DRIVER_STATUS SENSORLESS_HOMING \ SQUARE_WAVE_STEPPING TMC_DEBUG EXPERIMENTAL_SCURVE From 917de4ee4f639f240a27d0cff58331896477e2ec Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Aug 2022 16:44:50 -0500 Subject: [PATCH 5/7] simpler enum --- Marlin/src/gcode/sd/M20.cpp | 6 +++--- Marlin/src/sd/cardreader.cpp | 6 +++--- Marlin/src/sd/cardreader.h | 6 +----- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index 0a4309c6fbaf..d69f2b2c39af 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -42,9 +42,9 @@ void GcodeSuite::M20() { if (card.flag.mounted) { SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls(TERN0(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F') * LS_ONLY_BIN) - + TERN0(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L') * LS_LONG_FILENAME) - + TERN0(M20_TIMESTAMP_SUPPORT, parser.boolval('T') * LS_TIMESTAMP)); + card.ls(TERN0(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F') * _BV(LS_ONLY_BIN)) + + TERN0(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L') * _BV(LS_LONG_FILENAME)) + + TERN0(M20_TIMESTAMP_SUPPORT, parser.boolval('T') * _BV(LS_TIMESTAMP))); SERIAL_ECHOLNPGM(STR_END_FILE_LIST); } else diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 45133f9b400f..f0da94ccdc43 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -283,12 +283,12 @@ void CardReader::selectByName(SdFile dir, const char * const match) { void CardReader::printListing(SdFile parent, const char * const prepend, const uint8_t lsflags OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong/*=nullptr*/) ) { - const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, lsflags & LS_TIMESTAMP); + const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, TEST(lsflags, LS_TIMESTAMP); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) - const bool includeLong = lsflags & LS_LONG_FILENAME; + const bool includeLong = TEST(lsflags, LS_LONG_FILENAME); #endif #if ENABLED(CUSTOM_FIRMWARE_UPLOAD) - const bool onlyBin = lsflags & LS_ONLY_BIN; + const bool onlyBin = TEST(lsflags, LS_ONLY_BIN); #endif UNUSED(lsflags); dir_t p; diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 19d652d0b9ba..6fe75f760e2d 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -89,11 +89,7 @@ typedef struct { ; } card_flags_t; -enum ListingFlags : uint8_t { - LS_LONG_FILENAME = _BV(0), - LS_ONLY_BIN = _BV(1), - LS_TIMESTAMP = _BV(2) -}; +enum ListingFlags : uint8_t { LS_LONG_FILENAME, LS_ONLY_BIN, LS_TIMESTAMP }; #if ENABLED(AUTO_REPORT_SD_STATUS) #include "../libs/autoreport.h" From 44015eb57edd93a2120d3c7c5b76d3446c928c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Thu, 25 Aug 2022 23:50:16 +0200 Subject: [PATCH 6/7] Bracket. --- Marlin/src/sd/cardreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index f0da94ccdc43..3057bf68af09 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -283,7 +283,7 @@ void CardReader::selectByName(SdFile dir, const char * const match) { void CardReader::printListing(SdFile parent, const char * const prepend, const uint8_t lsflags OPTARG(LONG_FILENAME_HOST_SUPPORT, const char * const prependLong/*=nullptr*/) ) { - const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, TEST(lsflags, LS_TIMESTAMP); + const bool includeTime = TERN0(M20_TIMESTAMP_SUPPORT, TEST(lsflags, LS_TIMESTAMP)); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) const bool includeLong = TEST(lsflags, LS_LONG_FILENAME); #endif From 08c2ee7a288298f4a12d6bfcaeb2114d2dcc8c8c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Aug 2022 16:53:08 -0500 Subject: [PATCH 7/7] shift and or --- Marlin/src/gcode/sd/M20.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/sd/M20.cpp b/Marlin/src/gcode/sd/M20.cpp index d69f2b2c39af..2a7e0d08df71 100644 --- a/Marlin/src/gcode/sd/M20.cpp +++ b/Marlin/src/gcode/sd/M20.cpp @@ -42,9 +42,9 @@ void GcodeSuite::M20() { if (card.flag.mounted) { SERIAL_ECHOLNPGM(STR_BEGIN_FILE_LIST); - card.ls(TERN0(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F') * _BV(LS_ONLY_BIN)) - + TERN0(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L') * _BV(LS_LONG_FILENAME)) - + TERN0(M20_TIMESTAMP_SUPPORT, parser.boolval('T') * _BV(LS_TIMESTAMP))); + card.ls(TERN0(CUSTOM_FIRMWARE_UPLOAD, parser.boolval('F') << LS_ONLY_BIN) + | TERN0(LONG_FILENAME_HOST_SUPPORT, parser.boolval('L') << LS_LONG_FILENAME) + | TERN0(M20_TIMESTAMP_SUPPORT, parser.boolval('T') << LS_TIMESTAMP)); SERIAL_ECHOLNPGM(STR_END_FILE_LIST); } else