upsimpl.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. #include "upsimpl.h"
  2. #include "log4vendor.h"
  3. UpsClassImpl::UpsClassImpl()
  4. {
  5. m_pDevice = new DeviceConnect();
  6. }
  7. UpsClassImpl::~UpsClassImpl()
  8. {
  9. delete m_pDevice;
  10. }
  11. ErrorCodeEnum UpsClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  12. {
  13. LOG4VTM_FUNCTION();
  14. char sPort[16],sGet[32];
  15. sprintf(sPort, "COM%d", dwPort);
  16. SIni ini;
  17. if (ini.GetValueFromIniFile("/cashway/setting/cashway.ini", "Serial", sPort, sGet, 30))
  18. strcpy(sPort, sGet);
  19. int iRet = m_pDevice->Open(sPort, dwBaudRate);
  20. if (iRet != 0)
  21. return GetErrorInfo(iRet, "DevOpen");
  22. bool bUps, bLow;
  23. iRet = m_pDevice->GetStatus(bUps, bLow);
  24. return GetErrorInfo(iRet, "DevOpen");
  25. }
  26. int getFileVer(char* sFile, short& ch1, short& ch2)
  27. {
  28. ch1 = 0;
  29. ch2 = 0;
  30. char* pFind = strstr(sFile, ".so");
  31. char* pTemp = pFind;
  32. while (pTemp)
  33. {
  34. pFind = pTemp;
  35. pTemp = strstr(pFind + 3, ".so");
  36. }
  37. if (pFind == NULL) return 0;
  38. pTemp = pFind - 1;
  39. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  40. if (*pTemp == '.')
  41. ch2 = atoi(pTemp+1);
  42. pTemp--;
  43. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  44. if (*pTemp == '.')
  45. ch1 = atoi(pTemp+1);
  46. return 1;
  47. }
  48. ErrorCodeEnum UpsClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  49. {
  50. LOG4VTM_FUNCTION();
  51. if (!m_pDevice->IsOpen())
  52. return GetErrorInfo(UPS_NOT_OPEN, "GetDevCategory");
  53. ErrorCodeEnum err = Error_Succeed;
  54. // int iRet = _fingerDev->GetVersion(sInfo);
  55. // ErrorCodeEnum errcode = HandleDevError(iRet, "Reset");
  56. char szType[] = {"PVER=goldpower#MID=GPAD301"};
  57. char szModel[] = "FWID=%s";
  58. strcpy(devCategory.szType, szType);
  59. char sSer[256]="11111111";
  60. if (m_pDevice->GetVersion(sSer) == 0)
  61. {
  62. sSer[32] = 0;
  63. sprintf(devCategory.szModel, szModel, sSer);
  64. }
  65. else
  66. return GetErrorInfo(UPS_NOT_OPEN, "GetDevCategory GetVersion error");
  67. // sprintf(devCategory.szModel, szModel, "00000000");
  68. strcpy(devCategory.szVendor, "cw");
  69. char sPath[256], sFile[128] = {0};
  70. GetCurLibsPath(sPath, sFile);
  71. short v1,v2;
  72. getFileVer(sFile, v1, v2);
  73. devCategory.version.wMajor = v1;
  74. devCategory.version.wMinor = v2;
  75. devCategory.version.wRevision = 0xffff;
  76. devCategory.version.wBuild = FILE_VERSION;
  77. char szRet[512] = {0};
  78. sprintf(szRet, "szType:%s,szModel:%s,szVendor:%s,version.wMajor:%d,version.wMinor:%d,version.wBuild:%d,version.wRevision:%d,eState:%d(0:故障1:正常)",
  79. devCategory.szType,devCategory.szModel,devCategory.szVendor,devCategory.version.wMajor,devCategory.version.wMinor,devCategory.version.wBuild,devCategory.version.wRevision,devCategory.eState);
  80. LOG4VTM(INFO, szRet);
  81. return err;
  82. }
  83. ErrorCodeEnum UpsClassImpl::GetDevStatus(UpsStatusEnum& eStatus)
  84. {
  85. LOG4VTM_FUNCTION();
  86. if (!m_pDevice->IsOpen())
  87. return GetErrorInfo(UPS_NOT_OPEN, "GetDevStatus");
  88. bool bUps, bLow;
  89. int iRet = m_pDevice->GetStatus(bUps, bLow);
  90. if (iRet == 0)
  91. eStatus = bUps ? UPS_STATUS_NO_ELECTOR : UPS_STATUS_NORMAL;
  92. else
  93. eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
  94. int i1,i2;
  95. iRet = m_pDevice->GetVoltage(i1, i2);
  96. return GetErrorInfo(iRet, "GetDevStatus");
  97. }
  98. ErrorCodeEnum UpsClassImpl::Reset()
  99. {
  100. LOG4VTM_FUNCTION();
  101. if (!m_pDevice->IsOpen())
  102. return GetErrorInfo(UPS_NOT_OPEN, "Reset");
  103. int iRet = m_pDevice->ShutDown(0xffff);
  104. return GetErrorInfo(iRet, "Reset");;
  105. }
  106. ErrorCodeEnum UpsClassImpl::DevClose()
  107. {
  108. LOG4VTM_FUNCTION();
  109. m_pDevice->Close();
  110. return Error_Succeed;
  111. }
  112. // Shutdown ups and restart it in minutes.
  113. // Arguments:
  114. // - dwShutTime:time to shutdown (in minutes)
  115. // - dwRestartTime:time to restart (in minutes)
  116. //
  117. ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime, DWORD dwRestartTime)
  118. {
  119. LOG4VTM_FUNCTION();
  120. if (!m_pDevice->IsOpen())
  121. return GetErrorInfo(UPS_NOT_OPEN, "Shutdown");
  122. if (dwShutTime < 1)
  123. {
  124. dwShutTime = 1;
  125. }
  126. int iRet = m_pDevice->ShutDown(dwShutTime);
  127. if (iRet != 0)
  128. return GetErrorInfo(iRet, "Shutdown");
  129. iRet = m_pDevice->ReStart(dwShutTime + dwRestartTime);
  130. return GetErrorInfo(iRet, "Shutdown ReStart");
  131. }
  132. ErrorCodeEnum UpsClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  133. {
  134. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  135. return Error_Succeed;
  136. }
  137. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  138. const static CmbErrorDef UpsErrorDat[] = {
  139. {0, "成功", Error_Succeed, DEC_SUCCESS},
  140. {UPS_NOT_OPEN, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED},
  141. {UPS_HARDWARE_ERROR, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
  142. {UPS_TIMEOUT, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT},
  143. {UPS_PARA_ERR, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER},
  144. };
  145. ErrorCodeEnum UpsClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  146. {
  147. size_t iLenOne = sizeof(CmbErrorDef);
  148. size_t iLenAll = sizeof(UpsErrorDat);
  149. int iCount = iLenAll / iLenOne;
  150. char sErrInfo[256]="";
  151. DWORD dSta = 0;
  152. int iErr = -1;
  153. for (int ia = 0; ia < iCount; ia++)
  154. {
  155. if (UpsErrorDat[ia].iCode == iCode)
  156. {
  157. dSta = UpsErrorDat[ia].iInf;
  158. strcpy(sErrInfo, UpsErrorDat[ia].sInf);
  159. iErr = UpsErrorDat[ia].iRet;
  160. break;
  161. }
  162. }
  163. char sErrAll[300];
  164. va_list arglist;
  165. va_start(arglist, sErr);
  166. _vsnprintf(sErrAll, 128, sErr, arglist);
  167. va_end(arglist);
  168. if (sErrInfo[0])
  169. {
  170. strcat(sErrAll, " ");
  171. strcat(sErrAll, sErrInfo);
  172. }
  173. sErrAll[200] = 0;
  174. iLenOne = strlen(sErrAll);
  175. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  176. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  177. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  178. if (iErr != Error_Succeed)
  179. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  180. else
  181. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  182. return (ErrorCodeEnum)iErr;
  183. }