Module_ChargerSelfTest.c 24 KB

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