LEDlight.c 13 KB

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