#ifndef _OBJSAMPLE_H
#define _OBJSAMPLE_H

/****************************************************************************
 *
 * Projekt			:	Glacier Batterieboxdeckel Prüfgerät
 * Dateiname		:	objSample.h
 * Autor			:	orginal MHoffmann, abgeändert für dieses Projekt Irene Saxer
 * Erstellungsdatum	:	17.04.2019
 * Beschreibung		:	"Durchführung einer Strommessung"
 *
 *
 * Versionsgeschichte
 * 	Revision 1.0	17.04.2019 SAI erste Version
 *
 ****************************************************************************/
 
/****************************************************************************/
/* COMPILER Direktiven */

/****************************************************************************/
/* INCLUDE Dateien */
#include "AppMain.h"
#include "AppMonitor.h"
#include "Common.h"
#include "DrvAdc.h"
#include "DrvGpio.h"
#include "DrvRtc.h"
#include "DrvTim.h"
#include "DrvEep.h"

/****************************************************************************/
/* KONSTANTEN */

#define OBJSAMPLE_RESULT_DISPLAY	3000	// Zeit in ms wie lange das Resultat angezeigt bleibt
#define OBJSAMPLE_NO_BATBOX			5		// Kontrolle ob BatterieBox

#define OBJSAMPLE_POTI_CNT 			2		// 2 Potis angeschlossen
#define BM_FLAG_HOLD				0x01	// Messdatenanzeige halten

#define OBJSAMPLE_HALL				2		// Je 1 Messwert für Spule und Dauermagnet

#define OBJSMPL_RESCODE_OK				0
#define OBJSMPL_RESCODE_PLUS_ZUTIEF		0x01	// Maske für PlusPoti unter der Toleranz
#define OBJSMPL_RESCODE_MINUS_ZUTIEF	0x02	// Maske für MinusPoti unter der Toleranz
#define OBJSMPL_RESCODE_PLUS_ZUHOCH		0x10	// Maske für PlusPoti oberhalb der Toleranz
#define OBJSMPL_RESCODE_MINUS_ZUHOCH	0x20	// Maske für MinussPoti oberhalb der Toleranz

// EEPROM (intern) Adressen
#define VALUE_ADRESS1	0x0016
#define VALUE_ADRESS2	0x0021
#define VALUE_ADRESS3	0x002C
#define VALUE_ADRESS4	0x0037
#define VALUE_ADRESS5	0x0042
#define VALUE_ADRESS6	0x004D
#define VALUE_ADRESS7	0x0058
#define VALUE_ADRESS8	0x0063



/*
typedef struct
{
	int16_t		i16_minTol[OBJSAMPLE_POTI_CNT];		//untere Grenzen aller Kontakthoehen
	int16_t		i16_maxTol[OBJSAMPLE_POTI_CNT];		//obere Grenzen aller Kontakthoehen
	uint8_t		u8_Tol;								//Toleranz, welche 2 aufeinander folgende Messungen einhalten muessen, um als ident betrachtet zu werden
	int16_t		i16_KalibOffset;					//Offset in 1/100-tel mm fuer Kalibrierung
}tTestParameter;*/
/*
typedef struct
{
	int16_t		i16_minTol[OBJSAMPLE_HALL];		// untere Grenze Dauermagnet - Spule
	int16_t		i16_maxTol[OBJSAMPLE_HALL];		// obere Grenze Dauermagnet - Spule
}tTestParameter;*/
typedef struct  
{
	int16_t		i16_minTolDM;		// untere Grenze Dauermagnet - Spule
	int16_t		i16_maxTolDM;		// obere Grenze Dauermagnet - Spule
}tTestParameterDM;
typedef struct
{
	int16_t		i16_minTolCoil;		// untere Grenze Dauermagnet - Spule
	int16_t		i16_maxTolCoil;		// obere Grenze Dauermagnet - Spule
}tTestParameterCoil;

typedef struct
{
	uint32_t			u32_CycleCnt;			//Anzahl der gespeicherten Datensaetze
	uint16_t			u16_ExtEepromWritePtr;	//Anzahl der belegten Speicherplaetze
	//tTestParameter		udt_TestPara;
	tTestParameterDM	udt_TestParaDM;			//Parameter fuer Test (Limits) Dauermagnet
	tTestParameterCoil	udt_TestParaCoil;		// Parameter fuet Test (Limits) Spule
	uint8_t				u8_CS;					//Pruefsumme
}tEEData;										//internes EEPROM


typedef struct
{
	int16_t			i16_measured_Values[OBJSAMPLE_HALL]; // Messwerte Dauermagnet und Spule
	//int16_t			i16_Poti[OBJSAMPLE_POTI_CNT];	// Positionen der Potis   (je2 Byte)
	tDateTime		TS;								// Zeitstempel	(6 Byte)
	//uint8_t			u8_Result;						// 0 == ok
	uint8_t			u8_ResultDM;					// 0 == ok
	uint8_t			u8_ResultCoil;					// 0 == ok
	uint8_t			CS;								// Pruefsumme eines Pruefdatensatzes (erforderlich, um zu pruefen, ob gueltige Daten im Eeprom liegen
}tTestData;											// Datensatz des externen EEPROMs (16 Byte)

typedef struct
{
	tTestData	udt_TD;								// strukturinhalt einer Messung
	uint16_t	u16_ExtEepromWritePtr;				// Schreibzeiger auf ext. Eeprom (in Einheiten von tTestData)
	uint16_t	u16_TS;								// Zeitstempel feur Displayanzeige
	uint16_t	u16_DispTimer;						// Zeitstempel fuer Anzeige
	uint8_t		u8_Flags;							// Flags fuer den Handler
	//int16_t		i16_Calib[OBJSAMPLE_POTI_CNT];		// Kalibrierwerte für alle potis 
}tObjSmplIntf;


/****************************************************************************/
/* Globale Variablen */
extern tObjSmplIntf 		gudt_ObjSmplIntf;
//extern tTestParameter 	gudt_TestPara;
extern tTestParameterDM		gudt_TestParaDM;
extern tTestParameterCoil	gudt_TestParaCoil;
extern tEEData				gudt_IntEedata;

/****************************************************************************/
/* Prototypen */
void ObjSample_Init(void);
int16_t ObjSample_Handler(void);
uint8_t ObjSample_CalcChkSum(uint8_t* pudt_Data, uint8_t u8_Size);
void ObjSmpl_ShowTestData(tTestData* pudt_TD);
void ObjSample_InitParameter(void);
int16_t ObjSample_LoadIntEedata(void);
void ObjSample_SaveIntEedata(void);
void ObjSample_ShowIntEedata(void);
void ObjSample_DispTestData(uint8_t u8_flagRefreshData);
void ObjSample_PutsLeg(void);
void ObjSample_SaveTestData(void);
void ObjSample_DispCalibData(void);
int16_t ObjSample_DoCalib(void);

#endif	// #define _OBJSAMPLE_H
