501 lines
16 KiB
C++
Executable File
501 lines
16 KiB
C++
Executable File
/**
|
|
* 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<int32_t>(effectCluster.effectors.size()));
|
|
addMhpRotation(byteStream, effectCluster.effectors.size() ? effectCluster.effectors[0].mhpRotation : 1);
|
|
addImpactCount(byteStream, static_cast<int32_t>(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<int32_t>(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<typename T>
|
|
void addDdsEnumVal(QByteArray &buf, const T &ddsEnumVal)
|
|
{
|
|
LtsUtils::set4Byte(static_cast<int32_t>(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<AreaEffectSimulation::MineSegment> &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
|