watchdogimpl.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include "watchdogimpl.h"
  2. #include "cmb.h"
  3. #include <sys/reboot.h>
  4. WatchDogClassImpl::WatchDogClassImpl()
  5. {
  6. m_hThreadID = 0;
  7. m_iStartTime = 0;
  8. m_bIsOpen = false;
  9. m_iRebootTime = 0;
  10. }
  11. WatchDogClassImpl::~WatchDogClassImpl()
  12. {
  13. if (m_hThreadID) pthread_cancel(m_hThreadID);
  14. }
  15. int getFileVer(char* sFile, short& ch1, short& ch2)
  16. {
  17. ch1 = 0;
  18. ch2 = 0;
  19. char* pFind = strstr(sFile, ".so");
  20. char* pTemp = pFind;
  21. while (pTemp)
  22. {
  23. pFind = pTemp;
  24. pTemp = strstr(pFind + 3, ".so");
  25. }
  26. if (pFind == NULL) return 0;
  27. pTemp = pFind - 1;
  28. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  29. if (*pTemp == '.')
  30. ch2 = atoi(pTemp+1);
  31. pTemp--;
  32. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  33. if (*pTemp == '.')
  34. ch1 = atoi(pTemp+1);
  35. return 1;
  36. }
  37. ErrorCodeEnum WatchDogClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  38. {
  39. LOG4VTM_FUNCTION();
  40. if (!m_bIsOpen)
  41. return GetErrorInfo(-1, "GetDevCategory");
  42. ErrorCodeEnum err = Error_Succeed;
  43. char szType[] = {"PVER=cashway#MID=softdog"};
  44. char szModel[] = "FWID=00000000";
  45. strcpy(devCategory.szType, szType);
  46. strcpy(devCategory.szModel, szModel);
  47. strcpy(devCategory.szVendor, "cw");
  48. char sPath[256], sFile[128] = {0};
  49. GetCurLibsPath(sPath, sFile);
  50. short v1,v2;
  51. getFileVer(sFile, v1, v2);
  52. devCategory.version.wMajor = v1;
  53. devCategory.version.wMinor = v2;
  54. devCategory.version.wRevision = 0xffff;
  55. devCategory.version.wBuild = FILE_VERSION;
  56. char szRet[512] = {0};
  57. sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
  58. devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
  59. LOG4VTM(INFO, szRet);
  60. return err;
  61. }
  62. ErrorCodeEnum WatchDogClassImpl::Reset()
  63. {
  64. LOG4VTM_FUNCTION();
  65. if (!m_bIsOpen)
  66. return GetErrorInfo(-1, "Reset");
  67. m_iStartTime = 0;
  68. return GetErrorInfo(0, "Reset");
  69. }
  70. ErrorCodeEnum WatchDogClassImpl::DevClose()
  71. {
  72. LOG4VTM_FUNCTION();
  73. if (!m_bIsOpen)
  74. return GetErrorInfo(-1, "Reset");
  75. m_iStartTime = 0;
  76. m_bIsOpen = false;
  77. ErrorCodeEnum err = Error_Succeed;
  78. return err;
  79. }
  80. ErrorCodeEnum WatchDogClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  81. {
  82. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  83. return Error_Succeed;
  84. }
  85. //
  86. // Device initialization.
  87. // Configure port input/output direction.
  88. //
  89. ErrorCodeEnum WatchDogClassImpl::DevOpen()
  90. {
  91. LOG4VTM_FUNCTION();
  92. if (m_hThreadID) pthread_cancel(m_hThreadID);
  93. m_hThreadID = 0;
  94. StartThread();
  95. m_bIsOpen = true;
  96. return GetErrorInfo(0, "DevOpen");
  97. }
  98. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  99. const static CmbErrorDef GpioErrorDat[] = {
  100. {0, "成功", Error_Succeed, DEC_SUCCESS},
  101. {-1, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED},
  102. {-2, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
  103. {-3, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT},
  104. {-4, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER},
  105. };
  106. ErrorCodeEnum WatchDogClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  107. {
  108. size_t iLenOne = sizeof(CmbErrorDef);
  109. size_t iLenAll = sizeof(GpioErrorDat);
  110. int iCount = iLenAll / iLenOne;
  111. char sErrInfo[256]="";
  112. DWORD dSta = 0;
  113. int iErr = -1;
  114. for (int ia = 0; ia < iCount; ia++)
  115. {
  116. if (GpioErrorDat[ia].iCode == iCode)
  117. {
  118. dSta = GpioErrorDat[ia].iInf;
  119. strcpy(sErrInfo, GpioErrorDat[ia].sInf);
  120. iErr = GpioErrorDat[ia].iRet;
  121. break;
  122. }
  123. }
  124. char sErrAll[300];
  125. va_list arglist;
  126. va_start(arglist, sErr);
  127. _vsnprintf(sErrAll, 128, sErr, arglist);
  128. va_end(arglist);
  129. if (sErrInfo[0])
  130. {
  131. strcat(sErrAll, " ");
  132. strcat(sErrAll, sErrInfo);
  133. }
  134. sErrAll[200] = 0;
  135. iLenOne = strlen(sErrAll);
  136. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  137. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  138. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  139. if (iErr != Error_Succeed)
  140. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  141. else
  142. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  143. return (ErrorCodeEnum)iErr;
  144. }
  145. void WatchDogClassImpl::StartThread()
  146. {
  147. pthread_attr_t attr;
  148. pthread_attr_init(&attr);
  149. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  150. pthread_create(&m_hThreadID, &attr, ThreadProc, (void*) this);
  151. pthread_attr_destroy(&attr);
  152. }
  153. void* WatchDogClassImpl::ThreadProc(void* inPara)
  154. {
  155. WatchDogClassImpl* pCtrl = (WatchDogClassImpl*)inPara;
  156. return pCtrl->ThreadRun();
  157. }
  158. void* WatchDogClassImpl::ThreadRun()
  159. {
  160. time_t tNow=0;
  161. while (1)
  162. {
  163. Sleep(500);
  164. time(&tNow);
  165. if (!m_bIsOpen || m_iStartTime < 1 || tNow < m_iStartTime) continue; //监控未开始
  166. if (m_iRebootTime && tNow <= m_iRebootTime) continue; //监控未开始
  167. char sTemp[256];
  168. sprintf(sTemp, "WatchDogClassImpl timeout");
  169. LOG4VTM(INFO, sTemp);
  170. sync(); // 同步磁盘数据,将缓存数据回写到硬盘,以防数据丢失[luther.gliethttp]
  171. system("reboot");
  172. }
  173. return 0;
  174. }
  175. ErrorCodeEnum WatchDogClassImpl::StartWatch(DWORD dwDelay, DWORD dwTimeout)
  176. {
  177. LOG4VTM_FUNCTION();
  178. if (!m_bIsOpen)
  179. return GetErrorInfo(-1, "StartWatch");
  180. time_t tNow=0;
  181. time(&tNow);
  182. m_iStartTime = tNow + dwDelay;
  183. m_iTimeout = dwTimeout + 1;
  184. m_iRebootTime = m_iStartTime + m_iTimeout;
  185. return Error_Succeed;
  186. }
  187. ErrorCodeEnum WatchDogClassImpl::StopWatch()
  188. {
  189. LOG4VTM_FUNCTION();
  190. if (!m_bIsOpen)
  191. return GetErrorInfo(-1, "StopWatch");
  192. m_iStartTime = 0;
  193. m_iRebootTime = 0;
  194. return Error_Succeed;
  195. }
  196. // Feed watchdog.
  197. ErrorCodeEnum WatchDogClassImpl::RefreshDog()
  198. {
  199. LOG4VTM_FUNCTION();
  200. if (!m_bIsOpen)
  201. return GetErrorInfo(-1, "RefreshDog");
  202. time_t tNow=0;
  203. time(&tNow);
  204. m_iRebootTime = tNow + m_iTimeout;
  205. return Error_Succeed;
  206. }