/*
 * R87L_8.h
 *
 *  Created on: 24-05-2024
 *      Author: Krzysztof Jakubczyk
 */

#ifndef R87L_8_H_
#define R87L_8_H_

#include "tdefs.h"
#include "analog_in.h"
#include "mkstream.h"
#include "Diff.h"

	struct wskazniki_prad_do_kompensacji_87l_8
	{
		float /*struct we_an_diff*/ *Ip[8];
		float /*struct we_an_diff*/ *Im[8];
		float /*struct we_an_diff*/ *Ip_prev[8];
		float /*struct we_an_diff*/ *Im_prev[8];

		float a_p[8][2];
		float a_m[8][2];
		float a_pi0[8];
	};

    struct Nastawy_przeliczone_87_8
    {
		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
		float I2h_min;
		float I5h_min;
		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
		u8 przyspiesz_dzialanie;
		u8 przyjmuj_zadzialania;
		u8 rozwijajace;
	//	u8 test_1str;
		struct wskazniki_prad_do_kompensacji_87l_8 L[3]; ///< wskazniki pradow do wyliczenia skompensowanych wejsc faza 1,2,3
		float a[8];///< wspolczynnik pradu do kompensacji
		struct stream_frame zero_frame;
		float zero;
		float wsp_filtr_sin_[20*2];
		float wsp_filtr_cos_[20*2];
		float wsp_filtr_sin2h_[20*2];
		float wsp_filtr_cos2h_[20*2];
		float wsp_filtr_sin5h_[20*2];
		float wsp_filtr_cos5h_[20*2];
		u8 p2d;
		u8 p3d;
		u8 stream_cnt;
	};

    struct wejscie_wew_87_8
    {
    	float buf_Lr[(MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*2*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[(MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*2*2][24];
    	float Ip[9];
    };

struct r87l_8_logic
{
	struct stream_frame *stream[8];
	struct binary_io streams_ok;
	struct binary_io test;
	struct binary_io stan_bl;
	struct binary_io test_1str;
	struct binary_io W;
	struct binary_io Wf[3];
	struct binary_io Z;
	struct binary_io Zf[3];
	struct binary_io P;
	struct binary_io Pf[3];

	struct Nastawy_przeliczone_87_8 nast_; // struktura z parametrami rozruchowymi

	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;
	struct binary_io blok;
	struct binary_io zezw_w1f;
	struct binary_io przeglad;
	struct binary_io blok_w;
	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;

	struct licz l;
	struct pobudzenia_czastkowe P_;
	struct dane_wewnetrzne_Diff dw;
	enum jaki_uklad jaki_uklad;
//	struct pobudzenia_czastkowe P_;
	struct wejscie_wew_87_8 w;
	float Ir1_;
	float Ir2_;
	float Ir3_;
	float Ih1_;
	float Ih2_;
	float Ih3_;

	float A[8][3];
	float A_prev[8][3];
	u32 *comm_bits;

	u8 n[3];
	u32 licz_t[3];
	u8 my_addr;
	u16 startup_timer;
	u16 przegl_prev[8];
	u16 bits_prev[8];
	u16 no_stream_timer;
	u8 blok_z_zew_prev;

	struct stream_frame *ownstream;
	struct stream_frame *original_stream;
};

struct r87l_8_io
{
	u32 stan_bl_in;
	u32 test_in;
	u32 stream1_ptr_in;
	u32 stream2_ptr_in;
	u32 stream3_ptr_in;
	u32 stream4_ptr_in;
	u32 stream5_ptr_in;
	u32 stream6_ptr_in;
	u32 stream7_ptr_in;
	u32 stream8_ptr_in;
	u32 streams_ok_in;
	u32 zezw_w1f_in;
	u32 przeglad_in;
	u32 test_1str_in;
	u32 ownstream_ptr_in;
	u32 W_out;
	u32 WL1_out;
	u32 WL2_out;
	u32 WL3_out;
	u32 Z_out;
	u32 ZL1_out;
	u32 ZL2_out;
	u32 ZL3_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 blok_out;
	u32 comm_bits_float_out;
	u32 blok_w_out;
}__attribute__((__packed__));


struct r87l_8_params
{
	u32 bity;
	long liczba_jednostek;
	double Iro;///< poczatkowy prad rozruchowy
	double Ir;///< graniczny prad rozruchowy
	double Ihg; ///< graniczny prad stabilizacji
	double Ihp;///< prad hamujacy przegiecia
	double Ihd;///< prad rozruchowy blokady czasowej pradu stabilizujacego
	double tbld; ///< czas blokady dzialania po opuszczeniu strefy blokady czasowej
	double rd; ///< przesuniecie strefy blokady czasowej od strefy dzialania
	double kh1;///< wspolczynnik stabilizacji prosta 2
	double kh2; ///< wspolczynnik stabilizacji prosta 3
	double t;///< czas opoznienia dzialania
	double kp;///< wspolczynnik powrotu
	double k_2h;///< wspolczynnik blokowania druga harmoniczna
	double k_5h;///< wspolczynnik blokowania piata harmoniczna
	u32 adres; //adres wlasnego strumienia danych
}__attribute__((__packed__));

struct r87l_8_args
{
	struct r87l_8_io io;
	struct r87l_8_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void R87L_8(void *args, void *logic);
extern int R87L_8_initlog(void *arguments, void *logic);

#endif
