From 3c5f0ce85860cee66e93cf7b9af7731c4f963616 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 30 Apr 2018 23:38:02 -0500 Subject: [PATCH] Clean up autostart handling --- Marlin/Marlin_main.cpp | 3 +- Marlin/cardreader.cpp | 62 +++++++++++++++++++++--------------------- Marlin/cardreader.h | 13 +++------ Marlin/ultralcd.cpp | 13 ++++----- 4 files changed, 42 insertions(+), 49 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 38ecb1118..8704d781d 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1200,7 +1200,6 @@ inline void get_serial_commands() { leds.set_off(); #endif #endif // PRINTER_EVENT_LEDS - card.checkautostart(true); } } else if (n == -1) { @@ -14413,7 +14412,7 @@ void loop() { #if ENABLED(SDSUPPORT) - card.checkautostart(false); + card.checkautostart(); #if ENABLED(ULTIPANEL) if (abort_sd_printing) { diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp index 581e0ec5a..38c6d1001 100644 --- a/Marlin/cardreader.cpp +++ b/Marlin/cardreader.cpp @@ -54,15 +54,13 @@ CardReader::CardReader() { workDirDepth = 0; ZERO(workDirParents); - autostart_stilltocheck = true; //the SD start is delayed, because otherwise the serial cannot answer fast enough to make contact with the host software. - autostart_index = 0; + // Disable autostart until card is initialized + autostart_index = -1; //power to SD reader #if SDPOWER > -1 OUT_WRITE(SDPOWER, HIGH); - #endif // SDPOWER - - next_autostart_ms = millis() + 5000; + #endif } char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters @@ -566,40 +564,42 @@ void CardReader::write_command(char *buf) { } } -void CardReader::checkautostart(bool force) { - if (!force && (!autostart_stilltocheck || PENDING(millis(), next_autostart_ms))) - return; +// +// Run the next autostart file. Called: +// - On boot after successful card init +// - After finishing the previous autostart file +// - From the LCD command to run the autostart file +// - autostart_stilltocheck = false; +void CardReader::checkautostart() { - if (!cardOK) { - initsd(); - if (!cardOK) return; // fail - } + if (autostart_index < 0 || sdprinting) return; - char autoname[10]; - sprintf_P(autoname, PSTR("auto%i.g"), autostart_index); - for (int8_t i = 0; i < (int8_t)strlen(autoname); i++) autoname[i] = tolower(autoname[i]); + if (!cardOK) initsd(); - dir_t p; - - root.rewind(); - - bool found = false; - while (root.readDir(p, NULL) > 0) { - for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); - if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { - openAndPrintFile(autoname); - found = true; + if (cardOK) { + char autoname[10]; + sprintf_P(autoname, PSTR("auto%i.g"), autostart_index); + dir_t p; + root.rewind(); + while (root.readDir(p, NULL) > 0) { + for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); + if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { + openAndPrintFile(autoname); + autostart_index++; + return; + } } } - if (!found) - autostart_index = -1; - else - autostart_index++; + autostart_index = -1; } -void CardReader::closefile(bool store_location) { +void CardReader::beginautostart() { + autostart_index = 0; + setroot(); +} + +void CardReader::closefile(const bool store_location) { file.sync(); file.close(); saving = logging = false; diff --git a/Marlin/cardreader.h b/Marlin/cardreader.h index a7bb1cd46..c74a45048 100644 --- a/Marlin/cardreader.h +++ b/Marlin/cardreader.h @@ -41,16 +41,14 @@ public: void initsd(); void write_command(char *buf); - // Files auto[0-9].g on the sd card are performed in sequence. - // This is to delay autostart and hence the initialisation of - // the sd card to some seconds after the normal init, so the - // device is available soon after a reset. - void checkautostart(bool x); + void beginautostart(); + void checkautostart(); + void openFile(char* name, const bool read, const bool subcall=false); void openLogFile(char* name); void removeFile(const char * const name); - void closefile(bool store_location=false); + void closefile(const bool store_location=false); void release(); void openAndPrintFile(const char *name); void startFileprint(); @@ -189,9 +187,6 @@ private: char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; uint32_t filesize, sdpos; - millis_t next_autostart_ms; - bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. - LsAction lsAction; //stored for recursion. uint16_t nrFiles; //counter for the files in the current directory and recycled as position counter for getting the nrFiles'th name in the directory. char* diveDirName; diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index d7688f85d..5c7b30235 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -1802,11 +1802,7 @@ void lcd_quick_feedback(const bool clear_buttons) { #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) - void lcd_autostart_sd() { - card.autostart_index = 0; - card.setroot(); - card.checkautostart(true); - } + void lcd_autostart_sd() { card.beginautostart(); } #endif @@ -5136,9 +5132,12 @@ void lcd_update() { lcd_sd_status = sd_status; if (sd_status) { - safe_delay(1000); // some boards need a delay or the LCD won't show the new status + safe_delay(500); // Some boards need a delay to get settled card.initsd(); - if (old_sd_status != 2) LCD_MESSAGEPGM(MSG_SD_INSERTED); + if (old_sd_status == 2) + card.beginautostart(); // Initial boot + else + LCD_MESSAGEPGM(MSG_SD_INSERTED); } else { card.release();