Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

Committer:
Michael J. Spencer
Date:
Fri Feb 28 18:52:52 2014 -0800
Revision:
2:1df0b61d3b5a
Update to latest Smoothie.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Michael J. Spencer 2:1df0b61d3b5a 1 /* mbed Microcontroller Library - FATFileHandle
Michael J. Spencer 2:1df0b61d3b5a 2 * Copyright (c) 2008, sford
Michael J. Spencer 2:1df0b61d3b5a 3 */
Michael J. Spencer 2:1df0b61d3b5a 4
Michael J. Spencer 2:1df0b61d3b5a 5 #include "FATFileHandle.h"
Michael J. Spencer 2:1df0b61d3b5a 6
Michael J. Spencer 2:1df0b61d3b5a 7 #include <stdio.h>
Michael J. Spencer 2:1df0b61d3b5a 8 #include <stdlib.h>
Michael J. Spencer 2:1df0b61d3b5a 9 #include "ff.h"
Michael J. Spencer 2:1df0b61d3b5a 10 #include "FATFileSystem.h"
Michael J. Spencer 2:1df0b61d3b5a 11
Michael J. Spencer 2:1df0b61d3b5a 12 namespace mbed {
Michael J. Spencer 2:1df0b61d3b5a 13
Michael J. Spencer 2:1df0b61d3b5a 14 #if FFSDEBUG_ENABLED
Michael J. Spencer 2:1df0b61d3b5a 15 static const char *FR_ERRORS[] = {
Michael J. Spencer 2:1df0b61d3b5a 16 "FR_OK = 0",
Michael J. Spencer 2:1df0b61d3b5a 17 "FR_NOT_READY",
Michael J. Spencer 2:1df0b61d3b5a 18 "FR_NO_FILE",
Michael J. Spencer 2:1df0b61d3b5a 19 "FR_NO_PATH",
Michael J. Spencer 2:1df0b61d3b5a 20 "FR_INVALID_NAME",
Michael J. Spencer 2:1df0b61d3b5a 21 "FR_INVALID_DRIVE",
Michael J. Spencer 2:1df0b61d3b5a 22 "FR_DENIED",
Michael J. Spencer 2:1df0b61d3b5a 23 "FR_EXIST",
Michael J. Spencer 2:1df0b61d3b5a 24 "FR_RW_ERROR",
Michael J. Spencer 2:1df0b61d3b5a 25 "FR_WRITE_PROTECTED",
Michael J. Spencer 2:1df0b61d3b5a 26 "FR_NOT_ENABLED",
Michael J. Spencer 2:1df0b61d3b5a 27 "FR_NO_FILESYSTEM",
Michael J. Spencer 2:1df0b61d3b5a 28 "FR_INVALID_OBJECT",
Michael J. Spencer 2:1df0b61d3b5a 29 "FR_MKFS_ABORTED"
Michael J. Spencer 2:1df0b61d3b5a 30 };
Michael J. Spencer 2:1df0b61d3b5a 31 #endif
Michael J. Spencer 2:1df0b61d3b5a 32
Michael J. Spencer 2:1df0b61d3b5a 33 FATFileHandle::FATFileHandle(FIL_t fh) {
Michael J. Spencer 2:1df0b61d3b5a 34 _fh = fh;
Michael J. Spencer 2:1df0b61d3b5a 35 }
Michael J. Spencer 2:1df0b61d3b5a 36
Michael J. Spencer 2:1df0b61d3b5a 37 int FATFileHandle::close() {
Michael J. Spencer 2:1df0b61d3b5a 38 FFSDEBUG("close\n");
Michael J. Spencer 2:1df0b61d3b5a 39 int retval = f_close(&_fh);
Michael J. Spencer 2:1df0b61d3b5a 40 delete this;
Michael J. Spencer 2:1df0b61d3b5a 41 return retval;
Michael J. Spencer 2:1df0b61d3b5a 42 }
Michael J. Spencer 2:1df0b61d3b5a 43
Michael J. Spencer 2:1df0b61d3b5a 44 ssize_t FATFileHandle::write(const void* buffer, size_t length) {
Michael J. Spencer 2:1df0b61d3b5a 45 FFSDEBUG("write(%d)\n", length);
Michael J. Spencer 2:1df0b61d3b5a 46 UINT n;
Michael J. Spencer 2:1df0b61d3b5a 47 FRESULT res = f_write(&_fh, buffer, length, &n);
Michael J. Spencer 2:1df0b61d3b5a 48 if(res) {
Michael J. Spencer 2:1df0b61d3b5a 49 FFSDEBUG("f_write() failed (%d, %s)", res, FR_ERRORS[res]);
Michael J. Spencer 2:1df0b61d3b5a 50 return -1;
Michael J. Spencer 2:1df0b61d3b5a 51 }
Michael J. Spencer 2:1df0b61d3b5a 52 return n;
Michael J. Spencer 2:1df0b61d3b5a 53 }
Michael J. Spencer 2:1df0b61d3b5a 54
Michael J. Spencer 2:1df0b61d3b5a 55 ssize_t FATFileHandle::read(void* buffer, size_t length) {
Michael J. Spencer 2:1df0b61d3b5a 56 FFSDEBUG("read(%d)\n", length);
Michael J. Spencer 2:1df0b61d3b5a 57 UINT n;
Michael J. Spencer 2:1df0b61d3b5a 58 FRESULT res = f_read(&_fh, buffer, length, &n);
Michael J. Spencer 2:1df0b61d3b5a 59 if(res) {
Michael J. Spencer 2:1df0b61d3b5a 60 FFSDEBUG("f_read() failed (%d, %s)\n", res, FR_ERRORS[res]);
Michael J. Spencer 2:1df0b61d3b5a 61 return -1;
Michael J. Spencer 2:1df0b61d3b5a 62 }
Michael J. Spencer 2:1df0b61d3b5a 63 return n;
Michael J. Spencer 2:1df0b61d3b5a 64 }
Michael J. Spencer 2:1df0b61d3b5a 65
Michael J. Spencer 2:1df0b61d3b5a 66 int FATFileHandle::isatty() {
Michael J. Spencer 2:1df0b61d3b5a 67 return 0;
Michael J. Spencer 2:1df0b61d3b5a 68 }
Michael J. Spencer 2:1df0b61d3b5a 69
Michael J. Spencer 2:1df0b61d3b5a 70 off_t FATFileHandle::lseek(off_t position, int whence) {
Michael J. Spencer 2:1df0b61d3b5a 71 FFSDEBUG("lseek(%i,%i)\n",position,whence);
Michael J. Spencer 2:1df0b61d3b5a 72 if(whence == SEEK_END) {
Michael J. Spencer 2:1df0b61d3b5a 73 position += _fh.fsize;
Michael J. Spencer 2:1df0b61d3b5a 74 } else if(whence==SEEK_CUR) {
Michael J. Spencer 2:1df0b61d3b5a 75 position += _fh.fptr;
Michael J. Spencer 2:1df0b61d3b5a 76 }
Michael J. Spencer 2:1df0b61d3b5a 77 FRESULT res = f_lseek(&_fh, position);
Michael J. Spencer 2:1df0b61d3b5a 78 if(res) {
Michael J. Spencer 2:1df0b61d3b5a 79 FFSDEBUG("lseek failed (%d, %s)\n", res, FR_ERRORS[res]);
Michael J. Spencer 2:1df0b61d3b5a 80 return -1;
Michael J. Spencer 2:1df0b61d3b5a 81 } else {
Michael J. Spencer 2:1df0b61d3b5a 82 FFSDEBUG("lseek OK, returning %i\n", _fh.fptr);
Michael J. Spencer 2:1df0b61d3b5a 83 return _fh.fptr;
Michael J. Spencer 2:1df0b61d3b5a 84 }
Michael J. Spencer 2:1df0b61d3b5a 85 }
Michael J. Spencer 2:1df0b61d3b5a 86
Michael J. Spencer 2:1df0b61d3b5a 87 int FATFileHandle::fsync() {
Michael J. Spencer 2:1df0b61d3b5a 88 FFSDEBUG("fsync()\n");
Michael J. Spencer 2:1df0b61d3b5a 89 FRESULT res = f_sync(&_fh);
Michael J. Spencer 2:1df0b61d3b5a 90 if (res) {
Michael J. Spencer 2:1df0b61d3b5a 91 FFSDEBUG("f_sync() failed (%d, %s)\n", res, FR_ERRORS[res]);
Michael J. Spencer 2:1df0b61d3b5a 92 return -1;
Michael J. Spencer 2:1df0b61d3b5a 93 }
Michael J. Spencer 2:1df0b61d3b5a 94 return 0;
Michael J. Spencer 2:1df0b61d3b5a 95 }
Michael J. Spencer 2:1df0b61d3b5a 96
Michael J. Spencer 2:1df0b61d3b5a 97 off_t FATFileHandle::flen() {
Michael J. Spencer 2:1df0b61d3b5a 98 FFSDEBUG("flen\n");
Michael J. Spencer 2:1df0b61d3b5a 99 return _fh.fsize;
Michael J. Spencer 2:1df0b61d3b5a 100 }
Michael J. Spencer 2:1df0b61d3b5a 101
Michael J. Spencer 2:1df0b61d3b5a 102 } // namespace mbed