Quellcode durchsuchen

Fix M32 P subroutine handling

Scott Lahteine vor 6 Jahren
Ursprung
Commit
d3b8f30818
3 geänderte Dateien mit 59 neuen und 38 gelöschten Zeilen
  1. 29
    19
      Marlin/Marlin_main.cpp
  2. 29
    18
      Marlin/cardreader.cpp
  3. 1
    1
      Marlin/cardreader.h

+ 29
- 19
Marlin/Marlin_main.cpp Datei anzeigen

@@ -1276,19 +1276,25 @@ inline void get_serial_commands() {
1276 1276
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
1277 1277
       ) {
1278 1278
         if (card_eof) {
1279
-          SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
1279
+
1280 1280
           card.printingHasFinished();
1281
-          #if ENABLED(PRINTER_EVENT_LEDS)
1282
-            LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS);
1283
-            set_led_color(0, 255, 0); // Green
1284
-            #if HAS_RESUME_CONTINUE
1285
-              enqueue_and_echo_commands_P(PSTR("M0")); // end of the queue!
1286
-            #else
1287
-              safe_delay(1000);
1281
+
1282
+          if (card.sdprinting)
1283
+            sd_count = 0; // If a sub-file was printing, continue from call point
1284
+          else {
1285
+            SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
1286
+            #if ENABLED(PRINTER_EVENT_LEDS)
1287
+              LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS);
1288
+              set_led_color(0, 255, 0); // Green
1289
+              #if HAS_RESUME_CONTINUE
1290
+                enqueue_and_echo_commands_P(PSTR("M0")); // end of the queue!
1291
+              #else
1292
+                safe_delay(1000);
1293
+              #endif
1294
+              set_led_color(0, 0, 0);   // OFF
1288 1295
             #endif
1289
-            set_led_color(0, 0, 0);   // OFF
1290
-          #endif
1291
-          card.checkautostart(true);
1296
+            card.checkautostart(true);
1297
+          }
1292 1298
         }
1293 1299
         else if (n == -1) {
1294 1300
           SERIAL_ERROR_START();
@@ -6897,19 +6903,23 @@ inline void gcode_M31() {
6897 6903
 
6898 6904
   /**
6899 6905
    * M32: Select file and start SD Print
6906
+   *
6907
+   * Examples:
6908
+   *
6909
+   *    M32 !PATH/TO/FILE.GCO#      ; Start FILE.GCO
6910
+   *    M32 P !PATH/TO/FILE.GCO#    ; Start FILE.GCO as a procedure
6911
+   *    M32 S60 !PATH/TO/FILE.GCO#  ; Start FILE.GCO at byte 60
6912
+   *
6900 6913
    */
6901 6914
   inline void gcode_M32() {
6902
-    if (card.sdprinting)
6903
-      stepper.synchronize();
6904
-
6905
-    char* namestartpos = parser.string_arg;
6906
-    const bool call_procedure = parser.boolval('P');
6915
+    if (card.sdprinting) stepper.synchronize();
6907 6916
 
6908 6917
     if (card.cardOK) {
6909
-      card.openFile(namestartpos, true, call_procedure);
6918
+      const bool call_procedure = parser.boolval('P');
6919
+
6920
+      card.openFile(parser.string_arg, true, call_procedure);
6910 6921
 
6911
-      if (parser.seenval('S'))
6912
-        card.setIndex(parser.value_long());
6922
+      if (parser.seenval('S')) card.setIndex(parser.value_long());
6913 6923
 
6914 6924
       card.startFileprint();
6915 6925
 

+ 29
- 18
Marlin/cardreader.cpp Datei anzeigen

@@ -302,26 +302,33 @@ void CardReader::openLogFile(char* name) {
302 302
   openFile(name, false);
303 303
 }
304 304
 
305
+void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) {
306
+  file.getFilename(dst);
307
+  while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; }
308
+  if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; }
309
+}
310
+
305 311
 void CardReader::getAbsFilename(char *t) {
306
-  uint8_t cnt = 0;
307
-  *t = '/'; t++; cnt++;
308
-  for (uint8_t i = 0; i < workDirDepth; i++) {
309
-    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
310
-    while (*t && cnt < MAXPATHNAMELENGTH) { t++; cnt++; } //crawl counter forward.
312
+  *t++ = '/';                                               // Root folder
313
+  uint8_t cnt = 1;
314
+
315
+  for (uint8_t i = 0; i < workDirDepth; i++)                // Loop to current work dir
316
+    appendAtom(workDirParents[i], t, cnt);
317
+
318
+  if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH)) {
319
+    appendAtom(file, t, cnt);
320
+    --t;
311 321
   }
312
-  if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH))
313
-    file.getFilename(t);
314
-  else
315
-    t[0] = 0;
322
+  *t = '\0';
316 323
 }
317 324
 
318
-void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
325
+void CardReader::openFile(char* name, const bool read, const bool subcall/*=false*/) {
319 326
 
320 327
   if (!cardOK) return;
321 328
 
322 329
   uint8_t doing = 0;
323
-    if (push_current) {
324 330
   if (isFileOpen()) {                     // Replacing current file or doing a subroutine
331
+    if (subcall) {
325 332
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
326 333
         SERIAL_ERROR_START();
327 334
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
@@ -343,7 +350,11 @@ void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
343 350
     else
344 351
       doing = 1;
345 352
   }
346
-  else { // Opening fresh file
353
+  else if (subcall) {     // Returning from a subcall?
354
+    SERIAL_ECHO_START();
355
+    SERIAL_ECHOLNPGM("END SUBROUTINE");
356
+  }
357
+  else {                  // Opening fresh file
347 358
     doing = 2;
348 359
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
349 360
   }
@@ -592,20 +603,20 @@ uint16_t CardReader::getnrfilenames() {
592 603
 }
593 604
 
594 605
 void CardReader::chdir(const char * relpath) {
595
-  SdFile newfile;
606
+  SdFile newDir;
596 607
   SdFile *parent = &root;
597 608
 
598 609
   if (workDir.isOpen()) parent = &workDir;
599 610
 
600
-  if (!newfile.open(*parent, relpath, O_READ)) {
611
+  if (!newDir.open(*parent, relpath, O_READ)) {
601 612
     SERIAL_ECHO_START();
602 613
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
603 614
     SERIAL_ECHOLN(relpath);
604 615
   }
605 616
   else {
617
+    workDir = newDir;
606 618
     if (workDirDepth < MAX_DIR_DEPTH)
607
-      workDirParents[workDirDepth++] = *parent;
608
-    workDir = newfile;
619
+      workDirParents[workDirDepth++] = workDir;
609 620
     #if ENABLED(SDCARD_SORT_ALPHA)
610 621
       presort();
611 622
     #endif
@@ -613,8 +624,8 @@ void CardReader::chdir(const char * relpath) {
613 624
 }
614 625
 
615 626
 void CardReader::updir() {
616
-  if (workDirDepth > 0) {
617
-    workDir = workDirParents[--workDirDepth];
627
+  if (workDirDepth > 0) {                                           // At least 1 dir has been saved
628
+    workDir = --workDirDepth ? workDirParents[workDirDepth] : root; // Use parent, or root if none
618 629
     #if ENABLED(SDCARD_SORT_ALPHA)
619 630
       presort();
620 631
     #endif

+ 1
- 1
Marlin/cardreader.h Datei anzeigen

@@ -45,7 +45,7 @@ public:
45 45
   // device is available soon after a reset.
46 46
 
47 47
   void checkautostart(bool x);
48
-  void openFile(char* name, bool read, bool push_current=false);
48
+  void openFile(char* name, const bool read, const bool subcall=false);
49 49
   void openLogFile(char* name);
50 50
   void removeFile(const char * const name);
51 51
   void closefile(bool store_location=false);

Laden…
Abbrechen
Speichern