UpsClassImpl_East.cpp 8.2 KB

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