ben winstone
/
ucam
As of Monday morning, so this is the code we showed at Uncraftivism.
SerialBuffered.cpp@0:da6a22da11a2, 2009-12-11 (annotated)
- Committer:
- voidnoise
- Date:
- Fri Dec 11 21:59:44 2009 +0000
- Revision:
- 0:da6a22da11a2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
voidnoise | 0:da6a22da11a2 | 1 | #include "stdafx.h" |
voidnoise | 0:da6a22da11a2 | 2 | #include "mbed.h" |
voidnoise | 0:da6a22da11a2 | 3 | #include "SerialBuffered.h" |
voidnoise | 0:da6a22da11a2 | 4 | |
voidnoise | 0:da6a22da11a2 | 5 | |
voidnoise | 0:da6a22da11a2 | 6 | extern Logger pcSerial; |
voidnoise | 0:da6a22da11a2 | 7 | |
voidnoise | 0:da6a22da11a2 | 8 | SerialBuffered::SerialBuffered( size_t bufferSize, PinName tx, PinName rx ) : Serial( tx, rx ) |
voidnoise | 0:da6a22da11a2 | 9 | { |
voidnoise | 0:da6a22da11a2 | 10 | m_buffSize = 0; |
voidnoise | 0:da6a22da11a2 | 11 | m_contentStart = 0; |
voidnoise | 0:da6a22da11a2 | 12 | m_contentEnd = 0; |
voidnoise | 0:da6a22da11a2 | 13 | m_timeout = 1.0; |
voidnoise | 0:da6a22da11a2 | 14 | |
voidnoise | 0:da6a22da11a2 | 15 | |
voidnoise | 0:da6a22da11a2 | 16 | attach( this, &SerialBuffered::handleInterrupt ); |
voidnoise | 0:da6a22da11a2 | 17 | |
voidnoise | 0:da6a22da11a2 | 18 | m_buff = (uint8_t *) malloc( bufferSize ); |
voidnoise | 0:da6a22da11a2 | 19 | if( m_buff == NULL ) |
voidnoise | 0:da6a22da11a2 | 20 | { |
voidnoise | 0:da6a22da11a2 | 21 | pcSerial.printf("SerialBuffered - failed to alloc buffer size %d\r\n", (int) bufferSize ); |
voidnoise | 0:da6a22da11a2 | 22 | } |
voidnoise | 0:da6a22da11a2 | 23 | else |
voidnoise | 0:da6a22da11a2 | 24 | { |
voidnoise | 0:da6a22da11a2 | 25 | m_buffSize = bufferSize; |
voidnoise | 0:da6a22da11a2 | 26 | } |
voidnoise | 0:da6a22da11a2 | 27 | } |
voidnoise | 0:da6a22da11a2 | 28 | |
voidnoise | 0:da6a22da11a2 | 29 | |
voidnoise | 0:da6a22da11a2 | 30 | SerialBuffered::~SerialBuffered() |
voidnoise | 0:da6a22da11a2 | 31 | { |
voidnoise | 0:da6a22da11a2 | 32 | if( m_buff ) |
voidnoise | 0:da6a22da11a2 | 33 | free( m_buff ); |
voidnoise | 0:da6a22da11a2 | 34 | } |
voidnoise | 0:da6a22da11a2 | 35 | |
voidnoise | 0:da6a22da11a2 | 36 | void SerialBuffered::setTimeout( float seconds ) |
voidnoise | 0:da6a22da11a2 | 37 | { |
voidnoise | 0:da6a22da11a2 | 38 | m_timeout = seconds; |
voidnoise | 0:da6a22da11a2 | 39 | } |
voidnoise | 0:da6a22da11a2 | 40 | |
voidnoise | 0:da6a22da11a2 | 41 | size_t SerialBuffered::readBytes( uint8_t *bytes, size_t requested ) |
voidnoise | 0:da6a22da11a2 | 42 | { |
voidnoise | 0:da6a22da11a2 | 43 | int i = 0; |
voidnoise | 0:da6a22da11a2 | 44 | |
voidnoise | 0:da6a22da11a2 | 45 | for( ; i < requested; ) |
voidnoise | 0:da6a22da11a2 | 46 | { |
voidnoise | 0:da6a22da11a2 | 47 | int c = getc(); |
voidnoise | 0:da6a22da11a2 | 48 | if( c < 0 ) |
voidnoise | 0:da6a22da11a2 | 49 | break; |
voidnoise | 0:da6a22da11a2 | 50 | bytes[i] = c; |
voidnoise | 0:da6a22da11a2 | 51 | i++; |
voidnoise | 0:da6a22da11a2 | 52 | } |
voidnoise | 0:da6a22da11a2 | 53 | |
voidnoise | 0:da6a22da11a2 | 54 | return i; |
voidnoise | 0:da6a22da11a2 | 55 | |
voidnoise | 0:da6a22da11a2 | 56 | } |
voidnoise | 0:da6a22da11a2 | 57 | |
voidnoise | 0:da6a22da11a2 | 58 | |
voidnoise | 0:da6a22da11a2 | 59 | int SerialBuffered::getc() |
voidnoise | 0:da6a22da11a2 | 60 | { |
voidnoise | 0:da6a22da11a2 | 61 | m_timer.reset(); |
voidnoise | 0:da6a22da11a2 | 62 | m_timer.start(); |
voidnoise | 0:da6a22da11a2 | 63 | |
voidnoise | 0:da6a22da11a2 | 64 | #ifdef ON_DESKTOP |
voidnoise | 0:da6a22da11a2 | 65 | handleInterrupt(); |
voidnoise | 0:da6a22da11a2 | 66 | #endif |
voidnoise | 0:da6a22da11a2 | 67 | |
voidnoise | 0:da6a22da11a2 | 68 | while( m_contentStart == m_contentEnd ) |
voidnoise | 0:da6a22da11a2 | 69 | { |
voidnoise | 0:da6a22da11a2 | 70 | |
voidnoise | 0:da6a22da11a2 | 71 | wait_ms( 1 ); |
voidnoise | 0:da6a22da11a2 | 72 | if( m_timeout > 0 && m_timer.read() > m_timeout ) |
voidnoise | 0:da6a22da11a2 | 73 | { |
voidnoise | 0:da6a22da11a2 | 74 | pcSerial.printf("SerialBuffered - timeout\r\n"); |
voidnoise | 0:da6a22da11a2 | 75 | |
voidnoise | 0:da6a22da11a2 | 76 | return EOF; |
voidnoise | 0:da6a22da11a2 | 77 | } |
voidnoise | 0:da6a22da11a2 | 78 | |
voidnoise | 0:da6a22da11a2 | 79 | #ifdef ON_DESKTOP |
voidnoise | 0:da6a22da11a2 | 80 | handleInterrupt(); |
voidnoise | 0:da6a22da11a2 | 81 | #endif |
voidnoise | 0:da6a22da11a2 | 82 | } |
voidnoise | 0:da6a22da11a2 | 83 | |
voidnoise | 0:da6a22da11a2 | 84 | m_timer.stop(); |
voidnoise | 0:da6a22da11a2 | 85 | |
voidnoise | 0:da6a22da11a2 | 86 | uint8_t result = m_buff[m_contentStart++]; |
voidnoise | 0:da6a22da11a2 | 87 | |
voidnoise | 0:da6a22da11a2 | 88 | m_contentStart = m_contentStart % m_buffSize; |
voidnoise | 0:da6a22da11a2 | 89 | |
voidnoise | 0:da6a22da11a2 | 90 | |
voidnoise | 0:da6a22da11a2 | 91 | return result; |
voidnoise | 0:da6a22da11a2 | 92 | } |
voidnoise | 0:da6a22da11a2 | 93 | |
voidnoise | 0:da6a22da11a2 | 94 | |
voidnoise | 0:da6a22da11a2 | 95 | int SerialBuffered::readable() |
voidnoise | 0:da6a22da11a2 | 96 | { |
voidnoise | 0:da6a22da11a2 | 97 | #ifdef ON_DESKTOP |
voidnoise | 0:da6a22da11a2 | 98 | handleInterrupt(); |
voidnoise | 0:da6a22da11a2 | 99 | #endif |
voidnoise | 0:da6a22da11a2 | 100 | |
voidnoise | 0:da6a22da11a2 | 101 | return m_contentStart != m_contentEnd ; |
voidnoise | 0:da6a22da11a2 | 102 | } |
voidnoise | 0:da6a22da11a2 | 103 | |
voidnoise | 0:da6a22da11a2 | 104 | void SerialBuffered::handleInterrupt() |
voidnoise | 0:da6a22da11a2 | 105 | { |
voidnoise | 0:da6a22da11a2 | 106 | |
voidnoise | 0:da6a22da11a2 | 107 | while( Serial::readable()) |
voidnoise | 0:da6a22da11a2 | 108 | { |
voidnoise | 0:da6a22da11a2 | 109 | if( m_contentStart == (m_contentEnd +1) % m_buffSize) |
voidnoise | 0:da6a22da11a2 | 110 | { |
voidnoise | 0:da6a22da11a2 | 111 | pcSerial.printf("SerialBuffered - buffer overrun, data lost!\r\n" ); |
voidnoise | 0:da6a22da11a2 | 112 | Serial::getc(); |
voidnoise | 0:da6a22da11a2 | 113 | |
voidnoise | 0:da6a22da11a2 | 114 | } |
voidnoise | 0:da6a22da11a2 | 115 | else |
voidnoise | 0:da6a22da11a2 | 116 | { |
voidnoise | 0:da6a22da11a2 | 117 | |
voidnoise | 0:da6a22da11a2 | 118 | m_buff[ m_contentEnd ++ ] = Serial::getc(); |
voidnoise | 0:da6a22da11a2 | 119 | |
voidnoise | 0:da6a22da11a2 | 120 | m_contentEnd = m_contentEnd % m_buffSize; |
voidnoise | 0:da6a22da11a2 | 121 | |
voidnoise | 0:da6a22da11a2 | 122 | |
voidnoise | 0:da6a22da11a2 | 123 | |
voidnoise | 0:da6a22da11a2 | 124 | } |
voidnoise | 0:da6a22da11a2 | 125 | } |
voidnoise | 0:da6a22da11a2 | 126 | } |
voidnoise | 0:da6a22da11a2 | 127 |