// 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. #include "avrlibx/filesystem/filesystem.h" #include "avrlibx/system/time.h" namespace avrlibx { /* static */ FATFS Filesystem::fs_; /* static */ FilesystemStatus Filesystem::Init() { f_mount(0, &fs_); return disk_initialize(0) ? FS_DISK_ERROR : FS_OK; } /* static */ FilesystemStatus Filesystem::Init(uint16_t timeout_ms) { f_mount(0, &fs_); for (uint32_t t = milliseconds() + timeout_ms; milliseconds() < t; ) { if (!disk_initialize(0)) { return FS_OK; } } return FS_DISK_ERROR; } /* static */ FilesystemStatus Filesystem::Unlink(const char* file_name) { return static_cast(f_unlink(file_name)); } /* static */ FilesystemStatus Filesystem::Mkdir(const char* dir_name) { return static_cast(f_mkdir(dir_name)); } /* static */ FilesystemStatus Filesystem::Mkdirs(char* path) { for (char* p = path + 1; *p; ++p) { // For each path prefix, attempt to create the path. if (*p == '/') { *p = '\0'; FilesystemStatus status = Mkdir(path); *p = '/'; if (status != FS_OK && status != FS_FILE_EXISTS) { return status; } } } return FS_OK; } /* static */ FilesystemStatus Filesystem::Chmod( const char* file_name, uint8_t value, uint8_t mask) { return static_cast(f_chmod(file_name, value, mask)); } /* static */ FilesystemStatus Filesystem::Rename( const char* old_name, const char* new_name) { return static_cast(f_rename(old_name, new_name)); } /* static */ FilesystemStatus Filesystem::Mkfs() { return static_cast(f_mkfs(0, 0, 0)); } /* static */ uint32_t Filesystem::GetFreeSpace() { FATFS* p; DWORD free_clusters = 0; f_getfree("/", &free_clusters, &p); return free_clusters * p->csize * 512; // 0 if error. } /* static */ FilesystemStatus Filesystem::FileStatus(const char* file_name, FileInfo* info) { return static_cast(f_stat(file_name, &info->file_info)); } /* static */ FilesystemStatus Filesystem::Utime( const char* file_name, uint16_t date, uint16_t time) { FILINFO f; f.fdate = date; f.ftime = time; return static_cast(f_utime(file_name, &f)); } } // namespace avrlibx