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@1:4e5cda0920d3, 2012-10-21 (annotated)
- Committer:
- Decimus
- Date:
- Sun Oct 21 20:29:57 2012 +0000
- Revision:
- 1:4e5cda0920d3
Upload
Who changed what in which revision?
User | Revision | Line number | New 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 | } |