diff --git a/cores/arduino/RingBuffer.cpp b/cores/arduino/RingBuffer.cpp index f0b3ed1dff1d34909139e2343861de6e89533729..123f895edb16002394fd28308becf11e861dd2e4 100644 --- a/cores/arduino/RingBuffer.cpp +++ b/cores/arduino/RingBuffer.cpp @@ -22,13 +22,12 @@ RingBuffer::RingBuffer( void ) { memset( _aucBuffer, 0, SERIAL_BUFFER_SIZE ) ; - _iHead=0 ; - _iTail=0 ; + clear(); } void RingBuffer::store_char( uint8_t c ) { - int i = (uint32_t)(_iHead + 1) % SERIAL_BUFFER_SIZE ; + int i = nextIndex(_iHead); // if we should be storing the received character into the location // just before the tail (meaning that the head would advance to the @@ -41,3 +40,42 @@ void RingBuffer::store_char( uint8_t c ) } } +void RingBuffer::clear() +{ + _iHead = 0; + _iTail = 0; +} + +int RingBuffer::read_char() +{ + if(_iTail == _iHead) + return -1; + + int value = _aucBuffer[_iTail]; + _iTail = nextIndex(_iTail); + + return value; +} + +int RingBuffer::available() +{ + int delta = _iHead - _iTail; + + if(delta < 0) + return SERIAL_BUFFER_SIZE + delta; + else + return delta; +} + +int RingBuffer::peek() +{ + if(_iTail == _iHead) + return -1; + + return _aucBuffer[_iTail]; +} + +int RingBuffer::nextIndex(int index) +{ + return (uint32_t)(index + 1) % SERIAL_BUFFER_SIZE; +} \ No newline at end of file diff --git a/cores/arduino/RingBuffer.h b/cores/arduino/RingBuffer.h index 28309df459c45ed2e672ed7054b7b57c81de16c2..030620b39f1250e2acc9eec75de5e8443a15cc3d 100644 --- a/cores/arduino/RingBuffer.h +++ b/cores/arduino/RingBuffer.h @@ -37,6 +37,13 @@ class RingBuffer public: RingBuffer( void ) ; void store_char( uint8_t c ) ; + void clear(); + int read_char(); + int available(); + int peek(); + + private: + int nextIndex(int index); } ; #endif /* _RING_BUFFER_ */ diff --git a/cores/arduino/SERCOMUart.cpp b/cores/arduino/SERCOMUart.cpp index bb5325fcacaf72affd751cc83a2eb01a22195d35..c3aa4a139514b64d407eb59df53a015328c4b304 100644 --- a/cores/arduino/SERCOMUart.cpp +++ b/cores/arduino/SERCOMUart.cpp @@ -20,7 +20,8 @@ void SERCOMUart::begin(uint16_t baudrate, uint8_t config) sercom->enableUART(); } -void SERCOMUart::end(){ +void SERCOMUart::end() +{ sercom->resetUART(); rxBuffer.clear(); } @@ -47,7 +48,7 @@ void SERCOMUart::IrqHandler() bool SERCOMUart::available() { - return rxBuffer.available_char(); + return rxBuffer.available(); } int SERCOMUart::peek()