/** * 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 #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(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(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(inData.payloadType); break; } } } } // namespace TrainingAreaBaseOC