/*
 * uart_dev.h
 *
 *  Created on: 2024年6月22日
 *      Author: psx
 */

#ifndef APP_INC_UART_DEV_H_
#define APP_INC_UART_DEV_H_

#include "ch32v30x.h"
#include <rtthread.h>
#include <rthw.h>
#include "RingQueue/ring_queue.h"

#define  ASCII_CHAR_BACKSPACE                           0x08    /* '\b' */
#define  ASCII_CHAR_CHARACTER_TABULATION                0x09    /* '\t' */
#define  ASCII_CHAR_LINE_FEED                           0x0A    /* '\n' */
#define  ASCII_CHAR_LINE_TABULATION                     0x0B    /* '\v' */
#define  ASCII_CHAR_FORM_FEED                           0x0C    /* '\f' */
#define  ASCII_CHAR_CARRIAGE_RETURN                     0x0D    /* '\r' */

//#define RS485_MAX_PACK_DATA_LEN  30

typedef uint32_t device_handle;
extern device_handle g_J1RS485_UART6_handle;
extern device_handle g_J2RS485_UART7_handle;
extern device_handle g_J3RS485_USART2_handle;
extern device_handle g_J4RS485_UART8_handle;
extern device_handle g_J50RS485_USART3_handle;
extern device_handle g_LORA_UART4_handle;
extern device_handle g_Upward_UART5_handle;

/*
 * 串口连接对应的连接的设备
 * ONLYONE表示唯一
 * 串口3，会分时复用，采用如下的方式确定在与谁通信
 */
typedef enum{
    ONLYONE = 1,
    J0RS485 = 0,
    J5RS485 = 5,
    J6RS485 = 6,
    J7RS485 = 7,
    J8RS485 = 8,
    J9RS485 = 9,
}uartNum_e;

/* UART 驱动数据结构，对应一个uart设备 */
typedef struct _uart_device_info{
  uint8_t       init;               /* 设备是否初始化 */
  USART_TypeDef *uart_index;        /* 对应的硬件串口 */
  uint32_t      uart_baudrate;      /* 波特率 */
  RingQueue     uart_ring_queue;    /* 缓冲区 */
  uartNum_e     uart_num;           /* 对应输出的设备 */
}uart_device_info;

//device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size);
//device_handle uart_dev_init(uart_device_info *uart_device, uint8_t *buff, int buff_size);
//device_handle uart_dev_init(void);
uint8_t uart_all_dev_init(void);
void uart_sendstr(device_handle device,char *str);
void uart_dev_write(device_handle device, void *data, int len);
int uart_dev_char_present(device_handle device);
char uart_dev_in_char(device_handle device);
int ring_queue_dev_char_present(RingQueue *ring_queue);
char ring_queue_dev_in_char(RingQueue *ring_queue);
int ring_queue_length(device_handle device);


#endif /* APP_INC_UART_DEV_H_ */
