10Hz GPS, MEgasquirt, SD Card, ADxl345, 20x4 LCD datalogger

Dependencies:   ADXL345 10HzGPSdatalogger mbed

Committer:
jpnovak
Date:
Sat Nov 28 17:07:15 2015 +0000
Revision:
0:b8d7df90819e
10HzGPS Megasquirt adxl345 SD card LCD;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jpnovak 0:b8d7df90819e 1
jpnovak 0:b8d7df90819e 2 #include "mbed.h"
jpnovak 0:b8d7df90819e 3 #include "SerialBuffered.h"
jpnovak 0:b8d7df90819e 4
jpnovak 0:b8d7df90819e 5 extern Serial loggerSerial;
jpnovak 0:b8d7df90819e 6
jpnovak 0:b8d7df90819e 7 SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx ) : Serial( tx, rx )
jpnovak 0:b8d7df90819e 8 {
jpnovak 0:b8d7df90819e 9 m_buffSize = 0;
jpnovak 0:b8d7df90819e 10 m_contentStart = 0;
jpnovak 0:b8d7df90819e 11 m_contentEnd = 0;
jpnovak 0:b8d7df90819e 12 m_timeout = 1.0;
jpnovak 0:b8d7df90819e 13
jpnovak 0:b8d7df90819e 14
jpnovak 0:b8d7df90819e 15 attach( this, &SerialBuffered::handleInterrupt );
jpnovak 0:b8d7df90819e 16
jpnovak 0:b8d7df90819e 17 m_buff = (uint8_t *) malloc( bufferSize );
jpnovak 0:b8d7df90819e 18 if( m_buff == NULL )
jpnovak 0:b8d7df90819e 19 {
jpnovak 0:b8d7df90819e 20 //loggerSerial.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize );
jpnovak 0:b8d7df90819e 21 }
jpnovak 0:b8d7df90819e 22 else
jpnovak 0:b8d7df90819e 23 {
jpnovak 0:b8d7df90819e 24 m_buffSize = bufferSize;
jpnovak 0:b8d7df90819e 25 }
jpnovak 0:b8d7df90819e 26 }
jpnovak 0:b8d7df90819e 27
jpnovak 0:b8d7df90819e 28
jpnovak 0:b8d7df90819e 29 SerialBuffered::~SerialBuffered()
jpnovak 0:b8d7df90819e 30 {
jpnovak 0:b8d7df90819e 31 if( m_buff )
jpnovak 0:b8d7df90819e 32 free( m_buff );
jpnovak 0:b8d7df90819e 33 }
jpnovak 0:b8d7df90819e 34
jpnovak 0:b8d7df90819e 35 void SerialBuffered::setTimeout( float seconds )
jpnovak 0:b8d7df90819e 36 {
jpnovak 0:b8d7df90819e 37 m_timeout = seconds;
jpnovak 0:b8d7df90819e 38 }
jpnovak 0:b8d7df90819e 39
jpnovak 0:b8d7df90819e 40 size_t SerialBuffered::readBytes( uint8_t *bytes, size_t requested )
jpnovak 0:b8d7df90819e 41 {
jpnovak 0:b8d7df90819e 42 int i = 0;
jpnovak 0:b8d7df90819e 43
jpnovak 0:b8d7df90819e 44 for( ; i < requested; )
jpnovak 0:b8d7df90819e 45 {
jpnovak 0:b8d7df90819e 46 int c = getc();
jpnovak 0:b8d7df90819e 47 if( c < 0 )
jpnovak 0:b8d7df90819e 48 break;
jpnovak 0:b8d7df90819e 49 bytes[i] = c;
jpnovak 0:b8d7df90819e 50 i++;
jpnovak 0:b8d7df90819e 51 }
jpnovak 0:b8d7df90819e 52
jpnovak 0:b8d7df90819e 53 return i;
jpnovak 0:b8d7df90819e 54
jpnovak 0:b8d7df90819e 55 }
jpnovak 0:b8d7df90819e 56
jpnovak 0:b8d7df90819e 57
jpnovak 0:b8d7df90819e 58 int SerialBuffered::getc()
jpnovak 0:b8d7df90819e 59 {
jpnovak 0:b8d7df90819e 60 m_timer.reset();
jpnovak 0:b8d7df90819e 61 m_timer.start();
jpnovak 0:b8d7df90819e 62 while( m_contentStart == m_contentEnd )
jpnovak 0:b8d7df90819e 63 {
jpnovak 0:b8d7df90819e 64
jpnovak 0:b8d7df90819e 65
jpnovak 0:b8d7df90819e 66 wait_ms( 1 );
jpnovak 0:b8d7df90819e 67 if( m_timeout > 0 && m_timer.read() > m_timeout )
jpnovak 0:b8d7df90819e 68 return EOF;
jpnovak 0:b8d7df90819e 69 }
jpnovak 0:b8d7df90819e 70
jpnovak 0:b8d7df90819e 71 m_timer.stop();
jpnovak 0:b8d7df90819e 72
jpnovak 0:b8d7df90819e 73 uint8_t result = m_buff[m_contentStart++];
jpnovak 0:b8d7df90819e 74 m_contentStart = m_contentStart % m_buffSize;
jpnovak 0:b8d7df90819e 75
jpnovak 0:b8d7df90819e 76
jpnovak 0:b8d7df90819e 77 return result;
jpnovak 0:b8d7df90819e 78 }
jpnovak 0:b8d7df90819e 79
jpnovak 0:b8d7df90819e 80
jpnovak 0:b8d7df90819e 81 int SerialBuffered::readable()
jpnovak 0:b8d7df90819e 82 {
jpnovak 0:b8d7df90819e 83 return m_contentStart != m_contentEnd ;
jpnovak 0:b8d7df90819e 84 }
jpnovak 0:b8d7df90819e 85
jpnovak 0:b8d7df90819e 86 void SerialBuffered::handleInterrupt()
jpnovak 0:b8d7df90819e 87 {
jpnovak 0:b8d7df90819e 88
jpnovak 0:b8d7df90819e 89 while( Serial::readable())
jpnovak 0:b8d7df90819e 90 {
jpnovak 0:b8d7df90819e 91 if( m_contentStart == (m_contentEnd +1) % m_buffSize)
jpnovak 0:b8d7df90819e 92 {
jpnovak 0:b8d7df90819e 93 loggerSerial.printf("SerialBuffered - buffer overrun, data lost!\r\n" );
jpnovak 0:b8d7df90819e 94 Serial::getc();
jpnovak 0:b8d7df90819e 95
jpnovak 0:b8d7df90819e 96 }
jpnovak 0:b8d7df90819e 97 else
jpnovak 0:b8d7df90819e 98 {
jpnovak 0:b8d7df90819e 99
jpnovak 0:b8d7df90819e 100 m_buff[ m_contentEnd ++ ] = Serial::getc();
jpnovak 0:b8d7df90819e 101 m_contentEnd = m_contentEnd % m_buffSize;
jpnovak 0:b8d7df90819e 102
jpnovak 0:b8d7df90819e 103
jpnovak 0:b8d7df90819e 104
jpnovak 0:b8d7df90819e 105 }
jpnovak 0:b8d7df90819e 106 }
jpnovak 0:b8d7df90819e 107 }
jpnovak 0:b8d7df90819e 108