SD

Committer:
mikekelly99
Date:
Tue Nov 17 17:03:36 2020 +0000
Revision:
0:6db20bbdc767
Wow, never committed the code once so first and final commit, code produces the lat and long values as well as speed.

Who changed what in which revision?

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