/** * @RDE_HEADER@ * MeteoDataManagement - Static Meteo Data Edit Dialog * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-10-17 */ #include "esc_convert_from_tab.h" #include namespace EffectShowClient { namespace ConvertFromTab { //============================================================================= RxTelegram_e isTelegram(const TrainingAreaBase::FireSmokeMarkerData &data) { if (data.payload().size() == 0) return RxTelegram_e::unknown; switch (data.payload().at(0)) { case 150: return RxTelegram_e::EffectShowOrder; case 155: return RxTelegram_e::RelocationOrder; case 152: return RxTelegram_e::EffectShowStop; case 151: return RxTelegram_e::EffectShowContinue; case 153: return RxTelegram_e::OrderRetract; case 154: return RxTelegram_e::StatusRequest; case 156: return RxTelegram_e::MeteoData; } return RxTelegram_e::unknown; } static inline Core::GeoPosition2D convertGeoPos(const QByteArray &tele, size_t &k) { double lon, lat; LtsUtils::get8Byte(tele, k, lon); LtsUtils::get8Byte(tele, k, lat); return Core::GeoPosition2D(lon, lat); } //============================================================================= EffectShowOrder_t convertEffectShowOrder(const TrainingAreaBase::FireSmokeMarkerData &data) { EffectShowOrder_t effectShowOrder; if (data.payload().size() == 0) return effectShowOrder; Q_ASSERT(data.payload().size() != 48); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); size_t k = 1; LtsUtils::get2Byte(tele, k, effectShowOrder.idEffectShow); uint64_t tmp; LtsUtils::get4Byte(tele, k, tmp); // interpret as unsigned effectShowOrder.startTime = tmp; effectShowOrder.centerPosition = convertGeoPos(tele, k); LtsUtils::get1Byte(tele, k, tmp); effectShowOrder.areaWidth = tmp; LtsUtils::get1Byte(tele, k, tmp); effectShowOrder.areaDepth = tmp; // 50m squares effectShowOrder.areaWidth *= 50; effectShowOrder.areaDepth *= 50; qint16 angle; LtsUtils::get2Byte(tele, k, angle); effectShowOrder.rotation = double(angle) * 0.01; effectShowOrder.lowerLeftPosition = convertGeoPos(tele, k); LtsUtils::get1Byte(tele, k, effectShowOrder.numOfVolley); LtsUtils::get1Byte(tele, k, effectShowOrder.shotsInTotal); LtsUtils::get1Byte(tele, k, effectShowOrder.typeOfAmmunition); LtsUtils::get2Byte(tele, k, tmp); effectShowOrder.duration = tmp; const size_t len = tele.size(); QByteArray ba; while (k < len) ba += tele.at(k++); effectShowOrder.name = QString::fromUtf8(ba); return effectShowOrder; } //============================================================================= RelocationOrder_t convertRelocationOrder(const TrainingAreaBase::FireSmokeMarkerData &data) { RelocationOrder_t relocationOrder; if (data.payload().size() == 0) return relocationOrder; Q_ASSERT(data.payload().size() >= 7); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); size_t k = 1; LtsUtils::get2Byte(tele, k, relocationOrder.idRelocation); uint64_t tmp; LtsUtils::get4Byte(tele, k, tmp); // interpret as unsigned relocationOrder.executionTime = tmp; relocationOrder.centerPosition = convertGeoPos(tele, k); const size_t len = tele.size(); QByteArray ba; while (k < len) ba += tele.at(k++); relocationOrder.infoText = QString::fromUtf8(ba); return relocationOrder; } //============================================================================= int convertEffectShowStop(const TrainingAreaBase::FireSmokeMarkerData &data) { int idEffectShow = 0; if (data.payload().size() == 0) return idEffectShow; Q_ASSERT(data.payload().size() != 3); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); size_t k = 1; LtsUtils::get2Byte(tele, k, idEffectShow); return idEffectShow; } //============================================================================= EffectShowContinue_t convertEffectShowContinue(const TrainingAreaBase::FireSmokeMarkerData &data) { EffectShowContinue_t effectShowContinue; if (data.payload().size() == 0) return effectShowContinue; Q_ASSERT(data.payload().size() != 7); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); size_t k = 1; LtsUtils::get2Byte(tele, k, effectShowContinue.idEffectShow); uint64_t tmp; LtsUtils::get4Byte(tele, k, tmp); // interpret as unsigned effectShowContinue.executionTime = tmp; return effectShowContinue; } //============================================================================= OrderRetract_t convertOrderRetract(const TrainingAreaBase::FireSmokeMarkerData &data) { OrderRetract_t orderRetract; if (data.payload().size() == 0) return orderRetract; Q_ASSERT(data.payload().size() != 4); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); size_t k = 1; LtsUtils::get1Byte(tele, k, orderRetract.orderType); LtsUtils::get2Byte(tele, k, orderRetract.id); return orderRetract; } //============================================================================= bool convertStatusRequest(const TrainingAreaBase::FireSmokeMarkerData &data) { if (data.payload().size() <2) return false; Q_ASSERT(data.payload().size() != 2); const std::vector &tele = data.payload(); return (tele.at(1) == 154); } //============================================================================= EffectShowClient::MeteoNearVehicle convertMeteoData(const TrainingAreaBase::FireSmokeMarkerData &data) { EffectShowClient::MeteoNearVehicle meteoData; if (data.payload().size() == 0) { meteoData.isValid(false); return meteoData; } Q_ASSERT(data.payload().size() != 11); const QByteArray tele(QByteArray::fromRawData( reinterpret_cast(&data.payload().at(0)), data.payload().size())); qint16 word = 0; size_t k = 1; LtsUtils::get2Byte(tele, k, word); meteoData.temperature(double(word) / 10.0); LtsUtils::get2Byte(tele, k, word); meteoData.humidity(double(word)); LtsUtils::get2Byte(tele, k, word); meteoData.pressure(double(word)); LtsUtils::get2Byte(tele, k, word); meteoData.windDirection(double(word) * 0.01); LtsUtils::get2Byte(tele, k, word); meteoData.windSpeed(double(word)); meteoData.isValid(true); return meteoData; } } // namespace ConvertFromTab } // namespace EffectShowClient