/** Copyright (c) 2021-2025, RTduino Development Team** SPDX-License-Identifier: LGPL-v2.1** https://github.com/RTduino/RTduino* https://gitee.com/rtduino/RTduino** Change Logs:* Date Author Notes* 2025年01月05日 Meco Man port to RTduino*//*RingBuffer.h - Ring buffer implementationCopyright (c) 2014 Arduino. All right reserved.This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA*/#ifdef __cplusplus#ifndef _RING_BUFFER_#define _RING_BUFFER_#include <stdint.h>#include <string.h>// Define constants and variables for buffering incoming serial data. We're// using a ring buffer (I think), in which head is the index of the location// to which to write the next incoming character and tail is the index of the// location from which to read.#define SERIAL_BUFFER_SIZE 64template <int N>class RingBufferN{public:uint8_t _aucBuffer[N] ;volatile int _iHead ;volatile int _iTail ;volatile int _numElems;public:RingBufferN( void ) ;void store_char( uint8_t c ) ;void clear();int read_char();int available();int availableForStore();int peek();bool isFull();private:int nextIndex(int index);inline bool isEmpty() const { return (_numElems == 0); }};typedef RingBufferN<SERIAL_BUFFER_SIZE> RingBuffer;template <int N>RingBufferN<N>::RingBufferN( void ){memset( _aucBuffer, 0, N ) ;clear();}template <int N>void RingBufferN<N>::store_char( uint8_t c ){// 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 (!isFull()){_aucBuffer[_iHead] = c ;_iHead = nextIndex(_iHead);_numElems = _numElems + 1;}}template <int N>void RingBufferN<N>::clear(){_iHead = 0;_iTail = 0;_numElems = 0;}template <int N>int RingBufferN<N>::read_char(){if (isEmpty())return -1;uint8_t value = _aucBuffer[_iTail];_iTail = nextIndex(_iTail);_numElems = _numElems - 1;return value;}template <int N>int RingBufferN<N>::available(){return _numElems;}template <int N>int RingBufferN<N>::availableForStore(){return (N - _numElems);}template <int N>int RingBufferN<N>::peek(){if (isEmpty())return -1;return _aucBuffer[_iTail];}template <int N>int RingBufferN<N>::nextIndex(int index){return (uint32_t)(index + 1) % N;}template <int N>bool RingBufferN<N>::isFull(){return (_numElems == N);}#endif /* _RING_BUFFER_ */#endif /* __cplusplus */
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型