Pathompong Puengrostham / Mbed 2 deprecated mbedPirate

Dependencies:   mbed

Committer:
iamjay
Date:
Thu Dec 23 15:03:51 2010 +0000
Revision:
0:e0a44db7e925

        

Who changed what in which revision?

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