Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
10 роки тому
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() {}