#pragma once #include #include #include enum Com_Enum_ProtocolType : quint8 { Com_Enum_ProtocolType_None = 0x00, Com_Enum_ProtocolType_HelloReq = 0x01, Com_Enum_ProtocolType_HelloRsp = 0x02, Com_Enum_ProtocolType_Bitmap = 0x10, Com_Enum_ProtocolType_FunctionKeyEvent = 0x20, Com_Enum_ProtocolType_LedState = 0x21, Com_Enum_ProtocolType_TimeSync = 0x30, Com_Enum_ProtocolType_ThemeRgb = 0x31, Com_Enum_ProtocolType_Ack = 0x7E, Com_Enum_ProtocolType_Error = 0x7F }; enum Com_Enum_ProtocolErrorCode : quint32 { Com_Enum_ProtocolErrorCode_None = 0, Com_Enum_ProtocolErrorCode_UnknownType = 1, Com_Enum_ProtocolErrorCode_InvalidLength = 2, Com_Enum_ProtocolErrorCode_InvalidParam = 3, Com_Enum_ProtocolErrorCode_NotReady = 4 }; enum Com_Enum_ProtocolKeyAction : quint32 { Com_Enum_ProtocolKeyAction_None = 0, Com_Enum_ProtocolKeyAction_Press = 1, Com_Enum_ProtocolKeyAction_Release = 2 }; struct Com_Struct_ProtocolHelloRsp { quint32 ProtocolVersion = 0; quint32 VendorId = 0; quint32 ProductId = 0; quint32 FirmwareMajor = 0; quint32 FirmwareMinor = 0; quint32 CapabilityFlags = 0; }; struct Com_Struct_ProtocolFunctionKeyEvent { QByteArray UsageBitmap; bool HasUsageAction = false; quint16 Usage = 0; quint32 Action = Com_Enum_ProtocolKeyAction_None; }; struct Com_Struct_ProtocolLedState { quint32 LedMask = 0; }; struct Com_Struct_ProtocolAck { quint32 AckedType = 0; }; struct Com_Struct_ProtocolError { quint32 ErrorType = 0; quint32 ErrorCode = 0; }; bool Com_Protocol_DecodeMessageType( const QByteArray& PacketBody, Com_Enum_ProtocolType* p_Type); bool Com_Protocol_TryTakePacket( QByteArray* p_StreamBuffer, QByteArray* p_PacketBody, Com_Enum_ProtocolType* p_Type); QByteArray Com_Protocol_EncodeHelloReq(); QByteArray Com_Protocol_EncodeBitmap(const QByteArray& UsageBitmap); QByteArray Com_Protocol_EncodeTimeSync( quint32 Version, quint32 Flags, qint32 TimezoneMinutes, quint64 UtcMilliseconds, quint32 AccuracyMilliseconds); QByteArray Com_Protocol_EncodeThemeRgb(quint8 Red, quint8 Green, quint8 Blue); bool Com_Protocol_DecodeHelloRsp( const QByteArray& PacketBody, Com_Struct_ProtocolHelloRsp* p_Message); bool Com_Protocol_DecodeFunctionKeyEvent( const QByteArray& PacketBody, Com_Struct_ProtocolFunctionKeyEvent* p_Message); bool Com_Protocol_DecodeLedState( const QByteArray& PacketBody, Com_Struct_ProtocolLedState* p_Message); bool Com_Protocol_DecodeAck( const QByteArray& PacketBody, Com_Struct_ProtocolAck* p_Message); bool Com_Protocol_DecodeError( const QByteArray& PacketBody, Com_Struct_ProtocolError* p_Message); bool Com_Protocol_DecodeAckForType( const QByteArray& PacketBody, Com_Enum_ProtocolType EnvelopeType, Com_Struct_ProtocolAck* p_Message); bool Com_Protocol_DecodeErrorForType( const QByteArray& PacketBody, Com_Enum_ProtocolType EnvelopeType, Com_Struct_ProtocolError* p_Message); bool Com_Protocol_IsUsageBitmapValid(const QByteArray& UsageBitmap); QByteArray Com_Protocol_CreateUsageBitmap(); bool Com_Protocol_TestUsageBitmapBit(const QByteArray& UsageBitmap, quint16 Usage); bool Com_Protocol_SetUsageBitmapBit(QByteArray* p_UsageBitmap, quint16 Usage, bool IsPressed); QVector Com_Protocol_BuildPressedUsageList(const QByteArray& UsageBitmap);