#ifndef TUNESTATE_H
#define TUNESTATE_H

#include <stdint.h>
#include <unistd.h>

//	----------------------------------------------------------------------------
//	Definitions from Gimbal code
//	----------------------------------------------------------------------------

#include "project.h"
#include "filter.h"

//	----------------------------------------------------------------------------
//	Constants
//	----------------------------------------------------------------------------

	#define BODEMAX 500
	#define FILTBODEMAX 500

//	----------------------------------------------------------------------------
//	tuneState
//	----------------------------------------------------------------------------

class tuneState
{
public:

	// Name

	char name[80];
	int nameLen;

	// Parameters

	pidPar_t pidP[NiAXES];
	geoPar_t geoP[NiAXES];
	posPar_t posP[NiAXES];
	filter filt;
	outerPar_t outerP[NoAXES];
	lensPar_t lensP[NLENS];

	// Bode results

	float gain[NiAXES][BODEMAX];
	float phase[NiAXES][BODEMAX];
	float freqs[NiAXES][BODEMAX];
	int nbode[NiAXES];

	// Filter Bode results

	float filtergains[NiAXES][NiFILT+1][FILTBODEMAX];
	float filterphase[NiAXES][NiFILT+1][FILTBODEMAX];
	float filterfreqs[NiAXES][NiFILT+1][FILTBODEMAX];

	// Open Loop Bode results

	float gainOpen[NiAXES][BODEMAX];
	float phaseOpen[NiAXES][BODEMAX];
	float freqsOpen[NiAXES][BODEMAX];
	int numOpen[NiAXES];

	// Shake Bode results

	float gainShake[NiAXES][BODEMAX];
	float phaseShake[NiAXES][BODEMAX];
	float freqsShake[NiAXES][BODEMAX];
	float jitterShake[NiAXES][BODEMAX];
	int nShake[NiAXES];

	// Step Response

	float stepsamples[NiAXES][IMU_BUF_COUNT];
	int numstep[NiAXES];

	// FFT Samples

	float ffts[NiAXES][IMU_BUF_COUNT];
	int numffts[NiAXES];

public:
	tuneState(char *name = NULL);
	~tuneState(void);

public:
	void init(void);
	void filterBode(int axis, int filterOut);
	void copy(tuneState in);

//	void copyAxis(tuneState in, int axis);
//	void saveState(FILE *sfile);
//	void readState(FILE *sfile);
//	int match1(char *s, char *arrayName, int *index1, int max1, int *index0, int max0, char *elementName);
//	int match2(char *s, char *arrayName, int *index0, int max0);
//	int match3(char *s, char *arrayName, int *index0, int max0, char *elementName);
//	int match5(char *s, char *arrayName, int *index1, int max1, int *index0, int max0);
//	int getnumfilt(int axis);
//	void defaultSettings(void);
//	void hsFilterNotify();
//	scaled_t getReportScaled(FILE *sfile);
//	int readReport(FILE *sfile);
//	int getReportFilter(FILE *sfile);
};

#endif // TUNESTATE_H
