232 lines
6.8 KiB
C++
Executable File
232 lines
6.8 KiB
C++
Executable File
/**
|
|
* @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 <LtsUtilsCore/qbytearray_byteaccess.h>
|
|
|
|
|
|
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<const char *>(&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<const char *>(&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<const char *>(&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<const char *>(&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<const char *>(&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<uint8_t> &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<const char *>(&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
|