Class that contain only FATFileSystem

Fork of USBFileSystem by Erik -

Committer:
Sissors
Date:
Wed Jul 31 19:15:55 2013 +0000
Revision:
0:dabe3383ef23
Child:
1:4ba08d11e36e
v0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sissors 0:dabe3383ef23 1 #include "USBFileSystem.h"
Sissors 0:dabe3383ef23 2
Sissors 0:dabe3383ef23 3 #define USBWRITE_TIMEOUT 100
Sissors 0:dabe3383ef23 4
Sissors 0:dabe3383ef23 5 USBFileSystem::USBFileSystem(const char* n) : FATFileSystem_ds(n) {
Sissors 0:dabe3383ef23 6 localFunction = NULL;
Sissors 0:dabe3383ef23 7 usbFunction = NULL;
Sissors 0:dabe3383ef23 8 usbfree = true;
Sissors 0:dabe3383ef23 9 local_count = 0;
Sissors 0:dabe3383ef23 10 }
Sissors 0:dabe3383ef23 11
Sissors 0:dabe3383ef23 12
Sissors 0:dabe3383ef23 13 FileHandle* USBFileSystem::open(const char* name, int flags){
Sissors 0:dabe3383ef23 14 char n[64];
Sissors 0:dabe3383ef23 15 sprintf(n, "%d:/%s", _fsid, name);
Sissors 0:dabe3383ef23 16 bool write = true;
Sissors 0:dabe3383ef23 17
Sissors 0:dabe3383ef23 18 /* POSIX flags -> FatFS open mode */
Sissors 0:dabe3383ef23 19 BYTE openmode;
Sissors 0:dabe3383ef23 20 if (flags & O_RDWR) {
Sissors 0:dabe3383ef23 21 openmode = FA_READ|FA_WRITE;
Sissors 0:dabe3383ef23 22 localOpen(true);
Sissors 0:dabe3383ef23 23 } else if(flags & O_WRONLY) {
Sissors 0:dabe3383ef23 24 openmode = FA_WRITE;
Sissors 0:dabe3383ef23 25 localOpen(true);
Sissors 0:dabe3383ef23 26 } else {
Sissors 0:dabe3383ef23 27 openmode = FA_READ;
Sissors 0:dabe3383ef23 28 write = false;
Sissors 0:dabe3383ef23 29 }
Sissors 0:dabe3383ef23 30 if(flags & O_CREAT) {
Sissors 0:dabe3383ef23 31 if(flags & O_TRUNC) {
Sissors 0:dabe3383ef23 32 openmode |= FA_CREATE_ALWAYS;
Sissors 0:dabe3383ef23 33 } else {
Sissors 0:dabe3383ef23 34 openmode |= FA_OPEN_ALWAYS;
Sissors 0:dabe3383ef23 35 }
Sissors 0:dabe3383ef23 36 }
Sissors 0:dabe3383ef23 37
Sissors 0:dabe3383ef23 38 FIL fh;
Sissors 0:dabe3383ef23 39 FRESULT res = f_open(&fh, n, openmode);
Sissors 0:dabe3383ef23 40 if (res) {
Sissors 0:dabe3383ef23 41 if (write)
Sissors 0:dabe3383ef23 42 local_count--;
Sissors 0:dabe3383ef23 43 return NULL;
Sissors 0:dabe3383ef23 44 }
Sissors 0:dabe3383ef23 45 if (flags & O_APPEND) {
Sissors 0:dabe3383ef23 46 f_lseek(&fh, fh.fsize);
Sissors 0:dabe3383ef23 47 }
Sissors 0:dabe3383ef23 48 return new USBFileHandle(fh, this, write);
Sissors 0:dabe3383ef23 49 }
Sissors 0:dabe3383ef23 50
Sissors 0:dabe3383ef23 51 bool USBFileSystem::localSafe( void ){
Sissors 0:dabe3383ef23 52 return (local_count == 0);
Sissors 0:dabe3383ef23 53 }
Sissors 0:dabe3383ef23 54
Sissors 0:dabe3383ef23 55 bool USBFileSystem::usbSafe( void ){
Sissors 0:dabe3383ef23 56 return usbfree;
Sissors 0:dabe3383ef23 57 }
Sissors 0:dabe3383ef23 58
Sissors 0:dabe3383ef23 59 int USBFileSystem::disk_status_fat() {
Sissors 0:dabe3383ef23 60 int retval = _disk_status();
Sissors 0:dabe3383ef23 61
Sissors 0:dabe3383ef23 62 if ((retval == 0) && (!usbSafe()))
Sissors 0:dabe3383ef23 63 return 4;
Sissors 0:dabe3383ef23 64 else
Sissors 0:dabe3383ef23 65 return retval;
Sissors 0:dabe3383ef23 66 }
Sissors 0:dabe3383ef23 67
Sissors 0:dabe3383ef23 68 int USBFileSystem::disk_status_msd() {
Sissors 0:dabe3383ef23 69 int retval = _disk_status();
Sissors 0:dabe3383ef23 70
Sissors 0:dabe3383ef23 71 if ((retval == 0) && (!localSafe()))
Sissors 0:dabe3383ef23 72 return 4;
Sissors 0:dabe3383ef23 73 else
Sissors 0:dabe3383ef23 74 return retval;
Sissors 0:dabe3383ef23 75 }
Sissors 0:dabe3383ef23 76
Sissors 0:dabe3383ef23 77 int USBFileSystem::disk_write(const uint8_t * data, uint64_t block) {
Sissors 0:dabe3383ef23 78 if (localSafe()) {
Sissors 0:dabe3383ef23 79 if (usbfree && (usbFunction!=NULL) )
Sissors 0:dabe3383ef23 80 usbFunction(false);
Sissors 0:dabe3383ef23 81
Sissors 0:dabe3383ef23 82 usbfree = false;
Sissors 0:dabe3383ef23 83 }
Sissors 0:dabe3383ef23 84
Sissors 0:dabe3383ef23 85 int retval= _disk_write(data, block);
Sissors 0:dabe3383ef23 86
Sissors 0:dabe3383ef23 87 if (localSafe())
Sissors 0:dabe3383ef23 88 usb_write.attach_us(this, &USBFileSystem::usbFree, USBWRITE_TIMEOUT * 1000);
Sissors 0:dabe3383ef23 89
Sissors 0:dabe3383ef23 90 return retval;
Sissors 0:dabe3383ef23 91 }
Sissors 0:dabe3383ef23 92
Sissors 0:dabe3383ef23 93 void USBFileSystem::localOpen(bool open) {
Sissors 0:dabe3383ef23 94 if (open) {
Sissors 0:dabe3383ef23 95 local_count++;
Sissors 0:dabe3383ef23 96 } else {
Sissors 0:dabe3383ef23 97 local_count--;
Sissors 0:dabe3383ef23 98 }
Sissors 0:dabe3383ef23 99
Sissors 0:dabe3383ef23 100 //Pseudo-IRQ
Sissors 0:dabe3383ef23 101 if (localFunction != NULL) {
Sissors 0:dabe3383ef23 102 if (open && (local_count == 1))
Sissors 0:dabe3383ef23 103 (*localFunction)(false);
Sissors 0:dabe3383ef23 104 if (!open && (local_count == 0))
Sissors 0:dabe3383ef23 105 (*localFunction)(true);
Sissors 0:dabe3383ef23 106 }
Sissors 0:dabe3383ef23 107 }
Sissors 0:dabe3383ef23 108
Sissors 0:dabe3383ef23 109 void USBFileSystem::attachLocal(void (*function)(bool)) {
Sissors 0:dabe3383ef23 110 localFunction = function;
Sissors 0:dabe3383ef23 111 }
Sissors 0:dabe3383ef23 112
Sissors 0:dabe3383ef23 113 void USBFileSystem::attachUSB(void (*function)(bool)) {
Sissors 0:dabe3383ef23 114 usbFunction = function;
Sissors 0:dabe3383ef23 115 }
Sissors 0:dabe3383ef23 116
Sissors 0:dabe3383ef23 117 void USBFileSystem::usbFree( void ) {
Sissors 0:dabe3383ef23 118 usbfree = true;
Sissors 0:dabe3383ef23 119 if (usbFunction != NULL)
Sissors 0:dabe3383ef23 120 usbFunction(true);
Sissors 0:dabe3383ef23 121 }