UpsClassImpl_East.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include "UpsClassImpl_East.h"
  2. LOG_EXTERN()
  3. CSerialComm g_SerialComm;
  4. Dev_COMInfo UpsClassImpl::m_arrCOMInfo[]=
  5. {
  6. {1, "/dev/ttyUSB0" },
  7. {2, "/dev/ttyUSB1" },
  8. {3, "/dev/ttyUSB2" },
  9. {4, "/dev/ttyUSB3" },
  10. {5, "/dev/ttyUSB4" },
  11. {6, "/dev/ttyUSB5" },
  12. {7, "/dev/ttyUSB6" },
  13. {8, "/dev/ttyUSB7" },
  14. {9, "/dev/ttyAMA0" },
  15. {10, "/dev/ttyAMA1" },
  16. {11, "/dev/ttyAMA2" },
  17. {12, "/dev/ttyAMA3" },
  18. {13, "/dev/ttyXRUSB0"},
  19. {14, "/dev/ttyXRUSB1"},
  20. {15, "/dev/ttyXRUSB2"},
  21. {16, "/dev/ttyXRUSB3"},
  22. {17, "/dev/ttyXRUSB4"},
  23. {18, "/dev/ttyXRUSB5"}
  24. };
  25. int getFileVer(char* sFile, short &ch1, short &ch2)
  26. {
  27. ch1 = 0;
  28. ch2 = 0;
  29. char* pFind = strstr(sFile, ".so");
  30. char* pTemp = pFind;
  31. while(pTemp)
  32. {
  33. pFind = pTemp;
  34. pTemp = strstr(pFind + 3, ".so");
  35. }
  36. if(pFind == nullptr) return 0;
  37. pTemp = pFind - 1;
  38. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  39. if(*pTemp == '.')
  40. ch2 = atoi(pTemp + 1);
  41. pTemp--;
  42. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  43. if(*pTemp == '.')
  44. ch1 = atoi(pTemp + 1);
  45. return 1;
  46. }
  47. UpsClassImpl::UpsClassImpl() :
  48. m_bDevOpen(FALSE)
  49. {
  50. LOG_FUNCTION();
  51. m_hComLib = NULL; //Default value
  52. memset( m_cDeviceID, 0x00, sizeof (m_cDeviceID));
  53. memset( m_cDevType, 0x00, sizeof(m_cDevType) );
  54. memset( m_cFWMain, 0x00, sizeof(m_cFWMain) );
  55. memset( &m_stDevStatus, 0x00, sizeof (m_stDevStatus));
  56. SaveErrorInfo("OK", Error_Succeed);
  57. }
  58. UpsClassImpl::~UpsClassImpl()
  59. {
  60. LOG_FUNCTION();
  61. g_SerialComm.Disconnect(m_hDevHnd);
  62. return;
  63. }
  64. ErrorCodeEnum UpsClassImpl::GetDevStatus(UpsStatusEnum &eStatus)
  65. {
  66. LOG_FUNCTION();
  67. BYTE sCommand[] ={'Q', '1', 0x0D, 0x00};
  68. COMRESULT stComResult;
  69. memset(&stComResult, 0x00, sizeof (stComResult));
  70. int ret = 0;
  71. if (!m_bDevOpen)
  72. {
  73. if(DevOpen(m_nPort, m_nBaudRate) != Error_Succeed)
  74. {
  75. SaveErrorInfo("GetDevStatus() DevOpen() failed", Error_DevNotAvailable);
  76. g_SerialComm.Disconnect(m_hDevHnd); //Get status failed
  77. m_hDevHnd = NULL;
  78. m_bDevOpen = false;
  79. eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
  80. return Error_DevNotAvailable;
  81. }
  82. }
  83. else
  84. {
  85. if(g_SerialComm.SendAndReceive(m_hDevHnd, sCommand, strlen((char*)sCommand), 10, &stComResult) != 0)
  86. {
  87. SaveErrorInfo("GetDevStatus() SendAndReceive failed", Error_DevNotAvailable);
  88. g_SerialComm.Disconnect(m_hDevHnd); //Get status failed
  89. m_hDevHnd = NULL;
  90. m_bDevOpen = false;
  91. eStatus = UPS_STATUS_ERROR_TO_GET_STATUS;
  92. return Error_DevNotAvailable;
  93. }
  94. }
  95. LogXE( sCommand, strlen((char*)sCommand), "Snd");
  96. LogXE( stComResult.Buff, stComResult.Length , "Rcv");
  97. if(stComResult.Buff[38]=='0')
  98. {
  99. eStatus = UPS_STATUS_NORMAL;
  100. LogM("GetDevStatus() return eStatus:UPS_STATUS_NORMAL");
  101. }
  102. else
  103. {
  104. eStatus = UPS_STATUS_NO_ELECTOR;
  105. LogM("GetDevStatus() return eStatus:UPS_STATUS_NO_ELECTOR");
  106. }
  107. //todo: additional ups status-->m_stDevStatus
  108. return Error_Succeed;
  109. }
  110. ErrorCodeEnum UpsClassImpl::Shutdown(DWORD dwShutTime,DWORD dwRestartTime)
  111. {
  112. LOG_FUNCTION();
  113. BYTE dataBuf[100]={0};
  114. int nRet = 0;
  115. int nLen = 3;
  116. if( !m_bDevOpen )
  117. {
  118. SaveErrorInfo("Shutdown()->Dev is not open",Error_DevNotAvailable );
  119. return Error_DevNotAvailable;
  120. }
  121. dataBuf[0]=0x53;
  122. dataBuf[1]=0x30;
  123. if(dwShutTime <= 5)
  124. {
  125. dataBuf[2]=0x30+dwShutTime;
  126. }
  127. else
  128. {
  129. dataBuf[2]=0x39;
  130. }
  131. if(dwRestartTime == 0)
  132. {
  133. dataBuf[3]=0x0D;
  134. nLen = 4;
  135. }
  136. else
  137. {
  138. dataBuf[3]=0x52;
  139. sprintf((char*)dataBuf+4,"%04d",dwRestartTime);
  140. dataBuf[8]=0x0D;
  141. nLen = 9;
  142. }
  143. nRet = g_SerialComm.SendData(m_hDevHnd, dataBuf, nLen );
  144. if(nRet < 0)
  145. {
  146. SaveErrorInfo("GetDevStatus() DevOpen() failed", Error_DevNotAvailable);
  147. g_SerialComm.Disconnect(m_hDevHnd); //Get status failed
  148. m_hDevHnd = NULL;
  149. m_bDevOpen = false;
  150. return Error_DevNotAvailable;
  151. }
  152. return Error_Succeed;
  153. }
  154. ErrorCodeEnum UpsClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  155. {
  156. LOG_FUNCTION();
  157. CHAR szHardwareSN[16] = {0};
  158. CHAR szTemp[128] = {0};
  159. memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
  160. memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
  161. memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
  162. memset(&devCategory.version, 0, sizeof(devCategory.version));
  163. UpsStatusEnum eStatus;
  164. GetDevStatus(eStatus);
  165. if(m_bDevOpen)
  166. {
  167. devCategory.eState = DEVICE_STATUS_NORMAL;
  168. }
  169. else
  170. {
  171. devCategory.eState = DEVICE_STATUS_MAINTAINCE;
  172. }
  173. memcpy(devCategory.szType, "keba.UPS.EAST", strlen("keba.UPS.EAST"));
  174. memcpy(devCategory.szModel, "", strlen(""));
  175. memcpy(devCategory.szVendor, "keba", strlen("keba"));
  176. char sPath[256], sFile[128] = {0};
  177. GetCurModulePath(sPath, sFile);
  178. short v1,v2;
  179. getFileVer(sFile, v1, v2);
  180. devCategory.version.wMajor = v1;
  181. devCategory.version.wMinor = v2;
  182. devCategory.version.wRevision = 0xffff;
  183. devCategory.version.wBuild = FILE_VERSION;
  184. //devCategory.version.wRevision = 0xFFFF;
  185. //devCategory.version.wBuild = 1;
  186. //devCategory.version.wMajor = 0;
  187. //devCategory.version.wMinor = 0;
  188. return Error_Succeed;
  189. }
  190. ErrorCodeEnum UpsClassImpl::Reset()
  191. {
  192. LOG_FUNCTION();
  193. m_bDevOpen = false;
  194. DevClose();
  195. return DevOpen(m_nPort, m_nBaudRate);
  196. }
  197. ErrorCodeEnum UpsClassImpl::DevClose()
  198. {
  199. LOG_FUNCTION();
  200. if(!m_bDevOpen)
  201. {
  202. LogM("Device is not open yet!");
  203. }
  204. g_SerialComm.Disconnect(m_hDevHnd);
  205. LogM("DevClose() set com to close.")
  206. m_hDevHnd = NULL;
  207. m_bDevOpen = false;
  208. return Error_Succeed;
  209. }
  210. ErrorCodeEnum UpsClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  211. {
  212. LOG_FUNCTION();
  213. devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
  214. memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  215. memcpy(devErrInfo.szErrMsg, m_szErrMsg, devErrInfo.dwErrMsgLen<MAX_DEV_ERROR_MSG_LEN? devErrInfo.dwErrMsgLen:MAX_DEV_ERROR_MSG_LEN);
  216. return Error_Succeed;
  217. }
  218. ErrorCodeEnum UpsClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  219. {
  220. LOG_FUNCTION();
  221. char szErrorMsg[256] = {0};
  222. m_nPort = dwPort;
  223. m_nBaudRate = dwBaudRate;
  224. m_nPort = 14;
  225. char* lpPort = GetCOMPortString(m_nPort);
  226. if(nullptr == lpPort)
  227. {
  228. m_bDevOpen = false;
  229. sprintf(szErrorMsg, "Invalid COM name");
  230. SaveErrorInfo(szErrorMsg, Error_DevNotAvailable);
  231. return Error_DevNotAvailable;
  232. }
  233. memcpy(m_cDeviceID, lpPort, strlen(lpPort));
  234. int ret = g_SerialComm.Connect(m_cDeviceID, 2400, 2, 1, &m_hDevHnd, 8);
  235. if( ret == 0) //返回0, 串口打开成功
  236. {
  237. sprintf(szErrorMsg, "Open %s OK:%d COM:%s", lpPort, ret, m_cDeviceID);
  238. SaveErrorInfo(szErrorMsg, Error_Succeed);
  239. }
  240. else
  241. {
  242. m_bDevOpen = false;
  243. sprintf(szErrorMsg, "Open %s OK:%d COM:%s", lpPort, ret, m_cDeviceID);
  244. SaveErrorInfo(szErrorMsg, Error_DevNotAvailable);
  245. return Error_DevNotAvailable;
  246. }
  247. m_bDevOpen = true;
  248. UpsStatusEnum eStatus = UPS_STATUS_NORMAL;
  249. return GetDevStatus(eStatus);
  250. }
  251. void UpsClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode)
  252. {
  253. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  254. sprintf(m_szErrMsg, "%s[%d]", errMsg, errCode);
  255. LogM(m_szErrMsg);
  256. }
  257. char* UpsClassImpl::GetCOMPortString(DWORD dwCOM)
  258. {
  259. int iCount = sizeof(m_arrCOMInfo)/sizeof(Dev_COMInfo);
  260. for(int i = 0; i < iCount; i++)
  261. {
  262. if(dwCOM == m_arrCOMInfo[i].dwCOM)
  263. return m_arrCOMInfo[i].strCOM;
  264. }
  265. return nullptr;
  266. }