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