Jackson Lv
/
SD
SD
File.cpp@0:405b46e831df, 2015-07-14 (annotated)
- Committer:
- Jackson_lv
- Date:
- Tue Jul 14 01:58:28 2015 +0000
- Revision:
- 0:405b46e831df
SD
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jackson_lv | 0:405b46e831df | 1 | /* |
Jackson_lv | 0:405b46e831df | 2 | |
Jackson_lv | 0:405b46e831df | 3 | SD - a slightly more friendly wrapper for sdfatlib |
Jackson_lv | 0:405b46e831df | 4 | |
Jackson_lv | 0:405b46e831df | 5 | This library aims to expose a subset of SD card functionality |
Jackson_lv | 0:405b46e831df | 6 | in the form of a higher level "wrapper" object. |
Jackson_lv | 0:405b46e831df | 7 | |
Jackson_lv | 0:405b46e831df | 8 | License: GNU General Public License V3 |
Jackson_lv | 0:405b46e831df | 9 | (Because sdfatlib is licensed with this.) |
Jackson_lv | 0:405b46e831df | 10 | |
Jackson_lv | 0:405b46e831df | 11 | (C) Copyright 2010 SparkFun Electronics |
Jackson_lv | 0:405b46e831df | 12 | |
Jackson_lv | 0:405b46e831df | 13 | */ |
Jackson_lv | 0:405b46e831df | 14 | |
Jackson_lv | 0:405b46e831df | 15 | #include <SD.h> |
Jackson_lv | 0:405b46e831df | 16 | |
Jackson_lv | 0:405b46e831df | 17 | /* for debugging file open/close leaks |
Jackson_lv | 0:405b46e831df | 18 | uint8_t nfilecount=0; |
Jackson_lv | 0:405b46e831df | 19 | */ |
Jackson_lv | 0:405b46e831df | 20 | |
Jackson_lv | 0:405b46e831df | 21 | File::File(SdFile f, const char *n) { |
Jackson_lv | 0:405b46e831df | 22 | // oh man you are kidding me, new() doesnt exist? Ok we do it by hand! |
Jackson_lv | 0:405b46e831df | 23 | _file = (SdFile *)malloc(sizeof(SdFile)); |
Jackson_lv | 0:405b46e831df | 24 | if (_file) { |
Jackson_lv | 0:405b46e831df | 25 | memcpy(_file, &f, sizeof(SdFile)); |
Jackson_lv | 0:405b46e831df | 26 | |
Jackson_lv | 0:405b46e831df | 27 | strncpy(_name, n, 12); |
Jackson_lv | 0:405b46e831df | 28 | _name[12] = 0; |
Jackson_lv | 0:405b46e831df | 29 | |
Jackson_lv | 0:405b46e831df | 30 | /* for debugging file open/close leaks |
Jackson_lv | 0:405b46e831df | 31 | nfilecount++; |
Jackson_lv | 0:405b46e831df | 32 | Serial.print("Created \""); |
Jackson_lv | 0:405b46e831df | 33 | Serial.print(n); |
Jackson_lv | 0:405b46e831df | 34 | Serial.print("\": "); |
Jackson_lv | 0:405b46e831df | 35 | Serial.println(nfilecount, DEC); |
Jackson_lv | 0:405b46e831df | 36 | */ |
Jackson_lv | 0:405b46e831df | 37 | } |
Jackson_lv | 0:405b46e831df | 38 | } |
Jackson_lv | 0:405b46e831df | 39 | |
Jackson_lv | 0:405b46e831df | 40 | File::File(void) { |
Jackson_lv | 0:405b46e831df | 41 | _file = 0; |
Jackson_lv | 0:405b46e831df | 42 | _name[0] = 0; |
Jackson_lv | 0:405b46e831df | 43 | //Serial.print("Created empty file object"); |
Jackson_lv | 0:405b46e831df | 44 | } |
Jackson_lv | 0:405b46e831df | 45 | |
Jackson_lv | 0:405b46e831df | 46 | File::~File(void) { |
Jackson_lv | 0:405b46e831df | 47 | // Serial.print("Deleted file object"); |
Jackson_lv | 0:405b46e831df | 48 | } |
Jackson_lv | 0:405b46e831df | 49 | |
Jackson_lv | 0:405b46e831df | 50 | // returns a pointer to the file name |
Jackson_lv | 0:405b46e831df | 51 | char *File::name(void) { |
Jackson_lv | 0:405b46e831df | 52 | return _name; |
Jackson_lv | 0:405b46e831df | 53 | } |
Jackson_lv | 0:405b46e831df | 54 | |
Jackson_lv | 0:405b46e831df | 55 | // a directory is a special type of file |
Jackson_lv | 0:405b46e831df | 56 | boolean File::isDirectory(void) { |
Jackson_lv | 0:405b46e831df | 57 | return (_file && _file->isDir()); |
Jackson_lv | 0:405b46e831df | 58 | } |
Jackson_lv | 0:405b46e831df | 59 | |
Jackson_lv | 0:405b46e831df | 60 | |
Jackson_lv | 0:405b46e831df | 61 | size_t File::write(uint8_t val) { |
Jackson_lv | 0:405b46e831df | 62 | return write(&val, 1); |
Jackson_lv | 0:405b46e831df | 63 | } |
Jackson_lv | 0:405b46e831df | 64 | |
Jackson_lv | 0:405b46e831df | 65 | size_t File::write(const uint8_t *buf, size_t size) { |
Jackson_lv | 0:405b46e831df | 66 | size_t t; |
Jackson_lv | 0:405b46e831df | 67 | if (!_file) { |
Jackson_lv | 0:405b46e831df | 68 | setWriteError(); |
Jackson_lv | 0:405b46e831df | 69 | return 0; |
Jackson_lv | 0:405b46e831df | 70 | } |
Jackson_lv | 0:405b46e831df | 71 | _file->clearWriteError(); |
Jackson_lv | 0:405b46e831df | 72 | t = _file->write(buf, size); |
Jackson_lv | 0:405b46e831df | 73 | if (_file->getWriteError()) { |
Jackson_lv | 0:405b46e831df | 74 | setWriteError(); |
Jackson_lv | 0:405b46e831df | 75 | return 0; |
Jackson_lv | 0:405b46e831df | 76 | } |
Jackson_lv | 0:405b46e831df | 77 | return t; |
Jackson_lv | 0:405b46e831df | 78 | } |
Jackson_lv | 0:405b46e831df | 79 | |
Jackson_lv | 0:405b46e831df | 80 | int File::peek() { |
Jackson_lv | 0:405b46e831df | 81 | if (! _file) |
Jackson_lv | 0:405b46e831df | 82 | return 0; |
Jackson_lv | 0:405b46e831df | 83 | |
Jackson_lv | 0:405b46e831df | 84 | int c = _file->read(); |
Jackson_lv | 0:405b46e831df | 85 | if (c != -1) _file->seekCur(-1); |
Jackson_lv | 0:405b46e831df | 86 | return c; |
Jackson_lv | 0:405b46e831df | 87 | } |
Jackson_lv | 0:405b46e831df | 88 | |
Jackson_lv | 0:405b46e831df | 89 | int File::read() { |
Jackson_lv | 0:405b46e831df | 90 | if (_file) |
Jackson_lv | 0:405b46e831df | 91 | return _file->read(); |
Jackson_lv | 0:405b46e831df | 92 | return -1; |
Jackson_lv | 0:405b46e831df | 93 | } |
Jackson_lv | 0:405b46e831df | 94 | |
Jackson_lv | 0:405b46e831df | 95 | // buffered read for more efficient, high speed reading |
Jackson_lv | 0:405b46e831df | 96 | int File::read(void *buf, uint16_t nbyte) { |
Jackson_lv | 0:405b46e831df | 97 | if (_file) |
Jackson_lv | 0:405b46e831df | 98 | return _file->read(buf, nbyte); |
Jackson_lv | 0:405b46e831df | 99 | return 0; |
Jackson_lv | 0:405b46e831df | 100 | } |
Jackson_lv | 0:405b46e831df | 101 | |
Jackson_lv | 0:405b46e831df | 102 | int File::available() { |
Jackson_lv | 0:405b46e831df | 103 | if (! _file) return 0; |
Jackson_lv | 0:405b46e831df | 104 | |
Jackson_lv | 0:405b46e831df | 105 | uint32_t n = size() - position(); |
Jackson_lv | 0:405b46e831df | 106 | |
Jackson_lv | 0:405b46e831df | 107 | return n > 0X7FFF ? 0X7FFF : n; |
Jackson_lv | 0:405b46e831df | 108 | } |
Jackson_lv | 0:405b46e831df | 109 | |
Jackson_lv | 0:405b46e831df | 110 | void File::flush() { |
Jackson_lv | 0:405b46e831df | 111 | if (_file) |
Jackson_lv | 0:405b46e831df | 112 | _file->sync(); |
Jackson_lv | 0:405b46e831df | 113 | } |
Jackson_lv | 0:405b46e831df | 114 | |
Jackson_lv | 0:405b46e831df | 115 | boolean File::seek(uint32_t pos) { |
Jackson_lv | 0:405b46e831df | 116 | if (! _file) return false; |
Jackson_lv | 0:405b46e831df | 117 | |
Jackson_lv | 0:405b46e831df | 118 | return _file->seekSet(pos); |
Jackson_lv | 0:405b46e831df | 119 | } |
Jackson_lv | 0:405b46e831df | 120 | |
Jackson_lv | 0:405b46e831df | 121 | uint32_t File::position() { |
Jackson_lv | 0:405b46e831df | 122 | if (! _file) return -1; |
Jackson_lv | 0:405b46e831df | 123 | return _file->curPosition(); |
Jackson_lv | 0:405b46e831df | 124 | } |
Jackson_lv | 0:405b46e831df | 125 | |
Jackson_lv | 0:405b46e831df | 126 | uint32_t File::size() { |
Jackson_lv | 0:405b46e831df | 127 | if (! _file) return 0; |
Jackson_lv | 0:405b46e831df | 128 | return _file->fileSize(); |
Jackson_lv | 0:405b46e831df | 129 | } |
Jackson_lv | 0:405b46e831df | 130 | |
Jackson_lv | 0:405b46e831df | 131 | void File::close() { |
Jackson_lv | 0:405b46e831df | 132 | if (_file) { |
Jackson_lv | 0:405b46e831df | 133 | _file->close(); |
Jackson_lv | 0:405b46e831df | 134 | free(_file); |
Jackson_lv | 0:405b46e831df | 135 | _file = 0; |
Jackson_lv | 0:405b46e831df | 136 | |
Jackson_lv | 0:405b46e831df | 137 | /* for debugging file open/close leaks |
Jackson_lv | 0:405b46e831df | 138 | nfilecount--; |
Jackson_lv | 0:405b46e831df | 139 | Serial.print("Deleted "); |
Jackson_lv | 0:405b46e831df | 140 | Serial.println(nfilecount, DEC); |
Jackson_lv | 0:405b46e831df | 141 | */ |
Jackson_lv | 0:405b46e831df | 142 | } |
Jackson_lv | 0:405b46e831df | 143 | } |
Jackson_lv | 0:405b46e831df | 144 | |
Jackson_lv | 0:405b46e831df | 145 | File::operator bool() { |
Jackson_lv | 0:405b46e831df | 146 | if (_file) |
Jackson_lv | 0:405b46e831df | 147 | return _file->isOpen(); |
Jackson_lv | 0:405b46e831df | 148 | return false; |
Jackson_lv | 0:405b46e831df | 149 | } |
Jackson_lv | 0:405b46e831df | 150 |