/*
 * Diff.h
 *
 *  Created on: 12-04-2017
 *      Author: Krzysztof Jakubczyk
 */

#ifndef DIFF_H_
#define DIFF_H_

#include "tdefs.h"
#include "analog_in.h"
#include "helper.h"
#include "config.h"

extern u16 pY_ZPrAE[25];
extern u16 pD_ZPrAE[25];
extern struct kom1_zprae Y2w_ZPrAE;
extern struct kom2_zprae Y3w_ZPrAE;
extern struct kom1_zprae D2w_ZPrAE;
extern struct kom1_zprae D3w_ZPrAE;

#define c1r 5 //ilosc powtorzen zadzialania bezwarunkowego
#define c1p 30 //ilosc powtorzen odpadu bezwarunkowego
#define c2r 2 //ilosc powtorzen zadzialania blokady 2h
#define c2p 7 //ilosc powtorzen odpadu blokady 2h
#define c3r 2 //ilosc powtorzen zadzialania blokady 5h
#define c3p 10 //ilosc powtorzen odpadu blokady 5h
#define c4r 5 //ilosc powtorzen zadzialania czasowej blokady
#define c5r 20 //ilosc powtorzen zadzialania stabilizowanej strefy dzialania !!!!!!!!Pawel bylo 2
#define c5p 2 //ilosc powtorzen odpadu stabilizowanej strefy dzialania

	struct we_an_diff
	{
		u16 *samples_buf;
		struct analog_in_params_extended *params;
	};

	struct licz
	{
		short l2h1[2];
		short l2h2[2];
		short l2h3[2];
		short l5h1[2];
		short l5h2[2];
		short l5h3[2];
		short Ir1[2];
		short Ir2[2];
		short Ir3[2];
		short sbc1[2];
		short sbc2[2];
		short sbc3[2];
		short chs1[2];
		short chs2[2];
		short chs3[2];

	};

	struct pobudzenia_czastkowe
	{
		u8 Irr1;
		u8 Irr2;
		u8 Irr3;
		u8 Pb1;
		u8 Ob1;
		u8 BlZw1;
		u8 Pb2;
		u8 Ob2;
		u8 BlZw2;
		u8 Pb3;
		u8 Ob3;
		u8 BlZw3;
		u8 Psf1;
		u8 Psf2;
		u8 Psf3;
		u8 Bl2h_L1;
		u8 Bl2h_L2;
		u8 Bl2h_L3;
		u8 Bl5h_L1;
		u8 Bl5h_L2;
		u8 Bl5h_L3;
	};

	struct wskazniki_prad_do_kompensacji
	{
		struct we_an_diff *Ip[4];
		struct we_an_diff *Im[4];

		float a_p[4][2];
		float a_m[4][2];
	};

    struct Nastawy_przeliczone
    {
//		Adresy adr;

		float khr_2h;///< wartosc rozruchowa blokady od 2 harmonicznej
		float khp_2h;///< wartosc powrotowa blokady od 2 harmonicznej
		float khr_5h;///< wartosc rozruchowa blokady od 5 harmonicznej
		float khp_5h;///< wartosc powrotowa blokady od 5 harmonicznej
		float Irr;///< wartosc rozruchowa dzialania bezwarunkowego
		float Ipr;///< wartosc powrotowa dzialania bezwarunkowego
		float Ihdr;///<wartosc rozruchowa pradu hamowania zwarcia zewnetrznego
		float Irdr;///< wartosc rozruchowa pradu roznicowego zwarcia zewnetrznego
		float kh1r;///<wartosc rozruchowa prosta 2
		float kh1p;///<wartosc powrotowa prosta 2
		float kh2r;///<wartosc rozruchowa prosta 3
		float Ir3c;///< czesc stala nastawy odcinka 3
		float Ip3c;///< czesc stala nastawy odcinka 3
		float kh2p;///<wartosc powrotowa prosta 3
		float kh1r2;///<wartosc rozruchowa prosta 2 (w kwadracie)
		float kh1p2;///<wartosc powrotowa prosta 2 (w kwadracie)
		float Iror;///<wartosc rozruchowa pradu prosta 1
		float Irop;///<wartosc powrotowa pradu prosta 1
		float Ir4;///< wartosc rozruchowa prosta 4
		float Ip4;///< wartosc powrotowa prosta 4
		float Ih1;///< wartosc pradu stabilizacji dla poczatku prostej 2
		float Ihp;///< wartosc pradu stabilizacji dla poczatku prostej 3
		float Ihg;///<wartosc pradu stabilizacji dla poczatku prostej 4
		u16 t_sbc;///< czas blokady po stwierdzeniu zwarcia zewnetrznego
        u32 tz; ///< opoznienie czasu zadzialania przekaznika
		u8 on; ///< wartosc nastawy aktywnosci przekaznika 1- aktywny
        u8 w; ///< wartosc nastawy dzialania na wylaczeniee 1 - wylaczenie 0 - tylko sygnalizacja
        u8 bl; ///< wartosc nastawy aktywnosci blokady dzialania 1- blokada aktywna
		u8 bl2h;///< wlaczenie blokady od drugiej harmonicznej
		u8 bl5h;///< wlaczenie blokady od piatej harmonicznej
		u8 sbc;///< wlaczenie strefy blokady czasowej
		u8 h;///< wlaczenie granicznej stabilizacji
		u8 r; ///< wlaczenie strefy bezwarunkowego wylaczenia
		u8 cross_block; ///cross block do hrmonicznych
		struct wskazniki_prad_do_kompensacji L[3]; ///< wskazniki pradow do wyliczenia skompensowanych wejsc faza 1,2,3
		float a[4];///< wspolczynnik pradu do kompensacji
		u16 buf_zero[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS*2];
		//WA::Nastawa_przeliczona n_zero;
		//WA::Wyjscie wejscie_zero;
		struct analog_in_params_extended n_zero;
		struct we_an_diff wejscie_zero;

		float wsp_filtr_sin_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		float wsp_filtr_cos_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		float wsp_filtr_sin2h_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		float wsp_filtr_cos2h_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		float wsp_filtr_sin5h_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		float wsp_filtr_cos5h_[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS];
		u8 p2d;
		u8 p3d;
#ifdef IZAZ600
		u8 Rej3kHz_adr_wej_OK;
#endif
	};

	struct wejscie_wew
	{
		float buf_Lr[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS*2][6];
		u8 nr_probki;
		float orta[6];
		float ortb[6];
		float Ir[6];
		float orta2h[3];
		float ortb2h[3];
		float I2h[3];
		float orta5h[3];
		float ortb5h[3];
		float I5h[3];

		float buf_ip[SAMPLES_PER_MS*MAIN_FREQ_PERIOD_MS*2][9];
		float Ip[9];
	};

	enum typ_kompensacji
	{
		zero, ///< brak wejscia
		A, /// 1,0,0	1
		B, /// -1,0,0	0,57735
		C, /// 1,-1,0	0,57735
		D, /// -1,1,0	0,57735
		E, /// 1,0,-1	0,57735
		F, /// -1,0,1	0,57735
		N, /// 0,1,0	1
		O, /// 0,-1,0	1
		U,
		V,
		W,
		X,
		Y,
		Z
	};

	enum jaki_uklad
	{
		bez_GT, ///<blad nastaw (nastawy sprzeczne dzialanie jak odstawienie funkcji)
		tylko_G, ///< tylko generator
		tylko_T2w_Y, ///< tylko transformator z dwoma uzwojeniami gora w ukladzie Y
		tylko_T2w_D, ///< tylko transformator z dwoma uzwojeniami gora w ukladzie D
		tylko_T3w_Y, ///< tylko transformator z trzema uzwojeniami gora w ukladzie Y
		tylko_T3w_D, ///< tylko transformator z trzema uzwojeniami gora w ukladzie D
		blokGT_T2w_Y, ///< blok generator transformator z dwoma uzwojeniami gora w ukladzie Y
		blokGT_T2w_D, ///< blok generator transformator z dwoma uzwojeniami gora w ukladzie D
		blokGT_T3w_Y, ///< blok generator transformator z trzema uzwojeniami gora w ukladzie Y
		blokGT_T3w_D ///< blok generator transformator z trzema uzwojeniami gora w ukladzie D
	};

	struct kompensacja
	{
		enum typ_kompensacji Ig; //prad gornej strony trafo
		enum typ_kompensacji Id; //prad dolnej strony trafo
		enum typ_kompensacji Io; //prad odczepu

	};

	struct kom1
	{
		struct kompensacja k[7];
	};

	struct kom1_zprae
	{
		struct kompensacja k[13];
	};

	struct kom2
	{
		struct kompensacja k[7][7];
	};

	struct kom2_zprae
	{
		struct kompensacja k[13][13];
	};

	struct nast_trafo
	{
		float PT12;///<przekladnia uzwojen 1-2 transformatora
		float PT13;///<przekladnia uzwojen 1-3 transformatora

		//u16 Tr_zas;///<strona zasilania ukladu zabezpieczenia rożnicowego
		u16 GrP1; ///<fabryczna grupa polaczen uzwojen transformatora dla uzwojenia GN (1)
		u16 GrP2; ///<fabryczna grupa polaczen uzwojen transformatora dla uzwojenia SN (2)
		u16 GrP3; ///<fabryczna grupa polaczen uzwojen transformatora dla uzwojenia SN (3)
	};

	struct dane_wewnetrzne_Diff
	{
//		Wyjscia_rejestratora R; ///< dane ostatniego zaklocenia
//		Time czas_; // moment wystapienia zaklocenia (rejestr tymczasowy - przed zapisem)
		u32 dl_; // dlugosc czasu trwania zaklocenia (rejestr tymczasowy - przed zapisem)
		float maxIr1; // maksymalna watosc pradu rożnicowego wejscia 1 (rejestr tymczasowy - przed zapisem)
		float maxIr2; // maksymalna watosc pradu rożnicowego wejscia 2 (rejestr tymczasowy - przed zapisem)
		float maxIr3; // maksymalna watosc pradu rożnicowego wejscia 3 (rejestr tymczasowy - przed zapisem)
		float maxIh1; // maksymalna watosc pradu stabilizacji wejscia 1 (rejestr tymczasowy - przed zapisem)
		float maxIh2; // maksymalna watosc pradu stabilizacji wejscia 2 (rejestr tymczasowy - przed zapisem)
		float maxIh3; // maksymalna watosc pradu stabilizacji wejscia 3 (rejestr tymczasowy - przed zapisem)
	    u32 licz_t; // licznik czasu od pobudzenia dla przekaznika czasowego
		u8 wsk_rej; // nowy zapis rejestracji parametrow zaklocenia (spelnienie kryterium identyfikacji)
		u8 sbc_P;
 	};


struct diff_logic
{
	struct binary_io stan_bl;
	u16 *I1_l1;
	struct analog_in_params_extended *I1_l1_params;
	u16 *I1_l2;
	struct analog_in_params_extended *I1_l2_params;
	u16 *I1_l3;
	struct analog_in_params_extended *I1_l3_params;
	u16 *I2_l1;
	struct analog_in_params_extended *I2_l1_params;
	u16 *I2_l2;
	struct analog_in_params_extended *I2_l2_params;
	u16 *I2_l3;
	struct analog_in_params_extended *I2_l3_params;
	u16 *I3_l1;
	struct analog_in_params_extended *I3_l1_params;
	u16 *I3_l2;
	struct analog_in_params_extended *I3_l2_params;
	u16 *I3_l3;
	struct analog_in_params_extended *I3_l3_params;
	u16 *I4_l1;
	struct analog_in_params_extended *I4_l1_params;
	u16 *I4_l2;
	struct analog_in_params_extended *I4_l2_params;
	u16 *I4_l3;
	struct analog_in_params_extended *I4_l3_params;

	struct binary_io test;

	struct binary_io W;
	struct binary_io Z;
	struct binary_io P;
	struct binary_io Pf1;
	struct binary_io Pf2;
	struct binary_io Pf3;
	struct binary_io BL2h1;
	struct binary_io BL2h2;
	struct binary_io BL2h3;
	struct binary_io BL5h1;
	struct binary_io BL5h2;
	struct binary_io BL5h3;
	struct binary_io Zw1;
	struct binary_io Zw2;
	struct binary_io Zw3;
	struct binary_io nieobs;
	float *Ir1;
	float *Ir2;
	float *Ir3;
	float *Ih1;
	float *Ih2;
	float *Ih3;
	float *I2h1;
	float *I2h2;
	float *I2h3;
	float *I5h1;
	float *I5h2;
	float *I5h3;
	float *Ir_L1_ortb;
	float *Ir_L2_ortb;
	float *Ir_L3_ortb;
//	float *Ih_L1_ortb;
//	float *Ih_L2_ortb;
//	float *Ih_L3_ortb;

	enum jaki_uklad jaki_uklad;
	struct dane_wewnetrzne_Diff dw;
	struct licz l;
	struct pobudzenia_czastkowe P_;
	struct wejscie_wew w;
    struct Nastawy_przeliczone nast_; // struktura z parametrami rozruchowymi
	float Ir1_;
	float Ir2_;
	float Ir3_;
	float Ih1_;
	float Ih2_;
	float Ih3_;

	struct we_an_diff an_struct_i1_l1;
	struct we_an_diff an_struct_i1_l2;
	struct we_an_diff an_struct_i1_l3;
	struct we_an_diff an_struct_i2_l1;
	struct we_an_diff an_struct_i2_l2;
	struct we_an_diff an_struct_i2_l3;
	struct we_an_diff an_struct_i3_l1;
	struct we_an_diff an_struct_i3_l2;
	struct we_an_diff an_struct_i3_l3;
	struct we_an_diff an_struct_i4_l1;
	struct we_an_diff an_struct_i4_l2;
	struct we_an_diff an_struct_i4_l3;

//	float mul_I1[3];
//	float mul_I2[3];
//	float mul_I3[3];
	//	struct Nastawy_przeliczone_Diff_1 nast_;
};

struct diff_io
{
	u32 stan_bl_in;
	u32 ia_l1_ptr_in;
	u32 ia_l1_params_ptr_in;
	u32 ia_l2_ptr_in;
	u32 ia_l2_params_ptr_in;
	u32 ia_l3_ptr_in;
	u32 ia_l3_params_ptr_in;
	u32 ib_l1_ptr_in;
	u32 ib_l1_params_ptr_in;
	u32 ib_l2_ptr_in;
	u32 ib_l2_params_ptr_in;
	u32 ib_l3_ptr_in;
	u32 ib_l3_params_ptr_in;
	u32 ic_l1_ptr_in;
	u32 ic_l1_params_ptr_in;
	u32 ic_l2_ptr_in;
	u32 ic_l2_params_ptr_in;
	u32 ic_l3_ptr_in;
	u32 ic_l3_params_ptr_in;
	u32 id_l1_ptr_in;
	u32 id_l1_params_ptr_in;
	u32 id_l2_ptr_in;
	u32 id_l2_params_ptr_in;
	u32 id_l3_ptr_in;
	u32 id_l3_params_ptr_in;
	u32 test_in;

	u32 w_out;
	u32 z_out;
	u32 p_out;
	u32 pl1_out;
	u32 pl2_out;
	u32 pl3_out;
	u32 bl_2h_L1_out;
	u32 bl_2h_L2_out;
	u32 bl_2h_L3_out;
	u32 bl_5h_L1_out;
	u32 bl_5h_L2_out;
	u32 bl_5h_L3_out;
	u32 zzew1_out;
	u32 zzew2_out;
	u32 zzew3_out;
	u32 di_l1_float_out;
	u32 di_l2_float_out;
	u32 di_l3_float_out;
	u32 ih_l1_float_out;
	u32 ih_l2_float_out;
	u32 ih_l3_float_out;
	u32 i2h_l1_float_out;
	u32 i2h_l2_float_out;
	u32 i2h_l3_float_out;
	u32 i5h_l1_float_out;
	u32 i5h_l2_float_out;
	u32 i5h_l3_float_out;
	u32 ir_l1_ch_float_out;
	u32 ir_l2_ch_float_out;
	u32 ir_l3_ch_float_out;
	u32 nieobs_out;
//	u32 ih_l1_ch_float_out;
//	u32 ih_l2_ch_float_out;
//	u32 ih_l3_ch_float_out;
}__attribute__((__packed__));


extern int diff_init_io(struct diff_io *io, struct diff_logic *log);
extern void kryterium2(struct diff_logic *log,float Ir, float Ih, u8 *pob);
extern void kryterium3(struct diff_logic *log,float Ir, float Ih, u8 *pob);
extern u8 kryterium1(short *licz, u8 pobudzenie, u8 powrot, u8 st, u16 powz, u16 powp);
extern void przelicz_nastawy1(struct diff_logic *log,struct nast_trafo n);
extern void przelicz_1200Hz_1(struct diff_logic *log);
extern void przelicz_1200Hz_2(struct diff_logic *log);


#endif /* DIFF_H_ */
