Module_ChkSysTask.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. * CheckTask.c
  3. *
  4. * Created on: 2021年9月22日
  5. * Author: 8513
  6. */
  7. #include <stdio.h> /*標準輸入輸出定義*/
  8. #include <stdlib.h> /*標準函數庫定義*/
  9. #include <string.h>
  10. #include <stdint.h>
  11. #include <sys/types.h>
  12. #include <dirent.h>
  13. #include "../Config.h"
  14. #include "../Log/log.h"
  15. #include "../Define/define.h"
  16. #include "../ShareMemory/shmMem.h"
  17. #include "Module_ChkSysTask.h"
  18. #include "../common.h"
  19. struct SysConfigData *pSysConfig = NULL;
  20. struct SysInfoData *pSysInfo = NULL;
  21. struct OCPP16Data *ShmOCPP16Data = NULL;
  22. struct ChargingInfoData *pAcChargingInfo = NULL;
  23. static struct ChargingInfoData *pDcChargingInfo = NULL;
  24. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  25. struct StatusCodeData *ShmStatusCodeData;
  26. static DcCommonInfo *ShmDcCommonData = NULL;
  27. bool Taskconutstring(char *src, char *taskname)
  28. {
  29. bool result = false;
  30. if (src == NULL || strlen(src) == 0)
  31. return result;
  32. if (strstr(src, taskname) != NULL &&
  33. strstr(src, "grep") == NULL &&
  34. strstr(src, "[") == NULL)
  35. {
  36. result = true;
  37. }
  38. return result;
  39. }
  40. int GetProcessCount(char *procName)
  41. {
  42. int result = 0;
  43. FILE *fp;
  44. char cmd[256];
  45. char buf[256];
  46. sprintf(cmd, "ps -ef |grep %s", procName);
  47. fp = popen(cmd, "r");
  48. if(fp != NULL)
  49. {
  50. while(fgets(buf, sizeof(buf), fp) != NULL)
  51. {
  52. if (Taskconutstring(buf, procName))
  53. result++;
  54. }
  55. }
  56. pclose(fp);
  57. return result;
  58. }
  59. unsigned char CheckSystemTask(unsigned char systemPage)
  60. {
  61. unsigned char result = 0;
  62. unsigned char count_lcmComm = 0;
  63. unsigned char count_main = GetProcessCount("main");
  64. unsigned char count_evComm = GetProcessCount("Module_EvComm");
  65. unsigned char count_interComm = GetProcessCount("Module_InternalComm");
  66. unsigned char count_eventComm = GetProcessCount("Module_EventLogging");
  67. unsigned char count_primaryComm = GetProcessCount("Module_PrimaryComm");
  68. if (CheckDispenserGeneration() == _DISPENSER_GENERATION_3_5)
  69. count_lcmComm = GetProcessCount("Module_LcmWistronControl");
  70. else
  71. count_lcmComm = GetProcessCount("Module_LcmControl");
  72. unsigned char count_doComm = GetProcessCount("Module_DoComm");
  73. unsigned char count_produceComm = GetProcessCount("Module_ProduceUtils");
  74. unsigned char count_updateFW = GetProcessCount("Module_UpdateFW");
  75. unsigned char count_DcMeter = GetProcessCount("Module_DcMeter");
  76. int lcmcount = 0;
  77. if (CheckDispenserGeneration() != _DISPENSER_GENERATION_3_5) {
  78. lcmcount = _SYSTEM_TASK_COUNT_LCM_7;
  79. } else {
  80. lcmcount = _SYSTEM_TASK_COUNT_LCM_21_5;
  81. }
  82. //if (systemPage != _LCM_FIX )
  83. {
  84. if (count_main < _SYSTEM_TASK_COUNT_MAIN )
  85. {
  86. ///*
  87. system("/usr/bin/fuser -k /dev/watchdog");
  88. sleep(1);
  89. system("echo V > /dev/watchdog");
  90. system("killall main");
  91. system("killall Module_EventLogging");
  92. system("killall Module_PrimaryComm");
  93. system("killall Module_EvComm");
  94. if (CheckDispenserGeneration() == _DISPENSER_GENERATION_3_5)
  95. system("killall Module_LcmWistronControl");
  96. else
  97. system("killall Module_LcmControl");
  98. system("killall Module_InternalComm");
  99. system("killall Module_DoComm");
  100. system("killall Module_ProduceUtils");
  101. system("killall Module_UpdateFW");
  102. if (pSysConfig->ModelName[3] == 'P')
  103. system("killall Module_DcMeter");
  104. sleep(3);
  105. system("/root/main &");
  106. sleep(20);
  107. //*/
  108. /*
  109. log_info("System task lost (CSU). ");
  110. sleep(3);
  111. system("reboot -f");
  112. */
  113. }
  114. else
  115. {
  116. if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM )
  117. {
  118. system("killall Module_EvComm");
  119. sleep(3);
  120. system("/root/Module_EvComm &");
  121. }
  122. if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
  123. {
  124. system("killall Module_InternalComm");
  125. sleep(3);
  126. system("/root/Module_InternalComm &");
  127. }
  128. if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
  129. {
  130. system("killall Module_EventLogging");
  131. sleep(3);
  132. system("/root/Module_EventLogging &");
  133. }
  134. if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM )
  135. {
  136. system("killall Module_PrimaryComm");
  137. sleep(3);
  138. system("/root/Module_PrimaryComm &");
  139. }
  140. if (count_lcmComm < lcmcount )
  141. {
  142. if (CheckDispenserGeneration() != _DISPENSER_GENERATION_3_5) {
  143. system("killall Module_LcmControl");
  144. sleep(3);
  145. system("/root/Module_LcmControl &");
  146. } else {
  147. system("killall Module_LcmWistronControl");
  148. sleep(3);
  149. system("/root/Module_LcmWistronControl &");
  150. }
  151. }
  152. if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM )
  153. {
  154. system("killall Module_DoComm");
  155. sleep(3);
  156. system("/root/Module_DoComm &");
  157. }
  158. if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS )
  159. {
  160. system("killall Module_ProduceUtils");
  161. sleep(3);
  162. system("/root/Module_ProduceUtils &");
  163. }
  164. if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW )
  165. {
  166. system("killall Module_UpdateFW");
  167. sleep(3);
  168. system("/root/Module_UpdateFW &");
  169. }
  170. if (count_DcMeter < _SYSTEM_TASK_COUNT_DCMETER && pSysConfig->ModelName[3] == 'P' )
  171. {
  172. system("killall Module_DcMeter");
  173. sleep(3);
  174. system("/root/Module_DcMeter &");
  175. }
  176. }
  177. }
  178. if (count_main < _SYSTEM_TASK_COUNT_MAIN)
  179. result = _SYSTEM_TASK_LOST_ITEM_MAIN;
  180. else if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM)
  181. result = _SYSTEM_TASK_LOST_ITEM_EVCOMM;
  182. /* else if (count_psuComm < 2)
  183. result = 3; */
  184. else if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
  185. result = _SYSTEM_TASK_LOST_ITEM_EVENTLOG;
  186. else if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM)
  187. result = _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM;
  188. else if (count_lcmComm < lcmcount)
  189. result = _SYSTEM_TASK_LOST_ITEM_LCMCONTROL;
  190. else if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
  191. result = _SYSTEM_TASK_LOST_ITEM_INTERCOMM;
  192. else if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM)
  193. result = _SYSTEM_TASK_LOST_ITEM_DOCOMM;
  194. else if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS)
  195. result = _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS;
  196. else if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW)
  197. result = _SYSTEM_TASK_LOST_ITEM_UPDATEFW;
  198. else if (count_DcMeter < _SYSTEM_TASK_COUNT_DCMETER && pSysConfig->ModelName[3] == 'P')
  199. result = _SYSTEM_TASK_LOST_ITEM_DCMETER;
  200. else{
  201. }
  202. return result;
  203. }
  204. //===============================================
  205. // Check System Task alive
  206. // ==============================================
  207. void CheckSystemTaskAlive()
  208. {
  209. unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
  210. if (lostId != 0) {
  211. log_error("Check task(%d) lost",lostId);
  212. if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
  213. if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
  214. log_error("System task lost (CSU). ");
  215. else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
  216. log_error("System task lost (EVComm). ");
  217. // else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
  218. // PRINTF_FUNC("System task lost (PSU Task). ");
  219. else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
  220. log_error("System task lost (Event log). ");
  221. else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
  222. log_error("System task lost (Primary). ");
  223. else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
  224. log_error("System task lost (LCM Comm). ");
  225. else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
  226. log_error("System task lost (Internal Comm). ");
  227. else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
  228. log_error("System task lost (Do Comm). ");
  229. else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
  230. log_error("System task lost (ProcductUtils Comm). ");
  231. else if (lostId == _SYSTEM_TASK_LOST_ITEM_UPDATEFW)
  232. log_error("System task lost (Update FW) ");
  233. else if (lostId == _SYSTEM_TASK_LOST_ITEM_DCMETER)
  234. log_error("System task lost (DcMeter) ");
  235. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
  236. }
  237. } else
  238. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
  239. }
  240. int main(void)
  241. {
  242. if (CreateAllCsuShareMemory() == FAIL) {
  243. log_error("create share memory error");
  244. return FAIL;
  245. }
  246. MappingGunChargingInfo("CheckSystem Task");
  247. pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
  248. pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
  249. ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
  250. ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo();
  251. ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();
  252. ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
  253. while(true)
  254. {
  255. for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
  256. pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
  257. if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
  258. continue;
  259. }
  260. if (ShmDcCommonData->debugflag == YES || pSysInfo->FirmwareUpdate) {
  261. sleep(3);
  262. continue;
  263. }
  264. CheckSystemTaskAlive();
  265. sleep(3);
  266. }
  267. }