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: ICE-Application/src/add-ons/ConfigFS/mfs.h
- Revision:
- 2:02cb20446785
- Parent:
- 1:b2e90cda7a5a
--- a/ICE-Application/src/add-ons/ConfigFS/mfs.h Tue Jan 24 19:06:45 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,332 +0,0 @@ -/** @file mfs.h */ -/*H**************************************************************************** - * FILENAME : mfs.h * - * * - * DESCRIPTION : * - * mFS file system implementation for mBED with external I2C EEEPROM. * - * * - * ---------------------------------------------------------------------------* - * "THE BEER-WARE LICENSE" (Revision 42): * - * <olli.vanhoja@gmail.com> wrote this file. As long as you retain this notice* - * you can do whatever you want with this stuff. If we meet some day, and you * - * think this stuff is worth it, you can buy me a beer in return Olli Vanhoja * - * ---------------------------------------------------------------------------* - * * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * - * DEALINGS IN THE SOFTWARE. * - * * - * * - * 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 - * 0.4 2011-02-22 Olli Vanhoja * mfs::renameFile(char [FILENAME_LENGTH], char [FILENAME_LENGTH] function added - * * Incresed fault tolerance by first allocating new - * block and then linking to it from previous block - * * Reconstructed initialization and use of some variables - * 0.5 2011-02-22 Olli Vanhoja * Improved documentation - * * Block variables changed from char to uint32_t for - * code optimization (and for possible 16bit update which - * would technically allow 256 TB volume sizes) - * * Optimized file searching algorithms - * 0.6 2011-02-22 Olli Vanhoja * Fixed file remove issue - * * Fixed mkfs bug - * 0.7 2011-02-23 Olli Vanhoja * file::seek(uint32_t) added - * 0.7 2011-02-23 Olli Vanhoja * Fixed destroying prev link issue on flush - * * Fixed Forwarding issue which moved cursor at the begining - * of the filename block - * * Separated locating of next/prev links functionality - * into its own private function - * * 16 bit block number pointers 256 TB theoretical maximum - * volume size, WHOA \O/ - * * Remove and rename respects RO bit - * * SetFileFlags fixed - * * New file write mode DWRITE - * 0.8 2011-02-24 Olli Vanhoja * EOF should be now found in AWRITE mode and EOF is - * * also written by mfs::createFile() so there should - * be no more confusing situations with new files. - * - * TODO : - * * Directory support (VOL blocks?) - * * RAID 0 & 1 - *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=256; /**< How many bytes per block (default: 256 bytes) */ -const unsigned int BC=VOL_SIZE / BS; // block count -const char mEOF='\x01'; // End Of File/Section marked -const unsigned int BUF=1050; /**< File buffer length */ -const unsigned int FILENAME_LENGTH=64; - -/** 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); - - /** Read 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, uint32_t block, uint32_t byte, uint32_t n); - - /** Write 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, uint32_t block, uint32_t byte, uint32_t 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(uint32_t *blockOut); - - /** Locates next starting file from parameter block - * - * @param block Start scanning from this block. - * @param *filenameOut Return name of the file found. - * @param Returns block number of the file found. - * @returns Error code: 0 = OK, 1 = Empty fs - */ - char findNextFile(uint32_t block, char *filenameOut, uint32_t *blockOut); - - /** Get block number of the given file - * - * Returns block number of the block flaged with FBOF flag. - * - * @param filename[FILENAME_LENGTH] Filename input. - * @param Returns block number of the first block of the given file. - * @returns Error code: 0 = OK, 1 = File not found - */ - char getFirstBlockOfFile(char filename[FILENAME_LENGTH], uint32_t *blockOut); - - /** Create a new empty file - * - * Reserves one block for the file created. - * - * @param filename[FILENAME_LENGTH] Filename input. - * @returns Error code: 0 = OK, 1 = File exists already, 2 = Out of space - */ - char createFile(char filename[FILENAME_LENGTH]); - - /** Remove a file from the file system - * - * @param filename[FILENAME_LENGTH] Filename input. - * @returns Error code: 0 = OK, 1 = File doesn't exists, 2 = RO file - */ - char removeFile(char filename[FILENAME_LENGTH]); - - /** Rename a file - * - * @param oldFilename[FILENAME_LENGTH] Old filename. - * @param newFilename[FILENAME_LENGTH] New file name. - * @returns Error code: 0 = OK, 1 = File doesn't exists, 2 = RO file, 3 = fs is corrupted - */ - char renameFile(char oldFilename[FILENAME_LENGTH], char newFilename[FILENAME_LENGTH]); - - /** Set user modifiable flags. - * - * \code - * desc RO|HIDDEN|LOCK - * bit 3 2 1 - * \endcode - * - * @param *flags Flag input - * @param filename[FILENAME_LENGTH] Filename input. - * @returns Error code: 0 = OK, 1 = File doesn't exists, 2 = File system is corrupted - */ - char setFileFlags(char *flags, char filename[FILENAME_LENGTH]); - - /** Read user modifiable flags. - * - * \code - * desc RO|HIDDEN|LOCK - * bit 3 2 1 - * \endcode - * - * @param *flags Flag output - * @param filename[FILENAME_LENGTH] Filename input. - * @returns Error code: 0 = OK, 1 = File doesn't exists - */ - char getFileFlags(char *flags, char filename[FILENAME_LENGTH]); - - /** Get number of free blocks - * - * @returns Number of free blocks. - */ - uint32_t free(); - - /** Format new file system - * - * \note Keep in mind that only first byte is checked for functionality and - * if it's broken the who file system is useless. - * - * @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. - */ - uint32_t mkfs(bool createLabel); -}; - -enum BlockLinkType {NEXT, PREV}; -enum FileOpenMode {RO, AWRITE, DWRITE}; - -/** mFS File handle class - * - * This class provides a file handle and data manipulation methods to be - * used for files stored in mFS files system. - */ -class file -{ -private: - mfs *fs; // Reference to the file system in use - FileOpenMode fMode; - char buffer[BUF]; // Write buffer - uint32_t bufPos; // "Cursor" position in buffer - uint32_t firstBlock; // First block of the file - uint32_t currBlock; // Current block in use - uint32_t blockPos; // "head" position on the current block - uint32_t byteCount; // Stores current "cursor" position in file for seek - // Private functions - char getBlockLink(BlockLinkType linkSelection, uint32_t *blockOut); - char removeFollowingBlocks(uint32_t block); // Offers destructive write/very simple wear levelling -public: - /** Create file handle - * - * \warning File must be created before it can be opened! - * Opening non-existing file will trip the system to error(); - * If read only file is opened in rw mode system will trip to error(). - * - * \b AWRITE is a file access mode where cursor can be moved along the file - * and write can be started at any point. write() function will overwrite - * only as many bytes as you chosen to write. - * - * \b DWRITE is a file access mode similiar to AWRITE but when you start - * writing all the data after cursor will be removed permanently and flush() - * will set a new EOF marker. - * - * @param filename[FILENAME_LENGTH] Filename input. - * @param operation RO = Read only, AWRITE = read and write, DWRITE = read + destructive write. - */ - file(mfs *fs_ref, char filename[FILENAME_LENGTH], FileOpenMode 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(); - - /** Reverse n bytes back - * - * @param n Number of bytes. - * @returns Error code: 0 = OK, 1 = First byte of file. - */ - char rewind(uint32_t 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(uint32_t n); - - /** Seek to byte given - * - * @param byte Byte number where to seek. - * @returns Error code: 0 = OK, 1 = End of file or already at first byte. - */ - char seek(uint32_t byte); - - /** 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, uint32_t 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, uint32_t 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, uint32_t n); - - /** Flush file buffer - * Writes buffer to the EEPROM chip in use. - * - * @returns Error code: 0 = OK, 1 = Out of free space, 2 = Destructive operation failed (fs is corrupted). - */ - char flush(); -}; - -#endif