/*
 * e_mem1.c
 *
 *  Created on: 23-06-2016
 *      Author: Krzysztof Jakubczyk
 *
 *      Pamieta wartosci amplitudy z ostatnich 30 sekund oraz wylicza calke z amplitudy przebiegu w zadanym oknie pomiarowym
 *
 */

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

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

int e_mem1_initlog(void *arguments, void *logic)
{
	struct e_mem1_args *args = (struct e_mem1_args *)arguments;
	struct e_mem1_logic *log = (struct e_mem1_logic *)logic;

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

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

	*log->buf_ptr = (u32)&log->wy;

    log->srednia_temp = 0;
    log->licznik_petli_1000Hz = 0;
    log->licznik_petli_100Hz = -2; // po starcie dluzsze o dwie petle oczekiwanie na gotowosc pierwszego wyniku

	return 0;
}

void e_mem1(void *arguments, void *logic)
{
	struct e_mem1_logic *log = (struct e_mem1_logic *)logic;

    uint16_t local = log->licznik_petli_1000Hz / 10; // wskaznik polozenia w buforze srednich za 10 ms

	log->srednia_temp += *log->esk_ptr; // wyliczanie sumy za pol okresu
    log->licznik_petli_1000Hz++;
    uint16_t local1 = log->licznik_petli_1000Hz % 10;

    if(!local1)    //jesli jest wielokrotnosc 10 probek to naliczenie nowego polokresu
    {
        log->srednia_z_10ms[local] = log->srednia_temp * 0.1f;
        log->srednia_temp = 0;
    }

    if(log->licznik_petli_1000Hz == 50) // "przekrecenie" bufora
    {
        log->licznik_petli_1000Hz = 0;
    }
}

void e_mem1_100hz(void *arguments, void *logic)
{
	struct e_mem1_logic *log = (struct e_mem1_logic *)logic;


	unsigned short i;
	short index;

	log->licznik_petli_100Hz++;

	if(log->licznik_petli_100Hz > 4) // nowy wynik dla zakresu z okresem 50ms
	{
		log->licznik_petli_100Hz = 0;
	    // obsluga pamieci z zakresu 4 - 8s
	    if(log->wy.idx_50ms_ % 2)
	    {
	    	// obsluga pamieci z zakresu 8 - 16s
		    if(log->wy.idx_100ms_ % 2)
		    {
		    	// obsluga pamieci z zakresu 16 - 30s
			    if(log->wy.idx_200ms_ % 2)
			    {
			    	log->wy.idx_400ms_++;
			        if(log->wy.idx_400ms_>35)
			        	log->wy.idx_400ms_ = 0;

	                index = log->wy.idx_200ms_ + 1;
	                if (index>39)
	                  	index = 0;
			        log->wy.srednia_400ms_[log->wy.idx_400ms_] = log->wy.srednia_200ms_[index];
	                index++;
	                if (index>39)
	                	index = 0;
	                log->wy.srednia_400ms_[log->wy.idx_400ms_] += log->wy.srednia_200ms_[index];
	                log->wy.srednia_400ms_[log->wy.idx_400ms_] /= 2;
			    }
			    //

	            log->wy.idx_200ms_++;
	            if(log->wy.idx_200ms_>39)
	            	log->wy.idx_200ms_ = 0;

	            index = log->wy.idx_100ms_ + 1;

	            if (index>39)
	            	index = 0;

	            log->wy.srednia_200ms_[log->wy.idx_200ms_] = log->wy.srednia_100ms_[index];
	            index++;

	            if (index>39)
	            	index = 0;

	            log->wy.srednia_200ms_[log->wy.idx_200ms_] += log->wy.srednia_100ms_[index];
                log->wy.srednia_200ms_[log->wy.idx_200ms_] /= 2;
		    }
		    //

	        log->wy.idx_100ms_++;

	        if(log->wy.idx_100ms_>39)
	        	log->wy.idx_100ms_ = 0;

	        index = log->wy.idx_50ms_ + 1;

	        if (index>79)
	        	index = 0;

	        log->wy.srednia_100ms_[log->wy.idx_100ms_] = log->wy.srednia_50ms_[index];
            index++;

            if (index>79)
            	index = 0;

            log->wy.srednia_100ms_[log->wy.idx_100ms_] += log->wy.srednia_50ms_[index];
	        log->wy.srednia_100ms_[log->wy.idx_100ms_] /= 2;
	    }
	    //
	    // obsluga pamieci z zakresu 0 - 4s
	    log->wy.idx_50ms_++;

	    if(log->wy.idx_50ms_>79)
	    	log->wy.idx_50ms_ = 0;

	    log->wy.srednia_50ms_[log->wy.idx_50ms_] = 0;

	    for (i=0;i<5;i++)    //wyliczenie sredniej za okres 50 ms;
	    {
	    	log->wy.srednia_50ms_[log->wy.idx_50ms_]+= sqrt(log->srednia_z_10ms[i]);
	    }

	    log->wy.srednia_50ms_[log->wy.idx_50ms_] /= 5;
	    //
    }
    log->wy.czas_++;
	if(log->wy.czas_>3000)
		log->wy.czas_ = 3000;
}
