瀏覽代碼

Fix M32 P subroutine handling

Scott Lahteine 7 年之前
父節點
當前提交
e0d367f1fb
共有 4 個文件被更改,包括 62 次插入41 次删除
  1. 17
    11
      Marlin/src/gcode/queue.cpp
  2. 12
    8
      Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp
  3. 32
    21
      Marlin/src/sd/cardreader.cpp
  4. 1
    1
      Marlin/src/sd/cardreader.h

+ 17
- 11
Marlin/src/gcode/queue.cpp 查看文件

361
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
361
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
362
       ) {
362
       ) {
363
         if (card_eof) {
363
         if (card_eof) {
364
-          SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
364
+
365
           card.printingHasFinished();
365
           card.printingHasFinished();
366
-          #if ENABLED(PRINTER_EVENT_LEDS)
367
-            LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS);
368
-            set_led_color(0, 255, 0); // Green
369
-            #if HAS_RESUME_CONTINUE
370
-              enqueue_and_echo_commands_P(PSTR("M0")); // end of the queue!
371
-            #else
372
-              safe_delay(1000);
366
+
367
+          if (card.sdprinting)
368
+            sd_count = 0; // If a sub-file was printing, continue from call point
369
+          else {
370
+            SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
371
+            #if ENABLED(PRINTER_EVENT_LEDS)
372
+              LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS);
373
+              set_led_color(0, 255, 0); // Green
374
+              #if HAS_RESUME_CONTINUE
375
+                enqueue_and_echo_commands_P(PSTR("M0")); // end of the queue!
376
+              #else
377
+                safe_delay(1000);
378
+              #endif
379
+              set_led_color(0, 0, 0);   // OFF
373
             #endif
380
             #endif
374
-            set_led_color(0, 0, 0);   // OFF
375
-          #endif
376
-          card.checkautostart(true);
381
+            card.checkautostart(true);
382
+          }
377
         }
383
         }
378
         else if (n == -1) {
384
         else if (n == -1) {
379
           SERIAL_ERROR_START();
385
           SERIAL_ERROR_START();

+ 12
- 8
Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp 查看文件

124
 
124
 
125
 /**
125
 /**
126
  * M32: Select file and start SD Print
126
  * M32: Select file and start SD Print
127
+ *
128
+ * Examples:
129
+ *
130
+ *    M32 !PATH/TO/FILE.GCO#      ; Start FILE.GCO
131
+ *    M32 P !PATH/TO/FILE.GCO#    ; Start FILE.GCO as a procedure
132
+ *    M32 S60 !PATH/TO/FILE.GCO#  ; Start FILE.GCO at byte 60
133
+ *
127
  */
134
  */
128
 void GcodeSuite::M32() {
135
 void GcodeSuite::M32() {
129
-  if (IS_SD_PRINTING)
130
-    stepper.synchronize();
131
-
132
-  char* namestartpos = parser.string_arg;
133
-  const bool call_procedure = parser.boolval('P');
136
+  if (card.sdprinting) stepper.synchronize();
134
 
137
 
135
   if (card.cardOK) {
138
   if (card.cardOK) {
136
-    card.openFile(namestartpos, true, call_procedure);
139
+    const bool call_procedure = parser.boolval('P');
140
+
141
+    card.openFile(parser.string_arg, true, call_procedure);
137
 
142
 
138
-    if (parser.seenval('S'))
139
-      card.setIndex(parser.value_long());
143
+    if (parser.seenval('S')) card.setIndex(parser.value_long());
140
 
144
 
141
     card.startFileprint();
145
     card.startFileprint();
142
 
146
 

+ 32
- 21
Marlin/src/sd/cardreader.cpp 查看文件

310
   openFile(name, false);
310
   openFile(name, false);
311
 }
311
 }
312
 
312
 
313
+void appendAtom(SdFile &file, char *& dst, uint8_t &cnt) {
314
+  file.getFilename(dst);
315
+  while (*dst && cnt < MAXPATHNAMELENGTH) { dst++; cnt++; }
316
+  if (cnt < MAXPATHNAMELENGTH) { *dst = '/'; dst++; cnt++; }
317
+}
318
+
313
 void CardReader::getAbsFilename(char *t) {
319
 void CardReader::getAbsFilename(char *t) {
314
-  uint8_t cnt = 0;
315
-  *t = '/'; t++; cnt++;
316
-  for (uint8_t i = 0; i < workDirDepth; i++) {
317
-    workDirParents[i].getFilename(t); //SDBaseFile.getfilename!
318
-    while (*t && cnt < MAXPATHNAMELENGTH) { t++; cnt++; } //crawl counter forward.
320
+  *t++ = '/';                                               // Root folder
321
+  uint8_t cnt = 1;
322
+
323
+  for (uint8_t i = 0; i < workDirDepth; i++)                // Loop to current work dir
324
+    appendAtom(workDirParents[i], t, cnt);
325
+
326
+  if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH)) {
327
+    appendAtom(file, t, cnt);
328
+    --t;
319
   }
329
   }
320
-  if (cnt < MAXPATHNAMELENGTH - (FILENAME_LENGTH))
321
-    file.getFilename(t);
322
-  else
323
-    t[0] = 0;
330
+  *t = '\0';
324
 }
331
 }
325
 
332
 
326
-void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
333
+void CardReader::openFile(char* name, const bool read, const bool subcall/*=false*/) {
327
 
334
 
328
   if (!cardOK) return;
335
   if (!cardOK) return;
329
 
336
 
330
   uint8_t doing = 0;
337
   uint8_t doing = 0;
331
-  if (isFileOpen()) { //replacing current file by new file, or subfile call
332
-    if (push_current) {
338
+  if (isFileOpen()) {                     // Replacing current file or doing a subroutine
339
+    if (subcall) {
333
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
340
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
334
         SERIAL_ERROR_START();
341
         SERIAL_ERROR_START();
335
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
342
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
338
         return;
345
         return;
339
       }
346
       }
340
 
347
 
341
-      // Store current filename and position
348
+      // Store current filename (based on workDirParents) and position
342
       getAbsFilename(proc_filenames[file_subcall_ctr]);
349
       getAbsFilename(proc_filenames[file_subcall_ctr]);
350
+      filespos[file_subcall_ctr] = sdpos;
343
 
351
 
344
       SERIAL_ECHO_START();
352
       SERIAL_ECHO_START();
345
       SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", name);
353
       SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", name);
346
       SERIAL_ECHOPAIR("\" parent:\"", proc_filenames[file_subcall_ctr]);
354
       SERIAL_ECHOPAIR("\" parent:\"", proc_filenames[file_subcall_ctr]);
347
       SERIAL_ECHOLNPAIR("\" pos", sdpos);
355
       SERIAL_ECHOLNPAIR("\" pos", sdpos);
348
-      filespos[file_subcall_ctr] = sdpos;
349
       file_subcall_ctr++;
356
       file_subcall_ctr++;
350
     }
357
     }
351
     else
358
     else
352
       doing = 1;
359
       doing = 1;
353
   }
360
   }
354
-  else { // Opening fresh file
361
+  else if (subcall) {     // Returning from a subcall?
362
+    SERIAL_ECHO_START();
363
+    SERIAL_ECHOLNPGM("END SUBROUTINE");
364
+  }
365
+  else {                  // Opening fresh file
355
     doing = 2;
366
     doing = 2;
356
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
367
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
357
   }
368
   }
600
 }
611
 }
601
 
612
 
602
 void CardReader::chdir(const char * relpath) {
613
 void CardReader::chdir(const char * relpath) {
603
-  SdFile newfile;
614
+  SdFile newDir;
604
   SdFile *parent = &root;
615
   SdFile *parent = &root;
605
 
616
 
606
   if (workDir.isOpen()) parent = &workDir;
617
   if (workDir.isOpen()) parent = &workDir;
607
 
618
 
608
-  if (!newfile.open(*parent, relpath, O_READ)) {
619
+  if (!newDir.open(*parent, relpath, O_READ)) {
609
     SERIAL_ECHO_START();
620
     SERIAL_ECHO_START();
610
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
621
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
611
     SERIAL_ECHOLN(relpath);
622
     SERIAL_ECHOLN(relpath);
612
   }
623
   }
613
   else {
624
   else {
625
+    workDir = newDir;
614
     if (workDirDepth < MAX_DIR_DEPTH)
626
     if (workDirDepth < MAX_DIR_DEPTH)
615
-      workDirParents[workDirDepth++] = *parent;
616
-    workDir = newfile;
627
+      workDirParents[workDirDepth++] = workDir;
617
     #if ENABLED(SDCARD_SORT_ALPHA)
628
     #if ENABLED(SDCARD_SORT_ALPHA)
618
       presort();
629
       presort();
619
     #endif
630
     #endif
621
 }
632
 }
622
 
633
 
623
 void CardReader::updir() {
634
 void CardReader::updir() {
624
-  if (workDirDepth > 0) {
625
-    workDir = workDirParents[--workDirDepth];
635
+  if (workDirDepth > 0) {                                           // At least 1 dir has been saved
636
+    workDir = --workDirDepth ? workDirParents[workDirDepth] : root; // Use parent, or root if none
626
     #if ENABLED(SDCARD_SORT_ALPHA)
637
     #if ENABLED(SDCARD_SORT_ALPHA)
627
       presort();
638
       presort();
628
     #endif
639
     #endif

+ 1
- 1
Marlin/src/sd/cardreader.h 查看文件

41
   // device is available soon after a reset.
41
   // device is available soon after a reset.
42
 
42
 
43
   void checkautostart(bool x);
43
   void checkautostart(bool x);
44
-  void openFile(char* name, bool read, bool push_current=false);
44
+  void openFile(char* name, const bool read, const bool subcall=false);
45
   void openLogFile(char* name);
45
   void openLogFile(char* name);
46
   void removeFile(const char * const name);
46
   void removeFile(const char * const name);
47
   void closefile(bool store_location=false);
47
   void closefile(bool store_location=false);

Loading…
取消
儲存