/**
******************************************************************************
* @file upp_main.h
* @brief Определения структур для работы УПП
******************************************************************************
* @details
******************************************************************************/

#ifndef _UPP_MAIN_H
#define _UPP_MAIN_H
  
#include "main.h" // общие библиотеки, конфигурации и вербальные имена из CubeMX
#include "power_monitor.h" // статистика сети и АЦП
#include "pwm_thyristors.h" // Управление тиристорами
#include "angle_control.h" // Управление углом открытия

#include "upp_status.h" // статус упп
#include "upp_params.h" // управление упп


typedef struct
{
  UPP_WorkModeType_t  workmode; ///< Режим УПП
  UPP_FuncCalls_t     *call;    ///< Вызов функций УПП
  
  PowerMonitor_t      pm;       ///< Мониторинг сети
  PWM_Handle_t        hpwm;     ///< Хендл ШИМ тиристоров
  Angle_Handle_t      hangle;   ///< Хендл отсчитывания угла открытия
  
  struct
  {
    UPP_PUI_Params_t  *params;  ///< Параметры от ПУИ
    UPP_PUI_Values_t  *values;  ///< Данные для ПУИ
  } PUI; ///< Общение с ПУИ
  
  
  UPP_Errors_t *errors;         ///< Ошибки УПП
  uint32_t            StartTick;
  
  struct
  {
    uint32_t slow_calc_prd_us;
    uint32_t slow_calc_us;
    uint32_t isr_adc_prd_us;
    uint32_t isr_adc_us;
    uint32_t isr_pwm_us;
    uint32_t isr_systick_us;
  }Timings;
}UPP_t;
extern UPP_t upp;


/* Инициализация УПП */
int UPP_App_Init(void);
/* Инициализация основного цикла УПП. */
int UPP_PreWhile(void);
/* Основной цикл УПП. */
int UPP_While(void);
/* Всякое что будет делатся каждую 1 мс. */
void UPP_Tick(void);

// Прерывания
void UPP_ADC_Handle(void);
void UPP_PWM_Handle(void);
void UPP_Angle_Handle(void);
#endif //_UPP_MAIN_H