LEDBoard.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. #include <stdio.h> /*標準輸入輸出定義*/
  2. #include <stdlib.h> /*標準函數庫定義*/
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <time.h>
  6. #include <sys/time.h>
  7. #include <sys/timeb.h>
  8. #include "../ShareMemory/shmMem.h"
  9. #include "../Config.h"
  10. #include "Module_InternalComm.h"
  11. #include "internalComm.h"
  12. //------------------------------------------------------------------------------
  13. static struct SysConfigData *pSysConfig = NULL;
  14. static struct SysInfoData *pSysInfo = NULL;
  15. static struct WARNING_CODE_INFO *pSysWarning = NULL;
  16. static struct AlarmCodeData *pAlarmCode = NULL;
  17. static struct LedModuleData *ShmLedModuleData = NULL;
  18. static int Uart5Fd = 0;
  19. static Led_Color cur_led_color = {COLOR_MIN_LV};
  20. static Led_Color led_color;
  21. static struct timeval _led_priority_time;
  22. //------------------------------------------------------------------------------
  23. static bool IsNoneMatchLedColor(void)
  24. {
  25. bool result = false;
  26. if (cur_led_color.Connect_1_Red != led_color.Connect_1_Red ||
  27. cur_led_color.Connect_1_Green != led_color.Connect_1_Green ||
  28. cur_led_color.Connect_1_Blue != led_color.Connect_1_Blue ||
  29. cur_led_color.Connect_2_Red != led_color.Connect_2_Red ||
  30. cur_led_color.Connect_2_Green != led_color.Connect_2_Green ||
  31. cur_led_color.Connect_2_Blue != led_color.Connect_2_Blue) {
  32. result = true;
  33. }
  34. return result;
  35. }
  36. static void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
  37. {
  38. static uint8_t _checkLedChanged = 3;
  39. uint8_t _colorBuf = COLOR_MAX_LV * LED_INTENSITY_BRIGHTEST;
  40. if (pSysConfig->LedInfo.Intensity == _LED_INTENSITY_DARKEST) {
  41. _colorBuf = COLOR_MAX_LV * LED_INTENSITY_DARKEST;
  42. } else if (pSysConfig->LedInfo.Intensity == _LED_INTENSITY_MEDIUM) {
  43. _colorBuf = COLOR_MAX_LV * LED_INTENSITY_MEDIUM;
  44. }
  45. //printf("chargingData_1->SystemStatus=%d\n",chargingData_1->SystemStatus);
  46. //printf("chargingData_2->SystemStatus=%d\n",chargingData_2->SystemStatus);
  47. //printf("pSysWarning->Level=%d\n",pSysWarning->Level);
  48. if (pSysWarning->Level == 2) {
  49. led_color.Connect_1_Green = COLOR_MIN_LV;
  50. led_color.Connect_1_Blue = COLOR_MIN_LV;
  51. led_color.Connect_1_Red = _colorBuf;
  52. led_color.Connect_2_Green = COLOR_MIN_LV;
  53. led_color.Connect_2_Blue = COLOR_MIN_LV;
  54. led_color.Connect_2_Red = _colorBuf;
  55. } else {
  56. if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf) {
  57. if ((chargingData_1->SystemStatus == S_BOOTING ||
  58. chargingData_1->SystemStatus == S_IDLE ||
  59. chargingData_1->SystemStatus == S_RESERVATION) &&
  60. (chargingData_2->SystemStatus == S_BOOTING ||
  61. chargingData_2->SystemStatus == S_IDLE ||
  62. chargingData_2->SystemStatus == S_RESERVATION)) {
  63. #if defined DD360Audi
  64. led_color.Connect_1_Green = _colorBuf;
  65. led_color.Connect_1_Blue = _colorBuf;
  66. led_color.Connect_1_Red = _colorBuf;
  67. led_color.Connect_2_Green = _colorBuf;
  68. led_color.Connect_2_Blue = _colorBuf;
  69. led_color.Connect_2_Red = _colorBuf;
  70. #else
  71. led_color.Connect_1_Green = _colorBuf;
  72. led_color.Connect_1_Blue = COLOR_MIN_LV;
  73. led_color.Connect_1_Red = COLOR_MIN_LV;
  74. led_color.Connect_2_Green = _colorBuf;
  75. led_color.Connect_2_Blue = COLOR_MIN_LV;
  76. led_color.Connect_2_Red = COLOR_MIN_LV;
  77. #endif
  78. } else if ((chargingData_1->SystemStatus >= S_AUTHORIZING &&
  79. chargingData_1->SystemStatus <= S_COMPLETE) ||
  80. (chargingData_1->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  81. chargingData_1->SystemStatus <= S_CCS_PRECHARGE_ST1) ||
  82. (chargingData_2->SystemStatus >= S_AUTHORIZING &&
  83. chargingData_2->SystemStatus <= S_COMPLETE) ||
  84. (chargingData_2->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  85. chargingData_2->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
  86. led_color.Connect_1_Green = COLOR_MIN_LV;
  87. led_color.Connect_1_Blue = _colorBuf;
  88. led_color.Connect_1_Red = COLOR_MIN_LV;
  89. led_color.Connect_2_Green = COLOR_MIN_LV;
  90. led_color.Connect_2_Blue = _colorBuf;
  91. led_color.Connect_2_Red = COLOR_MIN_LV;
  92. }
  93. } else {
  94. if (chargingData_1->SystemStatus == S_BOOTING ||
  95. chargingData_1->SystemStatus == S_IDLE ||
  96. chargingData_1->SystemStatus == S_RESERVATION ||
  97. chargingData_1->SystemStatus == S_MAINTAIN) {
  98. if (chargingData_1->IsAvailable == NO) { //For Audi
  99. led_color.Connect_1_Green = COLOR_MIN_LV;
  100. led_color.Connect_1_Blue = COLOR_MIN_LV;
  101. led_color.Connect_1_Red = _colorBuf;
  102. } else {
  103. #if defined DD360Audi
  104. led_color.Connect_1_Green = _colorBuf;
  105. led_color.Connect_1_Blue = _colorBuf;
  106. led_color.Connect_1_Red = _colorBuf;
  107. #else
  108. led_color.Connect_1_Green = _colorBuf;
  109. led_color.Connect_1_Blue = COLOR_MIN_LV;
  110. led_color.Connect_1_Red = COLOR_MIN_LV;
  111. #endif
  112. }
  113. } else if ((chargingData_1->SystemStatus >= S_AUTHORIZING &&
  114. chargingData_1->SystemStatus <= S_COMPLETE) ||
  115. (chargingData_1->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  116. chargingData_1->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
  117. led_color.Connect_1_Green = COLOR_MIN_LV;
  118. led_color.Connect_1_Blue = _colorBuf;
  119. led_color.Connect_1_Red = COLOR_MIN_LV;
  120. }
  121. // --------------------------------------------------------------------------
  122. if (chargingData_2->SystemStatus == S_BOOTING ||
  123. chargingData_2->SystemStatus == S_IDLE ||
  124. chargingData_2->SystemStatus == S_RESERVATION ||
  125. chargingData_2->SystemStatus == S_MAINTAIN) {
  126. if (chargingData_2->IsAvailable == NO) {
  127. led_color.Connect_2_Green = COLOR_MIN_LV;
  128. led_color.Connect_2_Blue = COLOR_MIN_LV;
  129. led_color.Connect_2_Red = _colorBuf;
  130. } else {
  131. #if defined DD360Audi
  132. led_color.Connect_2_Green = _colorBuf;
  133. led_color.Connect_2_Blue = _colorBuf;
  134. led_color.Connect_2_Red = _colorBuf;
  135. #else
  136. led_color.Connect_2_Green = _colorBuf;
  137. led_color.Connect_2_Blue = COLOR_MIN_LV;
  138. led_color.Connect_2_Red = COLOR_MIN_LV;
  139. #endif
  140. }
  141. } else if ((chargingData_2->SystemStatus >= S_AUTHORIZING &&
  142. chargingData_2->SystemStatus <= S_COMPLETE) ||
  143. (chargingData_2->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
  144. chargingData_2->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
  145. led_color.Connect_2_Green = COLOR_MIN_LV;
  146. led_color.Connect_2_Blue = _colorBuf;
  147. led_color.Connect_2_Red = COLOR_MIN_LV;
  148. }
  149. }
  150. }
  151. if (_checkLedChanged > 0) {
  152. if (Config_Led_Color(Uart5Fd, ADDR_LED, &led_color) == PASS) {
  153. _checkLedChanged--;
  154. cur_led_color.Connect_1_Red = led_color.Connect_1_Red;
  155. cur_led_color.Connect_1_Green = led_color.Connect_1_Green;
  156. cur_led_color.Connect_1_Blue = led_color.Connect_1_Blue;
  157. cur_led_color.Connect_2_Red = led_color.Connect_2_Red;
  158. cur_led_color.Connect_2_Green = led_color.Connect_2_Green;
  159. cur_led_color.Connect_2_Blue = led_color.Connect_2_Blue;
  160. }
  161. } else if (IsNoneMatchLedColor()) {
  162. _checkLedChanged = 3;
  163. }
  164. }
  165. static void GetFwAndHwVersion_Led(void)
  166. {
  167. if (Query_FW_Ver(Uart5Fd, ADDR_LED, &ver) == PASS) {
  168. // LedModuleData
  169. strcpy((char *) ShmLedModuleData->version, ver.Version_FW);
  170. // SystemInfo
  171. strcpy((char *) ShmSysConfigAndInfo->SysInfo.LedModuleFwRev, ver.Version_FW);
  172. //log_info("GetFwAndHwVersion_Led s1 = %s \n", ver.Version_FW);
  173. ShmLedModuleData->SelfTest_Comp = YES;
  174. } else {
  175. //log_info("GetFwAndHwVersion_Led fail \n");
  176. }
  177. // if (Query_HW_Ver(Uart5Fd, ADDR_LED, &ver) == PASS)
  178. // {
  179. // // SystemInfo
  180. // strcpy((char *) ShmSysConfigAndInfo->SysInfo.RelayModuleHwRev, ver.Version_FW);
  181. // //log_info("GetFwAndHwVersion_Relay s2 = %s \n", ver.Version_HW);
  182. // }
  183. }
  184. static void LEDBoardProcess(void)
  185. {
  186. struct ChargingInfoData *pDcChargingInfo0 = NULL;
  187. struct ChargingInfoData *pDcChargingInfo1 = NULL;
  188. if (ShmLedModuleData->SelfTest_Comp == NO) {
  189. return;
  190. }
  191. if (GetTimeoutValue(_led_priority_time) / 1000 >= 1000) {
  192. if (pSysConfig->TotalConnectorCount == 1) {
  193. pDcChargingInfo0 = (struct ChargeingInfoData *)GetDcChargingInfoData(0);
  194. SetLedColor(pDcChargingInfo0, pDcChargingInfo0);
  195. } else if (pSysConfig->TotalConnectorCount == 2) {
  196. pDcChargingInfo0 = (struct ChargeingInfoData *)GetDcChargingInfoData(0);
  197. pDcChargingInfo1 = (struct ChargeingInfoData *)GetDcChargingInfoData(1);
  198. SetLedColor(pDcChargingInfo0, pDcChargingInfo1);
  199. }
  200. gettimeofday(&_led_priority_time, NULL);
  201. }
  202. }
  203. static void LEDBoardSelfTest(void)
  204. {
  205. // 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
  206. if (ShmLedModuleData->SelfTest_Comp == YES) {
  207. return;
  208. }
  209. #if defined DD360 ||defined DD360Audi
  210. GetFwAndHwVersion_Led();
  211. sleep(1);
  212. gettimeofday(&_led_priority_time, NULL);
  213. return;
  214. #endif //defined DD360 || defined DD360Audi
  215. // 自檢階段
  216. if (pSysInfo->SelfTestSeq <= _STEST_PSU_CAP) {
  217. GetFwAndHwVersion_Led();
  218. sleep(1);
  219. gettimeofday(&_led_priority_time, NULL);
  220. } else {
  221. // 自檢階段沒有問到版號
  222. if (pAlarmCode->AlarmEvents.bits.LedboardStestFail == NO) {
  223. pAlarmCode->AlarmEvents.bits.LedboardStestFail = YES;
  224. }
  225. }
  226. }
  227. void LEDBoardTask(int uartFD)
  228. {
  229. #if defined DD360ComBox
  230. return;
  231. #endif //defined DD360ComBox
  232. pid_t pid = fork();
  233. if (pid == 0) {
  234. int isContinue = 1;
  235. if (CreateAllCsuShareMemory() == FAIL) {
  236. log_error("LED Board create share memory failed\r\n");
  237. }
  238. MappingGunChargingInfo("LED Board Task");
  239. pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  240. pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  241. pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
  242. pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
  243. ShmLedModuleData = (struct LedModuleData *)GetShmLedModuleData();
  244. while (isContinue) {
  245. LEDBoardSelfTest();
  246. }
  247. }
  248. }