24
24
#include < FS.h>
25
25
#include < SDFS.h>
26
26
27
+ // Avoid type ambiguity, force u8 instead of untyped literal
28
+ // ref. #6106 as to why we add APPEND to WRITE
29
+
30
+ inline constexpr uint8_t SDClassFileRead { FILE_READ };
27
31
#undef FILE_READ
28
- #define FILE_READ ((uint8_t )O_READ)
29
- #undef FILE_WRITE
30
- #define FILE_WRITE ((uint8_t )(O_READ | O_WRITE | O_CREAT | O_APPEND))
32
+ #define FILE_READ SDClassFileRead
31
33
34
+ inline constexpr uint8_t SDClassFileWrite { FILE_WRITE | O_APPEND };
35
+ #undef FILE_WRITE
36
+ #define FILE_WRITE SDClassFileWrite
37
+
38
+ static inline constexpr const char * SDClassFileMode (uint8_t mode) {
39
+ bool read = false ;
40
+ bool write = false ;
41
+
42
+ switch (mode & O_ACCMODE) {
43
+ case O_RDONLY:
44
+ read = true ;
45
+ break ;
46
+ case O_WRONLY:
47
+ write = true ;
48
+ break ;
49
+ case O_RDWR:
50
+ read = true ;
51
+ write = true ;
52
+ break ;
53
+ }
54
+
55
+ const bool append = (mode & O_APPEND) > 0 ;
56
+
57
+ if ( read && !write ) { return " r" ; }
58
+ else if ( !read && write && !append ) { return " w+" ; }
59
+ else if ( !read && write && append ) { return " a" ; }
60
+ else if ( read && write && !append ) { return " w+" ; } // may be a bug in FS::mode interpretation, "r+" seems proper
61
+ else if ( read && write && append ) { return " a+" ; }
62
+
63
+ return " r" ;
64
+ }
32
65
33
66
class SDClass {
34
67
public:
@@ -45,7 +78,7 @@ class SDClass {
45
78
}
46
79
47
80
fs::File open (const char *filename, uint8_t mode = FILE_READ) {
48
- return SDFS.open (filename, getMode (mode));
81
+ return SDFS.open (filename, SDClassFileMode (mode));
49
82
}
50
83
51
84
fs::File open (const char *filename, const char *mode) {
@@ -158,18 +191,6 @@ class SDClass {
158
191
}
159
192
160
193
private:
161
- const char *getMode (uint8_t mode) {
162
- bool read = (mode & O_READ) ? true : false ;
163
- bool write = (mode & O_WRITE) ? true : false ;
164
- bool append = (mode & O_APPEND) ? true : false ;
165
- if ( read & !write ) { return " r" ; }
166
- else if ( !read & write & !append ) { return " w+" ; }
167
- else if ( !read & write & append ) { return " a" ; }
168
- else if ( read & write & !append ) { return " w+" ; } // may be a bug in FS::mode interpretation, "r+" seems proper
169
- else if ( read & write & append ) { return " a+" ; }
170
- else { return " r" ; }
171
- }
172
-
173
194
static time_t wrapperTimeCB (void ) {
174
195
extern void (*__SD__userDateTimeCB)(uint16_t *, uint16_t *);
175
196
if (__SD__userDateTimeCB) {
0 commit comments