#include "CableTestEngine.h" #include "CableTestBench.h" CCableTestEngine::CCableTestEngine() { mCableTestSMState = CABLE_TEST_INIT_STATE; } CCableTestEngine::~CCableTestEngine() { delete mCableTestSMTimer; } int CCableTestEngine::InitCableTestEngine(CCableTestBench *ProgramHandle, CTestBenchSettings *SettingsHandle) { mProgramHandle = ProgramHandle; mTestCable = ProgramHandle->GetActualCable(); mTestInputConnectorHandle = mTestCable->GetInputConnector(); mTestOutputConnectorHandle = mTestCable->GetOutputConnector(); mTestReportHandle = ProgramHandle->GetTestReportHandle(); mAutoTestReportHandle = mTestReportHandle->GetAutomatedTestReport(); mCableTestSMTimer = new QTimer(); mCableTestSMTimer->setSingleShot(false); mCableTestSMTimer->setInterval(TEST_ENGINE_SM_TIMEOUT); mCableTestSMTimer->stop(); connect(mCableTestSMTimer,SIGNAL(timeout()),this,SLOT(SMTimerExpired())); mTestSettingsHandle = SettingsHandle; mIsSecondPass = false; CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT); return RET_OK; } void CCableTestEngine::CableTestEngineStateMachine(int Event) { switch(mCableTestSMState) { case CABLE_TEST_INIT_STATE: { mCableTestSMState = CABLE_TEST_STBY_STATE; mIsSecondPass = false; mCableTestSMTimer->start(); break; }//case CABLE_TEST_INIT_STATE case CABLE_TEST_STBY_STATE: { switch(Event) { case CABLE_TEST_START_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_TEST_START_AUTOMATED_TEST_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); break; } case CABLE_TEST_START_MANUAL_TEST_SM_EVENT: { mCableTestSMState = CABLE_TEST_START_MANUAL_TEST_STATE; break; } default: { break; } } break; }// case CABLE_TEST_STBY_STATE case CABLE_TEST_START_AUTOMATED_TEST_STATE: { mTestOutputConnectorHandle->ClearAllPins(); mCableTestSMState = CABLE_AUTO_TEST_SELF_TEST_STATE; mCableTestGPTimer.start(); //qDebug("Test automatique démarré..."); mTestReportHandle->AddLogEntry(QString("Démarrage du test automatique.")); break; }//case CABLE_TEST_START_AUTOMATED_TEST_STATE case CABLE_AUTO_TEST_SELF_TEST_STATE: { if(mCableTestGPTimer.elapsed() < mTestSettingsHandle->mPinHoldTime) { break; } else { QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates(); if(Out.count(true) != 0) { //TODO: Manage this failure mode mAutoTestReportHandle->SetPreTestResult(false); // qDebug("Échec de l'auto test des modules d'I/O"); QString LogString = QString("Échec de l'auto test des modules de sortie. %1 contacts sont activés : "); for(int pin = 0; pin < Out.count(); pin++) { if(Out.at(pin)) { mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1); LogString.append(QString("[%1], ")); } } mTestReportHandle->AddLogEntry(LogString); mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; break; } else { mCurPinUnderTest = 1; mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest); mAutoTestReportHandle->SetPreTestResult(true); mTestReportHandle->AddLogEntry(QString("Succès de l'auto test des modules d'I/O")); //OK } mCableTestGPTimer.start(); mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE; } break; }//case CABLE_AUTO_TEST_SELF_TEST_STATE case CABLE_AUTO_TEST_PINS_STATE: { switch(Event) { case CABLE_TEST_TICK_SM_EVENT: { if(mCableTestGPTimer.elapsed() < mTestSettingsHandle->mPinHoldTime) { break; } else { QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates(); QBitArray In = mTestInputConnectorHandle->GetInputPinsStates(); //Analyse the inputs buffer... if(In.count(true) != 1) //check if only 1 input pin is active { if(In.count(true) == 0) //Check if no input pin is active { if(mIsSecondPass == false) { mAutoTestReportHandle->SetPinContinuityResult(mCurPinUnderTest,false); mTestReportHandle->AddLogEntry(QString("Échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest)); } else { mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false); mTestReportHandle->AddLogEntry(QString("2è passe: échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest)); } } else //If here, many input pins are active... { if(mIsSecondPass == false) { QString LogString = QString("Échec du test d'isolation du contact %1 : (%2) contacts activés en entrée : ").arg(mCurPinUnderTest).arg(In.count(true)); mAutoTestReportHandle->SetPinIsolationResult(mCurPinUnderTest,false); for(int pin = 0; pin < In.count(); pin++) { if(In.at(pin)) { mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1); LogString.append(QString("[%1]").arg(pin+1)); } } // qDebug("Échec du test d'isolation du contact %d : (%d) contacts activés en entrée",mCurPinUnderTest,In.count(true)); mTestReportHandle->AddLogEntry(LogString); } else { mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false); QString LogString = QString("2è passe: chec du test d'isolation du contact %1 : (%2) contacts activés en entrée : ").arg(mCurPinUnderTest).arg(In.count(true)); mTestReportHandle->AddLogEntry(LogString); } } } else if(In.at(mCurPinUnderTest-1) == false) { //TODO: Manage this failure mode //the wrong pin is set on the input... find which int WrongPin = 0; for(int pin = 0; pin < In.count(); pin++) { if(In.at(pin)) { WrongPin = pin+1; break; } } if(mIsSecondPass == false) { mAutoTestReportHandle->SetPinConcordanceTestResult(mCurPinUnderTest,false,WrongPin); mTestReportHandle->AddLogEntry(QString("Échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin)); } else { mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false); mTestReportHandle->AddLogEntry(QString("2è passe: échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin)); } } else { //Pin test passed. Test the next one if(mIsSecondPass == false) { mAutoTestReportHandle->SetPinTestAllPassed(mCurPinUnderTest); mTestReportHandle->AddLogEntry(QString("Succès du test du contact %1").arg(mCurPinUnderTest)); } else { mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,true); mTestReportHandle->AddLogEntry(QString("2è passe: succès du test du contact %1").arg(mCurPinUnderTest)); } } mCurPinUnderTest++; if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount())) { //Test finished. if(mTestSettingsHandle->mExecSecondPass == true) //Check if we need to execute the test twice { if(mIsSecondPass == true) //Check if this was the second pass. { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished } else { mCableTestSMState = CABLE_AUTO_TEST_START_SECOND_PASS_STATE; //start the 2nd test } } else { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished } } else { mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest); mCableTestGPTimer.start(); } } break; } case CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); // qDebug("Test mis en pause..."); mTestReportHandle->AddLogEntry(QString("Test mis en pause")); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; // qDebug("Test annulé..."); mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur")); break; } default: { break; } } break; }//case CABLE_AUTO_TEST_PINS_STATE: case CABLE_AUTO_TEST_PAUSE_STATE: { switch(Event) { case CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); // qDebug("Test redémarré..."); mTestReportHandle->AddLogEntry(QString("Test redémarré...")); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; // qDebug("Test annulé..."); mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur")); break; } default: { break; } } break; }//case CABLE_AUTO_TEST_PAUSE_STATE case CABLE_AUTO_TEST_START_SECOND_PASS_STATE: { //restart test but skip module self-test... mIsSecondPass = true; mCurPinUnderTest = 1; mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest); mCableTestGPTimer.start(); mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE; mTestReportHandle->AddLogEntry(QString("Démarrage du deuxième test")); break; }//case CABLE_AUTO_TEST_START_SECOND_PASS_STATE case CABLE_AUTO_TEST_END_TEST_STATE: { // qDebug("Test automatique terminé..."); mIsSecondPass = false; mTestReportHandle->AddLogEntry(QString("Test automatique terminé")); mTestOutputConnectorHandle->ClearAllPins(); mCableTestSMState = CABLE_TEST_STBY_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); break; }//case CABLE_TEST_END_TEST_STATE case CABLE_TEST_START_MANUAL_TEST_STATE: { mTestOutputConnectorHandle->ClearAllPins(); // qDebug("Entrée en mode test manuel"); mTestReportHandle->AddLogEntry(QString("Entrée en mode test manuel")); mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); break; }//CABLE_TEST_START_MANUAL_TEST_STATE case CABLE_MANUAL_TEST_PINS_STATE: { switch(Event) { case CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT: { mCableTestSMState = CABLE_MANUAL_TEST_END_TEST_STATE; break; } default: { break; } } break; }//CABLE_MANUAL_TEST_PINS_STATE case CABLE_MANUAL_TEST_END_TEST_STATE: { mTestOutputConnectorHandle->ClearAllPins(); mCableTestSMState = CABLE_TEST_STBY_STATE; mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode()); mTestReportHandle->AddLogEntry(QString("Fin du test manuel")); break; } } } void CCableTestEngine::SMTimerExpired() { //TODO: manage the end of the test CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT); } int CCableTestEngine::StartAutomatedTest() { if(mCableTestSMState != CABLE_TEST_STBY_STATE) { return RET_ERROR; } CableTestEngineStateMachine(CABLE_TEST_START_AUTO_TEST_SM_EVENT); return RET_OK; } int CCableTestEngine::PauseAutomatedTest() { CableTestEngineStateMachine(CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT); return RET_OK; } int CCableTestEngine::ResumeAutomatedTest() { CableTestEngineStateMachine(CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT); return RET_OK; } int CCableTestEngine::StopAutomatedTest() { CableTestEngineStateMachine(CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT); return RET_OK; } int CCableTestEngine::StartManualTest() { CableTestEngineStateMachine(CABLE_TEST_START_MANUAL_TEST_SM_EVENT); return RET_OK; } int CCableTestEngine::StopManualTest() { CableTestEngineStateMachine(CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT); return RET_OK; } CCableTestEngine::eCableTestEngineMode CCableTestEngine::GetTestEngineCurrentMode() { switch(mCableTestSMState) { case CABLE_TEST_INIT_STATE: case CABLE_TEST_STBY_STATE: case CABLE_AUTO_TEST_END_TEST_STATE: case CABLE_MANUAL_TEST_END_TEST_STATE: { return CABLE_TEST_STBY_MODE; break; } case CABLE_TEST_START_AUTOMATED_TEST_STATE: case CABLE_AUTO_TEST_SELF_TEST_STATE: case CABLE_AUTO_TEST_PINS_STATE: { return CABLE_AUTO_TEST_RUNNING_MODE; break; } case CABLE_AUTO_TEST_PAUSE_STATE: { return CABLE_AUTO_TEST_PAUSED_MODE; break; } case CABLE_TEST_START_MANUAL_TEST_STATE: case CABLE_MANUAL_TEST_PINS_STATE: default: { return CABLE_TEST_MANUAL_MODE; break; } } } int CCableTestEngine::ManualPinToggle(int ConnectorPinNbr) { if(GetTestEngineCurrentMode() == CABLE_TEST_MANUAL_MODE) { return mTestOutputConnectorHandle->TogglePin(ConnectorPinNbr); } return RET_ERROR; }