Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: mfs.cpp
- Revision:
- 10:211cb54339a0
- Parent:
- 9:52c01cb100ac
- Child:
- 11:6c4fcb9d6193
--- a/mfs.cpp Tue Feb 22 18:57:37 2011 +0000
+++ b/mfs.cpp Tue Feb 22 21:09:04 2011 +0000
@@ -1,3 +1,4 @@
+/** @file mfs.cpp */
/*CPP**************************************************************************
* FILENAME : mfs.cpp *
* *
@@ -11,17 +12,19 @@
#include "mfs.h"
#include "i2c_eeprom.h"
-#define RB 3 // Reseved bytes per block (1 attrb B, 2 B for next/prev pointers
-#define DEBUG // Adds extra safety to reading and writing
+#define BLOCK_NLEN 1 /**< Block number length in bytes */
+#define RB 1+2*BLOCK_NLEN /**< Reseved bytes per block (1 attrb B, 2 B for next/prev pointers */
+#define I2C_SPEED 200000 /**< I2C bus speed in Hz */
+#define DEBUG /**< Adds extra safety in reading and writing */
-DigitalOut FlushLed(LED2);
+DigitalOut FlushLed(LED2); /**< Flush led */
mfs::mfs(int i2c_address)
{
- mem = new i2c_eeprom(i2c_address, 200000);
+ mem = new i2c_eeprom(i2c_address, I2C_SPEED);
}
-char mfs::read(char *data, char block, uint32_t byte, uint32_t n)
+char mfs::read(char *data, uint32_t block, uint32_t byte, uint32_t n)
{
// Faster reading without DEBUG mode
#ifdef DEBUG
@@ -33,7 +36,7 @@
return 0;
}
-char mfs::write(char *data, char block, uint32_t byte, uint32_t n)
+char mfs::write(char *data, uint32_t block, uint32_t byte, uint32_t n)
{
// Faster writing without DEBUG mode
#ifdef DEBUG
@@ -44,7 +47,7 @@
return 0;
}
-char mfs::getNextFreeBlock(char *blockOut)
+char mfs::getNextFreeBlock(uint32_t *blockOut)
{
// Locate free block by seeking EERPOM
char cFlags[1];
@@ -61,7 +64,7 @@
return 0;
}
-uint32_t mfs::findNextFile(char block, char *filenameOut)
+char mfs::findNextFile(uint32_t block, char *filenameOut, uint32_t *blockOut)
{
uint32_t i=block;
char cFlags[1];
@@ -79,44 +82,41 @@
if(i == BC)
{
strcpy(filenameOut, "");
- return 0xffff; // Empty fs
+ return 1; // Empty fs
}
// Read filename
- read(filenameOut, i, 3, 20);
- return i; // Return block number
+ read(filenameOut, i, RB, 20);
+ *blockOut = i; // Return block number
+ return 0;
}
-uint32_t mfs::getFirstBlockOfFile(char filename[20])
+char mfs::getFirstBlockOfFile(char filename[20], uint32_t *blockOut)
{
- uint32_t block=0;
+ *blockOut=0;
char tmpFilename[20]="";
- while (block < BC)
+ while (1)
{
- block = findNextFile(block, tmpFilename);
- if (block < BC)
+ if (findNextFile(*blockOut, tmpFilename, blockOut) == 0)
{
if(strcmp(tmpFilename, filename) == 0)
- return block; // File exists
+ return 0; // File exists
}
- else return 0xFFFF; // File doesn't exist
- block++;
+ else return 1; // File doesn't exist
+ (*blockOut)++;
}
-
- return 0xFFFF; // ??
}
char mfs::createFile(char filename[20])
{
char tmpFilename[20];
uint32_t n;
- char fb;
+ uint32_t fb;
for (n=0; n < BC; n++)
{
- n=findNextFile(n, tmpFilename);
- if(n < BC)
+ if(findNextFile(n, tmpFilename, &n) == 0)
{
if(strcmp(tmpFilename, filename) == 0)
return 1; // File exist
@@ -125,19 +125,19 @@
n++;
}
- if(getNextFreeBlock(&fb))
+ if(getNextFreeBlock(&fb) != 0)
return 2; // Out of space
- char cData[23];
+ char cData[RB+20];
cData[0] = '\xCC'; // Necessary flags for file
cData[1] = '\0'; // Only this block yet
cData[2] = '\0'; // First block there could't be prev blocks
for (char i=0; i < 20; i++)
- cData[3+i] = filename[i];
+ cData[RB+i] = filename[i];
// Create file
- write(cData, fb, 0, 23);
+ write(cData, fb, 0, RB+20);
return 0;
}
@@ -148,8 +148,7 @@
char cData[3] = {'\0','\0','\0'};
// Check if file exists
- block = getFirstBlockOfFile(filename);
- if (block > BC)
+ if (getFirstBlockOfFile(filename, &block) == 0)
return 1; // File not found
// Clear blocks reserver by the file
@@ -182,11 +181,10 @@
uint32_t block;
// Check if file exists
- block = getFirstBlockOfFile(oldFilename);
- if (block > BC)
+ if (getFirstBlockOfFile(oldFilename, &block) != 0)
return 1; // File not found
- write(newFilename, block, 3, 20);
+ write(newFilename, block, RB, 20);
return 0; // Everything went better than expected
}
@@ -200,8 +198,7 @@
char cData[1] = {'\0'};
// Check if file exists
- n = getFirstBlockOfFile(filename);
- if (n > BC)
+ if (getFirstBlockOfFile(filename, &n) != 0)
return 1; // File not found
read(cData, n, 0, 1);
@@ -220,8 +217,7 @@
char cData[1] = {'\0'};
// Check if file exists
- n = getFirstBlockOfFile(filename);
- if (n > BC)
+ if (getFirstBlockOfFile(filename, &n) != 0)
return 1; // File not found
read(cData, n, 0, 1);
@@ -231,10 +227,10 @@
}
// Return number of free blocks
-char mfs::free()
+uint32_t mfs::free()
{
- char blocks=0;
- char r;
+ uint32_t blocks=0;
+ uint32_t r;
char cFlags[1];
for (r=0; r < BC; r++)
@@ -249,14 +245,14 @@
return 0;
}
-char mfs::mkfs(char createLabel)
+uint32_t mfs::mkfs(bool createLabel)
{
- unsigned int iAddr = 0;
- char i = 0;
- char bad = 0; // For counting bad block headers
+ uint32_t iAddr = 0;
+ uint32_t i = 0;
+ uint32_t bad = 0; // For counting bad block headers
char cFlags[] = {'\0', '\0', '\0'}, a[1];
- if (createLabel >= 1)
+ if (createLabel == true)
{
// Write Volume label
cFlags[0] = '\x0E';
@@ -291,8 +287,7 @@
char cData[3] = {'\0','\0','\0'};
// Check if file exists
- n = fs->getFirstBlockOfFile(filename);
- if (n == 0xFFFF)
+ if (fs->getFirstBlockOfFile(filename, &n) != 0)
error("Oops, file \"%s\" not found! n=0x%X", filename, n); // File not found
fs->read(cData, n, 0, 1);
@@ -342,19 +337,16 @@
if (blockPos < 3)
{
// Fetch link to next block
- fs->read(cData, currBlock, 0, 3);
+ fs->read(cData, currBlock, 0, RB);
if (!(cData[0] & 0x80))
{
currBlock = cData[2];
blockPos = BS-1; // Set block postion offset at end of the block
} else {
blockPos++;
- return 1; // This is the last block
+ return 1; // This is the first block
}
}
- fs->read(cData, currBlock, blockPos, 1);
- if (cData[0] == mEOF)
- return 1;
}
return 0; // OK
@@ -392,7 +384,10 @@
}
fs->read(cData, currBlock, blockPos, 1);
if (cData[0] == mEOF)
+ {
+ rewind(1);
return 1;
+ }
}
return 0; // OK
@@ -490,7 +485,7 @@
char file::flush()
{
char cData[3], c[1];
- char nextFree;
+ uint32_t nextFree;
uint32_t i;
if (bufPos == 0) return 0; // File up-to date
@@ -514,14 +509,14 @@
cData[0] = 0x4C; // New flags
cData[1] = '\0';
cData[2] = currBlock; // Prev Block
- fs->write(cData, nextFree, 0, 3); // Update Block Data
+ fs->write(cData, nextFree, 0, RB); // Update Block Data
// Link old block with new block
- fs->read(cData, currBlock, 0, 3);
+ fs->read(cData, currBlock, 0, RB);
cData[0] &= ~0x40; // Clear LBOF flag if set
cData[1] = nextFree;
cData[2] = '\0';
- fs->write(cData, currBlock, 0, 3); // Update Block Data
+ fs->write(cData, currBlock, 0, RB); // Update Block Data
// Update current block info
currBlock = nextFree;