/** * Manages central aes data to be sent * $Id: handler_oc_situation_data.h 57655 2022-07-20 11:38:28Z karwat $ * $HeadURL: svn://192.168.133.21/TDS/branches/product/features/3dws_devel/Lts/Services/OcSituationServer/handler_oc_situation_data.h $ * $Author: karwat $ * Created by Hannes Fritsche, SLTE, 16-08-2022 */ #include "central_aes_data_builder.h" #include "LtsUtils/LtsUtilsCore/qbytearray_byteaccess.h" #include "QLineF" namespace OcSituationServer { namespace DataBuilder { QByteArray getByteStreamAesItem(const AreaEffectSimulation::EffectCluster &effectCluster, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtExplosionCluster); // we send EffectCluster as ExplosionCluster addAesItemId(byteStream, effectCluster.id()); addName(byteStream, effectCluster.name()); addEffectStart(byteStream, effectCluster.effectStart().is_set() ? effectCluster.effectStart().get() : -1); addEffectDuration(byteStream, effectCluster.effectDuration()); addArea(byteStream, effectCluster.area()); addMhpCount(byteStream, static_cast(effectCluster.effectors().size())); addMhpRotation(byteStream, effectCluster.effectors().size() ? effectCluster.effectors()[0].mhpRotation() : 1); addImpactCount(byteStream, static_cast(effectCluster.effectors().size())); addChargeTypeId(byteStream, effectCluster.chargeStruct().chargeTypeId()); addPartyId(byteStream, effectCluster.partyId().is_set() ? effectCluster.partyId().get() : -1); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::NContamination &nContamination, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtNContamination); addAesItemId(byteStream, nContamination.id()); addName(byteStream, nContamination.name()); addEffectStart(byteStream, nContamination.effectStart().is_set() ? nContamination.effectStart().get() : -1); addEffectDuration(byteStream, nContamination.effectDuration()); addChargeTypeId(byteStream, nContamination.chargeStruct().chargeTypeId()); addImpactPosition(byteStream, nContamination.impactPosition()); addBorderLengthInner(byteStream, nContamination.borderLengthInner()); addBorderLengthOuter(byteStream, nContamination.borderLengthOuter()); addImpactRadius(byteStream, nContamination.impactRadius()); addSpanAngle(byteStream, nContamination.spanAngle()); addRotationAngle(byteStream, nContamination.rotationAngle()); addDetonationValue(byteStream, nContamination.detonationValue()); addPartyId(byteStream, nContamination.partyId().is_set() ? nContamination.partyId().get() : -1); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::BCContamination &bCContamination, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtBCContamination); addAesItemId(byteStream, bCContamination.id()); addName(byteStream, bCContamination.name()); addEffectStart(byteStream, bCContamination.effectStart().is_set() ? bCContamination.effectStart().get() : -1); addEffectDuration(byteStream, bCContamination.effectDuration()); addChargeTypeId(byteStream, bCContamination.chargeStruct().chargeTypeId()); addImpactPosition(byteStream, bCContamination.impactPosition()); addImpactRadius(byteStream, bCContamination.impactRadius()); addPartyId(byteStream, bCContamination.partyId().is_set() ? bCContamination.partyId().get() : -1); addPropagationDirection(byteStream, bCContamination.propagationDirection()); addWindSpeed(byteStream, bCContamination.windSpeed()); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::ExplosionArea &explosionArea, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtExplosionArea); addAesItemId(byteStream, explosionArea.id()); addName(byteStream, explosionArea.name()); addEffectStart(byteStream, explosionArea.effectStart().is_set() ? explosionArea.effectStart().get() : -1); addEffectDuration(byteStream, explosionArea.effectDuration()); addChargeTypeId(byteStream, explosionArea.chargeStruct().chargeTypeId()); addArea(byteStream, explosionArea.area()); addPartyId(byteStream, explosionArea.partyId().is_set() ? explosionArea.partyId().get() : -1); addCannonCount(byteStream, explosionArea.cannonCount()); addCannonRounds(byteStream, explosionArea.cannonRounds()); addFireRequestTime(byteStream, explosionArea.fireRequestTime()); addAltitude(byteStream, explosionArea.altitude()); addPurpose(byteStream, explosionArea.purpose()); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::ExplosionSingle &explosionSingle, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtExplosionSingle); addAesItemId(byteStream, explosionSingle.id()); addName(byteStream, explosionSingle.name()); addEffectStart(byteStream, explosionSingle.effectStart().is_set() ? explosionSingle.effectStart().get() : -1); addChargeTypeId(byteStream, explosionSingle.chargeStruct().chargeTypeId()); addImpactPosition(byteStream, explosionSingle.impactPosition()); addPartyId(byteStream, explosionSingle.partyId().is_set() ? explosionSingle.partyId().get() : -1); addFireRequestTime(byteStream, explosionSingle.fireRequestTime()); addAltitude(byteStream, explosionSingle.altitude()); addPurpose(byteStream, explosionSingle.purpose()); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::MineArea &mineArea, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtMineArea); addAesItemId(byteStream, mineArea.id()); addName(byteStream, mineArea.name()); addEffectStart(byteStream, mineArea.effectStart().is_set() ? mineArea.effectStart().get() : -1); addEffectDuration(byteStream, mineArea.effectDuration()); addDensity(byteStream, mineArea.density()); addWidth(byteStream, mineArea.width()); addChargeTypeId(byteStream, mineArea.chargeStruct().chargeTypeId()); addPartyId(byteStream, mineArea.partyId().is_set() ? mineArea.partyId().get() : -1); addAesMaLayingProcedureType(byteStream, mineArea.layingProcedureType()); addIsLayedHidden(byteStream, mineArea.isLaidHidden()); addIsCenterLine(byteStream, mineArea.isCenterLine()); addSegments(byteStream, mineArea.segments()); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::FunctionalArea &functionalArea, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtFunctionalArea); addAesItemId(byteStream, functionalArea.id()); addName(byteStream, functionalArea.name()); addEffectStart(byteStream, functionalArea.effectStart().is_set() ? functionalArea.effectStart().get() : -1); addEffectDuration(byteStream, functionalArea.effectDuration()); addChargeTypeId(byteStream, functionalArea.chargeStruct().chargeTypeId()); addArea(byteStream, functionalArea.area()); addPartyId(byteStream, functionalArea.partyId().is_set() ? functionalArea.partyId().get() : -1); addPointSymbol(byteStream, functionalArea.pointSymbol().is_set() ? functionalArea.pointSymbol().get() : std::string()); addFunctionalAreaTypeId(byteStream, functionalArea.functionalAreaTypeId()); addDeconMode(byteStream, functionalArea.deconMode()); addDeconTime(byteStream, functionalArea.deconTime()); addMaintMode(byteStream, functionalArea.maintMode()); addMaintTime(byteStream, functionalArea.maintTime()); addMedicMode(byteStream, functionalArea.medicMode()); addMedicTime(byteStream, functionalArea.medicTime()); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::BoobyTrap &boobyTrap, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtBoobyTrap); addAesItemId(byteStream, boobyTrap.id()); addName(byteStream, boobyTrap.name()); addEffectDuration(byteStream, boobyTrap.effectDuration()); addChargeTypeId(byteStream, boobyTrap.chargeStruct().chargeTypeId()); addImpactPosition(byteStream, boobyTrap.impactPosition()); addImpactRadius(byteStream, boobyTrap.impactRadius()); addTriggerRadius(byteStream, boobyTrap.triggerRadius()); addRotationAngle(byteStream, boobyTrap.rotationAngle().is_set() ? boobyTrap.rotationAngle().get() : -1); addCentralAngle(byteStream, boobyTrap.centralAngle().is_set() ? boobyTrap.centralAngle().get() : -1); addEffectStart(byteStream, boobyTrap.effectStart().is_set() ? boobyTrap.effectStart().get() : -1); addPartyId(byteStream, boobyTrap.partyId().is_set() ? boobyTrap.partyId().get() : -1); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::OffRouteMine &offRouteMine, bool &isPrioritized) { QByteArray byteStream; isPrioritized = false; addAesType(byteStream, AreaEffectSimulation::AesType::AtOffRouteMine); addAesItemId(byteStream, offRouteMine.id()); addName(byteStream, offRouteMine.name()); addEffectDuration(byteStream, offRouteMine.effectDuration()); addChargeTypeId(byteStream, offRouteMine.chargeStruct().chargeTypeId()); addArea(byteStream, offRouteMine.area()); addImpactRadius(byteStream, offRouteMine.impactRadius().is_set() ? offRouteMine.impactRadius().get() : -1); addEffectStart(byteStream, offRouteMine.effectStart().is_set() ? offRouteMine.effectStart().get() : -1); addPartyId(byteStream, offRouteMine.partyId().is_set() ? offRouteMine.partyId().get() : -1); return byteStream; } QByteArray getByteStreamAesItem(const AreaEffectSimulation::ExplosionCluster &explosionCluster, bool &isPrioritized) { QByteArray byteStream; addAesType(byteStream, AreaEffectSimulation::AesType::AtExplosionCluster); addAesItemId(byteStream, explosionCluster.id()); addName(byteStream, explosionCluster.name()); addEffectStart(byteStream, explosionCluster.effectStart().is_set() ? explosionCluster.effectStart().get() : -1); addEffectDuration(byteStream, explosionCluster.effectDuration()); addArea(byteStream, explosionCluster.area()); addMhpCount(byteStream, static_cast(explosionCluster.mhPoints().size())); addMhpRotation(byteStream, explosionCluster.mhpRotation()); addImpactCount(byteStream, explosionCluster.impactCount()); addChargeTypeId(byteStream, explosionCluster.chargeStruct().chargeTypeId()); addPartyId(byteStream, explosionCluster.partyId().is_set() ? explosionCluster.partyId().get() : -1); isPrioritized = explosionCluster.impactCount() == 1; // we prioritize every single fire return byteStream; } void addAesItemId(QByteArray &buf, int32_t aesItemId) { LtsUtils::set4Byte(aesItemId, buf); } void addAesMaLayingProcedureType(QByteArray &buf, const AreaEffectSimulation::AesMaLayingProcedureType &aesMaLayingProcedureType) { addDdsEnumVal(buf, aesMaLayingProcedureType); } void addAesType(QByteArray &buf, const AreaEffectSimulation::AesType &aesType) { using namespace AreaEffectSimulation; // we treat EffectClusters as ExplosionClusters addDdsEnumVal(buf, aesType == AesType::inner_enum::AtEffectCluster ? AesType::inner_enum::AtExplosionCluster : aesType); } void addAltitude(QByteArray &buf, int32_t altitude) { LtsUtils::set4Byte(altitude, buf); } void addArea(QByteArray &buf, const AreaEffectSimulation::Area &area) { addPosition2D(buf, area.cornerBottomLeft()); LtsUtils::set8Byte(area.width(), buf); LtsUtils::set8Byte(area.height(), buf); LtsUtils::set8Byte(area.rotation(), buf); } void addBorderLengthInner(QByteArray &buf, double borderLengthInner) { LtsUtils::set8Byte(borderLengthInner, buf); } void addBorderLengthOuter(QByteArray &buf, double borderLengthOuter) { LtsUtils::set8Byte(borderLengthOuter, buf); } void addCannonCount(QByteArray &buf, int32_t cannonCount) { LtsUtils::set4Byte(cannonCount, buf); } void addCannonRounds(QByteArray &buf, int32_t cannonRounds) { LtsUtils::set4Byte(cannonRounds, buf); } void addCentralAesChangeType(QByteArray &buf, OcSituation::CentralAesChangeType changeType) { LtsUtils::set1Byte(changeType, buf); } void addCentralAngle(QByteArray &buf, double centralAngle) { LtsUtils::set8Byte(centralAngle, buf); } void addChargeTypeId(QByteArray &buf, int32_t chargeType) { LtsUtils::set4Byte(chargeType, buf); } template void addDdsEnumVal(QByteArray &buf, const T &ddsEnumVal) { LtsUtils::set4Byte(static_cast(ddsEnumVal.underlying()), buf); } void addDeconMode(QByteArray &buf, const AreaEffectSimulation::AesOperatingMode &deconMode) { addDdsEnumVal(buf, deconMode); } void addDeconTime(QByteArray &buf, int32_t deconTime) { LtsUtils::set4Byte(deconTime, buf); } void addDensity(QByteArray &buf, double density) { LtsUtils::set8Byte(density, buf); } void addDetonationValue(QByteArray &buf, double detonationValue) { LtsUtils::set8Byte(detonationValue, buf); } void addEffectDuration(QByteArray &buf, int32_t effectDuration) { LtsUtils::set4Byte(effectDuration, buf); } void addEffectStart(QByteArray &buf, rti::core::int64 effectStart) { LtsUtils::set8Byte(effectStart, buf); } void addExplosionGeometry(QByteArray &buf, const AreaEffectSimulation::AesExplosionGeometry &explosionGeometry) { addDdsEnumVal(buf, explosionGeometry); } void addFireRequestTime(QByteArray &buf, rti::core::int64 fireRequestTime) { LtsUtils::set8Byte(fireRequestTime, buf); } void addIgniterType(QByteArray &buf, int32_t igniterTypeId) { LtsUtils::set4Byte(igniterTypeId, buf); } void addFunctionalAreaTypeId(QByteArray &buf, int32_t functionalAreaTypeId) { LtsUtils::set4Byte(functionalAreaTypeId, buf); } void addImpactCount(QByteArray &buf, int32_t impactCount) { LtsUtils::set4Byte(impactCount, buf); } void addImpactPosition(QByteArray &buf, const Core::GeoPosition2D &position) { addPosition2D(buf, position); } void addImpactRadius(QByteArray &buf, double impactRadius) { LtsUtils::set8Byte(impactRadius, buf); } void addIsCenterLine(QByteArray &buf, bool isCenterLine) { LtsUtils::set1Byte(isCenterLine, buf); } void addIsLayedHidden(QByteArray &buf, bool isLayedHidden) { LtsUtils::set1Byte(isLayedHidden, buf); } void addMaintMode(QByteArray &buf, const AreaEffectSimulation::AesOperatingMode &maintMode) { addDdsEnumVal(buf, maintMode); } void addMaintTime(QByteArray &buf, int32_t maintTime) { LtsUtils::set4Byte(maintTime, buf); } void addMedicMode(QByteArray &buf, const AreaEffectSimulation::AesOperatingMode &medicMode) { addDdsEnumVal(buf, medicMode); } void addMedicTime(QByteArray &buf, int32_t medicTime) { LtsUtils::set4Byte(medicTime, buf); } void addMhpCount(QByteArray &buf, int32_t mhpCount) { LtsUtils::set4Byte(mhpCount, buf); } void addMhpRotation(QByteArray &buf, double mhpRotation) { LtsUtils::set8Byte(mhpRotation, buf); } void addName(QByteArray &buf, const std::string &name) { addString(buf, name, 8); } void addPartyId(QByteArray &buf, int32_t partyId) { LtsUtils::set4Byte(partyId, buf); } void addPointSymbol(QByteArray &buf, const std::string &pointSymbol) { addString(buf, pointSymbol, pointSymbol.length()); } void addPosition2D(QByteArray &buf, const Core::GeoPosition2D &position) { LtsUtils::set8Byte(position.lon(), buf); LtsUtils::set8Byte(position.lat(), buf); // no timestamp, as it is set in the client anyway } void addPurpose(QByteArray &buf, const std::string &purpose) { addString(buf, purpose); } void addRotationAngle(QByteArray &buf, double rotationAngle) { LtsUtils::set8Byte(rotationAngle, buf); } void addSegments(QByteArray &buf, const std::vector &segments) { unsigned char len = segments.size() + 1; LtsUtils::set1Byte(len, buf); if (len == 1) return; AreaEffectSimulation::MineSegment lastSeg; for (const AreaEffectSimulation::MineSegment ¤tMineSegment : qAsConst(segments)) { addPosition2D(buf, currentMineSegment.positionStart()); lastSeg = currentMineSegment; } addPosition2D(buf, lastSeg.positionEnd()); } void addSpanAngle(QByteArray &buf, double spanAngle) { LtsUtils::set8Byte(spanAngle, buf); } void addString(QByteArray &buf, const std::string &str, size_t maxLen) { unsigned char len = std::min(str.size(), size_t(maxLen)); LtsUtils::set1Byte(len, buf); buf.append(str.c_str(), len); } void addTriggerRadius(QByteArray &buf, double triggerRadius) { LtsUtils::set8Byte(triggerRadius, buf); } void addWidth(QByteArray &buf, double width) { LtsUtils::set8Byte(width, buf); } void addPropagationDirection(QByteArray &buf, double propagationDirection) { LtsUtils::set8Byte(propagationDirection, buf); } void addWindSpeed(QByteArray &buf, double windSpeed) { LtsUtils::set8Byte(windSpeed, buf); } } // namespace DataBuilder } // namespace OcSituationServer