Module_EventLogging.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #include <sys/time.h>
  2. #include <sys/timeb.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <sys/ipc.h>
  9. #include <sys/shm.h>
  10. #include <sys/shm.h>
  11. #include <sys/mman.h>
  12. #include <linux/wireless.h>
  13. #include <arpa/inet.h>
  14. #include <netinet/in.h>
  15. #include <stdbool.h>
  16. #include <unistd.h>
  17. #include <stdarg.h>
  18. #include <stdio.h> /*標準輸入輸出定義*/
  19. #include <stdlib.h> /*標準函數庫定義*/
  20. #include <unistd.h> /*Unix 標準函數定義*/
  21. #include <fcntl.h> /*檔控制定義*/
  22. #include <termios.h> /*PPSIX 終端控制定義*/
  23. #include <errno.h> /*錯誤號定義*/
  24. #include <errno.h>
  25. #include <string.h>
  26. #include <time.h>
  27. #include <ctype.h>
  28. #include <ifaddrs.h>
  29. #include "../../define.h"
  30. #include "Common.h"
  31. struct network_previous_status
  32. {
  33. int rssiWifi;
  34. int rssi4g;
  35. uint8_t isInternet:1;
  36. uint8_t isOcppConnected:1;
  37. uint8_t ethIsInternet:1;
  38. uint8_t maln0IsInternet:1;
  39. uint8_t ppp0IsInternet:1;
  40. };
  41. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  42. struct StatusCodeData *ShmStatusCodeData;
  43. struct OCPP16Data *ShmOCPP16Data;
  44. struct OCPP20Data *ShmOCPP20Data;
  45. struct StatusCodeData StatusCodeDisableMask;
  46. struct StatusCodeData StatusUpdateReq;
  47. struct EventDataType _BackupEventData[10];
  48. struct network_previous_status netPreviousStatus;
  49. sqlite3 *localDb;
  50. sqlite3 *networkDb;
  51. int DiffTimeb(struct timeb ST, struct timeb ET)
  52. {
  53. //return milli-second
  54. unsigned int StartTime,StopTime;
  55. StartTime=(unsigned int)ST.time;
  56. StopTime=(unsigned int)ET.time;
  57. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  58. }
  59. //=================================
  60. // Common routine
  61. //=================================
  62. char* getTimeString(void)
  63. {
  64. char *result=malloc(21);
  65. time_t timep;
  66. struct tm *p;
  67. time(&timep);
  68. p=gmtime(&timep);
  69. sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
  70. return result;
  71. }
  72. //==========================================
  73. // Init all share memory
  74. //==========================================
  75. int InitShareMemory()
  76. {
  77. int result = PASS;
  78. int MeterSMId;
  79. //creat ShmSysConfigAndInfo
  80. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  81. {
  82. #ifdef SystemLogMessage
  83. LOG_ERROR("shmget ShmSysConfigAndInfo NG");
  84. #endif
  85. result = FAIL;
  86. }
  87. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  88. {
  89. #ifdef SystemLogMessage
  90. LOG_ERROR("shmat ShmSysConfigAndInfo NG");
  91. #endif
  92. result = FAIL;
  93. }
  94. else
  95. {}
  96. //creat ShmStatusCodeData
  97. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  98. {
  99. #ifdef SystemLogMessage
  100. LOG_ERROR("shmget ShmStatusCodeData NG");
  101. #endif
  102. result = FAIL;
  103. }
  104. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  105. {
  106. #ifdef SystemLogMessage
  107. LOG_ERROR("shmat ShmStatusCodeData NG");
  108. #endif
  109. result = FAIL;
  110. }
  111. else
  112. {}
  113. if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
  114. {
  115. LOG_ERROR("shmat ShmOCPP16Data NG");
  116. result = FAIL;
  117. }
  118. else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  119. {
  120. LOG_ERROR("shmat ShmOCPP16Data NG");
  121. result = FAIL;
  122. }
  123. if ((MeterSMId = shmget(ShmOcpp20ModuleKey, sizeof(struct OCPP20Data), 0777)) < 0)
  124. {
  125. LOG_ERROR("[main]CreatShareMemory:shmget OCPP20Data NG\n");
  126. result = FAIL;
  127. }
  128. else if ((ShmOCPP20Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  129. {
  130. LOG_ERROR("[main]CreatShareMemory:shmat OCPP20Data NG\n");
  131. result = FAIL;
  132. }
  133. return result;
  134. }
  135. //================================================
  136. // Main process
  137. //================================================
  138. void AddFaultCodeToBuf(unsigned char *Code)
  139. {
  140. if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10)
  141. {
  142. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7);
  143. ShmSysConfigAndInfo->SysWarningInfo.WarningCount++;
  144. }
  145. }
  146. void RemoveFaultCodeToBuf(unsigned char *Code)
  147. {
  148. unsigned char find = 0x01;
  149. char _code[7];
  150. sprintf(_code,"%s", Code);
  151. // 把相關的錯誤碼一次移除,避免重複顯示
  152. while(find)
  153. {
  154. find = 0x00;
  155. for(unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  156. {
  157. if (find == 0x00)
  158. {
  159. if(memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) == 0)
  160. {
  161. find = 0x01;
  162. }
  163. }
  164. else
  165. {
  166. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0],
  167. &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7);
  168. }
  169. }
  170. if (find)
  171. {
  172. ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
  173. }
  174. }
  175. }
  176. //==========================================
  177. // SQLite routne
  178. //==========================================
  179. int DB_Insert_Record(sqlite3 *db, uint8_t *statusCode)
  180. {
  181. int result = PASS;
  182. char* errMsg = NULL;
  183. char sqlStr[1024];
  184. sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode);
  185. // 0 : open successfully, else fail.
  186. if(sqlite3_open(DB_FILE, &db))
  187. {
  188. result = FAIL;
  189. LOG_ERROR("Can't open database: %s", sqlite3_errmsg(db));
  190. sqlite3_close(db);
  191. }
  192. else
  193. {
  194. //LOG_INFO("Local event record database open successfully.");
  195. if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  196. {
  197. result = FAIL;
  198. LOG_ERROR("Insert local event record error message: %s", errMsg);
  199. }
  200. else
  201. {
  202. //LOG_INFO("Insert local event record successfully");
  203. }
  204. sprintf(sqlStr, "delete from event_record where idx < (select idx from event_record order by idx desc limit 1)-2000;");
  205. if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  206. {
  207. result = FAIL;
  208. LOG_ERROR("delete local event_record error message: %s", errMsg);
  209. }
  210. else
  211. {
  212. //LOG_INFO("delete local event record successfully");
  213. }
  214. sqlite3_close(db);
  215. }
  216. return result;
  217. }
  218. int DB_Network_Insert_Record(sqlite3 *db)
  219. {
  220. int result = PASS;
  221. char* errMsg = NULL;
  222. char sqlStr[1024];
  223. if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D')
  224. {
  225. sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
  226. ShmSysConfigAndInfo->SysInfo.InternetConn,
  227. ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
  228. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
  229. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi,
  230. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi,
  231. ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi,
  232. ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
  233. }
  234. else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W')
  235. {
  236. sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
  237. ShmSysConfigAndInfo->SysInfo.InternetConn,
  238. ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
  239. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
  240. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi,
  241. 0,
  242. ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi,
  243. 0);
  244. }
  245. else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T')
  246. {
  247. sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
  248. ShmSysConfigAndInfo->SysInfo.InternetConn,
  249. ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
  250. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
  251. 0,
  252. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi,
  253. 0,
  254. ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
  255. }
  256. else
  257. {
  258. sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');",
  259. ShmSysConfigAndInfo->SysInfo.InternetConn,
  260. ShmSysConfigAndInfo->SysInfo.OcppConnStatus,
  261. !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet,
  262. 0,
  263. 0,
  264. 0,
  265. 0);
  266. }
  267. if(sqlite3_open(NETWORK_DB_FILE, &db))
  268. {
  269. result = FAIL;
  270. LOG_ERROR("Can't open database: %s", sqlite3_errmsg(db));
  271. sqlite3_close(db);
  272. }
  273. else
  274. {
  275. if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  276. {
  277. result = FAIL;
  278. LOG_ERROR("Insert local network status record error message: %s", errMsg);
  279. }
  280. sprintf(sqlStr, "delete from network_record where idx < (select idx from network_record order by idx desc limit 1)-20000;");
  281. if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK)
  282. {
  283. result = FAIL;
  284. LOG_ERROR("delete local network_record error message: %s", errMsg);
  285. }
  286. sqlite3_close(db);
  287. }
  288. return result;
  289. }
  290. void SetFaultUpdateReq(int ByteIndex, int BitIndex)
  291. {
  292. StatusUpdateReq.FaultCode.FaultEvents.FaultVal[ByteIndex] |= (1 << BitIndex);
  293. }
  294. void CleanFaultUpdateReq(int ByteIndex, int BitIndex)
  295. {
  296. StatusUpdateReq.FaultCode.FaultEvents.FaultVal[ByteIndex] &= ~(1 << BitIndex);
  297. }
  298. void SetAlarmUpdateReq(int ByteIndex, int BitIndex)
  299. {
  300. StatusUpdateReq.AlarmCode.AlarmEvents.AlarmVal[ByteIndex] |= (1 << BitIndex);
  301. }
  302. void CleanAlarmUpdateReq(int ByteIndex, int BitIndex)
  303. {
  304. StatusUpdateReq.AlarmCode.AlarmEvents.AlarmVal[ByteIndex] &= ~(1 << BitIndex);
  305. }
  306. void SetInfoUpdateReq(int ByteIndex, int BitIndex)
  307. {
  308. StatusUpdateReq.InfoCode.InfoEvents.InfoVal[ByteIndex] |= (1 << BitIndex);
  309. }
  310. void CleanInfoUpdateReq(int ByteIndex, int BitIndex)
  311. {
  312. StatusUpdateReq.InfoCode.InfoEvents.InfoVal[ByteIndex] &= ~(1 << BitIndex);
  313. }
  314. void CleanAllUpdateReq(void)
  315. {
  316. memset((char *)&StatusUpdateReq, 0x00, sizeof(struct StatusCodeData));
  317. }
  318. bool IsStatusCodeUpdateReq(void)
  319. {
  320. for(int i = 0; i < FaultCodeLength; i++)
  321. {
  322. if(StatusUpdateReq.FaultCode.FaultEvents.FaultVal[i] > 0)
  323. {
  324. return true;
  325. }
  326. }
  327. for(int i = 0; i < AlarmCodeLength; i++)
  328. {
  329. if(StatusUpdateReq.AlarmCode.AlarmEvents.AlarmVal[i] > 0)
  330. {
  331. return true;
  332. }
  333. }
  334. for(int i = 0; i < InfoCodeLength; i++)
  335. {
  336. if(StatusUpdateReq.InfoCode.InfoEvents.InfoVal[i] > 0)
  337. {
  338. return true;
  339. }
  340. }
  341. return false;
  342. }
  343. void SetOcpp20EventData(int event_index, char *vendorCode, unsigned char isAbnormal)
  344. {
  345. getNowDatetime(ShmOCPP20Data->NotifyEvent.eventData[event_index].timestamp);
  346. ShmOCPP20Data->NotifyEvent.eventData[event_index].eventId = event_index;
  347. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].trigger, "Alerting");
  348. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].actualValue, isAbnormal ? "true" : "false");
  349. ShmOCPP20Data->NotifyEvent.eventData[event_index].cleared = isAbnormal ? NO : YES;
  350. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].eventNotificationType, "HardWiredNotification");
  351. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].techcode, vendorCode);
  352. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].techInfo, vendorCode);
  353. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].component.name, "Charger");
  354. ShmOCPP20Data->NotifyEvent.eventData[event_index].component.evse.connectorId = 0;
  355. sprintf((char*)ShmOCPP20Data->NotifyEvent.eventData[event_index].variable.name, "Problem");
  356. }
  357. void UpdateOcpp20EventData(void)
  358. {
  359. int eventCnt = 0;
  360. int eventLength = 0;
  361. bool abnormal = false;
  362. char eventCode[7];
  363. eventLength = ARRAY_SIZE(ShmOCPP20Data->NotifyEvent.eventData);
  364. for(int i = 0; i < FaultCodeLength; i++)
  365. {
  366. for(int j = 0; j < 8; j++)
  367. {
  368. if((StatusUpdateReq.FaultCode.FaultEvents.FaultVal[i] & (1 << j)) > 0 && eventCnt < eventLength)
  369. {
  370. abnormal = (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[i] & (1 << j)) > 0 ? true : false;
  371. memset(eventCode, 0x00, sizeof(eventCode));
  372. memcpy(eventCode, FaultStatusCode[i * 8 + j], sizeof(eventCode) - 1);
  373. // modify power cabinet status code X1XXXX to X4XXXX
  374. if(eventCode[1] == '1')
  375. {
  376. eventCode[1] = '4';
  377. }
  378. SetOcpp20EventData(eventCnt, eventCode, abnormal);
  379. eventCnt++;
  380. }
  381. }
  382. }
  383. for(int i = 0; i < AlarmCodeLength; i++)
  384. {
  385. for(int j = 0; j < 8; j++)
  386. {
  387. if((StatusUpdateReq.AlarmCode.AlarmEvents.AlarmVal[i] & (1 << j)) > 0 && eventCnt < eventLength)
  388. {
  389. abnormal = (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[i] & (1 << j)) > 0 ? true : false;
  390. memset(eventCode, 0x00, sizeof(eventCode));
  391. memcpy(eventCode, AlarmStatusCode[i * 8 + j], sizeof(eventCode) - 1);
  392. // modify power cabinet status code X1XXXX to X4XXXX
  393. if(eventCode[1] == '1')
  394. {
  395. eventCode[1] = '4';
  396. }
  397. SetOcpp20EventData(eventCnt, eventCode, abnormal);
  398. eventCnt++;
  399. }
  400. }
  401. }
  402. for(int i = 0; i < InfoCodeLength; i++)
  403. {
  404. for(int j = 0; j < 8; j++)
  405. {
  406. if((StatusUpdateReq.InfoCode.InfoEvents.InfoVal[i] & (1 << j)) > 0 && eventCnt < eventLength)
  407. {
  408. abnormal = (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[i] & (1 << j)) > 0 ? true : false;
  409. memset(eventCode, 0x00, sizeof(eventCode));
  410. memcpy(eventCode, InfoStatusCode[i * 8 + j], sizeof(eventCode) - 1);
  411. // modify power cabinet status code X1XXXX to X4XXXX
  412. if(eventCode[1] == '1')
  413. {
  414. eventCode[1] = '4';
  415. }
  416. SetOcpp20EventData(eventCnt, eventCode, abnormal);
  417. eventCnt++;
  418. }
  419. }
  420. }
  421. }
  422. int main(void)
  423. {
  424. int ByteCount,BitCount;
  425. unsigned char tmp, EventCodeTmp[7];
  426. if(InitShareMemory() == FAIL)
  427. {
  428. #ifdef SystemLogMessage
  429. LOG_ERROR("InitShareMemory NG");
  430. #endif
  431. if(ShmStatusCodeData!=NULL)
  432. {
  433. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  434. }
  435. sleep(5);
  436. return 0;
  437. }
  438. memset((char *)&StatusCodeDisableMask, 0x00, sizeof(struct StatusCodeData));
  439. CleanAllUpdateReq();
  440. // AlarmCode disable mask
  441. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuFuseBurnOut = YES;
  442. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuPfcAndDcdcCommFault = YES;
  443. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuBusVoltageUnbalance = YES;
  444. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuBusOverVoltage = YES;
  445. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuBusVoltageAbnormal = YES;
  446. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuInputOVP = YES;
  447. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuDuplicateID = YES;
  448. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuBusUnderVoltage = YES;
  449. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuInputPhaseLoss = YES;
  450. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuInputUVP = NO;
  451. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuCommunicationFail = YES;
  452. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuSevereUnevenCurrent = YES;
  453. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuFfcSideShutDown = YES;
  454. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuFanFullSpeed = YES;
  455. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuDcSideShutDown = YES;
  456. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuPowerLimitedState = YES;
  457. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuTemperaturePowerLimit = YES;
  458. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuAcPowerLimit = YES;
  459. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuDcdcEepromFault = YES;
  460. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuFanFailureAlarm = YES;
  461. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuOutputShortCircuit = YES;
  462. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuPfcEepromFault = YES;
  463. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuCriticalPointOTP = YES;
  464. StatusCodeDisableMask.AlarmCode.AlarmEvents.bits.PsuDcdcOverVoltage = YES;
  465. // InfoEvents disable mask
  466. StatusCodeDisableMask.InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet = YES;
  467. StatusCodeDisableMask.InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi = YES;
  468. StatusCodeDisableMask.InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi = YES;
  469. StatusCodeDisableMask.InfoCode.InfoEvents.bits.WiFiDisable = YES;
  470. StatusCodeDisableMask.InfoCode.InfoEvents.bits.Telocom4GModuleDisable = YES;
  471. StatusCodeDisableMask.InfoCode.InfoEvents.bits.BackendDisconnectedViaEthernet = YES;
  472. StatusCodeDisableMask.InfoCode.InfoEvents.bits.BackendDisconnectedViaEthernet = YES;
  473. for(;;)
  474. {
  475. //check Fault Status
  476. for(ByteCount=0;ByteCount<FaultCodeLength;ByteCount++)
  477. {
  478. if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
  479. {
  480. tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
  481. for(BitCount=0;BitCount<8;BitCount++)
  482. {
  483. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
  484. {
  485. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  486. memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  487. // modify power cabinet status code X1XXXX to X4XXXX
  488. if(EventCodeTmp[1] == '1')
  489. {
  490. EventCodeTmp[1] = '4';
  491. }
  492. if(((tmp>>BitCount)&0x01)==0)//Recovered
  493. {
  494. //EventCodeTmp[0]=1;
  495. LOG_INFO("Recovery Fault Code = %s", EventCodeTmp);
  496. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
  497. RemoveFaultCodeToBuf(EventCodeTmp);
  498. }
  499. else
  500. {
  501. LOG_INFO("Fault Code = %s", EventCodeTmp);
  502. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
  503. AddFaultCodeToBuf(EventCodeTmp);
  504. }
  505. LOG_EVENT("%s", EventCodeTmp);
  506. DB_Insert_Record(localDb, EventCodeTmp);
  507. SetFaultUpdateReq(ByteCount, BitCount);
  508. }
  509. }
  510. }
  511. }
  512. //check Alarm Status
  513. for(ByteCount=0;ByteCount<AlarmCodeLength;ByteCount++)
  514. {
  515. if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
  516. {
  517. tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
  518. for(BitCount=0;BitCount<8;BitCount++)
  519. {
  520. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
  521. {
  522. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  523. memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  524. // modify power cabinet status code X1XXXX to X4XXXX
  525. if(EventCodeTmp[1] == '1')
  526. {
  527. EventCodeTmp[1] = '4';
  528. }
  529. if(((tmp>>BitCount)&0x01)==0)//Recovered
  530. {
  531. //EventCodeTmp[0]=1;
  532. LOG_INFO("Recovery Alarm Code = %s", EventCodeTmp);
  533. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
  534. if(!(StatusCodeDisableMask.AlarmCode.AlarmEvents.AlarmVal[ByteCount] & (1<<BitCount)))
  535. {
  536. RemoveFaultCodeToBuf(EventCodeTmp);
  537. }
  538. }
  539. else
  540. {
  541. LOG_INFO("Alarm Code = %s", EventCodeTmp);
  542. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
  543. if(!(StatusCodeDisableMask.AlarmCode.AlarmEvents.AlarmVal[ByteCount] & (1<<BitCount)))
  544. {
  545. AddFaultCodeToBuf(EventCodeTmp);
  546. }
  547. }
  548. LOG_EVENT("%s", EventCodeTmp);
  549. DB_Insert_Record(localDb, EventCodeTmp);
  550. if(!(StatusCodeDisableMask.AlarmCode.AlarmEvents.AlarmVal[ByteCount] & (1<<BitCount)))
  551. {
  552. SetAlarmUpdateReq(ByteCount, BitCount);
  553. }
  554. }
  555. }
  556. }
  557. }
  558. //check Info Status
  559. for(ByteCount=0;ByteCount<InfoCodeLength;ByteCount++)
  560. {
  561. if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
  562. {
  563. tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
  564. for(BitCount=0;BitCount<8;BitCount++)
  565. {
  566. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
  567. {
  568. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  569. memcpy(EventCodeTmp,InfoStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  570. // modify power cabinet status code X1XXXX to X4XXXX
  571. if(EventCodeTmp[1] == '1')
  572. {
  573. EventCodeTmp[1] = '4';
  574. }
  575. if(((tmp>>BitCount)&0x01)==0)//Recovered
  576. {
  577. //EventCodeTmp[0]=1;
  578. LOG_INFO("Recovery Info Code = %s", EventCodeTmp);
  579. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
  580. if(!(StatusCodeDisableMask.InfoCode.InfoEvents.InfoVal[ByteCount] & (1<<BitCount)))
  581. {
  582. RemoveFaultCodeToBuf(EventCodeTmp);
  583. }
  584. }
  585. else
  586. {
  587. LOG_INFO("Info Code = %s", EventCodeTmp);
  588. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
  589. if(!(StatusCodeDisableMask.InfoCode.InfoEvents.InfoVal[ByteCount] & (1<<BitCount)))
  590. {
  591. AddFaultCodeToBuf(EventCodeTmp);
  592. }
  593. }
  594. LOG_EVENT("%s", EventCodeTmp);
  595. DB_Insert_Record(localDb, EventCodeTmp);
  596. if(!(StatusCodeDisableMask.InfoCode.InfoEvents.InfoVal[ByteCount] & (1<<BitCount)))
  597. {
  598. SetInfoUpdateReq(ByteCount, BitCount);
  599. }
  600. }
  601. }
  602. }
  603. }
  604. if(IsStatusCodeUpdateReq())
  605. {
  606. if(ShmSysConfigAndInfo->SysInfo.OcppRunningVer == OCPP_RUNNING_VERSION_20 && ShmOCPP20Data->SpMsg.bits.NotifyEventReq == OFF)
  607. {
  608. UpdateOcpp20EventData();
  609. ShmOCPP20Data->SpMsg.bits.NotifyEventReq = ON;
  610. CleanAllUpdateReq();
  611. }
  612. }
  613. if((netPreviousStatus.isInternet != ShmSysConfigAndInfo->SysInfo.InternetConn) ||
  614. (netPreviousStatus.isOcppConnected != ShmSysConfigAndInfo->SysInfo.OcppConnStatus) ||
  615. (netPreviousStatus.ethIsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet) ||
  616. (netPreviousStatus.maln0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi) ||
  617. (netPreviousStatus.ppp0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi) ||
  618. (netPreviousStatus.rssiWifi != ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) ||
  619. (netPreviousStatus.rssi4g != ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi))
  620. {
  621. DB_Network_Insert_Record(networkDb);
  622. netPreviousStatus.isInternet = ShmSysConfigAndInfo->SysInfo.InternetConn;
  623. netPreviousStatus.isOcppConnected = ShmSysConfigAndInfo->SysInfo.OcppConnStatus;
  624. netPreviousStatus.ethIsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet;
  625. netPreviousStatus.maln0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi;
  626. netPreviousStatus.ppp0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi;
  627. netPreviousStatus.rssiWifi = ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi;
  628. netPreviousStatus.rssi4g = ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi;
  629. }
  630. usleep(500000);
  631. }
  632. return FAIL;
  633. }