// Copyright 2011 Olivier Gillet. // // Author: Olivier Gillet (ol.gillet@gmail.com) // // 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 . // // ----------------------------------------------------------------------------- // // FatFS wrappers. #ifndef AVRLIBX_FILESYSTEM_FILE_SYSTEM_H_ #define AVRLIBX_FILESYSTEM_FILE_SYSTEM_H_ #include #include "avrlibx/avrlibx.h" #include "avrlibx/third_party/ff/ff.h" #include "avrlibx/third_party/ff/mmc.h" namespace avrlibx { enum FilesystemStatus { FS_OK = 0, FS_DISK_ERROR, FS_EXCEPTION, FS_DRIVE_NOT_READY, FS_FILE_NOT_FOUND, FS_PATH_NOT_FOUND, FS_INVALID_NAME, FS_ACCESS_DENIED, FS_FILE_EXISTS, FS_INVALID_OBJECT, FS_WRITE_PROTECTED, FS_INVALID_DRIVE, FS_VOLUME_NOT_INITIALIZED, FS_NO_FAT_VOLUME, FS_FORMAT_FAILED, FS_TIMEOUT, FS_LOCKED, FS_NOT_ENOUGH_MEMORY, FS_TOO_MANY_FILES, FS_INVALID_PARAMETER, FS_NOT_OPENED, FS_BAD_FILE_FORMAT, FS_COPY_ERROR }; enum FileAttribute { FS_ATTRIBUTE_READ_ONLY = 1, FS_ATTRIBUTE_HIDDEN = 2, FS_ATTRIBUTE_SYSTEM = 4, FS_ATTRIBUTE_VOLUME = 8, FS_ATTRIBUTE_LFN = 15, FS_ATTRIBUTE_DIRECTORY = 16, FS_ATTRIBUTE_ARCHIVE = 32, FS_ATTRIBUTE_ATTRIBUTES = 0x3f, }; struct FileInfo { inline uint32_t size() const { return file_info.fsize; } inline uint16_t modification_date() const { return file_info.fdate; } inline uint16_t modification_time() const { return file_info.ftime; } inline uint8_t attributes() const { return file_info.fattrib; } inline uint8_t is_read_only() const { return file_info.fattrib & FS_ATTRIBUTE_READ_ONLY; } inline uint8_t is_hidden() const { return file_info.fattrib & FS_ATTRIBUTE_HIDDEN; } inline uint8_t is_system() const { return file_info.fattrib & FS_ATTRIBUTE_SYSTEM; } inline uint8_t is_volume() const { return file_info.fattrib & FS_ATTRIBUTE_VOLUME; } inline uint8_t is_directory() const { return file_info.fattrib & FS_ATTRIBUTE_DIRECTORY; } inline uint8_t is_archive() const { return file_info.fattrib & FS_ATTRIBUTE_ARCHIVE; } inline const char* name() const { return file_info.fname; } FILINFO file_info; }; class Filesystem { public: Filesystem() { } static FilesystemStatus Init(); static FilesystemStatus Init(uint16_t timeout_ms); static FilesystemStatus Unlink(const char* file_name); static FilesystemStatus Mkdir(const char* dir_name); static FilesystemStatus Mkdirs(char* path); static FilesystemStatus Chmod( const char* file_name, uint8_t value, uint8_t mask); static FilesystemStatus Rename(const char* old_name, const char* new_name); static FilesystemStatus FileStatus(const char* file_name, FileInfo* info); static FilesystemStatus Utime( const char* file_name, uint16_t date, uint16_t time); static FilesystemStatus Mkfs(); static uint32_t GetFreeSpace(); static uint16_t GetType() { uint8_t card_type; disk_ioctl(0, MMC_GET_TYPE, &card_type); return fs_.fs_type | (card_type << 8); } static inline void Tick() { disk_timerproc(); } static uint8_t* buffer() { return fs_.win; } private: static FATFS fs_; DISALLOW_COPY_AND_ASSIGN(Filesystem); }; } // namespace avrlibx #endif // AVRLIBX_FILESYSTEM_FILE_SYSTEM_H_