/**
******************************************************************************
* @file upp_io.c
* @brief Входы/выходы УПП
******************************************************************************
* @details
******************************************************************************/
#include "upp_io.h"
#include "main.h"
UPP_LEDs_t UPP_LEDS;
UPP_DiscreteInputs_t UPP_DIN;
UPP_DiscreteOutputs_t UPP_DO;

static void UPP_CEN_Write(int state);
static void UPP_RDO1_Write(int state);
static void UPP_RDO2_Write(int state);
static void UPP_RDO3_Write(int state);
static void UPP_RDO4_Write(int state);
static void UPP_DO1_Write(int state);
static void UPP_DO2_Write(int state);
static void UPP_DO3_Write(int state);
static void UPP_DO4_Write(int state);
static void UPP_DO5_Write(int state);



/**
  * @brief Инициализация дискретных входов/выходов УПП
	*/
void UPP_IO_Init(void)
{
  /* Дискретные выходы */
  UPP_DO.CEN    = &UPP_CEN_Write;
  UPP_DO.Ready  = &UPP_RDO3_Write;
  UPP_DO.Work   = &UPP_RDO2_Write;
  UPP_DO.Error  = &UPP_RDO1_Write;
  UPP_DO.RDO4   = &UPP_RDO4_Write;
  UPP_DO.DO1    = &UPP_DO1_Write;
  UPP_DO.DO2    = &UPP_DO2_Write;
  UPP_DO.DO3    = &UPP_DO3_Write;
  UPP_DO.DO4    = &UPP_DO4_Write;
  UPP_DO.DO5    = &UPP_DO5_Write;
  
  
  /* Дискретные входы */
  GPIO_Switch_Init(&UPP_DIN.Pusk,       DIN1_GPIO_Port,         DIN1_Pin,         0);
  UPP_DIN.Pusk.Sw_FilterDelay = 100;
  GPIO_Switch_Init(&UPP_DIN.MestDist,   DIN2_GPIO_Port,         DIN2_Pin,         0);
  UPP_DIN.MestDist.Sw_FilterDelay = 100;
  GPIO_Switch_Init(&UPP_DIN.DIN3,       DIN3_GPIO_Port,         DIN3_Pin,         0);
  GPIO_Switch_Init(&UPP_DIN.err_24Vdio, ERR_24VDIO_GPIO_Port,   ERR_24VDIO_Pin,   1);
  GPIO_Switch_Init(&UPP_DIN.err_24V,    ERR_24V_GPIO_Port,      ERR_24V_Pin,      1);
  GPIO_Switch_Init(&UPP_DIN.err_5Vsi,   ERR_5VSI_GPIO_Port,     ERR_5VSI_Pin,     0);
  
  /* Дискретные входы платы УМ */
  GPIO_Switch_Init(&UPP_DIN.err_5Vd,    UM_ERR_5VD_GPIO_Port,   UM_ERR_5VD_Pin,   0);
  GPIO_Switch_Init(&UPP_DIN.err_Va,     UM_ERR_VA_GPIO_Port,    UM_ERR_VA_Pin,    1);
  
  /* Светодиоды платы УМ */
  GPIO_LED_Init(&UPP_LEDS.green1,  UM_LED_GREEN1_GPIO_Port,   UM_LED_GREEN1_Pin,   0);
  GPIO_LED_Init(&UPP_LEDS.green2,  UM_LED_GREEN2_GPIO_Port,   UM_LED_GREEN2_Pin,   0);
  GPIO_LED_Init(&UPP_LEDS.red,     UM_LED_RED_GPIO_Port,      UM_LED_RED_Pin,      0);
  
  
  /* Очищаем выходы */
  UPP_DO.CEN(DISABLE);
  UPP_DO.Error(DISABLE);
  UPP_DO.Work(DISABLE);
  UPP_DO.Ready(DISABLE);
  UPP_DO.RDO4(DISABLE);
  UPP_DO.DO1(DISABLE);
  UPP_DO.DO2(DISABLE);
  UPP_DO.DO3(DISABLE);
  UPP_DO.DO4(DISABLE);
  UPP_DO.DO5(DISABLE);
  GPIO_LED_Off(&UPP_LEDS.green1);
  GPIO_LED_Off(&UPP_LEDS.green2);
  GPIO_LED_Off(&UPP_LEDS.red);
  
}


/**
  * @brief Выставить направление UART1 (STM USART2)
	*/
void UPP_UART1_SetDirection(int state)
{
  HAL_GPIO_WritePin(SCIDE1_GPIO_Port, SCIDE1_Pin, state);
}
/**
  * @brief Выставить направление UART2 (STM USART5)
	*/
void UPP_UART2_SetDirection(int state)
{
  HAL_GPIO_WritePin(SCIDE2_GPIO_Port, SCIDE2_Pin, state);
}



static void UPP_CEN_Write(int state)
{
#if !defined(STM32F417xx)
  HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, !state);
#else
  HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, state);
#endif
}
static void UPP_RDO1_Write(int state)
{
  HAL_GPIO_WritePin(RDO1_GPIO_Port, RDO1_Pin, state);
}
static void UPP_RDO2_Write(int state)
{
  HAL_GPIO_WritePin(RDO2_GPIO_Port, RDO2_Pin, state);
}
static void UPP_RDO3_Write(int state)
{
  HAL_GPIO_WritePin(RDO3_GPIO_Port, RDO3_Pin, state);
}
static void UPP_RDO4_Write(int state)
{
  HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, state);
}
static void UPP_DO1_Write(int state)
{
  HAL_GPIO_WritePin(DO1_GPIO_Port, DO1_Pin, state);
}
static void UPP_DO2_Write(int state)
{
  HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, state);
}
static void UPP_DO3_Write(int state)
{
  HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, state);
}
static void UPP_DO4_Write(int state)
{
  HAL_GPIO_WritePin(DO4_GPIO_Port, DO4_Pin, state);
}
static void UPP_DO5_Write(int state)
{
  HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, state);
}
