123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- /*
- * This program tests the dateTimeCallback() function
- * and the timestamp() function.
- */
- #include <SPI.h>
- #include "SdFat.h"
- #include "sdios.h"
- SdFs sd;
- FsFile file;
- // Default SD chip select is SS pin
- const uint8_t chipSelect = SS;
- // create Serial stream
- ArduinoOutStream cout(Serial);
- //------------------------------------------------------------------------------
- // store error strings in flash to save RAM
- #define error(s) sd.errorHalt(F(s))
- //------------------------------------------------------------------------------
- /*
- * date/time values for debug
- * normally supplied by a real-time clock or GPS
- */
- // date 1-Oct-21
- uint16_t year = 2021;
- uint8_t month = 10;
- uint8_t day = 1;
- // time 20:30:40
- uint8_t hour = 20;
- uint8_t minute = 30;
- uint8_t second = 40;
- //------------------------------------------------------------------------------
- /*
- * User provided date time callback function.
- * See SdFile::dateTimeCallback() for usage.
- */
- void dateTime(uint16_t* date, uint16_t* time) {
- // User gets date and time from GPS or real-time
- // clock in real callback function
- // return date using FAT_DATE macro to format fields
- *date = FAT_DATE(year, month, day);
- // return time using FAT_TIME macro to format fields
- *time = FAT_TIME(hour, minute, second);
- }
- //------------------------------------------------------------------------------
- /*
- * Function to print all timestamps.
- */
- void printTimestamps(FsFile& f) {
- cout << F("Creation: ");
- f.printCreateDateTime(&Serial);
- cout << endl << F("Modify: ");
- f.printModifyDateTime(&Serial);
- cout << endl << F("Access: ");
- f.printAccessDateTime(&Serial);
- cout << endl;
- }
- //------------------------------------------------------------------------------
- void setup(void) {
- Serial.begin(9600);
- // Wait for USB Serial
- while (!Serial) {
- yield();
- }
- cout << F("Type any character to start\n");
- while (!Serial.available()) {
- yield();
- }
- // Initialize at the highest speed supported by the board that is
- // not over 50 MHz. Try a lower speed if SPI errors occur.
- if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) {
- sd.initErrorHalt();
- }
- // remove files if they exist
- sd.remove("callback.txt");
- sd.remove("default.txt");
- sd.remove("stamp.txt");
- // create a new file with default timestamps
- if (!file.open("default.txt", O_WRONLY | O_CREAT)) {
- error("open default.txt failed");
- }
- cout << F("\nOpen with default times\n");
- printTimestamps(file);
- // close file
- file.close();
- /*
- * Test the date time callback function.
- *
- * dateTimeCallback() sets the function
- * that is called when a file is created
- * or when a file's directory entry is
- * modified by sync().
- *
- * The callback can be disabled by the call
- * SdFile::dateTimeCallbackCancel()
- */
- // set date time callback function
- SdFile::dateTimeCallback(dateTime);
- // create a new file with callback timestamps
- if (!file.open("callback.txt", O_WRONLY | O_CREAT)) {
- error("open callback.txt failed");
- }
- cout << ("\nOpen with callback times\n");
- printTimestamps(file);
- // change call back date
- day += 1;
- // must add two to see change since FAT second field is 5-bits
- second += 2;
- // modify file by writing a byte
- file.write('t');
- // force dir update
- file.sync();
- cout << F("\nTimes after write\n");
- printTimestamps(file);
- // close file
- file.close();
- /*
- * Test timestamp() function
- *
- * Cancel callback so sync will not
- * change access/modify timestamp
- */
- SdFile::dateTimeCallbackCancel();
- // create a new file with default timestamps
- if (!file.open("stamp.txt", O_WRONLY | O_CREAT)) {
- error("open stamp.txt failed");
- }
- // set creation date time
- if (!file.timestamp(T_CREATE, 2021, 11, 10, 1, 2, 3)) {
- error("set create time failed");
- }
- // set write/modification date time
- if (!file.timestamp(T_WRITE, 2021, 11, 11, 4, 5, 6)) {
- error("set write time failed");
- }
- // set access date
- if (!file.timestamp(T_ACCESS, 2021, 11, 12, 7, 8, 9)) {
- error("set access time failed");
- }
- cout << F("\nTimes after timestamp() calls\n");
- printTimestamps(file);
- file.close();
- cout << F("\nDone\n");
- }
- void loop() {}
|