/* * EEZ Modular Firmware * Copyright (C) 2015-present, Envox d.o.o. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include #ifdef EEZ_PLATFORM_STM32 #include #endif #ifdef EEZ_PLATFORM_SIMULATOR #include #endif #define FILE_READ 0x01 #define FILE_WRITE 0x02 #define FILE_OPEN_EXISTING 0x00 #define FILE_CREATE_NEW 0x04 #define FILE_CREATE_ALWAYS 0x08 #define FILE_OPEN_ALWAYS 0x10 #define FILE_OPEN_APPEND 0x30 namespace eez { // clang-format off enum SdFatResult { SD_FAT_RESULT_OK = 0, /* (0) Succeeded */ SD_FAT_RESULT_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ SD_FAT_RESULT_INT_ERR, /* (2) Assertion failed */ SD_FAT_RESULT_NOT_READY, /* (3) The physical drive cannot work */ SD_FAT_RESULT_NO_FILE, /* (4) Could not find the file */ SD_FAT_RESULT_NO_PATH, /* (5) Could not find the path */ SD_FAT_RESULT_INVALID_NAME, /* (6) The path name format is invalid */ SD_FAT_RESULT_DENIED, /* (7) Access denied due to prohibited access or directory full */ SD_FAT_RESULT_EXIST, /* (8) Access denied due to prohibited access */ SD_FAT_RESULT_INVALID_OBJECT, /* (9) The file/directory object is invalid */ SD_FAT_RESULT_WRITE_PROTECTED, /* (10) The physical drive is write protected */ SD_FAT_RESULT_INVALID_DRIVE, /* (11) The logical drive number is invalid */ SD_FAT_RESULT_NOT_ENABLED, /* (12) The volume has no work area */ SD_FAT_RESULT_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ SD_FAT_RESULT_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ SD_FAT_RESULT_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ SD_FAT_RESULT_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ SD_FAT_RESULT_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ SD_FAT_RESULT_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */ SD_FAT_RESULT_INVALID_PARAMETER, /* (19) Given parameter is invalid */ }; // clang-format on struct FileInfo { FileInfo(); SdFatResult fstat(const char *filePath); operator bool(); // fname[0] bool isDirectory(); void getName(char *name, size_t size); size_t getSize(); bool isHiddenOrSystemFile(); int getModifiedYear(); int getModifiedMonth(); int getModifiedDay(); int getModifiedHour(); int getModifiedMinute(); int getModifiedSecond(); #if defined(EEZ_PLATFORM_STM32) FILINFO m_fno; #else std::filesystem::directory_entry m_entry; #endif }; struct Directory { Directory(); ~Directory(); void close(); SdFatResult findFirst(const char *path, FileInfo &fileInfo); SdFatResult findNext(FileInfo &fileInfo); #if defined(EEZ_PLATFORM_STM32) DIR m_dj; #else std::filesystem::directory_iterator m_it; #endif }; class File { File(const File &file); const File &operator=(const File &file); public: File(); bool open(const char *path, uint8_t mode = FILE_READ); ~File(); bool close(); bool isOpen(); bool truncate(uint32_t length); bool available(); size_t size(); bool seek(uint32_t pos); size_t tell(); int peek(); int read(); size_t read(void *buf, uint32_t nbyte); size_t write(const void *buf, size_t size); bool sync(); void print(float value, int numDecimalDigits); void print(char value); private: bool m_isOpen{false}; #ifdef EEZ_PLATFORM_SIMULATOR FILE *m_fp{NULL}; #else FIL m_file; #endif }; class SdFat { public: bool mount(int *err); void unmount(); bool exists(const char *path); bool rename(const char *sourcePath, const char *destinationPath); bool remove(const char *path); bool mkdir(const char *path); bool rmdir(const char *path); bool getInfo(int diskDriveIndex, uint64_t &usedSpace, uint64_t &freeSpace); }; char *getConfFilePath(const char *file_name); } // namespace eez