No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

473 líneas
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. if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount()))
  206. {
  207. //Test finished.
  208. if(mTestSettingsHandle->mExecSecondPass == true) //Check if we need to execute the test twice
  209. {
  210. if(mIsSecondPass == true) //Check if this was the second pass.
  211. {
  212. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished
  213. }
  214. else
  215. {
  216. mCableTestSMState = CABLE_AUTO_TEST_START_SECOND_PASS_STATE; //start the 2nd test
  217. }
  218. }
  219. else
  220. {
  221. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE; //test finished
  222. }
  223. }
  224. else
  225. {
  226. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  227. mCableTestGPTimer.start();
  228. }
  229. }
  230. break;
  231. }
  232. case CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT:
  233. {
  234. mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE;
  235. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  236. // qDebug("Test mis en pause...");
  237. mTestReportHandle->AddLogEntry(QString("Test mis en pause"));
  238. break;
  239. }
  240. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  241. {
  242. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  243. // qDebug("Test annulé...");
  244. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  245. break;
  246. }
  247. default:
  248. {
  249. break;
  250. }
  251. }
  252. break;
  253. }//case CABLE_AUTO_TEST_PINS_STATE:
  254. case CABLE_AUTO_TEST_PAUSE_STATE:
  255. {
  256. switch(Event)
  257. {
  258. case CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT:
  259. {
  260. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  261. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  262. // qDebug("Test redémarré...");
  263. mTestReportHandle->AddLogEntry(QString("Test redémarré..."));
  264. break;
  265. }
  266. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  267. {
  268. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  269. // qDebug("Test annulé...");
  270. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  271. break;
  272. }
  273. default:
  274. {
  275. break;
  276. }
  277. }
  278. break;
  279. }//case CABLE_AUTO_TEST_PAUSE_STATE
  280. case CABLE_AUTO_TEST_START_SECOND_PASS_STATE:
  281. {
  282. //restart test but skip module self-test...
  283. mIsSecondPass = true;
  284. mCurPinUnderTest = 1;
  285. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  286. mCableTestGPTimer.start();
  287. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  288. mTestReportHandle->AddLogEntry(QString("Démarrage du deuxième test"));
  289. break;
  290. }//case CABLE_AUTO_TEST_START_SECOND_PASS_STATE
  291. case CABLE_AUTO_TEST_END_TEST_STATE:
  292. {
  293. // qDebug("Test automatique terminé...");
  294. mIsSecondPass = false;
  295. mTestReportHandle->AddLogEntry(QString("Test automatique terminé"));
  296. mTestOutputConnectorHandle->ClearAllPins();
  297. mCableTestSMState = CABLE_TEST_STBY_STATE;
  298. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  299. break;
  300. }//case CABLE_TEST_END_TEST_STATE
  301. case CABLE_TEST_START_MANUAL_TEST_STATE:
  302. {
  303. mTestOutputConnectorHandle->ClearAllPins();
  304. // qDebug("Entrée en mode test manuel");
  305. mTestReportHandle->AddLogEntry(QString("Entrée en mode test manuel"));
  306. mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE;
  307. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  308. break;
  309. }//CABLE_TEST_START_MANUAL_TEST_STATE
  310. case CABLE_MANUAL_TEST_PINS_STATE:
  311. {
  312. switch(Event)
  313. {
  314. case CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT:
  315. {
  316. mCableTestSMState = CABLE_MANUAL_TEST_END_TEST_STATE;
  317. break;
  318. }
  319. default:
  320. {
  321. break;
  322. }
  323. }
  324. break;
  325. }//CABLE_MANUAL_TEST_PINS_STATE
  326. case CABLE_MANUAL_TEST_END_TEST_STATE:
  327. {
  328. mTestOutputConnectorHandle->ClearAllPins();
  329. mCableTestSMState = CABLE_TEST_STBY_STATE;
  330. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  331. mTestReportHandle->AddLogEntry(QString("Fin du test manuel"));
  332. break;
  333. }
  334. }
  335. }
  336. void CCableTestEngine::SMTimerExpired()
  337. {
  338. //TODO: manage the end of the test
  339. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  340. }
  341. int CCableTestEngine::StartAutomatedTest()
  342. {
  343. if(mCableTestSMState != CABLE_TEST_STBY_STATE)
  344. {
  345. return RET_ERROR;
  346. }
  347. CableTestEngineStateMachine(CABLE_TEST_START_AUTO_TEST_SM_EVENT);
  348. return RET_OK;
  349. }
  350. int CCableTestEngine::PauseAutomatedTest()
  351. {
  352. CableTestEngineStateMachine(CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT);
  353. return RET_OK;
  354. }
  355. int CCableTestEngine::ResumeAutomatedTest()
  356. {
  357. CableTestEngineStateMachine(CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT);
  358. return RET_OK;
  359. }
  360. int CCableTestEngine::StopAutomatedTest()
  361. {
  362. CableTestEngineStateMachine(CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT);
  363. return RET_OK;
  364. }
  365. int CCableTestEngine::StartManualTest()
  366. {
  367. CableTestEngineStateMachine(CABLE_TEST_START_MANUAL_TEST_SM_EVENT);
  368. return RET_OK;
  369. }
  370. int CCableTestEngine::StopManualTest()
  371. {
  372. CableTestEngineStateMachine(CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT);
  373. return RET_OK;
  374. }
  375. CCableTestEngine::eCableTestEngineMode CCableTestEngine::GetTestEngineCurrentMode()
  376. {
  377. switch(mCableTestSMState)
  378. {
  379. case CABLE_TEST_INIT_STATE:
  380. case CABLE_TEST_STBY_STATE:
  381. case CABLE_AUTO_TEST_END_TEST_STATE:
  382. case CABLE_MANUAL_TEST_END_TEST_STATE:
  383. {
  384. return CABLE_TEST_STBY_MODE;
  385. break;
  386. }
  387. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  388. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  389. case CABLE_AUTO_TEST_PINS_STATE:
  390. {
  391. return CABLE_AUTO_TEST_RUNNING_MODE;
  392. break;
  393. }
  394. case CABLE_AUTO_TEST_PAUSE_STATE:
  395. {
  396. return CABLE_AUTO_TEST_PAUSED_MODE;
  397. break;
  398. }
  399. case CABLE_TEST_START_MANUAL_TEST_STATE:
  400. case CABLE_MANUAL_TEST_PINS_STATE:
  401. default:
  402. {
  403. return CABLE_TEST_MANUAL_MODE;
  404. break;
  405. }
  406. }
  407. }
  408. int CCableTestEngine::ManualPinToggle(int ConnectorPinNbr)
  409. {
  410. if(GetTestEngineCurrentMode() == CABLE_TEST_MANUAL_MODE)
  411. {
  412. return mTestOutputConnectorHandle->TogglePin(ConnectorPinNbr);
  413. }
  414. return RET_ERROR;
  415. }