SelfTest.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include <stdio.h> /*標準輸入輸出定義*/
  2. #include <stdlib.h> /*標準函數庫定義*/
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include "../Config.h"
  6. #include "../Log/log.h"
  7. #include "../Define/define.h"
  8. #include "../ShareMemory/shmMem.h"
  9. #include "main.h"
  10. #include "../timeout.h"
  11. //------------------------------------------------------------------------------
  12. extern void ChkPrimaryStatus(void);
  13. //------------------------------------------------------------------------------
  14. void SelfTestRun(void)
  15. {
  16. bool evInitFlag = false;
  17. bool isRelayBypass = false;
  18. uint8_t index = 0;
  19. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  20. struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  21. struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
  22. struct PsuData *ShmPsuData = (struct PsuData *)GetShmPsuData();
  23. struct CHAdeMOData *ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
  24. struct GBTData *ShmGBTData = (struct GBTData *)GetShmGBTData();
  25. struct CcsData *ShmCcsData = (struct CcsData *)GetShmCcsData();
  26. struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
  27. struct FanModuleData *ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
  28. struct RelayModuleData *ShmRelayModuleData = (struct RelayModuleData *)GetShmRelayModuleData();
  29. struct ChargingInfoData *pDcChargingInfo = NULL;
  30. struct ChargingInfoData *pAcChargingInfo = NULL;
  31. for(int i = 0; i < pSysConfig->TotalConnectorCount; i++)
  32. {
  33. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
  34. if(pDcChargingInfo->PantographFlag == YES)
  35. {
  36. isRelayBypass = true;
  37. }
  38. }
  39. StartSystemTimeoutDet(Timeout_SelftestChk);
  40. pSysInfo->SelfTestSeq = _STEST_VERSION;
  41. while (pSysInfo->SelfTestSeq != _STEST_COMPLETE) {
  42. if (pSysInfo->SelfTestSeq == _STEST_COMPLETE) { //自檢完成
  43. return;
  44. }
  45. ChkPrimaryStatus(); //確認硬體有無錯誤,如急停按鈕或門有打開
  46. if (pSysWarning->Level == WARN_LV_ER) {
  47. pSysInfo->SelfTestSeq = _STEST_FAIL;
  48. return;
  49. }
  50. if (pSysConfig->TotalConnectorCount <= 0) {
  51. pSysInfo->SelfTestSeq = _STEST_FAIL;
  52. return;
  53. }
  54. if (ShmPsuData->Work_Step == _NO_WORKING ||
  55. pSysInfo->SelfTestSeq == _STEST_FAIL) {
  56. pSysInfo->SelfTestSeq = _STEST_FAIL;
  57. return;
  58. }
  59. switch (pSysInfo->SelfTestSeq) {
  60. case _STEST_VERSION:
  61. if(isRelayBypass == YES && ShmRelayModuleData->SelfTest_Comp != YES)
  62. {
  63. log_info("Relay Board Bypass");
  64. ShmRelayModuleData->SelfTest_Comp = YES;
  65. }
  66. if ((strlen((char *)pSysInfo->RelayModuleFwRev) != 0 ||
  67. pSysInfo->RelayModuleFwRev[0] != '\0') &&
  68. (ShmRelayModuleData->SelfTest_Comp != YES)
  69. ) {
  70. //log_info("Relay Board FW Rev = %s", pSysInfo->RelayModuleFwRev);
  71. ShmRelayModuleData->SelfTest_Comp = YES;
  72. }
  73. #if !defined NO_FAN_BOARD && !defined DD360ComBox
  74. if ((strlen((char *)pSysInfo->FanModuleFwRev) != 0 ||
  75. pSysInfo->FanModuleFwRev[0] != '\0') &&
  76. (ShmFanModuleData->SelfTest_Comp != YES)
  77. ) {
  78. //log_info("Fan Board FW Rev = %s", pSysInfo->FanModuleFwRev);
  79. ShmFanModuleData->SelfTest_Comp = YES;
  80. }
  81. #else
  82. ShmFanModuleData->SelfTest_Comp = YES;
  83. #endif //NO_FAN_BOARD
  84. if ((strlen((char *)ShmPrimaryMcuData->version) != 0 ||
  85. ShmPrimaryMcuData->version[0] != '\0') &&
  86. (ShmPrimaryMcuData->SelfTest_Comp != YES)
  87. ) {
  88. log_info("Primary Board Pass");
  89. ShmPrimaryMcuData->SelfTest_Comp = YES;
  90. }
  91. // EV 小板
  92. if (!evInitFlag) {
  93. evInitFlag = YES;
  94. for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
  95. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
  96. //log_info("index = %d, charging index = %d, type = %d\r\n",
  97. // index,
  98. // chargingInfo[index]->type_index,
  99. // chargingInfo[index]->Type);
  100. if (pDcChargingInfo->Type == _Type_Chademo) {
  101. if ((strlen((char *)ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version) != 0 ||
  102. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  103. //&& (ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  104. ) {
  105. //log_info("CHAdeMO[%d] FW Rev = %s",
  106. // pDcChargingInfo->type_index,
  107. // ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  108. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  109. } else {
  110. //log_info("chademo fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  111. evInitFlag = NO;
  112. }
  113. } else if (pDcChargingInfo->Type == _Type_GB) {
  114. if ((strlen((char *)ShmGBTData->evse[pDcChargingInfo->type_index].version) != 0 ||
  115. ShmGBTData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  116. //&& (ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  117. ) {
  118. //log_info("GBT[%d] FW Rev = %s",
  119. // pDcChargingInfo->type_index,
  120. // ShmGBTData->evse[pDcChargingInfo->type_index].version);
  121. ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  122. } else {
  123. //log_info("GBT fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  124. evInitFlag = NO;
  125. }
  126. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  127. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  128. if ((strlen((char *)ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version) != 0 ||
  129. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version[0] != '\0')
  130. /*&&(ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp != YES)*/
  131. ) {
  132. //log_info("CCS[%d] FW Rev = %s",
  133. // pDcChargingInfo->type_index,
  134. // ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version);
  135. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  136. } else {
  137. //log_info("CCS[%d] ccs fw lose...... %s \n",
  138. // chargingInfo[index]->type_index,
  139. // ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version);
  140. evInitFlag = NO;
  141. }
  142. }
  143. }
  144. }
  145. for (index = 0; index < pSysConfig->AcConnectorCount; index++) {
  146. pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(index);
  147. if (pAcChargingInfo->Type == _Type_AC) {
  148. if ((strlen((char *)pAcChargingInfo->version) != 0 ||
  149. pAcChargingInfo->version[0] != '\0')
  150. && (pAcChargingInfo->SelfTest_Comp != YES)
  151. ) {
  152. //log_info("AC connector[%d] FW Rev = %s", index, pAcChargingInfo->version);
  153. pAcChargingInfo->SelfTest_Comp = YES;
  154. } else {
  155. evInitFlag = NO;
  156. }
  157. }
  158. }
  159. }
  160. if (ShmFanModuleData->SelfTest_Comp &&
  161. ShmRelayModuleData->SelfTest_Comp &&
  162. ShmPrimaryMcuData->SelfTest_Comp &&
  163. evInitFlag
  164. ) {
  165. pSysInfo->SelfTestSeq = _STEST_AC_CONTACTOR;
  166. }
  167. break;
  168. case _STEST_AC_CONTACTOR:
  169. //ShmPsuData->Work_Step = _TEST_COMPLETE;
  170. // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
  171. pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
  172. //log_info("Waiting for DO communication");
  173. break;
  174. case _STEST_PSU_DETECT:
  175. pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
  176. break;
  177. case _STEST_PSU_CAP:
  178. // 此測試是要確認當前總輸出能力
  179. // 如果沒有 PSU 模組請 bypass
  180. //check the power limit from DO
  181. pSysInfo->SelfTestSeq = _STEST_COMPLETE;
  182. pSysInfo->BootingStatus = BOOT_COMPLETE;
  183. log_info("Successful Self Test");
  184. break;
  185. }
  186. usleep(100000);
  187. }
  188. }