/*
 * R_67N_LWN.h
 *
 *  Created on: 19-07-2016
 *      Author: Krzysztof Jakubczyk
 */

#ifndef R_67N_LWN_H_
#define R_67N_LWN_H_

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

#define R67N_L_AKT	 	0x0040
#define R67N_L_NADP1 	0x0080
#define R67N_L_NADP2 	0x0100
#define R67N_L_ECHO  	0x0200
#define R67N_L_ECHO_WYL 0x0400
#define R67N_L_BLOK		0x0800
#define R67N_L_ODWR_PR	0x1000

struct Wyjscia_rejestratora_lwn
{
            float max_I_;///< maksymalna watosc pradu w czasie zaklocenia w krotnosciach warotosci znamionowej
            float max_U_;///< watosc napiecia w czasie zaklocenia w krotnosciach warotosci znamionowej
            float max_kat_; ///< watosc kata w czasie zaklocenia w stopniach
			float I1; ///< prad fazy L1
			float I2; ///< prad fazy L2
			float I3; ///< prad fazy L3
			float Io2h; ///< prąd drugiej harmonicznej
};


struct Nastawy_przeliczone_lwn
{
	float Ir1; ///< wartosc rozruchowa pradu stopień 1
    float Ip1; ///< wartosc powrotu pradu rozruchowego stopień 1
    float Ir2; ///< wartosc rozruchowa pradu stopień 2
    float Ip2; ///< wartosc powrotu pradu rozruchowego stopień 2
	float kh1; ///< wspólczynnik stabilizacji zadziałania stopień 1
	float kh2; ///< wspólczynnik stabilizacji zadziałania stopień 2
	float khp1; ///< wspolczynnik stabilizacji dla powrotu stopień 1
	float khp2; ///< wspolczynnik stabilizacji dla powrotu stopień 2
	float I1_2hr; ///< wartość rozruchowa blokady drugiej harmonicznej stopień 1
	float I1_2hr_powr; ///< wartość rozruchowa blokady drugiej harmonicznej stopień 1
    float U_echo; ///< wartosc rozruchowa echa
    float Ur; ///< wartosc rozruchowa napiecia blokady
    float Up; ///< wartosc powrotu napiecia blokady
    float orta; ///< ortogonalna a dla wektora nasatwy kata charakterystycznego
    float ortb; ///< ortogonalna b dla wektora nasatwy kata charakterystycznego
    short dir; ///< nastawa kierunku 2 - do przodu; 1 - w obu kierunkach; 0 - do tylu
    int t1; ///< opoznienie czasu zadzialania przekaznika
    int t2; ///< opoznienie czasu zadzialania przekaznika
    u8 on_; ///< wartosc nastawy aktywnosci przekaznika 1- aktywny
    u8 w1; ///< wartosc nastawy dzialania na wylaczeniee 1 - wylaczenie 0 - tylko sygnalizacja
    u8 w2; ///< wartosc nastawy dzialania na wylaczeniee 1 - wylaczenie 0 - tylko sygnalizacja
    u8 bl_; ///< wartosc nastawy aktywnosci blokady dzialania 1- blokada aktywna
	u8 t0_1; ///< przekaźnik bezzwłoczny stopień 1
	u8 t0_2; ///< przekaźnik bezzwłoczny stopień 2
	u8 Bl_2h1_ON; ///< Włączenie blokady od drugiej harmonicznej w stopniu 1
	u8 Bl_2h2_ON; ///< Włączenie blokady od drugiej harmonicznej w stopniu 2
	u32 l_nad_time;
	u32 t1_min;
	u32 t2_min;
	u32 l_t_blok;
};

struct Wejscie_lwn
{
    float orta_I_; ///< ortogonalna a pradu wejsciowego Io
    float ortb_I_; ///< ortogonalna b pradu wejsciowego Io
    float kwampl_I_; ///< kwadrat amplitudy prądu
    float orta_U_; ///< ortogonalna b napiecia wejsciowego Uo
    float ortb_U_; ///< ortogonalna b napiecia wejsciowego Uo
    float kwampl_U_; ///< kwadrat amplitudy napiecia
	float IL1; ///< kwadrat amplitudy prądu faza L1
	float IL2; ///< kwadrat amplitudy prądu faza L2
	float IL3; ///< kwadrat amplitudy prądu faza L3
	float Io2h;///< kwadrat amplitudy drugiej harmonicznej składowej zerowej prądu
};

struct dane_wewnetrzne_lwn
{
	struct Wyjscia_rejestratora_lwn R; ///< dane ostatniego zaklocenia
	long long czas_; // moment wystapienia zaklocenia (rejestr tymczasowy - przed zapisem)
	u32 dl_; // dlugosc czasu trwania zaklocenia (rejestr tymczasowy - przed zapisem)
	u8 wsk_rej; // nowy zapis rejestracji parametrow zaklocenia (spelnienie kryterium identyfikacji)

	float max_I;///< maksymalna watosc pradu w czasie zaklocenia w krotnosciach warotosci znamionowej
    float max_U;///< watosc napiecia w czasie zaklocenia w krotnosciach warotosci znamionowej
    float max_kat; ///< watosc kata w czasie zaklocenia w stopniach
	float I1; ///< prad fazy L1
	float I2; ///< prad fazy L2
	float I3; ///< prad fazy L3
	float Io2h;///< prad drugiej harmonicznej

	float max_orta_I;
	float max_ortb_I;
	float max_orta_U;
	float max_ortb_U;

	short lp1;///< licznikpobudzen stopień 1
	short lp2;///< licznikpobudzen stopień 2
	short lp3;///< licznikpobudzen I0 do echa
	short lp4;///< licznikpobudzen w LRC
	int lt1;
	int lt2;
	u8 Podwr;
	u8 PI0; // pobudzenie i0 do echa
	u8 P; // pobudzenie i0 do echa
	u8 P1;
	u8 P2;
	u8 Z;
	u8 Z1;
	u8 Z2;
	u8 P_U;
	u8 Bl_2h1;
	u8 Bl_2h2;
	u8 kierunek;
	u8 Z_last;
};

struct r_67n_lwn_logic
{
	struct binary_io stan_bl_;

	float *orta_I_;
	float *ortb_I_;
	float *kwampl_I_;

	float *orta_U_;
	float *ortb_U_;
	float *kwampl_U_;

	float *IL1;
	float *IL2;
	float *IL3;
	float *Io2h;

	struct binary_io test;
	struct binary_io l_odb;
	struct binary_io l_ok;
	struct binary_io W;
	struct binary_io Z1;
	struct binary_io Z2;
	struct binary_io P1;
	struct binary_io P2;
	struct binary_io kier;
	struct binary_io NRL;

	struct Nastawy_przeliczone_lwn nast_;
	struct dane_wewnetrzne_lwn dw;
	struct Wejscie_lwn w;

	u8 l_echo;
	u8 skr_t1;
	u8 skr_t2;
	u8 l_blok_wyl;
	u32 l_nad_cnt;
};

struct r_67n_lwn_io
{
	u32 stan_bl_in;
	u32 orta_I_float_in;
	u32 ortb_I_float_in;
	u32 kwampl_I_float_in;
	u32 orta_U_float_in;
	u32 ortb_U_float_in;
	u32 kwampl_U_float_in;
	u32 IL1_float_in;
	u32 IL2_float_in;
	u32 IL3_float_in;
	u32 Io2h_float_in;
	u32 test_in;
	u32 l_odb_in;
	u32 l_ok_in;
	u32 w_out;
	u32 z1_out;
	u32 z2_out;
	u32 p1_out;
	u32 p2_out;
	u32 kier_out;
	u32 NRL_out;
}__attribute__((__packed__));

struct r_67n_lwn_params
{
	u32 bity; ///< nastawy bitowe;
    u32 dir; ///< nastawa kierunku dzialania przekaznika
    double U; ///< napiecie rozruchowe przekaznika w krotnosciach wartosci znamionowej
    double kat; ///< wartosc nastawy kata charakterystycznego w stopniach
    double I1; ///< prad rozruchowy przekaznika stopien 1
    double I2; ///< prad rozruchowy przekaznika stopien 2
	double kh1; ///< współczynnik stabilizacji stopień 1
	double kh2; ///< współczynnik stabilizacji stopień 2
    double t1; ///< wartosc nastawy czasu dzialania w sekundach stopiń 1
    double t2; ///< wartosc nastawy czasu dzialania w sekundach stopiń 2
    double t1_min; // czas t1 przy skróceniu
    double t2_min; // czas t1 przy skróceniu
	double Io2h1; ///<Prąd blokady drugiej harmonicznej
    double kp; ///< wartosc nastawy wspolczynnika
    double L_t_nad;
    double L_U_echo;
    double L_T_odwr;
}__attribute__((__packed__));

struct r_67n_lwn_args
{
	struct r_67n_lwn_io io;
	struct r_67n_lwn_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void r_67n_lwn(void *args, void *logic);
extern void r_67n_lwn_100hz(void *args, void *logic);
extern void r_67n_lwn_20hz(void *args, void *logic);
extern int r_67n_lwn_initlog(void *arguments, void *logic);

#endif /* R_67N_LWN_H_ */
