rtos sd encoder systems

Dependencies:   mbed

Committer:
eembed
Date:
Fri Aug 30 11:55:47 2019 +0000
Revision:
3:a921792d9913
Parent:
0:5459cdde6298
commit before edit; ~JKD;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eembed 0:5459cdde6298 1 /* mbed Microcontroller Library - MemFileSystem
eembed 0:5459cdde6298 2 * Copyright (c) 2008, sford
eembed 0:5459cdde6298 3 */
eembed 0:5459cdde6298 4
eembed 0:5459cdde6298 5
eembed 0:5459cdde6298 6 #ifndef MBED_MEMFILESYSTEM_H
eembed 0:5459cdde6298 7 #define MBED_MEMFILESYSTEM_H
eembed 0:5459cdde6298 8
eembed 0:5459cdde6298 9 #include "FATFileSystem.h"
eembed 0:5459cdde6298 10
eembed 0:5459cdde6298 11 namespace mbed
eembed 0:5459cdde6298 12 {
eembed 0:5459cdde6298 13
eembed 0:5459cdde6298 14 class MemFileSystem : public FATFileSystem
eembed 0:5459cdde6298 15 {
eembed 0:5459cdde6298 16 public:
eembed 0:5459cdde6298 17
eembed 0:5459cdde6298 18 // 2000 sectors, each 512 bytes (malloced as required)
eembed 0:5459cdde6298 19 char *sectors[2000];
eembed 0:5459cdde6298 20
eembed 0:5459cdde6298 21 MemFileSystem(const char* name) : FATFileSystem(name) {
eembed 0:5459cdde6298 22 memset(sectors, 0, sizeof(sectors));
eembed 0:5459cdde6298 23 }
eembed 0:5459cdde6298 24
eembed 0:5459cdde6298 25 virtual ~MemFileSystem() {
eembed 0:5459cdde6298 26 for(int i = 0; i < 2000; i++) {
eembed 0:5459cdde6298 27 if(sectors[i]) {
eembed 0:5459cdde6298 28 free(sectors[i]);
eembed 0:5459cdde6298 29 }
eembed 0:5459cdde6298 30 }
eembed 0:5459cdde6298 31 }
eembed 0:5459cdde6298 32
eembed 0:5459cdde6298 33 // read a sector in to the buffer, return 0 if ok
eembed 0:5459cdde6298 34 virtual int disk_read(char *buffer, int sector) {
eembed 0:5459cdde6298 35 if(sectors[sector] == 0) {
eembed 0:5459cdde6298 36 // nothing allocated means sector is empty
eembed 0:5459cdde6298 37 memset(buffer, 0, 512);
eembed 0:5459cdde6298 38 } else {
eembed 0:5459cdde6298 39 memcpy(buffer, sectors[sector], 512);
eembed 0:5459cdde6298 40 }
eembed 0:5459cdde6298 41 return 0;
eembed 0:5459cdde6298 42 }
eembed 0:5459cdde6298 43
eembed 0:5459cdde6298 44 // write a sector from the buffer, return 0 if ok
eembed 0:5459cdde6298 45 virtual int disk_write(const char *buffer, int sector) {
eembed 0:5459cdde6298 46 // if buffer is zero deallocate sector
eembed 0:5459cdde6298 47 char zero[512];
eembed 0:5459cdde6298 48 memset(zero, 0, 512);
eembed 0:5459cdde6298 49 if(memcmp(zero, buffer, 512)==0) {
eembed 0:5459cdde6298 50 if(sectors[sector] != 0) {
eembed 0:5459cdde6298 51 free(sectors[sector]);
eembed 0:5459cdde6298 52 sectors[sector] = 0;
eembed 0:5459cdde6298 53 }
eembed 0:5459cdde6298 54 return 0;
eembed 0:5459cdde6298 55 }
eembed 0:5459cdde6298 56 // else allocate a sector if needed, and write
eembed 0:5459cdde6298 57 if(sectors[sector] == 0) {
eembed 0:5459cdde6298 58 char *sec = (char*)malloc(512);
eembed 0:5459cdde6298 59 if(sec==0) {
eembed 0:5459cdde6298 60 return 1; // out of memory
eembed 0:5459cdde6298 61 }
eembed 0:5459cdde6298 62 sectors[sector] = sec;
eembed 0:5459cdde6298 63 }
eembed 0:5459cdde6298 64 memcpy(sectors[sector], buffer, 512);
eembed 0:5459cdde6298 65 return 0;
eembed 0:5459cdde6298 66 }
eembed 0:5459cdde6298 67
eembed 0:5459cdde6298 68 // return the number of sectors
eembed 0:5459cdde6298 69 virtual int disk_sectors() {
eembed 0:5459cdde6298 70 return sizeof(sectors)/sizeof(sectors[0]);
eembed 0:5459cdde6298 71 }
eembed 0:5459cdde6298 72
eembed 0:5459cdde6298 73 };
eembed 0:5459cdde6298 74
eembed 0:5459cdde6298 75 }
eembed 0:5459cdde6298 76
eembed 0:5459cdde6298 77 #endif