| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | #include <SPI.h>#include <SdFat.h>#include <SdFatUtil.h>const uint8_t SD_CS_PIN = SS;SdFat sd;SdFile file;char name[260];//------------------------------------------------------------------------------const 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] != (char)('0' + (i + 1) %10)) {      return false;    }  }  const 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;  }  const 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 maxIndex = 0;    makeName('Z', 256);  if (!file.open(name, O_RDWR | O_CREAT)) {    Serial.println(F("255 limit OK"));  } 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);    Serial.print(i);    Serial.write(' ');       Serial.print(file.dirIndex());    Serial.write(' ');    Serial.print(file.fileSize());    Serial.println(F(" open A"));    if (file.fileSize() != (i + 2)) {      sd.errorHalt(F("file size A"));    }        if (file.dirIndex() >= maxIndex) {      maxIndex = file.dirIndex();    } else {      Serial.print(maxIndex); Serial.print(',');Serial.println(file.dirIndex());      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)) {      Serial.println(name);      sd.errorHalt(F("checkName"));    }    file.close();      }  for (i = n; i >= 5; i -= 2) {    makeName('A', i);    Serial.print(i);    Serial.println(F( " rm A"));    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);    Serial.print(i);    Serial.write(' ');       Serial.print(file.dirIndex());    Serial.write(' ');    Serial.print(file.fileSize());        Serial.println(F(" open B"));    if (file.fileSize() != (i + 2)) {      sd.errorHalt(F("file size B"));    }    if (file.dirIndex() > maxIndex) {      sd.errorHalt(F("maxIndex"));    }    file.close();  }  Serial.println(F("----- ls ------"));  sd.ls();  for (i = 5; i <= n; i++) {    char fc = i & 1 ? 'B' : 'A';    makeName(fc, i);    Serial.print(i);    Serial.print(F(" rm "));    Serial.println(fc);    if (!sd.remove(name)) {      sd.errorHalt(F("remove A/B"));    }  }  if (file.openNext(sd.vwd())) {    sd.errorHalt(F("remove all"));  }  Serial.println();  Serial.println(F("basicTest done"));}//------------------------------------------------------------------------------void nameTest() {  Serial.println();  uint8_t n = sizeof(testName)/sizeof(char*);  for (uint8_t i = 0; i < n; i++) {    Serial.print(F("Name: "));    Serial.write('"');    Serial.print(testName[i]);    Serial.println('"');    if(!file.open(testName[i], O_CREAT | O_RDWR)) {      Serial.println(F("Open failed"));    } else {      file.println(testName[i]);      if (!file.getName(name, sizeof(name))) {        sd.errorHalt(F("getFilemame"));      }      file.println(name);      Serial.print(F("LFN:  "));      Serial.write('"');      Serial.print(name);      Serial.println('"');      Serial.print(F("SFN:  "));      Serial.write('"');      file.printSFN(&Serial);      Serial.println('"');      Serial.print(F("Index: "));      if (file.dirIndex() < 10) {        Serial.write(' ');      }      Serial.println(file.dirIndex());            file.close();    }    Serial.println();  }  Serial.println(F("----- ls ------"));  sd.ls();  Serial.println();  Serial.println(F("nameTest done"));}//------------------------------------------------------------------------------void setup() {  Serial.begin(9600);  while(!Serial);  Serial.print(F("\r\nFreeRam: "));  Serial.println(FreeRam());  Serial.println(F("Type any character to start."));  while (Serial.read() < 0) {}  if (!sd.begin(SD_CS_PIN)) sd.initErrorHalt();  if (file.openNext(sd.vwd())) {    file.close();    delay(100);    while (Serial.read() >= 0) {}    Serial.print(F("Type 'W' to wipe the card: "));    int c;    while ((c = Serial.read()) < 0) {}    if (c != 'W') {      sd.errorHalt(F("Invalid"));    }    Serial.println((char)c);    if (!sd.wipe(&Serial) || !sd.begin(SD_CS_PIN)) {      sd.errorHalt(F("wipe failed"));    }  }  basicTest();  nameTest();}//------------------------------------------------------------------------------void loop() {}
 |