/*******************************************************************************
*                                                                              *
* 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 SIMULATORTHREAD_H
#define SIMULATORTHREAD_H

#define ZT2_ANALYSIS_LOOP_PERIOD 500000 //500 us

#include <QObject>
#include "GlobalDefine.h"
#include "Station.h"
#include <QMutex>
#include "ZTData.h"
#include  "QElapsedTimer"
#include "SimulatorInputModule.h"
#include "SImulatorOutputModule.h"
#include "SimulatorPCIIO.h"
#include "SimulatorLazerProbe.h"
#include "LogMgr.h"

class CPCIIOMgr;
//class CAbstractLazerProbe;

class CSimulatorThread : public QObject
{
	Q_OBJECT
public:
	CSimulatorThread();
	unsigned int Init(CSimulatorInputModule *InputModule, CSImulatorOutputModule *OutputModule, CSimulatorPCIIO *PCIIO, CSimulatorLazerProbe *InternalLazerProbe,CSimulatorLazerProbe  *ExternalLazerProbe,GenericInputMasks_t *StationInputMasks);
	void Terminate();
	void SetLogElement(CLogElement *element);

private:

	CSimulatorInputModule *mInputModule;
	CSImulatorOutputModule *mOutputModule;
	CSimulatorPCIIO *mPCIIO;
	CSimulatorLazerProbe *mInternalLazerProbe, *mExternalLazerProbe;

	CLogElement *mLogElement;
	GenericInputMasks_t *mStationInputMasks;

	QElapsedTimer mSimTimer;

	bool mExitLoop;
	QMutex mMutex;
	bool mSimThreadRunning;



public slots:
	void StartSim();

signals:
	void SimFinished();

};

#endif // SIMULATORTHREAD_H
