Tapton school eds robot project mbed2
Fork of FATFileSystem by
Embed:
(wiki syntax)
Show/hide line numbers
FATFileSystem.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2012 ARM Limited 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 00020 * SOFTWARE. 00021 */ 00022 #include "mbed.h" 00023 00024 #include "ffconf.h" 00025 #include "mbed_debug.h" 00026 00027 #include "FATFileSystem.h" 00028 #include "FATFileHandle.h" 00029 #include "FATDirHandle.h" 00030 00031 DWORD get_fattime(void) { 00032 time_t rawtime; 00033 time(&rawtime); 00034 struct tm *ptm = localtime(&rawtime); 00035 return (DWORD)(ptm->tm_year - 80) << 25 00036 | (DWORD)(ptm->tm_mon + 1 ) << 21 00037 | (DWORD)(ptm->tm_mday ) << 16 00038 | (DWORD)(ptm->tm_hour ) << 11 00039 | (DWORD)(ptm->tm_min ) << 5 00040 | (DWORD)(ptm->tm_sec/2 ); 00041 } 00042 00043 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0}; 00044 00045 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) { 00046 debug_if(FFS_DBG, "FATFileSystem(%s)\n", n); 00047 for(int i=0; i<_VOLUMES; i++) { 00048 if(_ffs[i] == 0) { 00049 _ffs[i] = this; 00050 _fsid[0] = '0' + i; 00051 _fsid[1] = '\0'; 00052 //debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", getName(), _fsid); 00053 f_mount(&_fs, _fsid, 0); 00054 return; 00055 } 00056 } 00057 error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n); 00058 } 00059 00060 FATFileSystem::~FATFileSystem() { 00061 for (int i=0; i<_VOLUMES; i++) { 00062 if (_ffs[i] == this) { 00063 _ffs[i] = 0; 00064 f_mount(NULL, _fsid, 0); 00065 } 00066 } 00067 } 00068 00069 FileHandle *FATFileSystem::open(const char* name, int flags) { 00070 //debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, getName(), _fsid); 00071 char n[64]; 00072 sprintf(n, "%s:/%s", _fsid, name); 00073 00074 /* POSIX flags -> FatFS open mode */ 00075 BYTE openmode; 00076 if (flags & O_RDWR) { 00077 openmode = FA_READ|FA_WRITE; 00078 } else if(flags & O_WRONLY) { 00079 openmode = FA_WRITE; 00080 } else { 00081 openmode = FA_READ; 00082 } 00083 if(flags & O_CREAT) { 00084 if(flags & O_TRUNC) { 00085 openmode |= FA_CREATE_ALWAYS; 00086 } else { 00087 openmode |= FA_OPEN_ALWAYS; 00088 } 00089 } 00090 00091 FIL fh; 00092 FRESULT res = f_open(&fh, n, openmode); 00093 if (res) { 00094 debug_if(FFS_DBG, "f_open('w') failed: %d\n", res); 00095 return NULL; 00096 } 00097 if (flags & O_APPEND) { 00098 f_lseek(&fh, fh.fsize); 00099 } 00100 return new FATFileHandle(fh); 00101 } 00102 00103 int FATFileSystem::remove(const char *filename) { 00104 FRESULT res = f_unlink(filename); 00105 if (res) { 00106 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res); 00107 return -1; 00108 } 00109 return 0; 00110 } 00111 00112 int FATFileSystem::rename(const char *oldname, const char *newname) { 00113 FRESULT res = f_rename(oldname, newname); 00114 if (res) { 00115 debug_if(FFS_DBG, "f_rename() failed: %d\n", res); 00116 return -1; 00117 } 00118 return 0; 00119 } 00120 00121 int FATFileSystem::format() { 00122 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster) 00123 if (res) { 00124 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res); 00125 return -1; 00126 } 00127 return 0; 00128 } 00129 00130 DirHandle *FATFileSystem::opendir(const char *name) { 00131 FATFS_DIR dir; 00132 FRESULT res = f_opendir(&dir, name); 00133 if (res != 0) { 00134 return NULL; 00135 } 00136 return new FATDirHandle(dir); 00137 } 00138 00139 int FATFileSystem::mkdir(const char *name, mode_t mode) { 00140 FRESULT res = f_mkdir(name); 00141 return res == 0 ? 0 : -1; 00142 } 00143 00144 int FATFileSystem::mount() { 00145 FRESULT res = f_mount(&_fs, _fsid, 1); 00146 return res == 0 ? 0 : -1; 00147 } 00148 00149 int FATFileSystem::unmount() { 00150 if (disk_sync()) 00151 return -1; 00152 FRESULT res = f_mount(NULL, _fsid, 0); 00153 return res == 0 ? 0 : -1; 00154 }
Generated on Fri Jul 15 2022 16:05:18 by 1.7.2