Module_EventLogging.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. #include "Config.h"
  30. #define Debug
  31. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  32. #define PASS 1
  33. #define FAIL -1
  34. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  35. struct StatusCodeData *ShmStatusCodeData;
  36. int DiffTimeb(struct timeb ST, struct timeb ET)
  37. {
  38. //return milli-second
  39. unsigned int StartTime,StopTime;
  40. StartTime=(unsigned int)ST.time;
  41. StopTime=(unsigned int)ET.time;
  42. return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
  43. }
  44. //=================================
  45. // Common routine
  46. //=================================
  47. char* getTimeString(void)
  48. {
  49. char *result=malloc(21);
  50. time_t timep;
  51. struct tm *p;
  52. time(&timep);
  53. p=gmtime(&timep);
  54. 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);
  55. return result;
  56. }
  57. //==========================================
  58. // Init all share memory
  59. //==========================================
  60. int InitShareMemory()
  61. {
  62. int result = PASS;
  63. int MeterSMId;
  64. //creat ShmSysConfigAndInfo
  65. if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  66. {
  67. #ifdef SystemLogMessage
  68. DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
  69. #endif
  70. result = FAIL;
  71. }
  72. else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  73. {
  74. #ifdef SystemLogMessage
  75. DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
  76. #endif
  77. result = FAIL;
  78. }
  79. else
  80. {}
  81. //creat ShmStatusCodeData
  82. if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  83. {
  84. #ifdef SystemLogMessage
  85. DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
  86. #endif
  87. result = FAIL;
  88. }
  89. else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
  90. {
  91. #ifdef SystemLogMessage
  92. DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
  93. #endif
  94. result = FAIL;
  95. }
  96. else
  97. {}
  98. return result;
  99. }
  100. //================================================
  101. // Main process
  102. //================================================
  103. void AddFaultCodeToBuf(unsigned char *Code)
  104. {
  105. if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10)
  106. {
  107. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7);
  108. ShmSysConfigAndInfo->SysWarningInfo.WarningCount++;
  109. }
  110. }
  111. void RemoveFaultCodeToBuf(unsigned char *Code)
  112. {
  113. unsigned char find = 0x00;
  114. char _code[7];
  115. sprintf(_code,"%s", Code);
  116. for(unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
  117. {
  118. if (find == 0x00)
  119. {
  120. if(memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) != 0)
  121. {
  122. find = 0x01;
  123. }
  124. }
  125. else
  126. {
  127. if(i == ShmSysConfigAndInfo->SysWarningInfo.WarningCount - 1)
  128. {
  129. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], "", 7);
  130. }
  131. else
  132. {
  133. memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0],
  134. &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + 1][0], 7);
  135. }
  136. }
  137. }
  138. ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
  139. }
  140. int main(void)
  141. {
  142. int ByteCount,BitCount;
  143. unsigned char tmp, EventCodeTmp[7];
  144. if(InitShareMemory() == FAIL)
  145. {
  146. #ifdef SystemLogMessage
  147. DEBUG_ERROR("InitShareMemory NG\n");
  148. #endif
  149. if(ShmStatusCodeData!=NULL)
  150. {
  151. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
  152. }
  153. sleep(5);
  154. return 0;
  155. }
  156. for(;;)
  157. {
  158. //check Fault Status
  159. for(ByteCount=0;ByteCount<4;ByteCount++)
  160. {
  161. if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
  162. {
  163. tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
  164. for(BitCount=0;BitCount<8;BitCount++)
  165. {
  166. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
  167. {
  168. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  169. memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  170. if(((tmp>>BitCount)&0x01)==0)//Recovered
  171. {
  172. //EventCodeTmp[0]=1;
  173. DEBUG_INFO("Recovery Fault Code = %s\n", EventCodeTmp);
  174. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
  175. RemoveFaultCodeToBuf(EventCodeTmp);
  176. }
  177. else
  178. {
  179. DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
  180. ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
  181. AddFaultCodeToBuf(EventCodeTmp);
  182. }
  183. }
  184. }
  185. }
  186. }
  187. //check Alarm Status
  188. for(ByteCount=0;ByteCount<8;ByteCount++)
  189. {
  190. if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
  191. {
  192. tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
  193. for(BitCount=0;BitCount<8;BitCount++)
  194. {
  195. if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
  196. {
  197. memset(EventCodeTmp,0,sizeof(EventCodeTmp));
  198. memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
  199. if(((tmp>>BitCount)&0x01)==0)//Recovered
  200. {
  201. //EventCodeTmp[0]=1;
  202. DEBUG_INFO("Recovery Alarm Code = %s\n", EventCodeTmp);
  203. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
  204. RemoveFaultCodeToBuf(EventCodeTmp);
  205. }
  206. else
  207. {
  208. DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
  209. ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
  210. AddFaultCodeToBuf(EventCodeTmp);
  211. }
  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. DEBUG_INFO("Recovery Info Code = %s\n", EventCodeTmp);
  232. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
  233. RemoveFaultCodeToBuf(EventCodeTmp);
  234. }
  235. else
  236. {
  237. DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
  238. ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
  239. AddFaultCodeToBuf(EventCodeTmp);
  240. }
  241. }
  242. }
  243. }
  244. }
  245. usleep(500000);
  246. }
  247. return FAIL;
  248. }