EventLogging.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. /*===========================================================================
  2. Combined Charging System (CCS): SECC
  3. EventLogging.c
  4. initiated by Vern, Joseph
  5. (since 2019/07/19)
  6. =============================================================================*/
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <linux/termios.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <time.h>
  14. #include <stdlib.h>
  15. #include <sys/ipc.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/sockios.h>
  19. #include <linux/socket.h>
  20. #include <sys/socket.h>
  21. #include <netinet/in.h>
  22. #include <sys/time.h>
  23. #include <sys/timeb.h>
  24. #include <math.h>//for pow
  25. #include <unistd.h>
  26. #include "define.h"
  27. #include "EventLogging.h"
  28. //#define Debug
  29. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  30. struct StatusCodeData *ShmStatusCodeData;
  31. #ifdef SystemLogMessage
  32. int StoreLogMsg(unsigned char *DataString)
  33. {
  34. unsigned char Buf[256];
  35. time_t CurrentTime;
  36. struct tm *tm;
  37. memset(Buf, 0, sizeof(Buf));
  38. CurrentTime = time(NULL);
  39. tm = localtime(&CurrentTime);
  40. sprintf(Buf, "echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  41. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
  42. DataString,
  43. tm->tm_year + 1900, tm->tm_mon + 1);
  44. system(Buf);
  45. #ifdef Debug
  46. printf("%s \n", DataString);
  47. #endif
  48. }
  49. #endif
  50. int StoreEventLogMsg(unsigned char *EventCodeString)
  51. {
  52. unsigned char Buf[256];
  53. time_t CurrentTime;
  54. struct tm *tm;
  55. memset(Buf, 0, sizeof(Buf));
  56. CurrentTime = time(NULL);
  57. tm = localtime(&CurrentTime);
  58. sprintf(Buf, "echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/EventLog/[%04d.%02d]EventLog",
  59. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
  60. EventCodeString,
  61. tm->tm_year + 1900, tm->tm_mon + 1);
  62. system(Buf);
  63. #ifdef Debug
  64. printf("%s \n", Buf);
  65. #endif
  66. }
  67. int DiffTimeb(struct timeb ST, struct timeb ET)
  68. {
  69. //return milli-second
  70. unsigned int StartTime, StopTime;
  71. StartTime = (unsigned int)ST.time;
  72. StopTime = (unsigned int)ET.time;
  73. return (StopTime - StartTime) * 1000 + ET.millitm - ST.millitm;
  74. }
  75. /**************************************************************************************/
  76. /**************************Init all share memory *********************************/
  77. /**************************************************************************************/
  78. int InitShareMemory()
  79. {
  80. int MeterSMId;
  81. //creat ShmSysConfigAndInfo
  82. if((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  83. {
  84. #ifdef SystemLogMessage
  85. StoreLogMsg("[EventLogging]InitShareMemory:shmget ShmSysConfigAndInfo NG");
  86. #endif
  87. return 0;
  88. }
  89. else if((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  90. {
  91. #ifdef SystemLogMessage
  92. StoreLogMsg("[EventLogging]InitShareMemory:shmat ShmSysConfigAndInfo NG");
  93. #endif
  94. return 0;
  95. }
  96. //creat ShmStatusCodeData
  97. if((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  98. {
  99. #ifdef SystemLogMessage
  100. StoreLogMsg("[EventLogging]InitShareMemory:shmget ShmStatusCodeData NG");
  101. #endif
  102. return 0;
  103. }
  104. else if((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  105. {
  106. #ifdef SystemLogMessage
  107. StoreLogMsg("[EventLogging]InitShareMemory:shmat ShmStatusCodeData NG");
  108. #endif
  109. return 0;
  110. }
  111. return 1;
  112. }
  113. void FlashPresentStatusCode(unsigned char *NewCode)
  114. {
  115. unsigned char CodeIndex, SaveIndex = 0;
  116. unsigned char StatusCodeTmp[10][6];
  117. memset(StatusCodeTmp, 0, sizeof(StatusCodeTmp));
  118. for(CodeIndex = 0; CodeIndex < (sizeof(ShmStatusCodeData->PresentStatusCode) / 6); CodeIndex++)
  119. {
  120. if(strlen(ShmStatusCodeData->PresentStatusCode[CodeIndex]) <= 0)
  121. {
  122. memcpy(StatusCodeTmp[SaveIndex++], NewCode, 6);
  123. memset(ShmStatusCodeData->PresentStatusCode, 0, sizeof(ShmStatusCodeData->PresentStatusCode));
  124. memcpy(ShmStatusCodeData->PresentStatusCode, StatusCodeTmp, sizeof(StatusCodeTmp));
  125. return;
  126. }
  127. else if(strstr(ShmStatusCodeData->PresentStatusCode[CodeIndex], NewCode + 1) != NULL)
  128. {
  129. if((CodeIndex + 1) < 10)
  130. {
  131. memcpy(StatusCodeTmp[SaveIndex], ShmStatusCodeData->PresentStatusCode[CodeIndex + 1], (9 - CodeIndex) * 6);
  132. }
  133. memset(ShmStatusCodeData->PresentStatusCode, 0, sizeof(ShmStatusCodeData->PresentStatusCode));
  134. memcpy(ShmStatusCodeData->PresentStatusCode, StatusCodeTmp, sizeof(StatusCodeTmp));
  135. return;
  136. }
  137. else
  138. {
  139. memcpy(StatusCodeTmp[SaveIndex++], ShmStatusCodeData->PresentStatusCode[CodeIndex], 6);
  140. }
  141. }
  142. }
  143. int main(int argc, char *argv[])
  144. {
  145. int ByteCount, BitCount;
  146. unsigned char tmp, EventCodeTmp[7];
  147. //Initialization
  148. if(InitShareMemory() == 0)
  149. {
  150. #ifdef SystemLogMessage
  151. StoreLogMsg("[EventLogging]main:InitShareMemory NG");
  152. #endif
  153. if(ShmStatusCodeData != NULL)
  154. {
  155. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  156. }
  157. sleep(5);
  158. return 0;
  159. }
  160. while(1)
  161. {
  162. //check Fault Status
  163. for(ByteCount = 0; ByteCount < 4; ByteCount++)
  164. {
  165. if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
  166. {
  167. tmp = ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
  168. for(BitCount = 0; BitCount < 8; BitCount++)
  169. {
  170. if(((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] >> BitCount) & 0x01))
  171. {
  172. memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
  173. memcpy(EventCodeTmp, FaultStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
  174. if(((tmp >> BitCount) & 0x01) == 0)//Recovered
  175. {
  176. EventCodeTmp[0] = 1;
  177. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= (0 << BitCount);
  178. }
  179. else
  180. {
  181. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1 << BitCount);
  182. }
  183. FlashPresentStatusCode(EventCodeTmp);
  184. StoreEventLogMsg(EventCodeTmp);
  185. }
  186. }
  187. }
  188. }
  189. //check Alarm Status
  190. for(ByteCount = 0; ByteCount < 8; ByteCount++)
  191. {
  192. if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
  193. {
  194. tmp = ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
  195. for(BitCount = 0; BitCount < 8; BitCount++)
  196. {
  197. if(((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] >> BitCount) & 0x01))
  198. {
  199. memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
  200. memcpy(EventCodeTmp, AlarmStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
  201. if(((tmp >> BitCount) & 0x01) == 0)//Recovered
  202. {
  203. EventCodeTmp[0] = 1;
  204. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= (0 << BitCount);
  205. }
  206. else
  207. {
  208. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1 << BitCount);
  209. }
  210. FlashPresentStatusCode(EventCodeTmp);
  211. StoreEventLogMsg(EventCodeTmp);
  212. }
  213. }
  214. }
  215. }
  216. //check Info Status
  217. for(ByteCount = 0; ByteCount < 8; ByteCount++)
  218. {
  219. if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
  220. {
  221. tmp = ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
  222. for(BitCount = 0; BitCount < 8; BitCount++)
  223. {
  224. if(((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] >> BitCount) & 0x01))
  225. {
  226. memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
  227. memcpy(EventCodeTmp, InfoStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
  228. if(((tmp >> BitCount) & 0x01) == 0)//Recovered
  229. {
  230. EventCodeTmp[0] = 1;
  231. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= (0 << BitCount);
  232. }
  233. else
  234. {
  235. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1 << BitCount);
  236. }
  237. FlashPresentStatusCode(EventCodeTmp);
  238. StoreEventLogMsg(EventCodeTmp);
  239. }
  240. }
  241. }
  242. }
  243. }//main while loop
  244. }