Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SerialBuffered.cpp@0:e0a44db7e925, 2010-12-23 (annotated)
- Committer:
- iamjay
- Date:
- Thu Dec 23 15:03:51 2010 +0000
- Revision:
- 0:e0a44db7e925
Who changed what in which revision?
| User | Revision | Line number | New 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 |