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