diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 61d7c2c75..bfb940ef4 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -356,3 +356,7 @@ void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); void proc_commands(); +bool check_commands(); +bool search_end_command(); +void empty_buffer(); +void show_buffer(); \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b1f2a5f55..79d6c3b73 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1405,8 +1405,34 @@ void proc_commands() { } } +bool check_commands() { + bool ret = false; + + if (buflen) + { + //SERIAL_ECHOLNPGM("search_end "); + ret = search_end_command(); + if (!cmdbuffer_front_already_processed) + cmdqueue_pop_front(); + cmdbuffer_front_already_processed = false; + } + return ret; +} + +void show_buffer() { + SERIAL_ECHOPGM("bufindr:"); + MYSERIAL.println(bufindr); + SERIAL_ECHOPGM("bufindw:"); + MYSERIAL.println(bufindw); +} + +void empty_buffer() { + bufindr = bufindw; +} + void get_command() { + //show_buffer(); // Test and reserve space for the new command string. if (!cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1)) return; @@ -2076,6 +2102,16 @@ void ramming() { } } */ + +bool search_end_command() +{ + //SERIAL_ECHOLNPGM("E"); + bool return_value = false; + if (code_seen("M84")) return_value = true; + return return_value; + +} + void process_commands() { #ifdef FILAMENT_RUNOUT_SUPPORT diff --git a/Firmware/SdBaseFile.cpp b/Firmware/SdBaseFile.cpp index be04ab1a2..d8eca5fc8 100644 --- a/Firmware/SdBaseFile.cpp +++ b/Firmware/SdBaseFile.cpp @@ -277,6 +277,8 @@ int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ + + bool SdBaseFile::getFilename(char* name) { if (!isOpen()) return false; diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index db20b6a86..b37b42233 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -162,6 +162,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m } // while readDir } + void CardReader::ls() { lsAction=LS_SerialPrint; @@ -500,6 +501,11 @@ void CardReader::removeFile(char* name) } +void CardReader::getFileSize() +{ + public_fileSize = filesize; +} + void CardReader::getStatus() { if(sdprinting){ @@ -964,7 +970,7 @@ void CardReader::printingHasFinished() if(SD_FINISHED_STEPPERRELEASE) { //finishAndDisableSteppers(); - enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + //enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } autotempShutdown(); #ifdef SDCARD_SORT_ALPHA diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 3ef9ff297..ccc8df3f6 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -27,6 +27,7 @@ public: void release(); void startFileprint(); void pauseSDPrint(); + void getFileSize(); void getStatus(); void printingHasFinished(); @@ -69,9 +70,11 @@ public: bool cardOK ; char filename[13]; uint16_t creationTime, creationDate; + uint32_t public_fileSize; char longFilename[LONG_FILENAME_LENGTH]; bool filenameIsDir; int lastnr; //last number of the autostart; + uint32_t sdpos; private: SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; @@ -133,7 +136,7 @@ private: uint32_t filesize; //int16_t n; unsigned long autostart_atmillis; - uint32_t sdpos ; + //uint32_t sdpos ; bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 7035a2d8f..66f618db2 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -1092,6 +1092,11 @@ const char * const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_FILAMENT_LOADING_T3_DE }; +const char MSG_FILE_INCOMPLETE_EN[] PROGMEM = "File incomplete. Continue anyway?"; +const char * const MSG_FILE_INCOMPLETE_LANG_TABLE[1] PROGMEM = { + MSG_FILE_INCOMPLETE_EN +}; + const char MSG_FILE_PRINTED_EN[] PROGMEM = "Done printing file"; const char * const MSG_FILE_PRINTED_LANG_TABLE[1] PROGMEM = { MSG_FILE_PRINTED_EN diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 209c4954a..e4d512a7a 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -218,6 +218,8 @@ extern const char* const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM]; #define MSG_FILAMENT_LOADING_T2 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T2_LANG_TABLE) extern const char* const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM]; #define MSG_FILAMENT_LOADING_T3 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T3_LANG_TABLE) +extern const char* const MSG_FILE_INCOMPLETE_LANG_TABLE[1]; +#define MSG_FILE_INCOMPLETE LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_INCOMPLETE_LANG_TABLE, 0) extern const char* const MSG_FILE_PRINTED_LANG_TABLE[1]; #define MSG_FILE_PRINTED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_PRINTED_LANG_TABLE, 0) extern const char* const MSG_FILE_SAVED_LANG_TABLE[1]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 4e5e7b195..2251753e6 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -315,4 +315,5 @@ #define(length=17, lines=1) MSG_SORT_TIME "Sort: [Time]" #define(length=17, lines=1) MSG_SORT_ALPHA "Sort: [Alphabet]" #define(length=17, lines=1) MSG_SORT_NONE "Sort: [None]" -#define(length=20, lines=1) MSG_SORTING "Sorting files" \ No newline at end of file +#define(length=20, lines=1) MSG_SORTING "Sorting files" +#define MSG_FILE_INCOMPLETE "File incomplete. Continue anyway?" \ No newline at end of file diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index e44dbe855..39e235cc0 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4964,17 +4964,61 @@ static void menu_action_setlang(unsigned char lang) { static void menu_action_function(menuFunc_t data) { (*data)(); } + +/*check_file() { + +}*/ + +static bool check_file(const char* filename) { + bool result = false; + card.openFile(filename, true); + card.getFileSize(); + //SERIAL_ECHOPGM("Filesize my:"); + //MYSERIAL.println(card.public_fileSize); + card.setIndex((card.public_fileSize) - 10000); + //SERIAL_ECHOPGM("Position:"); + //MYSERIAL.println(card.sdpos); + + while (!card.eof() && !result) { + //show_buffer(); + +// SERIAL_ECHOPGM("Position prior:"); +// MYSERIAL.println(card.sdpos); + card.sdprinting = true; + get_command(); + //result = search_end_command(); + result = check_commands(); + + +/* SERIAL_ECHOPGM("Position after:"); + MYSERIAL.println(card.sdpos); + SERIAL_ECHOPGM("Command find:"); + MYSERIAL.println(int(result));*/ + } + //empty_buffer(); + return result; +} + static void menu_action_sdfile(const char* filename, char* longFilename) -{ +{ loading_flag = false; char cmd[30]; char* c; + bool result = true; sprintf_P(cmd, PSTR("M23 %s"), filename); for (c = &cmd[4]; *c; c++) - *c = tolower(*c); - enquecommand(cmd); - enquecommand_P(PSTR("M24")); - lcd_return_to_status(); + *c = tolower(*c); + if (!check_file(filename)) { + result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILE_INCOMPLETE, false, false); + lcd_update_enable(true); + } + + if (!result) lcd_return_to_status(); + else { + enquecommand(cmd); + enquecommand_P(PSTR("M24")); + lcd_return_to_status(); + } } static void menu_action_sddirectory(const char* filename, char* longFilename) {