/**
******************************************************************************
* @file upp_defs.h
* @brief Общие дефайны УПП
******************************************************************************
@addtogroup UPP_DEFS UPP defines
@ingroup    UPP_MAIN
@brief Общие дефайны для всего проекта УПП
@{
******************************************************************************
* @details
******************************************************************************/
#ifndef _UPP_DEFS_H_
#define _UPP_DEFS_H_
#include "upp_config.h"


/** 
  * @addtogroup UPP_HIGHLEVEL Defines for high-level
  * @ingroup    UPP_DEFS
  * @brief      Дефайны УПП которые определяют коды ошибок и параметры для общения с верхним уровнем
  * @{
  */


/** 
  * @brief Список аварий УПП 
  */
typedef enum {
  UPP_Init  = 0,  ///< УПП не инициализирован
  UPP_Ready     = 1,  ///< УПП в готовности
  UPP_Work      = 2,  ///< УПП в работе, управляет тиристорами
  UPP_Error     = 3,  ///< УПП в аварии
//  WM_Done     = 3,  ///< УПП закончил свою работу
} UPP_WorkModeType_t;

/** 
  * @brief Список аварий УПП 
  */
typedef enum {
  Err_None            = 0,  ///< Неисправность отсутствует
  
  /* Програмные ошибки */
  Err_Internal_1      = 1,  ///< Внутренняя неисправность УПП 1
  Err_Internal_2      = 2,  ///< Внутренняя неисправность УПП 2
  Err_Internal_3      = 3,  ///< Внутренняя неисправность УПП 3
  Err_Internal_4      = 4,  ///< Внутренняя неисправность УПП 4
  Err_Internal_5      = 5,  ///< Внутренняя неисправность УПП 5
  Err_Internal_6      = 6,  ///< Внутренняя неисправность УПП 6
  
  /* Ошибки по питанию */
  Err_Power_Digit_5V  = 7,  ///< Неисправность цифрового источника питания (5 В)
  Err_Power_24V       = 8,  ///< Неисправность источника питания 24 В
  Err_Power_Analog_5V = 9,  ///< Неисправность аналогового источника питания микроконтроллера (± 5 В)
  Err_Power_SCI_5V    = 10, ///< Неисправность источника питания последовательных интерфейсов микроконтроллера (5 В)
  Err_Power_DIO_24V   = 11, ///< Неисправность источника питания дискретных входов/выходов (24 В)
  
  /* Ошибки по допустимым пределам Наряжений/Токов/Температуры */
  Err_OverCurrent     = 12, ///< Ток выше допустимого (см. Imax и TiMax в @ref UPP_PUI_Params_t)
  Err_OverVoltage     = 13, ///< Напряжение сети выше допустимого (см. Umах в @ref UPP_PUI_Params_t)
  Err_OverTemperature = 14, ///< Температура выше допустимой (плюс 85 °C)
  Err_UnderVoltage    = 15, ///< Напряжение сети ниже допустимого (см. Umin в @ref UPP_PUI_Params_t)
  Err_OverFrequency   = 22, ///< Частота сети выше допустимой
  Err_UnderFrequency  = 23, ///< Частота сети ниже допустимой
  
  /* Ошибки по обрывам фаз */
  Err_LossPhaseAll    = 16, ///< Обрыв трёх фаз (см. Imin в @ref UPP_PUI_Params_t)
  Err_LossPhaseA      = 17, ///< Обрыв фазы A (см. Imin в @ref UPP_PUI_Params_t)
  Err_LossPhaseB      = 18, ///< Обрыв фазы B (см. Imin в @ref UPP_PUI_Params_t)
  Err_LossPhaseC      = 19, ///< Обрыв фазы C (см. Imin в @ref UPP_PUI_Params_t)
    
  /* Другие ошибки */
  Err_LongStart       = 20, ///< Затянутый пуск (ток не спадает за установленное время) (см. Tdelay в @ref UPP_PUI_Params_t)
  Err_Interlace       = 21, ///< Неправильный порядок чередования фаз (см. Interlace в @ref UPP_PUI_Params_t)
} UPP_ErrorType_t;
  

/** 
  * @brief Структура данных от УПП передаваемых в ПУИ
  */
typedef struct {
  uint16_t Error;       /** @brief Текущая авария
                            @details В случае срабатывания защиты */
  
  uint16_t WorkMode;    /** @brief Режим работы
                            @details «Готовность» или «Работа» */
  
  uint16_t Voltage;     /** @brief Напряжение на входе УПП, Вольты */
  
  uint16_t Current;     /** @brief Ток на входе УПП, Амперы */
  
  uint16_t Frequency;   /** @brief Частота напряжения на входе УПП */
  
  uint16_t Temperature;    /** @brief Температура радиатора тиристоров, Градусы Цельсия */
} UPP_PUI_Values_t;

/** 
  * @brief Структура параметров УПП от ПУИ
  * @details Параметры по умолчанию приведены в @ref UPP_PARAMS_DEFAULT
  * @note Защиты №X приведены в @ref UPP_ErrorType_t
  */
typedef struct {
  uint16_t Iref;      /** @brief Уставка ограничения тока УПП
                          @details В диапазоне от 100 % до 500 % от Iн = 5 А 
                                   По умолчанию – @ref PUI_Iref_PERCENT_DEFAULT */
  
  uint16_t Tnt;       /** @brief Уставка времени нарастания заданного тока 
                          @details В диапазоне от 50 до 5000 мс. 
                                   По умолчанию – @ref PUI_Tnt_MS_DEFAULT */
  
  uint16_t Umin;      /** @brief Уставка защиты №15 от понижения напряжения входной сети 
                          @details В диапазоне от 5% до 99 % от Uн = 690 В. 
                                   По умолчанию – @ref PUI_Umin_PERCENT_DEFAULT */
  
  uint16_t Umax;      /** @brief Уставка защиты №13 от повышения напряжения входной сети 
                          @details В диапазоне от 100% до 120 % от Uн = 690 В. 
                                   По умолчанию – @ref PUI_Umax_PERCENT_DEFAULT */
  
  uint16_t Imax;      /** @brief Уставка защиты №12 по току 
                          @details В диапазоне от 5 % до 99 % от 50 А. 
                                   По умолчанию – @ref PUI_Imax_PERCENT_DEFAULT */
  
  uint16_t Imin;      /** @brief Уставка защит № 16 – №19 от обрыва фаз(ы) 
                          @details В диапазоне от 0 % до 40 % от Iн = 5 А. При задании нуля эти защиты отключаются. 
                                   По умолчанию – @ref PUI_Imin_PERCENT_DEFAULT */
  
  uint16_t TiMax;     /** @brief Выдержка времени на срабатывание защиты № 12 по току 
                          @details В диапазоне от 500 до 10000 мкс. 
                                   По умолчанию – @ref PUI_TiMax_US_DEFAULT */
  
  uint16_t Tdelay;    /** @brief Выдержка времени защиты № 20 от затянутого пуска 
                          @details В диапазоне от 5 до 60 с. 
                                   По умолчанию – @ref PUI_Tdelay_SECONDS_DEFAULT */
                          
  uint16_t Interlace; /** @brief Разрешение защиты № 21 от обратного порядка чередования фаз; 
                          @details 0 – нет защиты, 1 – есть защита. 
                                   По умолчанию – @ref PUI_Interlace_EN_DEFAULT */
} UPP_PUI_Params_t;


/** //UPP_HIGHLEVEL
  * @}
  */


/** 
  * @addtogroup UPP_INTERNAL_DEFS Defines for internal use
  * @ingroup    UPP_DEFS
  * @brief      Дефайны УПП которые используютяс исключительно внутри программы
  * @{
  */

// Проверка корректности структуры
#define assert_upp(_struct_) check_null_ptr_2(_struct_, (_struct_)->f.Initialized)


/* Дефайны для индексов */
/* Линейные напряжения */
#define U_AB    0
#define U_CA    1
#define U_BC    2
/* Токи фаз  */
#define I_C     0
#define I_A     1
#define I_B     2
/* Температуры  */
#define TEMP_1  0
#define TEMP_2  1

/* Перерасчеты в тики */
#define PM_SLOW_PERIOD_CNT      (PM_SLOW_PERIOD_US/PM_ADC_PERIOD_US)      ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define US_TO_SLOW_TICKS(_us_)  ((_us_)/PM_SLOW_PERIOD_US)                ///< Пересчитать мкс в тики медленных расчетов
#define MS_TO_SLOW_TICKS(_ms_)  US_TO_SLOW_TICKS((_ms_)*1000)             ///< Пересчитать мс в тики медленных расчетов

/* Перерасчеты в тики */
#define PM_F_SLOW_PERIOD_CNT    (MS_TO_SLOW_TICKS(PM_F_SLOW_PERIOD_MS))   ///< Период обновления частоты в тиках @ref PM_SLOW_PERIOD_CNT
  
#define SQRT2 1.4142135

/* Дефайны для "удобного" доступа к структурам */
#define PARAM_INTERNAL  MB_INTERNAL.param
#define PARAM_PUI       MB_DATA.HoldRegs.pui_params
#define ERR_PUI         errors.pui.err
#define ERR_PRIVATE     errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt
  
/* Enum'ы УПП */
/** 
  * @brief Состояния полуволны 
  */
typedef enum {
  UPP_WAVE_UNKNOWED = 0,
  UPP_WAVE_POSITIVE,
  UPP_WAVE_NEGATIVE
} UPP_HalfWave_t;
  
/** 
  * @brief Названия Фаз
  */
typedef enum {
  UPP_PHASE_A = 0,
  UPP_PHASE_B = 1,
  UPP_PHASE_C = 2,
  UPP_PHASE_UNKNOWN = 3
} UPP_Phase_t;

/** //UPP_INTERNAL_DEFS
  * @}
  */
#endif //_UPP_DEFS_H_


/** //UPP_DEFS
  * @}
  */
