
#ifndef _UKSI_CALC_RES_H
#define _UKSI_CALC_RES_H
#include "main.h"
#include "foster_student.h"  /* Добавить этот include */

#define FOSTER_ST

/**
  * @brief Коэфициенты канала АЦП для пересчета в единицы измерения
  */
typedef struct
{
  uint16_t  lZero;  ///< Нулевой уровень (в квантах АЦП)
  float     vMax;   ///< Максимальный уровень Единиц Измерения (в Вольтах/Амперах)
  uint16_t  lMax;   ///< Максимальный уровень АЦП (в квантах АЦП)
  uint16_t  lOffset;   ///< Максимальный уровень АЦП (в квантах АЦП)
}ADC_Coefs_t;

typedef struct
{  
  ADC_HandleTypeDef *hadc;
  
  uint16_t    Raw;
  float       Voltage;
  ADC_Coefs_t Coefs;
  
  FilterMedianInt_t mdn;
  FilterAverageInt_t avg; 
  FosterStudent foster;     /* Для проверки стабильности */
  uint8_t is_stable;        /* 0-стабильно, 1-нестабильно, 0xFF-ошибка */
}ADC_t;

HAL_StatusTypeDef ADC_ConfigCoef(ADC_t *adc, uint16_t levelZero, float valueMax, uint16_t levelMax, uint16_t lOffset);
HAL_StatusTypeDef ADC_ConfigFilter(ADC_t *adc, uint8_t median_size, uint32_t average_size);
float ADC_Calc(ADC_t *adc);



typedef struct
{
  ADC_t adc;  // АЦП
  
  float Voltage[100];
  
  float RMeasOhm; // Сопротивление резистора с которого снимается напряжение
  float RLimitOhm; // Сопротивление токоограничивающего резистора  
  float DCVoltage; // Нарпяжение подаваемое в изоляцию
  
  
    
  float IsoOhm; // Измеренное сопротивление изоляции в МОм
  float IsoMOhm; // Измеренное сопротивление изоляции Ом
  float IsoCurrentuA; // Ток утечки изоляции в мкА
  
  
}UKSI_Calc_t;

HAL_StatusTypeDef UKSI_Calc_Init(UKSI_Calc_t *calc, ADC_HandleTypeDef *hadc);
float UKSI_Calc_Isolation(UKSI_Calc_t *calc);

#endif //_UKSI_CALC_RES_H