Преглед изворни кода

Fix M32 P subroutine handling

Scott Lahteine пре 6 година
родитељ
комит
e0d367f1fb

+ 17
- 11
Marlin/src/gcode/queue.cpp Прегледај датотеку

@@ -361,19 +361,25 @@ inline void get_serial_commands() {
361 361
           || ((sd_char == '#' || sd_char == ':') && !sd_comment_mode)
362 362
       ) {
363 363
         if (card_eof) {
364
-          SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
364
+
365 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 380
             #endif
374
-            set_led_color(0, 0, 0);   // OFF
375
-          #endif
376
-          card.checkautostart(true);
381
+            card.checkautostart(true);
382
+          }
377 383
         }
378 384
         else if (n == -1) {
379 385
           SERIAL_ERROR_START();

+ 12
- 8
Marlin/src/gcode/sdcard/M20-M30_M32-M34_M928.cpp Прегледај датотеку

@@ -124,19 +124,23 @@ void GcodeSuite::M30() {
124 124
 
125 125
 /**
126 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 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 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 145
     card.startFileprint();
142 146
 

+ 32
- 21
Marlin/src/sd/cardreader.cpp Прегледај датотеку

@@ -310,26 +310,33 @@ void CardReader::openLogFile(char* name) {
310 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 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 335
   if (!cardOK) return;
329 336
 
330 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 340
       if (file_subcall_ctr > SD_PROCEDURE_DEPTH - 1) {
334 341
         SERIAL_ERROR_START();
335 342
         SERIAL_ERRORPGM("trying to call sub-gcode files with too many levels. MAX level is:");
@@ -338,20 +345,24 @@ void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
338 345
         return;
339 346
       }
340 347
 
341
-      // Store current filename and position
348
+      // Store current filename (based on workDirParents) and position
342 349
       getAbsFilename(proc_filenames[file_subcall_ctr]);
350
+      filespos[file_subcall_ctr] = sdpos;
343 351
 
344 352
       SERIAL_ECHO_START();
345 353
       SERIAL_ECHOPAIR("SUBROUTINE CALL target:\"", name);
346 354
       SERIAL_ECHOPAIR("\" parent:\"", proc_filenames[file_subcall_ctr]);
347 355
       SERIAL_ECHOLNPAIR("\" pos", sdpos);
348
-      filespos[file_subcall_ctr] = sdpos;
349 356
       file_subcall_ctr++;
350 357
     }
351 358
     else
352 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 366
     doing = 2;
356 367
     file_subcall_ctr = 0; // Reset procedure depth in case user cancels print while in procedure
357 368
   }
@@ -600,20 +611,20 @@ uint16_t CardReader::getnrfilenames() {
600 611
 }
601 612
 
602 613
 void CardReader::chdir(const char * relpath) {
603
-  SdFile newfile;
614
+  SdFile newDir;
604 615
   SdFile *parent = &root;
605 616
 
606 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 620
     SERIAL_ECHO_START();
610 621
     SERIAL_ECHOPGM(MSG_SD_CANT_ENTER_SUBDIR);
611 622
     SERIAL_ECHOLN(relpath);
612 623
   }
613 624
   else {
625
+    workDir = newDir;
614 626
     if (workDirDepth < MAX_DIR_DEPTH)
615
-      workDirParents[workDirDepth++] = *parent;
616
-    workDir = newfile;
627
+      workDirParents[workDirDepth++] = workDir;
617 628
     #if ENABLED(SDCARD_SORT_ALPHA)
618 629
       presort();
619 630
     #endif
@@ -621,8 +632,8 @@ void CardReader::chdir(const char * relpath) {
621 632
 }
622 633
 
623 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 637
     #if ENABLED(SDCARD_SORT_ALPHA)
627 638
       presort();
628 639
     #endif

+ 1
- 1
Marlin/src/sd/cardreader.h Прегледај датотеку

@@ -41,7 +41,7 @@ public:
41 41
   // device is available soon after a reset.
42 42
 
43 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 45
   void openLogFile(char* name);
46 46
   void removeFile(const char * const name);
47 47
   void closefile(bool store_location=false);

Loading…
Откажи
Сачувај