mirror of
https://github.com/RetroDECK/Supermodel.git
synced 2025-02-18 10:15:38 +00:00
82 lines
1.2 KiB
C
82 lines
1.2 KiB
C
![]() |
#ifndef _UDP_H_
|
||
|
#define _UDP_H_
|
||
|
|
||
|
namespace SMUDP
|
||
|
{
|
||
|
struct Packet
|
||
|
{
|
||
|
|
||
|
static const UINT32 BUFFER_SIZE = 1460;
|
||
|
|
||
|
UINT32 crc;
|
||
|
UINT16 currentID;
|
||
|
UINT16 totalIDs;
|
||
|
UINT16 flags;
|
||
|
UINT16 length;
|
||
|
UCHAR data[1460];
|
||
|
|
||
|
Packet() {
|
||
|
Init();
|
||
|
}
|
||
|
|
||
|
enum class PacketFlags {
|
||
|
newConnection = (1 << 0),
|
||
|
resend = (1 << 1),
|
||
|
ping = (1 << 2)
|
||
|
};
|
||
|
|
||
|
void Init() {
|
||
|
crc = 0;
|
||
|
currentID = 0;
|
||
|
totalIDs = 0;
|
||
|
flags = 0;
|
||
|
length = 0;
|
||
|
}
|
||
|
|
||
|
UINT32 CalcCRC() {
|
||
|
crc = CalcCRCVal();
|
||
|
}
|
||
|
|
||
|
UINT32 CalcCRCVal() {
|
||
|
|
||
|
UINT32 val = 0;
|
||
|
|
||
|
for (int i = 0; i < _countof(data); i++) {
|
||
|
val += data[i]; // crude but will catch the odd off by one error
|
||
|
}
|
||
|
|
||
|
return val;
|
||
|
}
|
||
|
|
||
|
bool ValidateCRC() {
|
||
|
return CalcCRCVal() == crc;
|
||
|
}
|
||
|
|
||
|
void CreatePacket(PacketFlags p) {
|
||
|
flags |= (UINT16)p;
|
||
|
}
|
||
|
|
||
|
void CalcTotalIDs(int bytes) {
|
||
|
totalIDs = bytes / sizeof(data);
|
||
|
|
||
|
if (bytes % sizeof(data)) {
|
||
|
totalIDs++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int HeaderSize() {
|
||
|
return 12;
|
||
|
}
|
||
|
|
||
|
int Size() {
|
||
|
return HeaderSize() + length;
|
||
|
}
|
||
|
|
||
|
operator char*() { return (char*)this; }
|
||
|
operator const char*() { return (char*)this; }
|
||
|
};
|
||
|
|
||
|
typedef char PacketReply;
|
||
|
}
|
||
|
|
||
|
#endif
|