// 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_