Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

SdFile.h 9.6KB

10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
10 år sedan
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /* Arduino SdFat Library
  2. * Copyright (C) 2012 by William Greiman
  3. *
  4. * This file is part of the Arduino SdFat 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 Arduino SdFat Library. If not, see
  18. * <http://www.gnu.org/licenses/>.
  19. */
  20. /**
  21. * \file
  22. * \brief SdFile class
  23. */
  24. #ifndef SdFile_h
  25. #define SdFile_h
  26. #include <limits.h>
  27. #include "utility/FatLib.h"
  28. //------------------------------------------------------------------------------
  29. /** Arduino SD.h style flag for open for read. */
  30. #define FILE_READ O_READ
  31. /** Arduino SD.h style flag for open at EOF for read/write with create. */
  32. #define FILE_WRITE (O_RDWR | O_CREAT | O_AT_END)
  33. //==============================================================================
  34. /**
  35. * \class SdBaseFile
  36. * \brief SdBaseFile base for SdFile and File.
  37. */
  38. class SdBaseFile : public FatFile {
  39. public:
  40. SdBaseFile() {}
  41. /** Constructor with file open.
  42. *
  43. * \param[in] path File location and name.
  44. * \param[in] oflag File open mode.
  45. */
  46. SdBaseFile(const char* path, uint8_t oflag) {open(path, oflag);}
  47. using FatFile::ls;
  48. using FatFile::printFatDate;
  49. using FatFile::printFatTime;
  50. using FatFile::printName;
  51. /** List directory contents.
  52. *
  53. * \param[in] flags The inclusive OR of
  54. *
  55. * LS_DATE - %Print file modification date
  56. *
  57. * LS_SIZE - %Print file size.
  58. *
  59. * LS_R - Recursive list of subdirectories.
  60. */
  61. void ls(uint8_t flags = 0) {
  62. ls(&Serial, flags);
  63. }
  64. /** %Print a directory date field.
  65. *
  66. * Format is yyyy-mm-dd.
  67. *
  68. * \param[in] fatDate The date field from a directory entry.
  69. */
  70. static void printFatDate(uint16_t fatDate) {
  71. printFatDate(&Serial, fatDate);
  72. }
  73. /** %Print a directory time field.
  74. *
  75. * Format is hh:mm:ss.
  76. *
  77. * \param[in] fatTime The time field from a directory entry.
  78. */
  79. static void printFatTime(uint16_t fatTime) {
  80. printFatTime(&Serial, fatTime);
  81. }
  82. /** Print a file's name.
  83. *
  84. * \return The value one, true, is returned for success and
  85. * the value zero, false, is returned for failure.
  86. */
  87. size_t printName() {
  88. return FatFile::printName(&Serial);
  89. }
  90. };
  91. //==============================================================================
  92. /**
  93. * \class SdFile
  94. * \brief SdFile SdBaseFile with Print.
  95. */
  96. #if SD_FILE_USES_STREAM
  97. class SdFile : public SdBaseFile, public Stream {
  98. #else // SD_FILE_USES_STREAM
  99. class SdFile : public SdBaseFile, public Print {
  100. #endif // SD_FILE_USES_STREAM
  101. public:
  102. SdFile() {}
  103. /** Create a file object and open it in the current working directory.
  104. *
  105. * \param[in] path A path with a valid 8.3 DOS name for a file to be opened.
  106. *
  107. * \param[in] oflag Values for \a oflag are constructed by a
  108. * bitwise-inclusive OR of open flags. see
  109. * SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
  110. */
  111. SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) {}
  112. #if DESTRUCTOR_CLOSES_FILE
  113. ~SdFile() {}
  114. #endif // DESTRUCTOR_CLOSES_FILE
  115. using SdBaseFile::clearWriteError;
  116. using SdBaseFile::getWriteError;
  117. using SdBaseFile::read;
  118. using SdBaseFile::write;
  119. /** \return number of bytes available from the current position to EOF
  120. * or INT_MAX if more than INT_MAX bytes are available.
  121. */
  122. int available() {
  123. uint32_t n = SdBaseFile::available();
  124. return n > INT_MAX ? INT_MAX : n;
  125. }
  126. /** Ensure that any bytes written to the file are saved to the SD card. */
  127. void flush() {SdBaseFile::sync();}
  128. /** Return the next available byte without consuming it.
  129. *
  130. * \return The byte if no error and not at eof else -1;
  131. */
  132. int peek() {return SdBaseFile::peek();}
  133. /** Read the next byte from a file.
  134. *
  135. * \return For success return the next byte in the file as an int.
  136. * If an error occurs or end of file is reached return -1.
  137. */
  138. int read() {return SdBaseFile::read();}
  139. /** Write a byte to a file. Required by the Arduino Print class.
  140. * \param[in] b the byte to be written.
  141. * Use getWriteError to check for errors.
  142. * \return 1 for success and 0 for failure.
  143. */
  144. size_t write(uint8_t b) {return SdBaseFile::write(b);}
  145. /** Write a string to a file. Used by the Arduino Print class.
  146. * \param[in] str Pointer to the string.
  147. * Use getWriteError to check for errors.
  148. * \return count of characters written for success or -1 for failure.
  149. */
  150. int write(const char* str) {
  151. return SdBaseFile::write(str, strlen(str));
  152. }
  153. /** Write data to an open file. Form required by Print.
  154. *
  155. * \note Data is moved to the cache but may not be written to the
  156. * storage device until sync() is called.
  157. *
  158. * \param[in] buf Pointer to the location of the data to be written.
  159. *
  160. * \param[in] size Number of bytes to write.
  161. *
  162. * \return For success write() returns the number of bytes written, always
  163. * \a nbyte. If an error occurs, write() returns -1. Possible errors
  164. * include write() is called before a file has been opened, write is called
  165. * for a read-only file, device is full, a corrupt file system or an
  166. * I/O error.
  167. */
  168. size_t write(const uint8_t *buf, size_t size) {
  169. return SdBaseFile::write(buf, size);
  170. }
  171. /** Write a PROGMEM string to a file.
  172. * \param[in] str Pointer to the PROGMEM string.
  173. * Use getWriteError to check for errors.
  174. */
  175. void write_P(PGM_P str) {
  176. for (uint8_t c; (c = pgm_read_byte(str)); str++) write(c);
  177. }
  178. /** Write a PROGMEM string followed by CR/LF to a file.
  179. * \param[in] str Pointer to the PROGMEM string.
  180. * Use getWriteError to check for errors.
  181. */
  182. void writeln_P(PGM_P str) {
  183. write_P(str);
  184. write_P(PSTR("\r\n"));
  185. }
  186. };
  187. //==============================================================================
  188. /**
  189. * \class File
  190. * \brief Arduino SD.h style File API
  191. */
  192. class File : public SdBaseFile, public Stream {
  193. public:
  194. File() {}
  195. /** Create a file object and open it in the current working directory.
  196. *
  197. * \param[in] path A path with a valid 8.3 DOS name for a file to be opened.
  198. *
  199. * \param[in] oflag Values for \a oflag are constructed by a
  200. * bitwise-inclusive OR of open flags. see
  201. * SdBaseFile::open(SdBaseFile*, const char*, uint8_t).
  202. */
  203. File(const char* path, uint8_t oflag) {open(path, oflag);}
  204. using SdBaseFile::clearWriteError;
  205. using SdBaseFile::getWriteError;
  206. /** The parenthesis operator.
  207. *
  208. * \return true if a file is open.
  209. */
  210. operator bool() {return isOpen();}
  211. /** \return number of bytes available from the current position to EOF
  212. * or INT_MAX if more than INT_MAX bytes are available.
  213. */
  214. int available() {
  215. uint32_t n = SdBaseFile::available();
  216. return n > INT_MAX ? INT_MAX : n;
  217. }
  218. /** Ensure that any bytes written to the file are saved to the SD card. */
  219. void flush() {SdBaseFile::sync();}
  220. /** This function reports if the current file is a directory or not.
  221. * \return true if the file is a directory.
  222. */
  223. bool isDirectory() {return isDir();}
  224. /** \return a pointer to the file's name. */
  225. char* name() {
  226. m_name[0] = 0;
  227. getFilename(m_name);
  228. return m_name;
  229. }
  230. /** Return the next available byte without consuming it.
  231. *
  232. * \return The byte if no error and not at eof else -1;
  233. */
  234. int peek() {return SdBaseFile::peek();}
  235. /** \return the current file position. */
  236. uint32_t position() {return curPosition();}
  237. /** Opens the next file or folder in a directory.
  238. *
  239. * \param[in] mode open mode flags.
  240. * \return a File object.
  241. */
  242. File openNextFile(uint8_t mode = O_READ) {
  243. File tmpFile;
  244. tmpFile.openNext(this, mode);
  245. return tmpFile;
  246. }
  247. /** Read the next byte from a file.
  248. *
  249. * \return For success return the next byte in the file as an int.
  250. * If an error occurs or end of file is reached return -1.
  251. */
  252. int read() {return SdBaseFile::read();}
  253. /** Rewind a file if it is a directory */
  254. void rewindDirectory() {
  255. if (isDir()) rewind();
  256. }
  257. /**
  258. * Seek to a new position in the file, which must be between
  259. * 0 and the size of the file (inclusive).
  260. *
  261. * \param[in] pos the new file position.
  262. * \return true for success else false.
  263. */
  264. bool seek(uint32_t pos) {return seekSet(pos);}
  265. /** \return the file's size. */
  266. uint32_t size() {return fileSize();}
  267. /** Write a byte to a file. Required by the Arduino Print class.
  268. * \param[in] b the byte to be written.
  269. * Use getWriteError to check for errors.
  270. * \return 1 for success and 0 for failure.
  271. */
  272. size_t write(uint8_t b) {return SdBaseFile::write(b);}
  273. /** Write data to an open file. Form required by Print.
  274. *
  275. * \note Data is moved to the cache but may not be written to the
  276. * storage device until sync() is called.
  277. *
  278. * \param[in] buf Pointer to the location of the data to be written.
  279. *
  280. * \param[in] size Number of bytes to write.
  281. *
  282. * \return For success write() returns the number of bytes written, always
  283. * \a nbyte. If an error occurs, write() returns -1. Possible errors
  284. * include write() is called before a file has been opened, write is called
  285. * for a read-only file, device is full, a corrupt file system or an
  286. * I/O error.
  287. */
  288. size_t write(const uint8_t *buf, size_t size) {
  289. return SdBaseFile::write(buf, size);
  290. }
  291. private:
  292. char m_name[13];
  293. };
  294. #endif // SdFile_h