/*******************************************************************************
*                                                                              *
* Société de Transports de Montréal.                                    	   *
* 2012 - 2013                                                                        *
*                                                                              *
* Projet Zones Tests                                                           *
*                                                                              *
*                                                                              *
*                                                                              *
*******************************************************************************/
/*
	Description:
	Cette classe est un thread qui lit la carte PCI d'I/O sur laquelle sont
	branchées les entrées à haute fréquence.  La machine à états analyse le
	passage du train et détecte les déclenchements (sondes, frotteur négatif,
	pneu porteur).  On utilise un thread car l'analyse doit se faire à très
	haute fréquence sans être ralentie par l'interface graphique.
	
*/

/* ************************************************************************** */
/* Revision:
### YYYMMDD JFM
	Verision d'origine.
	
### YYYYMMDD Description du besoin ou du bug
	Description du changement.
 */

/* ************************************************************************** */

#ifndef ZT2ANALYSISTHREAD_H
#define ZT2ANALYSISTHREAD_H

#define ZT2_ANALYSIS_LOOP_PERIOD 500000 //500 us

#include <QObject>
#include "GlobalDefine.h"
#include "Station.h"
#include <QMutex>
#include "ZTData.h"
#include  "QElapsedTimer"

class CPCIIOMgr;
//class CAbstractLazerProbe;

class CZT2AnalysisThread : public QObject
{
	Q_OBJECT
public:
    CZT2AnalysisThread();
    unsigned int Init(CPCIIOMgr *PCIIOHandle,GenericInputMasks_t *InputMasks,QElapsedTimer *RefTimer);
	void TerminateAnalysis();
    bool UpdateDetectionConfig(CZTDetectionFunctionConfig*);

private:
	enum eTrainState
    {
        ZT2_PRE_DETECTION_STATE,
        ZT2_WAIT_FOR_S1_STATE,
        ZT2_S1_ACTIVE_STATE,

        ZT1_TRAIN_TRANSIT_FINISHED_STATE

	};

	void RegisterDetection(unsigned int DetectionID, unsigned int Rank, qint64 TimeStamp);

    unsigned int mZT2TrainState;
	unsigned int mLastInputs;

	bool mExitLoop;
	QMutex mMutex;
    bool mZT2Analyzing;
	bool mPEQDetectionLatch;

	CPCIIOMgr *mPCIInputsHandle;
	GenericInputMasks_t *mInputMasksPtr;

	QElapsedTimer *mReferenceTimer;

    CZTDetectionFunctionConfig mDetectionConfig;


public slots:
    void AnalyzeZT2Train();

signals:
    void ZT2DataUpdate(CZT2ThreadData* );
	void DetectionTriggered(CZTDetectionData* );
	void AddLogString(QString);							//Signal émis pour insérer une ligne au ZTLog
};

#endif // ZT2ANALYSISTHREAD_H
