/**
******************************************************************************
* @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 go:1;      ///< Запустить УПП
  unsigned stop:1;    ///< Остановка УПП (авария)
  
  unsigned set_default_pui:1;     ///< Выставить настройки ПУИ в дефолтные
  unsigned set_default_internal:1;///< Выставить внутренние настройки в дефолтные
  
  unsigned reserved:11;
  unsigned reset_mcu:1;
}UPP_FuncCalls_t;


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

typedef struct
{
}UPP_ParamsSetpoints_t; 

typedef struct
{
  UPP_ParamsNominal_t nominal;
  
  /* Параметры Температур */
  struct
  {
    uint16_t TemperatureWarn; ///< Адрес 1010: Предупредительный порог температуры [Градусы x 100]
    uint16_t TemperatureErr;  ///< Адрес 1011: Аварийный порог температуры [Градусы x 100]
    uint16_t reserved[8];
  }temp;
  
  /* Параметры АЦП */
  struct
  {
    uint16_t ADC_Max[4];        ///< Адрес 1020-1023: Величина в единицах измерения при АЦП = 4095 [В или А x 10]
    uint16_t ADC_Zero[4];       ///< Адрес 1024-1027: Кванты АЦП когда на входе ноль
    uint16_t Temp_Zero[2];      ///< Адрес 1028-1029: Кванты АЦП когда датчик не подключен
    uint16_t reserved[10];
  }adc;
  
  
  /* Параметры Мониторинга напряжения */
  struct
  {
    uint16_t lImaxAmp;        ///< Адрес 1040: Амплитудное значение максимально допустимого тока (рассчитывается само)
    uint16_t rms_window_size; ///< Адрес 1041: Размер окна для RMS
    uint16_t rms_exp_alpha;   ///< Адрес 1042: Постоянная времени для сглаживания RMS
    uint16_t reserved[7];
  }pm;
    
  /* Параметры ШИМ */
  struct
  {
    uint16_t PhaseMask;       ///< Адрес 1050: Битовяя маска на какие фазы подавать ШИМ: 0 бит - a, 1 бит - b, 2 бит - c
    uint16_t Frequency;       ///< Адрес 1051: Частота ШИМ для пачки импульсов на тиристоры [Герцы]
    uint16_t Duty;            ///< Адрес 1052: Скважность ШИМ для пачки импульсов на тиристоры [Проценты]
    uint16_t PulseLength;     ///< Адрес 1053: Количесво импульсов в пачке [Количество]
    uint16_t reserved[6];
  }pwm;
  
  /* Параметры Перехода через ноль */
  struct
  {
    uint16_t Hysteresis;        ///< Адрес 1060: Гистерезис для определения перехода через ноль [Проценты x 100]
    uint16_t DebouneCouner;     ///< Адрес 1061: Защита от дребезга: через сколько тактов снова начать фиксировать переход через ноль [Количество]
    uint16_t reserved[8];
  }zc;
  
  /* Параметры Угла */
  struct
  {
    uint16_t reserved0;         ///< Адрес 1070: Резерв
    uint16_t Angle_Max;         ///< Адрес 1071: Максимальный угол открытия тиристора [0..1 x 65535]
    uint16_t Angle_Min;         ///< Адрес 1072: Минимальный угол открытия тиристора [0..1 x 65535]
    uint16_t PID_Kp;            ///< Адрес 1073: Пропорциональный коэфициент ПИ регулятора угла [x 10000]
    uint16_t PID_Ki;            ///< Адрес 1074: Интегральный коэфициент ПИ регулятора угла [x 10000]
    uint16_t PID_Kd;            ///< Адрес 1075: Интегральный коэфициент ПИ регулятора угла [x 10000]
    uint16_t reserved[4];
  }angle;  
  
}UPP_PrvtParams_t;

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

#define MODBUS_NUMB_OF_USEROBJECTS    128   ///< Количество пользовательских объектов
/* Номинальные параметры (H1000-H1008) */
#define MODBUS_USEROBJECT_0_NAME     "Nom PhSeq;H1000;[]"
#define MODBUS_USEROBJECT_1_NAME     "Nom PhNum;H1001;[cnt]"
#define MODBUS_USEROBJECT_2_NAME     "Nom U;H1002;[Vx10]"
#define MODBUS_USEROBJECT_3_NAME     "Nom Udev+;H1003;[%x100]"
#define MODBUS_USEROBJECT_4_NAME     "Nom Udev-;H1004;[%x100]"
#define MODBUS_USEROBJECT_5_NAME     "Nom F;H1005;[Hzx100]"
#define MODBUS_USEROBJECT_6_NAME     "Nom Fdev+;H1006;[%x100]"
#define MODBUS_USEROBJECT_7_NAME     "Nom Fdev-;H1007;[%x100]"
#define MODBUS_USEROBJECT_8_NAME     "Nom I;H1008;[Ax10]"

/* Температурные параметры (H1010-H1011) */
#define MODBUS_USEROBJECT_10_NAME     "TempWarn;H1010;[Cx100]"
#define MODBUS_USEROBJECT_11_NAME     "TempErr;H1011;[Cx100]"

/* Параметры АЦП (H1020-H1027) */
#define MODBUS_USEROBJECT_20_NAME     "ADC Max Uba;H1020;[V/Ax10]"
#define MODBUS_USEROBJECT_21_NAME     "ADC Max Uac;H1021;[V/Ax10]"
#define MODBUS_USEROBJECT_22_NAME     "ADC Max Ic;H1022;[V/Ax10]"
#define MODBUS_USEROBJECT_23_NAME     "ADC Max Ia;H1023;[V/Ax10]"
#define MODBUS_USEROBJECT_24_NAME     "ADC Zero Uba;H1024;[Quants]"
#define MODBUS_USEROBJECT_25_NAME     "ADC Zero Uac;H1025;[Quants]"
#define MODBUS_USEROBJECT_26_NAME     "ADC Zero Ic;H1026;[Quants]"
#define MODBUS_USEROBJECT_27_NAME     "ADC Zero Ia;H1027;[Quants]"

/* Мониторинг питания (H1030-H1031) */
#define MODBUS_USEROBJECT_30_NAME     "RMS WindowSize;H1030;[]"
#define MODBUS_USEROBJECT_31_NAME     "RMS Alpha;H1031;[x10000]"

/* ШИМ параметры (H1040-H1043) */
#define MODBUS_USEROBJECT_40_NAME     "PWM Mask;H1040;[bit]"
#define MODBUS_USEROBJECT_41_NAME     "PWM Freq;H1041;[Hz]"
#define MODBUS_USEROBJECT_42_NAME     "PWM Duty;H1042;[%]"
#define MODBUS_USEROBJECT_43_NAME     "PWM Pulses;H1043;[cnt]"

/* Ноль-кросс (H1050-H1051) */
#define MODBUS_USEROBJECT_50_NAME     "ZC Hyst;H1050;[%x100]"
#define MODBUS_USEROBJECT_51_NAME     "ZC Debounce;H1051;[cnt]"

/* Угловые параметры (H1060-H1065) */
#define MODBUS_USEROBJECT_60_NAME     "Angle PulseRes;H1060;[%]"
#define MODBUS_USEROBJECT_61_NAME     "Angle Max;H1061;[x65535]"
#define MODBUS_USEROBJECT_62_NAME     "Angle Min;H1062;[x65535]"
#define MODBUS_USEROBJECT_63_NAME     "Angle PID_Kp;H1063;[x10000]"
#define MODBUS_USEROBJECT_64_NAME     "Angle PID_Ki;H1064;[x10000]"
#define MODBUS_USEROBJECT_65_NAME     "Angle PID_Kd;H1065;[x10000]"

/* Функциональные вызовы - если нужно (битовые поля в одном регистре) */
#define MODBUS_USEROBJECT2000_NAME     "FuncCalls;H2000;[bitmask]"

#endif //_UPP_PARAMS_H