#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"
#include <qtplchandler.h>
#include "interpolator.h"

class GraphicsPixmapItem;
class GrahicsTextItem;
class QFileSystemWatcher;


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    enum { PageGame, PageAutomatik, PageHand};
    enum
    {
        KEIN_MODUS,
        MASCHINE_INIT,
        REFERENZPUNKTFAHRT_AKTIV,
        REFERENZPUNKTFAHRT_DONE,
        TABELLE_AKTIV,
        TIPPEN_AKTIV,
        GRUNDSTELLUNG_AKTIV,
        GRUNDSTELLUNG_DONE,
        SW_ENDSCHALTER_AKTIV,
        FEHLER_TABELLE,
        BERECHNE_STARTPOS,
        STARTPOS_AKTIV,
        STARTPOS_DONE,
        BALLABHOLEN_AKTIV,
        BALLABHOLEN_DONE,
        BALLABHOLEN_FEHLER,
        LIGHTSHOW_AKTIV,
        LIGHTSHOW_DONE
    };
    enum
    {
            KEINE_MELDUNG,
            TABELLE_LESEN,
            TABELLE_OK,
            FEHLER_TABELLE_LESEN,
            TABELLENWERTE_UNGUELTIG,
            WARTEN_AUF_START,
            TABELLE_RUN,
            STARTPUNKT_TABELLE_NICHT_NULL,
            KEINE_REGLERFREIGABE,
            REFERENZPUNKT_NICHT_BEKANNT,
            GRUNDSTELLUNG_FEHLER,
            STARTPOSITION_FEHLER,
            ABBRUCH,
            VERWEILZEIT,
            FERTIG
    };

    enum{
        IPO_StartPositionX,
        IPO_StartPositionY,
        IPO_Hoehe1,
        IPO_Hoehe2,
        IPO_Weite,
        IPO_Anzahl1,
        IPO_Anzahl2,
        IPO_Zwischenpause,
        IPO_PauseZurueck,
        IPO_PauseVor,
        IPO_Steigung1,
        IPO_Steigung2,
        IPO_BeschleunigungX,
        IPO_BeschleunigungY
    };
protected:
    void changeEvent(QEvent *e);
    bool eventFilter(QObject *object, QEvent *event);

private:
    Ui::MainWindow ui;
    QtPlcHandler m_plcHandler;
    QFileSystemWatcher *m_watcher;
    double m_actPosX;
    double m_actPosY;
    double m_actVelocityX;
    double m_actVelocityY;
    double m_actTemperaturGeraetX;
    double m_actTemperaturGeraetY;
    double m_actTemperaturMotorX;
    double m_actTemperaturMotorY;
    double m_spielHoehe;
    double m_spielWeite;
    double m_grundstellungX;
    double m_grundstellungY;
    QList<InterpolatorData> m_AblaufDaten;
    bool m_automatikAktiv;
    bool m_startPosAktiv;
    bool m_ballPosAktiv;
    bool m_spielAktiv;
    bool m_spielRestart;
    bool m_QRF;
    int m_automtikIndex;
    QScopedPointer<FahrprofilData> m_data_X;
    QScopedPointer<FahrprofilData> m_data_Y;
    WidgetData m_widgetData;
    QScopedPointer<Interpolator> ipo;
    double m_startPosX;
    double m_startPosY;
    QPointF m_startPos;
    bool m_error;
    double m_sw_end_pos_x;
    double m_sw_end_neg_x;
    double m_sw_end_pos_y;
    double m_sw_end_neg_y;
    double m_grundPositionDefault_x;
    double m_grundPositionDefault_y;
    bool m_looserModeAktiv;

    void initPLC();
    void initSPS_Data();
    void initTabelle();
    void saveTabelle();
    bool checkDaten();
    void createData();
    void on_g_boEC_Ready_changed(const QVariant &value);
    void on_g_boQRF_changed(const QVariant &value);
    void on_g_lreAktPos_X_mm_changed(const QVariant &value);
    void on_g_lreAktPos_Y_mm_changed(const QVariant &value);
    void on_g_lreGeschwindigkeit_X_changed(const QVariant &value);
    void on_g_lreGeschwindigkeit_Y_changed(const QVariant &value);
    void on_g_lreTempGeraet_X_changed(const QVariant &value);
    void on_g_lreTempGeraet_Y_changed(const QVariant &value);
    void on_g_lreTempMotor_X_changed(const QVariant &value);
    void on_g_lreTempMotor_Y_changed(const QVariant &value);
    void on_g_stMachineParameter_arAxisParameter_1__lreGrundstellung_mm_changed(const QVariant &value);
    void on_g_stMachineParameter_arAxisParameter_2__lreGrundstellung_mm_changed(const QVariant &value);
    void on_PLC_PRG_enAktiverModus_changed(const QVariant &value);
    void on_PLC_PRG_enStatePosTabelle_changed(const QVariant &value);
    void on_g_boFlagTabelleGelesen_changed(const QVariant &value);
    void on_g_stMachineParameter_arAxisParameter_1__lrePositionBallAbholen_mm_changed(const QVariant &value);
    void on_g_stMachineParameter_arAxisParameter_2__lrePositionBallAbholen_mm_changed(const QVariant &value);
    void on_g_boBallPositionDone_changed(const QVariant &value);
    void on_g_boStartPositionDone_changed(const QVariant &value);
    void on_g_boBallAbholenAktiv_changed(const QVariant &value);
    void on_g_boAblaufAktiv_changed(const QVariant &value);
    void on_g_boErrorTabelle_changed(const QVariant &value);




    void on_g_stMachineParameter_boInitMachineData_changed(const QVariant &value);

    void on_PLC_PRG_boErrorTabelleLesen_changed(const QVariant &value);

private slots:
    void errorMsg(const QString &error);
    void stateMsg(const QString &state);
    void state(const long state);
    void plcStatus(const QT_PLC_STATUS &plcStatus);
    void startPositionChanged(QPointF);
    void startSpiel(double,double);
    void setStartSpielDisabled(bool);

    void directoryChanged(QString);
    void on_btn_Ein_Aus_clicked(bool checked);
    void on_btn_Spiel_clicked();
    void on_btn_Zurueck_clicked();
    void on_btn_StartSpiel_clicked();
    void on_btn_Hilfe_clicked(bool checked);
    void on_btn_Start_clicked();
    void on_btn_Stop_clicked();
    void on_btn_StartSpiel_pressed();
    void on_btn_StartSpiel_released();
    void on_stackedWidget_currentChanged(int arg1);
    void on_btn_StartPos_pressed();
    void on_btn_StartPos_released();
    void on_btn_Test_pressed();
    void on_btn_Test_released();
    void on_btn_VisuHand_clicked();
    void on_btn_Ein_Aus_2_clicked(bool checked);
    void on_btn_Ein_Aus_3_clicked(bool checked);
    void on_btn_JogPlusX_pressed();
    void on_btn_JogPlusX_released();
    void on_btn_JogMinusX_pressed();
    void on_btn_JogMinusX_released();
    void on_btn_JogPlusY_pressed();
    void on_btn_JogPlusY_released();
    void on_btn_JogMinusY_pressed();
    void on_btn_JogMinusY_released();
    void on_btn_Referenz_pressed();
    void on_btn_Referenz_released();
    void on_btn_StartTabelle_pressed();
    void on_btn_StartTabelle_released();
    void on_btn_Reset_pressed();
    void on_btn_Reset_released();
    void on_btn_VisuAutomatik_clicked();
    void on_btn_VisuSpiel_clicked();
    void on_btn_StartGrundPos_pressed();
    void on_btn_StartGrundPos_released();
    void on_btn_VisuHand_2_clicked();
    void on_tableWidget_clicked(const QModelIndex &index);
    void on_btn_SaveTabelle_clicked();
    void on_btn_StartTabelle_clicked(bool checked);
    void on_btn_StartTabelle_toggled(bool checked);
    void on_btn_Reset_3_pressed();
    void on_btn_Reset_3_released();
    void on_btn_Reset_2_pressed();
    void on_btn_Reset_2_released();
    void on_btn_StartBallPos_clicked(bool checked);
    void on_btn_StartBallPos_2_clicked(bool checked);
    void on_btn_StartBallPos_3_clicked(bool checked);
    void on_btn_ReloadTabelle_clicked();
    void cyclicData(const QList<PLC_VARIABLE> &data, const QList<int> &index);
    void stateIntern(const long state);
    void initTasks();
    void on_btn_Looser_clicked();
};

#endif // MAINWINDOW_H
