Legacy_EgtsEncoderDecoder/Src/egts_commonExt.c

459 lines
12 KiB
C

//
// Created by cfif on 22.04.2024.
//
#include "egts_commonExt.h"
#include "EgtsTimestamp.h"
uint16_t vEgtsPackSrvEx(
uint8_t *out,
uint16_t counter,
uint8_t flags,
eEgtsServiceId sourceServiceId,
eEgtsServiceId recipientServiceId,
uint32_t epochTimestamp,
uint16_t subRecordCount,
eEgtsSubRecordId subRecordType,
tEgtsServiceSubRecordGeneratorEx subRecGen,
void *subRecArgs
) {
uint16_t subRecordLengthFull = 0;
// 3 - Для SRT + SRT
// 11 - Заголовок
uint16_t subRecordLengthOffsetHeader = 11;
bool isPresentSubRecord = false;
for (uint16_t i = 0; i < subRecordCount; ++i) {
uint16_t subRecordLength = subRecGen(out + subRecordLengthOffsetHeader + 3, subRecArgs, i);
if (subRecordLength > 0) {
isPresentSubRecord = true;
subRecordLengthFull += (subRecordLength + 3);
//SRT
*(uint8_t *) (out + subRecordLengthOffsetHeader) = subRecordType;
//SRL
*(uint16_t *) (out + subRecordLengthOffsetHeader + 1) = subRecordLength;
subRecordLengthOffsetHeader += (subRecordLength + 3);
}
}
if (!isPresentSubRecord)
return 0;
// uint16_t subRecordLength = subRecGen(out + 14, subRecArgs);
// *(uint16_t *) (out + 0) = subRecordLength + 3; //data length
*(uint16_t *) (out + 0) = subRecordLengthFull;
*(uint16_t *) (out + 2) = counter; //counter
////////////////////////////////////////////////////////////////////////////////////////////////////////
// | flags |
// Sender Rcver Group Prior hasTime hasEvntID hasObjId
// DEV SRV None value exist not not
// 1 0 0 10 1 0 0 => 10010100 => 0x94
out[4] = flags;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//time
*(uint32_t *) (out + 5) = Egts_EpochTimestampToEgtsTime(epochTimestamp);
//SourceServType
*(uint8_t *) (out + 9) = (uint8_t) sourceServiceId;
//RecipientServType
*(uint8_t *) (out + 10) = (uint8_t) recipientServiceId;
//SRT
// *(uint8_t *) (out + 11) = subRecordType; //(uint8_t) SRT;
//SRL
// *(uint16_t *) (out + 12) = subRecordLength;
// return subRecordLength + 14;
return subRecordLengthFull + 11;
}
uint16_t vEgtsPackTransportEx1(
uint16_t cid,
uint16_t packetId,
uint16_t *counter,
uint8_t *out,
uint8_t srvFlags,
eEgtsPacketTypeId packetTypeId,
eEgtsServiceId sourceServiceId,
eEgtsServiceId recipientServiceId,
uint32_t timestamp,
uint16_t subRecordCount,
eEgtsSubRecordId subRecordType,
tEgtsServiceSubRecordGeneratorEx subRecGen,
void *subRecArgs
) {
uint8_t ptOffset = 0;
if (packetTypeId == EGTS_PT_RESPONSE) {
ptOffset = 3;
}
uint16_t srvLen = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount,
subRecordType,
subRecGen,
subRecArgs
);
++*counter;
out[0] = 0x01;//version
out[1] = 0x00;//secure key
out[2] = 0x01;//flags
out[3] = 0x0B;//header length
out[4] = 0x00;//header encoding
*((uint16_t *) (out + 5)) = srvLen;
*((uint16_t *) (out + 7)) = packetId;//package Id
out[9] = packetTypeId;//Packet type
out[10] = CRC8EGTS(out, 10);//Header CRC
if (packetTypeId == EGTS_PT_RESPONSE) {
*((uint16_t *) (out + 11)) = cid;// response packet id
out[13] = 0b0000;//Packet type
}
*((uint16_t *) (out + TRANSPORT_HEADER_LENGTH + srvLen)) = CRC16EGTS(out + TRANSPORT_HEADER_LENGTH, srvLen);
return TRANSPORT_HEADER_LENGTH + srvLen + 2;
}
uint16_t vEgtsPackTransportEx2(
uint16_t cid,
uint16_t packetId,
uint16_t *counter,
uint8_t *out,
uint8_t srvFlags,
eEgtsPacketTypeId packetTypeId,
eEgtsServiceId sourceServiceId,
eEgtsServiceId recipientServiceId,
uint32_t timestamp,
uint16_t subRecordCount1,
eEgtsSubRecordId subRecordType1,
tEgtsServiceSubRecordGeneratorEx subRecGen1,
void *subRecArgs1,
uint16_t subRecordCount2,
eEgtsSubRecordId subRecordType2,
tEgtsServiceSubRecordGeneratorEx subRecGen2,
void *subRecArgs2
) {
uint8_t ptOffset = 0;
if (packetTypeId == EGTS_PT_RESPONSE) {
ptOffset = 3;
}
uint16_t srvLen1 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount1,
subRecordType1,
subRecGen1,
subRecArgs1
);
++*counter;
uint16_t srvLen2 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount2,
subRecordType2,
subRecGen2,
subRecArgs2
);
++*counter;
uint16_t srvLen = srvLen1 + srvLen2;
out[0] = 0x01;//version
out[1] = 0x00;//secure key
out[2] = 0x01;//flags
out[3] = 0x0B;//header length
out[4] = 0x00;//header encoding
*((uint16_t *) (out + 5)) = srvLen;
*((uint16_t *) (out + 7)) = packetId;//package Id
out[9] = packetTypeId;//Packet type
out[10] = CRC8EGTS(out, 10);//Header CRC
if (packetTypeId == EGTS_PT_RESPONSE) {
*((uint16_t *) (out + 11)) = cid;// response packet id
out[13] = 0b0000;//Packet type
}
*((uint16_t *) (out + TRANSPORT_HEADER_LENGTH + srvLen)) = CRC16EGTS(out + TRANSPORT_HEADER_LENGTH, srvLen);
return TRANSPORT_HEADER_LENGTH + srvLen + 2;
}
uint16_t vEgtsPackTransportEx3(
uint16_t cid,
uint16_t packetId,
uint16_t *counter,
uint8_t *out,
uint8_t srvFlags,
eEgtsPacketTypeId packetTypeId,
eEgtsServiceId sourceServiceId,
eEgtsServiceId recipientServiceId,
uint32_t timestamp,
uint16_t subRecordCount1,
eEgtsSubRecordId subRecordType1,
tEgtsServiceSubRecordGeneratorEx subRecGen1,
void *subRecArgs1,
uint16_t subRecordCount2,
eEgtsSubRecordId subRecordType2,
tEgtsServiceSubRecordGeneratorEx subRecGen2,
void *subRecArgs2,
uint16_t subRecordCount3,
eEgtsSubRecordId subRecordType3,
tEgtsServiceSubRecordGeneratorEx subRecGen3,
void *subRecArgs3
) {
uint8_t ptOffset = 0;
if (packetTypeId == EGTS_PT_RESPONSE) {
ptOffset = 3;
}
uint16_t srvLen1 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount1,
subRecordType1,
subRecGen1,
subRecArgs1
);
++*counter;
uint16_t srvLen2 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount2,
subRecordType2,
subRecGen2,
subRecArgs2
);
++*counter;
uint16_t srvLen3 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + srvLen2 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount3,
subRecordType3,
subRecGen3,
subRecArgs3
);
++*counter;
uint16_t srvLen = srvLen1 + srvLen2 + srvLen3;
out[0] = 0x01;//version
out[1] = 0x00;//secure key
out[2] = 0x01;//flags
out[3] = 0x0B;//header length
out[4] = 0x00;//header encoding
*((uint16_t *) (out + 5)) = srvLen;
*((uint16_t *) (out + 7)) = packetId;//package Id
out[9] = packetTypeId;//Packet type
out[10] = CRC8EGTS(out, 10);//Header CRC
if (packetTypeId == EGTS_PT_RESPONSE) {
*((uint16_t *) (out + 11)) = cid;// response packet id
out[13] = 0b0000;//Packet type
}
*((uint16_t *) (out + TRANSPORT_HEADER_LENGTH + srvLen)) = CRC16EGTS(out + TRANSPORT_HEADER_LENGTH, srvLen);
return TRANSPORT_HEADER_LENGTH + srvLen + 2;
}
uint16_t vEgtsPackTransportEx4(
uint16_t cid,
uint16_t packetId,
uint16_t *counter,
uint8_t *out,
uint8_t srvFlags,
eEgtsPacketTypeId packetTypeId,
eEgtsServiceId sourceServiceId,
eEgtsServiceId recipientServiceId,
uint32_t timestamp,
uint16_t subRecordCount1,
eEgtsSubRecordId subRecordType1,
tEgtsServiceSubRecordGeneratorEx subRecGen1,
void *subRecArgs1,
uint16_t subRecordCount2,
eEgtsSubRecordId subRecordType2,
tEgtsServiceSubRecordGeneratorEx subRecGen2,
void *subRecArgs2,
uint16_t subRecordCount3,
eEgtsSubRecordId subRecordType3,
tEgtsServiceSubRecordGeneratorEx subRecGen3,
void *subRecArgs3,
uint16_t subRecordCount4,
eEgtsSubRecordId subRecordType4,
tEgtsServiceSubRecordGeneratorEx subRecGen4,
void *subRecArgs4
) {
uint8_t ptOffset = 0;
if (packetTypeId == EGTS_PT_RESPONSE) {
ptOffset = 3;
}
uint16_t srvLen1 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount1,
subRecordType1,
subRecGen1,
subRecArgs1
);
++*counter;
uint16_t srvLen2 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount2,
subRecordType2,
subRecGen2,
subRecArgs2
);
++*counter;
uint16_t srvLen3 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + srvLen2 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount3,
subRecordType3,
subRecGen3,
subRecArgs3
);
++*counter;
uint16_t srvLen4 = ptOffset + vEgtsPackSrvEx(
out + TRANSPORT_HEADER_LENGTH + srvLen1 + srvLen2 + srvLen3 + ptOffset,
*counter,
srvFlags,
sourceServiceId,
recipientServiceId,
timestamp,
subRecordCount4,
subRecordType4,
subRecGen4,
subRecArgs4
);
++*counter;
uint16_t srvLen = srvLen1 + srvLen2 + srvLen3 + srvLen4;
out[0] = 0x01;//version
out[1] = 0x00;//secure key
out[2] = 0x01;//flags
out[3] = 0x0B;//header length
out[4] = 0x00;//header encoding
*((uint16_t *) (out + 5)) = srvLen;
*((uint16_t *) (out + 7)) = packetId;//package Id
out[9] = packetTypeId;//Packet type
out[10] = CRC8EGTS(out, 10);//Header CRC
if (packetTypeId == EGTS_PT_RESPONSE) {
*((uint16_t *) (out + 11)) = cid;// response packet id
out[13] = 0b0000;//Packet type
}
*((uint16_t *) (out + TRANSPORT_HEADER_LENGTH + srvLen)) = CRC16EGTS(out + TRANSPORT_HEADER_LENGTH, srvLen);
return TRANSPORT_HEADER_LENGTH + srvLen + 2;
}