From a560c0f7cd8f5c02e35e309926530b07442542d8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 15 Mar 2018 22:20:12 -0500 Subject: [PATCH] Add C parameter to M27 to get the current filename In answer to #10001 Add an option to retrieve the currently open file name (long filename if possible). --- Marlin/Marlin_main.cpp | 20 +++++++++++++++----- Marlin/cardreader.cpp | 26 ++++++++++++++++++++++++++ Marlin/cardreader.h | 1 + 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 5ca60e2db..7080d7583 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -89,7 +89,9 @@ * M24 - Start/resume SD print. (Requires SDSUPPORT) * M25 - Pause SD print. (Requires SDSUPPORT) * M26 - Set SD position in bytes: "M26 S12345". (Requires SDSUPPORT) - * M27 - Report SD print status. (Requires SDSUPPORT) Or, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * M27 - Report SD print status. (Requires SDSUPPORT) + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. * M28 - Start SD write: "M28 /path/file.gco". (Requires SDSUPPORT) * M29 - Stop SD write. (Requires SDSUPPORT) * M30 - Delete file from SD: "M30 /path/file.gco" @@ -6882,15 +6884,23 @@ inline void gcode_M17() { } /** - * M27: Get SD Card status or set the SD status auto-report interval. + * M27: Get SD Card status + * OR, with 'S' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * OR, with 'C' get the current filename. */ inline void gcode_M27() { + if (parser.seen('C')) { + SERIAL_ECHOPGM("Current file: "); + card.printFilename(); + } + #if ENABLED(AUTO_REPORT_SD_STATUS) - if (parser.seenval('S')) + else if (parser.seenval('S')) card.set_auto_report_interval(parser.value_byte()); - else #endif - card.getStatus(); + + else + card.getStatus(); } /** diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp index 3b1fe36f9..8f8b6eba6 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -230,6 +230,28 @@ void CardReader::ls() { #endif // LONG_FILENAME_HOST_SUPPORT +/** + * Echo the DOS 8.3 filename (and long filename, if any) + */ +void CardReader::printFilename() { + if (file.isOpen()) { + char lfilename[FILENAME_LENGTH]; + file.getFilename(lfilename); + SERIAL_ECHO(lfilename); + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + getfilename(0, lfilename); + if (longFilename[0]) { + SERIAL_ECHO(' '); + SERIAL_ECHO(longFilename); + } + #endif + } + else + SERIAL_ECHOPGM("(no file)"); + + SERIAL_EOL(); +} + void CardReader::initsd() { cardOK = false; if (root.isOpen()) root.close(); @@ -428,8 +450,12 @@ void CardReader::openFile(char* name, const bool read, const bool subcall/*=fals SERIAL_PROTOCOLPAIR(MSG_SD_FILE_OPENED, fname); SERIAL_PROTOCOLLNPAIR(MSG_SD_SIZE, filesize); SERIAL_PROTOCOLLNPGM(MSG_SD_FILE_SELECTED); + getfilename(0, fname); lcd_setstatus(longFilename[0] ? longFilename : fname); + //if (longFilename[0]) { + // SERIAL_PROTOCOLPAIR(MSG_SD_FILE_LONG_NAME, longFilename); + //} } else { SERIAL_PROTOCOLPAIR(MSG_SD_OPEN_FILE_FAIL, fname); diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h index d0d3ae06f..d9c068e4d 100644 --- a/Marlin/cardreader.h +++ b/Marlin/cardreader.h @@ -61,6 +61,7 @@ public: ); void getStatus(); void printingHasFinished(); + void printFilename(); #if ENABLED(LONG_FILENAME_HOST_SUPPORT) void printLongPath(char *path);