/*
 * LMZ.h
 *
 *  Created on: 23-05-2017
 *      Author: Krzysztof Jakubczyk
 */

#ifndef LMZ_H_
#define LMZ_H_

#include "tdefs.h"
#include "ZDistA.h"
#include "analog_in.h"

struct zespolona
{
	float r;
	float i;
};

struct Nastawy_przeliczone_LMZ
{
	struct Wyjscia_ZDistA *WYA;
	//R_ZDistL::dane_wewnetrzne *WYL;
	struct zespolona a; //wspólczynnik
	struct zespolona b; //wspólczynnik
	struct zespolona c; //wspólczynnik
  struct zespolona kziem; //wspólczynnik
    u8 on_; ///< wartosc nastawy aktywnosci przekaznika 1- aktywny
    u8 L2t; ///< linia dwutorowa
};

struct dane_probek
{
	struct zespolona IL1; // dane prądu faza 1
	struct zespolona IL2; // dane prądu faza 2
	struct zespolona IL3; // dane prądu faza 3
	struct zespolona Io; // dane prądu zerpwego
	struct zespolona Io2; // dane prądu zerowego toru równoległego
	struct zespolona UL1; //napięcie faza 1
	struct zespolona UL2; //napięcie faza 2
	struct zespolona UL3; //napięcie faza 3
	struct zespolona UL12; //napięcie miedzyfazowe 1-2
	struct zespolona UL23; //napięcie międzyfazowe 2-3
	struct zespolona UL31; //napięcie miedzyfazowe 3-1
};

struct prad_pz
{
	struct zespolona IL1;//bufor pradu z przed zwarcia faza 1
	struct zespolona IL2;//bufor pradu z przed zwarcia faza 2
	struct zespolona IL3;//bufor pradu z przed zwarcia faza 3
};

struct dane_wewnetrzne
{
//		Wyjscia_rejestratora R; ///< dane ostatniego zakłócenia
//		Time czas_; // moment wystapienia zaklocenia (rejestr tymczasowy - przed zapisem)
	short wsk_buf;//aktualne polozenie w buforze próbek (w trakcie rejestracji)
	short wsk_buf_pre;//aktualne polozenie w buforze próbek z przed zwarcia
	short licz1;
	u16 wsk_p; //wskaznik do okreslenia pradu
	float dl_; // dlugosc czasu trwania zaklocenia (rejestr tymczasowy - przed zapisem)
	float odl_b[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*5];//odległość pojedynczej iteracji
	struct dane_probek dp[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*5]; // ortogonalne kanałow wejsciowych
	struct prad_pz Ip[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*3]; //bufor biezacy pamietania probek z przed zwarcia
	struct prad_pz Im[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS]; //bufor pamietania probek z przed zwarcia "zatrzaśnięta"
	u8 P[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*5][6];
	struct zespolona zz;
	struct zespolona zi;
	struct zespolona zu;
	struct zespolona zibis;
	u8 wsk_rej;
};

struct LMZ_logic
{
	struct binary_io WE_ZDistL_Pzf[2];
	float *IoII_orta;
	float *IoII_ortb;
	struct analog_in_params *IoII_params;
	struct binary_io clr;
	struct binary_io P;
	float *distance;
  
	#ifdef LMZ_DEBUG
	float *debug;
	float *debug1;
	float *debug2;
	float *debug3;
	float *debug4;
	#endif

	struct dane_wewnetrzne dw;
	struct Nastawy_przeliczone_LMZ nast_;// struktura z parametrami
	enum rej_ost status_rej_LMZ;
};

struct LMZ_io
{
	u32 we_zdist_ptr_in;
	u32 we_zdistl_p1_in;
	u32 we_zdistl_p1w_in;
	u32 ioii_orta_float_in;
	u32 ioii_ortb_float_in;
	u32 ioii_params_ptr_in;
	u32 clr_in;
	u32 p_out;
	u32 distance_float_out;

	#ifdef LMZ_DEBUG
	u32 debug_out;
	u32 debug1_out;
	u32 debug2_out;
	u32 debug3_out;
	u32 debug4_out;
	#endif

}__attribute__((__packed__));

struct LMZ_params
{
	u32 bity; ///< nastawy bitowe;
    double R1;///< Rezystancja jednostkowa dla składowej zgodnej
	double X1;///<Reaktancja jednostkowa dla składowej zgodnej
	double R0;///<Rezystancja jednostkowa dla składowej zerowej
	double X0;///<Reaktancja jednostkowa dla składowej zerowej
	double Rm;///<Rezystancja jednostkowa dla składowej wzajemnej
	double Xm;///<Reaktancja jednostkowa dla składowej wzajemnej
}__attribute__((__packed__));

struct LMZ_args
{
	struct LMZ_io io;
	struct LMZ_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void LMZ(void *args, void *logic);
extern void LMZ_20hz(void *args, void *logic);
extern int LMZ_initlog(void *arguments, void *logic);

#endif /* LMZ_H_ */
