Buffering Serial receive data class
Dependents: 10dof 10dof2 TTB_Wallbot Nucleo_L432KC_Quadrature_Decoder_with_ADC_and_DAC
BufferSerial.cpp@0:633dd0246854, 2013-05-19 (annotated)
- Committer:
- KentaShimizu
- Date:
- Sun May 19 16:08:07 2013 +0000
- Revision:
- 0:633dd0246854
Buffering Serial receive data class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KentaShimizu | 0:633dd0246854 | 1 | #include "BufferSerial.h" |
KentaShimizu | 0:633dd0246854 | 2 | |
KentaShimizu | 0:633dd0246854 | 3 | BufferSerial :: BufferSerial( PinName tx , PinName rx ) : Serial( tx , rx ) { |
KentaShimizu | 0:633dd0246854 | 4 | _setup( 1 ); |
KentaShimizu | 0:633dd0246854 | 5 | } |
KentaShimizu | 0:633dd0246854 | 6 | |
KentaShimizu | 0:633dd0246854 | 7 | BufferSerial :: BufferSerial( PinName tx , PinName rx , const int& bufferSize ) : Serial( tx , rx ) { |
KentaShimizu | 0:633dd0246854 | 8 | _setup( bufferSize ); |
KentaShimizu | 0:633dd0246854 | 9 | } |
KentaShimizu | 0:633dd0246854 | 10 | |
KentaShimizu | 0:633dd0246854 | 11 | BufferSerial :: BufferSerial( PinName tx , PinName rx , const int& bufferSize , const char* name ) : Serial( tx , rx , name ) { |
KentaShimizu | 0:633dd0246854 | 12 | _setup( bufferSize ); |
KentaShimizu | 0:633dd0246854 | 13 | } |
KentaShimizu | 0:633dd0246854 | 14 | |
KentaShimizu | 0:633dd0246854 | 15 | BufferSerial :: ~BufferSerial() { |
KentaShimizu | 0:633dd0246854 | 16 | delete[] _buf; |
KentaShimizu | 0:633dd0246854 | 17 | } |
KentaShimizu | 0:633dd0246854 | 18 | |
KentaShimizu | 0:633dd0246854 | 19 | void BufferSerial :: _setup( const int& bufferSize ) { |
KentaShimizu | 0:633dd0246854 | 20 | if ( bufferSize > 1 ){ |
KentaShimizu | 0:633dd0246854 | 21 | _buf = new unsigned char[ bufferSize ]; |
KentaShimizu | 0:633dd0246854 | 22 | _size = bufferSize - 1; |
KentaShimizu | 0:633dd0246854 | 23 | }else{ |
KentaShimizu | 0:633dd0246854 | 24 | _buf = new unsigned char[ 2 ]; |
KentaShimizu | 0:633dd0246854 | 25 | _size = 1; |
KentaShimizu | 0:633dd0246854 | 26 | } |
KentaShimizu | 0:633dd0246854 | 27 | _present = 0; |
KentaShimizu | 0:633dd0246854 | 28 | _last = 0; |
KentaShimizu | 0:633dd0246854 | 29 | attach( this, & BufferSerial :: _irq ); |
KentaShimizu | 0:633dd0246854 | 30 | } |
KentaShimizu | 0:633dd0246854 | 31 | |
KentaShimizu | 0:633dd0246854 | 32 | int BufferSerial :: _getShift( const int& value ) { |
KentaShimizu | 0:633dd0246854 | 33 | return value ? ( value - 1 ) : _size ; |
KentaShimizu | 0:633dd0246854 | 34 | } |
KentaShimizu | 0:633dd0246854 | 35 | |
KentaShimizu | 0:633dd0246854 | 36 | void BufferSerial :: _irq( void ) { |
KentaShimizu | 0:633dd0246854 | 37 | int n = _getShift( _last ); |
KentaShimizu | 0:633dd0246854 | 38 | _buf[ n ] = (unsigned char)( Serial :: getc() ); |
KentaShimizu | 0:633dd0246854 | 39 | _last = n; |
KentaShimizu | 0:633dd0246854 | 40 | } |
KentaShimizu | 0:633dd0246854 | 41 | |
KentaShimizu | 0:633dd0246854 | 42 | int BufferSerial :: unreadable( void ) { |
KentaShimizu | 0:633dd0246854 | 43 | return ( _present == _last ); |
KentaShimizu | 0:633dd0246854 | 44 | } |
KentaShimizu | 0:633dd0246854 | 45 | |
KentaShimizu | 0:633dd0246854 | 46 | int BufferSerial :: readable( void ) { |
KentaShimizu | 0:633dd0246854 | 47 | return ! unreadable(); |
KentaShimizu | 0:633dd0246854 | 48 | } |
KentaShimizu | 0:633dd0246854 | 49 | |
KentaShimizu | 0:633dd0246854 | 50 | int BufferSerial :: getc( void ) { |
KentaShimizu | 0:633dd0246854 | 51 | if ( unreadable() ){ |
KentaShimizu | 0:633dd0246854 | 52 | return -1; |
KentaShimizu | 0:633dd0246854 | 53 | }else{ |
KentaShimizu | 0:633dd0246854 | 54 | _present = _getShift( _present ); |
KentaShimizu | 0:633dd0246854 | 55 | return (int)_buf[ _present ]; |
KentaShimizu | 0:633dd0246854 | 56 | } |
KentaShimizu | 0:633dd0246854 | 57 | } |