diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 5ca60e2db4d..7080d758365 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<seconds>' set the SD status auto-report interval. (Requires AUTO_REPORT_SD_STATUS) + * M27 - Report SD print status. (Requires SDSUPPORT) + * OR, with 'S<seconds>' 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<seconds>' 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 c2a3e33a171..8f8b6eba6ac 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -141,7 +141,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m case LS_SerialPrint: createFilename(filename, p); - SERIAL_PROTOCOL(prepend); + if (prepend) SERIAL_PROTOCOL(prepend); SERIAL_PROTOCOL(filename); SERIAL_PROTOCOLCHAR(' '); SERIAL_PROTOCOLLN(p.fileSize); @@ -164,7 +164,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m void CardReader::ls() { lsAction = LS_SerialPrint; root.rewind(); - lsDive("", root); + lsDive(NULL, root); } #if ENABLED(LONG_FILENAME_HOST_SUPPORT) @@ -199,7 +199,7 @@ void CardReader::ls() { // Find the item, setting the long filename diveDir.rewind(); - lsDive("", diveDir, segment); + lsDive(NULL, diveDir, segment); // Print /LongNamePart to serial output SERIAL_PROTOCOLCHAR('/'); @@ -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); @@ -603,7 +629,7 @@ void CardReader::getfilename(uint16_t nr, const char * const match/*=NULL*/) { lsAction = LS_GetFilename; nrFile_index = nr; curDir->rewind(); - lsDive("", *curDir, match); + lsDive(NULL, *curDir, match); } uint16_t CardReader::getnrfilenames() { @@ -611,7 +637,7 @@ uint16_t CardReader::getnrfilenames() { lsAction = LS_Count; nrFiles = 0; curDir->rewind(); - lsDive("", *curDir); + lsDive(NULL, *curDir); //SERIAL_ECHOLN(nrFiles); return nrFiles; } diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h index d0d3ae06f27..d9c068e4df0 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);