Module_EventLogging.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  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 <unistd.h>
  16. #include <stdarg.h>
  17. #include <stdio.h> /*標準輸入輸出定義*/
  18. #include <stdlib.h> /*標準函數庫定義*/
  19. #include <unistd.h> /*Unix 標準函數定義*/
  20. #include <fcntl.h> /*檔控制定義*/
  21. #include <termios.h> /*PPSIX 終端控制定義*/
  22. #include <errno.h> /*錯誤號定義*/
  23. #include <errno.h>
  24. #include <string.h>
  25. #include <time.h>
  26. #include <ctype.h>
  27. #include <ifaddrs.h>
  28. #include "../../define.h"
  29. #define Debug
  30. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  31. #define PASS 1
  32. #define FAIL -1
  33. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  34. struct StatusCodeData *ShmStatusCodeData;
  35. int StoreLogMsg(const char *fmt, ...);
  36. #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  37. #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  38. #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  39. int StoreLogMsg(const char *fmt, ...)
  40. {
  41. char Buf[4096+256];
  42. char buffer[4096];
  43. time_t CurrentTime;
  44. struct tm *tm;
  45. va_list args;
  46. va_start(args, fmt);
  47. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  48. va_end(args);
  49. memset(Buf,0,sizeof(Buf));
  50. CurrentTime = time(NULL);
  51. tm=localtime(&CurrentTime);
  52. sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  53. tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,
  54. buffer,
  55. tm->tm_year+1900,tm->tm_mon+1);
  56. system(Buf);
  57. return rc;
  58. }
  59. int DiffTimeb(struct timeb ST, struct timeb ET)
  60. {
  61. //return milli-second
  62. unsigned int StartTime,StopTime;
  63. StartTime=(unsigned int)ST.time;
  64. StopTime=(unsigned int)ET.time;
  65. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  66. }
  67. //=================================
  68. // Common routine
  69. //=================================
  70. char* getTimeString(void)
  71. {
  72. char *result=malloc(21);
  73. time_t timep;
  74. struct tm *p;
  75. time(&timep);
  76. p=gmtime(&timep);
  77. 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);
  78. return result;
  79. }
  80. //==========================================
  81. // Init all share memory
  82. //==========================================
  83. int InitShareMemory()
  84. {
  85. int result = PASS;
  86. int MeterSMId;
  87. //creat ShmSysConfigAndInfo
  88. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  89. {
  90. #ifdef SystemLogMessage
  91. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  92. #endif
  93. result = FAIL;
  94. }
  95. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  96. {
  97. #ifdef SystemLogMessage
  98. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  99. #endif
  100. result = FAIL;
  101. }
  102. else
  103. {}
  104. //creat ShmStatusCodeData
  105. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  106. {
  107. #ifdef SystemLogMessage
  108. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  109. #endif
  110. result = FAIL;
  111. }
  112. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  113. {
  114. #ifdef SystemLogMessage
  115. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  116. #endif
  117. result = FAIL;
  118. }
  119. else
  120. {}
  121. return result;
  122. }
  123. //================================================
  124. // Main process
  125. //================================================
  126. void AddFaultCodeToBuf(unsigned char *Code)
  127. {
  128. if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10)
  129. {
  130. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7);
  131. ShmSysConfigAndInfo->SysWarningInfo.WarningCount++;
  132. }
  133. }
  134. void RemoveFaultCodeToBuf(unsigned char *Code)
  135. {
  136. unsigned char find = 0x00;
  137. char _code[7];
  138. sprintf(_code,"%s", Code);
  139. for(unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  140. {
  141. if (find == 0x00)
  142. {
  143. if(memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) != 0)
  144. {
  145. find = 0x01;
  146. }
  147. }
  148. else
  149. {
  150. if(i == ShmSysConfigAndInfo->SysWarningInfo.WarningCount - 1)
  151. {
  152. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], "", 7);
  153. }
  154. else
  155. {
  156. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0],
  157. &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + 1][0], 7);
  158. }
  159. }
  160. }
  161. ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
  162. }
  163. int main(void)
  164. {
  165. int ByteCount,BitCount;
  166. unsigned char tmp, EventCodeTmp[7];
  167. if(InitShareMemory() == FAIL)
  168. {
  169. #ifdef SystemLogMessage
  170. DEBUG_ERROR("InitShareMemory NG\n");
  171. #endif
  172. if(ShmStatusCodeData!=NULL)
  173. {
  174. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  175. }
  176. sleep(5);
  177. return 0;
  178. }
  179. for(;;)
  180. {
  181. //check Fault Status
  182. for(ByteCount=0;ByteCount<4;ByteCount++)
  183. {
  184. if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
  185. {
  186. tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
  187. for(BitCount=0;BitCount<8;BitCount++)
  188. {
  189. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
  190. {
  191. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  192. memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  193. if(((tmp>>BitCount)&0x01)==0)//Recovered
  194. {
  195. //EventCodeTmp[0]=1;
  196. DEBUG_INFO("Recovery Fault Code = %s\n", EventCodeTmp);
  197. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
  198. RemoveFaultCodeToBuf(EventCodeTmp);
  199. }
  200. else
  201. {
  202. DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
  203. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
  204. AddFaultCodeToBuf(EventCodeTmp);
  205. }
  206. }
  207. }
  208. }
  209. }
  210. //check Alarm Status
  211. for(ByteCount=0;ByteCount<8;ByteCount++)
  212. {
  213. if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
  214. {
  215. tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
  216. for(BitCount=0;BitCount<8;BitCount++)
  217. {
  218. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
  219. {
  220. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  221. memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  222. if(((tmp>>BitCount)&0x01)==0)//Recovered
  223. {
  224. //EventCodeTmp[0]=1;
  225. DEBUG_INFO("Recovery Alarm Code = %s\n", EventCodeTmp);
  226. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
  227. RemoveFaultCodeToBuf(EventCodeTmp);
  228. }
  229. else
  230. {
  231. DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
  232. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
  233. AddFaultCodeToBuf(EventCodeTmp);
  234. }
  235. }
  236. }
  237. }
  238. }
  239. //check Info Status
  240. for(ByteCount=0;ByteCount<8;ByteCount++)
  241. {
  242. if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
  243. {
  244. tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
  245. for(BitCount=0;BitCount<8;BitCount++)
  246. {
  247. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
  248. {
  249. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  250. memcpy(EventCodeTmp,InfoStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  251. if(((tmp>>BitCount)&0x01)==0)//Recovered
  252. {
  253. //EventCodeTmp[0]=1;
  254. DEBUG_INFO("Recovery Info Code = %s\n", EventCodeTmp);
  255. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
  256. RemoveFaultCodeToBuf(EventCodeTmp);
  257. }
  258. else
  259. {
  260. DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
  261. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
  262. AddFaultCodeToBuf(EventCodeTmp);
  263. }
  264. }
  265. }
  266. }
  267. }
  268. usleep(500000);
  269. }
  270. return FAIL;
  271. }