333 lines
8.7 KiB
C
333 lines
8.7 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;
|
|
} |