/* * CheckTask.c * * Created on: 2021年9月22日 * Author: 8513 */ #include /*標準輸入輸出定義*/ #include /*標準函數庫定義*/ #include #include #include #include #include "../Config.h" #include "../Log/log.h" #include "../Define/define.h" #include "../ShareMemory/shmMem.h" #include "Module_ChkSysTask.h" struct SysConfigData *pSysConfig = NULL; struct SysInfoData *pSysInfo = NULL; struct OCPP16Data *ShmOCPP16Data = NULL; struct ChargingInfoData *pAcChargingInfo = NULL; static struct ChargingInfoData *pDcChargingInfo = NULL; struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; static DcCommonInfo* ShmDcCommonData = NULL; bool Taskconutstring(char *src, char *taskname) { bool result = false; if (src == NULL || strlen(src) == 0) return result; if (strstr(src, taskname) != NULL && strstr(src, "grep") == NULL && strstr(src, "[") == NULL) { result = true; } return result; } int GetProcessCount(char *procName) { int result = 0; FILE *fp; char cmd[256]; char buf[256]; sprintf(cmd, "ps -ef |grep %s", procName); fp = popen(cmd, "r"); if(fp != NULL) { while(fgets(buf, sizeof(buf), fp) != NULL) { if (Taskconutstring(buf, procName)) result++; } } pclose(fp); return result; } unsigned char CheckSystemTask(unsigned char systemPage) { unsigned char result = 0; unsigned char count_main = GetProcessCount("main"); unsigned char count_evComm = GetProcessCount("Module_EvComm"); unsigned char count_interComm = GetProcessCount("Module_InternalComm"); unsigned char count_eventComm = GetProcessCount("Module_EventLogging"); unsigned char count_primaryComm = GetProcessCount("Module_PrimaryComm"); unsigned char count_lcmComm = GetProcessCount("Module_LcmControl"); unsigned char count_doComm = GetProcessCount("Module_DoComm"); unsigned char count_produceComm = GetProcessCount("Module_ProduceUtils"); unsigned char count_updateFW = GetProcessCount("Module_UpdateFW"); //if (systemPage != _LCM_FIX ) { if (count_main < _SYSTEM_TASK_COUNT_MAIN ) { ///* system("/usr/bin/fuser -k /dev/watchdog"); sleep(1); system("echo V > /dev/watchdog"); system("killall main"); system("killall Module_EventLogging"); system("killall Module_PrimaryComm"); system("killall Module_EvComm"); system("killall Module_LcmControl"); system("killall Module_InternalComm"); system("killall Module_DoComm"); system("killall Module_ProduceUtils"); system("killall Module_UpdateFW"); sleep(3); system("/root/main &"); sleep(20); //*/ /* log_info("System task lost (CSU). "); sleep(3); system("reboot -f"); */ } else { if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM ) { system("killall Module_EvComm"); sleep(3); system("/root/Module_EvComm &"); } if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM ) { system("killall Module_InternalComm"); sleep(3); system("/root/Module_InternalComm &"); } if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING ) { system("killall Module_EventLogging"); sleep(3); system("/root/Module_EventLogging &"); } if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM ) { system("killall Module_PrimaryComm"); sleep(3); system("/root/Module_PrimaryComm &"); } if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM ) { system("killall Module_LcmControl"); sleep(3); system("/root/Module_LcmControl &"); } if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM ) { system("killall Module_DoComm"); sleep(3); system("/root/Module_DoComm &"); } if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS ) { system("killall Module_ProduceUtils"); sleep(3); system("/root/Module_ProduceUtils &"); } if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW ) { system("killall Module_UpdateFW"); sleep(3); system("/root/Module_UpdateFW &"); } } } if (count_main < _SYSTEM_TASK_COUNT_MAIN) result = _SYSTEM_TASK_LOST_ITEM_MAIN; else if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM) result = _SYSTEM_TASK_LOST_ITEM_EVCOMM; /* else if (count_psuComm < 2) result = 3; */ else if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING ) result = _SYSTEM_TASK_LOST_ITEM_EVENTLOG; else if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM) result = _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM; else if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM) result = _SYSTEM_TASK_LOST_ITEM_LCMCONTROL; else if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM ) result = _SYSTEM_TASK_LOST_ITEM_INTERCOMM; else if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM) result = _SYSTEM_TASK_LOST_ITEM_DOCOMM; else if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS) result = _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS; else if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW) result = _SYSTEM_TASK_LOST_ITEM_UPDATEFW; return result; } //=============================================== // Check System Task alive // ============================================== void CheckSystemTaskAlive() { unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage); if (lostId != 0) { if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) { if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN) log_error("System task lost (CSU). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM) log_error("System task lost (EVComm). "); // else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM) // PRINTF_FUNC("System task lost (PSU Task). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG) log_error("System task lost (Event log). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM) log_error("System task lost (Primary). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL) log_error("System task lost (LCM Comm). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM) log_error("System task lost (Internal Comm). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM) log_error("System task lost (Do Comm). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS) log_error("System task lost (ProcductUtils Comm). "); else if (lostId == _SYSTEM_TASK_LOST_ITEM_UPDATEFW) log_error("System task lost (Update FW) "); ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES; } } else ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO; } int main(void) { if (CreateAllCsuShareMemory() == FAIL) { log_error("create share memory error"); return FAIL; } pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); pSysInfo = (struct SysInfoData *)GetShmSysInfoData(); ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data(); ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo(); ShmStatusCodeData = (struct StatusCodeData*)GetShmStatusCodeData(); ShmDcCommonData = (DcCommonInfo*)GetShmDcCommonData(); MappingGunChargingInfo("CheckSystem Task"); while(true) { sleep(3); for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun); if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE ) continue; } if (ShmDcCommonData->DebugFlag == TRUE) { continue; } CheckSystemTaskAlive(); } return FAIL; }