// ============================================
// Файл: estimate.h
// ============================================
#ifndef ESTIMATE_H
#define ESTIMATE_H

typedef enum {
  ESTIMATE_TEST_IDLE = 0,
  ESTIMATE_TEST_RS,
  ESTIMATE_TEST_RR_L,
  ESTIMATE_TEST_LM,
  ESTIMATE_TEST_DONE
} Estimate_Test_t;

typedef struct {
  float Rs;   // сопротивление статора, Ом
  float Rr;   // сопротивление ротора, Ом
  float Lm;   // взаимная индуктивность, Гн
  float Lk;   // полная индуктивность рассеяния, Гн
  float Lls;  // индуктивность рассеяния статора, Гн
  float Llr;  // индуктивность рассеяния ротора, Гн
  float Zk;   // полное сопротивление КЗ, Ом
  float Rk;   // активное сопротивление КЗ, Ом
  float Xk;   // реактивное сопротивление КЗ, Ом
} Params_t;

/*
 * Состояние автомата для эксперимента по измерению Rs
 * Метод: разностный метод с двумя уровнями постоянного тока
 */
typedef struct {
  char step;          /* текущий шаг 0-5 */
  float timer;        /* таймер выдержки времени */
  float meas1, meas2; /* измеренные напряжения для I1 и I2, В */
  float val1, val2;   /* измеренные токи I1 и I2, А */
  float sum_v;        /* сумма напряжений для усреднения */
  float sum_i;        /* сумма токов для усреднения */
  int sample_cnt;     /* счетчик выборок для усреднения */
  int done;           /* флаг завершения эксперимента */
} RsState_t;


/*
 * Состояние автомата для эксперимента по измерению Rr и Lls, Llr
 * Метод: подача переменного тока по оси q, RMS измерения
 */
typedef struct {
  float timer;        /* таймер фазы синусоиды, с */
  float ramp_timer;   /* таймер нарастания амплитуды, с */
  float sum_p;        /* сумма активной мощности, Вт */
  float sum_vq2;      /* сумма квадратов напряжения Vq, В^2 */
  float sum_iq2;      /* сумма квадратов тока Iq, А^2 */
  int sample_count;   /* счетчик выборок */

  /* усреднение одного измерения на текущей частоте */
  float avg_Zk;       /* накопл. Zk для текущей частоты, Ом */
  float avg_Xk;       /* накопл. Xk для текущей частоты, Ом */
  float avg_Lk;       /* накопл. Lk для текущей частоты, Гн */
  float avg_Rk;       /* накопл. Rk для текущей частоты, Ом */
  int avg_count;      /* счетчик усреднений (RRL_AVG) на частоте */

  /* буфер результатов по частотам */
  int freq_idx;       /* индекс текущей частоты */
  float freq_Zk[5];   /* Zk(f), Ом */
  float freq_Rk[5];   /* Rk(f), Ом */
  float freq_Xk[5];   /* Xk(f), Ом */
  float freq_Lk[5];   /* Lk(f), Гн */
  int freq_ready;     /* сколько частот заполнено */

  int done;           /* флаг завершения эксперимента */
} RrlState_t;


/*
 * ��������� �������� ��� Lm
 * �����: ������ ����������� ����, �������������� ��� ������ � ���������� ��������
 */
typedef struct {
  char step;              /* ��� ��������: 0-�������., 1-������., 2-��������, 3-������ */
  float timer;            /* ������ �������� / ���������������, � */
  float prev_ed;          /* ���������� Ed = Vd - Rs*Id (��������) */
  float integral_psi;     /* ��������������� ?Ed�dt, �� */
  float sum_id;           /* ����� Id ��� ���������� �� ��������, � */
  int sample_cnt;         /* ����� ������� �� �������� */
  float avg_Lm;           /* ����������� ����� Lm ��� ���������� */
  int avg_count;          /* ������� �������� ��������� */
  int done;               /* ���� ���������� ������������ */
  int first_sample;       /* ������ ������� ����� ������ �������������� */
} LmState_t;



void estimate_init(void);
void estimate_reset(void);
void estimate_start(Estimate_Test_t start_test);
Estimate_Test_t estimate_get_step(void);
Params_t* estimate_get_params(void);

// ������ ������� ���������
void estimate_process(float vd, float vq, float id, float iq, float dt,
  float* vd_ref, float* vq_ref, float* freq_ref);

#endif