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 */