Browse Source

Fix M32 P subroutine handling

Scott Lahteine 6 years ago
parent
commit
d3b8f30818
3 changed files with 59 additions and 38 deletions
  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 View File

1276
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
1276
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
1277
       ) {
1277
       ) {
1278
         if (card_eof) {
1278
         if (card_eof) {
1279
-          SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
1279
+
1280
           card.printingHasFinished();
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
             #endif
1295
             #endif
1289
-            set_led_color(0, 0, 0);   // OFF
1290
-          #endif
1291
-          card.checkautostart(true);
1296
+            card.checkautostart(true);
1297
+          }
1292
         }
1298
         }
1293
         else if (n == -1) {
1299
         else if (n == -1) {
1294
           SERIAL_ERROR_START();
1300
           SERIAL_ERROR_START();
6897
 
6903
 
6898
   /**
6904
   /**
6899
    * M32: Select file and start SD Print
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
   inline void gcode_M32() {
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
     if (card.cardOK) {
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
       card.startFileprint();
6924
       card.startFileprint();
6915
 
6925
 

+ 29
- 18
Marlin/cardreader.cpp View File

302
   openFile(name, false);
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
 void CardReader::getAbsFilename(char *t) {
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
   if (!cardOK) return;
327
   if (!cardOK) return;
321
 
328
 
322
   uint8_t doing = 0;
329
   uint8_t doing = 0;
323
-    if (push_current) {
324
   if (isFileOpen()) {                     // Replacing current file or doing a subroutine
330
   if (isFileOpen()) {                     // Replacing current file or doing a subroutine
331
+    if (subcall) {
325
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
332
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
326
         SERIAL_ERROR_START();
333
         SERIAL_ERROR_START();
327
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
334
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
343
     else
350
     else
344
       doing = 1;
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
     doing = 2;
358
     doing = 2;
348
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
359
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
349
   }
360
   }
592
 }
603
 }
593
 
604
 
594
 void CardReader::chdir(const char * relpath) {
605
 void CardReader::chdir(const char * relpath) {
595
-  SdFile newfile;
606
+  SdFile newDir;
596
   SdFile *parent = &root;
607
   SdFile *parent = &root;
597
 
608
 
598
   if (workDir.isOpen()) parent = &workDir;
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
     SERIAL_ECHO_START();
612
     SERIAL_ECHO_START();
602
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
613
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
603
     SERIAL_ECHOLN(relpath);
614
     SERIAL_ECHOLN(relpath);
604
   }
615
   }
605
   else {
616
   else {
617
+    workDir = newDir;
606
     if (workDirDepth < MAX_DIR_DEPTH)
618
     if (workDirDepth < MAX_DIR_DEPTH)
607
-      workDirParents[workDirDepth++] = *parent;
608
-    workDir = newfile;
619
+      workDirParents[workDirDepth++] = workDir;
609
     #if ENABLED(SDCARD_SORT_ALPHA)
620
     #if ENABLED(SDCARD_SORT_ALPHA)
610
       presort();
621
       presort();
611
     #endif
622
     #endif
613
 }
624
 }
614
 
625
 
615
 void CardReader::updir() {
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
     #if ENABLED(SDCARD_SORT_ALPHA)
629
     #if ENABLED(SDCARD_SORT_ALPHA)
619
       presort();
630
       presort();
620
     #endif
631
     #endif

+ 1
- 1
Marlin/cardreader.h View File

45
   // device is available soon after a reset.
45
   // device is available soon after a reset.
46
 
46
 
47
   void checkautostart(bool x);
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
   void openLogFile(char* name);
49
   void openLogFile(char* name);
50
   void removeFile(const char * const name);
50
   void removeFile(const char * const name);
51
   void closefile(bool store_location=false);
51
   void closefile(bool store_location=false);

Loading…
Cancel
Save