Web server based weather station using Sparkfun Weather Meters.

Dependencies:   FatFileSystem mbed WeatherMeters SDFileSystem

Committer:
AdamGreen
Date:
Thu Feb 23 21:38:39 2012 +0000
Revision:
0:616601bde9fb

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 0:616601bde9fb 1 /* mbed Microcontroller Library - FATFileSystem
AdamGreen 0:616601bde9fb 2 * Copyright (c) 2008, sford
AdamGreen 0:616601bde9fb 3 */
AdamGreen 0:616601bde9fb 4
AdamGreen 0:616601bde9fb 5 #include "FATFileSystem.h"
AdamGreen 0:616601bde9fb 6
AdamGreen 0:616601bde9fb 7 #include "mbed.h"
AdamGreen 0:616601bde9fb 8
AdamGreen 0:616601bde9fb 9 #include "FileSystemLike.h"
AdamGreen 0:616601bde9fb 10 #include "FATFileHandle.h"
AdamGreen 0:616601bde9fb 11 #include "FATDirHandle.h"
AdamGreen 0:616601bde9fb 12 #include "ff.h"
AdamGreen 0:616601bde9fb 13 //#include "Debug.h"
AdamGreen 0:616601bde9fb 14 #include <stdio.h>
AdamGreen 0:616601bde9fb 15 #include <stdlib.h>
AdamGreen 0:616601bde9fb 16
AdamGreen 0:616601bde9fb 17 DWORD get_fattime (void) {
AdamGreen 0:616601bde9fb 18 return 999;
AdamGreen 0:616601bde9fb 19 }
AdamGreen 0:616601bde9fb 20
AdamGreen 0:616601bde9fb 21 namespace mbed {
AdamGreen 0:616601bde9fb 22
AdamGreen 0:616601bde9fb 23 #if FFSDEBUG_ENABLED
AdamGreen 0:616601bde9fb 24 static const char *FR_ERRORS[] = {
AdamGreen 0:616601bde9fb 25 "FR_OK = 0",
AdamGreen 0:616601bde9fb 26 "FR_NOT_READY",
AdamGreen 0:616601bde9fb 27 "FR_NO_FILE",
AdamGreen 0:616601bde9fb 28 "FR_NO_PATH",
AdamGreen 0:616601bde9fb 29 "FR_INVALID_NAME",
AdamGreen 0:616601bde9fb 30 "FR_INVALID_DRIVE",
AdamGreen 0:616601bde9fb 31 "FR_DENIED",
AdamGreen 0:616601bde9fb 32 "FR_EXIST",
AdamGreen 0:616601bde9fb 33 "FR_RW_ERROR",
AdamGreen 0:616601bde9fb 34 "FR_WRITE_PROTECTED",
AdamGreen 0:616601bde9fb 35 "FR_NOT_ENABLED",
AdamGreen 0:616601bde9fb 36 "FR_NO_FILESYSTEM",
AdamGreen 0:616601bde9fb 37 "FR_INVALID_OBJECT",
AdamGreen 0:616601bde9fb 38 "FR_MKFS_ABORTED"
AdamGreen 0:616601bde9fb 39 };
AdamGreen 0:616601bde9fb 40 #endif
AdamGreen 0:616601bde9fb 41
AdamGreen 0:616601bde9fb 42 FATFileSystem *FATFileSystem::_ffs[_VOLUMES] = {0};
AdamGreen 0:616601bde9fb 43
AdamGreen 0:616601bde9fb 44 FATFileSystem::FATFileSystem(const char* n) : FileSystemLike(n) {
AdamGreen 0:616601bde9fb 45 FFSDEBUG("FATFileSystem(%s)\n", n);
AdamGreen 0:616601bde9fb 46 for(int i=0; i<_VOLUMES; i++) {
AdamGreen 0:616601bde9fb 47 if(_ffs[i] == 0) {
AdamGreen 0:616601bde9fb 48 _ffs[i] = this;
AdamGreen 0:616601bde9fb 49 _fsid = i;
AdamGreen 0:616601bde9fb 50 FFSDEBUG("Mounting [%s] on ffs drive [%d]\n", _name, _fsid);
AdamGreen 0:616601bde9fb 51 f_mount(i, &_fs);
AdamGreen 0:616601bde9fb 52 return;
AdamGreen 0:616601bde9fb 53 }
AdamGreen 0:616601bde9fb 54 }
AdamGreen 0:616601bde9fb 55 error("Couldn't create %s in FATFileSystem::FATFileSystem\n",n);
AdamGreen 0:616601bde9fb 56 }
AdamGreen 0:616601bde9fb 57
AdamGreen 0:616601bde9fb 58 FATFileSystem::~FATFileSystem() {
AdamGreen 0:616601bde9fb 59 for(int i=0; i<_VOLUMES; i++) {
AdamGreen 0:616601bde9fb 60 if(_ffs[i] == this) {
AdamGreen 0:616601bde9fb 61 _ffs[i] = 0;
AdamGreen 0:616601bde9fb 62 f_mount(i, NULL);
AdamGreen 0:616601bde9fb 63 }
AdamGreen 0:616601bde9fb 64 }
AdamGreen 0:616601bde9fb 65 }
AdamGreen 0:616601bde9fb 66
AdamGreen 0:616601bde9fb 67 FileHandle *FATFileSystem::open(const char* name, int flags) {
AdamGreen 0:616601bde9fb 68 FFSDEBUG("open(%s) on filesystem [%s], drv [%d]\n", name, _name, _fsid);
AdamGreen 0:616601bde9fb 69 char n[64];
AdamGreen 0:616601bde9fb 70 sprintf(n, "%d:/%s", _fsid, name);
AdamGreen 0:616601bde9fb 71
AdamGreen 0:616601bde9fb 72 /* POSIX flags -> FatFS open mode */
AdamGreen 0:616601bde9fb 73 BYTE openmode;
AdamGreen 0:616601bde9fb 74 if(flags & O_RDWR) {
AdamGreen 0:616601bde9fb 75 openmode = FA_READ|FA_WRITE;
AdamGreen 0:616601bde9fb 76 } else if(flags & O_WRONLY) {
AdamGreen 0:616601bde9fb 77 openmode = FA_WRITE;
AdamGreen 0:616601bde9fb 78 } else {
AdamGreen 0:616601bde9fb 79 openmode = FA_READ;
AdamGreen 0:616601bde9fb 80 }
AdamGreen 0:616601bde9fb 81 if(flags & O_CREAT) {
AdamGreen 0:616601bde9fb 82 if(flags & O_TRUNC) {
AdamGreen 0:616601bde9fb 83 openmode |= FA_CREATE_ALWAYS;
AdamGreen 0:616601bde9fb 84 } else {
AdamGreen 0:616601bde9fb 85 openmode |= FA_OPEN_ALWAYS;
AdamGreen 0:616601bde9fb 86 }
AdamGreen 0:616601bde9fb 87 }
AdamGreen 0:616601bde9fb 88
AdamGreen 0:616601bde9fb 89 FIL fh;
AdamGreen 0:616601bde9fb 90 FRESULT res = f_open(&fh, n, openmode);
AdamGreen 0:616601bde9fb 91 if(res) {
AdamGreen 0:616601bde9fb 92 FFSDEBUG("f_open('w') failed (%d, %s)\n", res, FR_ERRORS[res]);
AdamGreen 0:616601bde9fb 93 return NULL;
AdamGreen 0:616601bde9fb 94 }
AdamGreen 0:616601bde9fb 95 if(flags & O_APPEND) {
AdamGreen 0:616601bde9fb 96 f_lseek(&fh, fh.fsize);
AdamGreen 0:616601bde9fb 97 }
AdamGreen 0:616601bde9fb 98 return new FATFileHandle(fh);
AdamGreen 0:616601bde9fb 99 }
AdamGreen 0:616601bde9fb 100
AdamGreen 0:616601bde9fb 101 int FATFileSystem::remove(const char *filename) {
AdamGreen 0:616601bde9fb 102 FRESULT res = f_unlink(filename);
AdamGreen 0:616601bde9fb 103 if(res) {
AdamGreen 0:616601bde9fb 104 FFSDEBUG("f_unlink() failed (%d, %s)\n", res, FR_ERRORS[res]);
AdamGreen 0:616601bde9fb 105 return -1;
AdamGreen 0:616601bde9fb 106 }
AdamGreen 0:616601bde9fb 107 return 0;
AdamGreen 0:616601bde9fb 108 }
AdamGreen 0:616601bde9fb 109
AdamGreen 0:616601bde9fb 110 int FATFileSystem::format() {
AdamGreen 0:616601bde9fb 111 FFSDEBUG("format()\n");
AdamGreen 0:616601bde9fb 112 FRESULT res = f_mkfs(_fsid, 0, 512); // Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
AdamGreen 0:616601bde9fb 113 if(res) {
AdamGreen 0:616601bde9fb 114 FFSDEBUG("f_mkfs() failed (%d, %s)\n", res, FR_ERRORS[res]);
AdamGreen 0:616601bde9fb 115 return -1;
AdamGreen 0:616601bde9fb 116 }
AdamGreen 0:616601bde9fb 117 return 0;
AdamGreen 0:616601bde9fb 118 }
AdamGreen 0:616601bde9fb 119
AdamGreen 0:616601bde9fb 120 DirHandle *FATFileSystem::opendir(const char *name) {
AdamGreen 0:616601bde9fb 121 FATFS_DIR dir;
AdamGreen 0:616601bde9fb 122 FRESULT res = f_opendir(&dir, name);
AdamGreen 0:616601bde9fb 123 if(res != 0) {
AdamGreen 0:616601bde9fb 124 return NULL;
AdamGreen 0:616601bde9fb 125 }
AdamGreen 0:616601bde9fb 126 return new FATDirHandle(dir);
AdamGreen 0:616601bde9fb 127 }
AdamGreen 0:616601bde9fb 128
AdamGreen 0:616601bde9fb 129 int FATFileSystem::mkdir(const char *name, mode_t mode) {
AdamGreen 0:616601bde9fb 130 FRESULT res = f_mkdir(name);
AdamGreen 0:616601bde9fb 131 return res == 0 ? 0 : -1;
AdamGreen 0:616601bde9fb 132 }
AdamGreen 0:616601bde9fb 133
AdamGreen 0:616601bde9fb 134 } // namespace mbed