A port of the Sprinter Firmware to the mbed.
SerialBuffered.cpp@0:1e3ffdfd19ec, 2012-07-08 (annotated)
- Committer:
- nullsub
- Date:
- Sun Jul 08 16:17:09 2012 +0000
- Revision:
- 0:1e3ffdfd19ec
Working
Who changed what in which revision?
User | Revision | Line number | New 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 | } |