// // 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; }