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.

FatFilePrint.cpp 6.6KB

10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
10 jaren geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /* FatLib Library
  2. * Copyright (C) 2012 by William Greiman
  3. *
  4. * This file is part of the FatLib Library
  5. *
  6. * This Library is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This Library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with the FatLib Library. If not, see
  18. * <http://www.gnu.org/licenses/>.
  19. */
  20. #include <math.h>
  21. #include "FatFile.h"
  22. #include "FmtNumber.h"
  23. //------------------------------------------------------------------------------
  24. // print uint8_t with width 2
  25. static void print2u(print_t* pr, uint8_t v) {
  26. char c0 = '?';
  27. char c1 = '?';
  28. if (v < 100) {
  29. c1 = v/10;
  30. c0 = v - 10*c1 + '0';
  31. c1 += '0';
  32. }
  33. pr->write(c1);
  34. pr->write(c0);
  35. }
  36. //------------------------------------------------------------------------------
  37. static void printU32(print_t* pr, uint32_t v) {
  38. char buf[11];
  39. char* ptr = buf + sizeof(buf);
  40. *--ptr = 0;
  41. pr->write(fmtDec(v, ptr));
  42. }
  43. //------------------------------------------------------------------------------
  44. static void printHex(print_t* pr, uint8_t w, uint16_t h) {
  45. char buf[5];
  46. char* ptr = buf + sizeof(buf);
  47. *--ptr = 0;
  48. for (uint8_t i = 0; i < w; i++) {
  49. char c = h & 0XF;
  50. *--ptr = c < 10 ? c + '0' : c + 'A' - 10;
  51. h >>= 4;
  52. }
  53. pr->write(ptr);
  54. }
  55. //------------------------------------------------------------------------------
  56. void FatFile::dmpFile(print_t* pr, uint32_t pos, size_t n) {
  57. char text[17];
  58. text[16] = 0;
  59. if (n >= 0XFFF0) {
  60. n = 0XFFF0;
  61. }
  62. if (!seekSet(pos)) {
  63. return;
  64. }
  65. for (size_t i = 0; i <= n; i++) {
  66. if ((i & 15) == 0) {
  67. if (i) {
  68. pr->write(' ');
  69. pr->write(text);
  70. if (i == n) {
  71. break;
  72. }
  73. }
  74. pr->write('\r');
  75. pr->write('\n');
  76. if (i >= n) {
  77. break;
  78. }
  79. printHex(pr, 4, i);
  80. pr->write(' ');
  81. }
  82. int16_t h = read();
  83. if (h < 0) {
  84. break;
  85. }
  86. pr->write(' ');
  87. printHex(pr, 2, h);
  88. text[i&15] = ' ' <= h && h < 0X7F ? h : '.';
  89. }
  90. pr->write('\r');
  91. pr->write('\n');
  92. }
  93. //------------------------------------------------------------------------------
  94. void FatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) {
  95. FatFile file;
  96. rewind();
  97. while (file.openNext(this, O_READ)) {
  98. // indent for dir level
  99. if (!file.isHidden() || (flags & LS_A)) {
  100. for (uint8_t i = 0; i < indent; i++) {
  101. pr->write(' ');
  102. }
  103. if (flags & LS_DATE) {
  104. file.printModifyDateTime(pr);
  105. pr->write(' ');
  106. }
  107. if (flags & LS_SIZE) {
  108. file.printFileSize(pr);
  109. pr->write(' ');
  110. }
  111. file.printName(pr);
  112. if (file.isDir()) {
  113. pr->write('/');
  114. }
  115. pr->write('\r');
  116. pr->write('\n');
  117. if ((flags & LS_R) && file.isDir()) {
  118. file.ls(pr, flags, indent + 2);
  119. }
  120. }
  121. file.close();
  122. }
  123. }
  124. //------------------------------------------------------------------------------
  125. bool FatFile::printCreateDateTime(print_t* pr) {
  126. dir_t dir;
  127. if (!dirEntry(&dir)) {
  128. DBG_FAIL_MACRO;
  129. goto fail;
  130. }
  131. printFatDate(pr, dir.creationDate);
  132. pr->write(' ');
  133. printFatTime(pr, dir.creationTime);
  134. return true;
  135. fail:
  136. return false;
  137. }
  138. //------------------------------------------------------------------------------
  139. void FatFile::printFatDate(print_t* pr, uint16_t fatDate) {
  140. printU32(pr, FAT_YEAR(fatDate));
  141. pr->write('-');
  142. print2u(pr, FAT_MONTH(fatDate));
  143. pr->write('-');
  144. print2u(pr, FAT_DAY(fatDate));
  145. }
  146. //------------------------------------------------------------------------------
  147. void FatFile::printFatTime(print_t* pr, uint16_t fatTime) {
  148. print2u(pr, FAT_HOUR(fatTime));
  149. pr->write(':');
  150. print2u(pr, FAT_MINUTE(fatTime));
  151. pr->write(':');
  152. print2u(pr, FAT_SECOND(fatTime));
  153. }
  154. //------------------------------------------------------------------------------
  155. /** Template for FatFile::printField() */
  156. template <typename Type>
  157. static int printFieldT(FatFile* file, char sign, Type value, char term) {
  158. char buf[3*sizeof(Type) + 3];
  159. char* str = &buf[sizeof(buf)];
  160. if (term) {
  161. *--str = term;
  162. if (term == '\n') {
  163. *--str = '\r';
  164. }
  165. }
  166. #ifdef OLD_FMT
  167. do {
  168. Type m = value;
  169. value /= 10;
  170. *--str = '0' + m - 10*value;
  171. } while (value);
  172. #else // OLD_FMT
  173. str = fmtDec(value, str);
  174. #endif // OLD_FMT
  175. if (sign) {
  176. *--str = sign;
  177. }
  178. return file->write(str, &buf[sizeof(buf)] - str);
  179. }
  180. //------------------------------------------------------------------------------
  181. int FatFile::printField(float value, char term, uint8_t prec) {
  182. char buf[24];
  183. char* str = &buf[sizeof(buf)];
  184. if (term) {
  185. *--str = term;
  186. if (term == '\n') {
  187. *--str = '\r';
  188. }
  189. }
  190. str = fmtFloat(value, str, prec);
  191. return write(str, buf + sizeof(buf) - str);
  192. }
  193. //------------------------------------------------------------------------------
  194. int FatFile::printField(uint16_t value, char term) {
  195. return printFieldT(this, 0, value, term);
  196. }
  197. //------------------------------------------------------------------------------
  198. int FatFile::printField(int16_t value, char term) {
  199. char sign = 0;
  200. if (value < 0) {
  201. sign = '-';
  202. value = -value;
  203. }
  204. return printFieldT(this, sign, (uint16_t)value, term);
  205. }
  206. //------------------------------------------------------------------------------
  207. int FatFile::printField(uint32_t value, char term) {
  208. return printFieldT(this, 0, value, term);
  209. }
  210. //------------------------------------------------------------------------------
  211. int FatFile::printField(int32_t value, char term) {
  212. char sign = 0;
  213. if (value < 0) {
  214. sign = '-';
  215. value = -value;
  216. }
  217. return printFieldT(this, sign, (uint32_t)value, term);
  218. }
  219. //------------------------------------------------------------------------------
  220. bool FatFile::printModifyDateTime(print_t* pr) {
  221. dir_t dir;
  222. if (!dirEntry(&dir)) {
  223. DBG_FAIL_MACRO;
  224. goto fail;
  225. }
  226. printFatDate(pr, dir.lastWriteDate);
  227. pr->write(' ');
  228. printFatTime(pr, dir.lastWriteTime);
  229. return true;
  230. fail:
  231. return false;
  232. }
  233. //------------------------------------------------------------------------------
  234. size_t FatFile::printFileSize(print_t* pr) {
  235. char buf[11];
  236. char *ptr = buf + sizeof(buf);
  237. *--ptr = 0;
  238. ptr = fmtDec(fileSize(), ptr);
  239. while (ptr > buf) {
  240. *--ptr = ' ';
  241. }
  242. return pr->write(buf);
  243. }