Log system based on external FRAM storage. Allow to collect float values in FRAM, and then store whole collection into file on flash.

Sample code

#include "mbed.h"
#include "FRAMLog.h"

SPI spi(p5,p6,p7);
FRAMLog flog(spi, p8, 4, 2048);
Serial pc(USBTX, USBRX);

int main() {
    for( int i=0; i<2048; i++){
        flog.log(i/4096.0);
        flog.log(i/(4096.0+1));
        flog.log(i/(4096.0+2));
        flog.log(i/(4096.0+3));
    }
    flog.save();
}

FRAMLog.cpp

Committer:
Decimus
Date:
2012-10-21
Revision:
1:4e5cda0920d3

File content as of revision 1:4e5cda0920d3:

/* Log system for FRAM+FLASH
* Copyright (c) 2012 Oleg Evsegneev
* Released under the MIT License: http://mbed.org/license/mit
*
* Datasheet http://www.ramtron.com/files/datasheets/FM25V02_ds.pdf
*/
 
#include "mbed.h"
#include "FRAMLog.h"

FRAMLog::FRAMLog( SPI& spi, PinName ncs, short cols, short rows ): _fram(spi, ncs), _local("local") {
    _cols = cols;
    _rows = rows;
    _addr = 0;
    _row = 0;
}

float FRAMLog::fromArray( char *bytes ){
    union {
        float f;
        unsigned char b[4];
    } v;

    for( char i=0; i<4; i++ )
        v.b[i] = bytes[i];

    return v.f;
}

void FRAMLog::toArray( float val, char *bytes ){
    union {
        float f;
        unsigned char b[4];
    } v;
    v.f = val;

    for( char i=0; i<4; i++ )
        bytes[i] = v.b[i];
}

void FRAMLog::log( float val ) {
    char bytes[4];
    toArray( val, bytes );
    _fram.write(_addr, bytes, 4);
    _addr += 4;
    if( ( _addr % (_cols*4)) == 0 )
        _row++;
}

void FRAMLog::save() {
    FILE *fp = fopen(LOG_FILE, "w");
    char bytes[4];
    unsigned short addr = 0;
    
    for( short i=0; i<_row; i++){
        for( short k=0; k<_cols; k++){
            _fram.read(addr, bytes, 4);
            addr += 4;
            fprintf( fp, "%.4f", fromArray(bytes));
            if( k < _cols-1 )
                fprintf( fp, "\t");
        }
        fprintf( fp, "\r\n");
    }
    fclose(fp);
}