mFS file system library for EEPROM memory chips.

mfs.h

Committer:
HBP
Date:
2011-02-21
Revision:
6:dd3346914d42
Parent:
5:a0fe74dce80d
Child:
7:5ac5121bb4e0

File content as of revision 6:dd3346914d42:

/** @file mfs.h */ 
/*H****************************************************************************
* FILENAME :        mfs.h                                                     *
*                                                                             *
* DESCRIPTION :                                                               *
*       mFS file system implementation for mBED with external I2C EEEPROM.    *
*                                                                             *
* Block Flags:                                                                *
* 7:FBOF      Begining of file                                                *
* 6:LBOF      Last block of file                                              *
* 5:RO        Read only file (Used only with FBOF)                            *
* 4:HIDDEN    Hidden file (Used only with FBOF)                               *
* 3:INUSE     Block in use                                                    *
* 2:NBAD      Bad block (INV)                                                 *
* 1:VOL       Volume label (Used only with FBOF)                              *
* 0:LOCK      Locked file (Used only with FBOF)                               *
*                                                                             *
* AUTHOR :    Olli Vanhoja        START DATE :    2011-02-18                  *
*******************************************************************************
*
* CHANGES :
*
* VERSION DATE       WHO            DETAIL
* 0.1     2011-02-21 Olli Vanhoja   Initial release version
* 0.2     2011-02-21 Olli Vanhoja   Documentational comments added
* 0.3     2011-02-21 Olli Vanhoja   *File::read issues fixed, rewind/forward
*                                    functions improved
*                                   *Added possibility change I2C speed
*                                   *I2C autoreset on failure
*
*H*/

#ifndef MFS_H
#define MFS_H

#include "i2c_eeprom.h"

const unsigned int VOL_SIZE=65536; /**< EEPROM chip size in bytes */
const unsigned int BS=1024; /**< How many bytes per block (default: 4096 bytes) */
const unsigned int BC=VOL_SIZE / BS; // 128 blocks
const char mEOF='\x01'; // End Of File/Section marked
const unsigned int BUF=400; /**< File buffer length */

typedef unsigned short int uint16;

/** mFS File System class
 * 
 * This class is used as a handle for the fs in use.
 */
class mfs {
private:
    i2c_eeprom *mem; // Only 512 kB I2C EEPROM is supported ATM
public:
    /** Create a new file system object
    *
    * @param xi2c_address a Physical I2C address of the EEPROM chip  
    */
    mfs(int i2c_address);
    
    /** Reads data from specified fs block
    *
    * @param *data Pointer for readed data
    * @param block Block number.
    * @param byte Selected byte.
    * @param n Bytes to be read.
    * @returns Error code. 0 = OK, 1 = Incorrect input
    */
    char read(char *data, char block, unsigned int byte, unsigned int n);
    
    /** Writes data to specified fs block
    *
    * @param *data Pointer for readed data
    * @param block Block number.
    * @param byte Selected byte.
    * @param n Bytes to be read.
    * @returns Error code. 0 = OK, 1 = Incorrect input
    */
    char write(char *data, char block, unsigned int byte, unsigned int n);
    
    /** Locate next free block
    *
    * @param *blockOut Returns next free block from begining of the fs.
    * @returns Error code. 0 = OK, 1 = Out of space
    */
    char getNextFreeBlock(char *blockOut);
    
    /** Locates next starting file from parameter block
    *
    * @param block Start scanning from this block.
    * @param *filenameOut Return name of the file found.
    * @returns Block number of the file found or 0xFFFF to indicate empty file system.
    */
    unsigned int findNextFile(unsigned int block, char *filenameOut);
    
    /** Get number of the first block of the given file. (FBOF flag)
    *
    * @param filename[20] Filename input.
    * @returns Block number of the file or 0xFFFF to indicate that file not found.
    */
    uint16 getFirstBlockOfFile(char filename[20]);
    
    /** Create a new empty file
    *
    * Reserves one block for the file created.
    *
    * @param filename[20] Filename input.
    * @returns Error code. 0 = OK, 1 = File exists already, 2 = Out of space
    */
    char createFile(char filename[20]);
    
    /** Remove file from file system
    *
    * @param filename[20] Filename input.
    * @returns Error code. 0 = OK, 1 = File doesn't exists
    */
    char removeFile(char filename[20]);
    
    /** Set user modifiable flags.
    *
    * desc RO|HIDDEN|LOCK
    * bit  3    2       1
    *
    * @param *flags Flag input
    * @param filename[20] Filename input.
    * @returns Error code. 0 = OK, 1 = File doesn't exists, 2 = File system is corrupted
    */
    char setFileFlags(char *flags, char filename[20]);
    
    /** Read user modifiable flags.
    *
    * desc RO|HIDDEN|LOCK
    * bit  3    2       1
    *
    * @param *flags Flag output
    * @param filename[20] Filename input.
    * @returns Error code. 0 = OK, 1 = File doesn't exists
    */
    char getFileFlags(char *flags, char filename[20]);
    
    /** Get number of free blocks
    *
    * @returns Number of free blocks.
    */
    uint16 free();
    
    /** Format new file system
    *
    *
    * @param createLabel Create volume label at the begining of the file system. (there is no specified use for volume labels atm).
    * @returns Number of bad block headers. Keep in mind that only first byte is checked and if it's broken the who file system is useless.
    */
    char mkfs(char createLabel);
};

/** mFS File handle class
 * 
 * This class is used as a handle for files stored in mFS.
 */
class file {
private:
    mfs *fs;   // Reference to the file system in use
    char attr; // RW = 1; RO = 0
    char buffer[BUF]; // Write buffer
    unsigned int bufPos; // "Cursor" position in buffer
    char firstBlock; // First block of the file
    char currBlock; // Current block in use
    unsigned int blockPos; // "head" position on the current block
    void needsFlush(); // check if flush is needed before read operation
public:
    /** Open new file handle
    *
    * File must be created before it can be opened!
    *
    * @param filename[20] Filename input.
    * @param operation 0 = read only, 1 = read and write. If read only file is opened in rw mode system will trip to error().
    */
    file(mfs *fs_ref, char filename[20], char operation);
    
    /** Close file handle
    *
    * Flushes the file and closes the handle.
    */
    ~file(); // Close file handle and flush
    
    /** Rewind to the start postion of the file
    *
    */
    void rewind();
    
    /** Rewind n bytes back
    *
    * @param n Number of blocks to be rewinded.
    * @returns Error code. 0 = OK, 1 = First block of file.
    */
    char rewind(uint16 n);
    
    /** Forward one byte
    *
    * @returns Error code. 0 = OK, 1 = End of file.
    */
    char forward();
    
    /** Forward n bytes
    *
    * @param n Number of blocks.
    * @returns Error code. 0 = OK, 1 = End of file.
    */
    char forward(uint16 n);
    
    /** Reads a string of bytes
    *
    * Always places '\0' at the end of string.
    *
    * @param data Output buffer.
    * @param n Number of bytes to be read.
    * @returns Error code. 0 = OK, 1 = Last block of the file
    */
    void read(char *data, unsigned int n);
    /** Reads a binary array of bytes
    *
    * Doesn't add '\0' at the end of data array and doesn't respect mEOF byte.
    *
    * @param data Output buffer.
    * @param n Number of bytes to be read.
    */
    
    void readBin(char *data, unsigned int n);
    /** Write byte array to a file (buffer)
    *
    * @param data Input data.
    * @param n Number of bytes to be read.
    * @returns Error code. 0 = OK, 1 = Flush failed.
    */
    
    char write(char *data, unsigned int n);
    
    /** Flush file buffer
    * Writes buffer to the EEPROM chip in use.
    */
    char flush();
};

#endif