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();
}
Committer:
Decimus
Date:
Sun Oct 21 20:29:57 2012 +0000
Revision:
1:4e5cda0920d3
Upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Decimus 1:4e5cda0920d3 1 /* Log system for FRAM+FLASH
Decimus 1:4e5cda0920d3 2 * Copyright (c) 2012 Oleg Evsegneev
Decimus 1:4e5cda0920d3 3 * Released under the MIT License: http://mbed.org/license/mit
Decimus 1:4e5cda0920d3 4 *
Decimus 1:4e5cda0920d3 5 * Datasheet http://www.ramtron.com/files/datasheets/FM25V02_ds.pdf
Decimus 1:4e5cda0920d3 6 */
Decimus 1:4e5cda0920d3 7
Decimus 1:4e5cda0920d3 8 #include "mbed.h"
Decimus 1:4e5cda0920d3 9 #include "FRAMLog.h"
Decimus 1:4e5cda0920d3 10
Decimus 1:4e5cda0920d3 11 FRAMLog::FRAMLog( SPI& spi, PinName ncs, short cols, short rows ): _fram(spi, ncs), _local("local") {
Decimus 1:4e5cda0920d3 12 _cols = cols;
Decimus 1:4e5cda0920d3 13 _rows = rows;
Decimus 1:4e5cda0920d3 14 _addr = 0;
Decimus 1:4e5cda0920d3 15 _row = 0;
Decimus 1:4e5cda0920d3 16 }
Decimus 1:4e5cda0920d3 17
Decimus 1:4e5cda0920d3 18 float FRAMLog::fromArray( char *bytes ){
Decimus 1:4e5cda0920d3 19 union {
Decimus 1:4e5cda0920d3 20 float f;
Decimus 1:4e5cda0920d3 21 unsigned char b[4];
Decimus 1:4e5cda0920d3 22 } v;
Decimus 1:4e5cda0920d3 23
Decimus 1:4e5cda0920d3 24 for( char i=0; i<4; i++ )
Decimus 1:4e5cda0920d3 25 v.b[i] = bytes[i];
Decimus 1:4e5cda0920d3 26
Decimus 1:4e5cda0920d3 27 return v.f;
Decimus 1:4e5cda0920d3 28 }
Decimus 1:4e5cda0920d3 29
Decimus 1:4e5cda0920d3 30 void FRAMLog::toArray( float val, char *bytes ){
Decimus 1:4e5cda0920d3 31 union {
Decimus 1:4e5cda0920d3 32 float f;
Decimus 1:4e5cda0920d3 33 unsigned char b[4];
Decimus 1:4e5cda0920d3 34 } v;
Decimus 1:4e5cda0920d3 35 v.f = val;
Decimus 1:4e5cda0920d3 36
Decimus 1:4e5cda0920d3 37 for( char i=0; i<4; i++ )
Decimus 1:4e5cda0920d3 38 bytes[i] = v.b[i];
Decimus 1:4e5cda0920d3 39 }
Decimus 1:4e5cda0920d3 40
Decimus 1:4e5cda0920d3 41 void FRAMLog::log( float val ) {
Decimus 1:4e5cda0920d3 42 char bytes[4];
Decimus 1:4e5cda0920d3 43 toArray( val, bytes );
Decimus 1:4e5cda0920d3 44 _fram.write(_addr, bytes, 4);
Decimus 1:4e5cda0920d3 45 _addr += 4;
Decimus 1:4e5cda0920d3 46 if( ( _addr % (_cols*4)) == 0 )
Decimus 1:4e5cda0920d3 47 _row++;
Decimus 1:4e5cda0920d3 48 }
Decimus 1:4e5cda0920d3 49
Decimus 1:4e5cda0920d3 50 void FRAMLog::save() {
Decimus 1:4e5cda0920d3 51 FILE *fp = fopen(LOG_FILE, "w");
Decimus 1:4e5cda0920d3 52 char bytes[4];
Decimus 1:4e5cda0920d3 53 unsigned short addr = 0;
Decimus 1:4e5cda0920d3 54
Decimus 1:4e5cda0920d3 55 for( short i=0; i<_row; i++){
Decimus 1:4e5cda0920d3 56 for( short k=0; k<_cols; k++){
Decimus 1:4e5cda0920d3 57 _fram.read(addr, bytes, 4);
Decimus 1:4e5cda0920d3 58 addr += 4;
Decimus 1:4e5cda0920d3 59 fprintf( fp, "%.4f", fromArray(bytes));
Decimus 1:4e5cda0920d3 60 if( k < _cols-1 )
Decimus 1:4e5cda0920d3 61 fprintf( fp, "\t");
Decimus 1:4e5cda0920d3 62 }
Decimus 1:4e5cda0920d3 63 fprintf( fp, "\r\n");
Decimus 1:4e5cda0920d3 64 }
Decimus 1:4e5cda0920d3 65 fclose(fp);
Decimus 1:4e5cda0920d3 66 }