DevFSMCommBase.hpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. #ifndef _COMM_DEVICE_FSM_BASE_HPP_
  2. #define _COMM_DEVICE_FSM_BASE_HPP_
  3. #include "DevEntityCommBase.hpp"
  4. #include "SpFSM.h"
  5. #include "DevErrorCode.h"
  6. #include "DeviceBaseClass.h"
  7. #if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
  8. using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pOutDevAptObj);
  9. using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DWORD dwDevClassID, DeviceBaseClass * &pInDevAptObj);
  10. #else
  11. using DevAdaptObjCreateFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pOutDevAptObj);
  12. using DevAdaptObjReleaseFunc = ErrorCodeEnum(*)(DeviceBaseClass * &pInDevAptObj);
  13. #endif
  14. /*
  15. assert(DeviceBaseHelper::GetCurVendorType("") == Vendor_Invalide);
  16. assert(DeviceBaseHelper::GetCurVendorType("buzhidao") == Vendor_Invalide);
  17. assert(DeviceBaseHelper::GetCurVendorType("hyosung") == Vendor_Hyosung);
  18. assert(DeviceBaseHelper::GetCurVendorType("KXD") == Vendor_Kxd);
  19. assert(DeviceBaseHelper::GetCurVendorType("KEBa") == Vendor_Keba);
  20. assert(DeviceBaseHelper::GetCurVendorType("nanTiAn") == Vendor_Nantian);
  21. assert(DeviceBaseHelper::GetCurVendorType("YOTAP") == Vendor_yotap);
  22. assert(DeviceBaseHelper::GetCurVendorType("zSs") == Vendor_ZSS);
  23. assert(DeviceBaseHelper::GetCurVendorType("GWI") == Vendor_GreateWall);
  24. assert(DeviceBaseHelper::GetCurVendorType("yihua") == Vendor_YiHua);
  25. assert(DeviceBaseHelper::GetCurVendorType("yh") == Vendor_YiHua);
  26. assert(DeviceBaseHelper::GetCurVendorType("GRG") == Vendor_GRG);
  27. assert(DeviceBaseHelper::GetCurVendorType("cw") == Vendor_CW);
  28. assert(DeviceBaseHelper::GetCurVendorType("eastCOM") == Vendor_EastCom);
  29. assert(DeviceBaseHelper::GetCurVendorType("hx") == Vendor_HuaXin);
  30. assert(DeviceBaseHelper::GetCurVendorType("sankyo") == Vendor_Sankyo);
  31. assert(DeviceBaseHelper::GetCurVendorType("chinavision") == Vendor_ChinaVision);
  32. */
  33. enum VendorNameType {
  34. Vendor_Invalide,
  35. Vendor_Sankyo,
  36. Vendor_ChinaVision,
  37. Vendor_Hyosung,
  38. Vendor_Kxd,
  39. Vendor_Keba,
  40. Vendor_Nantian,
  41. Vendor_yotap,
  42. Vendor_ZSS,
  43. Vendor_GreateWall,
  44. Vendor_YiHua,
  45. Vendor_GRG,
  46. Vendor_CW,
  47. Vendor_EastCom,
  48. Vendor_HuaXin,
  49. Vendor_MAX
  50. };
  51. static const char* VendorNameStr[] = {
  52. "Unknown",
  53. "Sankyo",
  54. "ChinaVision",
  55. "hyosung",
  56. "kxd",
  57. "keba",
  58. "nantian",
  59. "yotap",
  60. "zss",
  61. "gwi",
  62. "yh", // "yihua"
  63. "grg",
  64. "CW",
  65. "EastCom",
  66. "hx"
  67. };
  68. inline static VendorNameType GetCurVendorType(LPCTSTR vendorName)
  69. {
  70. if (vendorName == NULL || strlen(vendorName) == 0) {
  71. return Vendor_Invalide;
  72. }
  73. int idx = -1;
  74. for (int i = 0; i < sizeof(VendorNameStr) / sizeof(VendorNameStr[0]); ++i) {
  75. if (strnicmp(vendorName, VendorNameStr[i], strlen(VendorNameStr[i])) == 0) {
  76. idx = i;
  77. break;
  78. }
  79. }
  80. if (idx == -1) {
  81. /*历史遗留原因,怡化厂商有两个适配器名字*/
  82. if (strnicmp(vendorName, "yihua", strlen("yihua")) == 0) {
  83. idx = Vendor_YiHua;
  84. }
  85. else {
  86. idx = Vendor_Invalide;
  87. }
  88. }
  89. return (VendorNameType)idx;
  90. }
  91. template <typename TSubAdpt>
  92. struct DevAdptLibHelper
  93. {
  94. ErrorCodeEnum LoadLibAddress(const CSimpleStringA& strFullLibPath)
  95. {
  96. ErrorCodeEnum erroCode = Error_Succeed;
  97. do {
  98. int res = toolkit_dlopen(strFullLibPath, &m_lib);
  99. if (res != 0) {
  100. Dbg("toolkit_dlopen[%s] failed with error %s.", strFullLibPath.GetData(), toolkit_dlerror(&m_lib));
  101. erroCode = Error_DevLoadFileFailed;
  102. break;
  103. }
  104. if ((res = toolkit_dlsym(&m_lib, "CreateDevComponent", (void**)&pFuncCreateAdapt)) != 0) {
  105. Dbg("Get 'CreateDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
  106. erroCode = Error_DevLoadFileFailed;
  107. break;
  108. }
  109. if ((res = toolkit_dlsym(&m_lib, "ReleaseDevComponent", (void**)&pFuncReleaseAdapt)) != 0) {
  110. Dbg("Get 'ReleaseDevComponent' Func address failed with error: %s", toolkit_dlerror(&m_lib));
  111. erroCode = Error_DevLoadFileFailed;
  112. break;
  113. }
  114. } while (false);
  115. if (IS_FAILURED(erroCode)) {
  116. TearDown();
  117. }
  118. return erroCode;
  119. }
  120. ErrorCodeEnum CreateDevAdptObject()
  121. {
  122. if (m_AdptObjPtr != nullptr) {
  123. return Error_AlreadyExist;
  124. }
  125. if (pFuncCreateAdapt == nullptr || pFuncReleaseAdapt == nullptr) {
  126. return Error_NotInit;
  127. }
  128. ErrorCodeEnum erroCode = Error_Succeed;
  129. erroCode = pFuncCreateAdapt((DeviceBaseClass*&)m_AdptObjPtr);
  130. if (IS_FAILURED(erroCode)) {
  131. Dbg("Create device adapter object failed! EC=%s", SpStrError(erroCode));
  132. return erroCode;
  133. }
  134. LOG_ASSERT(m_AdptObjPtr != nullptr);
  135. return Error_Succeed;
  136. }
  137. /** Integrate function LoadLibAddress and CreateDevAdptObject*/
  138. ErrorCodeEnum LoadUp(const CSimpleStringA& strFullLibPath)
  139. {
  140. ErrorCodeEnum erroCode = LoadLibAddress(strFullLibPath);
  141. if (IS_SUCCEED(erroCode)) {
  142. erroCode = CreateDevAdptObject();
  143. }
  144. return erroCode;
  145. }
  146. void TearDown()
  147. {
  148. if (m_AdptObjPtr != nullptr) {
  149. m_AdptObjPtr->DevClose();
  150. if (nullptr != pFuncReleaseAdapt) {
  151. DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(m_AdptObjPtr);
  152. #if DEVICE_BASE_INTERFACE_FILE_VERSION == 2
  153. pFuncReleaseAdapt(0, devBasePtr);
  154. #else
  155. pFuncReleaseAdapt(devBasePtr);
  156. #endif
  157. m_AdptObjPtr = nullptr;
  158. }
  159. }
  160. toolkit_dlclose(&m_lib);
  161. pFuncReleaseAdapt = pFuncCreateAdapt = nullptr;
  162. }
  163. explicit operator bool() const { return (m_AdptObjPtr != nullptr); }
  164. operator DeviceBaseClass* () { return m_AdptObjPtr; }
  165. TSubAdpt* GetDevPointer() { return m_AdptObjPtr; }
  166. TSubAdpt* operator->() { return m_AdptObjPtr; }
  167. DevAdptLibHelper()
  168. : pFuncCreateAdapt(nullptr), pFuncReleaseAdapt(nullptr)
  169. , m_AdptObjPtr(nullptr)
  170. {
  171. }
  172. ~DevAdptLibHelper()
  173. {
  174. TearDown();
  175. }
  176. private:
  177. toolkit_lib_t m_lib;
  178. DevAdaptObjCreateFunc pFuncCreateAdapt;
  179. DevAdaptObjReleaseFunc pFuncReleaseAdapt;
  180. TSubAdpt* m_AdptObjPtr;
  181. };
  182. struct DevEntityErrorCode {
  183. DWORD dwEntityId;
  184. DWORD dwVendorId;
  185. DWORD dwVendorErroCode;
  186. DWORD dwReserved;
  187. DevEntityErrorCode() :dwEntityId(0), dwVendorId(0), dwVendorErroCode(0), dwReserved(0) {}
  188. void ResetWithEntityID(WORD wEntityID)
  189. {
  190. dwEntityId = dwVendorId = dwVendorErroCode = dwReserved = 0;
  191. dwEntityId = wEntityID;
  192. }
  193. void SetDevCode(DWORD devErrorCode, DWORD dwReservedCode)
  194. {
  195. dwVendorErroCode = devErrorCode;
  196. dwReserved = dwReservedCode;
  197. }
  198. void SetVendorID(DWORD dwVendorID)
  199. {
  200. dwVendorId = dwVendorID;
  201. }
  202. DWORD GetCompleteErrorCode() const {
  203. return MAKE_SLV_ERRORCODE(dwEntityId, dwVendorId, dwVendorErroCode);
  204. }
  205. DWORD GetCompleteErrorCode2Business() const {
  206. return MAKE_SLV_ERRORCODE_TO_BUSINESS(dwEntityId, dwVendorErroCode, dwReserved);
  207. }
  208. };
  209. template<class TFSM, class TDevClass>
  210. class CCommDevFSM : public FSMImpl<TFSM>
  211. {
  212. public:
  213. ErrorCodeEnum GetAndSplitDevErrInfo(CSimpleStringA& csErrMsg,
  214. WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay = "");
  215. ErrorCodeEnum LogDevErrInfo(LPCTSTR lpszFuncName = "")
  216. {
  217. CSimpleStringA csMsg;
  218. WORD wdErrorCode = 0;
  219. return GetAndSplitDevErrInfo(csMsg, wdErrorCode, lpszFuncName);
  220. }
  221. bool GetDevErrorCode(WORD& wdErrorCode)
  222. {
  223. CSimpleStringA csMsg;
  224. ErrorCodeEnum eRet = GetAndSplitDevErrInfo(csMsg, wdErrorCode);
  225. return (eRet == Error_Succeed);
  226. }
  227. protected:
  228. DevAdptLibHelper<TDevClass> m_hDevHelper;
  229. DevEntityErrorCode m_entCode;
  230. CSimpleStringA m_csAlarmMsg = "No more information";
  231. void UpdateEntityID()
  232. {
  233. CEntityStaticInfo esi = { 0 };
  234. ErrorCodeEnum ec = this->GetEntityBase()->GetFunction()->GetEntityStaticInfo(
  235. this->GetEntityBase()->GetEntityName(), esi);
  236. if (ec == Error_Succeed) {
  237. Dbg("wEntityDevelopID: 0x%X", esi.wEntityDevelopID);
  238. m_entCode.ResetWithEntityID(esi.wEntityDevelopID);
  239. }
  240. }
  241. DWORD UpdateDEC(DWORD dwVal = 0)
  242. {
  243. if (m_entCode.dwEntityId == 0) {
  244. UpdateEntityID();
  245. }
  246. int reserved = 0;
  247. reserved = (dwVal & 0xFC000) >> 14;
  248. m_entCode.SetDevCode(dwVal, reserved);
  249. return GetDEC();
  250. }
  251. DWORD GetDEC() const
  252. {
  253. return m_entCode.GetCompleteErrorCode();
  254. }
  255. //DWORD AlarmDEC() const {
  256. // return GetDEC();
  257. //}
  258. DWORD AlarmDECToBusiness(DWORD dwVal = 0) {
  259. if (dwVal > 0)
  260. UpdateDEC(dwVal);
  261. //oilyang@20200528 according the meeting result,throw a LogError while answering ctx
  262. //oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
  263. DWORD dwCode = 0;
  264. if ((m_entCode.dwVendorErroCode >> 20) == m_entCode.dwEntityId)
  265. dwCode = m_entCode.dwVendorErroCode;
  266. else
  267. dwCode = m_entCode.GetCompleteErrorCode2Business();
  268. LogError(Severity_Middle, Error_Unexpect, dwCode, "TODO:");
  269. return dwCode;
  270. }
  271. void ClearRelatedDEC()
  272. {
  273. UpdateDEC();
  274. m_csAlarmMsg = "No more information";
  275. }
  276. void LogErrMsg(const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode = 0, BOOL bAlarm = FALSE);
  277. };
  278. template<class TFSM, class TDevClass>
  279. inline ErrorCodeEnum CCommDevFSM<TFSM, TDevClass>::GetAndSplitDevErrInfo(
  280. CSimpleStringA& csErrMsg, WORD& wdDevErrCode, LPCTSTR lpszFuncNameForDisplay)
  281. {
  282. csErrMsg = "";
  283. wdDevErrCode = 0;
  284. BOOL bDisplayFunName = TRUE;
  285. if (lpszFuncNameForDisplay == NULL || strlen(lpszFuncNameForDisplay) == 0)
  286. bDisplayFunName = FALSE;
  287. if (!m_hDevHelper) {
  288. Dbg("inst occurs nullptr !!!");
  289. return Error_Param;
  290. }
  291. DevErrorInfo devErrInfo;
  292. ZeroMemory(&devErrInfo, sizeof(DevErrorInfo));
  293. ErrorCodeEnum erroCode = m_hDevHelper->GetLastErr(devErrInfo);
  294. if (erroCode == Error_Succeed) {
  295. if (strlen(devErrInfo.szErrMsg) > 0) {
  296. csErrMsg = devErrInfo.szErrMsg;
  297. }
  298. if (devErrInfo.dwErrMsgLen > MAX_DEV_ERROR_MSG_LEN) {
  299. //oiltmp@20200520 comment the following line
  300. //wdDevErrCode = (WORD)((devErrInfo.dwErrMsgLen >> 16) & 0x0000FFFF);
  301. }
  302. if (bDisplayFunName) {
  303. Dbg("Invoke <%s> failed, Dev_GLE: DevErrCode[%d], ErrMsg[%s]",
  304. lpszFuncNameForDisplay, wdDevErrCode, (LPCTSTR)csErrMsg);
  305. }
  306. else {
  307. Dbg("Dev_GLE: DevErrCode[%d], ErrMsg[%s]", wdDevErrCode, (LPCTSTR)csErrMsg);
  308. }
  309. }
  310. else {
  311. if (bDisplayFunName) {
  312. Dbg("Invoke <%s> failed, and unfortunately Dev_GLE failed returned EC: %d(0x%X)",
  313. lpszFuncNameForDisplay, erroCode, erroCode);
  314. csErrMsg = CSimpleStringA::Format("Invoke <%s> failed", lpszFuncNameForDisplay);
  315. }
  316. else {
  317. Dbg("Dev_GLE failed returned EC: %d(0x%X)",
  318. erroCode, erroCode);
  319. }
  320. }
  321. return erroCode;
  322. }
  323. template<class TFSM, class TDevClass>
  324. inline void CCommDevFSM<TFSM, TDevClass>::LogErrMsg(
  325. const char* pMsgHead, ErrorCodeEnum eErrCode, DWORD defaultDevCode, BOOL bAlarm)
  326. {
  327. Dbg("%s failed, EC = %s(0x%x)", pMsgHead, SpStrError(eErrCode), eErrCode);
  328. WORD wdErrCode = 0;
  329. CSimpleStringA csErrMsg(true);
  330. ErrorCodeEnum ec = GetAndSplitDevErrInfo(csErrMsg, wdErrCode);
  331. if (ec == Error_Succeed && wdErrCode != 0) {
  332. //oilyang@20200525 if have been set ErrorCode of entity defined (not device),use it directly
  333. if ((defaultDevCode >> 20) == m_entCode.dwEntityId)
  334. UpdateDEC(defaultDevCode);
  335. else
  336. UpdateDEC(wdErrCode);
  337. }
  338. else if (defaultDevCode != 0) {
  339. UpdateDEC(defaultDevCode);
  340. }
  341. m_csAlarmMsg = CSimpleStringA::Format("%s failed EC= %s : %s",
  342. pMsgHead, SpStrError(eErrCode), (LPCTSTR)csErrMsg);
  343. if (bAlarm) {
  344. LogWarn(Severity_High, eErrCode, AlarmDECToBusiness(), (LPCTSTR)m_csAlarmMsg);
  345. }
  346. return;
  347. }
  348. #define HARDWARE_ENTITY_RESET_ENTITYID(ent, entityID) \
  349. do{\
  350. memset(&ent, 0, sizeof(ent)); \
  351. ent.dwEntityId = entityID; \
  352. } while (false)
  353. #define HARDWARE_ENTITY_SET_DEVCODE(ent, ec, reserved) \
  354. do {\
  355. ent.dwVendorErroCode = ec; \
  356. ent.dwReserved = reserved; \
  357. } while (false)
  358. // 先不上厂商标识 [5/14/2020 7:34 @Gifur]
  359. #define HARDWARE_ENTITY_SET_VENDOR_NAME(ent, str) \
  360. ent.dwVendorId = 0/*(DWORD)DeviceBaseHelper::GetCurVendorType(str)*/
  361. #define HARDWARE_ENTITY_MAKE_ERRORCODE(ec) \
  362. MAKE_SLV_ERRORCODE(ec.dwEntityId, (ec.dwVendorId), ec.dwVendorErroCode)
  363. #define HARDWARE_ENTITY_MAKE_ERRORCODE_TO_BUSINESS(ec) \
  364. MAKE_SLV_ERRORCODE_TO_BUSINESS(ec.dwEntityId, ec.dwVendorErroCode, ec.dwReserved)
  365. /*class object must have 'LogErrMsg' function.*/
  366. #define LOG_ERROR_MSG_MACRO(errCode, MethodSig, DeviceType)\
  367. do {\
  368. if(errCode != Error_Succeed) {\
  369. LogErrMsg(CSimpleStringA::Format("%s::%s at line:%d", __FUNCTION__, #MethodSig, __LINE__), \
  370. errCode, MEC_DEVAPI_##DeviceType##_(MethodSig), TRUE);\
  371. }\
  372. } while (false)
  373. #define LOG_CARDISSUER_ERROR_MSG_MACRO(errCode, MethodSig)\
  374. LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDISSUER)
  375. #define LOG_CARDSWIPER_ERROR_MSG_MACRO(errCode, MethodSig)\
  376. LOG_ERROR_MSG_MACRO(errCode, MethodSig, CARDSWIPER)
  377. #define LOG_THERMALPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
  378. LOG_ERROR_MSG_MACRO(errCode, MethodSig, THERMALPRINT)
  379. #define LOG_DEVCONTROL_ERROR_MSG_MACRO(errCode, MethodSig)\
  380. LOG_ERROR_MSG_MACRO(errCode, MethodSig, DEVCONTROL)
  381. #define LOG_PRINTSEAL_ERROR_MSG_MACRO(errCode, MethodSig)\
  382. LOG_ERROR_MSG_MACRO(errCode, MethodSig, PRINTSEAL)
  383. #define LOG_FINGERPRINT_ERROR_MSG_MACRO(errCode, MethodSig)\
  384. LOG_ERROR_MSG_MACRO(errCode, MethodSig, FINGERPRINT)
  385. #define LOG_HSPSCANNER_ERROR_MSG_MACRO(errCode, MethodSig)\
  386. LOG_ERROR_MSG_MACRO(errCode, MethodSig, HSPSCANNER)
  387. #define LOG_UPS_ERROR_MSG_MACRO(errCode, MethodSig)\
  388. LOG_ERROR_MSG_MACRO(errCode, MethodSig, UPS)
  389. #define LOG_GPIO_ERROR_MSG_MACRO(errCode, MethodSig)\
  390. LOG_ERROR_MSG_MACRO(errCode, MethodSig, GPIO)
  391. #define LOG_IDCER_ERROR_MSG_MACRO(errCode, MethodSig)\
  392. LOG_ERROR_MSG_MACRO(errCode, MethodSig, IDCER)
  393. #define LOG_RF_ERROR_MSG_MACRO(errCode, MethodSig)\
  394. LOG_ERROR_MSG_MACRO(errCode, MethodSig, RF)
  395. #define LOG_PINPAD_ERROR_MSG_MACRO(errCode, MethodSig)\
  396. LOG_ERROR_MSG_MACRO(errCode, MethodSig, EPP)
  397. #endif /*_COMM_DEVICE_FSM_BASE_HPP_*/