#ifndef GLOBAL_DEFINES_H
#define GLOBAL_DEFINES_H

#include <QtGlobal>
#include <QAtomicInt>
#include <QString>
#include "qtplchandler.h"
//#include "global_data.h"
#include <QtCore/QVector>
#include <QPointF>

//////////////////////////////////////////////////////////////////////////////
//Defines A5-Zielsystem PC-Zielsystem
//////////////////////////////////////////////////////////////////////////////
#ifdef Q_WS_QWS //Interne Visualisierung A5, Linux
#define VISU_INTERN
#define USE_NUM_KEY_PAD
#else
#ifdef Q_OS_LINUX
#define VISU_EXTERN
#define USE_NUM_KEY_PAD
#else
#define VISU_EXTERN
#endif
#endif

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif
//Test Num-Keypad
//#define USE_NUM_KEY_PAD

static const int MAX_TABELLEN_STUETZPUNKTE=40000;
static const int MAX_BUFFER=40000;
static const double g=9.80665;

//////////////////////////////////////////////////////////////////////////////////
// Binäres Profil PLC
//////////////////////////////////////////////////////////////////////////////////
struct InterpolatorData{
    InterpolatorData():
        h1(0),
        h2(0),
        offset_y(0),
        offset_y2(0),
        n1(0),
        n2(0),
        s_max(0),
        a_ymax(0),
        a_xmax(0),
        pause(0),
        zwischenpause(0),
        startPosition_x(0),
        startPosition_y(0)
    {}
    InterpolatorData(double hoehe1,
                     double hoehe2,
                     double steigung1,
                     double steigung2,
                     double anzahl1,
                     double anzahl2,
                     double laenge,
                     double a_y,
                     double a_x,
                     double pauseZurueck,
                     double pauseZwischen,
                     double pauseStart,
                     double startPos,
                     double startPosY
                     ):
        h1(hoehe1),
        h2(hoehe2),
        offset_y(steigung1),
        offset_y2(steigung2),
        n1(anzahl1),
        n2(anzahl2),
        s_max(laenge),
        a_ymax(a_y),
        a_xmax(a_x),
        pause(pauseZurueck),
        zwischenpause(pauseZwischen),
        pauseVor(pauseStart),
        startPosition_x(startPos),
        startPosition_y(startPosY)
    {}
    double h1;
    double h2;
    double offset_y;
    double offset_y2;
    double n1;
    double n2;
    double s_max;
    double a_ymax;
    double a_xmax;
    double pause;
    double zwischenpause;
    double pauseVor;
    double startPosition_x;
    double startPosition_y;
};

struct WidgetData{
    std::vector<QPointF> point;
    std::vector<int> segment;
    std::vector<int> direction;
};
struct FahrprofilData{
    IEC_UINT uiVersion;
    IEC_UINT uiAnzahlEintraege;
    IEC_DINT diWerteGueltig;
    IEC_LREAL position[MAX_TABELLEN_STUETZPUNKTE];
    IEC_LREAL geschwindigkeit[MAX_TABELLEN_STUETZPUNKTE];
    IEC_LREAL beschleunigung[MAX_TABELLEN_STUETZPUNKTE];
    IEC_LREAL kraftgrenze[MAX_TABELLEN_STUETZPUNKTE];
};


//////////////////////////////////////////////////////////////////////////////////
// Erzeuge eine ID für Signal-Kommunikation
//////////////////////////////////////////////////////////////////////////////////
//inline int getUniqueId(){
//    static QAtomicInt idCounter;

//    idCounter.fetchAndAddRelaxed(1);
//    do{idCounter.fetchAndAddRelaxed(1);} while (idCounter == 0);        //Rückgabewert 0 verboten
//    return(idCounter);
//}

inline double limit(double min, double value, double max)
{
    return(qMax(min, qMin(value, max)));
}

#endif // GLOBAL_DEFINES_H
