SCF.Detail.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #pragma once
  2. #ifndef SCF_EXPORTS
  3. #ifdef _WIN64
  4. #ifdef _DEBUG
  5. #pragma comment (lib, "DIOS.Dev.SCFX64D.lib")
  6. #else
  7. #pragma comment (lib, "DIOS.Dev.SCFX64.lib")
  8. #endif
  9. #else
  10. #ifdef _DEBUG
  11. #pragma comment (lib, "DIOS.Dev.SCFD.lib")
  12. #else
  13. #pragma comment (lib, "DIOS.Dev.SCF.lib")
  14. #endif
  15. #endif
  16. #endif
  17. #ifdef SCF_EXPORTS
  18. #define SCF_API __declspec (dllexport)
  19. #define SCF_C_API extern "C" __declspec (dllexport)
  20. #else
  21. #define SCF_API __declspec (dllimport)
  22. #define SCF_C_API extern "C" __declspec (dllimport)
  23. #endif
  24. #include <string>
  25. #include <memory>
  26. #include <functional>
  27. #include "SyncEvent.hpp"
  28. #include "ResDataObject.h"
  29. #include "DiosLock.h"
  30. #include "DiosDevThread.h"
  31. #include "SCF.Define.hpp"
  32. #pragma warning (disable:4251) // m_pPacketParser”: class“std::function<PACKET_RET (const char *,DWORD,DWORD &)>”需要有 dll 接口由 class“DIOS::Dev::SCF::Detail::_SCF”的客户端使用
  33. SCF_C_API PVOID MallocSCFPacket ();//申请SCFPACKET
  34. SCF_C_API void ReleaseSCFPacket (PVOID pObj);//释放SCFPACKET
  35. class CircleBuff;
  36. namespace DIOS
  37. {
  38. namespace Dev
  39. {
  40. namespace Communication
  41. {
  42. namespace Detail
  43. {
  44. class SCF_API SCFPacket
  45. {
  46. protected:
  47. char* m_PacketBuff;
  48. DWORD m_PacketBuffLen;
  49. DWORD m_PacketLength;
  50. bool ReAlloc (DWORD BaseLen);
  51. public:
  52. SCFPacket ();
  53. SCFPacket (char* pData, DWORD Length);
  54. virtual ~SCFPacket ();
  55. bool SetBuffLen (DWORD Len);
  56. DWORD GetBuffLen ();
  57. SCFPacket& operator = (const SCFPacket &tValue);
  58. int SetPacket (const char* pData, DWORD Length);
  59. int AddTail (const char* pData, DWORD Length);
  60. void SetPacketLen (DWORD Len);
  61. DWORD GetPacketLen ();
  62. operator char* ();
  63. int GetPacket (char* pData, DWORD Length);
  64. };
  65. class SCF_API SCFBuffer : public DiosLock
  66. {
  67. DWORD m_CurPacketIdx;
  68. SCFPacket *m_pPacket[2];
  69. public:
  70. SCFBuffer ();
  71. ~SCFBuffer ();
  72. bool SetBuff (DWORD Len);
  73. int Add (const char * data, DWORD len);
  74. int Del (DWORD len);
  75. const char *GetBuff ();
  76. DWORD GetPacketLen ();
  77. void ClearData ();
  78. };
  79. class SCF_API SCFDetail : public DiosLock, public Dios_Thread
  80. {
  81. public:
  82. SCFDetail (void);
  83. virtual ~SCFDetail ();
  84. public:
  85. std::function <void ()> OnPassiveDisconnected;
  86. // HANDLE GetScfNotifyHandle () ;//获取SCF收到Notify后通知的事件句柄
  87. std::function <void ()> OnNewPacket;
  88. protected:
  89. HMODULE m_LibHandle;
  90. tPacketPredate m_pPacketParser;
  91. SCF_TRANSFERTYPE m_TransferType;
  92. //根路径是SCF路径,pFileName是偏移值,如 "COM\COM2.log"
  93. void InitSCF (const char *pLogFileName = NULL);
  94. //设置本地属性 特定通信情况下需要,串口,网络,USB的连接不需要设置
  95. bool SetSourceAttribute (ResDataObject & Sourceprameters) ;
  96. public:
  97. //设置连接,参数也由json传过来
  98. /* -- 串口类型
  99. {
  100. "type":"COM",
  101. "port":"COM1",
  102. "baudrate":"3200",
  103. "bytesize":"8",
  104. "parity":"1",
  105. "stopbits":"1"
  106. }
  107. */
  108. /* -- 网络类型
  109. {
  110. "type":"TCPIP",
  111. "ip":"192.168.2.77",
  112. "port":"2020"
  113. }
  114. */
  115. void SetBuffersize (DWORD NormalPackSize, DWORD MaxBuffLimit);
  116. virtual int Connect (ResDataObject & Connectprameters, tPacketPredate callback = nullptr, SCF_TRANSFERTYPE TransferType = SCF_NORMAL_TRANSFER, DWORD msTimeOut = 0);
  117. //断开连接
  118. virtual void Disconnect ();
  119. //判断是否连接
  120. virtual bool isConnected () const = 0;
  121. //获取连接类型,由继承类实现
  122. virtual const char* GetConnectionType ();
  123. //获取连接参数
  124. ResDataObject GetConnectionAttributes ();
  125. //发数据
  126. virtual int SendPacket (const char *pPacket, DWORD length, DWORD timeout);
  127. virtual int SendPacket (SCFPacket *pPacket, DWORD timeout);
  128. //读数据
  129. int ReceivePacket (char *pPacket, DWORD length, DWORD timeout);
  130. int ReceivePacket (SCFPacket *pPacket, DWORD timeout);
  131. DWORD GetReceivePacketSize ();
  132. DWORD GetNotifyPacketSize ();
  133. /// 将不需要的数据包存入Notify数据缓存队列
  134. int EnqueueNotifyPacket (const char *pPacket, DWORD length);
  135. int EnqueueNotifyPacket (SCFPacket *pPacket);
  136. // 读取Notify数据缓存中的数据包,当SCF处于解锁状态下接收的数据都会放入Notify缓存中,
  137. // 需要调用DeQueNotifyPacket来读取缓存中的数据包
  138. // 读取成功返回接收数据的实际长度,失败返回 SCF_ERR
  139. int DequeueNotifyPacket (char *pPacket, DWORD length, DWORD timeout);
  140. int DequeueNotifyPacket (SCFPacket *pPacket, DWORD timeout);
  141. //SCF的锁
  142. DWORD SCFLock (DWORD timeout);
  143. void SCFUnLock ();
  144. //被动掉线事件
  145. // void SetPassiveDisconnectEvt (HANDLE evt);
  146. void SetPassiveDisconnect (std::function <void ()> fun);
  147. void PassiveDisconnected ();
  148. DWORD GetCommunicateTimeout ();
  149. protected:
  150. // HANDLE m_PassiveDisconEvt;
  151. virtual int ReadData (char *pPacket, DWORD length, DWORD timeout);
  152. //virtual int ReadData (SCFPacket *pPacket, DWORD timeout);
  153. DWORD m_CommunicateTimeout;
  154. ResDataObject m_ConnectionParams;
  155. //---------------server part
  156. DWORD MaxComLen;
  157. DWORD NormalPackLen;
  158. DWORD ReadWaitTime;
  159. SCFBuffer m_RawBuffer;
  160. SCFPacket* m_pTransferBuffer;//将Receive数据转入Notify
  161. SCFPacket* m_pRtoNBuffer;//将Receive数据转入Notify
  162. bool StartSCFServer ();//开启读线程
  163. void StopSCFServer ();//关闭读线程
  164. int ProcessCmd (const char * data, int datalength);
  165. int ReceivetoNotify ();
  166. int ReceivetoNotify_Ex ();
  167. int WritetoNotify (const char *pPacket, int length);
  168. virtual bool Exec () override;
  169. CircleBuff * m_pNotifybuffer;
  170. CircleBuff * m_pReceivebuffer;
  171. SyncEvent::Manual m_EventNotify;
  172. // HANDLE m_hNotifyhandle;
  173. HANDLE m_hReceivehandle;
  174. HANDLE EventHandleWrite; // 当命令写入时,发送事件
  175. HANDLE EventHandleRead; // 当读取到命令时,发送事件
  176. private:
  177. void NotifyNewPacket ();
  178. };
  179. }
  180. }
  181. }
  182. }
  183. //SCF_C_API SCF* LoadScf (const char *pFilename);
  184. //SCF_C_API void UnLoadScf (SCF* pHandle);
  185. //typedef SCF * (*GetSCF_Proc) ();
  186. //typedef void (*ReleaseSCF_Proc) (SCF *);