Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

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