Code for autonomous ground vehicle, Data Bus, 3rd place winner in 2012 Sparkfun AVC.

Dependencies:   Watchdog mbed Schedule SimpleFilter LSM303DLM PinDetect DebounceIn Servo

Committer:
shimniok
Date:
Wed Jun 20 14:57:48 2012 +0000
Revision:
0:826c6171fc1b
Updated documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:826c6171fc1b 1 /* mbed Microcontroller Library - FATFileSystem
shimniok 0:826c6171fc1b 2 Copyright (c) 2008, sford */
shimniok 0:826c6171fc1b 3
shimniok 0:826c6171fc1b 4 //Modified by Thomas Hamilton, Copyright 2010
shimniok 0:826c6171fc1b 5
shimniok 0:826c6171fc1b 6 #include "FATFileSystem.h"
shimniok 0:826c6171fc1b 7
shimniok 0:826c6171fc1b 8 DWORD get_fattime(void)
shimniok 0:826c6171fc1b 9 {
shimniok 0:826c6171fc1b 10 return 35719201;
shimniok 0:826c6171fc1b 11 }
shimniok 0:826c6171fc1b 12
shimniok 0:826c6171fc1b 13 FATFileSystem* FATFileSystem::DriveArray[_DRIVES] = {0};
shimniok 0:826c6171fc1b 14
shimniok 0:826c6171fc1b 15 FATFileSystem::FATFileSystem(const char* SystemName) : FileSystemLike(SystemName)
shimniok 0:826c6171fc1b 16 {
shimniok 0:826c6171fc1b 17 for (unsigned char i = 0; i < _DRIVES; i++)
shimniok 0:826c6171fc1b 18 {
shimniok 0:826c6171fc1b 19 if(!DriveArray[i])
shimniok 0:826c6171fc1b 20 {
shimniok 0:826c6171fc1b 21 DriveArray[i] = this;
shimniok 0:826c6171fc1b 22 Drive = i;
shimniok 0:826c6171fc1b 23 f_mount((BYTE)i, &FileSystemObject);
shimniok 0:826c6171fc1b 24 return;
shimniok 0:826c6171fc1b 25 }
shimniok 0:826c6171fc1b 26 }
shimniok 0:826c6171fc1b 27 }
shimniok 0:826c6171fc1b 28
shimniok 0:826c6171fc1b 29 FATFileSystem::~FATFileSystem()
shimniok 0:826c6171fc1b 30 {
shimniok 0:826c6171fc1b 31 for (unsigned char i = 0; i < _DRIVES; i++)
shimniok 0:826c6171fc1b 32 {
shimniok 0:826c6171fc1b 33 if (DriveArray[i] == this)
shimniok 0:826c6171fc1b 34 {
shimniok 0:826c6171fc1b 35 DriveArray[i] = NULL;
shimniok 0:826c6171fc1b 36 f_mount((BYTE)i, NULL);
shimniok 0:826c6171fc1b 37 }
shimniok 0:826c6171fc1b 38 }
shimniok 0:826c6171fc1b 39 delete this;
shimniok 0:826c6171fc1b 40 }
shimniok 0:826c6171fc1b 41
shimniok 0:826c6171fc1b 42 FileHandle* FATFileSystem::open(const char* filename, int flags)
shimniok 0:826c6171fc1b 43 {
shimniok 0:826c6171fc1b 44 FAT_FIL FileObject;
shimniok 0:826c6171fc1b 45 char FileName[64];
shimniok 0:826c6171fc1b 46 BYTE ModeFlags = 0;
shimniok 0:826c6171fc1b 47
shimniok 0:826c6171fc1b 48 sprintf(FileName, "%d:/%s", Drive, filename);
shimniok 0:826c6171fc1b 49 switch (flags & 3)
shimniok 0:826c6171fc1b 50 {
shimniok 0:826c6171fc1b 51 case O_RDONLY: ModeFlags = FA_READ; break;
shimniok 0:826c6171fc1b 52 case O_WRONLY: ModeFlags = FA_WRITE; break;
shimniok 0:826c6171fc1b 53 case O_RDWR: ModeFlags = FA_READ | FA_WRITE; break;
shimniok 0:826c6171fc1b 54 }
shimniok 0:826c6171fc1b 55 if(flags & O_CREAT)
shimniok 0:826c6171fc1b 56 {
shimniok 0:826c6171fc1b 57 if(flags & O_TRUNC)
shimniok 0:826c6171fc1b 58 {
shimniok 0:826c6171fc1b 59 ModeFlags |= FA_CREATE_ALWAYS;
shimniok 0:826c6171fc1b 60 }
shimniok 0:826c6171fc1b 61 else
shimniok 0:826c6171fc1b 62 {
shimniok 0:826c6171fc1b 63 ModeFlags |= FA_OPEN_ALWAYS;
shimniok 0:826c6171fc1b 64 }
shimniok 0:826c6171fc1b 65 }
shimniok 0:826c6171fc1b 66 else
shimniok 0:826c6171fc1b 67 {
shimniok 0:826c6171fc1b 68 ModeFlags |= FA_OPEN_EXISTING;
shimniok 0:826c6171fc1b 69 }
shimniok 0:826c6171fc1b 70 if (f_open(&FileObject, (const TCHAR*)FileName, ModeFlags))
shimniok 0:826c6171fc1b 71 {
shimniok 0:826c6171fc1b 72 return NULL;
shimniok 0:826c6171fc1b 73 }
shimniok 0:826c6171fc1b 74 else
shimniok 0:826c6171fc1b 75 {
shimniok 0:826c6171fc1b 76 if (flags & O_APPEND)
shimniok 0:826c6171fc1b 77 {
shimniok 0:826c6171fc1b 78 f_lseek(&FileObject, (DWORD)FileObject.fsize);
shimniok 0:826c6171fc1b 79 }
shimniok 0:826c6171fc1b 80 return new FATFileHandle(FileObject);
shimniok 0:826c6171fc1b 81 }
shimniok 0:826c6171fc1b 82 }
shimniok 0:826c6171fc1b 83
shimniok 0:826c6171fc1b 84 int FATFileSystem::remove(const char* filename)
shimniok 0:826c6171fc1b 85 {
shimniok 0:826c6171fc1b 86 char FileName[64];
shimniok 0:826c6171fc1b 87
shimniok 0:826c6171fc1b 88 sprintf(FileName, "%d:/%s", Drive, filename);
shimniok 0:826c6171fc1b 89 if (f_unlink((const TCHAR*)FileName))
shimniok 0:826c6171fc1b 90 {
shimniok 0:826c6171fc1b 91 return -1;
shimniok 0:826c6171fc1b 92 }
shimniok 0:826c6171fc1b 93 else
shimniok 0:826c6171fc1b 94 {
shimniok 0:826c6171fc1b 95 return 0;
shimniok 0:826c6171fc1b 96 }
shimniok 0:826c6171fc1b 97 }
shimniok 0:826c6171fc1b 98
shimniok 0:826c6171fc1b 99 int FATFileSystem::rename(const char* oldname, const char* newname)
shimniok 0:826c6171fc1b 100 {
shimniok 0:826c6171fc1b 101 char OldName[64];
shimniok 0:826c6171fc1b 102
shimniok 0:826c6171fc1b 103 sprintf(OldName, "%d:/%s", Drive, oldname);
shimniok 0:826c6171fc1b 104 if (f_rename((const TCHAR*)OldName, (const TCHAR*)newname))
shimniok 0:826c6171fc1b 105 {
shimniok 0:826c6171fc1b 106 return -1;
shimniok 0:826c6171fc1b 107 }
shimniok 0:826c6171fc1b 108 else
shimniok 0:826c6171fc1b 109 {
shimniok 0:826c6171fc1b 110 return 0;
shimniok 0:826c6171fc1b 111 }
shimniok 0:826c6171fc1b 112 }
shimniok 0:826c6171fc1b 113
shimniok 0:826c6171fc1b 114 DirHandle* FATFileSystem::opendir(const char* name)
shimniok 0:826c6171fc1b 115 {
shimniok 0:826c6171fc1b 116 FAT_DIR DirectoryObject;
shimniok 0:826c6171fc1b 117 char DirectoryName[64];
shimniok 0:826c6171fc1b 118
shimniok 0:826c6171fc1b 119 sprintf(DirectoryName, "%d:%s", Drive, name);
shimniok 0:826c6171fc1b 120 if (f_opendir(&DirectoryObject, (const TCHAR*)DirectoryName))
shimniok 0:826c6171fc1b 121 {
shimniok 0:826c6171fc1b 122 return NULL;
shimniok 0:826c6171fc1b 123 }
shimniok 0:826c6171fc1b 124 else
shimniok 0:826c6171fc1b 125 {
shimniok 0:826c6171fc1b 126 return new FATDirHandle(DirectoryObject);
shimniok 0:826c6171fc1b 127 }
shimniok 0:826c6171fc1b 128 }
shimniok 0:826c6171fc1b 129
shimniok 0:826c6171fc1b 130 int FATFileSystem::mkdir(const char* name, mode_t mode)
shimniok 0:826c6171fc1b 131 {
shimniok 0:826c6171fc1b 132 char DirectoryName[64];
shimniok 0:826c6171fc1b 133
shimniok 0:826c6171fc1b 134 sprintf(DirectoryName, "%d:%s", Drive, name);
shimniok 0:826c6171fc1b 135 if (f_mkdir((const TCHAR*)DirectoryName))
shimniok 0:826c6171fc1b 136 {
shimniok 0:826c6171fc1b 137 return -1;
shimniok 0:826c6171fc1b 138 }
shimniok 0:826c6171fc1b 139 else
shimniok 0:826c6171fc1b 140 {
shimniok 0:826c6171fc1b 141 return 0;
shimniok 0:826c6171fc1b 142 }
shimniok 0:826c6171fc1b 143 }
shimniok 0:826c6171fc1b 144
shimniok 0:826c6171fc1b 145 int FATFileSystem::format(unsigned int allocationunit)
shimniok 0:826c6171fc1b 146 {
shimniok 0:826c6171fc1b 147 if (f_mkfs(Drive, 0, allocationunit))
shimniok 0:826c6171fc1b 148 {
shimniok 0:826c6171fc1b 149 return -1;
shimniok 0:826c6171fc1b 150 }
shimniok 0:826c6171fc1b 151 else
shimniok 0:826c6171fc1b 152 {
shimniok 0:826c6171fc1b 153 return 0;
shimniok 0:826c6171fc1b 154 }
shimniok 0:826c6171fc1b 155 }