As of Monday morning, so this is the code we showed at Uncraftivism.

Dependencies:   mbed

Committer:
voidnoise
Date:
Mon Dec 14 08:25:07 2009 +0000
Revision:
1:5d20e168f467
Parent:
0:da6a22da11a2

        

Who changed what in which revision?

UserRevisionLine numberNew 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