#ifndef	_APPMONITOR_H
#define	_APPMONITOR_H

/****************************************************************************
 *
 * Projekt			:	Glacier Batterieboxdeckel Prüfgerät
 * Dateiname		:	AppMonitor.h
 * Autor			:	orginal MHoffmann, abgeändert für dieses Projekt Irene Saxer
 * Erstellungsdatum	:	17.04.2019
 * Beschreibung		:	"Command Handler der Monitorschnittstelle"
 *
 *
 * Versionsgeschichte
 * 	Revision 1.0   17.04.2019 SAI erste Version
 *
 ****************************************************************************/

//****************************************************************************
// Compiler Direktiven

//****************************************************************************
// Include Dateien
#include "Common.h"
#include "ObjSample.h"
#include "DrvAdc.h"
#include "DrvEep.h"
#include "DrvRtc.h"

//****************************************************************************
// Konstanten

//****************************************************************************
// STRUKTUREN
//----------------------------------------------------------------------------
//Struktur fuer Command-Handler Tabelle mit Funktionsaufrufen
//Alle Monitorfunktionen haben den Prototypen "int16_t Funktionsname();"
typedef int16_t (*TMonitorFunction)(void);

typedef struct
{
    const char*		pstr_CommandName;					//Command-String
    TMonitorFunction	pfunc_CommandFunction;          //Zeiger auf Monitorfunktion
    const char*		pstr_Help;							//String, der bei "hilfe" für die Testfunktion ausgegeben wird
} TMonitorCommandEntry;

//gudt_MonitorCommandList[] wird hier deklariert, aber im
//Applikationsspezifischen Teil des Moniors (also z.B. MtMoniFunc.c) definiert (instanziiert).
extern const TMonitorCommandEntry gudt_MonitorCommandList[];

//----------------------------------------------------------------------------
//Main Monitor Struktur, enthaelt alle Strukturen fuer Funktionsaufrufe und Datenuebergabe.

#define MONITOR_MAXARGUMENTS       10
#define MONITOR_MAXCOMMANDLENGTH   80

typedef struct
{
	uint8_t   u8_State;									//hält den aktuellen State des Monitor-Commandhandlers
	uint8_t   u8_CommandIndex;							//indiziert die aktive Monitor-Subfunktion
	uint8_t   u8_ArgumentAnzahl;						//enthält die Anzahl der Befehlsargumente (inkl. Command)
    char*  pstr_Argument[MONITOR_MAXARGUMENTS];			//zeigt auf die separierten Argumente der Befehlszeile
    char   str_Eingabe[MONITOR_MAXCOMMANDLENGTH];		//enthält den kompletten Eingabestring
    uint8_t   u8_Supervisor;							//Flag! Wenn TRUE: Supervisor-Mode (s. u.)
														//Variablen zur freien Verwendung der Monitorfunktionen
    uint8_t   u8_UserState;								//hält den aktuellen State einer aktiven Monitor-Subfunktion
    uint8_t   u8_UserSubState;							//hält den aktuellen SubState einer aktiven Monitor-Subfunktion
    uint8_t   u8_UserIndex;								//Index, der von den jeweiligen Monitor-Subfunktionen frei verwendet werden kann
    uint32_t  u32_UserTimer;							//Fuer UserFunc Timer
    uint32_t  u32_UserVariable32;						//Fuer UserFunc ...
} TMonitorPara;

//****************************************************************************
// VARIABLEN

extern TMonitorPara gudt_MtMonitorPara;
extern uint8_t	gu8_FirstRun;

//****************************************************************************
// PROTOTYPEN
int16_t AppMonitor_Init(void);
int16_t AppMonitor_Handler(void);
int16_t AppMonitor_CommandArguments(char* pstr_Eingabe);
int16_t AppMonitor_ListHelp(void);
int16_t AppMonitor_GetString(char* pstr_String);
int16_t AppMonitor_ShowVersion(void);
int16_t AppMonitor_ClrEe(void);
int16_t AppMonitor_SetTestPar(void);
int16_t AppMonitor_GetTD(void);
//int16_t AppMonitor_Calibrate(void);
int16_t AppMonitor_GetTime(void);
int16_t AppMonitor_SetTime(void);
int16_t AppMonitor_ShowEE(void);
int16_t AppMonitor_GetTemp(void);
int16_t AppMonitor_GetPoti(void);

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

//----------------------------------------------------------------------------
//State-Konstanten
#define MONITOR_STATE_OUTPUTPROMPT     1
#define MONITOR_STATE_WAITCOMMAND      2
#define MONITOR_STATE_CHECKCOMMAND     3
#define MONITOR_STATE_RUNSUBFUNCTION   4
#define MONITOR_STATE_ENDSUBFUNCTION   5

//----------------------------------------------------------------------------
//SubState-Konstanten
#define MONITOR_USERSTATE_INAKTIV      0
#define MONITOR_USERSTATE_READY      255

//----------------------------------------------------------------------------
//SubStates "GetStr"
#define GETSTR_ZEICHENLESEN     1

//----------------------------------------------------------------------------
//SubStates "hilfe"
#define HILFE_HILFEAUSGABE              1

//----------------------------------------------------------------------------
//SubStates "info"
#define HILFE_FIRMWAREVERSIONAUSGABE    1

//----------------------------------------------------------------------------
//Rueckgabewerte fuer Monitor Subfunctions
#define MONITOR_SUBFUNCTION_READY          1
#define MONITOR_SUBFUNCTION_CALLAGAIN      0

//----------------------------------------------------------------------------
//Fehlerkonstanten
#define ERROR_MONITOR_INIT             -2100
#define ERROR_MONITOR_WAITCOMMAND      -2101
#define ERROR_MONITOR_CHECKCMD         -2102
#define ERROR_MONITOR_RUNFUNCTION      -2103
#define ERROR_MONITOR_STATE            -2104
#define ERROR_MONITOR_CHKIOPORT        -2105
#define ERROR_MONITOR_GETSTR_SUBSTATE  -2106
#define ERROR_MONITOR_HILFE_SUBSTATE   -2107

#endif // _APPMONITOR_H
