25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

409 satır
14 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)
  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. //TODO: Get this from the options page...
  25. mPinHoldTime = 300; //ms
  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. mCableTestSMTimer->start();
  37. break;
  38. }//case CABLE_TEST_INIT_STATE
  39. case CABLE_TEST_STBY_STATE:
  40. {
  41. switch(Event)
  42. {
  43. case CABLE_TEST_START_AUTO_TEST_SM_EVENT:
  44. {
  45. mCableTestSMState = CABLE_TEST_START_AUTOMATED_TEST_STATE;
  46. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  47. break;
  48. }
  49. case CABLE_TEST_START_MANUAL_TEST_SM_EVENT:
  50. {
  51. mCableTestSMState = CABLE_TEST_START_MANUAL_TEST_STATE;
  52. break;
  53. }
  54. default:
  55. {
  56. break;
  57. }
  58. }
  59. break;
  60. }// case CABLE_TEST_STBY_STATE
  61. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  62. {
  63. mTestOutputConnectorHandle->ClearAllPins();
  64. mCableTestSMState = CABLE_AUTO_TEST_SELF_TEST_STATE;
  65. mCableTestGPTimer.start();
  66. //qDebug("Test automatique démarré...");
  67. mTestReportHandle->AddLogEntry(QString("Démarrage du test automatique."));
  68. break;
  69. }//case CABLE_TEST_START_AUTOMATED_TEST_STATE
  70. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  71. {
  72. if(mCableTestGPTimer.elapsed() < mPinHoldTime)
  73. {
  74. break;
  75. }
  76. else
  77. {
  78. QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates();
  79. if(Out.count(true) != 0)
  80. {
  81. //TODO: Manage this failure mode
  82. mAutoTestReportHandle->SetPreTestResult(false);
  83. // qDebug("Échec de l'auto test des modules d'I/O");
  84. QString LogString = QString("Échec de l'auto test des modules de sortie. %1 contacts sont activés : ");
  85. for(int pin = 0; pin < Out.count(); pin++)
  86. {
  87. if(Out.at(pin))
  88. {
  89. mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1);
  90. LogString.append(QString("[%1], "));
  91. }
  92. }
  93. mTestReportHandle->AddLogEntry(LogString);
  94. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  95. break;
  96. }
  97. else
  98. {
  99. mCurPinUnderTest = 1;
  100. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  101. mAutoTestReportHandle->SetPreTestResult(true);
  102. mTestReportHandle->AddLogEntry(QString("Succès de l'auto test des modules d'I/O"));
  103. //OK
  104. }
  105. mCableTestGPTimer.start();
  106. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  107. }
  108. break;
  109. }//case CABLE_AUTO_TEST_SELF_TEST_STATE
  110. case CABLE_AUTO_TEST_PINS_STATE:
  111. {
  112. switch(Event)
  113. {
  114. case CABLE_TEST_TICK_SM_EVENT:
  115. {
  116. if(mCableTestGPTimer.elapsed() < mPinHoldTime)
  117. {
  118. break;
  119. }
  120. else
  121. {
  122. QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates();
  123. QBitArray In = mTestInputConnectorHandle->GetInputPinsStates();
  124. //Analyse the inputs buffer...
  125. if(In.count(true) != 1) //check if only 1 input pin is active
  126. {
  127. if(In.count(true) == 0) //Check if no input pin is active
  128. {
  129. mAutoTestReportHandle->SetPinContinuityResult(mCurPinUnderTest,false);
  130. // qDebug("Échec du test du contact %d : aucune pin activée en entrée",mCurPinUnderTest);
  131. mTestReportHandle->AddLogEntry(QString("Échec du test du contact %1 : aucun contact activé en entrée").arg(mCurPinUnderTest));
  132. }
  133. else //If here, many input pins are active...
  134. {
  135. QString LogString = QString("Échec du test d'isolation du contact %1 : (%2) contacts activés en entrée : ").arg(mCurPinUnderTest).arg(In.count(true));
  136. mAutoTestReportHandle->SetPinIsolationResult(mCurPinUnderTest,false);
  137. for(int pin = 0; pin < In.count(); pin++)
  138. {
  139. if(In.at(pin))
  140. {
  141. mAutoTestReportHandle->AddShortedPinToPinTest(mCurPinUnderTest,pin+1);
  142. LogString.append(QString("[%1]").arg(pin+1));
  143. }
  144. }
  145. // qDebug("Échec du test d'isolation du contact %d : (%d) contacts activés en entrée",mCurPinUnderTest,In.count(true));
  146. mTestReportHandle->AddLogEntry(LogString);
  147. }
  148. }
  149. else if(In.at(mCurPinUnderTest-1) == false)
  150. {
  151. //TODO: Manage this failure mode
  152. //the wrong pin is set on the input... find which
  153. int WrongPin = 0;
  154. for(int pin = 0; pin < In.count(); pin++)
  155. {
  156. if(In.at(pin))
  157. {
  158. WrongPin = pin+1;
  159. break;
  160. }
  161. }
  162. mAutoTestReportHandle->SetPinConcordanceTestResult(mCurPinUnderTest,false,WrongPin);
  163. mTestReportHandle->AddLogEntry(QString("Échec du test d'assignation du contact %1: le contact %2 est activé.").arg(mCurPinUnderTest).arg(WrongPin));
  164. // qDebug("Échec du test d'assignation du contact %d: le contact %d est activé.",mCurPinUnderTest);
  165. }
  166. else
  167. {
  168. //Pin test passed. Test the next one
  169. mAutoTestReportHandle->SetPinTestAllPassed(mCurPinUnderTest);
  170. // qDebug("Succès du test du contact %d", mCurPinUnderTest);
  171. mTestReportHandle->AddLogEntry(QString("Succès du test du contact %1").arg(mCurPinUnderTest));
  172. }
  173. mCurPinUnderTest++;
  174. if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount()))
  175. {
  176. //Test finished.
  177. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  178. }
  179. else
  180. {
  181. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  182. mCableTestGPTimer.start();
  183. }
  184. }
  185. break;
  186. }
  187. case CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT:
  188. {
  189. mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE;
  190. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  191. // qDebug("Test mis en pause...");
  192. mTestReportHandle->AddLogEntry(QString("Test mis en pause"));
  193. break;
  194. }
  195. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  196. {
  197. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  198. // qDebug("Test annulé...");
  199. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  200. break;
  201. }
  202. default:
  203. {
  204. break;
  205. }
  206. }
  207. break;
  208. }//case CABLE_AUTO_TEST_PINS_STATE:
  209. case CABLE_AUTO_TEST_PAUSE_STATE:
  210. {
  211. switch(Event)
  212. {
  213. case CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT:
  214. {
  215. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  216. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  217. // qDebug("Test redémarré...");
  218. mTestReportHandle->AddLogEntry(QString("Test redémarré..."));
  219. break;
  220. }
  221. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  222. {
  223. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  224. // qDebug("Test annulé...");
  225. mTestReportHandle->AddLogEntry(QString("Test annulé par l'utilisateur"));
  226. break;
  227. }
  228. default:
  229. {
  230. break;
  231. }
  232. }
  233. break;
  234. }//case CABLE_AUTO_TEST_PAUSE_STATE
  235. case CABLE_AUTO_TEST_END_TEST_STATE:
  236. {
  237. // qDebug("Test automatique terminé...");
  238. mTestReportHandle->AddLogEntry(QString("Test automatique terminé"));
  239. mTestOutputConnectorHandle->ClearAllPins();
  240. mCableTestSMState = CABLE_TEST_STBY_STATE;
  241. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  242. break;
  243. }//case CABLE_TEST_END_TEST_STATE
  244. case CABLE_TEST_START_MANUAL_TEST_STATE:
  245. {
  246. mTestOutputConnectorHandle->ClearAllPins();
  247. // qDebug("Entrée en mode test manuel");
  248. mTestReportHandle->AddLogEntry(QString("Entrée en mode test manuel"));
  249. mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE;
  250. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  251. break;
  252. }//CABLE_TEST_START_MANUAL_TEST_STATE
  253. case CABLE_MANUAL_TEST_PINS_STATE:
  254. {
  255. switch(Event)
  256. {
  257. case CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT:
  258. {
  259. mCableTestSMState = CABLE_MANUAL_TEST_END_TEST_STATE;
  260. break;
  261. }
  262. default:
  263. {
  264. break;
  265. }
  266. }
  267. break;
  268. }//CABLE_MANUAL_TEST_PINS_STATE
  269. case CABLE_MANUAL_TEST_END_TEST_STATE:
  270. {
  271. mTestOutputConnectorHandle->ClearAllPins();
  272. mCableTestSMState = CABLE_TEST_STBY_STATE;
  273. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  274. mTestReportHandle->AddLogEntry(QString("Fin du test manuel"));
  275. break;
  276. }
  277. }
  278. }
  279. void CCableTestEngine::SMTimerExpired()
  280. {
  281. //TODO: manage the end of the test
  282. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  283. }
  284. int CCableTestEngine::StartAutomatedTest()
  285. {
  286. if(mCableTestSMState != CABLE_TEST_STBY_STATE)
  287. {
  288. return RET_ERROR;
  289. }
  290. CableTestEngineStateMachine(CABLE_TEST_START_AUTO_TEST_SM_EVENT);
  291. return RET_OK;
  292. }
  293. int CCableTestEngine::PauseAutomatedTest()
  294. {
  295. CableTestEngineStateMachine(CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT);
  296. return RET_OK;
  297. }
  298. int CCableTestEngine::ResumeAutomatedTest()
  299. {
  300. CableTestEngineStateMachine(CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT);
  301. return RET_OK;
  302. }
  303. int CCableTestEngine::StopAutomatedTest()
  304. {
  305. CableTestEngineStateMachine(CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT);
  306. return RET_OK;
  307. }
  308. int CCableTestEngine::StartManualTest()
  309. {
  310. CableTestEngineStateMachine(CABLE_TEST_START_MANUAL_TEST_SM_EVENT);
  311. return RET_OK;
  312. }
  313. int CCableTestEngine::StopManualTest()
  314. {
  315. CableTestEngineStateMachine(CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT);
  316. return RET_OK;
  317. }
  318. CCableTestEngine::eCableTestEngineMode CCableTestEngine::GetTestEngineCurrentMode()
  319. {
  320. switch(mCableTestSMState)
  321. {
  322. case CABLE_TEST_INIT_STATE:
  323. case CABLE_TEST_STBY_STATE:
  324. case CABLE_AUTO_TEST_END_TEST_STATE:
  325. case CABLE_MANUAL_TEST_END_TEST_STATE:
  326. {
  327. return CABLE_TEST_STBY_MODE;
  328. break;
  329. }
  330. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  331. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  332. case CABLE_AUTO_TEST_PINS_STATE:
  333. {
  334. return CABLE_AUTO_TEST_RUNNING_MODE;
  335. break;
  336. }
  337. case CABLE_AUTO_TEST_PAUSE_STATE:
  338. {
  339. return CABLE_AUTO_TEST_PAUSED_MODE;
  340. break;
  341. }
  342. case CABLE_TEST_START_MANUAL_TEST_STATE:
  343. case CABLE_MANUAL_TEST_PINS_STATE:
  344. default:
  345. {
  346. return CABLE_TEST_MANUAL_MODE;
  347. break;
  348. }
  349. }
  350. }
  351. int CCableTestEngine::ManualPinToggle(int ConnectorPinNbr)
  352. {
  353. if(GetTestEngineCurrentMode() == CABLE_TEST_MANUAL_MODE)
  354. {
  355. return mTestOutputConnectorHandle->TogglePin(ConnectorPinNbr);
  356. }
  357. return RET_ERROR;
  358. }