ADD file via upload

This commit is contained in:
kyt_2002 2023-10-05 18:59:31 +08:00
parent 426eaca6ce
commit a6505f3731
1 changed files with 268 additions and 0 deletions

View File

@ -0,0 +1,268 @@
/**
@file: circular_area_app.c
@brief:
@version: 3.0
@author: AIIT XUOS Lab
@date: 2022/11/21 */
#include "circular_area_app.h"
// 检查参数是否有效的宏定义
#define CA_PARAM_CHECK(param) do {
if ((param) == NULL) {
printf("Invalid parameter\n");
return;
}
} while (0)
// 检查条件是否成立的宏定义
#define CA_CHECK(condition) do {
if (!(condition)) {
printf("Check failed: " #condition "\n");
return;
}
} while (0)
/**
@brief
@param circular_area
@return int 10
*/
int CircularAreaAppIsFull(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
if((circular_area->read_idx == circular_area->write_idx) && (circular_area->status)) {
printf("The circular area is full\n");
return 1;
} else {
return 0;
}
}
/**
@brief
@param circular_area
@return int 10
*/
int CircularAreaAppIsEmpty(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
if((circular_area->read_idx == circular_area->write_idx) && (!circular_area->status)) {
printf("The circular area is empty\n");
return 1;
} else {
return 0;
}
}
/**
@brief
@param circular_area
*/
void CircularAreaAppReset(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
circular_area->write_idx = 0;
circular_area->read_idx = 0;
circular_area->status = 0;
}
/**
@brief
@param circular_area
*/
void CircularAreaAppRelease(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
circular_area->read_idx = 0;
circular_area->write_idx = 0;
circular_area->p_head = NULL;
circular_area->p_tail = NULL;
circular_area->status = 0;
circular_area->length = 0;
PrivFree(circular_area->data_buffer);
PrivFree(circular_area);
}
/**
@brief
@param circular_area
@return uint32_t
*/
uint32_t CircularAreaAppGetMaxLength(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
return circular_area->length;
}
/**
@brief
@param circular_area
@return uint32_t
*/
uint32_t CircularAreaAppGetDataLength(CircularAreaAppType circular_area)
{
CA_PARAM_CHECK(circular_area);
if(CircularAreaAppIsFull(circular_area)) {
return circular_area->length;
} else {
return (circular_area->write_idx - circular_area->read_idx + circular_area->length) % circular_area->length;
}
}
/**
@brief
@param circular_area
@param data_length
@return uint32_t 10
*/
static uint32_t CircularAreaAppDivideRdData(CircularAreaAppType circular_area, uint32_t data_length)
{
CA_PARAM_CHECK(circular_area);
if(circular_area->read_idx + data_length <= circular_area->length) {
return 0;
} else {
return 1;
}
}
/**
@brief
@param circular_area
@param data_length
@return uint32_t 10
*/
static uint32_t CircularAreaAppDivideWrData(CircularAreaAppType circular_area, uint32_t data_length)
{
CA_PARAM_CHECK(circular_area);
if(circular_area->write_idx + data_length <= circular_area->length) {
return 0;
} else {
return 1;
}
}
/**
@brief
@param circular_area
@param output_buffer
@param data_length
@return int -1
*/
int CircularAreaAppRead(CircularAreaAppType circular_area, uint8_t *output_buffer, uint32_t data_length)
{
CA_PARAM_CHECK(circular_area);
CA_PARAM_CHECK(output_buffer);
CA_CHECK(data_length > 0);
if(CircularAreaAppIsEmpty(circular_area)) {
return -1;
}
int read_length = (data_length > CircularAreaAppGetDataLength(circular_area)) ? CircularAreaAppGetDataLength(circular_area) : data_length;
if(CircularAreaAppDivideRdData(circular_area, read_length)) {
uint32_t read_len_up = circular_area->length - circular_area->read_idx;
uint32_t read_len_down = read_length - read_len_up;
memcpy(output_buffer, &circular_area->data_buffer[circular_area->read_idx], read_len_up);
memcpy(output_buffer + read_len_up, circular_area->p_head, read_len_down);
circular_area->read_idx = read_len_down;
} else {
memcpy(output_buffer, &circular_area->data_buffer[circular_area->read_idx], read_length);
circular_area->read_idx = (circular_area->read_idx + read_length) % circular_area->length;
}
circular_area->status = 0;
return read_length;
}
/**
@brief
@param circular_area
@param input_buffer
@param data_length
@param b_force
@return int -10
*/
int CircularAreaAppWrite(CircularAreaAppType circular_area, uint8_t *input_buffer, uint32_t data_length, int b_force)
{
CA_PARAM_CHECK(circular_area);
CA_PARAM_CHECK(input_buffer);
CA_CHECK(data_length > 0);
if(CircularAreaAppIsFull(circular_area) && (!b_force)) {
return -1;
}
uint32_t write_data_length = circular_area->length - circular_area->write_idx;
if(write_data_length >= data_length) {
memcpy(&circular_area->data_buffer[circular_area->write_idx], input_buffer, data_length);
circular_area->write_idx = (circular_area->write_idx + data_length) % circular_area->length;
} else {
memcpy(&circular_area->data_buffer[circular_area->write_idx], input_buffer, write_data_length);
memcpy(circular_area->p_head, input_buffer + write_data_length, data_length - write_data_length);
circular_area->write_idx = data_length - write_data_length;
}
circular_area->status = 1;
return 0;
}