Browse Source

Clean up autostart handling

pull/1/head
Scott Lahteine 7 years ago
parent
commit
05fca752d6
  1. 12
      Marlin/src/Marlin.cpp
  2. 1
      Marlin/src/gcode/queue.cpp
  3. 13
      Marlin/src/lcd/ultralcd.cpp
  4. 62
      Marlin/src/sd/cardreader.cpp
  5. 13
      Marlin/src/sd/cardreader.h

12
Marlin/src/Marlin.cpp

@ -894,19 +894,17 @@ void setup() {
* *
* - Save or log commands to SD * - Save or log commands to SD
* - Process available commands (if not saving) * - Process available commands (if not saving)
* - Call heater manager
* - Call inactivity manager
* - Call endstop manager * - Call endstop manager
* - Call LCD update * - Call inactivity manager
*/ */
void loop() { void loop() {
#if ENABLED(SDSUPPORT)
card.checkautostart(false);
#endif
for (;;) { for (;;) {
#if ENABLED(SDSUPPORT)
card.checkautostart();
#endif
#if ENABLED(SDSUPPORT) && ENABLED(ULTIPANEL) #if ENABLED(SDSUPPORT) && ENABLED(ULTIPANEL)
if (abort_sd_printing) { if (abort_sd_printing) {
abort_sd_printing = false; abort_sd_printing = false;

1
Marlin/src/gcode/queue.cpp

@ -458,7 +458,6 @@ inline void get_serial_commands() {
leds.set_off(); leds.set_off();
#endif #endif
#endif // PRINTER_EVENT_LEDS #endif // PRINTER_EVENT_LEDS
card.checkautostart(true);
} }
} }
else if (n == -1) { else if (n == -1) {

13
Marlin/src/lcd/ultralcd.cpp

@ -1814,11 +1814,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
#if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)
void lcd_autostart_sd() { void lcd_autostart_sd() { card.beginautostart(); }
card.autostart_index = 0;
card.setroot();
card.checkautostart(true);
}
#endif #endif
@ -5131,9 +5127,12 @@ void lcd_update() {
lcd_sd_status = sd_status; lcd_sd_status = sd_status;
if (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(); 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 { else {
card.release(); card.release();

62
Marlin/src/sd/cardreader.cpp

@ -62,15 +62,13 @@ CardReader::CardReader() {
workDirDepth = 0; workDirDepth = 0;
ZERO(workDirParents); 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. // Disable autostart until card is initialized
autostart_index = 0; autostart_index = -1;
//power to SD reader //power to SD reader
#if SDPOWER > -1 #if SDPOWER > -1
OUT_WRITE(SDPOWER, HIGH); OUT_WRITE(SDPOWER, HIGH);
#endif // SDPOWER #endif
next_autostart_ms = millis() + 5000;
} }
char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters char *createFilename(char *buffer, const dir_t &p) { //buffer > 12characters
@ -607,40 +605,42 @@ void CardReader::write_command(char *buf) {
} }
} }
void CardReader::checkautostart(bool force) { //
if (!force && (!autostart_stilltocheck || PENDING(millis(), next_autostart_ms))) // Run the next autostart file. Called:
return; // - On boot after successful card init
// - After finishing the previous autostart file
autostart_stilltocheck = false; // - From the LCD command to run the autostart file
//
if (!cardOK) { void CardReader::checkautostart() {
initsd();
if (!cardOK) return; // fail
}
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]);
dir_t p; if (autostart_index < 0 || sdprinting) return;
root.rewind(); if (!cardOK) initsd();
bool found = false; if (cardOK) {
while (root.readDir(p, NULL) > 0) { char autoname[10];
for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]); sprintf_P(autoname, PSTR("auto%i.g"), autostart_index);
if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) { dir_t p;
openAndPrintFile(autoname); root.rewind();
found = true; 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;
autostart_index = -1; }
else
autostart_index++; void CardReader::beginautostart() {
autostart_index = 0;
setroot();
} }
void CardReader::closefile(bool store_location) { void CardReader::closefile(const bool store_location) {
file.sync(); file.sync();
file.close(); file.close();
saving = logging = false; saving = logging = false;

13
Marlin/src/sd/cardreader.h

@ -39,16 +39,14 @@ public:
void initsd(); void initsd();
void write_command(char *buf); 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 openFile(char* name, const bool read, const bool subcall=false);
void openLogFile(char* name); void openLogFile(char* name);
void removeFile(const char * const name); void removeFile(const char * const name);
void closefile(bool store_location=false); void closefile(const bool store_location=false);
void release(); void release();
void openAndPrintFile(const char *name); void openAndPrintFile(const char *name);
void startFileprint(); void startFileprint();
@ -212,9 +210,6 @@ private:
char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH]; char proc_filenames[SD_PROCEDURE_DEPTH][MAXPATHNAMELENGTH];
uint32_t filesize, sdpos; 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. 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. 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; char* diveDirName;

Loading…
Cancel
Save