You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

478 line
18 KiB

  1. #include "CableTestEngine.h"
  2. #include "CableTestBench.h"
  3. CCableTestEngine::CCableTestEngine()
  4. {
  5. mCableTestSMState = CABLE_TEST_INIT_STATE;
  6. }
  7. CCableTestEngine::~CCableTestEngine()
  8. {
  9. delete mCableTestSMTimer;
  10. }
  11. int CCableTestEngine::InitCableTestEngine(CCableTestBench *ProgramHandle, CTestBenchSettings *SettingsHandle)
  12. {
  13. mProgramHandle = ProgramHandle;
  14. mTestCable = ProgramHandle->GetActualCable();
  15. mTestInputConnectorHandle = mTestCable->GetInputConnector();
  16. mTestOutputConnectorHandle = mTestCable->GetOutputConnector();
  17. mTestReportHandle = ProgramHandle->GetTestReportHandle();
  18. mAutoTestReportHandle = mTestReportHandle->GetAutomatedTestReport();
  19. mCableTestSMTimer = new QTimer();
  20. mCableTestSMTimer->setSingleShot(false);
  21. mCableTestSMTimer->setInterval(TEST_ENGINE_SM_TIMEOUT);
  22. mCableTestSMTimer->stop();
  23. connect(mCableTestSMTimer,SIGNAL(timeout()),this,SLOT(SMTimerExpired()));
  24. mTestSettingsHandle = SettingsHandle;
  25. mIsSecondPass = false;
  26. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  27. return RET_OK;
  28. }
  29. void CCableTestEngine::CableTestEngineStateMachine(int Event)
  30. {
  31. switch(mCableTestSMState)
  32. {
  33. case CABLE_TEST_INIT_STATE:
  34. {
  35. mCableTestSMState = CABLE_TEST_STBY_STATE;
  36. mIsSecondPass = false;
  37. mCableTestSMTimer->start();
  38. break;
  39. }//case CABLE_TEST_INIT_STATE
  40. case CABLE_TEST_STBY_STATE:
  41. {
  42. switch(Event)
  43. {
  44. case CABLE_TEST_START_AUTO_TEST_SM_EVENT:
  45. {
  46. mCableTestSMState = CABLE_TEST_START_AUTOMATED_TEST_STATE;
  47. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  48. break;
  49. }
  50. case CABLE_TEST_START_MANUAL_TEST_SM_EVENT:
  51. {
  52. mCableTestSMState = CABLE_TEST_START_MANUAL_TEST_STATE;
  53. break;
  54. }
  55. default:
  56. {
  57. break;
  58. }
  59. }
  60. break;
  61. }// case CABLE_TEST_STBY_STATE
  62. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  63. {
  64. mTestOutputConnectorHandle->ClearAllPins();
  65. mCableTestSMState = CABLE_AUTO_TEST_SELF_TEST_STATE;
  66. mCableTestGPTimer.start();
  67. //qDebug("Test automatique démarré...");
  68. mTestReportHandle->AddLogEntry(QString("Démarrage du test automatique."));
  69. break;
  70. }//case CABLE_TEST_START_AUTOMATED_TEST_STATE
  71. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  72. {
  73. if(mCableTestGPTimer.elapsed() < mTestSettingsHandle->mPinHoldTime)
  74. {
  75. break;
  76. }
  77. else
  78. {
  79. QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates();
  80. if(Out.count(true) != 0)
  81. {
  82. //TODO: Manage this failure mode
  83. mAutoTestReportHandle->SetPreTestResult(false);
  84. // qDebug("Échec de l'auto test des modules d'I/O");
  85. QString LogString = QString("Échec de l'auto test des modules de sortie. %1 contacts sont activés : ");
  86. for(int pin = 0; pin < Out.count(); pin++)
  87. {
  88. if(Out.at(pin))
  89. {
  90. mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1);
  91. LogString.append(QString("[%1], "));
  92. }
  93. }
  94. mTestReportHandle->AddLogEntry(LogString);
  95. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  96. break;
  97. }
  98. else
  99. {
  100. mCurPinUnderTest = 1;
  101. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  102. mAutoTestReportHandle->SetPreTestResult(true);
  103. mTestReportHandle->AddLogEntry(QString("Succès de l'auto test des modules d'I/O"));
  104. //OK
  105. }
  106. mCableTestGPTimer.start();
  107. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  108. }
  109. break;
  110. }//case CABLE_AUTO_TEST_SELF_TEST_STATE
  111. case CABLE_AUTO_TEST_PINS_STATE:
  112. {
  113. switch(Event)
  114. {
  115. case CABLE_TEST_TICK_SM_EVENT:
  116. {
  117. if(mCableTestGPTimer.elapsed() < mTestSettingsHandle->mPinHoldTime)
  118. {
  119. break;
  120. }
  121. else
  122. {
  123. QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates();
  124. QBitArray In = mTestInputConnectorHandle->GetInputPinsStates();
  125. //Analyse the inputs buffer...
  126. if(In.count(true) != 1) //check if only 1 input pin is active
  127. {
  128. if(In.count(true) == 0) //Check if no input pin is active
  129. {
  130. if(mIsSecondPass == false)
  131. {
  132. mAutoTestReportHandle->SetPinContinuityResult(mCurPinUnderTest,false);
  133. mTestReportHandle->AddLogEntry(QString("Échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest));
  134. }
  135. else
  136. {
  137. mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false);
  138. mTestReportHandle->AddLogEntry(QString("2è passe: échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest));
  139. }
  140. }
  141. else //If here, many input pins are active...
  142. {
  143. if(mIsSecondPass == false)
  144. {
  145. QString LogString = QString("Échec du test d'isolation du contact %1 : (%2) contacts activés en entrée : ").arg(mCurPinUnderTest).arg(In.count(true));
  146. mAutoTestReportHandle->SetPinIsolationResult(mCurPinUnderTest,false);
  147. for(int pin = 0; pin < In.count(); pin++)
  148. {
  149. if(In.at(pin))
  150. {
  151. mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1);
  152. LogString.append(QString("[%1]").arg(pin+1));
  153. }
  154. }
  155. // qDebug("Échec du test d'isolation du contact %d : (%d) contacts activés en entrée",mCurPinUnderTest,In.count(true));
  156. mTestReportHandle->AddLogEntry(LogString);
  157. }
  158. else
  159. {
  160. mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false);
  161. 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));
  162. mTestReportHandle->AddLogEntry(LogString);
  163. }
  164. }
  165. }
  166. else if(In.at(mCurPinUnderTest-1) == false)
  167. {
  168. //TODO: Manage this failure mode
  169. //the wrong pin is set on the input... find which
  170. int WrongPin = 0;
  171. for(int pin = 0; pin < In.count(); pin++)
  172. {
  173. if(In.at(pin))
  174. {
  175. WrongPin = pin+1;
  176. break;
  177. }
  178. }
  179. if(mIsSecondPass == false)
  180. {
  181. mAutoTestReportHandle->SetPinConcordanceTestResult(mCurPinUnderTest,false,WrongPin);
  182. mTestReportHandle->AddLogEntry(QString("Échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin));
  183. }
  184. else
  185. {
  186. mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,false);
  187. mTestReportHandle->AddLogEntry(QString("2è passe: échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin));
  188. }
  189. }
  190. else
  191. {
  192. //Pin test passed. Test the next one
  193. if(mIsSecondPass == false)
  194. {
  195. mAutoTestReportHandle->SetPinTestAllPassed(mCurPinUnderTest);
  196. mTestReportHandle->AddLogEntry(QString("Succès du test du contact %1").arg(mCurPinUnderTest));
  197. }
  198. else
  199. {
  200. mAutoTestReportHandle->SetPinSecondTestResult(mCurPinUnderTest,true);
  201. mTestReportHandle->AddLogEntry(QString("2è passe: succès du test du contact %1").arg(mCurPinUnderTest));
  202. }
  203. }
  204. mCurPinUnderTest++;
  205. int TestPinCount = mTestOutputConnectorHandle->GetPinCount();
  206. if(mTestInputConnectorHandle->GetPinCount() < TestPinCount)
  207. {
  208. TestPinCount = mTestInputConnectorHandle->GetPinCount();
  209. }
  210. if(mCurPinUnderTest > TestPinCount)
  211. {
  212. //Test finished.
  213. if(mTestSettingsHandle->mExecSecondPass == true) //Check if we need to execute the test twice
  214. {
  215. if(mIsSecondPass == true) //Check if this was the second pass.
  216. {
  217. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished
  218. }
  219. else
  220. {
  221. mCableTestSMState = CABLE_AUTO_TEST_START_SECOND_PASS_STATE; //start the 2nd test
  222. }
  223. }
  224. else
  225. {
  226. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished
  227. }
  228. }
  229. else
  230. {
  231. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  232. mCableTestGPTimer.start();
  233. }
  234. }
  235. break;
  236. }
  237. case CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT:
  238. {
  239. mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE;
  240. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  241. // qDebug("Test mis en pause...");
  242. mTestReportHandle->AddLogEntry(QString("Test mis en pause"));
  243. break;
  244. }
  245. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  246. {
  247. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  248. // qDebug("Test annulé...");
  249. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  250. break;
  251. }
  252. default:
  253. {
  254. break;
  255. }
  256. }
  257. break;
  258. }//case CABLE_AUTO_TEST_PINS_STATE:
  259. case CABLE_AUTO_TEST_PAUSE_STATE:
  260. {
  261. switch(Event)
  262. {
  263. case CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT:
  264. {
  265. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  266. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  267. // qDebug("Test redémarré...");
  268. mTestReportHandle->AddLogEntry(QString("Test redémarré..."));
  269. break;
  270. }
  271. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  272. {
  273. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  274. // qDebug("Test annulé...");
  275. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  276. break;
  277. }
  278. default:
  279. {
  280. break;
  281. }
  282. }
  283. break;
  284. }//case CABLE_AUTO_TEST_PAUSE_STATE
  285. case CABLE_AUTO_TEST_START_SECOND_PASS_STATE:
  286. {
  287. //restart test but skip module self-test...
  288. mIsSecondPass = true;
  289. mCurPinUnderTest = 1;
  290. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  291. mCableTestGPTimer.start();
  292. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  293. mTestReportHandle->AddLogEntry(QString("Démarrage du deuxième test"));
  294. break;
  295. }//case CABLE_AUTO_TEST_START_SECOND_PASS_STATE
  296. case CABLE_AUTO_TEST_END_TEST_STATE:
  297. {
  298. // qDebug("Test automatique terminé...");
  299. mIsSecondPass = false;
  300. mTestReportHandle->AddLogEntry(QString("Test automatique terminé"));
  301. mTestOutputConnectorHandle->ClearAllPins();
  302. mCableTestSMState = CABLE_TEST_STBY_STATE;
  303. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  304. break;
  305. }//case CABLE_TEST_END_TEST_STATE
  306. case CABLE_TEST_START_MANUAL_TEST_STATE:
  307. {
  308. mTestOutputConnectorHandle->ClearAllPins();
  309. // qDebug("Entrée en mode test manuel");
  310. mTestReportHandle->AddLogEntry(QString("Entrée en mode test manuel"));
  311. mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE;
  312. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  313. break;
  314. }//CABLE_TEST_START_MANUAL_TEST_STATE
  315. case CABLE_MANUAL_TEST_PINS_STATE:
  316. {
  317. switch(Event)
  318. {
  319. case CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT:
  320. {
  321. mCableTestSMState = CABLE_MANUAL_TEST_END_TEST_STATE;
  322. break;
  323. }
  324. default:
  325. {
  326. break;
  327. }
  328. }
  329. break;
  330. }//CABLE_MANUAL_TEST_PINS_STATE
  331. case CABLE_MANUAL_TEST_END_TEST_STATE:
  332. {
  333. mTestOutputConnectorHandle->ClearAllPins();
  334. mCableTestSMState = CABLE_TEST_STBY_STATE;
  335. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  336. mTestReportHandle->AddLogEntry(QString("Fin du test manuel"));
  337. break;
  338. }
  339. }
  340. }
  341. void CCableTestEngine::SMTimerExpired()
  342. {
  343. //TODO: manage the end of the test
  344. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  345. }
  346. int CCableTestEngine::StartAutomatedTest()
  347. {
  348. if(mCableTestSMState != CABLE_TEST_STBY_STATE)
  349. {
  350. return RET_ERROR;
  351. }
  352. CableTestEngineStateMachine(CABLE_TEST_START_AUTO_TEST_SM_EVENT);
  353. return RET_OK;
  354. }
  355. int CCableTestEngine::PauseAutomatedTest()
  356. {
  357. CableTestEngineStateMachine(CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT);
  358. return RET_OK;
  359. }
  360. int CCableTestEngine::ResumeAutomatedTest()
  361. {
  362. CableTestEngineStateMachine(CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT);
  363. return RET_OK;
  364. }
  365. int CCableTestEngine::StopAutomatedTest()
  366. {
  367. CableTestEngineStateMachine(CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT);
  368. return RET_OK;
  369. }
  370. int CCableTestEngine::StartManualTest()
  371. {
  372. CableTestEngineStateMachine(CABLE_TEST_START_MANUAL_TEST_SM_EVENT);
  373. return RET_OK;
  374. }
  375. int CCableTestEngine::StopManualTest()
  376. {
  377. CableTestEngineStateMachine(CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT);
  378. return RET_OK;
  379. }
  380. CCableTestEngine::eCableTestEngineMode CCableTestEngine::GetTestEngineCurrentMode()
  381. {
  382. switch(mCableTestSMState)
  383. {
  384. case CABLE_TEST_INIT_STATE:
  385. case CABLE_TEST_STBY_STATE:
  386. case CABLE_AUTO_TEST_END_TEST_STATE:
  387. case CABLE_MANUAL_TEST_END_TEST_STATE:
  388. {
  389. return CABLE_TEST_STBY_MODE;
  390. break;
  391. }
  392. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  393. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  394. case CABLE_AUTO_TEST_PINS_STATE:
  395. {
  396. return CABLE_AUTO_TEST_RUNNING_MODE;
  397. break;
  398. }
  399. case CABLE_AUTO_TEST_PAUSE_STATE:
  400. {
  401. return CABLE_AUTO_TEST_PAUSED_MODE;
  402. break;
  403. }
  404. case CABLE_TEST_START_MANUAL_TEST_STATE:
  405. case CABLE_MANUAL_TEST_PINS_STATE:
  406. default:
  407. {
  408. return CABLE_TEST_MANUAL_MODE;
  409. break;
  410. }
  411. }
  412. }
  413. int CCableTestEngine::ManualPinToggle(int ConnectorPinNbr)
  414. {
  415. if(GetTestEngineCurrentMode() == CABLE_TEST_MANUAL_MODE)
  416. {
  417. return mTestOutputConnectorHandle->TogglePin(ConnectorPinNbr);
  418. }
  419. return RET_ERROR;
  420. }