diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 548987c96f68bb5f8c732be1739103a6878db075..3fd16a95fc800455f5ae2a96bf355f454cfb183d 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -85,7 +85,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"
diff --git a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp
index 0901d6359a49d809383aa9d2313033669bb713cd..59d45492a639d960e29dd86a0ed8adeb59bea431 100644
--- a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp
+++ b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp
@@ -107,24 +107,35 @@ void GcodeSuite::M26() {
}
/**
- * 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.
*/
void GcodeSuite::M27() {
+ #if NUM_SERIAL > 1
+ const int16_t port = command_queue_port[cmd_queue_index_r];
+ #endif
+
+ if (parser.seen('C')) {
+ SERIAL_ECHOPGM_P(port, "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()
#if NUM_SERIAL > 1
- , command_queue_port[cmd_queue_index_r]
+ , port
#endif
);
- }
- else
#endif
- card.getStatus(
- #if NUM_SERIAL > 1
- command_queue_port[cmd_queue_index_r]
- #endif
- );
+
+ else
+ card.getStatus(
+ #if NUM_SERIAL > 1
+ port
+ #endif
+ );
}
/**
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 10e4396824e82733880a0f95f12823044a2a324a..5aba4c62f51febfd24b6e9100115cf4f2c7285fb 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -262,6 +262,32 @@ void CardReader::ls(
#endif // LONG_FILENAME_HOST_SUPPORT
+/**
+ * Echo the DOS 8.3 filename (and long filename, if any)
+ */
+void CardReader::printFilename(
+ #if NUM_SERIAL > 1
+ const int8_t port/*= -1*/
+ #endif
+) {
+ if (file.isOpen()) {
+ char lfilename[FILENAME_LENGTH];
+ file.getFilename(lfilename);
+ SERIAL_ECHO_P(port, lfilename);
+ #if ENABLED(LONG_FILENAME_HOST_SUPPORT)
+ getfilename(0, lfilename);
+ if (longFilename[0]) {
+ SERIAL_ECHO_P(port, ' ');
+ SERIAL_ECHO_P(port, longFilename);
+ }
+ #endif
+ }
+ else
+ SERIAL_ECHOPGM_P(port, "(no file)");
+
+ SERIAL_EOL_P(port);
+}
+
void CardReader::initsd() {
cardOK = false;
if (root.isOpen()) root.close();
@@ -460,8 +486,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/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h
index db4e7f216af7f50bf953b6194ed79034eb00575f..66a23d47c516f822b2722f5afc56ae6952a3881a 100644
--- a/Marlin/src/sd/cardreader.h
+++ b/Marlin/src/sd/cardreader.h
@@ -63,6 +63,11 @@ public:
#endif
);
void printingHasFinished();
+ void printFilename(
+ #if NUM_SERIAL > 1
+ const int8_t port = -1
+ #endif
+ );
#if ENABLED(LONG_FILENAME_HOST_SUPPORT)
void printLongPath(char *path