278 lines
7.7 KiB
C++
278 lines
7.7 KiB
C++
/*******************************************************************************
|
|
* *
|
|
* Société de Transports de Montréal. *
|
|
* 2012 - 2013 *
|
|
* *
|
|
* Projet Zones Tests *
|
|
* *
|
|
* *
|
|
* *
|
|
*******************************************************************************/
|
|
/*
|
|
Description:
|
|
Description du fichier si nécessaire.
|
|
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
/* Revision:
|
|
### YYYMMDD JFM
|
|
Verision d'origine.
|
|
|
|
### YYYYMMDD Description du besoin ou du bug
|
|
Description du changement.
|
|
*/
|
|
|
|
/* ************************************************************************** */
|
|
|
|
#include "GlobalDefine.h"
|
|
#include "ZT2AnalysisThread.h"
|
|
#include "PCIIOMgr.h"
|
|
#include "AbstractLazerProbe.h"
|
|
#include <QElapsedTimer>
|
|
#include "ZTconfigmgr.h"
|
|
|
|
//const char * ErrorString[25] = {"Erreur de comptage S1-S2",
|
|
// "Déclenchement frotteur négatif",
|
|
// "Déclenchement pneu de guidage intérieur",
|
|
// "Déclenchement pneu de guidage extérieur",
|
|
// "Déclenchement pneu porteur intérieur",
|
|
// "Déclenchement pneu porteur extérieur",
|
|
// "Pré-détection frotteur négatif"};
|
|
|
|
CZT2AnalysisThread::CZT2AnalysisThread()
|
|
{
|
|
mLastInputs = 0;
|
|
mZT2TrainState = ZT2_PRE_DETECTION_STATE;
|
|
|
|
mPCIInputsHandle = 0;
|
|
mExitLoop = false;
|
|
mZT2Analyzing = false;
|
|
}
|
|
|
|
unsigned int CZT2AnalysisThread::Init(CPCIIOMgr *PCIIOHandle,GenericInputMasks_t *InputMasks,QElapsedTimer *RefTimer)
|
|
{
|
|
mPCIInputsHandle = PCIIOHandle;
|
|
mInputMasksPtr = InputMasks;
|
|
mReferenceTimer = RefTimer;
|
|
|
|
return RET_OK;
|
|
}
|
|
|
|
void CZT2AnalysisThread::AnalyzeZT2Train()
|
|
{
|
|
|
|
qDebug("ZT2 Thread started!");
|
|
mExitLoop = false;
|
|
mZT2Analyzing = true;
|
|
|
|
|
|
mZT2TrainState = ZT2_PRE_DETECTION_STATE;
|
|
unsigned int PCIInputs = 0;
|
|
bool Run = true;
|
|
|
|
//inputs
|
|
unsigned int S1 = 0, Pint = 0, Pext = 0;
|
|
|
|
//Train analysis variables
|
|
unsigned int Bogie = 0;
|
|
unsigned int Rank = 0;
|
|
unsigned int CountS1 = 0;
|
|
|
|
|
|
bool PPIDetected = false;
|
|
bool PPEDetected = false;
|
|
|
|
|
|
while(Run == true)
|
|
{
|
|
PCIInputs = mPCIInputsHandle->GetInputs();
|
|
|
|
if(PCIInputs != mLastInputs)
|
|
{
|
|
//Extract useful flags
|
|
|
|
S1 = ((PCIInputs & mInputMasksPtr->InputZT2S1Mask) != 0);
|
|
Pint = ((PCIInputs & mInputMasksPtr->InputZT2PIMask) != 0);
|
|
Pext = ((PCIInputs & mInputMasksPtr->InputZT2PEMask) != 0);
|
|
|
|
if(mZT2TrainState == ZT2_PRE_DETECTION_STATE)
|
|
{
|
|
if(/*S1 != 0 || */Pint != 0 || Pext != 0)
|
|
{
|
|
RegisterDetection(DETECTION_ZT1_FN_PRE_DETECTION,0,mReferenceTimer->nsecsElapsed());
|
|
}
|
|
mZT2TrainState = ZT2_WAIT_FOR_S1_STATE;
|
|
}
|
|
|
|
switch(mZT2TrainState)
|
|
{
|
|
case ZT2_PRE_DETECTION_STATE:
|
|
{
|
|
qDebug("ZT2AnalysisThread::Logic error, in ZT2 Pre detection state and should not...");
|
|
mZT2TrainState = ZT2_WAIT_FOR_S1_STATE;
|
|
break;
|
|
}
|
|
case ZT2_WAIT_FOR_S1_STATE:
|
|
{
|
|
if(Pint != 0)
|
|
{
|
|
if(PPIDetected == false)
|
|
{
|
|
PPIDetected = true;
|
|
RegisterDetection(DETECTION_ZT2_PPI_DETECTION,Rank,mReferenceTimer->nsecsElapsed());
|
|
}
|
|
}
|
|
if(Pext != 0)
|
|
{
|
|
if(PPEDetected == false)
|
|
{
|
|
PPEDetected = true;
|
|
RegisterDetection(DETECTION_ZT2_PPE_DETECTION,Rank,mReferenceTimer->nsecsElapsed());
|
|
}
|
|
}
|
|
|
|
if(S1 == 1)
|
|
{
|
|
Rank++;
|
|
CountS1++;
|
|
if(Rank %2 == 1)
|
|
Bogie++;
|
|
|
|
PPIDetected = false;
|
|
PPEDetected = false;
|
|
|
|
mZT2TrainState = ZT2_S1_ACTIVE_STATE;
|
|
}
|
|
break;
|
|
}
|
|
case ZT2_S1_ACTIVE_STATE:
|
|
{
|
|
if(Pint != 0)
|
|
{
|
|
if(PPIDetected == false)
|
|
{
|
|
PPIDetected = true;
|
|
RegisterDetection(DETECTION_ZT2_PPI_DETECTION,Rank,mReferenceTimer->nsecsElapsed());
|
|
}
|
|
}
|
|
if(Pext != 0)
|
|
{
|
|
if(PPEDetected == false)
|
|
{
|
|
PPEDetected = true;
|
|
RegisterDetection(DETECTION_ZT2_PPE_DETECTION,Rank,mReferenceTimer->nsecsElapsed());
|
|
}
|
|
}
|
|
|
|
if(S1 == 0)
|
|
{
|
|
mZT2TrainState = ZT2_WAIT_FOR_S1_STATE;
|
|
}
|
|
break;
|
|
}
|
|
}//switch(mZT2TrainState)
|
|
|
|
mLastInputs = PCIInputs;
|
|
|
|
CZT2ThreadData *Data = new CZT2ThreadData();
|
|
Data->mTimeStamp = mReferenceTimer->nsecsElapsed();
|
|
// Data->mDateTime = QDateTime::currentDateTime();
|
|
Data->mS1 = S1;
|
|
Data->mPPExt = Pext;
|
|
Data->mPPInt = Pint;
|
|
|
|
Data->mBogie = Bogie;
|
|
Data->mRank = Rank;
|
|
Data->mS1Count = CountS1;
|
|
|
|
|
|
emit ZT2DataUpdate(Data);
|
|
|
|
}//if(PCIInputs != mLastInputs)
|
|
|
|
|
|
mMutex.lock();
|
|
if(mExitLoop == true)
|
|
Run = false;
|
|
mMutex.unlock();
|
|
|
|
}//while
|
|
|
|
mZT2Analyzing = false;
|
|
|
|
}
|
|
|
|
void CZT2AnalysisThread::TerminateAnalysis()
|
|
{
|
|
mMutex.lock();
|
|
mExitLoop = true;
|
|
mMutex.unlock();
|
|
}
|
|
|
|
bool CZT2AnalysisThread::UpdateDetectionConfig(CZTDetectionFunctionConfig *NewConfig)
|
|
{
|
|
//do not update in the middle of a train analysis.
|
|
bool Go;
|
|
mMutex.lock();
|
|
Go = mZT2Analyzing;
|
|
mMutex.unlock();
|
|
|
|
if(Go == true)
|
|
return false;
|
|
|
|
//No need for a Mutex here since the thread is
|
|
//not analyzing.
|
|
mDetectionConfig = *NewConfig;
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
void CZT2AnalysisThread::RegisterDetection(unsigned int DetectionID, unsigned int Rank,qint64 TimeStamp)
|
|
{
|
|
if(mDetectionConfig.mZTDetectionConfig[DETECTION_FCT_ZT2].AnalysisActive == false)
|
|
return;
|
|
|
|
|
|
switch(DetectionID)
|
|
{
|
|
case DETECTION_ZT2_PRE_DETECTION:
|
|
{
|
|
break;
|
|
}
|
|
case DETECTION_ZT2_MAGNETIC_SENCOR_COUNT:
|
|
{
|
|
break;
|
|
}
|
|
case DETECTION_ZT2_PPI_DETECTION:
|
|
{
|
|
if(mDetectionConfig.mZTDetectionConfig[DETECTION_FCT_PP2].AnalysisActive == false)
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
case DETECTION_ZT2_PPE_DETECTION:
|
|
{
|
|
if(mDetectionConfig.mZTDetectionConfig[DETECTION_FCT_PP2].AnalysisActive == false)
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
CZTDetectionData *DetectData = new CZTDetectionData;
|
|
DetectData->mTimeStap = TimeStamp;
|
|
DetectData->mRank = Rank;
|
|
DetectData->mDetectionID = DetectionID;
|
|
|
|
emit DetectionTriggered(DetectData);
|
|
|
|
|
|
qDebug("%s -> Rang %d",CZTData::GetErrorString(DetectionID),Rank);
|
|
}
|
|
|