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.
 
 
 
 

355 satır
11 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. mCableTestSMTimer = new QTimer();
  18. mCableTestSMTimer->setSingleShot(false);
  19. mCableTestSMTimer->setInterval(TEST_ENGINE_SM_TIMEOUT);
  20. mCableTestSMTimer->stop();
  21. connect(mCableTestSMTimer,SIGNAL(timeout()),this,SLOT(SMTimerExpired()));
  22. //TODO: Get this from the options page...
  23. mPinHoldTime = 500; //ms
  24. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  25. return RET_OK;
  26. }
  27. void CCableTestEngine::CableTestEngineStateMachine(int Event)
  28. {
  29. switch(mCableTestSMState)
  30. {
  31. case CABLE_TEST_INIT_STATE:
  32. {
  33. mCableTestSMState = CABLE_TEST_STBY_STATE;
  34. mCableTestSMTimer->start();
  35. break;
  36. }//case CABLE_TEST_INIT_STATE
  37. case CABLE_TEST_STBY_STATE:
  38. {
  39. switch(Event)
  40. {
  41. case CABLE_TEST_START_AUTO_TEST_SM_EVENT:
  42. {
  43. mCableTestSMState = CABLE_TEST_START_AUTOMATED_TEST_STATE;
  44. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  45. break;
  46. }
  47. case CABLE_TEST_START_MANUAL_TEST_SM_EVENT:
  48. {
  49. mCableTestSMState = CABLE_TEST_START_MANUAL_TEST_STATE;
  50. break;
  51. }
  52. default:
  53. {
  54. break;
  55. }
  56. }
  57. break;
  58. }// case CABLE_TEST_STBY_STATE
  59. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  60. {
  61. mTestOutputConnectorHandle->ClearAllPins();
  62. mCableTestSMState = CABLE_AUTO_TEST_SELF_TEST_STATE;
  63. mCableTestGPTimer.start();
  64. qDebug("Test automatique démarré...");
  65. break;
  66. }//case CABLE_TEST_START_AUTOMATED_TEST_STATE
  67. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  68. {
  69. if(mCableTestGPTimer.elapsed() < mPinHoldTime)
  70. {
  71. break;
  72. }
  73. else
  74. {
  75. if(mTestOutputConnectorHandle->GetOutputPinsStates().count(true) != 0)
  76. {
  77. //TODO: Manage this failure mode
  78. qDebug("Échec de l'auto test des modules de sortie");
  79. }
  80. else
  81. {
  82. mCurPinUnderTest = 1;
  83. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  84. //OK
  85. }
  86. mCableTestGPTimer.start();
  87. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  88. }
  89. break;
  90. }//case CABLE_AUTO_TEST_SELF_TEST_STATE
  91. case CABLE_AUTO_TEST_PINS_STATE:
  92. {
  93. switch(Event)
  94. {
  95. case CABLE_TEST_TICK_SM_EVENT:
  96. {
  97. if(mCableTestGPTimer.elapsed() < mPinHoldTime)
  98. {
  99. break;
  100. }
  101. else
  102. {
  103. QBitArray Out = mTestOutputConnectorHandle->GetOutputPinsStates();
  104. QBitArray In = mTestInputConnectorHandle->GetInputPinsStates();
  105. //Analyse the inputs buffer...
  106. if(In.count(true) != 1) //check if only 1 input pin is active
  107. {
  108. //TODO: Manage this failure mode
  109. if(In.count(true) == 0) //Check if no input pin is active
  110. {
  111. qDebug("Échec du test du contact %d : aucune pin activée en entrée",mCurPinUnderTest);
  112. }
  113. else //If here, many input pins are active...
  114. {
  115. qDebug("Échec du test du contact %d : plusieurs (%d) pins activées en entrée",mCurPinUnderTest,In.count(true));
  116. }
  117. }
  118. else if(In.at(mCurPinUnderTest-1) == false)
  119. {
  120. //TODO: Manage this failure mode
  121. //the output pin isn't set...
  122. qDebug("Échec du test du contact %d: mauvais contact activé en entrée",mCurPinUnderTest);
  123. }
  124. else
  125. {
  126. //Pin test passed. Test the next one
  127. qDebug("Succès du test du contact %d", mCurPinUnderTest);
  128. }
  129. mCurPinUnderTest++;
  130. if(mCurPinUnderTest > (mTestOutputConnectorHandle->GetPinCount()))
  131. {
  132. //Test finished.
  133. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  134. }
  135. else
  136. {
  137. mTestOutputConnectorHandle->SetSinglePin(mCurPinUnderTest);
  138. mCableTestGPTimer.start();
  139. }
  140. }
  141. break;
  142. }
  143. case CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT:
  144. {
  145. mCableTestSMState = CABLE_AUTO_TEST_PAUSE_STATE;
  146. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  147. qDebug("Test mis en pause...");
  148. break;
  149. }
  150. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  151. {
  152. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  153. qDebug("Test annulé...");
  154. break;
  155. }
  156. default:
  157. {
  158. break;
  159. }
  160. }
  161. break;
  162. }//case CABLE_AUTO_TEST_PINS_STATE:
  163. case CABLE_AUTO_TEST_PAUSE_STATE:
  164. {
  165. switch(Event)
  166. {
  167. case CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT:
  168. {
  169. mCableTestSMState = CABLE_AUTO_TEST_PINS_STATE;
  170. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  171. qDebug("Test redémarré...");
  172. break;
  173. }
  174. case CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT:
  175. {
  176. mCableTestSMState = CABLE_AUTO_TEST_END_TEST_STATE;
  177. qDebug("Test annulé...");
  178. break;
  179. }
  180. default:
  181. {
  182. break;
  183. }
  184. }
  185. break;
  186. }//case CABLE_AUTO_TEST_PAUSE_STATE
  187. case CABLE_AUTO_TEST_END_TEST_STATE:
  188. {
  189. qDebug("Test automatique terminé...");
  190. mTestOutputConnectorHandle->ClearAllPins();
  191. mCableTestSMState = CABLE_TEST_STBY_STATE;
  192. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  193. break;
  194. }//case CABLE_TEST_END_TEST_STATE
  195. case CABLE_TEST_START_MANUAL_TEST_STATE:
  196. {
  197. mTestOutputConnectorHandle->ClearAllPins();
  198. qDebug("Entrée en mode test manuel");
  199. mCableTestSMState = CABLE_MANUAL_TEST_PINS_STATE;
  200. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  201. break;
  202. }//CABLE_TEST_START_MANUAL_TEST_STATE
  203. case CABLE_MANUAL_TEST_PINS_STATE:
  204. {
  205. switch(Event)
  206. {
  207. case CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT:
  208. {
  209. mCableTestSMState = CABLE_MANUAL_TEST_END_TEST_STATE;
  210. break;
  211. }
  212. default:
  213. {
  214. break;
  215. }
  216. }
  217. break;
  218. }//CABLE_MANUAL_TEST_PINS_STATE
  219. case CABLE_MANUAL_TEST_END_TEST_STATE:
  220. {
  221. mTestOutputConnectorHandle->ClearAllPins();
  222. mCableTestSMState = CABLE_TEST_STBY_STATE;
  223. mProgramHandle->CableEngineModeChanged(GetTestEngineCurrentMode());
  224. break;
  225. }
  226. }
  227. }
  228. void CCableTestEngine::SMTimerExpired()
  229. {
  230. //TODO: manage the end of the test
  231. CableTestEngineStateMachine(CABLE_TEST_TICK_SM_EVENT);
  232. }
  233. int CCableTestEngine::StartAutomatedTest()
  234. {
  235. if(mCableTestSMState != CABLE_TEST_STBY_STATE)
  236. {
  237. return RET_ERROR;
  238. }
  239. CableTestEngineStateMachine(CABLE_TEST_START_AUTO_TEST_SM_EVENT);
  240. return RET_OK;
  241. }
  242. int CCableTestEngine::PauseAutomatedTest()
  243. {
  244. CableTestEngineStateMachine(CABLE_TEST_PAUSE_AUTO_TEST_SM_EVENT);
  245. return RET_OK;
  246. }
  247. int CCableTestEngine::ResumeAutomatedTest()
  248. {
  249. CableTestEngineStateMachine(CABLE_TEST_RESUME_AUTO_TEST_SM_EVENT);
  250. return RET_OK;
  251. }
  252. int CCableTestEngine::StopAutomatedTest()
  253. {
  254. CableTestEngineStateMachine(CABLE_TEST_CANCEL_AUTO_TEST_SM_EVENT);
  255. return RET_OK;
  256. }
  257. int CCableTestEngine::StartManualTest()
  258. {
  259. CableTestEngineStateMachine(CABLE_TEST_START_MANUAL_TEST_SM_EVENT);
  260. return RET_OK;
  261. }
  262. int CCableTestEngine::StopManualTest()
  263. {
  264. CableTestEngineStateMachine(CABLE_TEST_EXIT_MANUAL_TEST_SM_EVENT);
  265. return RET_OK;
  266. }
  267. CCableTestEngine::eCableTestEngineMode CCableTestEngine::GetTestEngineCurrentMode()
  268. {
  269. switch(mCableTestSMState)
  270. {
  271. case CABLE_TEST_INIT_STATE:
  272. case CABLE_TEST_STBY_STATE:
  273. case CABLE_AUTO_TEST_END_TEST_STATE:
  274. case CABLE_MANUAL_TEST_END_TEST_STATE:
  275. {
  276. return CABLE_TEST_STBY_MODE;
  277. break;
  278. }
  279. case CABLE_TEST_START_AUTOMATED_TEST_STATE:
  280. case CABLE_AUTO_TEST_SELF_TEST_STATE:
  281. case CABLE_AUTO_TEST_PINS_STATE:
  282. {
  283. return CABLE_AUTO_TEST_RUNNING_MODE;
  284. break;
  285. }
  286. case CABLE_AUTO_TEST_PAUSE_STATE:
  287. {
  288. return CABLE_AUTO_TEST_PAUSED_MODE;
  289. break;
  290. }
  291. case CABLE_TEST_START_MANUAL_TEST_STATE:
  292. case CABLE_MANUAL_TEST_PINS_STATE:
  293. default:
  294. {
  295. return CABLE_TEST_MANUAL_MODE;
  296. break;
  297. }
  298. }
  299. }
  300. int CCableTestEngine::ManualPinToggle(int ConnectorPinNbr)
  301. {
  302. if(GetTestEngineCurrentMode() == CABLE_TEST_MANUAL_MODE)
  303. {
  304. return mTestOutputConnectorHandle->TogglePin(ConnectorPinNbr);
  305. }
  306. return RET_ERROR;
  307. }