/*
 * ringbuf.h
 *
 *  Created on: Jul 12, 2022
 *      Author: tom
 */

#ifndef _INC_RINGBUF_H_
#define _INC_RINGBUF_H_

#define RING_STATISTICS_ENABLED 1

#define RINGBUF_MAX_READ_LEN 80

typedef enum {
	RINGBUF_PARAM_NONE =	0x00,
	RINGBUF_ALLOWOVERWRITE=	0x01,
} ringbuf_param_t;

#if !defined _SYS_ERRNO_H_ && !defined __ERRNO_H__ && !defined __AT1_ERROR_NUMBERS__
typedef enum {
	EPERM	=  1,	/*!< Operation not permitted	*/
	EIO		=  5,	/*!< I/O error	*/
	ENOMEM	= 12,	/*!< Out of memory		*/
	EFAULT	= 14,	/*!< Bad address		*/
	EBUSY 	= 16,	/*!< Device or resource busy	*/
	ENODEV	= 19,	/*!< No such device		*/
	EINVAL	= 22,	/*!< Invalid argument	*/
	EADDRINUSE = 98,/*!< Address already in use	*/
	ETIMEDOUT = 116,/*!< Connection timed out	*/
} ringbuf_errno_t;
#endif
//extern ringbuf;
#define hring struct ringbuf *
//receive callback typedef definition
typedef void (*ringbuf_rcv_cb_t)(uint16_t delimiterfound, void* cb_data);

#if !defined min
#define min(a,b) ((a < b)? a : b)
#endif

hring ringbuf_create(size_t size, ringbuf_param_t param);
void ringbuf_destroy(hring);
int ringbuf_push(hring, const uint8_t *data, size_t size);
int ringbuf_pull(hring, uint8_t *data, size_t maxsize);
int ringbuf_clear(hring);
int ringbuf_free(hring);
int ringbuf_read(hring, char *str);
int ringbuf_write(hring, char *str);
int ringbuf_callback_register(hring, ringbuf_rcv_cb_t cb_func, void *cb_data);
int ringbuf_set_max_read_len(hring, int max_read_len);
int ringbuf_get_max_read_len(hring);
int ringbuf_is_empty(hring);
int ringbuf_dump(hring);

#if RING_STATISTICS_ENABLED
int ringbuf_statistics(hring);
int ringbuf_stat_writes(hring);
int ringbuf_stat_reads(hring);
int ringbuf_stat_overflow(hring);
#endif

#endif /* _INC_RINGBUF_H_ */
