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.

249 line
6.6KB

  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. }