add MemFileSystem::dump and MemFileSystem::load

Dependents:   SDFileSystem

Fork of FATFileSystem by mbed official

Committer:
mzta
Date:
Wed Apr 01 16:26:32 2015 +0000
Revision:
5:3a1206d2cae6
Parent:
3:e960e2b81a3c
add void MemFilesystem::dump(FILE *fp); add void MemFilesystem::load(FILE *fp);

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 3:e960e2b81a3c 1 /* mbed Microcontroller Library - MemFileSystem
screamer 3:e960e2b81a3c 2 * Copyright (c) 2008, sford
screamer 3:e960e2b81a3c 3 */
screamer 3:e960e2b81a3c 4
screamer 3:e960e2b81a3c 5
screamer 3:e960e2b81a3c 6 #ifndef MBED_MEMFILESYSTEM_H
screamer 3:e960e2b81a3c 7 #define MBED_MEMFILESYSTEM_H
screamer 3:e960e2b81a3c 8
screamer 3:e960e2b81a3c 9 #include "FATFileSystem.h"
mzta 5:3a1206d2cae6 10 #include "SDFileSystem.h"
mzta 5:3a1206d2cae6 11
mzta 5:3a1206d2cae6 12 #define NUM_OF_SECTORS 2000
mzta 5:3a1206d2cae6 13 #define SECTOR_SIZE 512
screamer 3:e960e2b81a3c 14
screamer 3:e960e2b81a3c 15 namespace mbed
screamer 3:e960e2b81a3c 16 {
screamer 3:e960e2b81a3c 17
screamer 3:e960e2b81a3c 18 class MemFileSystem : public FATFileSystem
screamer 3:e960e2b81a3c 19 {
screamer 3:e960e2b81a3c 20 public:
screamer 3:e960e2b81a3c 21
screamer 3:e960e2b81a3c 22 // 2000 sectors, each 512 bytes (malloced as required)
mzta 5:3a1206d2cae6 23 char *sectors[NUM_OF_SECTORS];
screamer 3:e960e2b81a3c 24
screamer 3:e960e2b81a3c 25 MemFileSystem(const char* name) : FATFileSystem(name) {
screamer 3:e960e2b81a3c 26 memset(sectors, 0, sizeof(sectors));
screamer 3:e960e2b81a3c 27 }
screamer 3:e960e2b81a3c 28
screamer 3:e960e2b81a3c 29 virtual ~MemFileSystem() {
mzta 5:3a1206d2cae6 30 for(int i = 0; i < NUM_OF_SECTORS; i++) {
screamer 3:e960e2b81a3c 31 if(sectors[i]) {
screamer 3:e960e2b81a3c 32 free(sectors[i]);
screamer 3:e960e2b81a3c 33 }
screamer 3:e960e2b81a3c 34 }
screamer 3:e960e2b81a3c 35 }
mzta 5:3a1206d2cae6 36
screamer 3:e960e2b81a3c 37 // read a sector in to the buffer, return 0 if ok
mzta 5:3a1206d2cae6 38 virtual int disk_read(uint8_t *buffer, uint64_t sector, uint8_t count) {
screamer 3:e960e2b81a3c 39 if(sectors[sector] == 0) {
screamer 3:e960e2b81a3c 40 // nothing allocated means sector is empty
mzta 5:3a1206d2cae6 41 memset(buffer, 0, SECTOR_SIZE);
screamer 3:e960e2b81a3c 42 } else {
mzta 5:3a1206d2cae6 43 memcpy(buffer, sectors[sector], SECTOR_SIZE);
screamer 3:e960e2b81a3c 44 }
screamer 3:e960e2b81a3c 45 return 0;
screamer 3:e960e2b81a3c 46 }
screamer 3:e960e2b81a3c 47
screamer 3:e960e2b81a3c 48 // write a sector from the buffer, return 0 if ok
mzta 5:3a1206d2cae6 49 virtual int disk_write(const uint8_t *buffer, uint64_t sector, uint8_t count) {
screamer 3:e960e2b81a3c 50 // if buffer is zero deallocate sector
mzta 5:3a1206d2cae6 51 char zero[SECTOR_SIZE];
mzta 5:3a1206d2cae6 52 memset(zero, 0, SECTOR_SIZE);
mzta 5:3a1206d2cae6 53 if(memcmp(zero, buffer, SECTOR_SIZE)==0) {
screamer 3:e960e2b81a3c 54 if(sectors[sector] != 0) {
screamer 3:e960e2b81a3c 55 free(sectors[sector]);
screamer 3:e960e2b81a3c 56 sectors[sector] = 0;
screamer 3:e960e2b81a3c 57 }
screamer 3:e960e2b81a3c 58 return 0;
screamer 3:e960e2b81a3c 59 }
screamer 3:e960e2b81a3c 60 // else allocate a sector if needed, and write
screamer 3:e960e2b81a3c 61 if(sectors[sector] == 0) {
mzta 5:3a1206d2cae6 62 char *sec = (char*)malloc(SECTOR_SIZE);
screamer 3:e960e2b81a3c 63 if(sec==0) {
screamer 3:e960e2b81a3c 64 return 1; // out of memory
screamer 3:e960e2b81a3c 65 }
screamer 3:e960e2b81a3c 66 sectors[sector] = sec;
screamer 3:e960e2b81a3c 67 }
mzta 5:3a1206d2cae6 68 memcpy(sectors[sector], buffer, SECTOR_SIZE);
screamer 3:e960e2b81a3c 69 return 0;
screamer 3:e960e2b81a3c 70 }
screamer 3:e960e2b81a3c 71
screamer 3:e960e2b81a3c 72 // return the number of sectors
mzta 5:3a1206d2cae6 73 virtual uint64_t disk_sectors() {
screamer 3:e960e2b81a3c 74 return sizeof(sectors)/sizeof(sectors[0]);
screamer 3:e960e2b81a3c 75 }
mzta 5:3a1206d2cae6 76
mzta 5:3a1206d2cae6 77 void dump(FILE *fp) {
mzta 5:3a1206d2cae6 78 for (int i = 0; i < NUM_OF_SECTORS; i++) {
mzta 5:3a1206d2cae6 79 fwrite(&sectors[i], sizeof(int), 1, fp);
mzta 5:3a1206d2cae6 80 if (sectors[i] != 0) {
mzta 5:3a1206d2cae6 81 fwrite(sectors[i], sizeof(char), SECTOR_SIZE, fp);
mzta 5:3a1206d2cae6 82 }
mzta 5:3a1206d2cae6 83 }
mzta 5:3a1206d2cae6 84 }
mzta 5:3a1206d2cae6 85
mzta 5:3a1206d2cae6 86 void load(FILE *fp) {
mzta 5:3a1206d2cae6 87 int sec_info = 0;
mzta 5:3a1206d2cae6 88 for (int i = 0; i < NUM_OF_SECTORS; i++) {
mzta 5:3a1206d2cae6 89 fread(&sec_info, sizeof(int), 1, fp);
mzta 5:3a1206d2cae6 90 if (sec_info != 0) {
mzta 5:3a1206d2cae6 91 char *sec = (char *)malloc(SECTOR_SIZE);
mzta 5:3a1206d2cae6 92 fread(sec, sizeof(char), SECTOR_SIZE, fp);
mzta 5:3a1206d2cae6 93 sectors[i] = sec;
mzta 5:3a1206d2cae6 94 }
mzta 5:3a1206d2cae6 95 }
mzta 5:3a1206d2cae6 96 }
screamer 3:e960e2b81a3c 97 };
screamer 3:e960e2b81a3c 98 }
screamer 3:e960e2b81a3c 99
screamer 3:e960e2b81a3c 100 #endif