#pragma once // 移除Windows DLL导出相关的宏定义 #define CCOSPACKET_API #define CCOSPACKET_C_API extern "C" #include #include #include #include #include // 用于异常处理 #include // 用于断言 #include // 用于调试输出 #include "SCF.h" #include "CcosPackComDefs.h" // 定义Linux下需要的类型 typedef bool BOOL; // 原始包异常对象 class CCOSPACKET_API RawPacketObjectExption : public std::runtime_error { public: RawPacketObjectExption(const char* pExp); RawPacketObjectExption(const RawPacketObjectExption& tValue); RawPacketObjectExption& operator = (const RawPacketObjectExption& tValue); }; class CCOSPACKET_API RawPacketObject { protected: bool m_HasKey; // 是否有键 bool m_InternalMalloc; // 是否内部分配内存 std::vector* m_pInternalBuff; // 内部缓冲区 RawPacketObject* m_pParent; // 父对象 std::vector* m_vec; // 子对象列表 unsigned char* m_pValue; // 值指针 // 主值 unsigned char* m_pPacketBuff; // 包缓冲区 size_t m_PacketSize; // 包大小 size_t m_BuffSize; // 缓冲区大小 void AddPacketSize(size_t addsize); // 增加包大小 void NotifySubPacketIsObject(); // 通知子包是对象 public: RawPacketObject(RawPacketObject* pParent); RawPacketObject(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize); ~RawPacketObject(); RawPacketObject(const RawPacketObject& tValue); BOOL HasKey(); CCOSKEYTYPE GetKey(); size_t sizeOfRaw(); size_t sizeOfObject(); size_t sizeOfBuff(); void Clear(); void delet(); bool ReloadObject(); void Reload(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize); // 添加操作 void SetKey(CCOSKEYTYPE key); template bool add_Template(CCOSKEYTYPE Key, T tValue); bool add(CCOSKEYTYPE Key, bool tValue); bool add(CCOSKEYTYPE Key, char tValue); bool add(CCOSKEYTYPE Key, unsigned char tValue); bool add(CCOSKEYTYPE Key, short tValue); bool add(CCOSKEYTYPE Key, unsigned short tValue); bool add(CCOSKEYTYPE Key, int tValue); bool add(CCOSKEYTYPE Key, unsigned int tValue); bool add(CCOSKEYTYPE Key, long tValue); bool add(CCOSKEYTYPE Key, unsigned long tValue); bool add(CCOSKEYTYPE Key, long long tValue); bool add(CCOSKEYTYPE Key, unsigned long long tValue); bool add(CCOSKEYTYPE Key, float tValue); bool add(CCOSKEYTYPE Key, double tValue); bool add(CCOSKEYTYPE Key, const char* pValue, size_t size); void ReloadInternalMalloc(size_t sizeofadd); bool add(RawPacketObject& dataobj); bool SetKeyLengthValue(size_t addSize); // 赋值操作 RawPacketObject& operator = (const RawPacketObject& tValue); template bool SignedAssignmentProcess(T1 temp); template bool UnSignedAssignmentProcess(T2 temp); RawPacketObject& operator = (const bool tValue); RawPacketObject& operator = (const char tValue); RawPacketObject& operator = (const unsigned char tValue); RawPacketObject& operator = (const short tValue); RawPacketObject& operator = (const unsigned short tValue); RawPacketObject& operator = (const int tValue); RawPacketObject& operator = (const unsigned int tValue); RawPacketObject& operator = (const long tValue); RawPacketObject& operator = (const unsigned long tValue); RawPacketObject& operator = (const long long tValue); RawPacketObject& operator = (const unsigned long long tValue); RawPacketObject& operator = (const float tValue); RawPacketObject& operator = (const double tValue); bool update(const char* pValue, size_t size); // 读取操作 RawPacketObject& operator [](size_t idx); RawPacketObject& operator [](int idx); RawPacketObject& operator [](CCOSKEYTYPE Key); template bool ReadSignedValueByType(T3& value); template bool ReadUnSignedValueByType(T4& value); operator bool(); operator char(); operator unsigned char(); operator short(); operator unsigned short(); operator int(); operator unsigned int(); operator long(); operator unsigned long(); operator long long(); operator unsigned long long(); operator float(); operator double(); operator const char* (); bool IsObject(); // 比较操作 bool operator== (const RawPacketObject& ar) const; }; // Ccos短指令协议包类 class CcosPacket : public SCFPacket { protected: RawPacketObject* m_pDataObj; // 数据对象 bool m_bReady; // 包是否准备好 unsigned int m_LenzoneSize; // 长度区域大小(字节) bool m_CrcEffective; // CRC是否有效 unsigned int m_Direction; // 方向 unsigned int m_FreezeLenzone; // 冻结长度区域(01:冻结) bool UpdateLastEnv(); // 更新最后环境 public: CcosPacket(); CcosPacket(char* pData, size_t Length); virtual ~CcosPacket(); // 访问方法 bool GetPhyDevIdx(PHYIDXTYPE& PhyDevIdx); bool SetPhyDevIdx(PHYIDXTYPE PhyDevIdx); bool GetLogicDevIdx(LOGICIDXTYPE& LogicDevIdx); bool SetLogicDevIdx(LOGICIDXTYPE LogicDevIdx); bool GetDataCrcEffectiveFlag(bool& Effective); bool SetDataCrcEffectiveFlag(bool Effective); bool GetTargetDirection(unsigned int& Direction); bool SetTargetDirection(unsigned int Direction); bool GetFreezeLenZoneFlag(unsigned int& FreezeFlag); bool SetFreezeLenZoneFlag(unsigned int FreezeFlag); bool GetLenZoneSize(unsigned int& LenzoneSize); bool SetLenZoneSize(unsigned int LenzoneSize); bool GetCommand(CCOSCMDTYPE& Cmd); bool SetCommand(CCOSCMDTYPE Cmd); bool GetRetcode(char& Ret); bool SetRetcode(char Ret); bool GetDataLen(unsigned long long& Len); bool SetDataLen(unsigned long long Len); bool GetHeadsCrc(unsigned short& headCrc16); bool SetHeadsCrc(unsigned short headCrc16); char* GetData(); RawPacketObject* GetDataObject(); bool SetData(const char* pData, size_t dataLen); bool AddData(const char* pData, size_t dataLen); bool GetDataCrc(unsigned short& dataCrc16); bool SetDataCrc(unsigned short dataCrc16); // 准备方法 bool InitPacket(); bool ReadyPacket(); size_t GetHeadSize(); unsigned long long GetCcosPacketSize(); bool GetParam(DWORD Idx, char*& pAddress, size_t& ParamSize); }; // C接口函数声明 extern "C" PVOID MallocCcosPacket(); extern "C" void ReleaseCcosPacket(PVOID pObj); extern "C" PACKET_RET CcosPacketParser(const char* pRecData, DWORD nLength, DWORD& PacketLength);