/**
******************************************************************************
* @file upp_params.h
* @brief Модуль определябщий поведение УПП
******************************************************************************
* @details
******************************************************************************/

#ifndef _UPP_PARAMS_H
#define _UPP_PARAMS_H
#include "upp_defs.h"

#define u2f(_u16_, _coef_) ((float)_u16_/_coef_)

typedef struct
{
  unsigned set_default_pui:1;     ///< Выставить настройки ПУИ в дефолтные
  unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
  unsigned go:1;      ///< Запустить УПП
  unsigned stop:1;    ///< Остановка УПП (авария)
  
  
  unsigned reserved:11;
  unsigned reset_mcu:1;
}UPP_FuncCalls_t;


typedef struct
{
  uint16_t PhaseSequence;     ///< Последовательность фаз todo
  uint16_t PhaseNumber;       ///< [Количество]
  uint16_t U;                 ///< [В x 10]
  uint16_t U_deviation_plus;  ///< [Проценты x 100]
  uint16_t U_deviation_minus; ///< [Проценты x 100]
  uint16_t F;                 ///< [Гц x 100]
  uint16_t F_deviation_plus;  ///< [Проценты x 100]
  uint16_t F_deviation_minus; ///< [Проценты x 100]
  uint16_t I;                 ///< [Амперы x 10]
}UPP_ParamsNominal_t;

typedef struct
{
  uint16_t TemperatureWarn; ///< Предупредительный порог температуры [Градусы x 100]
  uint16_t TemperatureErr;  ///< Аварийный порог температуры [Градусы x 100]
}UPP_ParamsSetpoints_t; 

typedef struct
{
  
  struct
  {
    uint16_t rms_window_size; ///< Размер окна для RMS
    uint16_t rms_exp_alpha; ///< Постоянная времени для сглаживания RMS
  }pm;
  
  UPP_ParamsNominal_t nominal;
  UPP_ParamsSetpoints_t setpoints;
  
  /* Параметры АЦП */
  struct
  {
    uint16_t ADC_Max[4];        ///< Величина в единицах измерения при АЦП = 4095 [В или А x 10]
    uint16_t ADC_Zero[4];       ///< Кванты АЦП когда на входе ноль
  }adc;
  
  /* Параметры ШИМ */
  struct
  {
    uint16_t PhaseMask;       ///< Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
    uint16_t Frequency;       ///< Частота ШИМ для пачки импульсов на тиристоры [Герцы]
    uint16_t Duty;            ///< Скважность ШИМ для пачки импульсов на тиристоры [Проценты]
    uint16_t PulseNumber;     ///< Количесво импульсов в пачке [Количество]
  }pwm;
  
  /* Параметры Угла */
  struct
  {
    uint16_t Hysteresis;        ///< Гистерезис для определения перехода через ноль [Проценты x 100]
    uint16_t DebouneCouner;     ///< Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
  }zc;
  
  /* Параметры Угла */
  struct
  {
    uint16_t PulseLengthReserve;/*!<  @brief Сколько запаса закладывать на длительность пачки импульсов [Проценты] @ref __AngleSetLimit
                                      @details Пример: 100% - будет запас в одну пачку импульсов */
    uint16_t Angle_Max;         ///< Максимальный угол открытия тиристора [0..1 x 65535]
    uint16_t Angle_Min;         ///< Минимальный угол открытия тиристора [0..1 x 65535]
    uint16_t PID_Kp;            ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000]
    uint16_t PID_Ki;            ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
    uint16_t PID_Kd;            ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
  }angle;
  
  
  
}UPP_PrvtParams_t;

/* Контроль параметров УПП. */
void UPP_Params_Control(void);
/* Контроль параметров от ПУИ. */
void UPP_Params_ControlPUI(void);
/* Контроль внутренних параметров УПП. */
void UPP_Params_ControlInternal(void);
/* Контроль параметров УПП на корректные значения. */
void UPP_Params_Saturate(void);
/* Установка параметров на дефолтные значения */
void UPP_Params_SetDefault(int pui_default, int internal_default);

#endif //_UPP_PARAMS_H