SelfTest.c 10 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. struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  18. struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  19. struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
  20. struct PsuData *ShmPsuData = (struct PsuData *)GetShmPsuData();
  21. struct CHAdeMOData *ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
  22. struct GBTData *ShmGBTData = (struct GBTData *)GetShmGBTData();
  23. struct CcsData *ShmCcsData = (struct CcsData *)GetShmCcsData();
  24. struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
  25. struct FanModuleData *ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
  26. struct RelayModuleData *ShmRelayModuleData = (struct RelayModuleData *)GetShmRelayModuleData();
  27. struct ChargingInfoData *pDcChargingInfo = NULL;
  28. struct ChargingInfoData *pAcChargingInfo = NULL;
  29. StartSystemTimeoutDet(Timeout_SelftestChk);
  30. pSysInfo->SelfTestSeq = _STEST_VERSION;
  31. while (pSysInfo->SelfTestSeq != _STEST_COMPLETE //||
  32. //GetTimeoutValue(pSysInfo->SystemTimeoutTimer) / uSEC_VAL <= 20 //DS60-120 add
  33. ) {
  34. if (pSysInfo->SelfTestSeq == _STEST_COMPLETE) {
  35. return;
  36. }
  37. ChkPrimaryStatus();
  38. if (pSysWarning->Level == 2 //||
  39. //pAlarmCode->AlarmEvents.bits.PsuDipSwitchStestFail == YES //DS60-120 add
  40. ) {
  41. pSysInfo->SelfTestSeq = _STEST_FAIL;
  42. return;
  43. }
  44. if (pSysConfig->TotalConnectorCount > 0) {
  45. if (ShmPsuData->Work_Step == _NO_WORKING ||
  46. pSysInfo->SelfTestSeq == _STEST_FAIL) {
  47. pSysInfo->SelfTestSeq = _STEST_FAIL;
  48. return;
  49. }
  50. switch (pSysInfo->SelfTestSeq) {
  51. case _STEST_VERSION: {
  52. if ((strlen((char *)pSysInfo->RelayModuleFwRev) != 0 ||
  53. pSysInfo->RelayModuleFwRev[0] != '\0')
  54. && (ShmRelayModuleData->SelfTest_Comp != YES)
  55. ) {
  56. log_info("Relay Board FW Rev = %s", pSysInfo->RelayModuleFwRev);
  57. ShmRelayModuleData->SelfTest_Comp = YES;
  58. }
  59. #if !defined NO_FAN_BOARD && !defined DD360ComBox
  60. if ((strlen((char *)pSysInfo->FanModuleFwRev) != 0 ||
  61. pSysInfo->FanModuleFwRev[0] != '\0')
  62. && (ShmFanModuleData->SelfTest_Comp != YES)
  63. ) {
  64. log_info("Fan Board FW Rev = %s", pSysInfo->FanModuleFwRev);
  65. ShmFanModuleData->SelfTest_Comp = YES;
  66. }
  67. #else
  68. ShmFanModuleData->SelfTest_Comp = YES;
  69. #endif //NO_FAN_BOARD
  70. if ((strlen((char *)ShmPrimaryMcuData->version) != 0 ||
  71. ShmPrimaryMcuData->version[0] != '\0')
  72. && (ShmPrimaryMcuData->SelfTest_Comp != YES)
  73. ) {
  74. log_info("Primary FW Rev = %s", pSysInfo->CsuPrimFwRev);
  75. ShmPrimaryMcuData->SelfTest_Comp = YES;
  76. }
  77. // EV 小板
  78. if (!evInitFlag) {
  79. evInitFlag = YES;
  80. for (uint8_t index = 0; index < pSysConfig->TotalConnectorCount; index++) {
  81. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
  82. //log_info("index = %d, charging index = %d, type = %d\r\n",
  83. // index,
  84. // chargingInfo[index]->type_index,
  85. // chargingInfo[index]->Type);
  86. if (pDcChargingInfo->Type == _Type_Chademo) {
  87. if ((strlen((char *)ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version) != 0 ||
  88. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  89. //&& (ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  90. ) {
  91. log_info("CHAdeMO[%d] FW Rev = %s", pDcChargingInfo->type_index, ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  92. ShmCHAdeMOData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  93. } else {
  94. //log_info("chademo fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  95. evInitFlag = NO;
  96. }
  97. } else if (pDcChargingInfo->Type == _Type_GB) {
  98. if ((strlen((char *)ShmGBTData->evse[pDcChargingInfo->type_index].version) != 0 ||
  99. ShmGBTData->evse[pDcChargingInfo->type_index].version[0] != '\0')
  100. //&& (ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp != YES)
  101. ) {
  102. log_info("GBT[%d] FW Rev = %s", pDcChargingInfo->type_index, ShmGBTData->evse[pDcChargingInfo->type_index].version);
  103. ShmGBTData->evse[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  104. } else {
  105. //log_info("GBT fw lose...... %s \n", ShmCHAdeMOData->evse[pDcChargingInfo->type_index].version);
  106. evInitFlag = NO;
  107. }
  108. } else if (pDcChargingInfo->Type == _Type_CCS_2) {
  109. if (ShmCcsData->CommProtocol == _CCS_COMM_V2GMessage_DIN70121) {
  110. if ((strlen((char *)ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version) != 0 ||
  111. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version[0] != '\0')
  112. /*&&(ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp != YES)*/
  113. ) {
  114. log_info("CCS[%d] FW Rev = %s",
  115. pDcChargingInfo->type_index,
  116. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version);
  117. ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp = YES;
  118. } else {
  119. //log_info("CCS[%d] ccs fw lose...... %s \n",
  120. // chargingInfo[index]->type_index,
  121. // ShmCcsData->V2GMessage_DIN70121[chargingInfo[index]->type_index].version);
  122. evInitFlag = NO;
  123. }
  124. }
  125. }
  126. }
  127. for (uint8_t index = 0; index < pSysConfig->AcConnectorCount; index++) {
  128. pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(index);
  129. if (pAcChargingInfo->Type == _Type_AC) {
  130. if ((strlen((char *)pAcChargingInfo->version) != 0 || pAcChargingInfo->version[0] != '\0')
  131. && (pAcChargingInfo->SelfTest_Comp != YES)
  132. ) {
  133. log_info("AC connector[%d] FW Rev = %s", index, pAcChargingInfo->version);
  134. pAcChargingInfo->SelfTest_Comp = YES;
  135. } else {
  136. evInitFlag = NO;
  137. }
  138. }
  139. }
  140. }
  141. if ( ShmFanModuleData->SelfTest_Comp &&
  142. ShmRelayModuleData->SelfTest_Comp &&
  143. ShmPrimaryMcuData->SelfTest_Comp &&
  144. evInitFlag
  145. ) {
  146. pSysInfo->SelfTestSeq = _STEST_AC_CONTACTOR;
  147. }
  148. }
  149. break;
  150. case _STEST_AC_CONTACTOR: {
  151. //ShmPsuData->Work_Step = _TEST_COMPLETE;
  152. // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
  153. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  154. if (pSysInfo->AcContactorStatus == YES) {
  155. pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
  156. log_info("AC contactor self test OK");
  157. }
  158. #else
  159. pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
  160. log_info("Waiting for DO communication");
  161. #endif //!defined DD360 && !defined DD360Audi
  162. }
  163. break;
  164. case _STEST_PSU_DETECT: {
  165. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  166. if (ShmPsuData->Work_Step >= GET_SYS_CAP) {
  167. pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
  168. }
  169. #else
  170. pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
  171. #endif //defined DD360 && !defined DD360Audi
  172. }
  173. break;
  174. case _STEST_PSU_CAP: {
  175. #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
  176. // 此測試是要確認當前總輸出能力
  177. // 如果沒有 PSU 模組請 bypass
  178. if (ShmPsuData->Work_Step == BOOTING_COMPLETE) {
  179. sleep(1);
  180. pSysInfo->SelfTestSeq = _STEST_COMPLETE;
  181. pSysInfo->BootingStatus = BOOT_COMPLETE;
  182. }
  183. #else
  184. //check the power limit from DO
  185. pSysInfo->SelfTestSeq = _STEST_COMPLETE;
  186. pSysInfo->BootingStatus = BOOT_COMPLETE;
  187. log_info("Successful Self Test");
  188. #endif //defined DD360 && !defined DD360Audi
  189. }
  190. break;
  191. }
  192. } else {
  193. break;
  194. }
  195. usleep(100000);
  196. }
  197. }