/*
 * e_avg_1t.c
 *
 *  Created on: 17-05-2016
 *      Author: Krzysztof Jakubczyk
 */

#include "tdefs.h"
#include "misc.h"

#include "e_avg_1t.h"
#include "analog_in.h"
#include <math.h>
#include <string.h>

int e_avg_1t_initlog(void *arguments, void *logic)
{
	struct e_avg_1t_args *args = (struct e_avg_1t_args *)arguments;
	struct e_avg_1t_logic *log = (struct e_avg_1t_logic *)logic;

//	an_params=(struct analog_in_params *)*an_params_ptr;

	log->probka_ptr = (float *)(log_manager.nets_data + (args->io.probka_float_in >> 3));
	if((u8 *)log->probka_ptr > (log_manager.nets_data + sizeof(log_manager.nets_data) - sizeof(float)))
		return -1;

	log->avg_t_ptr = (float *)(log_manager.nets_data + (args->io.avg_t_float_out >> 3));
	if((u8 *)log->avg_t_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(float)))
		return -1;

    memset(&log->plus, 0x00, sizeof(log->plus));
    memset(&log->minus, 0x00, sizeof(log->minus));
	log->licz_zero = 0;
    memset(&log->stan_, 0x00, sizeof(log->stan_)); // zerowanie wyjsc

	return 0;
}

wylicz_f(struct e_avg_1t_logic *log, struct e_avg_1t_dane_wew *d)
{
    float dopelnienie;
    float okres;


    //wyliczenie okresu pojedynczej iteracji
    dopelnienie = log->probka_n_minus1 / (log->probka_n_minus1 - log->probka_n_);
    okres = dopelnienie + d->reszta_ + d->il_p_;
    log->stan_.n++; // zmiana znaczika przejscia przez zero
    //

    log->stan_.Usr = d->war_sr_ / okres; //wartosc srednia wyprostowana
    log->stan_.Uperf = d->war_sr_;// wyliczenie ilorazu wartosci sredniej wyprostowanej z czestotliwoscia
	log->stan_.T = okres;// okres przebiegu w ilosciach probek

    d->reszta_ = 1 - dopelnienie;
    d->war_sr_ = 0; //zerowanie licznika wartosci sredniej wyprostowanej przy przejsciu przez zero
    d->il_p_ = 0;//zerowanie licznika pelnych probek(odliczanie nowego okresu)
}

void e_avg_1t(void *arguments, void *logic)
{
	struct e_avg_1t_args *args = (struct e_avg_1t_args *)arguments;
	struct e_avg_1t_logic *log = (struct e_avg_1t_logic *)logic;

    u8 przejscie_z_plusa = 0;
    u8 przejscie_z_minusa = 0;

	log->probka_n_ = *log->probka_ptr;/* * (float)1.1107;*/

    //szukanie przejsc przez zero
	if ((log->probka_n_minus1 <0 ) && (log->probka_n_ >= 0)) przejscie_z_minusa = 1;
	if ((log->probka_n_minus1 >0 ) && (log->probka_n_ <= 0)) przejscie_z_plusa = 1;

	//

	if(fabs(log->probka_n_)< 0.01) log->licz_zero++; else log->licz_zero = 0;

	if (log->plus.il_p_> ((MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10) || log->minus.il_p_ > ((MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10) || log->licz_zero > (MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS))
	{
		log->licz_zero = 0;
		log->stan_.n++; // zmiana znaczika przejscia przez zero
		log->stan_.Usr = 0; //wartosc srednia wyprostowana
		log->stan_.Uperf = 0;// wyliczenie ilorazu wartosci sredniej wyprostowanej z czestotliwoscia
		log->stan_.T = (MAIN_FREQ_PERIOD_MS/LOOP_CYCLE_MS)*10+1;// okres przebiegu w ilosciach probek
		log->plus.il_p_ = 0;
		log->minus.il_p_ = 0;
	}

    log->plus.war_sr_ +=fabs(log->probka_n_); //wyliczanie wartosci sredniej wyprostowanej za okres dla okresu od przejscia z plusa
    log->minus.war_sr_ +=fabs(log->probka_n_); //wyliczanie wartosci sredniej wyprostowanej za okres dla okresu od przejscia z minusa

    if(przejscie_z_plusa)
    {
        wylicz_f(log,&log->plus); // wyliczenie nowej czestotliwosci
    } else log->plus.il_p_++;

    if(przejscie_z_minusa)
    {
        wylicz_f(log,&log->minus); //wyliczenie nowej czestotliwosci
    } else log->minus.il_p_++;

    log->probka_n_minus1 = log->probka_n_;//zapamietanie poprzedniej probki

	//wskazniki[nast.adr.bufor] = (void *)&stan_;

	if(args->io.avg_t_float_out)
		*log->avg_t_ptr=log->stan_.Usr;

}
