// #include "project.h"
#include "adc_tools.h"
// #include "xp_project.h"
#include "IQmathLib.h"
#include "math.h"
#include "filter_v1.h"
#include "params.h"
// #include "params_protect.h"
#include "vector.h"
// #include "xp_adc.h"
// #include "TuneUpPlane.h" //Ìîðãàíèå ñâåòîäèîäîì
// #include "log_to_memory.h"
// #include "errors.h"

// #define COUNT_ARR_ADC_BUF 2
#define Shift_Filter 1  //2

#define BTR_ENABLED

#define R_ADC_DEFAULT     { 1180 ,1180 , 256,  256, 256, 256, 256, 1180, 1180, 256, 256, 256, 256, 256, 256, 256, 256, 256 }
#define  K_LEM_ADC_DEFAULT { 60000,60000,5000, 5000,5000,5000,5000,60000,60000,5000,5000,5000,5000,5000,5000,5000,5000,5000 }
//#define LOG_ACP_TO_BUF



#if (USE_INTERNAL_ADC==1)

#if(C_adc_number==1)
unsigned int const R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0,R_ADC_DEFAULT_INTERNAL };
unsigned int const K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0, K_LEM_ADC_DEFAULT_INTERNAL };
float const K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0, NORMA_ADC_DEFAULT_INTERNAL };
#endif
#if(C_adc_number==2)
unsigned int const R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0, R_ADC_DEFAULT_1,R_ADC_DEFAULT_INTERNAL };
unsigned int const K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0, K_LEM_ADC_DEFAULT_1, K_LEM_ADC_DEFAULT_INTERNAL };
float const K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0, NORMA_ADC_DEFAULT_1, NORMA_ADC_DEFAULT_INTERNAL };
#endif
#if(C_adc_number==3)
unsigned int const R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0, R_ADC_DEFAULT_1, R_ADC_DEFAULT_2,R_ADC_DEFAULT_INTERNAL };
unsigned int const K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0, K_LEM_ADC_DEFAULT_1, K_LEM_ADC_DEFAULT_2, K_LEM_ADC_DEFAULT_INTERNAL };
float const K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0, NORMA_ADC_DEFAULT_1, NORMA_ADC_DEFAULT_2, NORMA_ADC_DEFAULT_INTERNAL };
#endif

#else

#if(C_adc_number==1)
#pragma DATA_SECTION(R_ADC,".slow_vars")
unsigned int R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0 };
#pragma DATA_SECTION(K_LEM_ADC,".slow_vars")
unsigned int K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0 };
#pragma DATA_SECTION(K_NORMA_ADC,".slow_vars")
float K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0 };
#endif
#if(C_adc_number==2)
#pragma DATA_SECTION(R_ADC,".slow_vars")
unsigned int const R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0, R_ADC_DEFAULT_1 };
#pragma DATA_SECTION(K_LEM_ADC,".slow_vars")
unsigned int const K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0, K_LEM_ADC_DEFAULT_1 };
#pragma DATA_SECTION(K_NORMA_ADC,".slow_vars")
float K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0, NORMA_ADC_DEFAULT_1 };
#endif
#if(C_adc_number==3)
#pragma DATA_SECTION(R_ADC,".slow_vars")
unsigned int R_ADC[COUNT_ARR_ADC_BUF][16] = { R_ADC_DEFAULT_0, R_ADC_DEFAULT_1, R_ADC_DEFAULT_2 };
#pragma DATA_SECTION(K_LEM_ADC,".slow_vars")
unsigned int K_LEM_ADC[COUNT_ARR_ADC_BUF][16] = { K_LEM_ADC_DEFAULT_0, K_LEM_ADC_DEFAULT_1, K_LEM_ADC_DEFAULT_2 };
#pragma DATA_SECTION(K_NORMA_ADC,".slow_vars")
float K_NORMA_ADC[COUNT_ARR_ADC_BUF][16] = { NORMA_ADC_DEFAULT_0, NORMA_ADC_DEFAULT_1, NORMA_ADC_DEFAULT_2 };
#endif

#endif

#pragma DATA_SECTION(ADC_f,".fast_vars");
int ADC_f[COUNT_ARR_ADC_BUF][16];

#pragma DATA_SECTION(ADC_fast,".fast_vars");
int ADC_fast[COUNT_ARR_ADC_BUF][16][COUNT_ARR_ADC_BUF_FAST_POINT];


#pragma DATA_SECTION(ADC_sf,".fast_vars");
int ADC_sf[COUNT_ARR_ADC_BUF][16];

#pragma DATA_SECTION(analog,".fast_vars");
ANALOG_VALUE	analog = ANALOG_VALUE_DEFAULT;

#pragma DATA_SECTION(filter,".fast_vars");
ANALOG_VALUE	filter = ANALOG_VALUE_DEFAULT;

#pragma DATA_SECTION(analog_zero,".fast_vars");
ANALOG_VALUE    analog_zero = ANALOG_VALUE_DEFAULT;



unsigned int const level_err_ADC_PLUS[16] = level_err_ADC_PLUS_default;
unsigned int const level_err_ADC_MINUS[16] = level_err_ADC_MINUS_default;


#pragma DATA_SECTION(err_adc_protect,".fast_vars");
#pragma DATA_SECTION(mask_err_adc_protect,".fast_vars");
ERR_ADC_PROTECT err_adc_protect[COUNT_ARR_ADC_BUF], mask_err_adc_protect[COUNT_ARR_ADC_BUF];



_iq koef_Im_filter = 0;
_iq koef_Power_filter = 0;
_iq koef_Power_filter2 = 0;

#pragma DATA_SECTION(k_norm_ADC,".slow_vars")
_iq19 k_norm_ADC[COUNT_ARR_ADC_BUF][16];

#pragma DATA_SECTION(iq19_zero_ADC,".fast_vars");
_iq19 iq19_zero_ADC[COUNT_ARR_ADC_BUF][16];


#pragma DATA_SECTION(zero_ADC,".slow_vars")
int zero_ADC[COUNT_ARR_ADC_BUF][16];


#pragma DATA_SECTION(iq19_k_norm_ADC,".fast_vars");
_iq19 iq19_k_norm_ADC[COUNT_ARR_ADC_BUF][16];

#pragma DATA_SECTION(iq_norm_ADC,".fast_vars");
_iq iq_norm_ADC[COUNT_ARR_ADC_BUF][16];

#pragma DATA_SECTION(iq_norm_ADC_sf,".fast_vars");
_iq iq_norm_ADC_sf[COUNT_ARR_ADC_BUF][16];


#pragma DATA_SECTION(koef_Uzpt_long_filter,".fast_vars");
_iq koef_Uzpt_long_filter = 0;

#pragma DATA_SECTION(koef_Uzpt_fast_filter,".fast_vars");
_iq koef_Uzpt_fast_filter = 0;

#pragma DATA_SECTION(koef_Uin_filter,".fast_vars");
_iq koef_Uin_filter = 0;


ANALOG_RAW_DATA rawData = {0};




void calc_norm_ADC(void);
void analog_values_calc(void);
_iq im_calc( _iq ia, _iq ib, _iq ic);

#define Shift_Filter 1  //2
void read_adc()
{
    static unsigned int adr_adc = 0;
    if(project.adc[0].status == component_Ready)
    {
        project.adc->read_pbus(&project.adc[0]);
        ADC_f[0][0] = project.adc[0].read.pbus.adc_value[0];
        ADC_f[0][1] = project.adc[0].read.pbus.adc_value[1];
        ADC_f[0][2] = project.adc[0].read.pbus.adc_value[2];
        ADC_f[0][3] = project.adc[0].read.pbus.adc_value[3];
        ADC_f[0][4] = project.adc[0].read.pbus.adc_value[4];
        ADC_f[0][5] = project.adc[0].read.pbus.adc_value[5];
        ADC_f[0][6] = project.adc[0].read.pbus.adc_value[6];
        ADC_f[0][7] = project.adc[0].read.pbus.adc_value[7];
        ADC_f[0][8] = project.adc[0].read.pbus.adc_value[8];
        ADC_f[0][9] = project.adc[0].read.pbus.adc_value[9];
        ADC_f[0][10] = project.adc[0].read.pbus.adc_value[10];
        ADC_f[0][11] = project.adc[0].read.pbus.adc_value[11];
        ADC_f[0][12] = project.adc[0].read.pbus.adc_value[12];
        ADC_f[0][13] = project.adc[0].read.pbus.adc_value[13];
        ADC_f[0][14] = project.adc[0].read.pbus.adc_value[14];
        ADC_f[0][15] = project.adc[0].read.pbus.adc_value[15];


        ADC_sf[0][0] += (ADC_f[0][0] - ADC_sf[0][0]) >> Shift_Filter;
        ADC_sf[0][1] += (ADC_f[0][1] - ADC_sf[0][1]) >> Shift_Filter;
        ADC_sf[0][2] += (ADC_f[0][2] - ADC_sf[0][2]) >> Shift_Filter;
        ADC_sf[0][3] += (ADC_f[0][3] - ADC_sf[0][3]) >> Shift_Filter;
        ADC_sf[0][4] += (ADC_f[0][4] - ADC_sf[0][4]) >> Shift_Filter;
        ADC_sf[0][5] += (ADC_f[0][5] - ADC_sf[0][5]) >> Shift_Filter;
        ADC_sf[0][6] += (ADC_f[0][6] - ADC_sf[0][6]) >> Shift_Filter;

        ADC_sf[0][7] += (ADC_f[0][7] - ADC_sf[0][7]) >> Shift_Filter;
        ADC_sf[0][8] += (ADC_f[0][8] - ADC_sf[0][8]) >> Shift_Filter;
        ADC_sf[0][9] += (ADC_f[0][9] - ADC_sf[0][9]) >> Shift_Filter;
        ADC_sf[0][10] += (ADC_f[0][10] - ADC_sf[0][10]) >> Shift_Filter;
        ADC_sf[0][11] += (ADC_f[0][11] - ADC_sf[0][11]) >> Shift_Filter;
        ADC_sf[0][12] += (ADC_f[0][12] - ADC_sf[0][12]) >> Shift_Filter;
        ADC_sf[0][13] += (ADC_f[0][13] - ADC_sf[0][13]) >> Shift_Filter;
        ADC_sf[0][14] += (ADC_f[0][14] - ADC_sf[0][14]) >> Shift_Filter;
        ADC_sf[0][15] += (ADC_f[0][15] - ADC_sf[0][15]) >> Shift_Filter;
    }
    if(project.adc[1].status == component_Ready)
    {
        project.adc->read_pbus(&project.adc[1]);
        //          adr_adc = project.adc[1].adr_pbus.adr_table[0];
        ADC_f[1][0] = project.adc[1].read.pbus.adc_value[0];
        ADC_f[1][1] = project.adc[1].read.pbus.adc_value[1];
        ADC_f[1][2] = project.adc[1].read.pbus.adc_value[2];
        ADC_f[1][3] = project.adc[1].read.pbus.adc_value[3];

        ADC_sf[1][0] += (ADC_f[1][0] - ADC_sf[1][0]) >> Shift_Filter;
        ADC_sf[1][1] += (ADC_f[1][1] - ADC_sf[1][1]) >> Shift_Filter;
        ADC_sf[1][2] += (ADC_f[1][2] - ADC_sf[1][2]) >> Shift_Filter;
        ADC_sf[1][3] += (ADC_f[1][3] - ADC_sf[1][3]) >> Shift_Filter;
        /* Not used
        ADC_sf[1][4] += (ADC_f[1][4] - ADC_sf[1][4]) >> Shift_Filter;
        ADC_sf[1][5] += (ADC_f[1][5] - ADC_sf[1][5]) >> Shift_Filter;
        ADC_sf[1][6] += (ADC_f[1][6] - ADC_sf[1][6]) >> Shift_Filter;
        ADC_sf[1][7] += (ADC_f[1][7] - ADC_sf[1][7]) >> Shift_Filter;
        ADC_sf[1][8] += (ADC_f[1][8] - ADC_sf[1][8]) >> Shift_Filter;
        ADC_sf[1][9] += (ADC_f[1][9] - ADC_sf[1][9]) >> Shift_Filter;
        ADC_sf[1][10] += (ADC_f[1][10] - ADC_sf[1][10]) >> Shift_Filter;
        ADC_sf[1][11] += (ADC_f[1][11] - ADC_sf[1][11]) >> Shift_Filter;
        ADC_sf[1][12] += (ADC_f[1][12] - ADC_sf[1][12]) >> Shift_Filter;
        ADC_sf[1][13] += (ADC_f[1][13] - ADC_sf[1][13]) >> Shift_Filter;
        ADC_sf[1][14] += (ADC_f[1][14] - ADC_sf[1][14]) >> Shift_Filter;
        ADC_sf[1][15] += (ADC_f[1][15] - ADC_sf[1][15]) >> Shift_Filter;
        */
    }
}

void acp_Handler(void)
{
	 //read_adc();
	calc_norm_ADC_0(0);
	//analog_values_calc();
	// Read_Fast_Errors();
}

//#define COUNT_DETECT_ZERO 500



void init_Adc_Variables(void)
{
    unsigned int k, i, j;
    int* panalog, * pfilter;
    volatile float k_f;


    for (i = 0; i < COUNT_ARR_ADC_BUF; i++)
    {
        for (k = 0; k < 16; k++)
        {
            ADC_f[i][k] = 0;
            ADC_sf[i][k] = 0;

            for (j = 0; j < COUNT_ARR_ADC_BUF_FAST_POINT; j++)
                ADC_fast[i][k][j] = 0;

            k_f = K_LEM_ADC[i][k] * 2.5 / R_ADC[i][k] / 4096.0;
            k_norm_ADC[i][k] = _IQ19(k_f);

            k_f = K_LEM_ADC[i][k] * 250.0 / R_ADC[i][k] / K_NORMA_ADC[i][k] / 4096.0;
            iq19_k_norm_ADC[i][k] = _IQ19(k_f);

            zero_ADC[i][k] = DEFAULT_ZERO_ADC;//1835;

            iq19_zero_ADC[i][k] = _IQ19(zero_ADC[i][k]);   //_IQ19(2030);//_IQ19(1770);

        }
    }


    panalog = (int*)&analog;
    pfilter = (int*)&filter;
    for (k = 0; k < sizeof(ANALOG_VALUE) / sizeof(int); k++)
    {

        *(panalog + k) = 0;
        *(pfilter + k) = 0;
    }


    for (i = 0; i < COUNT_ARR_ADC_BUF; i++)
    {
        if (project.adc[i].status >= component_Ready)
            detect_zero_analog(i);
    }

    //	  zero_ADC[1][2] = 2010;//1976; // uab
    //	  zero_ADC[1][3] = 2010;//1989; // ubc
    //	  zero_ADC[1][4] = 2010;//1994; // uca


    zero_ADC[0][0] = zero_ADC[0][2];//2042;//1992;//1835; //uzpt
    zero_ADC[0][1] = zero_ADC[0][2];//2042;//1992;//1835; //uzpt



#if (COUNT_ARR_ADC_BUF>1)
    zero_ADC[1][1] = zero_ADC[1][15];
    zero_ADC[1][2] = zero_ADC[1][15];
    zero_ADC[1][3] = zero_ADC[1][15];
    zero_ADC[1][4] = zero_ADC[1][15];
    zero_ADC[1][5] = zero_ADC[1][15];
    zero_ADC[1][6] = zero_ADC[1][15];
    zero_ADC[1][7] = zero_ADC[1][15];
    zero_ADC[1][8] = zero_ADC[1][15];
    zero_ADC[1][9] = zero_ADC[1][15];
    zero_ADC[1][10] = zero_ADC[1][15];
    zero_ADC[1][11] = zero_ADC[1][15];
    zero_ADC[1][12] = zero_ADC[1][15];
    zero_ADC[1][13] = zero_ADC[1][15];
    zero_ADC[1][14] = zero_ADC[1][15];
#endif


    for (k = 0; k < 16; k++)
    {
        for (i = 0; i < COUNT_ARR_ADC_BUF; i++)
        {
            if ((zero_ADC[i][k] > 2200) || (zero_ADC[i][k] < 1900))
                zero_ADC[i][k] = DEFAULT_ZERO_ADC;
        }
    }



    for (k = 0; k < 16; k++)
    {
        for (i = 0; i < COUNT_ARR_ADC_BUF; i++)
        {
            iq19_zero_ADC[i][k] = _IQ19(zero_ADC[i][k]);//_IQ19(1770);
        }
    }


    //	koef_allADC_filter = _IQ19(0.00002/0.00003185);//koef_ADC_filter[0];
    //	koef_zero_ADC_filter=_IQ19(0.00002/0.0003185);
    koef_Uzpt_long_filter = _IQ(0.001 / 0.016666);
    koef_Uzpt_fast_filter = _IQ(0.001 / 0.002); //_IQ(0.001/0.00131);
    koef_Uin_filter = _IQ(0.001 / 0.00931);

    //	koef_Im_filter = _IQ(0.001/0.006);
    koef_Im_filter = _IQ(0.001 / 0.065);
    koef_Power_filter = _IQ(0.001 / 0.065);
    koef_Power_filter2 = _IQ(0.001 / 0.2);

    //	koef_Iabc_filter = _IQ(0.001/0.006);


    filter.iqU_1_fast = 0;
    filter.iqU_1_long = 0;

    filter.iqU_2_fast = 0;
    filter.iqU_2_long = 0;

    filter.iqUin_m1 = 0;
    filter.iqUin_m2 = 0;


    //    filter.iqU_3_fast = 0;
    //    filter.iqU_4_fast = 0;

    //	filter.iqU_1_long = 0;
    //	filter.iqU_2_long = 0;
    //	filter.iqU_3_long = 0;
    //	filter.iqU_4_long = 0;

    //	filter.iqIin_1 = 0;
    //	filter.iqIin_2 = 0;


    filter.iqIm_1 = 0;
    filter.iqIm_2 = 0;
    //	filter.iqUin_m1 = 0;
    //	filter.iqUin_m2 = 0;


    for (i = 0; i < COUNT_ARR_ADC_BUF; i++)
    {
        mask_err_adc_protect[i].plus.all = 0;
        mask_err_adc_protect[i].minus.all = 0x0;

        err_adc_protect[i].plus.all = 0;
        err_adc_protect[i].minus.all = 0x0;
    }

#if (USE_INTERNAL_ADC==1)
    Init_Internal_Adc();
#endif


}

inline _iq norma_adc(int plane, int chan, int n_norm)
{
	// return _IQ19toIQ(_IQ19mpy((iq19_zero_ADC[n_norm] - ((long)ADC_sf[plane][chan]<<19) ),iq19_k_norm_ADC[n_norm]));
	// return _IQ19toIQ(_IQ19mpy((((long)ADC_sf[plane][chan]<<19) - iq19_zero_ADC[n_norm]),iq19_k_norm_ADC[n_norm]));
	return _IQ19toIQ(_IQ19mpy((((long)ADC_sf[plane][chan]<<19)),iq19_k_norm_ADC[n_norm]));
}
////////////////////////////////////////////////////////////////////

#pragma CODE_SECTION(norma_adc_nc,".fast_run");
#define SDVIG_K_FILTER_S 2 //1//(27.08.2009) //3
void norma_adc_nc(int nc)
{
	int k;
	//  int bb;

	for (k = 0; k < 16; k++)
	{

		ADC_f[nc][k] = project.adc[nc].read.pbus.adc_value[k];
		ADC_sf[nc][k] += (((int)(ADC_f[nc][k] - ADC_sf[nc][k])) >> SDVIG_K_FILTER_S);
		iq_norm_ADC[nc][k] = _IQ19toIQ(_IQ19mpy((-iq19_zero_ADC[nc][k] + ((long)ADC_f[nc][k] << 19)), iq19_k_norm_ADC[nc][k]));
	}
}

////////////////////////////////////////////////////////////////////
#pragma CODE_SECTION(calc_norm_ADC_0,".fast_run");
void calc_norm_ADC_0(int run_norma)
{
	_iq a1, a2, a3;

#if (USE_ADC_0)

	if (run_norma)
		norma_adc_nc(0);

#if (_FLOOR6)
	analog.iqU_1 = iq_norm_ADC[0][0] - analog_zero.iqU_1 + analog.iqU_1_imit;
	analog.iqU_2 = iq_norm_ADC[0][1] - analog_zero.iqU_2 + analog.iqU_1_imit;
#else
	analog.iqU_1 = iq_norm_ADC[0][0] - analog_zero.iqU_1;
	analog.iqU_2 = iq_norm_ADC[0][1] - analog_zero.iqU_2;
#endif
	analog.iqIu_1 = iq_norm_ADC[0][2];
	analog.iqIv_1 = iq_norm_ADC[0][3];
	analog.iqIw_1 = iq_norm_ADC[0][4];

	analog.iqIu_2 = iq_norm_ADC[0][5];
	analog.iqIv_2 = iq_norm_ADC[0][6];
	analog.iqIw_2 = iq_norm_ADC[0][7];

	analog.iqIin_1 = -iq_norm_ADC[0][9]; // датчик перевернут
	analog.iqIin_2 = -iq_norm_ADC[0][9]; // датчик перевернут

	analog.iqUin_A1B1 = iq_norm_ADC[0][10];

	// два варианта подключения датчиков 23550.1 более правильный - по схеме
	// 23550.1

	analog.iqUin_B1C1 = iq_norm_ADC[0][11]; // 23550.1
	analog.iqUin_A2B2 = iq_norm_ADC[0][12]; // 23550.1

// 23550.3 bs1 bs2

//    analog.iqUin_B1C1 = iq_norm_ADC[0][12]; // 23550.3
//    analog.iqUin_A2B2 = iq_norm_ADC[0][11]; // 23550.3
//
	analog.iqUin_B2C2 = iq_norm_ADC[0][13];

	analog.iqIbreak_1 = iq_norm_ADC[0][14];
	analog.iqIbreak_2 = iq_norm_ADC[0][15];

#else
	analog.iqU_1 = analog.iqIu_1 = analog.iqIu_2 = analog.iqIv_1 = analog.iqIv_2 =
		analog.iqIw_1 = analog.iqIw_2 = analog.iqIin_1 = analog.iqIin_2 = analog.iqUin_A1B1 =
		analog.iqUin_B1C1 = analog.iqUin_A2B2 = analog.iqUin_B2C2 = analog.iqIbreak_1 = analog.iqIbreak_2
		= 0;
#endif

	analog.iqUin_C1A1 = -(analog.iqUin_A1B1 + analog.iqUin_B1C1);
	analog.iqUin_C2A2 = -(analog.iqUin_A2B2 + analog.iqUin_B2C2);



	filter.iqU_1_long = exp_regul_iq(koef_Uzpt_long_filter, filter.iqU_1_long, analog.iqU_1);
	filter.iqU_2_long = exp_regul_iq(koef_Uzpt_long_filter, filter.iqU_2_long, analog.iqU_2);


	//    analog.iqU_1_fast = filter_U1_3point(analog.iqU_1_fast);
	filter.iqU_1_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqU_1_fast, analog.iqU_1);
	filter.iqU_2_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqU_2_fast, analog.iqU_2);


	//    filter.iqUzpt_2_2_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqUzpt_2_2_fast, analog.iqUzpt_2_2);



	//15


	analog.iqIm_1 = im_calc(analog.iqIu_1, analog.iqIv_1, analog.iqIw_1);
	analog.iqIm_2 = im_calc(analog.iqIu_2, analog.iqIv_2, analog.iqIw_2);

	analog.iqIu = analog.iqIu_1 + analog.iqIu_2;
	analog.iqIv = analog.iqIv_1 + analog.iqIv_2;
	analog.iqIw = analog.iqIw_1 + analog.iqIw_2;

	analog.iqIm = im_calc(analog.iqIu, analog.iqIv, analog.iqIw);


	analog.iqIin_sum = analog.iqIin_1 + analog.iqIin_2;

	//   analog.iqIm_3 = im_calc(analog.iqIa1_1_fir_n+analog.iqIa2_1_fir_n, analog.iqIb1_1_fir_n+analog.iqIb2_1_fir_n, analog.iqIc1_1_fir_n+analog.iqIc2_1_fir_n);

	analog.iqUin_m1 = im_calc(analog.iqUin_A1B1, analog.iqUin_B1C1, analog.iqUin_C1A1);
	analog.iqUin_m2 = im_calc(analog.iqUin_A2B2, analog.iqUin_B2C2, analog.iqUin_C2A2);

	//   analog.iqUin_m2 = im_calc(analog.UinA2, analog.UinB2, analog.UinC2);

	filter.iqUin_m1 = exp_regul_iq(koef_Uin_filter, filter.iqUin_m1, analog.iqUin_m1);
	filter.iqUin_m2 = exp_regul_iq(koef_Uin_filter, filter.iqUin_m2, analog.iqUin_m2);



	//   i_led1_on_off(0);
	//   i_led1_on_off(1);

	//1

	filter.iqIm_1 = exp_regul_iq(koef_Im_filter, filter.iqIm_1, analog.iqIm_1);
	filter.iqIm_2 = exp_regul_iq(koef_Im_filter, filter.iqIm_2, analog.iqIm_2);
	filter.iqIm = exp_regul_iq(koef_Im_filter, filter.iqIm, analog.iqIm);

	filter.iqIin_sum = exp_regul_iq(koef_Im_filter, filter.iqIin_sum, analog.iqIin_sum);

	//3
	//   filter_batter2_Iin.InpVarCurr = (analog.iqIin_1)-ZERO_I_IN;
	 //  filter_batter2_Iin.calc(&filter_batter2_Iin);

	//   filter.iqIin = _IQmpy(filter_batter2_Iin.Out,_IQ_09);


	filter.iqIin_1 = exp_regul_iq(koef_Im_filter, filter.iqIin_1, analog.iqIin_1);
	filter.iqIin_2 = exp_regul_iq(koef_Im_filter, filter.iqIin_2, analog.iqIin_2);

	a1 = analog.iqU_1 + analog.iqU_2;
	a2 = analog.iqIin_1;
	a3 = _IQmpy(a1, a2);
	analog.PowerScalar = a3;
	//   filter.Power = analog.iqU_1+analog.iqU_2;
	filter.PowerScalar = exp_regul_iq(koef_Power_filter, filter.PowerScalar, analog.PowerScalar);
	filter.PowerScalarFilter2 = exp_regul_iq(koef_Power_filter2, filter.PowerScalarFilter2, filter.PowerScalar);

}
////////////////////////////////////////////////////////////////////
void analog_values_calc(void)
{

//#if (USE_ADC_0)
//
//#if (_FLOOR6)
//	analog.iqU_1 = iq_norm_ADC[0][0] - analog_zero.iqU_1 + analog.iqU_1_imit;
//	analog.iqU_2 = iq_norm_ADC[0][1] - analog_zero.iqU_2 + analog.iqU_1_imit;
//#else
//	analog.iqU_1 = iq_norm_ADC[0][0] - analog_zero.iqU_1;
//	analog.iqU_2 = iq_norm_ADC[0][1] - analog_zero.iqU_2;
//#endif
//	analog.iqIu_1 = iq_norm_ADC[0][2];
//	analog.iqIv_1 = iq_norm_ADC[0][3];
//	analog.iqIw_1 = iq_norm_ADC[0][4];
//
//	analog.iqIu_2 = iq_norm_ADC[0][5];
//	analog.iqIv_2 = iq_norm_ADC[0][6];
//	analog.iqIw_2 = iq_norm_ADC[0][7];
//
//	analog.iqIin_1 = -iq_norm_ADC[0][9]; // датчик перевернут
//	analog.iqIin_2 = -iq_norm_ADC[0][9]; // датчик перевернут
//
//	analog.iqUin_A1B1 = iq_norm_ADC[0][10];
//
//	// два варианта подключения датчиков 23550.1 более правильный - по схеме
//	// 23550.1
//
//	analog.iqUin_B1C1 = iq_norm_ADC[0][11]; // 23550.1
//	analog.iqUin_A2B2 = iq_norm_ADC[0][12]; // 23550.1
//
//// 23550.3 bs1 bs2
//
////    analog.iqUin_B1C1 = iq_norm_ADC[0][12]; // 23550.3
////    analog.iqUin_A2B2 = iq_norm_ADC[0][11]; // 23550.3
////
//	analog.iqUin_B2C2 = iq_norm_ADC[0][13];
//
//	analog.iqIbreak_1 = iq_norm_ADC[0][14];
//	analog.iqIbreak_2 = iq_norm_ADC[0][15];
//
//	#else
//	analog.iqU_1 = analog.iqIu_1 = analog.iqIu_2 = analog.iqIv_1 = analog.iqIv_2 =
//	analog.iqIw_1 = analog.iqIw_2 = analog.iqIin_1 = analog.iqIin_2 = analog.iqUin_A1B1 =
//	analog.iqUin_B1C1 = analog.iqUin_A2B2 = analog.iqUin_B2C2 = analog.iqIbreak_1 = analog.iqIbreak_2
//	= 0;
//	#endif
//
//	analog.iqUin_C1A1 = -(analog.iqUin_A1B1 + analog.iqUin_B1C1);
//	analog.iqUin_C2A2 = -(analog.iqUin_A2B2 + analog.iqUin_B2C2);
//
//
//
//	filter.iqU_1_long = exp_regul_iq(koef_Uzpt_long_filter, filter.iqU_1_long, analog.iqU_1);
//	filter.iqU_2_long = exp_regul_iq(koef_Uzpt_long_filter, filter.iqU_2_long, analog.iqU_2);
//
//
//	//    analog.iqU_1_fast = filter_U1_3point(analog.iqU_1_fast);
//	filter.iqU_1_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqU_1_fast, analog.iqU_1);
//	filter.iqU_2_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqU_2_fast, analog.iqU_2);
//
//
//	//    filter.iqUzpt_2_2_fast = exp_regul_iq(koef_Uzpt_fast_filter, filter.iqUzpt_2_2_fast, analog.iqUzpt_2_2);
//
//
//
//	//15
//
//
//	analog.iqIm_1 = im_calc(analog.iqIu_1, analog.iqIv_1, analog.iqIw_1);
//	analog.iqIm_2 = im_calc(analog.iqIu_2, analog.iqIv_2, analog.iqIw_2);
//
//	analog.iqIu = analog.iqIu_1 + analog.iqIu_2;
//	analog.iqIv = analog.iqIv_1 + analog.iqIv_2;
//	analog.iqIw = analog.iqIw_1 + analog.iqIw_2;
//
//	analog.iqIm = im_calc(analog.iqIu, analog.iqIv, analog.iqIw);
//
//
//	analog.iqIin_sum = analog.iqIin_1 + analog.iqIin_2;
//
//	//   analog.iqIm_3 = im_calc(analog.iqIa1_1_fir_n+analog.iqIa2_1_fir_n, analog.iqIb1_1_fir_n+analog.iqIb2_1_fir_n, analog.iqIc1_1_fir_n+analog.iqIc2_1_fir_n);
//
//	analog.iqUin_m1 = im_calc(analog.iqUin_A1B1, analog.iqUin_B1C1, analog.iqUin_C1A1);
//	analog.iqUin_m2 = im_calc(analog.iqUin_A2B2, analog.iqUin_B2C2, analog.iqUin_C2A2);
//
//	//   analog.iqUin_m2 = im_calc(analog.UinA2, analog.UinB2, analog.UinC2);
//
//	filter.iqUin_m1 = exp_regul_iq(koef_Uin_filter, filter.iqUin_m1, analog.iqUin_m1);
//	filter.iqUin_m2 = exp_regul_iq(koef_Uin_filter, filter.iqUin_m2, analog.iqUin_m2);
//
//
//
//	//   i_led1_on_off(0);
//	//   i_led1_on_off(1);
//
//	//1
//
//	filter.iqIm_1 = exp_regul_iq(koef_Im_filter, filter.iqIm_1, analog.iqIm_1);
//	filter.iqIm_2 = exp_regul_iq(koef_Im_filter, filter.iqIm_2, analog.iqIm_2);
//	filter.iqIm = exp_regul_iq(koef_Im_filter, filter.iqIm, analog.iqIm);
//
//	filter.iqIin_sum = exp_regul_iq(koef_Im_filter, filter.iqIin_sum, analog.iqIin_sum);
//
//	//3
//	//   filter_batter2_Iin.InpVarCurr = (analog.iqIin_1)-ZERO_I_IN;
//	 //  filter_batter2_Iin.calc(&filter_batter2_Iin);
//
//	//   filter.iqIin = _IQmpy(filter_batter2_Iin.Out,_IQ_09);
//
//
//	filter.iqIin_1 = exp_regul_iq(koef_Im_filter, filter.iqIin_1, analog.iqIin_1);
//	filter.iqIin_2 = exp_regul_iq(koef_Im_filter, filter.iqIin_2, analog.iqIin_2);
//
//	a1 = analog.iqU_1 + analog.iqU_2;
//	a2 = analog.iqIin_1;
//	a3 = _IQmpy(a1, a2);
//	analog.PowerScalar = a3;
//	//   filter.Power = analog.iqU_1+analog.iqU_2;
//	filter.PowerScalar = exp_regul_iq(koef_Power_filter, filter.PowerScalar, analog.PowerScalar);
//	filter.PowerScalarFilter2 = exp_regul_iq(koef_Power_filter2, filter.PowerScalarFilter2, filter.PowerScalar);


}

#define CONST_IQ_11PI6 96629827  //11Pi/6
#define CONST_IQ_PI6  8784529 // Pi/6


/********************************************************************/
/* Определение нулy показаний АЦП */
/********************************************************************/
#pragma DATA_SECTION(acp_zero,".slow_vars")
_iq19 acp_zero[16];
#pragma DATA_SECTION(acp_summ,".slow_vars")
long acp_summ[16];
void detect_zero_analog(int nc)
{
    long i, k;


    _iq koef_zero_ADC_filter = _IQ19(0.00002 / 0.0003185);


    for (k = 0; k < 16; k++)
    {
        acp_zero[k] = 0;
        acp_summ[k] = 0;
    }



    for (i = 0; i < COUNT_DETECT_ZERO; i++)
    {
        //      norma_all_adc();
        norma_adc_nc(nc);
        //     norma_adc_nc(1);


        for (k = 0; k < 16; k++)
        {
            acp_zero[k] = exp_regul_iq(koef_zero_ADC_filter, acp_zero[k], ((long)ADC_f[nc][k] << 19));
            acp_summ[k] = acp_summ[k] + ADC_f[nc][k];
        }



        pause_1000(1000);
    }

    // 16 и 7  канал пропускаем т.к. это канал напрyжениy                         
    for (k = 0; k < 16; k++)
    {

        //        if ((k==15))
        //		{
          //         if (ADC_sf[k]<MIN_DETECT_UD_ZERO) 
            //	      iq19_zero_ADC[k] = acp_zero[k];
            //	}
            //	else
        {
            iq19_zero_ADC[nc][k] = acp_zero[k];
        }

        //        zero_ADC[k] =_IQ19toF(acp_zero[k]);
        zero_ADC[nc][k] = acp_summ[k] / COUNT_DETECT_ZERO;//_IQ19toF(acp_zero[k]);
    }






}



unsigned int detect_protect_ACP_plus()
{


}


unsigned int detect_protect_ACP_minus()
{


}