// Fifo.cpp: implementation of the Fifo class.

//

//////////////////////////////////////////////////////////////////////



#include "Fifo.h"

#include <stdio.h>

#include <math.h>



//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////



Fifo::Fifo(int siz) { 

	size=siz; 

	fifo = (unsigned char*) malloc(sizeof(unsigned char)*size); 

	iter=0; 

	for (int i=0; i<size; i++) 
		fifo[i]=0;
}

float Fifo::mean()
{
	int sum = 0;

	for(int i=0; i<size; i++) {
		sum += fifo[i]; 
	}

	return ((float) sum/( (float)size));
}

float Fifo::std()
{
	float wsum = 0;
	float sum = 0;

        int i;
	for(i=0; i<size; i++) {
		wsum += (float) fifo[i]; 
	}

	wsum /= (float) size;

	for(i=0; i<size; i++) {
		sum += ( fabs((fifo[i]-wsum))*fabs((fifo[i]-wsum)) );
	}

	sum = (float) sqrt(sum);
	sum /= (float) sqrt(size-1);	

	return ((float) sum);
}

unsigned char Fifo::getmax()
{	
	unsigned char res = 0;

	for(int i=0; i<size; i++) {
		if (res < fifo[i]) res = fifo[i]; 
	}

	return (res);
}	

unsigned char Fifo::peekrate()
{	

	int res=0;

	int i, max, min, peek;

	

	peek = 0;

	

	for(i=0; i<size-22; i++) {

		max = 0;

		min = 255;

		for(int j=i; j<i+22; j++) {

			// get local min and max 

			if (fifo[j] > max)

					max = fifo[j];

			if (fifo[j] < min)

					min = fifo[j];

		}

		if (peek < (max-min))

				peek = (max-min);

	}



	if (peek>10) {

	 for(i=0; i<size-22; i++) {

		max = 0;

		min = 255;

		for(int j=i; j<i+22; j++) {

			// get local min and max 

			if (fifo[j] > max)

					max = fifo[j];

			if (fifo[j] < min)

					min = fifo[j];

		}

		// store if biggest peek

		if ( ( ((float)(peek*3)/5) < (float)(max-min) ) )

				res ++;

	 } 

	}

	

	// !!! 128 depends on sensor-reading rate 

	if (res > 127)

		res = 127;



	//printf("%i %i\n",res, peek);

	return (res);

}	



unsigned char Fifo::peeksize()

{

	unsigned char res = 0;

	unsigned char max, min;





	for(int i=0; i<size-22; i++) {

		max = 0;

		min = 255;

		for(int j=i; j<i+22; j++) {

			// get local min and max 

			if (fifo[j] > max)

					max = fifo[j];

			if (fifo[j] < min)

					min = fifo[j];

		}

		// store if biggest peek

		if (res < (max-min))

				res = (max-min);

	}



	return (res);

}



unsigned char Fifo::getmin()

{

	unsigned char res = fifo[0];



	for(int i=0; i<size; i++) {

		if (res > fifo[i]) res = fifo[i]; 

	}



	return (res);

}



void Fifo::printout(char* fn)

{

	FILE *fid;	// fid

	fid = fopen(fn, "w");	// fid



	for (int i=0; i<size; i++)

		fprintf(fid, "%i\n", fifo[i]);

	

    fclose(fid);	//fid

}



/*

void Fifo::std_mean()

{



	



}

*/



