Buffering Serial receive data class
Dependents: 10dof 10dof2 TTB_Wallbot Nucleo_L432KC_Quadrature_Decoder_with_ADC_and_DAC
BufferSerial.cpp
- Committer:
- KentaShimizu
- Date:
- 2013-05-19
- Revision:
- 0:633dd0246854
File content as of revision 0:633dd0246854:
#include "BufferSerial.h" BufferSerial :: BufferSerial( PinName tx , PinName rx ) : Serial( tx , rx ) { _setup( 1 ); } BufferSerial :: BufferSerial( PinName tx , PinName rx , const int& bufferSize ) : Serial( tx , rx ) { _setup( bufferSize ); } BufferSerial :: BufferSerial( PinName tx , PinName rx , const int& bufferSize , const char* name ) : Serial( tx , rx , name ) { _setup( bufferSize ); } BufferSerial :: ~BufferSerial() { delete[] _buf; } void BufferSerial :: _setup( const int& bufferSize ) { if ( bufferSize > 1 ){ _buf = new unsigned char[ bufferSize ]; _size = bufferSize - 1; }else{ _buf = new unsigned char[ 2 ]; _size = 1; } _present = 0; _last = 0; attach( this, & BufferSerial :: _irq ); } int BufferSerial :: _getShift( const int& value ) { return value ? ( value - 1 ) : _size ; } void BufferSerial :: _irq( void ) { int n = _getShift( _last ); _buf[ n ] = (unsigned char)( Serial :: getc() ); _last = n; } int BufferSerial :: unreadable( void ) { return ( _present == _last ); } int BufferSerial :: readable( void ) { return ! unreadable(); } int BufferSerial :: getc( void ) { if ( unreadable() ){ return -1; }else{ _present = _getShift( _present ); return (int)_buf[ _present ]; } }