SD

Dependencies:   utility

Committer:
Jackson_lv
Date:
Tue Jul 14 01:58:28 2015 +0000
Revision:
0:405b46e831df
SD

Who changed what in which revision?

UserRevisionLine numberNew 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