/ Drivers / ring_buffer / ring_buffer.h
ring_buffer.h
  1  /**
  2    *********************************************************************************************************
  3    *
  4    *	This file is part of Devprodest Lib.
  5    *	
  6    *	  Devprodest Lib is free software: you can redistribute it and/or modify
  7    *	  it under the terms of the GNU General Public License as published by
  8    *	  the Free Software Foundation, either version 3 of the License, or
  9    *	  (at your option) any later version.
 10    *	
 11    *	  Devprodest Lib is distributed in the hope that it will be useful,
 12    *	  but WITHOUT ANY WARRANTY; without even the implied warranty of
 13    *	  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14    *	  GNU General Public License for more details.
 15    *	
 16    *	  You should have received a copy of the GNU General Public License
 17    *	  along with Devprodest Lib.  If not, see <http://www.gnu.org/licenses/>.
 18    *	
 19    * @file ring_buffer.h
 20    * @brief Кольцевой буфер
 21    * @version 1.0
 22    * @authors Zaikin Denis (ZD)
 23    * @authors Potorochin Andrew (PA)
 24    * 
 25    * @copyright GNU General Public License
 26    *********************************************************************************************************
 27    */
 28  #ifndef RING_BUFFER_H
 29  #define RING_BUFFER_H
 30  
 31  #ifdef __cplusplus
 32  extern "C" {
 33  #endif
 34  
 35  #include <stdint.h>
 36  #include <stdlib.h>
 37  
 38  /// Тип описывающий кольцовой буфер
 39  typedef struct
 40  {
 41      uint8_t *buffer;           ///< Указатель на буфер-хранилище
 42      uint16_t idxIn;            ///< Номер ячейки для записи
 43      uint16_t idxOut;           ///< Номер ячейки для чтения
 44      uint16_t size;             ///< Размер Буфера-хранилища
 45  } RING_buffer_t;
 46  
 47  
 48  /// Возможные состояния выполнения функции инициализации
 49  typedef enum 
 50  {
 51      RING_ERROR = 0,             ///< Значение еслипроизошла ошибка
 52      RING_SUCCESS = !RING_ERROR  ///< Значение если всё прошло удачно
 53  } RING_ErrorStatus_t;
 54  
 55  /**
 56  @function RING_CRC16ccitt − Вычисление контрольной суммы.
 57  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
 58  @param uint16_t lenght − Сколько элементов буфера участвуют в подсчете.
 59  @param uint16_t position − С какого элемента начинать.
 60  @return uint16_t Результат вычисления контрольной суммы.
 61   */
 62  uint16_t RING_CRC16ccitt(const RING_buffer_t *buf, uint16_t lenght, uint16_t position);
 63  
 64  /**
 65  @function RING_CRC16ccitt_Intermediate − Вычисление контрольной суммы с инициализацией.
 66  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
 67  @param uint16_t lenght − Сколько элементов буфера участвуют в подсчете.
 68  @param uint16_t tmpCrc − Начальное значение контрольной суммы.
 69  @param uint16_t position − С какого элемента начинать.
 70  @return uint16_t Результат вычисления контрольной суммы.
 71   */
 72  uint16_t RING_CRC16ccitt_Intermediate(const RING_buffer_t *buf, uint16_t lenght, uint16_t tmpCrc, uint16_t position);
 73  
 74  /**
 75  @function RING_Init − Инициализация буфера.
 76  @param RING_buffer_t *ring − Указатель на кольцевой буфер.
 77  @param uint8_t *buf − Указатель на буфер хранения.
 78  @param uint16_t size − Сколько элементов в буфере.
 79  @return RING_ErrorStatus_t Результат инициализации @ref RING_ErrorStatus_t
 80   */
 81  RING_ErrorStatus_t RING_Init(RING_buffer_t *ring, uint8_t *buf, uint16_t size);
 82  
 83  /**
 84  @function RING_GetCount − Количество полезных данных в буфере.
 85  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
 86  @return uint16_t Количество полезных данных в буфере.
 87   */
 88  uint16_t RING_GetCount(const RING_buffer_t *buf);
 89  
 90  /**
 91  @function RING_Clear − Очищает буфер.
 92  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
 93   */
 94  void RING_Clear(RING_buffer_t* buf);
 95  
 96  /**
 97  @function RING_Put − Загружает элемент в буфер.
 98  @param uint8_t symbol − Элемент для загрузки в буфер.
 99  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
100   */
101  void RING_Put( RING_buffer_t* buf, uint8_t symbol);
102  
103  /**
104  @function RING_Put16 − Загружает элемент в буфер.
105  @param uint16_t symbol − Элемент для загрузки в буфер.
106  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
107   */
108  void RING_Put16( RING_buffer_t* buf, uint16_t symbol);
109  
110  /**
111  @function RING_PutBuffr − Загружает элементы из массива-источника в кольцевой буфер.
112  @param RING_buffer_t *ringbuf − Указатель на кольцевой буфер.
113  @param uint8_t *src − Указатель на массив-источник.
114  @param uint16_t len − количество загружаемых элементов.
115   */
116  void RING_PutBuffr(RING_buffer_t *ringbuf, uint8_t *src, uint16_t len);
117  
118  /**
119  @function RING_Pop − Получает из буфера байт.
120  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
121  @return uint8_t Значение полученого элемента.
122   */
123  uint8_t RING_Pop(RING_buffer_t *buf);
124  
125  /**
126  @function RING_Pop16 − Получает из буфера 16-битное число.
127  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
128  @return uint16_t Значение полученого элемента.
129   */
130  uint16_t RING_Pop16(RING_buffer_t *buf);
131  
132  /**
133  @function RING_Pop32 − Получает из буфера 32-битное число.
134  @param RING_buffer_t *buf − Указатель на кольцевой буфер.
135  @return uint32_t Значение полученого элемента.
136   */
137  uint32_t RING_Pop32(RING_buffer_t *buf);
138  
139  /**
140  @function RING_PopBuffr − Заполняет элементами кольцевого буфера массив.
141  @param RING_buffer_t *ringbuf − Указатель на кольцевой буфер.
142  @param uint8_t *destination − Указатель на массив.
143  @param uint16_t len − количество получаемых элементов.
144   */
145  void RING_PopBuffr(RING_buffer_t *ringbuf, uint8_t *destination, uint16_t len);
146  
147  
148  /**
149  @function RING_PopString − Считывает нультерминальную строку из буфера в string
150  @param RING_buffer_t *ringbuf − Указатель на кольцевой буфер.
151  @param char *string − Указатель на массив.
152   */
153  void RING_PopString(RING_buffer_t *ringbuf, char *string);
154      
155  /**
156  @function RING_ShowSymbol − Показывает содержимое элемента без его удаления из буфера.
157  @param RING_buffer_t *ringbuf − Указатель на кольцевой буфер.
158  @param uint16_t symbolNumber − Номер элемента.
159  @return int32_t Значение полученого элемента. -1 если ошибка.
160   */
161  int32_t RING_ShowSymbol(const RING_buffer_t *buf, uint16_t symbolNumber);
162  
163  
164  #ifdef __cplusplus
165  }
166  #endif
167  
168  #endif /* RING_BUFFER_H */