123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /**
- * Marlin 3D Printer Firmware
- * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- *
- * Based on Sprinter and grbl.
- * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- *
- */
-
- /* ****************************************
- * lcd/extui/lib/nextion/FileNavigator.cpp
- * ****************************************
- * Extensible_UI implementation for Nextion
- * https://github.com/Skorpi08
- * ***************************************/
-
- #include "../../../../inc/MarlinConfigPre.h"
-
- #if ENABLED(NEXTION_TFT)
-
- #include "FileNavigator.h"
- #include "nextion_tft.h"
-
- using namespace ExtUI;
-
- #define DEBUG_OUT NEXDEBUGLEVEL
- #include "../../../../core/debug_out.h"
-
- FileList FileNavigator::filelist; // Instance of the Marlin file API
- char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path
- uint16_t FileNavigator::lastindex;
- uint8_t FileNavigator::folderdepth;
- uint16_t FileNavigator::currentindex; // override the panel request
-
- FileNavigator filenavigator;
-
- FileNavigator::FileNavigator() { reset(); }
-
- void FileNavigator::reset() {
- currentfoldername[0] = '\0';
- folderdepth = 0;
- currentindex = 0;
- lastindex = 0;
- // Start at root folder
- while (!filelist.isAtRootDir()) filelist.upDir();
- refresh();
- }
-
- void FileNavigator::refresh() { filelist.refresh(); }
-
- void FileNavigator::getFiles(uint16_t index) {
- uint16_t files = 7, fseek = 0, fcnt = 0;
- if (index == 0)
- currentindex = 0;
- else {
- // Each time we change folder we reset the file index to 0 and keep track
- // of the current position as the TFT panel isn't aware of folder trees.
- --currentindex; // go back a file to take account of the .. added to the root.
- if (index > lastindex)
- currentindex += files + 1;
- else if (currentindex >= files)
- currentindex -= files - 1;
- else
- currentindex = 0;
- }
- lastindex = index;
-
- #if NEXDEBUG(AC_FILE)
- DEBUG_ECHOLNPAIR("index=", index, " currentindex=", currentindex);
- #endif
-
- if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder
- nextion.SendtoTFT(PSTR("vis p0,1"));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
- SEND_VAL("tmpUP", "0");
- files--;
- }
- else {
- nextion.SendtoTFT(PSTR("vis p0,0"));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
- }
-
- for (uint16_t seek = currentindex; seek < currentindex + files; seek++) {
- if (filelist.seek(seek)) {
- nextion.SendtoTFT(PSTR("s"));
- LCD_SERIAL.print(fcnt);
- nextion.SendtoTFT(PSTR(".txt=\""));
- if (filelist.isDir()) {
- LCD_SERIAL.print(filelist.shortFilename());
- nextion.SendtoTFT(PSTR("/\""));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
-
- nextion.SendtoTFT(PSTR("l"));
- LCD_SERIAL.print(fcnt);
- nextion.SendtoTFT(PSTR(".txt=\""));
- LCD_SERIAL.print(filelist.filename());
- nextion.SendtoTFT(PSTR("\""));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
- SEND_PCO2("l", fcnt, "1055");
- }
- else {
- LCD_SERIAL.print(currentfoldername);
- LCD_SERIAL.print(filelist.shortFilename());
- nextion.SendtoTFT(PSTR("\""));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
-
- nextion.SendtoTFT(PSTR("l"));
- LCD_SERIAL.print(fcnt);
- nextion.SendtoTFT(PSTR(".txt=\""));
- LCD_SERIAL.print(filelist.longFilename());
- nextion.SendtoTFT(PSTR("\""));
- nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"));
- }
- fcnt++;
- fseek = seek;
- #if NEXDEBUG(AC_FILE)
- DEBUG_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n");
- #endif
- }
- }
- SEND_VAL("n0", filelist.count());
- SEND_VAL("n1", fseek + 1);
- }
-
- void FileNavigator::changeDIR(char *folder) {
- #if NEXDEBUG(AC_FILE)
- DEBUG_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder);
- #endif
- if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth
- strcat(currentfoldername, folder);
- strcat(currentfoldername, "/");
- filelist.changeDir(folder);
- refresh();
- folderdepth++;
- currentindex = 0;
- }
-
- void FileNavigator::upDIR() {
- filelist.upDir();
- refresh();
- folderdepth--;
- currentindex = 0;
- // Remove the last child folder from the stored path
- if (folderdepth == 0) {
- currentfoldername[0] = '\0';
- reset();
- }
- else {
- char *pos = nullptr;
- for (uint8_t f = 0; f < folderdepth; f++)
- pos = strchr(currentfoldername, '/');
- pos[1] = '\0';
- }
- #if NEXDEBUG(AC_FILE)
- DEBUG_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername);
- #endif
- }
-
- char* FileNavigator::getCurrentFolderName() { return currentfoldername; }
-
- #endif // NEXTION_TFT
|