diff --git a/cores/arduino/RingBuffer.cpp b/cores/arduino/RingBuffer.cpp deleted file mode 100644 index 11a32ebd7..000000000 --- a/cores/arduino/RingBuffer.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - Copyright (c) 2014 Arduino. All right reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#include "RingBuffer.h" -#include - -RingBuffer::RingBuffer( void ) -{ - memset( _aucBuffer, 0, SERIAL_BUFFER_SIZE ) ; - clear(); -} - -void RingBuffer::store_char( uint8_t c ) -{ - 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 - // current location of the tail), we're about to overflow the buffer - // and so we don't write the character or advance the head. - if ( i != _iTail ) - { - _aucBuffer[_iHead] = c ; - _iHead = i ; - } -} - -void RingBuffer::clear() -{ - _iHead = 0; - _iTail = 0; -} - -int RingBuffer::read_char() -{ - if(_iTail == _iHead) - return -1; - - uint8_t 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::availableForStore() -{ - if (_iHead >= _iTail) - return SERIAL_BUFFER_SIZE - 1 - _iHead + _iTail; - else - return _iTail - _iHead - 1; -} - -int RingBuffer::peek() -{ - if(_iTail == _iHead) - return -1; - - return _aucBuffer[_iTail]; -} - -int RingBuffer::nextIndex(int index) -{ - return (uint32_t)(index + 1) % SERIAL_BUFFER_SIZE; -} - -bool RingBuffer::isFull() -{ - return (nextIndex(_iHead) == _iTail); -} diff --git a/cores/arduino/RingBuffer.h b/cores/arduino/RingBuffer.h index c2ad3664a..044df7a46 100644 --- a/cores/arduino/RingBuffer.h +++ b/cores/arduino/RingBuffer.h @@ -16,6 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef __cplusplus + #ifndef _RING_BUFFER_ #define _RING_BUFFER_ @@ -27,25 +29,114 @@ // location from which to read. #define SERIAL_BUFFER_SIZE 64 -class RingBuffer +template +class RingBufferN { public: - uint8_t _aucBuffer[SERIAL_BUFFER_SIZE] ; + uint8_t _aucBuffer[N] ; int _iHead ; int _iTail ; public: - RingBuffer( void ) ; + RingBufferN( void ) ; void store_char( uint8_t c ) ; - void clear(); - int read_char(); - int available(); - int availableForStore(); - int peek(); - bool isFull(); + void clear(); + int read_char(); + int available(); + int availableForStore(); + int peek(); + bool isFull(); private: - int nextIndex(int index); -} ; + int nextIndex(int index); +}; + +typedef RingBufferN RingBuffer; + + +template +RingBufferN::RingBufferN( void ) +{ + memset( _aucBuffer, 0, N ) ; + clear(); +} + +template +void RingBufferN::store_char( uint8_t c ) +{ + 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 + // current location of the tail), we're about to overflow the buffer + // and so we don't write the character or advance the head. + if ( i != _iTail ) + { + _aucBuffer[_iHead] = c ; + _iHead = i ; + } +} + +template +void RingBufferN::clear() +{ + _iHead = 0; + _iTail = 0; +} + +template +int RingBufferN::read_char() +{ + if(_iTail == _iHead) + return -1; + + uint8_t value = _aucBuffer[_iTail]; + _iTail = nextIndex(_iTail); + + return value; +} + +template +int RingBufferN::available() +{ + int delta = _iHead - _iTail; + + if(delta < 0) + return N + delta; + else + return delta; +} + +template +int RingBufferN::availableForStore() +{ + if (_iHead >= _iTail) + return N - 1 - _iHead + _iTail; + else + return _iTail - _iHead - 1; +} + +template +int RingBufferN::peek() +{ + if(_iTail == _iHead) + return -1; + + return _aucBuffer[_iTail]; +} + +template +int RingBufferN::nextIndex(int index) +{ + return (uint32_t)(index + 1) % N; +} + +template +bool RingBufferN::isFull() +{ + return (nextIndex(_iHead) == _iTail); +} #endif /* _RING_BUFFER_ */ + +#endif /* __cplusplus */ diff --git a/cores/arduino/delay.h b/cores/arduino/delay.h index be3a93c65..64f39b13f 100644 --- a/cores/arduino/delay.h +++ b/cores/arduino/delay.h @@ -19,13 +19,13 @@ #ifndef _DELAY_ #define _DELAY_ +#include +#include "variant.h" + #ifdef __cplusplus extern "C" { #endif -#include -#include "variant.h" - /** * \brief Returns the number of milliseconds since the Arduino board began running the current program. * diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index 3ea958d92..db2ae646e 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -71,10 +71,10 @@ class TwoWire : public Stream bool transmissionBegun; // RX Buffer - RingBuffer rxBuffer; + RingBufferN<256> rxBuffer; //TX buffer - RingBuffer txBuffer; + RingBufferN<256> txBuffer; uint8_t txAddress; // Callback user functions