Buffering Serial receive data class

Dependents:   10dof 10dof2 TTB_Wallbot Nucleo_L432KC_Quadrature_Decoder_with_ADC_and_DAC

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?

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