/*
 * ov_3ph.h
 *
 *  Created on: 08-06-2017
 *      Author: Krzysztof Jakubczyk
 */

#ifndef OV_3PH2H_H_
#define OV_3PH2H_H_

#include "tdefs.h"

    struct Nastawy_przeliczone_ov3ph2h
    {
        float limit1_; ///< wartosc rozruchowa
        float limit2_; ///< wartosc powrotu
        u32 t_; ///< 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 or_; ///< logika pobudzen "0" oznacza dzialanie w trybie "and", a "1" w trybie "or"
        float I2h;
        float I2h_powr;
        float I2h_min;
        float Ibezwar;
        float Ibezwar_powr;
        u8 full_period;
    };

	struct dane_wewnetrzne_ov3ph2h
	{
//		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 max1_; // maksymalna watosc wejscia 1 (rejestr tymczasowy - przed zapisem)
		float max2_; // maksymalna watosc wejscia 2 (rejestr tymczasowy - przed zapisem)
		float max3_; // maksymalna watosc wejscia 3 (rejestr tymczasowy - przed zapisem)
		short lp1; ///<licznik filtracji pobudzen faza 1
		short lp2; ///<licznik filtracji pobudzen faza 2
		short lp3; ///<licznik filtracji pobudzen faza 3
		short lp1bezwar; ///<licznik filtracji pobudzen faza 1
		short lp2bezwar; ///<licznik filtracji pobudzen faza 2
		short lp3bezwar; ///<licznik filtracji pobudzen faza 3
		short lp11h; ///<licznik filtracji pobudzen faza 1
		short lp21h; ///<licznik filtracji pobudzen faza 2
		short lp31h; ///<licznik filtracji pobudzen faza 3
		short lp12h; ///<licznik filtracji pobudzen faza 1
		short lp22h; ///<licznik filtracji pobudzen faza 2
		short lp32h; ///<licznik filtracji pobudzen faza 3
	    u32 licz_t_; // licznik czasu od pobudzenia dla przekaznika czasowego
		u8 wsk_rej; // nowy zapis rejestracji parametrow zaklocenia (spelnienie kryterium identyfikacji)
		u8 pob;///< pobudzenie przekaznika
		u8 pob1;///< pobudzenie przekaznika faza 1
		u8 pob2;///< pobudzenie przekaznika faza 2
		u8 pob3;///< pobudzenie przekaznika faza 3

		u8 pob11h;///< pobudzenie przekaznika faza 1
		u8 pob21h;///< pobudzenie przekaznika faza 2
		u8 pob31h;///< pobudzenie przekaznika faza 3

		u8 pob12h;///< pobudzenie przekaznika faza 1
		u8 pob22h;///< pobudzenie przekaznika faza 2
		u8 pob32h;///< pobudzenie przekaznika faza 3

		u8 pob1bezwar;///< pobudzenie przekaznika faza 1
		u8 pob2bezwar;///< pobudzenie przekaznika faza 1
		u8 pob3bezwar;///< pobudzenie przekaznika faza 1

		u8 zad;///< zadzialanie przekaznika
	};

struct ov_3ph2h_logic
{
	u8 *stan_bl;
	u8 stan_bl_bit_no;
	float *I1;
	float *I2;
	float *I3;
	float *I12h;
	float *I22h;
	float *I32h;
	u8 *test;
	u8 test_bit_no;
	u8 *W;
	u8 W_bit_no;
	u8 *Z;
	u8 Z_bit_no;
	u8 *P;
	u8 P_bit_no;
	u8 *PL1;
	u8 PL1_bit_no;
	u8 *PL2;
	u8 PL2_bit_no;
	u8 *PL3;
	u8 PL3_bit_no;
	struct binary_io bl_2h;
	struct binary_io bezwar;

	struct dane_wewnetrzne_ov3ph2h dw;
	struct Nastawy_przeliczone_ov3ph2h nast_;// struktura z parametrami
};

struct ov_3ph2h_io
{
	u32 stan_bl;
	u32 I1_float_in;
	u32 I2_float_in;
	u32 I3_float_in;
	u32 I12h_float_in;
	u32 I22h_float_in;
	u32 I32h_float_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_out;
	u32 bezwar_out;
}__attribute__((__packed__));

struct ov_3ph2h_params
{
	u32 bity; ///< nastawy bitowe;
    double Wr_; ///< wartosc nastawy rozruchowej przekaznika w krotnosciach wartosci znamionowej
    double kp_; ///< wartosc nastawy wspolczynnika powrotu
    double t_; ///< wartosc nastawy czasu dzialania w sekundach
    double I2h;
    double Ibezwar;
    u32 filter_type;
}__attribute__((__packed__));

struct ov_3ph2h_args
{
	struct ov_3ph2h_io io;
	struct ov_3ph2h_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void ov_3ph2h(void *args, void *logic);
extern void ov_3ph2h_100hz(void *args, void *logic);
extern int ov_3ph2h_initlog(void *arguments, void *logic);

#endif /* OV_3PH2H_H_ */
