/*
 * e_du.c
 *
 *  Created on: 29-06-2016
 *      Author: Krzysztof Jakubczyk
 *
 *      Wylicza zmiany napiecia w nastawionym czasie
 *
 *
 */

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

#include "e_du.h"
#include "e_mem1.h"
#include <math.h>

int e_du_initlog(void *arguments, void *logic)
{
	struct e_du_args *args = (struct e_du_args *)arguments;
	struct e_du_logic *log = (struct e_du_logic *)logic;

	u32 *buf_ptr;

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

	buf_ptr = (u32 *)(log_manager.nets_data + (args->io.buf_ptr_in >> 3));
	if((u8*)buf_ptr > (log_manager.nets_data+sizeof(log_manager.nets_data) - sizeof(void *)))
		return -1;

	log->we = (struct e_mem1_wyjscie *)*buf_ptr;

	if(!*buf_ptr)
		return -1;

	log->ok_ptr = log_manager.nets_data + (args->io.ok_out >> 3);
	log->ok_bit_no = args->io.ok_out & 0x07;

	if(log->ok_ptr >= (log_manager.nets_data+sizeof(log_manager.nets_data)))
		return -1;

    // wyliczanie polozenia wlasciwych wartosci w pamieci
    log->ofset_ = (int16_t)((args->params.czas_ -16) / 0.4);
    if(args->params.czas_ < 16)
    {
        log->zakres_ = e_du_od8do16;
        log->ofset_ = (int16_t)((args->params.czas_ - 8) / 0.2);
    }
    if(args->params.czas_ < 8)
    {
        log->zakres_ = e_du_od4do8;
        log->ofset_ = (int16_t)((args->params.czas_ - 4) / 0.1);
    }
    if(args->params.czas_ < 4)
    {
        log->zakres_ = e_du_mniej4;
        log->ofset_ = (int16_t)(args->params.czas_ / 0.05);
    }
	log->czas = (int16_t)(100*args->params.czas_);
	log->Ubl_ = args->params.Ubl_;
    //
	log->fczas = args->params.czas_;

	return 0;
}

void e_du_20hz(void *arguments, void *logic)
{
	struct e_du_logic *log = (struct e_du_logic *)logic;
	struct e_mem1_wyjscie *w = log->we;

	u8 OK;
	float kwampl;
    short temp;

	if (w->czas_>=log->czas) OK = 1; else OK =0;
	if (w->srednia_50ms_[w->idx_50ms_] < log->Ubl_) OK = 0;

	switch(log->zakres_)// wyliczanie w zaleznosci od zakresu nastawy czasu
    {
        case e_du_mniej4:
            temp = w->idx_50ms_ - log->ofset_; // wyliczenie indeksu tablicy dla danej chwili czasu
            if(temp<0) temp += 80; // uwzglednienie "przekrecania" bufora"
            kwampl = w->srednia_50ms_[w->idx_50ms_] - w->srednia_50ms_[temp];//wyliczenie wartosci wyjsciowej roznicy napiecia
			if (w->srednia_50ms_[temp] < log->Ubl_) OK = 0;
            break;
        case e_du_od4do8:
            temp = w->idx_100ms_ - log->ofset_;// wyliczenie indeksu tablicy dla danej chwili czasu
            if(temp<0) temp += 40;// uwzglednienie "przekrecania" bufora"
            kwampl = w->srednia_50ms_[w->idx_50ms_] - w->srednia_100ms_[temp];//wyliczenie wartosci wyjsciowej roznicy napiecia
			if (w->srednia_100ms_[temp] < log->Ubl_) OK = 0;
            break;
        case e_du_od8do16:
            temp = w->idx_200ms_ - log->ofset_;// wyliczenie indeksu tablicy dla danej chwili czasu
            if(temp<0) temp += 40;// uwzglednienie "przekrecania" bufora"
            kwampl = w->srednia_50ms_[w->idx_50ms_] - w->srednia_200ms_[temp];//wyliczenie wartosci wyjsciowej roznicy napiecia
			if (w->srednia_200ms_[temp] < log->Ubl_) OK = 0;
            break;
        case e_du_od16do30:
            temp = w->idx_400ms_ - log->ofset_;// wyliczenie indeksu tablicy dla danej chwili czasu
            if(temp<0) temp += 36;// uwzglednienie "przekrecania" bufora"
            kwampl = w->srednia_50ms_[w->idx_50ms_] - w->srednia_400ms_[temp]; //wyliczenie wartosci wyjsciowej roznicy napiecia
			if (w->srednia_400ms_[temp] < log->Ubl_) OK = 0;
            break;
    }

	if (!OK)
	{
		*log->ok_ptr&=~(1<<log->ok_bit_no);
		kwampl = 0;
	}
	else
	{
		*log->ok_ptr|=(1<<log->ok_bit_no);
	}

	*log->esk_ptr = kwampl;
}
