/*!
  * \file				: sysdata.h
  * \brief				: Header for sysdata.c file.
  *						  This file contains the common defines of the application.
  *
  */

#ifndef __SYS_DATA_H
#define __SYS_DATA_H

#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"

#define CONCAT(a, b) CONCAT_INNER(a, b)											// These three macros
#define CONCAT_INNER(a, b) a ## b												// generate unique variables
#define UNIQUE_NAME(base) CONCAT(base, __COUNTER__)								// according to template "baseX", like "base1", "base2" and etc.

#define SAMPLE_ARRAY_SIZE 64
 
//------------------------------------------------------------------------------

typedef union
{
	uint16_t w;
	int16_t  sw;
	uint8_t  b[2];
	int8_t   sb[2];
} bword_t;

//------------------------------------------------------------------------------
// This structure must be aligned to 4-byte address
volatile typedef struct
{
	// Device spezifisch / Einstellungsbereich
	uint16_t device_type;														// 0	ECS interne Gertetyp Kennung (IHP 500 -> daher wird angedacht die Gerätekennung 500 zu nehmen)
	uint16_t UNIQUE_NAME(reserved);												// 1	Reserviert wg Alignement
	uint32_t sn;																// 2-3	Seriennummer Teil 1 -> wird bei der Produktion geschrieben

	uint16_t fw_revision_major;													// 4	Firmware Revision Major -> wird bei einer neuen Gertegeneration hochgezhlt
	uint16_t fw_revision_minor;													// 5	Firmware Revision Minor -> wird hochegezhlt, wenn nderungen in der Firmware auch nderungen in der Bedienungsanleitung zur Folge haben

	uint16_t fw_revision_revision;												// 6	Firmware Revision Revision -> wird bei jeder nderung der Firmware hochgezhlt
	uint16_t UNIQUE_NAME(reserved);												// 7	Reserviert wg Alignement

	uint32_t baudrate;															// 8-9	Die Modbus Baudrate (default 19200 Bit/s). Gültig im Bereich von 50 Bit/s bis 1000 000 Bit/s

	uint16_t parityMode;														// 10	UART Parity Mode (default EVEN) mgliche Werte 0=EVEN, 1=ODD, 2=NONE
	uint16_t stopBit;															// 11	UART Stop Bit Reserviert, Aktuell automatisch selektiert nach Modbus standart Bei Parity EVEN oder ODD 1, bei NONE werden 2 stopbits genutzt

	uint16_t slave_address;														// 12	Modbus Slave Adresse (default 1) mgliche Werte von 1 bis 247
	uint16_t command;															// 13	Kommando Word, das Schreiben bestimmter Werte in dieses Register fhrt bestimmte Aktionen aus

	uint16_t UNIQUE_NAME(reserved)[6];											// 14 - 19
	
	uint16_t operatingMode;														// 20
	
	uint16_t UNIQUE_NAME(reserved)[79];											// 21 - 99

} device_parameter_t;

//------------------------------------------------------------------------------
// This structure must be aligned to 4-byte address
volatile typedef struct
{	/* offset 0 */
	/*  2 of 2  */ int16_t  chipTemp;											// 100
	/*  2 of 2  */ int16_t  relaisTemp;											// 101
	/*  2 of 2  */ uint16_t voltage_input;										// 102
	/*  2 of 2  */ uint16_t voltage_output;										// 103
	/*  2 of 2  */ int16_t  voltage_relais;										// 104
	/*  2 of 2  */ int16_t  fan_pwm;											// 105
	/*  2 of 2  */ int16_t  fan_rpm;											// 106
	/*  2 of 2  */ int16_t  ovp_state;											// 107
	/*  2 of 2  */ int16_t  lvp_state;											// 108
	/*  2 of 2  */ int16_t  fault_state;										// 109
	/*  2 of 2  */ int16_t  relais_state;										// 115
	/*  2 of 2  */ int16_t  smState;											// 116
	/*  2 of 2  */ int16_t  smError;											// 117
} device_values_t;

//------------------------------------------------------------------------------

typedef struct
{
	device_parameter_t parameter;												// 0-99
	device_values_t    values;													// 100
} sys_data_struct_t;

//------------------------------------------------------------------------------
typedef volatile union
{
	sys_data_struct_t s;
	bword_t mb[sizeof(sys_data_struct_t) / 2];
} sys_data_t;

//------------------------------------------------------------------------------

extern sys_data_t sys_data;

//------------------------------------------------------------------------------

void SYS_DATA_Init(void);

#ifdef __cplusplus
}
#endif

#endif // __SYS_DATA_H