A port of the Sprinter Firmware to the mbed.

Dependencies:   mbed

Committer:
nullsub
Date:
Sun Jul 08 16:17:09 2012 +0000
Revision:
0:1e3ffdfd19ec
Working

Who changed what in which revision?

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