Module_ChargerSelfTest.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. /*
  2. * Module_ChargerSelfTest.c
  3. *
  4. * Created on: 2021年9月24日
  5. * Author: 7978
  6. */
  7. #include <sys/time.h>
  8. #include <sys/timeb.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <sys/types.h>
  12. #include <sys/ioctl.h>
  13. #include <sys/socket.h>
  14. #include <sys/ipc.h>
  15. #include <sys/shm.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/can.h>
  19. #include <linux/can/raw.h>
  20. #include <linux/wireless.h>
  21. #include <arpa/inet.h>
  22. #include <netinet/in.h>
  23. #include <unistd.h>
  24. #include <stdarg.h>
  25. #include <stdio.h> /*標準輸入輸出定義*/
  26. #include <stdlib.h> /*標準函數庫定義*/
  27. #include <unistd.h> /*Unix 標準函數定義*/
  28. #include <fcntl.h> /*檔控制定義*/
  29. #include <termios.h> /*PPSIX 終端控制定義*/
  30. #include <errno.h> /*錯誤號定義*/
  31. #include <errno.h>
  32. #include <string.h>
  33. #include <time.h>
  34. #include <ctype.h>
  35. #include <ifaddrs.h>
  36. #include <signal.h>
  37. #include <net/if_arp.h>
  38. #include "../../define.h"
  39. #include "Module_ChargerSelfTest.h"
  40. #include "Config.h"
  41. #include "Common.h"
  42. #define SELFTEST_TIMEOUT 60 // unit: 1s
  43. #define VERSION_RETRY_TIMEOUT 180 // unit: 1s
  44. #define CABINET_ROLE_TIMEOUT 3 // unit: 1s
  45. #define PSU_SELF_TIMEOUT 60 // unit: 1s
  46. #define PSU_RETRY_TIMEOUT 60 // unit: 1s
  47. #define MAX_PSU_RETRY_CNT 3
  48. #define EMG_BTN_INTERVAL 1 // unit: 1s
  49. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  50. struct StatusCodeData *ShmStatusCodeData;
  51. struct PsuData *ShmPsuData;
  52. struct PrimaryMcuData *ShmPrimaryMcuData;
  53. struct FanModuleData *ShmFanModuleData;
  54. struct RelayModuleData *ShmRelayModuleData[2];
  55. struct LedModuleData *ShmLedModuleData;
  56. ChargerInfoData *ShmChargerInfo;
  57. PsuGroupCollectionData *ShmGroupCollection;
  58. struct OCPP16Data *ShmOCPP16Data;
  59. struct OCPP20Data *ShmOCPP20Data;
  60. int InitShareMemory(void)
  61. {
  62. int result = PASS;
  63. int MeterSMId;
  64. //creat ShmSysConfigAndInfo
  65. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  66. {
  67. #ifdef SystemLogMessage
  68. LOG_ERROR("shmget ShmSysConfigAndInfo NG");
  69. #endif
  70. result = FAIL;
  71. }
  72. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  73. {
  74. #ifdef SystemLogMessage
  75. LOG_ERROR("shmat ShmSysConfigAndInfo NG");
  76. #endif
  77. result = FAIL;
  78. }
  79. else
  80. {
  81. }
  82. // initial status code share memory
  83. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  84. {
  85. #ifdef SystemLogMessage
  86. LOG_ERROR("[main]CreatShareMemory:shmget ShmStatusCodeData NG");
  87. #endif
  88. return 0;
  89. }
  90. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  91. {
  92. #ifdef SystemLogMessage
  93. LOG_ERROR("[main]CreatShareMemory:shmat ShmStatusCodeData NG");
  94. #endif
  95. return 0;
  96. }
  97. // initial psu share memory
  98. if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
  99. {
  100. #ifdef SystemLogMessage
  101. LOG_ERROR("shmget ShmPsuData NG");
  102. #endif
  103. result = FAIL;
  104. }
  105. else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  106. {
  107. #ifdef SystemLogMessage
  108. LOG_ERROR("shmat ShmPsuData NG");
  109. #endif
  110. result = FAIL;
  111. }
  112. // initial DO360 RC1 share memory
  113. if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), 0777)) < 0)
  114. {
  115. #ifdef SystemLogMessage
  116. LOG_ERROR("shmget ShmRelayModuleData NG");
  117. #endif
  118. result = FAIL;
  119. }
  120. else if ((ShmRelayModuleData[0] = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  121. {
  122. #ifdef SystemLogMessage
  123. LOG_ERROR("shmat ShmRelayModuleData NG");
  124. #endif
  125. result = FAIL;
  126. }
  127. // initial DO360 RC2 share memory
  128. if ((MeterSMId = shmget(ShmRelay2BdKey, sizeof(struct RelayModuleData), 0777)) < 0)
  129. {
  130. #ifdef SystemLogMessage
  131. LOG_ERROR("shmget ShmRelay2ModuleData NG");
  132. #endif
  133. result = FAIL;
  134. }
  135. else if ((ShmRelayModuleData[1] = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  136. {
  137. #ifdef SystemLogMessage
  138. LOG_ERROR("shmat ShmRelay2ModuleData NG");
  139. #endif
  140. result = FAIL;
  141. }
  142. // initial fan board share memory
  143. if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), 0777)) < 0)
  144. {
  145. #ifdef SystemLogMessage
  146. LOG_ERROR("shmget ShmFanModuleData NG");
  147. #endif
  148. result = FAIL;
  149. }
  150. else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  151. {
  152. #ifdef SystemLogMessage
  153. LOG_ERROR("shmat ShmFanModuleData NG");
  154. #endif
  155. result = FAIL;
  156. }
  157. // initial led board share memory
  158. if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData), 0777)) < 0)
  159. {
  160. #ifdef SystemLogMessage
  161. LOG_ERROR("shmget ShmLedModuleData NG");
  162. #endif
  163. result = FAIL;
  164. }
  165. else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  166. {
  167. #ifdef SystemLogMessage
  168. LOG_ERROR("shmat ShmLedModuleData NG");
  169. #endif
  170. result = FAIL;
  171. }
  172. // initial primary share memory
  173. if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0)
  174. {
  175. #ifdef SystemLogMessage
  176. LOG_ERROR("shmget ShmPrimaryMcuData NG");
  177. #endif
  178. result = FAIL;
  179. }
  180. else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  181. {
  182. #ifdef SystemLogMessage
  183. LOG_ERROR("shmat ShmPrimaryMcuData NG");
  184. #endif
  185. result = FAIL;
  186. }
  187. if ((MeterSMId = shmget(SM_ChargerInfoKey, sizeof(ChargerInfoData), 0777)) < 0)
  188. {
  189. #ifdef SystemLogMessage
  190. LOG_ERROR("shmat ChargerInfoData NG");
  191. #endif
  192. result = FAIL;
  193. }
  194. else if ((ShmChargerInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  195. {
  196. #ifdef SystemLogMessage
  197. LOG_ERROR("shmat ChargerInfoData NG");
  198. #endif
  199. result = FAIL;
  200. }
  201. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  202. {
  203. #ifdef SystemLogMessage
  204. LOG_ERROR("shmat ShmOCPP16Data NG");
  205. #endif
  206. result = FAIL;
  207. }
  208. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  209. {
  210. LOG_ERROR("shmat ShmOCPP16Data NG");
  211. result = FAIL;
  212. }
  213. if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), 0777)) < 0)
  214. {
  215. LOG_ERROR("[main]CreatShareMemory:shmget OCPP20Data NG\n");
  216. result = FAIL;
  217. }
  218. else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  219. {
  220. LOG_ERROR("[main]CreatShareMemory:shmat OCPP20Data NG\n");
  221. result = FAIL;
  222. }
  223. if(result == PASS)
  224. {
  225. ShmGroupCollection = &ShmChargerInfo->PsuGrouping.GroupCollection[0];
  226. }
  227. return result;
  228. }
  229. void SetSelfTestSate(unsigned char selfTest)
  230. {
  231. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE || selfTest == _STEST_FAIL)
  232. {
  233. ShmSysConfigAndInfo->SysInfo.SelfTestSeq = selfTest;
  234. }
  235. ShmChargerInfo->Control.SelfTestStep = selfTest;
  236. }
  237. int main(void)
  238. {
  239. if(InitShareMemory() == FAIL)
  240. {
  241. #ifdef SystemLogMessage
  242. LOG_ERROR("InitShareMemory NG");
  243. #endif
  244. sleep(5);
  245. return 0;
  246. }
  247. bool _selfTestTimeout = false, _versionCheck = false, _switchCheck = false, _emgBtn = false;
  248. char _selfTest = 0, _preTest = -1, psuRetryCnt = 0;
  249. struct timespec _SelfTest_time, _TestStep_time;
  250. LOG_INFO("Charger Start Self Test...");
  251. ShmChargerInfo->Control.SysCtrl.bits.NeedSelfTest = YES;
  252. GetClockTime(&_SelfTest_time);
  253. ShmChargerInfo->Control.SelfTestStep = ShmSysConfigAndInfo->SysInfo.SelfTestSeq != _STEST_FAIL ?
  254. ShmSysConfigAndInfo->SysInfo.SelfTestSeq : _STEST_VERSION;
  255. while(1)
  256. {
  257. if(!ShmChargerInfo->Control.SysCtrl.bits.NeedSelfTest)
  258. {
  259. sleep(1);
  260. continue;
  261. }
  262. if(!_selfTestTimeout && ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  263. {
  264. if(ShmSysConfigAndInfo->SysInfo.FirmwareUpdate == YES || ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq == YES)
  265. {
  266. _selfTestTimeout = true;
  267. LOG_INFO("Charger need firmware upgrade, stop self test!");
  268. }
  269. else if(ShmPrimaryMcuData->InputDet.bits.EmergencyButton == ABNORMAL)
  270. {
  271. _selfTestTimeout = true;
  272. _emgBtn = true;
  273. LOG_INFO("Emergency button is pressed, stop self test!");
  274. }
  275. }
  276. _selfTest = ShmChargerInfo->Control.SelfTestStep;
  277. switch(_selfTest)
  278. {
  279. case _STEST_VERSION:
  280. if(_preTest != _selfTest)
  281. {
  282. GetClockTime(&_TestStep_time);
  283. LOG_INFO("SelfTest Process [VersionTest]");
  284. }
  285. if ((ShmChargerInfo->Control.SysCtrl.bits.FanBoardDisable || ShmFanModuleData->SelfTest_Comp) &&
  286. (ShmChargerInfo->Control.SysCtrl.bits.RelayBoardDisable || ShmRelayModuleData[0]->SelfTest_Comp) &&
  287. (ShmChargerInfo->Control.SysCtrl.bits.RelayBoardDisable ||
  288. ShmChargerInfo->Control.SysCtrl.bits.SecondRelayBoardEnable == false ||
  289. ShmRelayModuleData[1]->SelfTest_Comp) &&
  290. ShmPrimaryMcuData->SelfTest_Comp)
  291. {
  292. _versionCheck = true;
  293. if(!_switchCheck)
  294. {
  295. SetSelfTestSate(_STEST_CabinetSwitch);
  296. LOG_INFO("Self test version check ok");
  297. }
  298. else
  299. {
  300. // bypass cabinet switch detection
  301. SetSelfTestSate(_STEST_FAIL);
  302. LOG_INFO("VersionTest OK, Soft Reset And Retry!");
  303. }
  304. }
  305. else
  306. {
  307. if(_selfTestTimeout)
  308. {
  309. if(_switchCheck)
  310. {
  311. // self test timeout, set status code for timeout reason
  312. if(!ShmChargerInfo->Control.SysCtrl.bits.FanBoardDisable && !ShmFanModuleData->SelfTest_Comp)
  313. {
  314. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail == NO)
  315. {
  316. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FanboardStestFail = YES;
  317. LOG_INFO("FanBoard Self Test Fail!");
  318. }
  319. }
  320. if((!ShmChargerInfo->Control.SysCtrl.bits.RelayBoardDisable && !ShmRelayModuleData[0]->SelfTest_Comp) ||
  321. (!ShmChargerInfo->Control.SysCtrl.bits.RelayBoardDisable && ShmChargerInfo->Control.SysCtrl.bits.SecondRelayBoardEnable && !ShmRelayModuleData[1]->SelfTest_Comp))
  322. {
  323. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail == NO)
  324. {
  325. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RelayboardStestFail = YES;
  326. LOG_INFO("RelayBoard Self Test Fail!");
  327. }
  328. }
  329. if(!ShmPrimaryMcuData->SelfTest_Comp)
  330. {
  331. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail == NO)
  332. {
  333. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PrimaryStestFail = YES;
  334. LOG_INFO("Primary Self Test Fail!");
  335. }
  336. }
  337. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  338. {
  339. LOG_INFO("Booting Completed, Version Self Test Fail!");
  340. }
  341. ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
  342. ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
  343. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= VERSION_RETRY_TIMEOUT)
  344. {
  345. // bypass cabinet switch detection
  346. SetSelfTestSate(_STEST_FAIL);
  347. LOG_INFO("Version check still timeout, try soft reset and retry!");
  348. }
  349. }
  350. else
  351. {
  352. SetSelfTestSate(_STEST_CabinetSwitch);
  353. LOG_INFO("Version Self Test Timeout, Need Check Cabinet Switch Value");
  354. }
  355. }
  356. }
  357. break;
  358. case _STEST_CabinetSwitch:
  359. if(_preTest != _selfTest)
  360. {
  361. ShmChargerInfo->Control.PrimaryCtrl.bits.CabinetSwitchDetect = YES;
  362. GetClockTime(&_TestStep_time);
  363. LOG_INFO("SelfTest Process [SwitchDetect]");
  364. }
  365. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= CABINET_ROLE_TIMEOUT)
  366. {
  367. _switchCheck = true;
  368. char *str_cabinet_role[] = {STR_CABINET_ROLE_NONE, STR_CABINET_ROLE_MASTER, STR_CABINET_ROLE_SLAVE};
  369. ShmChargerInfo->Control.CabinetRole = ShmChargerInfo->Control.CabinetSwitch <= _CROLE_SLAVE ?
  370. ShmChargerInfo->Control.CabinetSwitch : _CROLE_SINGLE;
  371. //ShmChargerInfo->Control.CabinetRole = _CROLE_MASTER;
  372. //ShmChargerInfo->Control.CabinetRole = _CROLE_SLAVE;
  373. ShmChargerInfo->Control.PrimaryCtrl.bits.CabinetSwitchDetect = NO;
  374. LOG_INFO("Cabinet Role: [%s], Switch Value: %d",
  375. ShmChargerInfo->Control.CabinetRole <= _CROLE_SLAVE ? str_cabinet_role[ShmChargerInfo->Control.CabinetRole] : "Unknown",
  376. ShmChargerInfo->Control.CabinetSwitch);
  377. if(_versionCheck)
  378. {
  379. if(!_emgBtn)
  380. {
  381. if(ShmChargerInfo->Control.CabinetRole == _CROLE_SLAVE)
  382. {
  383. SetSelfTestSate(_STEST_COMPLETE);
  384. }
  385. else
  386. {
  387. if(!ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DcInputUVP)
  388. {
  389. SetSelfTestSate(_STEST_PSU_DETECT);
  390. }
  391. else
  392. {
  393. LOG_INFO("DC Input UVP, Bypass PSU Self-Test");
  394. SetSelfTestSate(_STEST_COMPLETE);
  395. }
  396. }
  397. }
  398. else
  399. {
  400. SetSelfTestSate(_STEST_EMG_BTN);
  401. }
  402. }
  403. else
  404. {
  405. if(!_emgBtn)
  406. {
  407. SetSelfTestSate(_STEST_VERSION);
  408. }
  409. else
  410. {
  411. SetSelfTestSate(_STEST_EMG_BTN);
  412. }
  413. }
  414. }
  415. break;
  416. case _STEST_AC_CONTACTOR:
  417. if(_preTest != _selfTest)
  418. {
  419. ShmChargerInfo->Control.RelayCtrl.bits.AcContactor = ON;
  420. GetClockTime(&_TestStep_time);
  421. LOG_INFO("SelfTest Process [AcContactor]");
  422. }
  423. SetSelfTestSate(_STEST_PSU_DETECT);
  424. break;
  425. case _STEST_PSU_DETECT:
  426. if(_preTest != _selfTest)
  427. {
  428. ShmChargerInfo->Control.PsuCtrl.bits.SelfTestOK = NO;
  429. ShmChargerInfo->Control.PsuCtrl.bits.NeedSelfTest = YES;
  430. ShmChargerInfo->Control.RelayCtrl.bits.AcContactor = ON;
  431. GetClockTime(&_TestStep_time);
  432. LOG_INFO("SelfTest Process [PsuDetect]");
  433. }
  434. if(ShmPsuData->Work_Step >= GET_SYS_CAP)
  435. {
  436. SetSelfTestSate(_STEST_PSU_CAP);
  437. }
  438. else
  439. {
  440. if(_emgBtn)
  441. {
  442. SetSelfTestSate(_STEST_EMG_BTN);
  443. break;
  444. }
  445. if(_selfTestTimeout)
  446. {
  447. // self test timeout, set status code for timeout reason
  448. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail == NO)
  449. {
  450. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail = YES;
  451. if(!ShmSysConfigAndInfo->SysInfo.AcContactorStatus)
  452. {
  453. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.AcContactStestFail = YES;
  454. LOG_INFO("Ac Contactor Self Test Fail!");
  455. }
  456. LOG_INFO("PSU Self Test Fail!");
  457. }
  458. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  459. {
  460. LOG_INFO("Booting Completed, PSU Self Test Fail!");
  461. }
  462. ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
  463. ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
  464. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= PSU_SELF_TIMEOUT)
  465. {
  466. SetSelfTestSate(_STEST_PSU_RETRY);
  467. }
  468. }
  469. }
  470. break;
  471. case _STEST_PSU_CAP:
  472. if(_preTest != _selfTest)
  473. {
  474. GetClockTime(&_TestStep_time);
  475. LOG_INFO("SelfTest Process [PsuCapability]");
  476. }
  477. if(ShmChargerInfo->Control.PsuCtrl.bits.SelfTestOK == YES)
  478. {
  479. SetSelfTestSate(_STEST_COMPLETE);
  480. }
  481. else
  482. {
  483. if(_emgBtn)
  484. {
  485. SetSelfTestSate(_STEST_EMG_BTN);
  486. break;
  487. }
  488. if(_selfTestTimeout)
  489. {
  490. // self test timeout, set status code for timeout reason
  491. if(ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail == NO)
  492. {
  493. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.PsuModuleStestFail = YES;
  494. LOG_INFO("PSU Self Test Fail!");
  495. }
  496. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  497. {
  498. LOG_INFO("Booting Completed, PSU Self Test Fail!");
  499. }
  500. ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
  501. ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
  502. }
  503. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= PSU_SELF_TIMEOUT)
  504. {
  505. SetSelfTestSate(_STEST_PSU_RETRY);
  506. }
  507. }
  508. break;
  509. case _STEST_PSU_RETRY:
  510. if(_preTest != _selfTest)
  511. {
  512. psuRetryCnt++;
  513. ShmChargerInfo->Control.RelayCtrl.bits.AcContactor = OFF;
  514. GetClockTime(&_TestStep_time);
  515. LOG_INFO("SelfTest Process [PsuRetry]");
  516. }
  517. if(_emgBtn)
  518. {
  519. SetSelfTestSate(_STEST_EMG_BTN);
  520. break;
  521. }
  522. if(psuRetryCnt > MAX_PSU_RETRY_CNT)
  523. {
  524. SetSelfTestSate(_STEST_FAIL);
  525. }
  526. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= (PSU_RETRY_TIMEOUT))
  527. {
  528. SetSelfTestSate(_STEST_PSU_DETECT);
  529. }
  530. break;
  531. case _STEST_EMG_BTN:
  532. if(_preTest != _selfTest)
  533. {
  534. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = true;
  535. GetClockTime(&_TestStep_time);
  536. LOG_INFO("SelfTest Process [EmgBtn Fail]");
  537. }
  538. ShmSysConfigAndInfo->SysInfo.SelfTestSeq = _STEST_FAIL;
  539. ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
  540. if(GetTimeoutValue(_TestStep_time) / uSEC_VAL >= EMG_BTN_INTERVAL)
  541. {
  542. if(ShmPrimaryMcuData->InputDet.bits.EmergencyButton == NORMAL)
  543. {
  544. // bypass cabinet switch detection
  545. SetSelfTestSate(_STEST_FAIL);
  546. LOG_INFO("Emergency button recover, Soft Reset!");
  547. }
  548. GetClockTime(&_TestStep_time);
  549. }
  550. break;
  551. case _STEST_FAIL:
  552. if(_preTest != _selfTest)
  553. {
  554. GetClockTime(&_TestStep_time);
  555. LOG_INFO("SelfTest Process [SelfTestFail]");
  556. }
  557. // stop here
  558. // self test fail, need soft reset
  559. ShmChargerInfo->Control.SysCtrl.bits.NeedSoftReset = true;
  560. break;
  561. case _STEST_COMPLETE:
  562. if(_preTest != _selfTest)
  563. {
  564. LOG_INFO("SelfTest Process [SelfTestDone]");
  565. }
  566. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  567. {
  568. ShmSysConfigAndInfo->SysInfo.BootingStatus = BOOT_COMPLETE;
  569. }
  570. if(_selfTestTimeout)
  571. {
  572. // stop here
  573. // self test completed but timeout, need soft reset
  574. ShmChargerInfo->Control.SysCtrl.bits.NeedSoftReset = true;
  575. }
  576. break;
  577. default:
  578. if(_preTest != _selfTest)
  579. {
  580. LOG_INFO("SelfTest Process [Unknown]");
  581. }
  582. SetSelfTestSate(_STEST_VERSION);
  583. break;
  584. }
  585. if(ShmSysConfigAndInfo->SysInfo.BootingStatus != BOOT_COMPLETE)
  586. {
  587. if(GetTimeoutValue(_SelfTest_time) / uSEC_VAL >= SELFTEST_TIMEOUT)
  588. {
  589. _selfTestTimeout = true;
  590. }
  591. }
  592. _preTest = _selfTest;
  593. usleep(10000);
  594. }
  595. return 0;
  596. }