/*
 * RNT.h
 *
 *  Created on: 14-11-2018
 *      Author: Krzysztof Jakubczyk
 */

#ifndef RNT_H_
#define RNT_H_

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

#define T_STER_RECZNEGO	 	1
#define TP_OP_BLOKADY_NAP	500

enum _stan_man_rnt
{
  	CZEKANIE_NA_STEROWANIE_MANUAL = 0,
	CZEKANIE_NA_STEROWANIE_NR_POZYCJI = 1,
	CZEKANIE_NA_STEROWANIE_AUTO = 2,

   	STEROWANIE_W_GORE = 5,
	IMPULS_W_GORE = 6,
   	SPRAWDZENIE_ODP_PRZE_ZACZEPOW_GORA = 7,

   	STEROWANIE_W_DOL = 11,
	IMPULS_W_DOL = 12,
   	SPRAWDZENIE_ODP_PRZE_ZACZEPOW_DOL = 13,
	
   	KONIEC_STEROWANIA = 20
};


struct Nastawy_przeliczone_rnt
{
	float R1; ///< wartosc rezystancji linii po str. pierwotnej
	float X1; ///< wartosc reaktancji linii po str. pierwotnej
	float R2; ///< wartosc rezystancji linii po str. pierwotnej
	float X2; ///< wartosc reaktancji linii po str. pierwotnej
    short tryb; ///< nastawa trybu działania 0-U1 1-U2 2-średniaU1/U2 3-maxU1/U2
    int t1; ///< opoznienie czasu zadzialania przekaznika
    int t2; ///< opoznienie czasu zadzialania przekaznika

    float dUzr; ///< wartosc rozruchowa do napięcia nieczułości 
    float dUzp; ///< wartosc powrotu do napięcia nieczułości 
	
    float Uz1; ///< wartosc napięcia zadanego nr 1
    float Uz2; ///< wartosc napięcia zadanego nr 2
    float Uz3; ///< wartosc napięcia zadanego nr 3
    float Uz4; ///< wartosc napięcia zadanego nr 4

	int t_imp_ster; /// czas implusu sterującego gora/doł
    int t_ster_zacz; ///< czas maks sterowania
	int t_poz_zacz; /// czas odpowiedzi pozycji zaczepu
	
	float kp; ///< wspolczynnik powrotu dla Uz
	
    u8 on; ///< wartosc nastawy aktywnosci przekaznika 1- aktywny
	u8 kon_biegu; /// kontrola biegu sterowania przełącznikiem zaczepów (wg dodatkowego wejscia BIEG)
	u8 kon_poz_ster; /// kontrola pozycji zaczepu przy sterowaniu (porównanie nr zaczepu przed i po sterowaniu)
	u8 akt_kon_U1; /// kontrola zabezpieczenia pomiaru U1
	u8 akt_kon_U2; /// kontrola zabezpieczenia pomiaru U2
	u8 akt_kon_Uzacz; /// kontrola zabezpieczenia napięcia zaczepu
	u8 akt_blok_biegu; /// aktywnosc blokady od biegu przełącznika zaczepów
	u8 akt_blok_pozycja; /// aktywnosc blokady od niewlasciwej pozycji zaczepu po sterowaniu
	u8 akt_mfazowe; /// aktywne pomiary między fazowe
	
    u8 akt_komp1; ///< czy kompensacja 1 jest aktywana 1-aktywana
    u8 akt_komp2; ///< czy kompensacja 2 jest aktywana 1-aktywana

    u8 bl; ///< wartosc nastawy aktywnosci blokady dzialania 1- blokada aktywna
};

struct Wejscie_rnt
{
    float orta_U1_; ///< ortogonalna a napięcia  wejsciowego U1
    float ortb_U1_; ///< ortogonalna b napięcia  wejsciowego U1
    float kwampl_U1_; ///< kwadrat amplitudy prądu
	float orta_I1_;///< ortogonalna a prądu wejsciowego I1
	float ortb_I1_;///< ortogonalna b prądu wejsciowego I1
	float kwampl_I1_;///< kwadrat amplitudy prądu
    float orta_U2_; ///< ortogonalna a napięcia  wejsciowego U2
    float ortb_U2_; ///< ortogonalna b napięcia  wejsciowego U2
    float kwampl_U2_; ///< kwadrat amplitudy napięcia 
	float orta_I2_;///< ortogonalna a prądu wejsciowego I1
	float ortb_I2_;///< ortogonalna b prądu wejsciowego I1
	float kwampl_I2_;///< kwadrat amplitudy prądu

	float nr_zacz_;///nr zaczepu z przełącznika trafo
	float nr_zacz_zad;///nr zaczepu z przełącznika trafo

};

struct dane_wewnetrzne_rnt
{

	u8 zacz_w_gore;
	u8 zacz_w_dol;
	u8 blokada_trw;
	u8 blokada_ster_gora;
	u8 blokada_ster_dol;
	u8 pob_G; //pobudzenie automatyki G
	u8 pob_D; //pobudzenie automatyki D
	short lp_G; //licznik pobudzenia G
	short lp_D; //licznik pobudzenia D
	u8 byl_bieg;
	int timer_blokad_pod_nap1;
	int timer_blokad_pod_nap2;
};

struct rnt_logic
{
	struct binary_io stan_bl_;
	struct binary_io man_;
	struct binary_io auto_;

	float *orta_U1_;
	float *ortb_U1_;
	float *kwampl_U1_;
	struct binary_io kon_U1_;

	float *orta_I1_;
	float *ortb_I1_;
	float *kwampl_I1_;


	float *orta_U2_;
	float *ortb_U2_;
	float *kwampl_U2_;
	struct binary_io kon_U2_;

	float *orta_I2_;
	float *ortb_I2_;
	float *kwampl_I2_;

	float *nr_zacz_;
	struct binary_io kon_u_nr_zacz_;
	struct binary_io zo_zacz_;

	struct binary_io gora_;
	struct binary_io dol_;
	struct binary_io bieg_;
	struct binary_io aktU1z_;
	struct binary_io aktU2z_;
	struct binary_io aktU3z_;
	struct binary_io aktU4z_;

	struct binary_io bl_gora_;
	struct binary_io bl_dol_;

	struct binary_io test_;
	struct binary_io kas_;
	
	struct binary_io blok_trw_;
	
	

	struct binary_io gora_out_;
	struct binary_io dol_out_;

	struct binary_io e_bieg_out_;
	struct binary_io e_poz_out_;
	struct binary_io zaczep_min;
	struct binary_io zaczep_max;

	struct binary_io pob_G;
	struct binary_io pob_D;

	struct binary_io blok_out_;
	struct binary_io blok_trw_out_;
	struct binary_io blad_trybu_out_;

	struct binary_io ster_poz_;

	float *nr_zacz_zad;

	float *U_odn;//napięcie odniesienia
	float *tg_out;//czas do przełączenia w górę
	float *td_out;//czas do przełączenia w dół

	struct Nastawy_przeliczone_rnt nast_;
	struct dane_wewnetrzne_rnt dw;
	struct Wejscie_rnt w;

    enum _stan_man_rnt _stan_man;
	u32 licznik_ster_gora;
	u32 licznik_ster_dol;
	u32 licznik_poz_gora;
	u32 licznik_poz_dol;
	u32 licznik_ster_biegu;
	
	u8 nr_zaczepu_przed_ster; //nr zaczepu przed sterowaniem
	float licz_t1G;
	int licz_t2G;
	float licz_t1D;
	int licz_t2D;

	struct analog_in_params *I_params[2];
	struct analog_in_params *U_params[2];

	float mul[2];
	
	
};

struct rnt_io
{
	u32 stan_bl_in;
	u32 man_in;
	u32 auto_in;
	
	u32 orta_U1_float_in;
	u32 ortb_U1_float_in;
	u32 kwampl_U1_float_in;
	u32 U1_params_ptr_in;
	u32 kon_U1_in;
	u32 orta_I1_float_in;
	u32 ortb_I1_float_in;
	u32 kwampl_I1_float_in;
	u32 I1_params_ptr_in;
	
	u32 orta_U2_float_in;
	u32 ortb_U2_float_in;
	u32 kwampl_U2_float_in;
	u32 U2_params_ptr_in;
	u32 kon_U2_in;
	u32 orta_I2_float_in;
	u32 ortb_I2_float_in;
	u32 kwampl_I2_float_in;
	u32 I2_params_ptr_in;
	
	u32 nr_zacz_in;
	u32 zo_zacz_in;
	u32 kon_u_nr_zacz_in;

	u32 bieg_in;

	u32 gora_in;
	u32 dol_in;

	u32 aktU1z_in;
	u32 aktU2z_in;
	u32 aktU3z_in;
	u32 aktU4z_in;

	u32 bl_gora_in;
	u32 bl_dol_in;

	u32 test_in;
	u32 kas_in;

	u32 ster_poz_in;
	u32 zad_zacz_in;
	u32 blok_trw_in;

	u32 gora_out;
	u32 dol_out;
	u32 e_bieg_out;
	u32 e_poz_out;

	u32 pob_G_out;
	u32 pob_D_out;
	u32 Uodn_float_out;
	u32 tg_out;
	u32 td_out;
	u32 blok_out;
	u32 blok_trw_out;
	u32 blad_trybu_out;
	
}__attribute__((__packed__));

struct rnt_params
{
	u32 akt; ///< nastawy bitowe;
    u32 tryb; ///< wybór trybu regulacji (0=U1/1=U2/2=średnia U1 z U2/3=maksymalna U1 lub U2)
	u32 akt_komp1; ///< nastawy bitowe;
    double R1; ///< rezystancja linii 1 w wart. pier 
    double X1; ///< reaktanacja linii 1 w wart. pier
	u32 akt_komp2; ///< nastawy bitowe;
    double R2; ///< rezystancja linii 2 w wart. pier
    double X2; ///< reaktanacja linii 2 w wart. pier
	
    double t1; ///< wartosc nastawy czasu dzialania ch-ki zależnej w sekundach stopień 1
    double t2; ///< wartosc nastawy czasu dzialania ch-ki niezależnej w sekundach stopień 2
    double dUz; ///< dopuszczalne napięcie nieczułości
    double kp; ///< współczynnik powrotu dla dUz

    double Uz1; ///< zadane napięcie nr 1
    double Uz2; ///< zadane napięcie nr 2
    double Uz3; ///< zadane napięcie nr 3
    double Uz4; ///< zadane napięcie nr 4

    double t_imp_ster; ///< wartosc nastawy impulsu sterującego
    double t_ster_zacz; ///< wartosc nastawy max. czasu sterowania zaczepu 
    double t_poz_zacz; ///< wartosc nastawy max. czasu rekacji nr zaczepu 


}__attribute__((__packed__));

struct rnt_args
{
	struct rnt_io io;
	struct rnt_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void rnt(void *args, void *logic);
extern void rnt_100hz(void *args, void *logic);
extern void rnt_20hz(void *args, void *logic);
extern int rnt_initlog(void *arguments, void *logic);



enum _tryb_pracy_rnt
{
  	U1 = 0,
   	U2 = 1,
   	sredniaU1U2 = 2,
   	maxU1U2 = 3
};


#endif /* RNT_H_ */
