LogicClient.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #pragma once
  2. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  3. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LOGICCLIENT_EXPORTS
  4. // 符号编译的。在使用此 DLL 的
  5. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  6. // LOGICCLIENT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  7. // 符号视为是被导出的。
  8. #ifndef LOGICCLIENT_EXPORTS
  9. #ifdef _WIN64
  10. #ifdef _DEBUG
  11. #pragma comment(lib, "LogicClientX64D.lib")
  12. #else
  13. #pragma comment(lib, "LogicClientX64.lib")
  14. #endif
  15. #else
  16. #ifdef _DEBUG
  17. #pragma comment(lib, "LogicClientD.lib")
  18. #else
  19. #pragma comment(lib, "LogicClient.lib")
  20. #endif
  21. #endif
  22. #endif
  23. #ifdef LOGICCLIENT_EXPORTS
  24. #define LOGICCLIENT_API __declspec(dllexport)
  25. #else
  26. #define LOGICCLIENT_API __declspec(dllimport)
  27. #endif
  28. #include <string>
  29. #include <vector>
  30. #include <Rpc.h>
  31. #include "MsgQueue.h"
  32. #include "DiosFileHandle.h"
  33. #include "LogicDevice.h"
  34. using namespace std;
  35. class LOGICCLIENT_API LogicClient
  36. {
  37. HANDLE m_ClientLock;
  38. ACTION_SYNC_MODE m_SyncMode;
  39. DWORD m_OwnerThreadId;//线程安全:不能让多线程同时访问当前CLIENT
  40. MsgQueue<ResDataObject> *m_pPacketWaitQue;
  41. MsgQueue<ResDataObject> *m_pPacketReceivedQue;
  42. bool InitClient(const char *pPath, int flags);
  43. void ConnectCDI();
  44. void DisconnectCDI();//after close,Disconnect the Client from the system
  45. bool DeQueuePacket_Internal(ResDataObject &Packet);
  46. void ClearQueue_Internal();
  47. protected:
  48. bool m_ClosedFlag;
  49. LogicDeviceSysIF *m_pSysIF;
  50. DWORD m_ReqIdx;//for the Action_req&Action_Res
  51. string *m_pActionName;
  52. LogicDevice *pLogicDeivce;
  53. int m_FileFlags;
  54. string *m_pLastMsgInfo;
  55. string *m_pFilePath;
  56. ResDataObject m_DeviceResource;
  57. DiosDevFileHandle *m_pFileHandle;
  58. RET_STATUS ProcessClose(ResDataObject &packet);
  59. RET_STATUS ProcessOpenResponse(ResDataObject &packet);
  60. RET_STATUS ProcessResource(ResDataObject &packet);
  61. RET_STATUS ProcessActionResponse(ResDataObject &packet, ResDataObject &OutputParam);
  62. RET_STATUS UpdateDeviceResource(int cmdType, ResDataObject &packet);
  63. public:
  64. HANDLE m_ResponseEvent;
  65. HANDLE m_NotifyEvent;
  66. LogicClient(void);
  67. virtual ~LogicClient(void);
  68. //router
  69. DIOS_PACKET_ROUTE m_Router;
  70. bool SetRouter(DIOS_PACKET_ROUTE Route);
  71. //Open+Resource
  72. virtual int Open(const char *pPath, int flags, DWORD timeout = INFINITE);
  73. //Close
  74. virtual int Close();
  75. bool GetFilePath(ResDataObject &path);
  76. bool Lock(DWORD timeout = INFINITE);
  77. void UnLock();
  78. RET_STATUS UpdateDeviceResource(DWORD timeout = INFINITE);
  79. bool IsClosed();
  80. bool IsThreadSafe();//thread safe op
  81. const char *GetLastErrorInfo();
  82. bool IsAllReqFinished();
  83. bool SetRequestSyncMode(ACTION_SYNC_MODE Sync);
  84. ACTION_SYNC_MODE GetRequestSyncMode();
  85. //resource get
  86. RET_STATUS GetDeviceType(GUID PARAM_OUT &DevType);
  87. RET_STATUS GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource);
  88. RET_STATUS GetDeviceResource(const char* ResourceKey,ResDataObject PARAM_OUT *pDeviceResource);
  89. void PacketArrived(ResDataObject *pResponse);
  90. //Actions
  91. virtual int Action(const char *pActionName, ResDataObject &ReqParams, ResDataObject &ResParams, DWORD timeout = INFINITE);
  92. //同步Action的异步模式
  93. virtual int Action_Req(const char *pActionName, ResDataObject &ReqParams, DWORD timeout = INFINITE);
  94. virtual int Action_Res(const char *pActionName, ResDataObject &ResParams, DWORD timeout = INFINITE);
  95. HANDLE GetResponseHandle();
  96. bool GetFileHandle(DiosDevFileHandle &Handle);
  97. HANDLE GetNotifyHandle();
  98. void CleanupQueue();
  99. bool IsDataArrived();
  100. virtual PACKET_CMD ReadCmd(ResDataObject &CmdObject);
  101. RET_STATUS SYSTEM_CALL WaitForState(const char* state,DWORD timeout = INFINITE);
  102. };