diff options
| author | mrfaptastic <gmail@qwe23.com> | 2018-10-25 23:49:41 +0100 |
|---|---|---|
| committer | mrfaptastic <gmail@qwe23.com> | 2018-10-25 23:49:41 +0100 |
| commit | 528c8ed5617e6c42ffd6dbc4d7e1cf464524034f (patch) | |
| tree | b8f7b0fab47e0870f005433986649eee160641e8 /examples/AnimatedGIF/FilenameFunctions.cpp | |
| parent | 6836c4a5635f629faf3b5c4cc7d0ae25887fef3b (diff) | |
Animated GIF example added
Diffstat (limited to 'examples/AnimatedGIF/FilenameFunctions.cpp')
| -rw-r--r-- | examples/AnimatedGIF/FilenameFunctions.cpp | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/examples/AnimatedGIF/FilenameFunctions.cpp b/examples/AnimatedGIF/FilenameFunctions.cpp new file mode 100644 index 0000000..e8a8f04 --- /dev/null +++ b/examples/AnimatedGIF/FilenameFunctions.cpp @@ -0,0 +1,169 @@ +/* + * Animated GIFs Display Code for SmartMatrix and 32x32 RGB LED Panels + * + * This file contains code to enumerate and select animated GIF files by name + * + * Written by: Craig A. Lindley + * + * Other references: https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/FSBrowser/FSBrowser.ino + * + */ + +#include "FilenameFunctions.h" + +File file; + +int numberOfFiles; + +bool fileSeekCallback(unsigned long position) { + return file.seek(position); +} + +unsigned long filePositionCallback(void) { + return file.position(); +} + +int fileReadCallback(void) { + return file.read(); +} + +int fileReadBlockCallback(void * buffer, int numberOfBytes) { + return file.read((uint8_t*)buffer, numberOfBytes); +} + +bool isAnimationFile(const char filename []) { + String filenameString(filename); + +#if defined(ESP32) + // ESP32 filename includes the full path, so need to remove the path before looking at the filename + int pathindex = filenameString.lastIndexOf("/"); + if(pathindex >= 0) + filenameString.remove(0, pathindex + 1); +#endif + + DBG_OUTPUT_PORT.print(filenameString); + + if ((filenameString[0] == '_') || (filenameString[0] == '~') || (filenameString[0] == '.')) { + DBG_OUTPUT_PORT.println(" ignoring: leading _/~/. character"); + return false; + } + + filenameString.toUpperCase(); + if (filenameString.endsWith(".GIF") != 1) { + DBG_OUTPUT_PORT.println(" ignoring: doesn't end of .GIF"); + return false; + } + + DBG_OUTPUT_PORT.println(); + + return true; +} + +// Enumerate and possibly display the animated GIF filenames in GIFS directory +int enumerateGIFFiles(const char *directoryName, boolean displayFilenames) { + + numberOfFiles = 0; + + File directory = FILESYSTEM.open(directoryName); + if (!directory) { + return -1; + } + + File file = directory.openNextFile(); + while (file) { + if (isAnimationFile(file.name())) { + numberOfFiles++; + if (displayFilenames) { + DBG_OUTPUT_PORT.println(file.name()); + } + } + file.close(); + file = directory.openNextFile(); + } + + file.close(); + directory.close(); + + return numberOfFiles; +} + +// Get the full path/filename of the GIF file with specified index +void getGIFFilenameByIndex(const char *directoryName, int index, char *pnBuffer) { + + char* filename; + + // Make sure index is in range + if ((index < 0) || (index >= numberOfFiles)) + return; + + File directory = FILESYSTEM.open(directoryName); + if (!directory) + return; + + File file = directory.openNextFile(); + while (file && (index >= 0)) { + filename = (char*)file.name(); + + if (isAnimationFile(file.name())) { + index--; + +#if !defined(ESP32) + // Copy the directory name into the pathname buffer - ESP32 SD Library includes the full path name in the filename, so no need to add the directory name + strcpy(pnBuffer, directoryName); + // Append the filename to the pathname + strcat(pnBuffer, filename); +#else + strcpy(pnBuffer, filename); +#endif + } + + file.close(); + file = directory.openNextFile(); + } + + file.close(); + directory.close(); +} + +int openGifFilenameByIndex(const char *directoryName, int index) { + char pathname[30]; // long filename will break this... Smash the stack! i.e: + /* + * Stack smashing protect failure! + * + * abort() was called at PC 0x400d9a90 on core 1 + * + * Backtrace: 0x40088578:0x3ffb1ec0 0x4008877b:0x3ffb1ee0 0x400d9a90:0x3ffb1f00 0x400d1d62:0x3ffb1f20 0x400d182f:0x3ffb1f80 0x400ef86e:0x3ffb1fa0 + * + * Rebooting... + + */ + + getGIFFilenameByIndex(directoryName, index, pathname); + + DBG_OUTPUT_PORT.print("Pathname: "); + DBG_OUTPUT_PORT.println(pathname); + + if(file) + { + file.close(); + DBG_OUTPUT_PORT.print("Closing old file..."); + } + + // Attempt to open the file for reading + DBG_OUTPUT_PORT.print("Opening new file..."); + file = FILESYSTEM.open(pathname); + if (!file) { + DBG_OUTPUT_PORT.println("Error opening GIF file"); + return -1; + } + + return 0; +} + + +// Return a random animated gif path/filename from the specified directory +void chooseRandomGIFFilename(const char *directoryName, char *pnBuffer) { + + int index = random(numberOfFiles); + getGIFFilenameByIndex(directoryName, index, pnBuffer); +} |
