diff --git a/src/ExFatLib/ExFatFile.cpp b/src/ExFatLib/ExFatFile.cpp index 405f86fc..b00bde1a 100644 --- a/src/ExFatLib/ExFatFile.cpp +++ b/src/ExFatLib/ExFatFile.cpp @@ -161,6 +161,22 @@ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->createTime); return true; +fail: + return false; +} +//------------------------------------------------------------------------------ +bool ExFatFile::getCreateDateTimeSeconds(uint16_t* pdate, uint16_t* ptime, uint8_t* pseconds) { + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + if (!df) { + DBG_FAIL_MACRO; + goto fail; + } + *pdate = getLe16(df->createDate); + *ptime = getLe16(df->createTime); + *pseconds = df->createTimeMs; + return true; + fail: return false; } diff --git a/src/ExFatLib/ExFatFile.h b/src/ExFatLib/ExFatFile.h index 5539e602..61b6e2bb 100644 --- a/src/ExFatLib/ExFatFile.h +++ b/src/ExFatLib/ExFatFile.h @@ -208,6 +208,15 @@ class ExFatFile { * \return true for success or false for failure. */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); + /** Get a file's create date and time (with seconds). + * + * \param[out] pdate Packed date for directory entry. + * \param[out] ptime Packed time for directory entry. + * \param[out] pseconds Packed seconds for directory entry. + * + * \return true for success or false for failure. + */ + bool getCreateDateTimeSeconds(uint16_t* pdate, uint16_t* ptime, uint8_t* pseconds); /** \return All error bits. */ uint8_t getError() const { return isOpen() ? m_error : 0XFF; } /** Get a file's modify date and time. @@ -462,6 +471,13 @@ class ExFatFile { * \return true for success or false for failure. */ size_t printCreateDateTime(print_t* pr); + /** Print a file's creation date and time (with seconds) + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printCreateDateTimeSeconds(print_t* pr); /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. diff --git a/src/ExFatLib/ExFatFilePrint.cpp b/src/ExFatLib/ExFatFilePrint.cpp index 38dd0f9e..5b390ccb 100644 --- a/src/ExFatLib/ExFatFilePrint.cpp +++ b/src/ExFatLib/ExFatFilePrint.cpp @@ -116,6 +116,19 @@ size_t ExFatFile::printCreateDateTime(print_t* pr) { return 0; } //------------------------------------------------------------------------------ +size_t ExFatFile::printCreateDateTimeSeconds(print_t* pr) { + uint32_t datetime; + uint16_t date; + uint16_t time; + uint8_t seconds; + int8_t tz = 8; + + if (getCreateDateTimeSeconds(&date, &time, &seconds)) { + return (fsPrintDate(pr, date) && fsPrintTime(pr, time, seconds)); + } + return 0; +} +//------------------------------------------------------------------------------ size_t ExFatFile::printFileSize(print_t* pr) { uint64_t n = m_validLength; char buf[21]; diff --git a/src/FatLib/FatFile.cpp b/src/FatLib/FatFile.cpp index 6d1fb43f..16c7ee5d 100644 --- a/src/FatLib/FatFile.cpp +++ b/src/FatLib/FatFile.cpp @@ -302,6 +302,21 @@ bool FatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(dir.createTime); return true; +fail: + return false; +} +//------------------------------------------------------------------------------ +bool FatFile::getCreateDateTimeSeconds(uint16_t* pdate, uint16_t* ptime, uint8_t* pseconds) { + DirFat_t dir; + if (!dirEntry(&dir)) { + DBG_FAIL_MACRO; + goto fail; + } + *pdate = getLe16(dir.createDate); + *ptime = getLe16(dir.createTime); + *pseconds = dir.createTimeMs; + return true; + fail: return false; } diff --git a/src/FatLib/FatFile.h b/src/FatLib/FatFile.h index fa34d28e..e934c881 100644 --- a/src/FatLib/FatFile.h +++ b/src/FatLib/FatFile.h @@ -308,6 +308,15 @@ class FatFile { * \return true for success or false for failure. */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); + /** Get a file's create date and time (with seconds). + * + * \param[out] pdate Packed date for directory entry. + * \param[out] ptime Packed time for directory entry. + * \param[out] pseconds Packed time for directory entry. + * + * \return true for success or false for failure. + */ + bool getCreateDateTimeSeconds(uint16_t* pdate, uint16_t* ptime, uint8_t* pseconds); /** \return All error bits. */ uint8_t getError() const { return m_error; } /** Get a file's modify date and time. @@ -590,6 +599,13 @@ class FatFile { * \return The number of bytes printed. */ size_t printCreateDateTime(print_t* pr); + /** Print a file's creation date and time (with seconds) + * + * \param[in] pr Print stream for output. + * + * \return The number of bytes printed. + */ + size_t printCreateDateTimeSeconds(print_t* pr); /** %Print a directory date field. * * Format is yyyy-mm-dd. diff --git a/src/FatLib/FatFilePrint.cpp b/src/FatLib/FatFilePrint.cpp index 34f65946..6a2cbad5 100644 --- a/src/FatLib/FatFilePrint.cpp +++ b/src/FatLib/FatFilePrint.cpp @@ -88,6 +88,20 @@ size_t FatFile::printCreateDateTime(print_t* pr) { return 0; } //------------------------------------------------------------------------------ +size_t FatFile::printCreateDateTimeSeconds(print_t* pr) { + uint32_t datetime; + uint16_t date; + uint16_t time; + uint8_t seconds; + int8_t tz = 8; + + if (getCreateDateTimeSeconds(&date, &time, &seconds)) { + datetime = date+time; + return fsPrintDateTime(pr, datetime, seconds, tz); + } + return 0; +} +//------------------------------------------------------------------------------ size_t FatFile::printModifyDateTime(print_t* pr) { uint16_t date; uint16_t time; diff --git a/src/FsLib/FsFile.h b/src/FsLib/FsFile.h index 926294aa..e9849590 100644 --- a/src/FsLib/FsFile.h +++ b/src/FsLib/FsFile.h @@ -560,6 +560,17 @@ class FsBaseFile { : m_xFile ? m_xFile->printCreateDateTime(pr) : 0; } + /** Print a file's creation date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printCreateDateTimeSeconds(print_t* pr) { + return m_fFile ? m_fFile->printCreateDateTimeSeconds(pr) + : m_xFile ? m_xFile->printCreateDateTimeSeconds(pr) + : 0; + } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. diff --git a/src/common/FsDateTime.cpp b/src/common/FsDateTime.cpp index be3736b6..de4b00d2 100644 --- a/src/common/FsDateTime.cpp +++ b/src/common/FsDateTime.cpp @@ -159,9 +159,10 @@ size_t fsPrintTime(print_t* pr, uint16_t time) { //------------------------------------------------------------------------------ size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100) { // Allow hh:mm:ss - char buf[sizeof("hh:mm:ss") - 1]; + char buf[sizeof(" hh:mm:ss") - 1]; char* str = buf + sizeof(buf); str = fsFmtTime(str, time, sec100); + *--str = ' '; return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); } //------------------------------------------------------------------------------