/*
 * ZDistL.h
 *
 *
 *  Created on: 29-11-2016
 *      Author: KJ
 */

#ifndef ZDISTL_H_
#define ZDISTL_H_

#include "../tdefs.h"
#include "helper.h"

struct Wyjscie1_zdistl
{
	u8 dbl_Com[7]; ///deblokowanie działania stref w zależności od stanu łącza
	u8 PSPZ;//pobudzenie SPZ
};

enum Wylaczenie
{
	start_jednofazowy,
	start_trojfazowy,
	start_kombinowany,
	wyl_definitywny

};


struct dane_wewnetrzne_ZDistL
{
    float RL1Em; ///< Rezystancja pętli zwarciowej fazy L1 z ziemia (rejestracja)
    float XL1Em; ///< Rezaktancja pętli zwarciowej fazy L1 z ziemia (rejestracja)
    float RL2Em; ///< Rezystancja pętli zwarciowej fazy L2 z ziemia (rejestracja)
    float XL2Em; ///< Rezaktancja pętli zwarciowej fazy L2 z ziemia (rejestracja)
    float RL3Em; ///< Rezystancja pętli zwarciowej fazy L3 z ziemia (rejestracja)
    float XL3Em; ///< Rezaktancja pętli zwarciowej fazy L3 z ziemia (rejestracja)
    float RL1L2m; ///< Rezystancja pętli zwarciowej fazy L1 z L2 (rejestracja)
    float XL1L2m; ///< Rezaktancja pętli zwarciowej fazy L1 z L2 (rejestracja)
    float RL2L3m; ///< Rezystancja pętli zwarciowej fazy L2 z L3 (rejestracja)
    float XL2L3m; ///< Rezaktancja pętli zwarciowej fazy L2 z L3 (rejestracja)
    float RL3L1m; ///< Rezystancja pętli zwarciowej fazy L3 z L1 (rejestracja)
    float XL3L1m; ///< Rezaktancja pętli zwarciowej fazy L3 z L1 (rejestracja)
	short liczts[6][2]; ///<licznik czasu czas opoznienia dzialania strefy
	short licz_WSPZ;
	unsigned short stan_SPZ;
	short licznik_SPZ; ///< licznik czasu do SPZ
	short licznik1; ///< licznik czasu w SPZ
	short licznik2; ///< licznik czasu w SPZ
	short licznik_bl_SCH; ///< licznik do odliczania czasu oczekiwania na synchronizm
	short licznik_ZZwa;///< licznik do automatyki załączenia na zwarcie
	short licznik_PIU;///< licznik pobudzeń sprawdzania obecności napiecia i prądu
//	Wyjscia_rejestratora Rej; ///< dane ostatniego zaklocenia
//	Time czas_; // moment wystapienia zaklocenia (rejestr tymczasowy - przed zapisem)
	unsigned int dl_; // dlugosc czasu trwania zaklocenia (rejestr tymczasowy - przed zapisem)
	unsigned short bl_SPZ1;//blokowanie jednofazowego SPZ
	u8 wsk_rej; // nowy zapis rejestracji parametrow zaklocenia (spelnienie kryterium identyfikacji)
	u8 Pf[6][2]; // pobudzenia stref P[nr strefy][fazowe,miedzyfazowe]
	u8 Pzf[6]; //pobudzenie stref
	u8 P;// pobudzenie zbiorcze
	u8 Zf[6][2]; // zadzialanie strefy
	u8 Z[6]; // zadzialanie strefy
	u8 Ws[6]; // wyłaczenie od strefy
	u8 Zz; // Zadzialanie sygnal zbiorczy
	u8 W; // wylaczenie sygnal zbiorczy
	u8 W1; // wylaczenie faza L1
	u8 W2; // wylaczenie faza L2
	u8 W3; // wylaczenie faza L3
	u8 R;//zwarcie z udziałem fazy L1
	u8 S;//zwarcie z udziałem fazy L2
	u8 T;//zwarcie z udziałem fazy L3
	u8 Rbk;//zwarcie z udziałem fazy L1(bezkierunkowo)
	u8 Sbk;//zwarcie z udziałem fazy L2(bezkierunkowo)
	u8 Tbk;//zwarcie z udziałem fazy L3(bezkierunkowo)
	u8 E;//zwarcie z udziałem ziemi
	u8 jedfaz;//zwarcie jednofazowe
	u8 blIo;//blokada zabezpieczenia ziemnozwarciowego od SPZ jednofazowego
	u8 W_ON;//wyłącznik zamkniety
	u8 W1_ON;//wyłącznik zamkniety faza L1
	u8 W2_ON;//wyłącznik zamkniety faza L2
	u8 W3_ON;//wyłącznik zamkniety faza L3
	u8 W_OFF;//wyłącznik otwarty
	u8 W1_OFF;//wyłącznik otwarty faza L1
	u8 W2_OFF;//wyłącznik otwarty faza L2
	u8 W3_OFF;//wyłącznik otwarty faza L3
	u8 P_SPZD;//pobudzenie SPZ od odległościówki
	u8 P_SPZ;//pobudzenie SPZ
	u8 dBl_SPZ;//dopuszczenie działania automatyki SPZ
	u8 WZ; //sygnalizacja udanego cyklu SPZ
	u8 WZW; // sygnalizacja nieudanego cyklu SPZ
	u8 WD; //wyłączenie definitywne
	u8 tps_SPZ; // odliczanie czau potwierdzenia skuteczności SPZ
	u8 t_bzn; // odliczanie czasu przerwy beznapięciowej
	u8 bl_SPZ_SCH;//blokada załącz SPZ od automatyki kontroli synchronizmu lub braku gotowosci napędu
	u8 ZZw; //aktywna automatyka załączenia na zwarcie
	u8 ZZw_start; //spełnienie warunków uruchomienia automatyki załączenia na zwarcie
	u8 ZZw_PIU; //pobudzenie kryterium napięcie/prąd zamknięcia wyłącznika
	u8 bl_WSPZ;//zezwolenie na wyłącz od SPZ
	u8 R1;
	u8 S1;
	u8 T1;
	u8 W_1faz; // wyłaczenie jednofazowe
	u8 ZZwP;//wyłączenie od automatyki załączenia na zwarcie
};

struct Nastawy_przeliczone_ZDistL
{
//	Adresy adr;

	struct Wyjscie1_zdistl *COM1;
	struct Wyjscie1_zdistl *COM2;
	struct Wyjscie1_zdistl wy;

	struct Wyjscia_ZDistA *ZdistA;

	short ZZw_st; ///< strefa współpracy z automatyką załączenia na zwarcie
	//short adr_PZZw;///< adres zmiennej pobudzenia strefy współpracujacej z automatyką ZZw
	//short adr_ZZZw;///< adres zmiennej zadziałania strefy współpracujacej z automatyką ZZw
	enum Wylaczenie SPZst1; ///< tryb pracy stopnia 1 w SPZ

	short t_stf[6][2]; ///< czas dzialania strefy

	short SPZilst;///< Ilość stopni automatyki SPZ

	short tWSPZ;///< Czas wyłączenia niedefinitywnego
	short tSPZ_1f;///< Czas przerwy beznapięciowej dla wyłączenia jednofazowego
	short tSPZ_zr;///< Czas przerwy beznapięciowej dla zwarcia rozwojowego
	short tSPZ_3f;///< Czas przerwy beznapięciowej dla wyłączenia trójfazowego
	short tSPZ_st2;///< Czas przerwy beznapięciowej stopnia 2
	short tSPZ_st3;///< Czas przerwy beznapięciowej stopnia 3
	short tSPZ_st4;///< Czas przerwy beznapięciowej stopnia 4
	short tSPZ_st5;///< Czas przerwy beznapięciowej stopnia 5
	short tSPZow;///< Czas oczekiwania na otwarcie wyłacznika
	short tSPZSCH;///< Czas oczekiwanie na zdjęcie blokady kontroli synchronizmu
	short tSPZ_zal;///< Czas trwania impulsu załączającego
	short tSPZ_bl;///< czas identyfikacji skuteczności SPZ

	float ZZw_ta;///< Czas działania funkcji po zamknięciu wyłącznika
	float ZZw_Ir;///< Prąd identyfikacji otwarcia wyłącznika
	float ZZw_Ur;///< Napięcie identyfikacji otwarcia wyłacznika
	short ZZw_to;///< Czas identyfikacji otwarcia wyłącznika

	u8 SPZ_L1; ///< pobudzenie SPZ przez łącze kanał1
	u8 SPZ_L2; ///< pobudzenie SPZ przez łącze kanał2
	u8 SPZ_ON;
	u8 SPZ_s[5];
	u8 SPZ_zew;
	u8 Bl_SCH;
	u8 Bl_PS[6];
	u8 Zbz[6][2]; ///< zadziałanie bezzwloczne strefy
	u8 Stf_ON[6]; ///< wlaczenie/odstawienie strefy
	u8 Stf_W[6]; ///< działanie na wylaczenie/sygnalizacje strefy
	u8 Stf_WD[6]; ///< działanie na wylaczenie bez SPZ
	u8 Stf_W_SPZ[6]; ///< działanie na wylaczenie z automatyką SPZ
    u8 bl_; ///< wartosc nastawy aktywnosci blokady dzialania 1- blokada aktywna
	u8 ZZw_ON; ///< włączenie automatyki załączenia na zwarcie
};

struct ZDistL_logic
{
    struct binary_io stan_bl;
    struct Wyjscia_ZDistA *WE_Zdist;
    struct Wyjscie1_zdistl *WE_L1;
    struct Wyjscie1_zdistl *WE_L2;
	struct binary_io Bl_PS;
	struct binary_io Bl_Ufail;
	struct binary_io Bl_SCH;
	struct binary_io WM_OK;
	struct binary_io W_ON_L1;
	struct binary_io W_OFF_L1;
	struct binary_io W_ON_L2;
	struct binary_io W_OFF_L2;
	struct binary_io W_ON_L3;
	struct binary_io W_OFF_L3;
	struct binary_io Start_SPZ;
	struct binary_io BL_SPZ;
	struct binary_io Z; ///< załączenie wyłącznika - uruchomienie automatyki załączenia na zwarcie
	struct binary_io Kas_Syg;
	struct binary_io test;

    struct binary_io P;
    struct binary_io P1W;
    struct binary_io P1;
    struct binary_io P2;
    struct binary_io P3;
    struct binary_io P4;
    struct binary_io P5;
	struct binary_io R;
	struct binary_io S;
	struct binary_io T;
	struct binary_io E;
    struct binary_io Z1W;
    struct binary_io Z1;
    struct binary_io Z2;
    struct binary_io Z3;
    struct binary_io Z4;
    struct binary_io Z5;
    struct binary_io W;
    struct binary_io W1;
    struct binary_io W2;
    struct binary_io W3;
    struct binary_io zal;
	struct binary_io P_SPZ;
    struct binary_io SPZ_P1;
    struct binary_io SPZ_P2;
    struct binary_io SPZ_P3;
    struct binary_io SPZ_P4;
    struct binary_io SPZ_P5;
    struct binary_io WZ;
    struct binary_io WZW;
	struct binary_io WD;
	struct binary_io err_SPZ;
    struct binary_io SPZ_BlIo;
	struct binary_io tps_SPZ;
	struct binary_io t_bzn;

	struct binary_io PZZw;
	struct binary_io ZZZw;

	struct Nastawy_przeliczone_ZDistL nast_;
	struct dane_wewnetrzne_ZDistL dw;
};

struct ZDistL_io
{
	u32 stan_bl_in;
	u32 we_zdist_ptr_in;
	u32 we_l1_ptr_in;
	u32 we_l2_ptr_in;
	u32 bl_ps_in;
	u32 bl_ufail_in;
	u32 bl_sck_in;
	u32 wm_ok_in;
	u32 w_on_l1_in;
	u32 w_off_l1_in;
	u32 w_on_l2_in;
	u32 w_off_l2_in;
	u32 w_on_l3_in;
	u32 w_off_l3_in;
	u32 start_spz_in;
	u32 bl_spz_in;
	u32 z_in;
	u32 kas_syg_in;
	u32 test_in;

	u32 p_out;
	u32 p1w_out;
	u32 p1_out;
	u32 p2_out;
	u32 p3_out;
	u32 p4_out;
	u32 p5_out;
	u32 r_out;
	u32 s_out;
	u32 t_out;
	u32 e_out;
	u32 z1w_out;
	u32 z1_out;
	u32 z2_out;
	u32 z3_out;
	u32 z4_out;
	u32 z5_out;
	u32 w_out;
	u32 w1_out;
	u32 w2_out;
	u32 w3_out;
	u32 zal_out;
	u32 p_spz_out;
	u32 spz_p1_out;
	u32 spz_p2_out;
	u32 spz_p3_out;
	u32 spz_p4_out;
	u32 spz_p5_out;
	u32 spz_wz_out;
	u32 spz_wzw_out;
	u32 wd_out;
	u32 err_spz_out;
	u32 spz1f_bli0_out;
	u32 tps_SPZ_out;
	u32 t_bzn_out;
	u32 wyj_ptr_out;
}__attribute__((__packed__));

struct ZDistL_params
{
	long bity; ///< nastawy bitowe;
	long Stf1; ///< Sposób działania strefy 1
	long Stf2; ///< Sposób działania strefy 2
	long Stf3; ///< Sposób działania strefy 3
	long Stf4; ///< Sposób działania strefy 4
	long Stf5; ///< Sposób działania strefy 5
	long SPZst1; ///< tryb pracy stopnia 1 w SPZ
	long ZZw_st; ///< strefa współpracy z automatyką załączenia na zwarcie

	double ts1LE;///< Czas wyłączenia strefy 1 zwarcia jednofazowe z ziemią
	double ts1LL;///< Czas wyłączenia strefy 1 zwarcia miedzyfazowe
	double ts2LE;///< Czas wyłączenia strefy 2 zwarcia jednofazowe z ziemią
	double ts2LL;///< Czas wyłączenia strefy 2 zwarcia miedzyfazowe
	double ts3LE;///< Czas wyłączenia strefy 3 zwarcia jednofazowe z ziemią
	double ts3LL;///< Czas wyłączenia strefy 3 zwarcia miedzyfazowe
	double ts4LE;///< Czas wyłączenia strefy 4 zwarcia jednofazowe z ziemią
	double ts4LL;///< Czas wyłączenia strefy 4 zwarcia miedzyfazowe
	double ts5LE;///< Czas wyłączenia strefy 5 zwarcia jednofazowe z ziemią
	double ts5LL;///< Czas wyłączenia strefy 5 zwarcia miedzyfazowe
	double SPZilst;///< Ilość stopni automatyki SPZ
	double tWSPZ;///< Czas wyłączenia niedefinitywnego
	double tSPZ_1f;///< Czas przerwy beznapięciowej dla wyłączenia jednofazowego
	double tSPZ_3f;///< Czas przerwy beznapięciowej dla wyłączenia trójfazowego
	double tSPZ_zr;///< Czas przerwy beznapięciowej dla zwarcia rozwojowego
	double tSPZ_st2;///< Czas przerwy beznapięciowej stopnia 2
	double tSPZ_st3;///< Czas przerwy beznapięciowej stopnia 3
	double tSPZ_st4;///< Czas przerwy beznapięciowej stopnia 4
	double tSPZ_st5;///< Czas przerwy beznapięciowej stopnia 5
	double tSPZow;///< Czas oczekiwania na otwarcie wyłacznika
	double tSPZSCH;///< Czas oczekiwanie na zdjęcie blokady kontroli synchronizmu
	double tSPZ_zal;///< Czas trwania impulsu załączającego
	double tSPZCON;///< Czas oczekiwania na kontynuację cyklu
	double ZZw_ta;///< Czas działania funkcji po zamknięciu wyłącznika
	double ZZw_Ir;///< Prąd identyfikacji otwarcia wyłącznika
	double ZZw_Ur;///< Napięcie identyfikacji otwarcia wyłacznika
	double ZZw_to;///< Czas identyfikacji otwarcia wyłącznika
}__attribute__((__packed__));

struct ZDistL_args
{
	struct ZDistL_io io;
	struct ZDistL_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void ZDistL(void *args, void *logic);
extern void ZDistL_100hz(void *args, void *logic);
extern int ZDistL_initlog(void *arguments, void *logic);

#endif /* ZDISTL_H_ */
