/*********************************UART**************************************
Данный файл содержит объявления базовых функции и дефайны для инициализации 
UART.
***************************************************************************/
#ifndef __UART_GENERAL_H_
#define __UART_GENERAL_H_

//////////////////////////////////////////////////////////////////////
/////////////////////////---USER SETTINGS---/////////////////////////
#define HAL_UART_MODULE_ENABLED 	// need to uncomment these defines in stm32f4xx_hal_conf.h
#define HAL_USART_MODULE_ENABLED 	// also need to add hal_uart.c (source code)

//#define USE_USART1
//#define USE_USART2
//#define USE_USART3
//#define USE_UART4
//#define USE_UART5
//#define USE_USART6
/* note: used uart defines in modbus.h */

/////////////////////////---USER SETTINGS---/////////////////////////
#include "periph_general.h"



/////////////////////////////////////////////////////////////////////
////////////////////////////---DEFINES---////////////////////////////
/**  
	* @brief 	Analog for HAL define. Remade with pointer to structure.
	* @note 	@ref __HAL_LINKDMA.
	*/
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__)  	\
do{                                                      								\
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); 										\
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)

															
////////////////////////////---DEFINES---////////////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////---STRUCTURES & ENUMS---//////////////////////
typedef struct // struct with settings for custom function
{
	UART_HandleTypeDef huart;
	
	GPIO_TypeDef *GPIOx;
	uint16_t GPIO_PIN_RX;
	uint16_t GPIO_PIN_TX;
	
	DMA_Stream_TypeDef *DMAChannel; // DMAChannel = 0 if doesnt need
	uint32_t DMA_CHANNEL_X; // DMAChannel = 0 if doesnt need
	
	
}UART_SettingsTypeDef;
///////////////////////---STRUCTURES & ENUMS---//////////////////////


/////////////////////////////////////////////////////////////////////
///////////////////////////---FUNCTIONS---///////////////////////////
/**  
	* @brief 	Initialize UART with UART_SettingsTypeDef structure.
	* @param 	suart - указатель на структуру с настройками UART.
  * @return HAL status.
	* @note 	Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
	*/
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart);
/**  
	* @brief 	Initialize GPIO for UART.
	* @param 	GPIOx 			- порт для настройки.
	* @param 	GPIO_PIN_RX - пин для настройки на прием.
	* @param 	GPIO_PIN_TX - пин для настройки на передачу.
	*/
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX);
/**  
	* @brief 	Initialize DMA for UART.
	* @param 	huart 				- указатель на хендл UART для настройки DMA.
	* @param 	hdma_rx 			- указатель на хендл DMA для линии приема UART.
	* @param 	DMAChannel 		- указатель на канал DMA/поток DMA в STM32F407.
	* @param 	DMA_CHANNEL_X - канал DMA.
	*/
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X);
/**  
	* @brief 	Initialize UART & DMA clock and interrupt.
	* @param 	huart - указатель на хендл UART для инициализации.
	* @note 	Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
						дефайнами определяются используемые UART.
	*/
void UART_MspInit(UART_HandleTypeDef *huart);
/**  
	* @brief 	Deinitialize UART & DMA clock and interrupt.
	* @param 	huart - указатель на хендл UART для деинициализации.
	* @note 	Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
						дефайнами в rs_message.h определяются используемые UART.
	*/
void UART_MspDeInit(UART_HandleTypeDef *huart);

/**  
	* @brief 	Check that uart init structure have correct values.
	* @param 	suart - указатель на структуру с настройками UART.
  * @return HAL status.
	*/
HAL_StatusTypeDef Check_UART_Init_Struct(UART_SettingsTypeDef *suart);
///////////////////////////---FUNCTIONS---///////////////////////////

#endif // __UART_GENERAL_H_