/*!
  * \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). Gltig 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 res1[6];
	
	uint16_t operatingMode;	
	
	uint16_t reserved[79];



} device_parameter_t;

//------------------------------------------------------------------------------
// This structure must be aligned to 4-byte address
volatile typedef struct
{	/*offset 0*/
	/* 2 of 8 */ int16_t  chipTemp;											// 100
	/* 4 of 8 */ int16_t  relaisTemp;										// 101
	/* 6 of 8 */ uint16_t voltage_input;									// 102
	/* 8 of 8 */ uint16_t voltage_output;									// 103
	/* 2 of 8 */ int16_t  voltage_relais;									// 104
	/* 2 of 8 */ int16_t  fan_pwm;											// 105
	/* 2 of 8 */ int16_t  fan_rpm;											// 106
	/* 2 of 8 */ int16_t  ovp_state;										// 107
	/* 2 of 8 */ int16_t  lvp_state;										// 108
	/* 2 of 8 */ int16_t  fault_state;										// 109
	/* 2 of 8 */ int16_t  relais_state;										// 115
} 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