/*==============================================================================
 * Инициализация тактирования с использованием бибилотеки PLIB035
 *------------------------------------------------------------------------------
 * ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
 *==============================================================================
 *                                  ЦНИИ СЭТ
 *==============================================================================
 */
#ifndef __UART_H
#define __UART_H
//-- Includes ------------------------------------------------------------------
#include "plib035.h"
#include "retarget_conf.h"

//-- Defines -------------------------------------------------------------------
// Дефайны для кольцевых буферов UART
#ifndef UART_RX_BUF_SIZE
#define UART_RX_BUF_SIZE 128
#endif
#ifndef UART_TX_BUF_SIZE
#define UART_TX_BUF_SIZE 128
#endif

// Дефайны для режима направления UART
#define UART_Direction_None   DISABLE,    DISABLE
#define UART_Direction_RxTx   ENABLE,     ENABLE
#define UART_Direction_Tx     DISABLE,    ENABLE
#define UART_Direction_Rx     ENABLE,     DISABLE

// Дефайны для пинов UART
#define UART0_Tx_Pin      GPIO_Pin_10   // PB10 для UART0 Tx
#define UART0_Rx_Pin      GPIO_Pin_11  // PB11 для UART0 Rx
#define UART0_GPIO_Port   GPIOB

#define UART1_Tx_Pin      GPIO_Pin_8   // PB8 для UART1 Tx
#define UART1_Rx_Pin      GPIO_Pin_9   // PB9 для UART1 Rx
#define UART1_GPIO_Port   GPIOB


typedef enum
{
  UART_Callback_Rx,
  UART_Callback_Tx,
  UART_Callback_Idle,
  UART_Callback_Error,
}UART_CallbackTypeDef;


typedef struct
{
  UART_Init_TypeDef UART_Init;  /* Стандартная конфигурация из PLIB */
  
  // Callback функции
  void (*RxCallback)(void);   /* Вызывается при приеме полного сообщения */
  void (*TxCallback)(void);   /* Вызывается при окончании передачи */
  void (*IdleCallback)(void); /* Вызывается при IDLE линии на RX */
  void (*ErrCallback)(void);  /* Вызывается при ошибке */
  
} UART_ExtInitTypeDef;




typedef struct
{
  UART_TypeDef        *UART;    /* Регистры UART */
  UART_ExtInitTypeDef *Config;  /* Конфигурация UART */
  
  /* ===== TX ===== */
  const uint8_t     *TxBufPtr;  /* текущий массив для передачи*/
  uint16_t          TxCount;    /* счетчик отправленых байт*/
  uint16_t          TxSize;     /* длина данных для отправки*/
  volatile uint8_t  TxBusy;     /* Флаг занятости TX*/

  /* ===== RX ===== */
  uint8_t           *RxBufPtr;  /* буфер для приёма*/
  uint16_t          RxCount;    /* счетчик принятых байт*/
  uint16_t          RxSize;     /* длина данных для приема*/
  volatile uint8_t  RxBusy;     /* Флаг занятости RX*/
}UART_HandleTypeDef;

extern UART_HandleTypeDef huart0;
extern UART_HandleTypeDef huart1;

//-- Exported functions prototypes ---------------------------------------------
void uart_init_first(void);

OperationStatus uart_init(UART_HandleTypeDef *huart, UART_ExtInitTypeDef *NewConfig);
OperationStatus uart_set_callback(UART_HandleTypeDef* huart, UART_CallbackTypeDef cb_type, void (*Callback)(void));  
OperationStatus uart_start(UART_HandleTypeDef *huart, UART_FIFOLevel_TypeDef TxFifoLevel, UART_FIFOLevel_TypeDef RxFifoLevel);

OperationStatus uart_transmit(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size, uint32_t timeout);
OperationStatus uart_receive(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size, uint32_t timeout);
OperationStatus uart_transmit_it(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size);
OperationStatus uart_receive_it(UART_HandleTypeDef *huart, uint8_t *buf, uint16_t size);


void uart_handler(UART_HandleTypeDef *huart);
void uart0_gpio_init(void);
void uart0_gpio_deinit(void);
void uart1_gpio_init(void);
void uart1_gpio_deinit(void);

#endif /*__UART_H*/
