/*
 * e_mem.h
 *
 *  Created on: 22-03-2017
 *      Author: Krzysztof Jakubczyk
 */

#ifndef E_MEM_H_
#define E_MEM_H_

#include "tdefs.h"

typedef enum
{
    oczekiwanie_na_OK = 0,
    napiecie_OK_0,
    napiecie_OK_1,
    napiecie_z_pamieci_0,
    napiecie_z_pamieci_1
} typ1;

struct dane_probki
{
	float minus1; //probka poprzednia
	float bie; // probka biezaca
	float reszta; //reszta z poprzedniego przejscia przez zero
	float T_last; //poprzednio wyliczona wartosc okresu
	unsigned short il_p;	//ilosc pelnych okresow probkowania pomiedzy przejsciami przez zero
	u8 flag; //flaga wykrycia nowego przejscia przez zero
};

struct danef
{
	struct dane_probki plus; //
	struct dane_probki minus;
	float minus1;
	unsigned short plus_il_p;
	unsigned short minus_il_p;
};

struct wartosc_T
{
	float T;
	u8 OK;
};

struct wejscie_e_mem
{
    float orta_; ///< skladowa ortogonalna a
    float ortb_; ///< skladowa ortogonalna b
    float kwampl_;///< kwadrat wartosci skutecznej skladowej podstawowej
};

struct wyjscie_e_mem
{
     u8 memory_OK_; ///< wyjscie aktywne - dane sprawne
     u8 memory_ON_; ///< wyjscie z pamieci napieciowej
     float orta_; ///< skladowa ortogonalna a wyniku
     float ortb_; ///< skladowa ortogonalna b wyniku
     float kwampl_;///< kwadrat amplitudy wyniku
};

struct Nastawy_przeliczone_e_mem
{
    float Ur_; ///< wartosc rozruchowa napiecia
    float Up_; ///< wartosc powrotu napiecia
    unsigned short licz_t_; ///< ilosc petli dla odliczenia czasu dzialania pamieci
};

struct e_mem_logic
{
	float *orta;
	float *ortb;
	float *esk;
	struct binary_io memory_OK;
	struct binary_io memory_ON;
	float *orta_out;
	float *ortb_out;
	float *esk_out;

	struct Nastawy_przeliczone_e_mem nast_; //wartosci blokady pomiaru czestotliwosci
    float buf_orta[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*2][2]; // bufor ortogonalnej a
    float buf_ortb[MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS*2][2]; // bufor ortogonalnej B
    float korekcja_orta; // ortogonalna a wektora korekcji odstepstwa czestotliwosci
    float korekcja_ortb; // ortogonalna b wektora korekcji odstepstwa czestotliwosci
    short idx_buf; // indeks polozenia w buforze pamieci dla zapisywania danych
    short idx_buf1; // indeks polozenia w buforze pamieci dla czytania danych
    short idx_buf_start; // index polozenia w buforze w momencie startu oczytu z pamieci
    typ1 stan_pamieci; // okreslenie stanu algorytmu pracy napiecia
    unsigned short licznik_czasu; // naliczanie czasu aktywnosci pamieci napieciowej
    short licz_pow; // licznik powtorzen dla napiecia
    u8 U_OK;
	float f_kor;
	float f_kor_new;
	unsigned short index_buf_T;
	struct wartosc_T buf_T[20];
	struct wartosc_T f;
	struct danef dane;
	struct wejscie_e_mem w;
	struct wyjscie_e_mem stan_;
};

struct e_mem_io
{
	u32 orta_float_in;
	u32 ortb_float_in;
	u32 esk_float_in;
	u32 memory_ok_out;
	u32 memory_on_out;
	u32 orta_float_out;
	u32 ortb_float_out;
	u32 esk_float_out;
}__attribute__((__packed__));

struct e_mem_params
{
	double napiecie_;
	double czas_;
}__attribute__((__packed__));

struct e_mem_args
{
	struct e_mem_io io;
	struct e_mem_params params;
//	u16 crc;
}__attribute__((__packed__));

extern void e_mem(void *args, void *logic);
extern void e_mem_100hz(void *args, void *logic);
extern int e_mem_initlog(void *arguments, void *logic);

#endif /* E_MEM_H_ */
