Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
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() {}