117 lines
4.2 KiB
C
117 lines
4.2 KiB
C
/**
|
|
* @file ring_buffer.h
|
|
* @brief
|
|
*
|
|
* Copyright (c) 2021 Bouffalolab team
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
*/
|
|
#ifndef __RING_BUFFER_H__
|
|
#define __RING_BUFFER_H__
|
|
|
|
#include "misc.h"
|
|
|
|
/** @addtogroup BL_Common_Component
|
|
* @{
|
|
*/
|
|
|
|
/** @addtogroup RING_BUFFER
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup RING_BUFFER_Public_Types
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief Ring buffer status type definition
|
|
*/
|
|
typedef enum {
|
|
RING_BUFFER_EMPTY, /*!< Ring buffer is empty */
|
|
RING_BUFFER_PARTIAL, /*!< Ring buffer has partial data */
|
|
RING_BUFFER_FULL, /*!< Ring buffer is full */
|
|
} Ring_Buffer_Status_Type;
|
|
|
|
/**
|
|
* @brief Ring buffer structure definition
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint8_t *pointer; /*!< Pointer of ring buffer */
|
|
uint8_t readMirror; /*!< Read mirror,used to judge empty or full */
|
|
uint32_t readIndex; /*!< Index of read address */
|
|
uint8_t writeMirror; /*!< Write mirror,used to judge empty or full */
|
|
uint32_t writeIndex; /*!< Index of write address */
|
|
uint32_t size; /*!< Size of ring buffer */
|
|
void (*lock)(void); /*!< Lock ring buffer */
|
|
void (*unlock)(void); /*!< Unlock ring buffer */
|
|
} Ring_Buffer_Type;
|
|
|
|
/*@} end of group RING_BUFFER_Public_Types */
|
|
|
|
/** @defgroup RING_BUFFER_Public_Constants
|
|
* @{
|
|
*/
|
|
|
|
/** @defgroup RING_BUFFER_STATUS_TYPE
|
|
* @{
|
|
*/
|
|
#define IS_RING_BUFFER_STATUS_TYPE(type) (((type) == RING_BUFFER_EMPTY) || \
|
|
((type) == RING_BUFFER_PARTIAL) || \
|
|
((type) == RING_BUFFER_FULL))
|
|
|
|
/*@} end of group RING_BUFFER_Public_Constants */
|
|
|
|
/** @defgroup RING_BUFFER_Public_Macros
|
|
* @{
|
|
*/
|
|
typedef void(ringBuffer_Lock_Callback)(void);
|
|
typedef void(ringBuffer_Read_Callback)(void *, uint8_t *, uint32_t);
|
|
typedef void(ringBuffer_Write_Callback)(void *, uint8_t *, uint32_t);
|
|
|
|
/*@} end of group RING_BUFFER_Public_Macros */
|
|
|
|
/** @defgroup RING_BUFFER_Public_Functions
|
|
* @{
|
|
*/
|
|
BL_Err_Type Ring_Buffer_Init(Ring_Buffer_Type *rbType, uint8_t *buffer, uint32_t size, ringBuffer_Lock_Callback *lockCb,
|
|
ringBuffer_Lock_Callback *unlockCb);
|
|
BL_Err_Type Ring_Buffer_Reset(Ring_Buffer_Type *rbType);
|
|
uint32_t Ring_Buffer_Write_Callback(Ring_Buffer_Type *rbType, uint32_t length, ringBuffer_Write_Callback *writeCb,
|
|
void *parameter);
|
|
uint32_t Ring_Buffer_Write(Ring_Buffer_Type *rbType, const uint8_t *data, uint32_t length);
|
|
uint32_t Ring_Buffer_Write_Byte(Ring_Buffer_Type *rbType, const uint8_t data);
|
|
uint32_t Ring_Buffer_Write_Force(Ring_Buffer_Type *rbType, const uint8_t *data, uint32_t length);
|
|
uint32_t Ring_Buffer_Write_Byte_Force(Ring_Buffer_Type *rbType, const uint8_t data);
|
|
uint32_t Ring_Buffer_Read_Callback(Ring_Buffer_Type *rbType, uint32_t length, ringBuffer_Read_Callback *readCb,
|
|
void *parameter);
|
|
uint32_t Ring_Buffer_Read(Ring_Buffer_Type *rbType, uint8_t *data, uint32_t length);
|
|
uint32_t Ring_Buffer_Read_Byte(Ring_Buffer_Type *rbType, uint8_t *data);
|
|
uint32_t Ring_Buffer_Peek(Ring_Buffer_Type *rbType, uint8_t *data, uint32_t length);
|
|
uint32_t Ring_Buffer_Peek_Byte(Ring_Buffer_Type *rbType, uint8_t *data);
|
|
uint32_t Ring_Buffer_Get_Length(Ring_Buffer_Type *rbType);
|
|
uint32_t Ring_Buffer_Get_Empty_Length(Ring_Buffer_Type *rbType);
|
|
Ring_Buffer_Status_Type Ring_Buffer_Get_Status(Ring_Buffer_Type *rbType);
|
|
|
|
/*@} end of group RING_BUFFER_Public_Functions */
|
|
|
|
/*@} end of group RING_BUFFER */
|
|
|
|
/*@} end of group BL_Common_Component */
|
|
|
|
#endif /* __RING_BUFFER_H__ */
|