#include "CableTestEngine.h" #include "CableTestBench.h" CCableTestEngine::CCableTestEngine() { mCableTestSMState = CABLE_TEST_INIT_STATE; } CCableTestEngine::~CCableTestEngine() { delete mCableTestSMTimer; } int CCableTestEngine::InitCableTestEngine(CCableTestBench *ProgramHandle) { mProgramHandle = ProgramHandle; mTestCable = ProgramHandle->GetActualCable(); mTestInputConnectorHandle = mTestCable->GetInputConnector(); mTestOutputConnectorHandle = mTestCable->GetOutputConnector(); mCableTestSMTimer = new QTimer(); mCableTestSMTimer->setSingleShot(false); mCableTestSMTimer->setInterval(TEST_ENGINE_SM_TIMEOUT); mCableTestSMTimer->stop(); connect(mCableTestSMTimer,SIGNAL(timeout()),this,SLOT(SMTimerExpired())); //TODO: Get this from the options page... mPinHoldTime = 500; //ms 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; 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é..."); break; }//case CABLE_TEST_START_AUTOMATED_TEST_STATE case CABLE_AUTO_TEST_SELF_TEST_STATE: { if(mCableTestGPTimer.elapsed() < mPinHoldTime) { break; } else { if(mTestOutputConnectorHandle->GetOutputPinsStates().count(true) != 0) { //TODO: Manage this failure mode qDebug("Échec de l'auto test des modules de sortie"); } else { mCurPinUnderTest = 1; mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest); //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() < 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 { //TODO: Manage this failure mode if(In.count(true) == 0) //Check if no input pin is active { qDebug("Échec du test du contact %d : aucune pin activée en entrée",mCurPinUnderTest); } else //If here, many input pins are active... { qDebug("Échec du test du contact %d : plusieurs (%d) pins activées en entrée",mCurPinUnderTest,In.count(true)); } } else if(In.at(mCurPinUnderTest-1) == false) { //TODO: Manage this failure mode //the output pin isn't set... qDebug("Échec du test du contact %d: mauvais contact activé en entrée",mCurPinUnderTest); } else { //Pin test passed. Test the next one qDebug("Succès du test du contact %d", mCurPinUnderTest); } mCurPinUnderTest++; if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount())) { //Test finished. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; } 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..."); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; qDebug("Test annulé..."); 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é..."); break; } case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT: { mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; qDebug("Test annulé..."); break; } default: { break; } } break; }//case CABLE_AUTO_TEST_PAUSE_STATE case CABLE_AUTO_TEST_END_TEST_STATE: { qDebug("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"); 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()); 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; }