SelfTest.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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. /*
  47. if (pSysWarning->Level == WARN_LV_ER) {
  48. pSysInfo->SelfTestSeq = _STEST_FAIL;
  49. return;
  50. }
  51. */
  52. if (pSysConfig->TotalConnectorCount <= 0) {
  53. pSysInfo->SelfTestSeq = _STEST_FAIL;
  54. return;
  55. }
  56. if (ShmPsuData->Work_Step == _NO_WORKING ||
  57. pSysInfo->SelfTestSeq == _STEST_FAIL) {
  58. pSysInfo->SelfTestSeq = _STEST_FAIL;
  59. return;
  60. }
  61. switch (pSysInfo->SelfTestSeq) {
  62. case _STEST_VERSION:
  63. if(isRelayBypass == YES && ShmRelayModuleData->SelfTest_Comp != YES)
  64. {
  65. log_info("Relay Board Bypass");
  66. ShmRelayModuleData->SelfTest_Comp = YES;
  67. }
  68. if ((strlen((char *)pSysInfo->RelayModuleFwRev) != 0 ||
  69. pSysInfo->RelayModuleFwRev[0] != '\0') &&
  70. (ShmRelayModuleData->SelfTest_Comp != YES)
  71. ) {
  72. //log_info("Relay Board FW Rev = %s", pSysInfo->RelayModuleFwRev);
  73. ShmRelayModuleData->SelfTest_Comp = YES;
  74. }
  75. #if !defined NO_FAN_BOARD && !defined DD360ComBox
  76. if ((strlen((char *)pSysInfo->FanModuleFwRev) != 0 ||
  77. pSysInfo->FanModuleFwRev[0] != '\0') &&
  78. (ShmFanModuleData->SelfTest_Comp != YES)
  79. ) {
  80. //log_info("Fan Board FW Rev = %s", pSysInfo->FanModuleFwRev);
  81. ShmFanModuleData->SelfTest_Comp = YES;
  82. }
  83. #else
  84. ShmFanModuleData->SelfTest_Comp = YES;
  85. #endif //NO_FAN_BOARD
  86. if ((strlen((char *)ShmPrimaryMcuData->version) != 0 ||
  87. ShmPrimaryMcuData->version[0] != '\0') &&
  88. (ShmPrimaryMcuData->SelfTest_Comp != YES)
  89. ) {
  90. //log_info("Primary FW Rev = %s", pSysInfo->CsuPrimFwRev);
  91. //ShmPrimaryMcuData->SelfTest_Comp = YES;
  92. }
  93. // EV 小板
  94. if (!evInitFlag) {
  95. evInitFlag = YES;
  96. for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
  97. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
  98. //log_info("index = %d, charging index = %d, type = %d\r\n",
  99. // index,
  100. // chargingInfo[index]->type_index,
  101. // chargingInfo[index]->Type);
  102. if (pDcChargingInfo->Type == _Type_Chademo) {
  103. if ((strlen((char *)ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version) != 0 ||
  104. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  105. //&& (ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  106. ) {
  107. //log_info("CHAdeMO[%d] FW Rev = %s",
  108. // pDcChargingInfo->type_index,
  109. // ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  110. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  111. } else {
  112. //log_info("chademo fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  113. evInitFlag = NO;
  114. }
  115. } else if (pDcChargingInfo->Type == _Type_GB) {
  116. if ((strlen((char *)ShmGBTData->evse[pDcChargingInfo->type_index].version) != 0 ||
  117. ShmGBTData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  118. //&& (ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  119. ) {
  120. //log_info("GBT[%d] FW Rev = %s",
  121. // pDcChargingInfo->type_index,
  122. // ShmGBTData->evse[pDcChargingInfo->type_index].version);
  123. ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  124. } else {
  125. //log_info("GBT fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  126. evInitFlag = NO;
  127. }
  128. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  129. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  130. if ((strlen((char *)ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version) != 0 ||
  131. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version[0] != '\0')
  132. /*&&(ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp != YES)*/
  133. ) {
  134. // log_info("CCS[%d] FW Rev = %s",
  135. // pDcChargingInfo->type_index,
  136. // ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version);
  137. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  138. } else {
  139. //log_info("CCS[%d] ccs fw lose...... %s \n",
  140. // chargingInfo[index]->type_index,
  141. // ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version);
  142. evInitFlag = NO;
  143. }
  144. }
  145. }
  146. }
  147. for (index = 0; index < pSysConfig->AcConnectorCount; index++) {
  148. pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(index);
  149. if (pAcChargingInfo->Type == _Type_AC) {
  150. if ((strlen((char *)pAcChargingInfo->version) != 0 ||
  151. pAcChargingInfo->version[0] != '\0')
  152. && (pAcChargingInfo->SelfTest_Comp != YES)
  153. ) {
  154. log_info("AC connector[%d] FW Rev = %s", index, pAcChargingInfo->version);
  155. pAcChargingInfo->SelfTest_Comp = YES;
  156. } else {
  157. evInitFlag = NO;
  158. }
  159. }
  160. }
  161. }
  162. if (ShmFanModuleData->SelfTest_Comp &&
  163. ShmRelayModuleData->SelfTest_Comp &&
  164. ShmPrimaryMcuData->SelfTest_Comp &&
  165. evInitFlag
  166. ) {
  167. pSysInfo->SelfTestSeq = _STEST_AC_CONTACTOR;
  168. }
  169. break;
  170. case _STEST_AC_CONTACTOR:
  171. //ShmPsuData->Work_Step = _TEST_COMPLETE;
  172. // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
  173. #if defined DD360 || defined DD360Audi || defined DD360ComBox
  174. pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
  175. //log_info("Waiting for DO communication");
  176. break;
  177. #endif //defined DD360 || defined DD360Audi || defined DD360ComBox
  178. if (pSysInfo->AcContactorStatus == YES) {
  179. pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
  180. log_info("AC contactor self test OK");
  181. }
  182. break;
  183. case _STEST_PSU_DETECT:
  184. #if defined DD360 || defined DD360Audi || defined DD360ComBox
  185. pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
  186. break;
  187. #endif //defined DD360 || defined DD360Audi || defined DD360ComBox
  188. if (ShmPsuData->Work_Step >= GET_SYS_CAP) {
  189. pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
  190. }
  191. break;
  192. case _STEST_PSU_CAP:
  193. // 此測試是要確認當前總輸出能力
  194. // 如果沒有 PSU 模組請 bypass
  195. #if defined DD360 || defined DD360Audi || defined DD360ComBox
  196. //check the power limit from DO
  197. pSysInfo->SelfTestSeq = _STEST_COMPLETE;
  198. pSysInfo->BootingStatus = BOOT_COMPLETE;
  199. log_info("Successful Self Test");
  200. break;
  201. #endif //defined DD360 || defined DD360Audi || defined DD360ComBox
  202. if (ShmPsuData->Work_Step == BOOTING_COMPLETE) {
  203. sleep(1);
  204. pSysInfo->SelfTestSeq = _STEST_COMPLETE;
  205. pSysInfo->BootingStatus = BOOT_COMPLETE;
  206. }
  207. break;
  208. }
  209. usleep(100000);
  210. }
  211. }