#include #include #include const uint8_t SD_CS_PIN = SS; SdFat sd; SdFile file; char name[260]; // Serial output stream ArduinoOutStream cout(Serial); // Serial in buffer. char cinBuf[10]; // Serial input stream ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); //------------------------------------------------------------------------------ char* testName[] = { "low.low", "low.Mix", "low.UP", "Mix.low", "Mix.Mix", "Mix.UP", "UP.low", "UP.Mix", "UP.UP", ".dot", ".dot.dot", "A b c . txt", " Leading space and no extension", "Trailing dots and space . . .", "Long extension.extension", "Space after dot. txt", "Dot.dot.test.txt", "Dot.dot.test.seq.txt", "LOW.LOW", "MIX.MIX", "Invalid character *.test" }; //------------------------------------------------------------------------------ bool checkName(char first, size_t len) { size_t i; if (len < 5 || len > sizeof(name)) { return false; } if ( name[0] != first) { return false; } for (i = 1; i < (len - 4); i++) { if (name[i] != ('0' + (i + 1) %10)) { return false; } } char* p = ".txt"; while (*p) { if (name[i++] != *p++) { return false; } } return name[i] == 0; } //------------------------------------------------------------------------------ void makeName(char first, size_t len) { size_t i; if (len > sizeof(name)) { len = 255; } if (len < 5) { len = 5; } name[0] = first; for (i = 1; i < (len - 4); i++) { name[i] = '0' + (i + 1) %10; } char* p = ".txt"; while (*p) name[i++] = *p++; name[i] = 0; } //------------------------------------------------------------------------------ // test open, remove, getName, and ls. void basicTest() { size_t i; size_t n = sd.vol()->fatType() == 32 ? 255 : 99; uint16_t index; uint16_t maxIndex = 0; makeName('Z', 256); if (!file.open(name, O_RDWR | O_CREAT)) { cout << F("255 limit OK") << endl; } else { sd.errorHalt(F("255 limit")); } for (i = 5; i <= n; i++) { makeName('A', i); if (!file.open(name, O_RDWR | O_CREAT)) { sd.errorHalt(F("open A")); } file.println(name); cout << setw(3) << i << setw(5) << file.dirIndex() << F(" open A") << endl; if (file.fileSize() != (i + 2)) { sd.errorHalt(F("file size A")); } if (file.dirIndex() >= maxIndex) { maxIndex = file.dirIndex(); } else { sd.errorHalt(F("dirIndex")); } file.close(); if (!file.open(sd.vwd(), maxIndex, O_READ)) { sd.errorHalt(F("open by index")); } memset(name, 0, sizeof(name)); if (!file.getName(name, sizeof(name))) { sd.errorHalt(F("getName")); } if (!checkName('A', i)) { cout << name << endl; sd.errorHalt(F("checkName")); } file.close(); } for (i = n; i >= 5; i -= 2) { makeName('A', i); cout << setw(3) << i << F( " rm A") << endl; if (!sd.remove(name)) { sd.errorHalt(F("remove A")); } } for (i = n; i >= 5; i -= 2) { makeName('B', i); if (!file.open(name, O_RDWR | O_CREAT)) { sd.errorHalt(F("open B")); } file.println(name); cout << setw(3) << i << setw(5) << file.dirIndex() << F(" open B") << endl; if (file.fileSize() != (i + 2)) { sd.errorHalt(F("file size B")); } if (file.dirIndex() > maxIndex) { sd.errorHalt(F("maxIndex")); } file.close(); } cout << endl << F("----- ls ------") << endl; sd.ls(); for (i = 5; i <= n; i++) { char fc = i & 1 ? 'B' : 'A'; makeName(fc, i); cout << setw(3) << i << F(" rm ") << fc << endl; if (!sd.remove(name)) { sd.errorHalt(F("remove A/B")); } } if (file.openNext(sd.vwd())) { sd.errorHalt(F("remove all")); } cout << endl << F("basicTest done") << endl; } //------------------------------------------------------------------------------ void nameTest() { cout << endl; uint8_t n = sizeof(testName)/sizeof(char*); for (uint8_t i = 0; i < n; i++) { cout << F("Name: \"") << testName[i] << '"' << endl; if(!file.open(testName[i], O_CREAT | O_RDWR)) { cout <