File tree 3 files changed +45
-4
lines changed
3 files changed +45
-4
lines changed Original file line number Diff line number Diff line change @@ -37,6 +37,8 @@ FS SDFS = FS(FSImplPtr(new sdfs::SDFSImpl()));
37
37
38
38
namespace sdfs {
39
39
40
+ // Required to be global because SDFAT doesn't allow a this pointer in it's own time call
41
+ time_t (*__sdfs_timeCallback)(void ) = nullptr ;
40
42
41
43
FileImplPtr SDFSImpl::open (const char * path, OpenMode openMode, AccessMode accessMode)
42
44
{
Original file line number Diff line number Diff line change @@ -205,12 +205,21 @@ class SDFSImpl : public FSImpl
205
205
return mktime (&tiempo);
206
206
}
207
207
208
+ virtual void setTimeCallback (time_t (*cb)(void )) override {
209
+ extern time_t (*__sdfs_timeCallback)(void );
210
+ __sdfs_timeCallback = cb;
211
+ }
212
+
208
213
// Because SdFat has a single, global setting for this we can only use a
209
- // static member of our class to return the time/date. However, since
210
- // this is static, we can't see the time callback variable. Punt for now,
211
- // using time(NULL) as the best we can do.
214
+ // static member of our class to return the time/date.
212
215
static void dateTimeCB (uint16_t *dosYear, uint16_t *dosTime) {
213
- time_t now = time (nullptr );
216
+ time_t now;
217
+ extern time_t (*__sdfs_timeCallback)(void );
218
+ if (__sdfs_timeCallback) {
219
+ now = __sdfs_timeCallback ();
220
+ } else {
221
+ now = time (nullptr );
222
+ }
214
223
struct tm *tiempo = localtime (&now);
215
224
*dosYear = ((tiempo->tm_year - 80 ) << 9 ) | ((tiempo->tm_mon + 1 ) << 5 ) | tiempo->tm_mday ;
216
225
*dosTime = (tiempo->tm_hour << 11 ) | (tiempo->tm_min << 5 ) | tiempo->tm_sec ;
Original file line number Diff line number Diff line change @@ -162,4 +162,34 @@ TEST_CASE("SD.h FILE_WRITE macro is append", "[fs]")
162
162
REQUIRE (u == 0 );
163
163
}
164
164
165
+ // SDFS timestamp setter (#7682)
166
+ static time_t _my_time (void )
167
+ {
168
+ struct tm t;
169
+ t.tm_year = 120 ;
170
+ t.tm_mon = 9 ;
171
+ t.tm_mday = 22 ;
172
+ t.tm_hour = 12 ;
173
+ t.tm_min = 13 ;
174
+ t.tm_sec = 14 ;
175
+ return mktime (&t);
176
+ }
177
+
178
+ TEST_CASE (" SDFS timeCallback" )
179
+ {
180
+ SDFS_MOCK_DECLARE (64 , 8 , 512 , " " );
181
+ REQUIRE (SDFS.begin ());
182
+ REQUIRE (SD.begin (4 ));
183
+
184
+ SDFS.setTimeCallback (_my_time);
185
+ File f = SD.open (" /file.txt" , " w" );
186
+ f.write (" Had we but world enough, and time," );
187
+ f.close ();
188
+ time_t expected = _my_time ();
189
+ f = SD.open (" /file.txt" , " r" );
190
+ REQUIRE (abs (f.getCreationTime () - expected) < 60 ); // FAT has less precision in timestamp than time_t
191
+ REQUIRE (abs (f.getLastWrite () - expected) < 60 ); // FAT has less precision in timestamp than time_t
192
+ f.close ();
193
+ }
194
+
165
195
};
You can’t perform that action at this time.
0 commit comments