//=================================================================================================
//
// Company:       Paul Scherrer Institut
//                5232 Villigen PSI
//                Switzerland
//
//-------------------------------------------------------------------------------------------------
//
// Project:       Peltier Controller V2
// Author:        Noah Piqué (noah.pique@psi.ch)
//
//-------------------------------------------------------------------------------------------------
//
// Module:        Variable Handler
// Filename:      VARH_VariableHandler.h
// Date:          Handled by Subversion (version control system)
// Revision:      Handled by Subversion (version control system)
// History:       Handled by Subversion (version control system)
//
//-------------------------------------------------------------------------------------------------

#ifndef VARH_VARIABLEHANDLER_H
#define VARH_VARIABLEHANDLER_H

#ifdef __cplusplus
extern "C" {
#endif

//=================================================================================================
// Section:       INCLUDES
// Description:   List of required include files (visible by all modules).
//=================================================================================================

#include "../SDEF_StandardDefinitions.h"

//=================================================================================================
// Section:       DEFINITIONS
// Description:   Definition of global constants (visible by all modules).
//=================================================================================================

// Flags for variable
#define VARH_FLAG_VALID         (1<<0)  // is data valid
#define VARH_FLAG_OUTOFRANGE    (1<<1)  // is data out of range
#define VARH_FLAG_MODIFIED      (1<<2)  // is variable modified (compared to flash)
#define VARH_FLAG_FLASHCORRUPT  (1<<3)  // data from flash is corrupted

// Flags for variable infos
#define VARH_FLAGINFO_NONE      0       // no flag
#define VARH_FLAGINFO_FLOAT     (1<<0)  // variable in floating point format
#define VARH_FLAGINFO_SIGNED    (1<<1)  // variable is signed integer
#define VARH_FLAGINFO_BOOL      (1<<2)  // variable is boolean
#define VARH_FLAGINFO_READONLY  (1<<3)  // variable is readonly, master can not set variable
#define VARH_FLAGINFO_FLASH     (1<<4)  // variable is stored in flash

//=================================================================================================
// Section:       MACROS
// Description:   Definition of global macros (visible by all modules).
//=================================================================================================

//=================================================================================================
// Section:       ENUMERATIONS
// Description:   Definition of global enumerations (visible by all modules).
//=================================================================================================

// variables
typedef enum
{ 
  VARH_eMode = 0,

  VARH_eControlVoltage = 1,

  VARH_ePID_kp,
  VARH_ePID_ki,
  VARH_ePID_kd,
  VARH_ePID_Temp,
  VARH_ePID_Max,
  VARH_ePID_Min,

	VARH_eTemp_H,
  VARH_eTemp_C,
  VARH_eTemp_Diff,

  VARH_ePeltier_U,
  VARH_ePeltier_I,
  VARH_ePeltier_R,
  VARH_ePeltier_P,

  VARH_eSupply_U,
  VARH_eSupply_I,
  VARH_eSupply_P,

  VARH_eNumberOfVariables,   // Must be last entry
} VARH_EnVariables;

//=================================================================================================
// Section:       STRUCTURES
// Description:   Definition of global Structures (visible by all modules).
//=================================================================================================

#pragma pack(4)
typedef union {
   FLOAT  flVal;
   U32    u32Val;
   S32    s32Val; 
} VARH_UVariable; 
#pragma pack()

typedef struct
{
  U8                        u8Flags;               // flags
  VARH_UVariable            uInitData;             // initial Data (data is always 32 bit)
  VARH_UVariable            uMinData;              // min Value for Data
  VARH_UVariable            uMaxData;              // max Value for Data
} VARH_StVarInfo;

typedef struct
{
  VARH_UVariable            uData;             	   // Data (data is always 32 bit)
  U8                        u8Flags;               // flags
} VARH_StVar;

//=================================================================================================
// Section:       GLOBAL VARIABLES
// Description:   Definition of global variables (visible by all modules).
//=================================================================================================

//=================================================================================================
// Section:       GLOBAL CONSTANTS
// Description:   Definition of global constants (visible by all modules).
//=================================================================================================

//=================================================================================================
// Section:       FUNCTION TYPES
// Description:   Definition of functions
//=================================================================================================

//=================================================================================================
// Section:       GLOBAL FUNCTIONS (PROTOTYPES)
// Description:   Definition of global functions (visible by all modules).
//=================================================================================================

BOOL VARH_boInitializeModule( VOID );

// set data
VOID VARH_vSetVariableData( U8 u8Variable, VARH_UVariable uData );
VOID VARH_vSetVariableDataU32( U8 u8Variable, U32 u32Data );
VOID VARH_vSetVariableDataS32( U8 u8Variable, S32 s32Data );
VOID VARH_vSetVariableDataFloat( U8 u8Variable, FLOAT flData );

// set data from system
VOID VARH_vSetVariableDataFromSystem( U8 u8Variable, VARH_UVariable uData );
VOID VARH_vSetVariableDataFromSystemU32( U8 u8Variable, U32 u32Data );
VOID VARH_vSetVariableDataFromSystemS32( U8 u8Variable, S32 s32Data );
VOID VARH_vSetVariableDataFromSystemFloat( U8 u8Variable, FLOAT flData );

// get data
VARH_UVariable VARH_uGetVariableData( U8 u8Variable );
U32 VARH_u32GetVariableData( U8 u8Variable );
S32 VARH_s32GetVariableData( U8 u8Variable );
FLOAT VARH_flGetVariableData( U8 u8Variable );
U8 VARH_uGetVariableFlags( U8 u8Variable );

// reset data
VOID VARH_vSetVariableToInitData( U8 u8Variable );
VOID VARH_vSetAllVariablesToInitData( VOID );

#ifdef __cplusplus
}
#endif

#endif
