| #define BUILTIN_SDCARD 254 | #define BUILTIN_SDCARD 254 | ||||
| #endif | #endif | ||||
| #if defined(__arm__) | |||||
| // Support everything on 32 bit boards with enough memory | |||||
| #define SDFAT_FILE FsFile | |||||
| #define SDFAT_BASE SdFs | |||||
| #define MAX_FILENAME_LEN 256 | |||||
| #elif defined(__AVR__) | |||||
| // Limit to 32GB cards on 8 bit Teensy with only limited memory | |||||
| #define SDFAT_FILE File32 | |||||
| #define SDFAT_BASE SdFat32 | |||||
| #define MAX_FILENAME_LEN 64 | |||||
| #endif | |||||
| class SDFile : public File | class SDFile : public File | ||||
| { | { | ||||
| public: | public: | ||||
| SDFile(const FsFile &file) : sdfatfile(file), filename(nullptr) { } | |||||
| SDFile(const SDFAT_FILE &file) : sdfatfile(file), filename(nullptr) { } | |||||
| virtual ~SDFile(void) { | virtual ~SDFile(void) { | ||||
| if (sdfatfile) sdfatfile.close(); | if (sdfatfile) sdfatfile.close(); | ||||
| if (filename) free(filename); | if (filename) free(filename); | ||||
| } | } | ||||
| virtual const char * name() { | virtual const char * name() { | ||||
| if (!filename) { | if (!filename) { | ||||
| filename = (char *)malloc(256); | |||||
| filename = (char *)malloc(MAX_FILENAME_LEN); | |||||
| if (filename) { | if (filename) { | ||||
| sdfatfile.getName(filename, 256); | |||||
| sdfatfile.getName(filename, MAX_FILENAME_LEN); | |||||
| } else { | } else { | ||||
| static char zeroterm = 0; | static char zeroterm = 0; | ||||
| filename = &zeroterm; | filename = &zeroterm; | ||||
| return sdfatfile.isDirectory(); | return sdfatfile.isDirectory(); | ||||
| } | } | ||||
| virtual File openNextFile(uint8_t mode=0) { | virtual File openNextFile(uint8_t mode=0) { | ||||
| FsFile file = sdfatfile.openNextFile(); | |||||
| SDFAT_FILE file = sdfatfile.openNextFile(); | |||||
| if (file) return File(new SDFile(file)); | if (file) return File(new SDFile(file)); | ||||
| return File(); | return File(); | ||||
| } | } | ||||
| } | } | ||||
| using Print::write; | using Print::write; | ||||
| private: | private: | ||||
| FsFile sdfatfile; | |||||
| SDFAT_FILE sdfatfile; | |||||
| char *filename; | char *filename; | ||||
| }; | }; | ||||
| File open(const char *filepath, uint8_t mode = FILE_READ) { | File open(const char *filepath, uint8_t mode = FILE_READ) { | ||||
| oflag_t flags = O_READ; | oflag_t flags = O_READ; | ||||
| if (mode == FILE_WRITE) flags = O_READ | O_WRITE | O_CREAT; | if (mode == FILE_WRITE) flags = O_READ | O_WRITE | O_CREAT; | ||||
| FsFile file = sdfs.open(filepath, flags); | |||||
| SDFAT_FILE file = sdfs.open(filepath, flags); | |||||
| if (file) { | if (file) { | ||||
| // Arduino's default FILE_WRITE starts at end of file | // Arduino's default FILE_WRITE starts at end of file | ||||
| if (mode == FILE_WRITE) file.seekEnd(0); | if (mode == FILE_WRITE) file.seekEnd(0); | ||||
| return sdfs.rmdir(filepath); | return sdfs.rmdir(filepath); | ||||
| } | } | ||||
| public: // allow access, so users can mix SD & SdFat APIs | public: // allow access, so users can mix SD & SdFat APIs | ||||
| SdFs sdfs; | |||||
| SDFAT_BASE sdfs; | |||||
| }; | }; | ||||
| extern SDClass SD; | extern SDClass SD; | ||||
| // do not expose these defines in Arduino sketches or other libraries | |||||
| #undef SDFAT_FILE | |||||
| #undef SDFAT_BASE | |||||
| #undef MAX_FILENAME_LEN | |||||
| #define SD_CARD_TYPE_SD1 0 | #define SD_CARD_TYPE_SD1 0 |