/** * 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::AtEffectCluster ? AesType::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), 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