/**
******************************************************************************
* @file angle_control.h
* @brief Модуль для формирования и отсчитывания угла открытия
******************************************************************************
*/
#ifndef _ANGLE_CONTROL_H_
#define _ANGLE_CONTROL_H_
#include "main.h"

/**
  * @brief Конфигурация алгоритма управления углом открытия
  */
typedef struct
{
  float AngleMin;     ///< Минимально возможный угол открытия
  float AngleMax;     ///< Максимально возможный угол открытия
}Angle_Config_t;

/**
  * @brief Структура для управления углом открытия
  */
typedef struct
{
  TIM_HandleTypeDef *htim;    ///< Указатель на таймер для расчета угла
  Angle_Config_t    Config;   ///< Конфигурации алгоритма расчета угла открытия тиристоров
  
  float             Iref;     ///< текущее задание тока в о.е. [0..1]
  float             Imeas;    ///< измеренное значение тока в о.е. [0..1]
  
  float             alpha;      ///< текущий угол открытия  в о.е. [0..1] от 180 градусов  
  float             alpha_real;    /*!< @brief Фактический отсчитываемый угол открытия в о.е. [0..1] от 180 градусов
  @details Этот угол отличается от @ref alpha дополнительными задержками и компенсациями*/
  float             alpha_tick; ///< текущий угол открытия  в тиках таймера
  
  arm_pid_instance_f32  pid;      ///< ПИД регулятор для управления углом
  FilterExp_t           refFilter; ///< Фильтр для плавного нарастания регулирования
  
  struct {
    unsigned Initialized    : 1;  ///< Структура инициализирована
    unsigned Running        : 3;  ///< Сколько каналов запущено сейчас
    unsigned RazgonDone     : 1;  ///< Флаг что идет разгон Iref
    unsigned CurrentLimited : 1;  ///< Флаг что ток ограничивается в данный момент
  } f; ///< Флаги
}Angle_Handle_t;


// ====== ИНИЦИАЛИЗАЦИЯ ==========
/* Инициализация Таймера для рассчета угла открытия. */
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle);
/* Инициализация ПИД регулятора. */
HAL_StatusTypeDef Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd, float alpha);

// ====== УПРАВЛЕНИЕ ==========
/* Управление углом через ПИД регулятор */
void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement, float Correction);
/* Выставление текущего угла открытия тиристоров. */
HAL_StatusTypeDef Angle_SetAlpha(Angle_Handle_t *hangle, float Angle, float Correction);
/* Установка угла открытия в таймер. */
HAL_StatusTypeDef Angle_Start(Angle_Handle_t *hangle, UPP_Phase_t Phase, float PeriodMs);

// ====== СБРОС ==========
/* Сброс угла открытия у таймера. */
HAL_StatusTypeDef Angle_Reset(Angle_Handle_t *hangle, UPP_Phase_t Phase);
/* Сброс ПИД регулятора. */
void Angle_PID_Reset(Angle_Handle_t *hangle);

// ====== СЕРВИС ==========
/* Инициализация углов открытия. */
HAL_StatusTypeDef Angle_SetRange(Angle_Handle_t *hangle, float AngleMin, float AngleMax);
/* Хендл таймера для рассчета угла открытия. */
UPP_Phase_t Angle_Handle(Angle_Handle_t *hangle);
#endif /* _ANGLE_CONTROL_H_ */
