/********** serial API Header ******************/
#ifndef _BMS_SERIAL_API_H_
#define _BMS_SERIAL_API_H_
//***********************************************
#include <zephyr.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <drivers/uart.h>
#include <sys/ring_buffer.h>
//**********
static bool bms_transmit_done = false;

// UART RX primary buffers
#define BMS_UART_TX_TIMEOUT_MS	300
#define BMS_UART_RX_TIMEOUT_MS	1000


uint8_t bms_double_buffer[2][CONFIG_BMS_UART_BUF_SIZE];
uint8_t *bms_buf_next = bms_double_buffer[1];

volatile int bms_bytes_claimed;

K_SEM_DEFINE(bms_tx_done, 1, 1);
K_SEM_DEFINE(bms_rx_disabled, 0, 1);

static const struct device *bms_uart;

struct bms_msg_queue_item {
	uint8_t bytes[CONFIG_BMS_UART_BUF_SIZE];
	uint8_t length;
};

struct bms_msg_queue_item bms_incoming_message;

// UART TX fifo
RING_BUF_DECLARE(bms_tx_fifo, CONFIG_BMS_UART_TX_BUF_SIZE);

// UART RX message queue
K_MSGQ_DEFINE(bms_rx_msgq, sizeof(struct bms_msg_queue_item), CONFIG_BMS_UART_RX_MSG_QUEUE_SIZE, 2);
//***************************
void disable_uart0();
void enable_uart0();
void disable_uart1();
void enable_uart1();

void bms_uart_init(void);
unsigned int bms_tx_get_from_queue(void);
void bms_uart_async_callback(const struct device *uart_dev, struct uart_event *evt, void *user_data);
unsigned int bms_uart_send(const uint8_t * data_ptr, uint32_t data_len);
//*************
#endif
//*************