LogicClient.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #pragma once
  2. #define LOGICCLIENT_API
  3. #include <string>
  4. #include <vector>
  5. #include <iostream>
  6. #include <chrono>
  7. #include <functional>
  8. #include <mutex>
  9. #include <condition_variable>
  10. #include <atomic>
  11. #include <cstdint>
  12. #include <unistd.h>
  13. #include <sys/syscall.h>
  14. #include <pthread.h>
  15. #include <uuid/uuid.h>
  16. #include "MsgQueue.h"
  17. #include "CcosFileHandle.h"
  18. #include "LogicDevice.h"
  19. #include "CcosThread.h"
  20. using namespace std;
  21. const int CLIENT_TIMOUT = 10000;
  22. class LOGICCLIENT_API LogicClient : public Thread_Base
  23. {
  24. void* m_ClientLock;
  25. ACTION_SYNC_MODE m_SyncMode;
  26. pthread_t m_OwnerThreadId;
  27. MsgQueue<ResDataObject>* m_pPacketWaitQue;
  28. MsgQueue<ResDataObject>* m_pPacketReceivedQue;
  29. MsgQueue<ResDataObject>* m_pPacketNotifyQue;
  30. bool InitClient(const char* pPath, int flags);
  31. bool DeQueuePacket_Internal(ResDataObject& Packet);
  32. void ClearQueue_Internal();
  33. protected:
  34. virtual bool OnStartThread() override;
  35. virtual bool OnEndThread() override;
  36. virtual bool Exec(void) override;
  37. volatile bool m_ClosedFlag;
  38. std::shared_ptr<LinuxEvent> m_hDeviceCloseOK;
  39. std::shared_ptr<LinuxEvent> m_hDeviceOpenOK;
  40. std::shared_ptr<LinuxEvent> m_hReOpen;
  41. string m_strDevicePath;
  42. ccos_mqtt_connection* m_pMqttConn;
  43. ccos_mqtt_callback m_pPacketArrivedCallbackFunc;
  44. string m_strCurTransaction;
  45. unsigned long m_ReqIdx;
  46. string* m_pActionName;
  47. LogicDevice* pLogicDeivce;
  48. int m_FileFlags;
  49. string* m_pLastMsgInfo;
  50. string* m_pFilePath;
  51. string m_strClientName;
  52. string m_strDefaultTopic;
  53. bool m_bNeedNotify;
  54. string m_strWS;
  55. ResDataObject m_DeviceResource;
  56. CcosDevFileHandle* m_pFileHandle;
  57. CcosDevFileHandle* m_pEbusHandle;
  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. std::shared_ptr<LinuxEvent> m_ResponseEvent;
  65. std::shared_ptr<LinuxEvent> m_NotifyEvent;
  66. LogicClient(string szClientName, string szTransaction, string szType = "", bool bNeedNotify = true);
  67. virtual ~LogicClient(void);
  68. string GetDefaultTopic() { return m_strDefaultTopic; }
  69. string GetWS() { return m_strWS; }
  70. CCOS_PACKET_ROUTE m_Router;
  71. bool SetRouter(CCOS_PACKET_ROUTE Route);
  72. using logic_client_open_callback = std::function<void(LogicClient*, const char*, int)>;
  73. virtual int Open(const char* pPath, int flags, const char* pszWS = "", DWORD timeout = 9000, logic_client_open_callback = nullptr);
  74. int ReOpenDevice();
  75. virtual int Close();
  76. RET_STATUS CloseDevice();
  77. RET_STATUS OpenDevice(bool bAsync = false);
  78. bool GetFilePath(ResDataObject& path);
  79. bool HasAction(const char* pszAction);
  80. bool HasProperty(const char* pszProperty);
  81. bool GetProperty(const char* pszProperty, ResDataObject& resRet);
  82. bool Lock(DWORD timeout = 6000);
  83. void UnLock();
  84. RET_STATUS UpdateDeviceResource(DWORD timeout = 7000);
  85. bool IsClosed();
  86. std::shared_ptr<LinuxEvent> GetOpenOKHandle() {
  87. return m_hDeviceOpenOK;
  88. }
  89. bool IsThreadSafe();
  90. const char* GetLastErrorInfo();
  91. bool IsAllReqFinished();
  92. bool SetRequestSyncMode(ACTION_SYNC_MODE Sync);
  93. ACTION_SYNC_MODE GetRequestSyncMode();
  94. RET_STATUS GetDeviceType(GUID &DevType);
  95. RET_STATUS GetDeviceResource(ResDataObject* pDeviceResource);
  96. void PacketArrived(ResDataObject* pResponse);
  97. void SetPacketArrivedCallback(ccos_mqtt_callback func) { m_pPacketArrivedCallbackFunc = func; }
  98. void SetCurrentTransaction(string strTransaction) { m_strCurTransaction = strTransaction; }
  99. void SubScribeTopic(const char* pszTopic, bool bSubscribe = true);
  100. virtual int Action(const char* pActionName, ResDataObject& ReqParams, ResDataObject& ResParams, DWORD timeout = 11000, const char* pszDevicePath = nullptr);
  101. virtual int Action_Req(const char* pActionName, ResDataObject& ReqParams, DWORD timeout = 11010, const char* pszDevicePath = nullptr);
  102. virtual int Action_Res(const char* pActionName, ResDataObject& ResParams, DWORD timeout = 11020);
  103. virtual int Action_Trans(ResDataObject* pOrgReq, DWORD timeout = 11030);
  104. std::shared_ptr<LinuxEvent> GetResponseHandle();
  105. bool GetFileHandle(CcosDevFileHandle& Handle);
  106. std::shared_ptr<LinuxEvent> GetNotifyHandle();
  107. void CleanupQueue();
  108. bool IsDataArrived();
  109. virtual PACKET_CMD ReadCmd(ResDataObject& CmdObject);
  110. PACKET_CMD ReadNotify(ResDataObject& CmdObject);
  111. RET_STATUS SYSTEM_CALL WaitForState(const char* state, DWORD timeout = 11100);
  112. void SetEbusFileHandle(CcosDevFileHandle* pHandle) { m_pEbusHandle = pHandle; }
  113. CcosDevFileHandle* GetEbusFileHanle(void) { return m_pEbusHandle; }
  114. string GetClientName() { return m_strClientName; };
  115. protected:
  116. logic_client_open_callback m_openCallbackFunc;
  117. };