CcosPacket.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #pragma once
  2. // 移除Windows DLL导出相关的宏定义
  3. #define CCOSPACKET_API
  4. #define CCOSPACKET_C_API extern "C"
  5. #include <vector>
  6. #include <string>
  7. #include <cstring>
  8. #include <cstdint>
  9. #include <stdexcept> // 用于异常处理
  10. #include <cassert> // 用于断言
  11. #include <iostream> // 用于调试输出
  12. #include "SCF.h"
  13. #include "CcosPackComDefs.h"
  14. // 定义Linux下需要的类型
  15. typedef bool BOOL;
  16. // 原始包异常对象
  17. class CCOSPACKET_API RawPacketObjectExption : public std::runtime_error {
  18. public:
  19. RawPacketObjectExption(const char* pExp);
  20. RawPacketObjectExption(const RawPacketObjectExption& tValue);
  21. RawPacketObjectExption& operator = (const RawPacketObjectExption& tValue);
  22. };
  23. class CCOSPACKET_API RawPacketObject {
  24. protected:
  25. bool m_HasKey; // 是否有键
  26. bool m_InternalMalloc; // 是否内部分配内存
  27. std::vector<unsigned char>* m_pInternalBuff; // 内部缓冲区
  28. RawPacketObject* m_pParent; // 父对象
  29. std::vector<RawPacketObject*>* m_vec; // 子对象列表
  30. unsigned char* m_pValue; // 值指针
  31. // 主值
  32. unsigned char* m_pPacketBuff; // 包缓冲区
  33. size_t m_PacketSize; // 包大小
  34. size_t m_BuffSize; // 缓冲区大小
  35. void AddPacketSize(size_t addsize); // 增加包大小
  36. void NotifySubPacketIsObject(); // 通知子包是对象
  37. public:
  38. RawPacketObject(RawPacketObject* pParent);
  39. RawPacketObject(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize);
  40. ~RawPacketObject();
  41. RawPacketObject(const RawPacketObject& tValue);
  42. BOOL HasKey();
  43. CCOSKEYTYPE GetKey();
  44. size_t sizeOfRaw();
  45. size_t sizeOfObject();
  46. size_t sizeOfBuff();
  47. void Clear();
  48. void delet();
  49. bool ReloadObject();
  50. void Reload(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize);
  51. // 添加操作
  52. void SetKey(CCOSKEYTYPE key);
  53. template <class T> bool add_Template(CCOSKEYTYPE Key, T tValue);
  54. bool add(CCOSKEYTYPE Key, bool tValue);
  55. bool add(CCOSKEYTYPE Key, char tValue);
  56. bool add(CCOSKEYTYPE Key, unsigned char tValue);
  57. bool add(CCOSKEYTYPE Key, short tValue);
  58. bool add(CCOSKEYTYPE Key, unsigned short tValue);
  59. bool add(CCOSKEYTYPE Key, int tValue);
  60. bool add(CCOSKEYTYPE Key, unsigned int tValue);
  61. bool add(CCOSKEYTYPE Key, long tValue);
  62. bool add(CCOSKEYTYPE Key, unsigned long tValue);
  63. bool add(CCOSKEYTYPE Key, long long tValue);
  64. bool add(CCOSKEYTYPE Key, unsigned long long tValue);
  65. bool add(CCOSKEYTYPE Key, float tValue);
  66. bool add(CCOSKEYTYPE Key, double tValue);
  67. bool add(CCOSKEYTYPE Key, const char* pValue, size_t size);
  68. void ReloadInternalMalloc(size_t sizeofadd);
  69. bool add(RawPacketObject& dataobj);
  70. bool SetKeyLengthValue(size_t addSize);
  71. // 赋值操作
  72. RawPacketObject& operator = (const RawPacketObject& tValue);
  73. template <class T1> bool SignedAssignmentProcess(T1 temp);
  74. template <class T2> bool UnSignedAssignmentProcess(T2 temp);
  75. RawPacketObject& operator = (const bool tValue);
  76. RawPacketObject& operator = (const char tValue);
  77. RawPacketObject& operator = (const unsigned char tValue);
  78. RawPacketObject& operator = (const short tValue);
  79. RawPacketObject& operator = (const unsigned short tValue);
  80. RawPacketObject& operator = (const int tValue);
  81. RawPacketObject& operator = (const unsigned int tValue);
  82. RawPacketObject& operator = (const long tValue);
  83. RawPacketObject& operator = (const unsigned long tValue);
  84. RawPacketObject& operator = (const long long tValue);
  85. RawPacketObject& operator = (const unsigned long long tValue);
  86. RawPacketObject& operator = (const float tValue);
  87. RawPacketObject& operator = (const double tValue);
  88. bool update(const char* pValue, size_t size);
  89. // 读取操作
  90. RawPacketObject& operator [](size_t idx);
  91. RawPacketObject& operator [](int idx);
  92. RawPacketObject& operator [](CCOSKEYTYPE Key);
  93. template <class T3> bool ReadSignedValueByType(T3& value);
  94. template <class T4> bool ReadUnSignedValueByType(T4& value);
  95. operator bool();
  96. operator char();
  97. operator unsigned char();
  98. operator short();
  99. operator unsigned short();
  100. operator int();
  101. operator unsigned int();
  102. operator long();
  103. operator unsigned long();
  104. operator long long();
  105. operator unsigned long long();
  106. operator float();
  107. operator double();
  108. operator const char* ();
  109. bool IsObject();
  110. // 比较操作
  111. bool operator== (const RawPacketObject& ar) const;
  112. };
  113. // Ccos短指令协议包类
  114. class CcosPacket : public SCFPacket {
  115. protected:
  116. RawPacketObject* m_pDataObj; // 数据对象
  117. bool m_bReady; // 包是否准备好
  118. unsigned int m_LenzoneSize; // 长度区域大小(字节)
  119. bool m_CrcEffective; // CRC是否有效
  120. unsigned int m_Direction; // 方向
  121. unsigned int m_FreezeLenzone; // 冻结长度区域(01:冻结)
  122. bool UpdateLastEnv(); // 更新最后环境
  123. public:
  124. CcosPacket();
  125. CcosPacket(char* pData, size_t Length);
  126. virtual ~CcosPacket();
  127. // 访问方法
  128. bool GetPhyDevIdx(PHYIDXTYPE& PhyDevIdx);
  129. bool SetPhyDevIdx(PHYIDXTYPE PhyDevIdx);
  130. bool GetLogicDevIdx(LOGICIDXTYPE& LogicDevIdx);
  131. bool SetLogicDevIdx(LOGICIDXTYPE LogicDevIdx);
  132. bool GetDataCrcEffectiveFlag(bool& Effective);
  133. bool SetDataCrcEffectiveFlag(bool Effective);
  134. bool GetTargetDirection(unsigned int& Direction);
  135. bool SetTargetDirection(unsigned int Direction);
  136. bool GetFreezeLenZoneFlag(unsigned int& FreezeFlag);
  137. bool SetFreezeLenZoneFlag(unsigned int FreezeFlag);
  138. bool GetLenZoneSize(unsigned int& LenzoneSize);
  139. bool SetLenZoneSize(unsigned int LenzoneSize);
  140. bool GetCommand(CCOSCMDTYPE& Cmd);
  141. bool SetCommand(CCOSCMDTYPE Cmd);
  142. bool GetRetcode(char& Ret);
  143. bool SetRetcode(char Ret);
  144. bool GetDataLen(unsigned long long& Len);
  145. bool SetDataLen(unsigned long long Len);
  146. bool GetHeadsCrc(unsigned short& headCrc16);
  147. bool SetHeadsCrc(unsigned short headCrc16);
  148. char* GetData();
  149. RawPacketObject* GetDataObject();
  150. bool SetData(const char* pData, size_t dataLen);
  151. bool AddData(const char* pData, size_t dataLen);
  152. bool GetDataCrc(unsigned short& dataCrc16);
  153. bool SetDataCrc(unsigned short dataCrc16);
  154. // 准备方法
  155. bool InitPacket();
  156. bool ReadyPacket();
  157. size_t GetHeadSize();
  158. unsigned long long GetCcosPacketSize();
  159. bool GetParam(DWORD Idx, char*& pAddress, size_t& ParamSize);
  160. };
  161. // C接口函数声明
  162. extern "C" PVOID MallocCcosPacket();
  163. extern "C" void ReleaseCcosPacket(PVOID pObj);
  164. extern "C" PACKET_RET CcosPacketParser(const char* pRecData, DWORD nLength, DWORD& PacketLength);