/*
 * Copyright (c) 2019 Actions Semiconductor Co., Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file crc interface
 */

#ifndef CBUF_H_
#define CBUF_H_

typedef struct
{
    int32_t read_ptr;
    int32_t write_ptr;
    int32_t length;
    uint32_t capacity;
    uint8_t *raw_data;
}cbuf_t;

typedef struct
{
    uint8_t *start_addr;
    uint32_t read_len;
}cbuf_dma_t;


static inline int cbuf_get_used_space(cbuf_t *cbuf)
{
    if(!cbuf){
        return 0;
    }
    
    return cbuf->length;
}

static inline int cbuf_get_free_space(cbuf_t *cbuf)
{
    if(!cbuf){
        return 0;
    }

    return cbuf->capacity - cbuf->length;
}

static inline int cbuf_is_init(cbuf_t *cbuf)
{
    if(!cbuf){
        return false;
    }

    return (cbuf->capacity != 0);
}

static inline int cbuf_is_ptr_valid(cbuf_t *cbuf, uint32_t ptr)
{
    if((ptr >= (uint32_t)cbuf->raw_data) \
        && (ptr <= ((uint32_t)cbuf->raw_data + cbuf->capacity))){
        return 1;
    }else{
        return 0;
    }
}

static inline void *cbuf_get_buffer_ptr(cbuf_t *cbuf)
{
    return (void *)cbuf->raw_data;
}

void cbuf_init(cbuf_t *cbuf, void *buffer, int32_t size);

void cbuf_reset(cbuf_t *cbuf);

int cbuf_read(cbuf_t *cbuf, void *buffer, int32_t len);

int cbuf_write(cbuf_t *cbuf, void *buffer, int32_t len);

int cbuf_dma_read(cbuf_t *cbuf, cbuf_dma_t *dma, int32_t read_len);

int cbuf_dma_update_read_ptr(cbuf_t *cbuf, int32_t read_len);

void cbuf_copy_write_ptr(cbuf_t *src, cbuf_t *dest, uint32_t len);

void cbuf_deinit(cbuf_t *cbuf);

int cbuf_prepare_read(cbuf_t *cbuf, void *buffer, int32_t len);

#endif /* CBUF_H_ */
