SCF.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #pragma once
  2. #define SCF_API
  3. #define SCF_C_API extern "C"
  4. #include <cstdint>
  5. #include <string>
  6. #include <pthread.h>
  7. #include "ResDataObject.h"
  8. #include "CcosLock.h"
  9. #include "CcosThread.h"
  10. typedef enum _SCF_Error {
  11. SCF_UNKNOWN = -99,
  12. SCF_NOMEMORY,
  13. SCF_OPEN_FAILED,//打开端口失败
  14. SCF_READ_FAILED,//读失败
  15. SCF_WRITE_FAILED,//写失败
  16. SCF_DISCONNETED,//连接断开
  17. SCF_LOCK_FAILED,//锁失败
  18. SCF_BUSY,//被占用
  19. SCF_PARAMETER_ERR,//连接参数不对
  20. SCF_OVERFLOW,
  21. SCF_NOPACKET,
  22. SCF_TIMEOUT,
  23. SCF_FAILED = 0,
  24. SCF_SUCCEED
  25. } SCF_ERR;
  26. typedef enum _Packet_Result {
  27. PACKET_USELESS = -1,//不需要的数据包,直接丢弃
  28. PACKET_NOPACKET,//没有数据包
  29. PACKET_ISPACKET//有数据包
  30. } PACKET_RET;
  31. typedef enum _SCF_Transfertype {
  32. SCF_PACKET_TRANSFER = 0,//使用DeQueNotifyPacket&QueNotifyPacket
  33. SCF_NORMAL_TRANSFER//使用通用读取方式
  34. } SCF_TRANSFERTYPE;
  35. typedef PACKET_RET(*PacketParser)(const char* pRecData, uint32_t nLength, uint32_t& PacketLength);
  36. SCF_C_API void* MallocSCFPacket();//申请SCFPACKET
  37. SCF_C_API void ReleaseSCFPacket(void* pObj);//释放SCFPACKET
  38. class SCF_API SCFPacket {
  39. protected:
  40. char* m_PacketBuff;
  41. uint32_t m_PacketBuffLen;
  42. uint32_t m_PacketLength;
  43. bool ReAlloc(uint32_t BaseLen);
  44. public:
  45. SCFPacket();
  46. SCFPacket(char* pData, uint32_t Length);
  47. virtual ~SCFPacket();
  48. bool SetBuffLen(uint32_t Len);
  49. uint32_t GetBuffLen();
  50. SCFPacket& operator = (const SCFPacket& tValue);
  51. int SetPacket(const char* pData, uint32_t Length);
  52. int AddTail(const char* pData, uint32_t Length);
  53. void SetPacketLen(uint32_t Len);
  54. uint32_t GetPacketLen();
  55. operator char* ();
  56. int GetPacket(char* pData, uint32_t Length);
  57. };
  58. class SCF_API SCFBuffer : public CcosLock {
  59. uint32_t m_CurPacketIdx;
  60. SCFPacket* m_pPacket[2];
  61. public:
  62. SCFBuffer();
  63. ~SCFBuffer();
  64. bool SetBuff(uint32_t Len);
  65. int Add(const char* data, uint32_t len);
  66. int Del(uint32_t len);
  67. const char* GetBuff();
  68. uint32_t GetPacketLen();
  69. void ClearData();
  70. };
  71. class SCF_API SCF : public CcosLock, public Ccos_Thread {
  72. public:
  73. SCF(void);
  74. virtual ~SCF();
  75. void* m_LibHandle;
  76. PacketParser m_pPacketParser;
  77. SCF_TRANSFERTYPE m_TransferType;
  78. //根路径是SCF路径,pFileName是偏移值,如 "COM\COM2.log"
  79. void InitSCF(const char* pLogFileName = NULL);
  80. //设置本地属性 特定通信情况下需要,串口,网络,USB的连接不需要设置
  81. bool SetSourceAttribute(ResDataObject& Sourceprameters);
  82. //设置连接,参数也由json传过来
  83. /* -- 串口类型
  84. {
  85. "type":"COM",
  86. "port":"COM1",
  87. "baudrate":"3200",
  88. "bytesize":"8",
  89. "parity":"1",
  90. "stopbits":"1"
  91. }
  92. */
  93. /* -- 网络类型
  94. {
  95. "type":"TCPIP",
  96. "ip":"192.168.2.77",
  97. "port":"2020"
  98. }
  99. */
  100. void SetBuffersize(uint32_t NormalPackSize, uint32_t MaxBuffLimit);
  101. virtual int Connect(ResDataObject& Connectprameters, PacketParser callback,
  102. SCF_TRANSFERTYPE TransferType = SCF_NORMAL_TRANSFER,
  103. uint32_t CommunicateTimeout = 0);
  104. //断开连接
  105. virtual void Disconnect();
  106. //判断是否连接
  107. virtual bool isConnected();
  108. //获取连接类型,由继承类实现
  109. virtual const char* GetConnectionType();
  110. //获取连接参数
  111. ResDataObject GetConnectionAttributes();
  112. //发数据
  113. virtual int SendPacket(const char* pPacket, uint32_t length, uint32_t timeout);
  114. virtual int SendPacket(SCFPacket* pPacket, uint32_t timeout);
  115. //读数据
  116. int ReceivePacket(char* pPacket, uint32_t length, uint32_t timeout);
  117. int ReceivePacket(SCFPacket* pPacket, uint32_t timeout);
  118. uint32_t GetReceivePacketSize();
  119. uint32_t GetNotifyPacketSize(); //获取SCF收到Notify后通知的事件句柄
  120. ////将不需要的数据包存入Notify数据缓存队列
  121. int QueNotifyPacket(const char* pPacket, uint32_t length);
  122. int QueNotifyPacket(SCFPacket* pPacket);
  123. //读取Notify数据缓存中的数据包,当SCF处于解锁状态下接收的数据都会放入Notify缓存中,需要调用DeQueNotifyPacket来读取缓存中的数据包,读取成功返回接收数据的实际长度,失败返回SCF_ERR
  124. int DeQueNotifyPacket(char* pPacket, uint32_t length, uint32_t timeout);
  125. int DeQueNotifyPacket(SCFPacket* pPacket, uint32_t timeout);
  126. //SCF的锁
  127. uint32_t SCFLock(uint32_t timeout);
  128. void SCFUnLock();
  129. //被动掉线事件
  130. void PassiveDisconnected();
  131. uint32_t GetCommunicateTimeout();
  132. protected:
  133. pthread_cond_t m_NotifyCond;
  134. pthread_cond_t m_ReceiveCond;
  135. pthread_mutex_t m_NotifyMutex;
  136. pthread_mutex_t m_ReceiveMutex;
  137. bool m_NotifyFlag;
  138. bool m_ReceiveFlag;
  139. uint32_t m_CommunicateTimeout;
  140. ResDataObject m_ConnectionParams;
  141. uint32_t MaxComLen;
  142. uint32_t NormalPackLen;
  143. uint32_t ReadWaitTime;
  144. SCFBuffer m_RawBuffer;
  145. SCFPacket* m_pTransferBuffer;
  146. SCFPacket* m_pRtoNBuffer;
  147. void* m_pNotifybuffer;
  148. void* m_pReceivebuffer;
  149. bool StartSCFServer();
  150. void StopSCFServer();
  151. int ProcessCmd(const char* data, int datalength);
  152. int ReceivetoNotify();
  153. int ReceivetoNotify_Ex();
  154. int WritetoNotify(const char* pPacket, int length);
  155. virtual bool Exec();
  156. int ReadData(char* pPacket, uint32_t length, uint32_t timeout);
  157. };
  158. SCF_C_API SCF* LoadScf(const char* pFilename);
  159. SCF_C_API void UnLoadScf(SCF* pHandle);
  160. typedef SCF* (*GetSCF_Proc)();
  161. typedef void (*ReleaseSCF_Proc)(SCF*);