Clean up autostart handling
This commit is contained in:
parent
c87b0e21be
commit
05fca752d6
5 changed files with 46 additions and 55 deletions
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,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
|
||||||
|
// - From the LCD command to run the autostart file
|
||||||
|
//
|
||||||
|
|
||||||
autostart_stilltocheck = false;
|
void CardReader::checkautostart() {
|
||||||
|
|
||||||
if (!cardOK) {
|
if (autostart_index < 0 || sdprinting) return;
|
||||||
initsd();
|
|
||||||
if (!cardOK) return; // fail
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!cardOK) initsd();
|
||||||
|
|
||||||
|
if (cardOK) {
|
||||||
char autoname[10];
|
char autoname[10];
|
||||||
sprintf_P(autoname, PSTR("auto%i.g"), autostart_index);
|
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;
|
dir_t p;
|
||||||
|
|
||||||
root.rewind();
|
root.rewind();
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
while (root.readDir(p, NULL) > 0) {
|
while (root.readDir(p, NULL) > 0) {
|
||||||
for (int8_t i = (int8_t)strlen((char*)p.name); i--;) p.name[i] = tolower(p.name[i]);
|
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) {
|
if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) {
|
||||||
openAndPrintFile(autoname);
|
openAndPrintFile(autoname);
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
autostart_index = -1;
|
|
||||||
else
|
|
||||||
autostart_index++;
|
autostart_index++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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.sync();
|
||||||
file.close();
|
file.close();
|
||||||
saving = logging = false;
|
saving = logging = false;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Reference in a new issue