You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
5.8KB

  1. #include <SPI.h>
  2. #include <SdFat.h>
  3. #include <SdFatUtil.h>
  4. const uint8_t SD_CS_PIN = SS;
  5. SdFat sd;
  6. SdFile file;
  7. char name[260];
  8. //------------------------------------------------------------------------------
  9. const char* testName[] = {
  10. "low.low",
  11. "low.Mix",
  12. "low.UP",
  13. "Mix.low",
  14. "Mix.Mix",
  15. "Mix.UP",
  16. "UP.low",
  17. "UP.Mix",
  18. "UP.UP",
  19. ".dot",
  20. ".dot.dot",
  21. "A b c . txt",
  22. " Leading space and no extension",
  23. "Trailing dots and space . . .",
  24. "Long extension.extension",
  25. "Space after dot. txt",
  26. "Dot.dot.test.txt",
  27. "Dot.dot.test.seq.txt",
  28. "LOW.LOW",
  29. "MIX.MIX",
  30. "Invalid character *.test"
  31. };
  32. //------------------------------------------------------------------------------
  33. bool checkName(char first, size_t len) {
  34. size_t i;
  35. if (len < 5 || len > sizeof(name)) {
  36. return false;
  37. }
  38. if ( name[0] != first) {
  39. return false;
  40. }
  41. for (i = 1; i < (len - 4); i++) {
  42. if (name[i] != (char)('0' + (i + 1) %10)) {
  43. return false;
  44. }
  45. }
  46. const char* p = ".txt";
  47. while (*p) {
  48. if (name[i++] != *p++) {
  49. return false;
  50. }
  51. }
  52. return name[i] == 0;
  53. }
  54. //------------------------------------------------------------------------------
  55. void makeName(char first, size_t len) {
  56. size_t i;
  57. if (len > sizeof(name)) {
  58. len = 255;
  59. }
  60. if (len < 5) {
  61. len = 5;
  62. }
  63. name[0] = first;
  64. for (i = 1; i < (len - 4); i++) {
  65. name[i] = '0' + (i + 1) %10;
  66. }
  67. const char* p = ".txt";
  68. while (*p) name[i++] = *p++;
  69. name[i] = 0;
  70. }
  71. //------------------------------------------------------------------------------
  72. // test open, remove, getName, and ls.
  73. void basicTest() {
  74. size_t i;
  75. size_t n = sd.vol()->fatType() == 32 ? 255 : 99;
  76. uint16_t maxIndex = 0;
  77. makeName('Z', 256);
  78. if (!file.open(name, O_RDWR | O_CREAT)) {
  79. Serial.println(F("255 limit OK"));
  80. } else {
  81. sd.errorHalt(F("255 limit"));
  82. }
  83. for (i = 5; i <= n; i++) {
  84. makeName('A', i);
  85. if (!file.open(name, O_RDWR | O_CREAT)) {
  86. sd.errorHalt(F("open A"));
  87. }
  88. file.println(name);
  89. Serial.print(i);
  90. Serial.write(' ');
  91. Serial.print(file.dirIndex());
  92. Serial.write(' ');
  93. Serial.print(file.fileSize());
  94. Serial.println(F(" open A"));
  95. if (file.fileSize() != (i + 2)) {
  96. sd.errorHalt(F("file size A"));
  97. }
  98. if (file.dirIndex() >= maxIndex) {
  99. maxIndex = file.dirIndex();
  100. } else {
  101. Serial.print(maxIndex); Serial.print(',');Serial.println(file.dirIndex());
  102. sd.errorHalt(F("dirIndex"));
  103. }
  104. file.close();
  105. if (!file.open(sd.vwd(), maxIndex, O_READ)) {
  106. sd.errorHalt(F("open by index"));
  107. }
  108. memset(name, 0, sizeof(name));
  109. if (!file.getName(name, sizeof(name))) {
  110. sd.errorHalt(F("getName"));
  111. }
  112. if (!checkName('A', i)) {
  113. Serial.println(name);
  114. sd.errorHalt(F("checkName"));
  115. }
  116. file.close();
  117. }
  118. for (i = n; i >= 5; i -= 2) {
  119. makeName('A', i);
  120. Serial.print(i);
  121. Serial.println(F( " rm A"));
  122. if (!sd.remove(name)) {
  123. sd.errorHalt(F("remove A"));
  124. }
  125. }
  126. for (i = n; i >= 5; i -= 2) {
  127. makeName('B', i);
  128. if (!file.open(name, O_RDWR | O_CREAT)) {
  129. sd.errorHalt(F("open B"));
  130. }
  131. file.println(name);
  132. Serial.print(i);
  133. Serial.write(' ');
  134. Serial.print(file.dirIndex());
  135. Serial.write(' ');
  136. Serial.print(file.fileSize());
  137. Serial.println(F(" open B"));
  138. if (file.fileSize() != (i + 2)) {
  139. sd.errorHalt(F("file size B"));
  140. }
  141. if (file.dirIndex() > maxIndex) {
  142. sd.errorHalt(F("maxIndex"));
  143. }
  144. file.close();
  145. }
  146. Serial.println(F("----- ls ------"));
  147. sd.ls();
  148. for (i = 5; i <= n; i++) {
  149. char fc = i & 1 ? 'B' : 'A';
  150. makeName(fc, i);
  151. Serial.print(i);
  152. Serial.print(F(" rm "));
  153. Serial.println(fc);
  154. if (!sd.remove(name)) {
  155. sd.errorHalt(F("remove A/B"));
  156. }
  157. }
  158. if (file.openNext(sd.vwd())) {
  159. sd.errorHalt(F("remove all"));
  160. }
  161. Serial.println();
  162. Serial.println(F("basicTest done"));
  163. }
  164. //------------------------------------------------------------------------------
  165. void nameTest() {
  166. Serial.println();
  167. uint8_t n = sizeof(testName)/sizeof(char*);
  168. for (uint8_t i = 0; i < n; i++) {
  169. Serial.print(F("Name: "));
  170. Serial.write('"');
  171. Serial.print(testName[i]);
  172. Serial.println('"');
  173. if(!file.open(testName[i], O_CREAT | O_RDWR)) {
  174. Serial.println(F("Open failed"));
  175. } else {
  176. file.println(testName[i]);
  177. if (!file.getName(name, sizeof(name))) {
  178. sd.errorHalt(F("getFilemame"));
  179. }
  180. file.println(name);
  181. Serial.print(F("LFN: "));
  182. Serial.write('"');
  183. Serial.print(name);
  184. Serial.println('"');
  185. Serial.print(F("SFN: "));
  186. Serial.write('"');
  187. file.printSFN(&Serial);
  188. Serial.println('"');
  189. Serial.print(F("Index: "));
  190. if (file.dirIndex() < 10) {
  191. Serial.write(' ');
  192. }
  193. Serial.println(file.dirIndex());
  194. file.close();
  195. }
  196. Serial.println();
  197. }
  198. Serial.println(F("----- ls ------"));
  199. sd.ls();
  200. Serial.println();
  201. Serial.println(F("nameTest done"));
  202. }
  203. //------------------------------------------------------------------------------
  204. void setup() {
  205. Serial.begin(9600);
  206. while(!Serial);
  207. Serial.print(F("\r\nFreeRam: "));
  208. Serial.println(FreeRam());
  209. Serial.println(F("Type any character to start."));
  210. while (Serial.read() < 0) {}
  211. if (!sd.begin(SD_CS_PIN)) sd.initErrorHalt();
  212. if (file.openNext(sd.vwd())) {
  213. file.close();
  214. delay(100);
  215. while (Serial.read() >= 0) {}
  216. Serial.print(F("Type 'W' to wipe the card: "));
  217. int c;
  218. while ((c = Serial.read()) < 0) {}
  219. if (c != 'W') {
  220. sd.errorHalt(F("Invalid"));
  221. }
  222. Serial.println((char)c);
  223. if (!sd.wipe(&Serial) || !sd.begin(SD_CS_PIN)) {
  224. sd.errorHalt(F("wipe failed"));
  225. }
  226. }
  227. basicTest();
  228. nameTest();
  229. }
  230. //------------------------------------------------------------------------------
  231. void loop() {}