libGPIOLoader.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. #include < stdio.h >
  4. #include "libGPIOLoader.h"
  5. typedef ErrorCodeEnum(*DevAdaptObjCreateFunc)(DeviceBaseClass*& baseObj);
  6. typedef ErrorCodeEnum(*DevAdaptObjReleaseFunc)(DeviceBaseClass*& pBaseObj);
  7. HINSTANCE hinstLib = NULL;
  8. DevAdaptObjCreateFunc pFuncCreateAdapt = NULL;
  9. DevAdaptObjReleaseFunc pFuncReleaseAdapt = NULL;
  10. GpioClass* pDevAdapterInstance = NULL;
  11. struct DevErrorInfo errInfoInstance;
  12. void SetLastErrInfo(const char* formatStr, ...)
  13. {
  14. va_list arg;
  15. va_start(arg, formatStr);
  16. sprintf_s(errInfoInstance.szErrMsg, MAX_DEV_ERROR_MSG_LEN, formatStr, arg);
  17. errInfoInstance.dwErrMsgLen = strlen(errInfoInstance.szErrMsg);
  18. va_end(arg);
  19. }
  20. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_LoadDevObject(const char* libraryPath)
  21. {
  22. ErrorCodeEnum erroCode;
  23. hinstLib = LoadLibraryA(libraryPath);
  24. if (hinstLib != NULL) {
  25. pFuncCreateAdapt = (DevAdaptObjCreateFunc)GetProcAddress(hinstLib, "CreateDevComponent");
  26. if (NULL == pFuncCreateAdapt) {
  27. FreeLibrary(hinstLib);
  28. pFuncCreateAdapt = NULL;
  29. pFuncReleaseAdapt = NULL;
  30. return Error_MisMatched;
  31. }
  32. pFuncReleaseAdapt = (DevAdaptObjReleaseFunc)GetProcAddress(hinstLib, "ReleaseDevComponent");
  33. if (NULL == pFuncCreateAdapt) {
  34. FreeLibrary(hinstLib);
  35. pFuncCreateAdapt = NULL;
  36. pFuncReleaseAdapt = NULL;
  37. return Error_NotIntegrated;
  38. }
  39. erroCode = pFuncCreateAdapt((DeviceBaseClass*&)pDevAdapterInstance);
  40. if (erroCode != Error_Succeed) {
  41. pDevAdapterInstance = NULL;
  42. FreeLibrary(hinstLib);
  43. pFuncCreateAdapt = NULL;
  44. pFuncReleaseAdapt = NULL;
  45. return Error_NoTarget;
  46. }
  47. if (pDevAdapterInstance == NULL) {
  48. FreeLibrary(hinstLib);
  49. pFuncCreateAdapt = NULL;
  50. pFuncReleaseAdapt = NULL;
  51. return Error_Null;
  52. }
  53. } else {
  54. SetLastErrInfo("load library failed %d", GetLastError());
  55. return Error_DevLoadFileFailed;
  56. }
  57. return Error_Succeed;
  58. }
  59. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ReleaseDevObject()
  60. {
  61. if (pFuncReleaseAdapt != NULL && pDevAdapterInstance != NULL) {
  62. DeviceBaseClass* devBasePtr = static_cast<DeviceBaseClass*>(pDevAdapterInstance);
  63. pFuncReleaseAdapt(devBasePtr);
  64. pDevAdapterInstance = NULL;
  65. }
  66. if (hinstLib != NULL) {
  67. FreeLibrary(hinstLib);
  68. hinstLib = NULL;
  69. }
  70. return Error_Succeed;
  71. }
  72. //////////////////////////////////////////////////////////////////////////
  73. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetDevCategory(DevCategoryInfo* pDevCategory)
  74. {
  75. ErrorCodeEnum result;
  76. if (pDevAdapterInstance == NULL) {
  77. return Error_NotInit;
  78. }
  79. DevCategoryInfo inner;
  80. memset(inner.szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  81. memset(inner.szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  82. memset(inner.szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  83. result = pDevAdapterInstance->GetDevCategory(inner);
  84. if (result == Error_Succeed) {
  85. memset(pDevCategory->szType, 0, sizeof(char) * MAX_DEV_TYPE_LEN);
  86. memset(pDevCategory->szModel, 0, sizeof(char) * MAX_DEV_MODEL_LEN);
  87. memset(pDevCategory->szVendor, 0, sizeof(char) * MAX_DEV_VENDOR_LEN);
  88. strncpy_s(pDevCategory->szType, MAX_DEV_TYPE_LEN, inner.szType, strlen(inner.szType) > MAX_DEV_TYPE_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szType));
  89. strncpy_s(pDevCategory->szModel, MAX_DEV_MODEL_LEN, inner.szModel, strlen(inner.szModel) > MAX_DEV_MODEL_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szModel));
  90. strncpy_s(pDevCategory->szVendor, MAX_DEV_VENDOR_LEN, inner.szVendor, strlen(inner.szVendor) > MAX_DEV_VENDOR_LEN - 1 ? MAX_DEV_TYPE_LEN - 1 : strlen(inner.szVendor));
  91. pDevCategory->eState = inner.eState;
  92. pDevCategory->version.wMajor = inner.version.wMajor;
  93. pDevCategory->version.wMinor = inner.version.wMinor;
  94. pDevCategory->version.wRevision = inner.version.wRevision;
  95. pDevCategory->version.wBuild = inner.version.wBuild;
  96. }
  97. return result;
  98. }
  99. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_Reset()
  100. {
  101. if (pDevAdapterInstance == NULL) {
  102. return Error_NotInit;
  103. }
  104. return pDevAdapterInstance->Reset();
  105. }
  106. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevClose()
  107. {
  108. if (pDevAdapterInstance == NULL) {
  109. return Error_NotInit;
  110. }
  111. return pDevAdapterInstance->DevClose();
  112. }
  113. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_GetLastErr(DevErrorInfo* pDevErrInfo)
  114. {
  115. if (pDevAdapterInstance == NULL) {
  116. strcpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, errInfoInstance.szErrMsg);
  117. pDevErrInfo->dwErrMsgLen = errInfoInstance.dwErrMsgLen;
  118. return Error_Succeed;
  119. }
  120. DevErrorInfo inner;
  121. ErrorCodeEnum result = pDevAdapterInstance->GetLastErr(inner);
  122. if (result == Error_Succeed) {
  123. memset(pDevErrInfo->szErrMsg, 0, sizeof(char) * MAX_DEV_ERROR_MSG_LEN);
  124. strncpy_s(pDevErrInfo->szErrMsg, MAX_DEV_ERROR_MSG_LEN, inner.szErrMsg, strlen(inner.szErrMsg) > MAX_DEV_ERROR_MSG_LEN - 1 ? MAX_DEV_ERROR_MSG_LEN - 1 : strlen(inner.szErrMsg));
  125. pDevErrInfo->dwErrMsgLen = inner.dwErrMsgLen;
  126. }
  127. return result;
  128. }
  129. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_DevOpen(Bridge_GpioInitParam initParam)
  130. {
  131. if (pDevAdapterInstance == NULL) {
  132. return Error_NotInit;
  133. }
  134. GpioInitParam inner;
  135. inner.dwPort = initParam.dwPort;
  136. inner.dwBaudRate = initParam.dwBaudRate;
  137. inner.dwPortNum = initParam.dwPortNum;
  138. for (int i = 0; i < MAX_PORT_NUM; ++i) {
  139. inner.dir[i] = !!initParam.dir[i];
  140. }
  141. return pDevAdapterInstance->DevOpen(inner);
  142. }
  143. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_WritePort(DWORD dwPort, BYTE btData)
  144. {
  145. if (pDevAdapterInstance == NULL) {
  146. return Error_NotInit;
  147. }
  148. return pDevAdapterInstance->WritePort(dwPort, btData);
  149. }
  150. LIBSUBDEVICELOADER_API ErrorCodeEnum Bridge_ReadPort(DWORD dwPort, BYTE* btStatus)
  151. {
  152. if (pDevAdapterInstance == NULL) {
  153. return Error_NotInit;
  154. }
  155. BYTE inner = *btStatus;
  156. ErrorCodeEnum result = pDevAdapterInstance->ReadPort(dwPort, inner);
  157. *btStatus = inner;
  158. return result;
  159. }
  160. //////////////////////////////////////////////////////////////////////////