SD

Committer:
mikekelly99
Date:
Tue Nov 17 17:03:36 2020 +0000
Revision:
0:6db20bbdc767
Wow, never committed the code once so first and final commit, code produces the lat and long values as well as speed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mikekelly99 0:6db20bbdc767 1 /* mbed Microcontroller Library
mikekelly99 0:6db20bbdc767 2 * Copyright (c) 2006-2012 ARM Limited
mikekelly99 0:6db20bbdc767 3 *
mikekelly99 0:6db20bbdc767 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
mikekelly99 0:6db20bbdc767 5 * of this software and associated documentation files (the "Software"), to deal
mikekelly99 0:6db20bbdc767 6 * in the Software without restriction, including without limitation the rights
mikekelly99 0:6db20bbdc767 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mikekelly99 0:6db20bbdc767 8 * copies of the Software, and to permit persons to whom the Software is
mikekelly99 0:6db20bbdc767 9 * furnished to do so, subject to the following conditions:
mikekelly99 0:6db20bbdc767 10 *
mikekelly99 0:6db20bbdc767 11 * The above copyright notice and this permission notice shall be included in
mikekelly99 0:6db20bbdc767 12 * all copies or substantial portions of the Software.
mikekelly99 0:6db20bbdc767 13 *
mikekelly99 0:6db20bbdc767 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mikekelly99 0:6db20bbdc767 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mikekelly99 0:6db20bbdc767 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mikekelly99 0:6db20bbdc767 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mikekelly99 0:6db20bbdc767 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mikekelly99 0:6db20bbdc767 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
mikekelly99 0:6db20bbdc767 20 * SOFTWARE.
mikekelly99 0:6db20bbdc767 21 */
mikekelly99 0:6db20bbdc767 22 #include "mbed.h"
mikekelly99 0:6db20bbdc767 23
mikekelly99 0:6db20bbdc767 24 #include "ffconf.h"
mikekelly99 0:6db20bbdc767 25 #include "mbed_debug.h"
mikekelly99 0:6db20bbdc767 26
mikekelly99 0:6db20bbdc767 27 #include "FATFileSystem.h"
mikekelly99 0:6db20bbdc767 28 #include "FATFileHandle.h"
mikekelly99 0:6db20bbdc767 29 #include "FATDirHandle.h"
mikekelly99 0:6db20bbdc767 30
mikekelly99 0:6db20bbdc767 31 DWORD get_fattime(void) {
mikekelly99 0:6db20bbdc767 32 time_t rawtime;
mikekelly99 0:6db20bbdc767 33 time(&rawtime);
mikekelly99 0:6db20bbdc767 34 struct tm *ptm = localtime(&rawtime);
mikekelly99 0:6db20bbdc767 35 return (DWORD)(ptm->tm_year - 80) << 25
mikekelly99 0:6db20bbdc767 36 | (DWORD)(ptm->tm_mon + 1 ) << 21
mikekelly99 0:6db20bbdc767 37 | (DWORD)(ptm->tm_mday ) << 16
mikekelly99 0:6db20bbdc767 38 | (DWORD)(ptm->tm_hour ) << 11
mikekelly99 0:6db20bbdc767 39 | (DWORD)(ptm->tm_min ) << 5
mikekelly99 0:6db20bbdc767 40 | (DWORD)(ptm->tm_sec/2 );
mikekelly99 0:6db20bbdc767 41 }
mikekelly99 0:6db20bbdc767 42
mikekelly99 0:6db20bbdc767 43 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0};
mikekelly99 0:6db20bbdc767 44
mikekelly99 0:6db20bbdc767 45 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
mikekelly99 0:6db20bbdc767 46 debug_if(FFS_DBG, "FATFileSystem(%s)\n", n);
mikekelly99 0:6db20bbdc767 47 for(int i=0; i<_VOLUMES; i++) {
mikekelly99 0:6db20bbdc767 48 if(_ffs[i] == 0) {
mikekelly99 0:6db20bbdc767 49 _ffs[i] = this;
mikekelly99 0:6db20bbdc767 50 _fsid[0] = '0' + i;
mikekelly99 0:6db20bbdc767 51 _fsid[1] = '\0';
mikekelly99 0:6db20bbdc767 52 debug_if(FFS_DBG, "Mounting [%s] on ffs drive [%s]\n", getName(), _fsid);
mikekelly99 0:6db20bbdc767 53 f_mount(&_fs, _fsid, 0);
mikekelly99 0:6db20bbdc767 54 return;
mikekelly99 0:6db20bbdc767 55 }
mikekelly99 0:6db20bbdc767 56 }
mikekelly99 0:6db20bbdc767 57 error("Couldn't create %s in FATFileSystem::FATFileSystem\n", n);
mikekelly99 0:6db20bbdc767 58 }
mikekelly99 0:6db20bbdc767 59
mikekelly99 0:6db20bbdc767 60 FATFileSystem::~FATFileSystem() {
mikekelly99 0:6db20bbdc767 61 for (int i=0; i<_VOLUMES; i++) {
mikekelly99 0:6db20bbdc767 62 if (_ffs[i] == this) {
mikekelly99 0:6db20bbdc767 63 _ffs[i] = 0;
mikekelly99 0:6db20bbdc767 64 f_mount(NULL, _fsid, 0);
mikekelly99 0:6db20bbdc767 65 }
mikekelly99 0:6db20bbdc767 66 }
mikekelly99 0:6db20bbdc767 67 }
mikekelly99 0:6db20bbdc767 68
mikekelly99 0:6db20bbdc767 69 FileHandle *FATFileSystem::open(const char* name, int flags) {
mikekelly99 0:6db20bbdc767 70 debug_if(FFS_DBG, "open(%s) on filesystem [%s], drv [%s]\n", name, getName(), _fsid);
mikekelly99 0:6db20bbdc767 71 char n[64];
mikekelly99 0:6db20bbdc767 72 sprintf(n, "%s:/%s", _fsid, name);
mikekelly99 0:6db20bbdc767 73
mikekelly99 0:6db20bbdc767 74 /* POSIX flags -> FatFS open mode */
mikekelly99 0:6db20bbdc767 75 BYTE openmode;
mikekelly99 0:6db20bbdc767 76 if (flags & O_RDWR) {
mikekelly99 0:6db20bbdc767 77 openmode = FA_READ|FA_WRITE;
mikekelly99 0:6db20bbdc767 78 } else if(flags & O_WRONLY) {
mikekelly99 0:6db20bbdc767 79 openmode = FA_WRITE;
mikekelly99 0:6db20bbdc767 80 } else {
mikekelly99 0:6db20bbdc767 81 openmode = FA_READ;
mikekelly99 0:6db20bbdc767 82 }
mikekelly99 0:6db20bbdc767 83 if(flags & O_CREAT) {
mikekelly99 0:6db20bbdc767 84 if(flags & O_TRUNC) {
mikekelly99 0:6db20bbdc767 85 openmode |= FA_CREATE_ALWAYS;
mikekelly99 0:6db20bbdc767 86 } else {
mikekelly99 0:6db20bbdc767 87 openmode |= FA_OPEN_ALWAYS;
mikekelly99 0:6db20bbdc767 88 }
mikekelly99 0:6db20bbdc767 89 }
mikekelly99 0:6db20bbdc767 90
mikekelly99 0:6db20bbdc767 91 FIL fh;
mikekelly99 0:6db20bbdc767 92 FRESULT res = f_open(&fh, n, openmode);
mikekelly99 0:6db20bbdc767 93 if (res) {
mikekelly99 0:6db20bbdc767 94 debug_if(FFS_DBG, "f_open('w') failed: %d\n", res);
mikekelly99 0:6db20bbdc767 95 return NULL;
mikekelly99 0:6db20bbdc767 96 }
mikekelly99 0:6db20bbdc767 97 if (flags & O_APPEND) {
mikekelly99 0:6db20bbdc767 98 f_lseek(&fh, fh.fsize);
mikekelly99 0:6db20bbdc767 99 }
mikekelly99 0:6db20bbdc767 100 return new FATFileHandle(fh);
mikekelly99 0:6db20bbdc767 101 }
mikekelly99 0:6db20bbdc767 102
mikekelly99 0:6db20bbdc767 103 int FATFileSystem::open(FileHandle **file, const char *name, int flags) {
mikekelly99 0:6db20bbdc767 104 FileHandle *temp = open(name, flags);
mikekelly99 0:6db20bbdc767 105 if (!temp) {
mikekelly99 0:6db20bbdc767 106 return -1;
mikekelly99 0:6db20bbdc767 107 }
mikekelly99 0:6db20bbdc767 108
mikekelly99 0:6db20bbdc767 109 *file = temp;
mikekelly99 0:6db20bbdc767 110 return 0;
mikekelly99 0:6db20bbdc767 111 }
mikekelly99 0:6db20bbdc767 112
mikekelly99 0:6db20bbdc767 113 int FATFileSystem::remove(const char *filename) {
mikekelly99 0:6db20bbdc767 114 FRESULT res = f_unlink(filename);
mikekelly99 0:6db20bbdc767 115 if (res) {
mikekelly99 0:6db20bbdc767 116 debug_if(FFS_DBG, "f_unlink() failed: %d\n", res);
mikekelly99 0:6db20bbdc767 117 return -1;
mikekelly99 0:6db20bbdc767 118 }
mikekelly99 0:6db20bbdc767 119 return 0;
mikekelly99 0:6db20bbdc767 120 }
mikekelly99 0:6db20bbdc767 121
mikekelly99 0:6db20bbdc767 122 int FATFileSystem::rename(const char *oldname, const char *newname) {
mikekelly99 0:6db20bbdc767 123 FRESULT res = f_rename(oldname, newname);
mikekelly99 0:6db20bbdc767 124 if (res) {
mikekelly99 0:6db20bbdc767 125 debug_if(FFS_DBG, "f_rename() failed: %d\n", res);
mikekelly99 0:6db20bbdc767 126 return -1;
mikekelly99 0:6db20bbdc767 127 }
mikekelly99 0:6db20bbdc767 128 return 0;
mikekelly99 0:6db20bbdc767 129 }
mikekelly99 0:6db20bbdc767 130
mikekelly99 0:6db20bbdc767 131 int FATFileSystem::format() {
mikekelly99 0:6db20bbdc767 132 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
mikekelly99 0:6db20bbdc767 133 if (res) {
mikekelly99 0:6db20bbdc767 134 debug_if(FFS_DBG, "f_mkfs() failed: %d\n", res);
mikekelly99 0:6db20bbdc767 135 return -1;
mikekelly99 0:6db20bbdc767 136 }
mikekelly99 0:6db20bbdc767 137 return 0;
mikekelly99 0:6db20bbdc767 138 }
mikekelly99 0:6db20bbdc767 139
mikekelly99 0:6db20bbdc767 140 DirHandle *FATFileSystem::opendir(const char *name) {
mikekelly99 0:6db20bbdc767 141 FATFS_DIR dir;
mikekelly99 0:6db20bbdc767 142 FRESULT res = f_opendir(&dir, name);
mikekelly99 0:6db20bbdc767 143 if (res != 0) {
mikekelly99 0:6db20bbdc767 144 return NULL;
mikekelly99 0:6db20bbdc767 145 }
mikekelly99 0:6db20bbdc767 146 return new FATDirHandle(dir);
mikekelly99 0:6db20bbdc767 147 }
mikekelly99 0:6db20bbdc767 148
mikekelly99 0:6db20bbdc767 149 int FATFileSystem::open(DirHandle **dir, const char *name) {
mikekelly99 0:6db20bbdc767 150 DirHandle *temp = opendir(name);
mikekelly99 0:6db20bbdc767 151 if (!temp) {
mikekelly99 0:6db20bbdc767 152 return -1;
mikekelly99 0:6db20bbdc767 153 }
mikekelly99 0:6db20bbdc767 154
mikekelly99 0:6db20bbdc767 155 *dir = temp;
mikekelly99 0:6db20bbdc767 156 return 0;
mikekelly99 0:6db20bbdc767 157 }
mikekelly99 0:6db20bbdc767 158
mikekelly99 0:6db20bbdc767 159 int FATFileSystem::mkdir(const char *name, mode_t mode) {
mikekelly99 0:6db20bbdc767 160 FRESULT res = f_mkdir(name);
mikekelly99 0:6db20bbdc767 161 return res == 0 ? 0 : -1;
mikekelly99 0:6db20bbdc767 162 }
mikekelly99 0:6db20bbdc767 163
mikekelly99 0:6db20bbdc767 164 int FATFileSystem::mount() {
mikekelly99 0:6db20bbdc767 165 FRESULT res = f_mount(&_fs, _fsid, 1);
mikekelly99 0:6db20bbdc767 166 return res == 0 ? 0 : -1;
mikekelly99 0:6db20bbdc767 167 }
mikekelly99 0:6db20bbdc767 168
mikekelly99 0:6db20bbdc767 169 int FATFileSystem::unmount() {
mikekelly99 0:6db20bbdc767 170 if (disk_sync())
mikekelly99 0:6db20bbdc767 171 return -1;
mikekelly99 0:6db20bbdc767 172 FRESULT res = f_mount(NULL, _fsid, 0);
mikekelly99 0:6db20bbdc767 173 return res == 0 ? 0 : -1;
mikekelly99 0:6db20bbdc767 174 }