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.

lfnTest.ino 5.8KB

10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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() {}