#ifndef _ADC_TOOLS
#define _ADC_TOOLS

#include "IQmathLib.h"
#include "xp_project.h"
#include "params_norma.h"


#define COUNT_DETECT_ZERO 3000

#define COUNT_ARR_ADC_BUF_FAST_POINT    10



#define DELTA_ACP_TEMPER 0.0  // äàò÷èêè áëîêè pt100 äàåþò ïîñòîÿííîå ñìåùåíèå 0.0 ãðàäóñîâ, òàê íàñòðîåí áëîê SG3013

#define ADC_READ_FROM_PARALLEL_BUS 1

#define DEFAULT_ZERO_ADC	2048

#ifndef USE_INTERNAL_ADC
#define USE_INTERNAL_ADC 0
#endif 


#if (USE_INTERNAL_ADC==1)
#define COUNT_ARR_ADC_BUF               (C_adc_number+1)
#else
#define COUNT_ARR_ADC_BUF               C_adc_number
#endif

#define COUNT_ARR_ADC_BUF_EXTERNAL      C_adc_number



// 23550.3

#if(C_adc_number>=1)
#define  R_ADC_DEFAULT_0     { 271, 271, 876, 876, 876, 876, 876, 876, 249, 249, 301, 301, 301, 301, 301, 301 }
#define  K_LEM_ADC_DEFAULT_0 { 7200, 7200, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 8400, 8400, 8400, 8400,  5000,  5000 }
#define  NORMA_ADC_DEFAULT_0 { NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP }
#endif

#if(C_adc_number>=2)
#define  R_ADC_DEFAULT_1     {  1,  6190, 6190,  6190, 6190,  6190,  6190,  6190,   6190,   6190, 6190,  6190,  6190, 6190, 6190, 6190 }
#define  K_LEM_ADC_DEFAULT_1 {  1,  1000, 1000,  1000, 1000,  1000,  1000,  1000,   1000,   1000, 1000,   1000, 1000, 1000, 1000,     1 }
#define  NORMA_ADC_DEFAULT_1 { NORMA_ACP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_TEMPER_MILL_AMP, NORMA_ACP_P, NORMA_ACP }
#endif

#if(C_adc_number>=3)
#define  R_ADC_DEFAULT_2     { 271, 271, 887, 887, 887, 887, 887, 887, 250, 250, 3125, 3125, 3125, 3125, 309, 309 }
#define  K_LEM_ADC_DEFAULT_2 { 7200, 7200, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 60000, 60000, 60000, 60000,  5000,  5000 }
#define  NORMA_ADC_DEFAULT_2 { NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP }
#endif

// 23550.1

//#if(C_adc_number>=1)
//#define  R_ADC_DEFAULT_0     { 271, 271, 887, 887, 887, 887, 887, 887, 250, 250, 312, 312, 312, 312, 309, 309 }
//#define  K_LEM_ADC_DEFAULT_0 { 7200, 7200, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 8400, 8400, 8400, 8400,  5000,  5000 }
//#define  NORMA_ADC_DEFAULT_0 { NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP }
//#endif
//
//#if(C_adc_number>=2)
//#define  R_ADC_DEFAULT_1     {  1,  6190, 6190,  6190, 6190,  6190,  6190,  6190,   6190,   6190, 6190,  6190,  6190, 6190, 6190, 6190 }
//#define  K_LEM_ADC_DEFAULT_1 {  1,  1000, 1000,  1000, 1000,  1000,  1000,  1000,   1000,   1000, 1000,   1000, 1000, 1000, 1000,     1 }
//#define  NORMA_ADC_DEFAULT_1 { NORMA_ACP, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_TEMPER, NORMA_ACP_P, NORMA_ACP }
//#endif
//
//#if(C_adc_number>=3)
//#define  R_ADC_DEFAULT_2     { 271, 271, 887, 887, 887, 887, 887, 887, 250, 250, 3125, 3125, 3125, 3125, 309, 309 }
//#define  K_LEM_ADC_DEFAULT_2 { 7200, 7200, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 5000, 60000, 60000, 60000, 60000,  5000,  5000 }
//#define  NORMA_ADC_DEFAULT_2 { NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP }
//#endif




#if (USE_INTERNAL_ADC==1)
#define  R_ADC_DEFAULT_INTERNAL      { 100,100,100,100,100,100,100,100,1248,1248,1248,100,100,100,100,100 }
#define  K_LEM_ADC_DEFAULT_INTERNAL  { 30,30,30,30,10,10,10,10,621,621,621,100,10,10,10,10 }
#define  NORMA_ADC_DEFAULT_INTERNAL { NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP, NORMA_ACP }
#endif





/*
  //awa3
  //14 êàíàë out1
    0 - 11 êðèâûå äàò÷èêè  
  //15 êàíàë out2
    0 - 11 êðèâûå äàò÷èêè  
  //8 êàíàë
	    0 - 20 ìÀ  | 0 ãðàä - 200 ãðàä / ëèíåéíûé
		0V - 1.5V / 0 ãðàä - 200 ãðàä / ëèíåéíûé
  //9 êàíàë
	    0 - 20 ìÀ  | 0 ãðàä - 200 ãðàä / ëèíåéíûé
		0V - 1.5V / 0 ãðàä - 200 ãðàä / ëèíåéíûé

  //10 êàíàë
	    0 - 20 ìÀ  | 0 ãðàä - 200 ãðàä / ëèíåéíûé
		0V - 1.5V / 0 ãðàä - 200 ãðàä / ëèíåéíûé

  //11 êàíàë
	    0 - 20 ìÀ  | 0 ãðàä - 200 ãðàä / ëèíåéíûé
		0V - 1.5V / 0 ãðàä - 200 ãðàä / ëèíåéíûé
  //12 êàíàë
	    4 - 20 ìÀ  | 0 áàð - 10 áàð / ëèíåéíûé	    
		0.3V - 1.5V / 0 áàð - 10 áàð / ëèíåéíûé

  //13 êàíàë
	    4 - 20 ìÀ  | 0 áàð - 10 áàð / ëèíåéíûé
		0.3V - 1.5V / 0 áàð - 10 áàð / ëèíåéíûé
*/


typedef union
{
	
	struct
	{ 
	unsigned int c0_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c1_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c2_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c3_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c4_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c5_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c6_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c7_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c8_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c9_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c10_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c11_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c12_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c13_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c14_plus	:1; /* 0	äàò÷èê+	*/
	unsigned int c15_plus	:1; /* 0	äàò÷èê+	*/
	} bit;					/* Îøèáêè ïîáèòíî	*/
	unsigned long all;		/* Îøèáêè âìåñòå	*/
	
} ERR_ADC_PLUS_PROTECT;


typedef union
{
	
	struct
	{ 
	unsigned int c0_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c1_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c2_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c3_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c4_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c5_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c6_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c7_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c8_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c9_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c10_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c11_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c12_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c13_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c14_minus	:1; /* 0	äàò÷èê-	*/
	unsigned int c15_minus	:1; /* 0	äàò÷èê-	*/

	} bit;					/* Îøèáêè ïîáèòíî	*/
	unsigned int all;		/* Îøèáêè âìåñòå	*/
	
} ERR_ADC_MINUS_PROTECT;


typedef struct
{
	  ERR_ADC_PLUS_PROTECT   plus;
	  ERR_ADC_MINUS_PROTECT   minus;
} ERR_ADC_PROTECT;


/* Ãëîáàëüíày ñòðóêòóðà çíà÷åíèé òîêîâ è íàïðyæåíèé ÀÈÍ */
typedef struct
{
    _iq iqU_1;
	_iq iqU_2;

    _iq iqU_1_fast;
    _iq iqU_2_fast;

	_iq iqU_1_long;
    _iq iqU_2_long;  

	_iq iqIu_1;
	_iq iqIv_1;
	_iq iqIw_1;

	_iq iqIu_2;
	_iq iqIv_2;
	_iq iqIw_2;

    _iq iqIu_1_rms;
    _iq iqIv_1_rms;
    _iq iqIw_1_rms;

    _iq iqIu_2_rms;
    _iq iqIv_2_rms;
    _iq iqIw_2_rms;

    _iq iqIu;
    _iq iqIv;
    _iq iqIw;

	_iq iqIin_1;
	_iq iqIin_2;

	_iq iqUin_A1B1;
	_iq iqUin_B1C1;
	_iq iqUin_C1A1;

	_iq iqUin_A2B2;
	_iq iqUin_B2C2;
	_iq iqUin_C2A2;

	_iq iqUin_A1B1_rms;
    _iq iqUin_B1C1_rms;
    _iq iqUin_C1A1_rms;

    _iq iqUin_A2B2_rms;
    _iq iqUin_B2C2_rms;
    _iq iqUin_C2A2_rms;

	_iq iqUin_m1;
	_iq iqUin_m2;

    _iq iqIbreak_1;
	_iq iqIbreak_2; //39

	_iq T_U01;
	_iq T_U02;
	_iq T_U03;
	_iq T_U04;
	_iq T_U05;
	_iq T_U06;
	_iq T_U07;

	_iq T_Water_external;
	_iq T_Water_internal;

    _iq T_Air_01;
    _iq T_Air_02;
    _iq T_Air_03;
    _iq T_Air_04;

	_iq P_Water_internal; //53


	_iq iqI_vozbud;

	_iq iqIin_sum;
    
    _iq iqIm_1;
	_iq iqIm_2;

	_iq iqIm;

	
	_iq iqM;
	
	_iq PowerScalar;
	_iq PowerScalarFilter2;
	_iq PowerFOC;

	_iq iqU_1_imit; //63


	/*
	_iq iqUzpt_1_2; //uzpt1 bs2
	_iq iqUzpt_2_2; //uzpt2 bs2
	_iq iqUzpt_1_2_fast; //uzpt1 bs2
	_iq iqUzpt_2_2_fast; //uzpt2 bs2
	_iq iqUzpt_1_2_long; //uzpt1 bs2
	_iq iqUzpt_2_2_long; //uzpt2 bs2
	_iq iqIin_1_1;  //Iin AF1 BS1
	_iq iqIin_2_1;  //Iin AF2 BS1
	_iq iqIin_3_1;  //Iin AF3 BS1
	_iq iqIin_4_1;  //Iin AF4 BS1
	_iq iqIin_5_1;  //Iin AF5 BS1
	_iq iqIin_6_1;  //Iin AF6 BS1
	_iq iqIin_1_2;  //Iin AF1 BS2
	_iq iqIin_2_2;  //Iin AF2 BS2
	_iq iqIin_3_2;  //Iin AF3 BS2
	_iq iqIin_4_2;  //Iin AF4 BS2
	_iq iqIin_5_2;  //Iin AF5 BS2
	_iq iqIin_6_2;  //Iin AF6 BS2
	_iq iqUin_AB;	  //Âõîäíîå ëèíåéíîå íàïðßæåíèå AB 
	_iq iqUin_BC;     //Âõîäíîå ëèíåéíîå íàïðßæåíèå BC
	_iq iqUin_CA;     //Âõîäíîå ëèíåéíîå íàïðßæåíèå CA
	_iq iqUin_AB_sf;	  //Âõîäíîå ëèíåéíîå íàïðßæåíèå AB 
	_iq iqUin_BC_sf;     //Âõîäíîå ëèíåéíîå íàïðßæåíèå BC
	_iq iqUin_CA_sf;     //Âõîäíîå ëèíåéíîå íàïðßæåíèå CA
	_iq iqT_WATER_in;  // Òåìïåðàòóðà âîäû íà âõîäå Ï× 
	_iq iqT_WATER_out; // Òåìïåðàòóðà âîäû íà âûõîäå Ï×
	_iq iqT_AIR_in_up; // Òåìïåðàòóðà âîçäóõà íà âõîäå Ï× (âåðõ)
	_iq iqT_AIR_in_down;// Òåìïåðàòóðà âîçäóõà íà âõîäå Ï× (íèç)
	_iq iqP_WATER_in;  // Äàâëåíèå âîäû íà âõîäå Ï×
	_iq iqP_WATER_out; // Äàâëåíèå âîäû íà âûõîäå Ï×

	_iq iqT_BK1_BK12; // Òåêóùåå ïîêàçàíèå îäíîãî èç äàò÷èêîâ BK1_BK12
	_iq iqT_BK13_BK24; // Òåêóùåå ïîêàçàíèå îäíîãî èç äàò÷èêîâ BK13_BK24

	_iq iqUin_m1;     //Àìïëèòóäà Âõîäíîå ëèíåéíîå íàïðßæåíèå


	_iq iqIu_1_1;  //Iu AF1 BS1
	_iq iqIu_1_2;  //Iu AF2 BS1
	_iq iqIv_1_1;  //Iv AF3 BS1
	_iq iqIv_1_2;  //Iv AF4 BS1
	_iq iqIw_1_1;  //Iw AF5 BS1
	_iq iqIw_1_2;  //Iw AF6 BS1



	_iq iqIu_2_1;  //Iu AF1 BS2
	_iq iqIu_2_2;  //Iu AF2 BS2
	_iq iqIv_2_1;  //Iv AF3 BS2
	_iq iqIv_2_2;  //Iv AF4 BS2
	_iq iqIw_2_1;  //Iw AF5 BS2
	_iq iqIw_2_2;  //Iw AF6 BS2

	_iq iqIm_1;
	_iq iqIm_2;

	_iq iqWexp;
	_iq iqWout;

	_iq iqM;
*/
}	ANALOG_VALUE;


#define ANALOG_VALUE_DEFAULT {0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,\
                              0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0, 0}
/* Ãëîáàëüíày ñòðóêòóðà çíà÷åíèé òîêîâ è íàïðyæåíèé ÀÈÍ */


#define ERR_LEVEL_ADC_PLUS   3950   //+1270A  //2950 // +650A //3467 // 3367 //3367 //3267 // 0xfff-0x29c
#define ERR_LEVEL_ADC_MINUS  150    //-1270A  //1150 //-650A // 267 //367

#define ERR_LEVEL_ADC_PLUS_6 3800 //3783 //3623~1150  // 3462 ~ 1050 A  // 3320 ~ 960A //3680 //3267 // 0xfff-0x29c
#define ERR_LEVEL_ADC_MINUS_6 1000 //267 //367

#define MIN_DETECT_UD_ZERO 2300


#define level_err_ADC_PLUS_default {ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,\
                                 ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,\
                                 ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,\
                                 ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS,ERR_LEVEL_ADC_PLUS}

#define level_err_ADC_MINUS_default {ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,\
                               ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,\
                               ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,\
                               ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS,ERR_LEVEL_ADC_MINUS}


extern ANALOG_VALUE	analog;
extern ANALOG_VALUE	filter;
extern ANALOG_VALUE analog_zero;

//void calc_norm_ADC(int fast);
void calc_norm_ADC_0(int run_norma);
void calc_norm_ADC_1(int run_norma);
void Init_Adc_Variables(void);
void norma_adc_nc(int nc);



extern int ADC_f[COUNT_ARR_ADC_BUF][16];
extern int zero_ADC[COUNT_ARR_ADC_BUF][16];

extern ERR_ADC_PROTECT err_adc_protect[COUNT_ARR_ADC_BUF],mask_err_adc_protect[COUNT_ARR_ADC_BUF];

extern unsigned int R_ADC[COUNT_ARR_ADC_BUF][16];
extern unsigned int K_LEM_ADC[COUNT_ARR_ADC_BUF][16];
extern float K_NORMA_ADC[COUNT_ARR_ADC_BUF][16];

//void norma_all_adc(void);
extern _iq koef_Uzpt_long_filter, koef_Uzpt_fast_filter, koef_Uin_filter, koef_Im_filter, koef_Power_filter, koef_Power_filter2;

void detect_zero_analog(int nc);


#if (USE_INTERNAL_ADC==1)

void Init_Internal_Adc(void);

#endif


#endif // end _ADC_TOOLS