Class that contain only FATFileSystem
Fork of USBFileSystem by
USBFileSystem.cpp@0:dabe3383ef23, 2013-07-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |