upsimpl.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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. if (iRet == 0)
  97. {
  98. char sVOut[128];
  99. sprintf(sVOut, "GetDevStatus GetVoltage UPS供电 %s 电压 %d 电量 %d%%",
  100. bUps ? "是" : "否", i1, i2);
  101. LOG4VTM(INFO, sVOut);
  102. }
  103. return GetErrorInfo(iRet, "GetDevStatus");
  104. }
  105. ErrorCodeEnum UpsClassImpl::Reset()
  106. {
  107. LOG4VTM_FUNCTION();
  108. if (!m_pDevice->IsOpen())
  109. return GetErrorInfo(UPS_NOT_OPEN, "Reset");
  110. int iRet = m_pDevice->ShutDown(0xffff);
  111. return GetErrorInfo(iRet, "Reset");;
  112. }
  113. ErrorCodeEnum UpsClassImpl::DevClose()
  114. {
  115. LOG4VTM_FUNCTION();
  116. m_pDevice->Close();
  117. return Error_Succeed;
  118. }
  119. // Shutdown ups and restart it in minutes.
  120. // Arguments:
  121. // - dwShutTime:time to shutdown (in minutes)
  122. // - dwRestartTime:time to restart (in minutes)
  123. //
  124. ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime, DWORD dwRestartTime)
  125. {
  126. LOG4VTM_FUNCTION();
  127. if (!m_pDevice->IsOpen())
  128. return GetErrorInfo(UPS_NOT_OPEN, "Shutdown");
  129. if (dwShutTime < 1)
  130. {
  131. dwShutTime = 1;
  132. }
  133. int iRet = m_pDevice->ShutDown(dwShutTime);
  134. if (iRet != 0)
  135. return GetErrorInfo(iRet, "Shutdown");
  136. iRet = m_pDevice->ReStart(dwShutTime + dwRestartTime);
  137. return GetErrorInfo(iRet, "Shutdown ReStart");
  138. }
  139. ErrorCodeEnum UpsClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  140. {
  141. memcpy(&devErrInfo, &m_DevErrInfo, sizeof(DevErrorInfo));
  142. return Error_Succeed;
  143. }
  144. // DEC_SUCCESS DEC_HARDWARE DEC_TIMEOUT DEC_INVALID_PARAMETER DEC_INVALID_MASTER_KEY
  145. const static CmbErrorDef UpsErrorDat[] = {
  146. {0, "成功", Error_Succeed, DEC_SUCCESS},
  147. {UPS_NOT_OPEN, "设备没有打开", Error_Hardware, DEC_DEV_NOT_OPENED},
  148. {UPS_HARDWARE_ERROR, "设备硬件故障", Error_Hardware, DEC_HARDWARE},
  149. {UPS_TIMEOUT, "设备响应超时", Error_DevCommFailed, DEC_TIMEOUT},
  150. {UPS_PARA_ERR, "传入参数错误", Error_Param, DEC_INVALID_PARAMETER},
  151. };
  152. ErrorCodeEnum UpsClassImpl::GetErrorInfo(int iCode, char* sErr, ...)
  153. {
  154. size_t iLenOne = sizeof(CmbErrorDef);
  155. size_t iLenAll = sizeof(UpsErrorDat);
  156. int iCount = iLenAll / iLenOne;
  157. char sErrInfo[256]="";
  158. DWORD dSta = 0;
  159. int iErr = -1;
  160. for (int ia = 0; ia < iCount; ia++)
  161. {
  162. if (UpsErrorDat[ia].iCode == iCode)
  163. {
  164. dSta = UpsErrorDat[ia].iInf;
  165. strcpy(sErrInfo, UpsErrorDat[ia].sInf);
  166. iErr = UpsErrorDat[ia].iRet;
  167. break;
  168. }
  169. }
  170. char sErrAll[300];
  171. va_list arglist;
  172. va_start(arglist, sErr);
  173. _vsnprintf(sErrAll, 128, sErr, arglist);
  174. va_end(arglist);
  175. if (sErrInfo[0])
  176. {
  177. strcat(sErrAll, " ");
  178. strcat(sErrAll, sErrInfo);
  179. }
  180. sErrAll[200] = 0;
  181. iLenOne = strlen(sErrAll);
  182. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", iErr, sErrAll);
  183. // strcpy(m_DevErrInfo.szErrMsg, sErrAll);
  184. m_DevErrInfo.dwErrMsgLen = ((dSta << 16) & 0xffff0000) + iLenOne;
  185. if (iErr != Error_Succeed)
  186. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  187. else
  188. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  189. return (ErrorCodeEnum)iErr;
  190. }