Files
qt5-legatus-legacy/Lts/Proxies/TrainingAreaBaseOC/send_to_dds.cpp
T
2026-08-13 18:33:10 +02:00

178 lines
5.0 KiB
C++
Executable File

/**
* Handle incoming ETS SFM Telegrams and convert them to dds data topics
* $Id$
* $HeadURL$
* $Author$
* Created by Philipp Dassow, NLST, 2018-01-23
*/
#include "send_to_dds.h"
#include <QPointF>
#include "main_handler.h"
namespace TrainingAreaBaseOC
{
SendToDds::SendToDds(MainHandler *mainHandler)
: m_dtsTaboc(mainHandler->dds()->dtsTaboc())
, m_dtsTab(mainHandler->dds()->dtsTab())
, m_utmCoord(LtsCoordTrans::UtmCoordinate())
, m_idToSend(1)
, m_logger(getLogger("EtsRxDds"))
{}
void SendToDds::rxData(const OcTelegrams::Display &inData)
{
if (0 == inData.multiplexer)
{
TrainingAreaBaseOC::ShortMessage outData;
outData.id(m_idToSend++);
outData.textType(static_cast<long>(inData.textType));
outData.indexVbg(inData.indexVbg);
outData.indexVba(inData.indexVba);
outData.timeStamp(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch());
m_dtsTaboc->publish(outData);
}
else
{
TrainingAreaBaseOC::FreeText outData;
outData.id(m_idToSend++);
outData.text(inData.text.data());
outData.timeStamp(QDateTime::currentDateTimeUtc().toMSecsSinceEpoch());
m_dtsTaboc->publish(outData);
}
}
void SendToDds::rxData(const OcTelegrams::TimeSync &inData)
{
TrainingAreaBaseOC::TimeSync outData;
outData.id(1);
outData.gpsTime(inData.gpsTimeMsec);
outData.timezone(inData.timezone);
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const OcTelegrams::SpecificsExercise &inData)
{
m_utmCoord = LtsCoordTrans::UtmCoordinate::fromMgrs(QString::number(inData.zone) +
QLatin1Char(inData.band) +
QString::fromLatin1(inData.square) +
QString::number(inData.northing).rightJustified(7, QLatin1Char('0')) +
QString::number(inData.easting).rightJustified(7, QLatin1Char('0')));
TrainingAreaBaseOC::SpecificsExercise outData;
outData.id(1);
outData.exerciseId(inData.exerciseId);
outData.zone(inData.zone);
outData.band(inData.band);
outData.square(inData.square.data());
outData.easting(inData.easting);
outData.northing(inData.northing);
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const OcTelegrams::SpecificsEquipment &inData)
{
TrainingAreaBaseOC::SpecificsEquipment outData;
outData.id(1);
outData.equipmentNumber(inData.equipmentNumber);
outData.playerType(inData.playerType);
outData.language(static_cast<ProjectDataManagement::LanguageConfiguration::inner_enum>(inData.language));
outData.pyrotechnics(inData.pyrotechnics);
outData.voiceOutput(inData.voiceOutput);
outData.exerciseBreak(inData.exerciseBreak);
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const OcTelegrams::TechnicalStateSfm &inData)
{
TrainingAreaBaseOC::TechnicalStateSfm outData;
outData.id(1);
outData.sfmConnected(inData.sfmConnected);
outData.radioAvailable(inData.radioAvailable);
outData.licensed(inData.licensed);
outData.timeStamp(inData.gpsTimeMsec);
outData.batteryTest(inData.batteryTest);
outData.manipulationEquipment(inData.manipulationEquipment);
outData.manipulationSfm(inData.manipulationSfm);
outData.errorCode(inData.errorCode);
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const OcTelegrams::EnterLeaveAes &inData)
{
TrainingAreaBaseOC::EnterLeaveAes outData;
outData.id(1);
outData.aesId(inData.aesId);
outData.aesEntered(inData.aesEntered);
outData.abcArea(inData.nbcArea);
outData.chargeTypeId(inData.chargeTasCode);
outData.cAreaType(inData.cAreaType);
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const OcTelegrams::OwnPosition &inData)
{
TrainingAreaBaseOC::OwnPosition outData;
outData.id(1);
outData.valid(inData.valid);
outData.timeStamp(inData.gpsTimeMsec); // gpstime is set to currentPartitionTime in canag_handler.cpp
if (inData.valid)
{
const QPointF point(m_utmCoord.geographic(inData.easting, inData.northing));
outData.position(Core::GeoPosition(point.x(), point.y(), 0));
}
else
outData.position(Core::GeoPosition(nan(""), nan(""), 0));
m_dtsTaboc->publish(outData);
}
void SendToDds::rxData(const TrainingAreaBase::TetraIcd::OpaquePayloadDataBase &inData)
{
switch (inData.payloadType)
{
case TrainingAreaBase::TetraIcd::OpaquePayloadDataBase::Type::OC:
{
TrainingAreaBase::OcData outData;
outData.equipmentNumber(1);
outData.payload(inData.payload);
m_dtsTab->publish(outData);
break;
}
case TrainingAreaBase::TetraIcd::OpaquePayloadDataBase::Type::FireSmokeMarker:
{
TrainingAreaBase::FireSmokeMarkerData outData;
outData.equipmentNumber(1);
outData.payload(inData.payload);
m_dtsTab->publish(outData);
break;
}
default:
{
ERROR_LOG(m_logger) << "Received unhandled TrainingAreaBase::TetraIcd::OpaquePayloadDataBase::Type " << static_cast<int>(inData.payloadType);
break;
}
}
}
} // namespace TrainingAreaBaseOC