#pragma once #include "LogViewXdrStandardType.hpp" #include "LogViewField.hpp" #include #include #include #include namespace N_CoPrtCnv { class CoPrtCnvRadioTelegram; } namespace N_LogView { struct StructInformation; struct MemberInformation; class LogViewTetraTelegramsParser; class LogViewXdrParser; class LogViewXdrType; class LogViewTelegram final { public: enum E_Validity { e_NotYetEvaluated, e_Valid, e_Invalid }; enum E_Column { e_ColName, e_ColGpsTime, e_ColLogTime, e_ColJsonData, e_ColMax }; ~LogViewTelegram(); static const uint16_t SIZE_CENTRAL_DYN_ARRAY_SIZE; LogViewTelegram(const LogViewTelegram &o); LogViewTelegram &operator=(const LogViewTelegram &o) = delete; LogViewTelegram(const N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol a_destination, int telegramId); LogViewTelegram(const N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol a_destination, const quint64 a_unixTime, const QByteArray &a_telegramData); void setUIntX(const uint8_t a_size, quint64 a_value, const LogViewXdrStandardType::E_ByteOrder a_byteOrder = LogViewXdrStandardType::e_ByteOrderBigEndian); bool setData(const uint16_t a_offset, const uint8_t a_data); quint64 getLogTime() const { return m_LogTime; } quint64 getLogTimeMsec() const; QString getLogTimeText() const; QString getDestinationText() const; quint64 getGpsTime() const { return m_GpsTime; } QString getGpsTimeText() const; uint32_t getISSI() const { return m_ISSI; } int getParticipantId() const { return m_ParticipantId; } int32_t getDelay() const; QString getToolTipText(const E_Column a_col); void resetOffset(); LogViewField* getFieldTree(); void dump() const; QString getStructName() const; bool isValid(); N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol getDestination() const { return m_Destination; } N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol getDirection() const; N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol getProtocol() const { return m_Protocol; } int getTelId() const { return m_TelId; } QIcon getIcon() const; bool isJsonTelegram() const { return N_CoPrtCnv::CoPrtCnvLogHeader::e_DestProtocolCentral == m_Protocol; } void clearJsonData() { m_json.remove(QStringLiteral("data")); } void rebuildJsonString() { if (!m_json.isEmpty()) m_data.clear(); } void setJsonValue(const QStringList &path, const QJsonValue &val); QJsonObject jsonData() const { return m_json; } void updateJsonValue(const QStringList &path, const QJsonValue &newVal, QJsonObject &obj); void updateJsonValue(const QStringList &path, const QJsonValue &newVal, QJsonArray &arr); const N_CoPrtCnv::CoPrtCnvRadioTelegram* getTetraTelegram() const; static LogViewTetraTelegramsParser *jsonParser(); static LogViewXdrParser *tetraParser(); QByteArray getData(QJsonDocument::JsonFormat format = QJsonDocument::JsonFormat::Compact) const; uint32_t getWaitTime() const { return m_WaitTime; } void setWaitTime(uint32_t newVal) { m_WaitTime = newVal; } QString getName() const { return m_Name; } void setName(const QString &newVal) { m_Name = newVal; } void setNextFieldAsGpsTimeField(); QVector getGpsTimeField() const { return m_GpsFieldOffset; } void setGpsTimeField(const QVector &gpsFieldOffset) { m_GpsFieldOffset = gpsFieldOffset; } void actualizeGpsTime(); void createToolTipTextForColName(); static double xdrToDouble(quint64 in); static float xdrToFloat(uint32_t in); static quint64 doubleToXdr(double in); static uint32_t floatToXdr(float in); protected: QString m_Name; std::vector m_ToolTipText; uint32_t m_WaitTime; int m_ParticipantId; uint32_t m_ISSI; int m_AllocatedSize; static const LogViewXdrParser* m_Parser; uint16_t m_ActOffset; QVector m_GpsFieldOffset; int m_TelId; uint32_t m_LastUnsignedValue; uint16_t m_MaxArraySize; static const uint16_t START_OFFSET_CENTRAL; static const uint16_t POS_CENTRAL_COUNTER; static const uint16_t POS_CENTRAL_TELID; static const uint16_t POS_CENTRAL_PARTICIPANTID; static const uint16_t START_OFFSET_TETRA_REGISTER; static const uint16_t START_OFFSET_TETRA_AIRLOAD; static const uint16_t START_OFFSET_TETRA_DATA; static const uint16_t START_OFFSET_TETRA_LOGIN; static const uint16_t START_OFFSET_TETRA_FRAGMENT; LogViewXdrStandardType::E_DynArraySizeMethod m_DynArraySizeMethod; N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol m_Destination; E_Validity m_Validity; N_CoPrtCnv::CoPrtCnvLogHeader::E_CoPrtCnvProtocol m_Protocol; quint64 m_LogTime; mutable QString m_logTimeText; quint64 m_GpsTime; QByteArray m_data; QJsonObject m_json; N_CoPrtCnv::CoPrtCnvRadioTelegram *m_TetraTelegram; LogViewField *getFieldTree(const QString& a_type, const QString& a_name, uint16_t a_arraySize, const LogViewXdrType* a_parentElement = nullptr, const bool a_hasContent = true); LogViewField *getFieldTreeJson(const QJsonValue &data, const QString &name, const StructInformation &si, const QStringList &objectPathBase); static void addFieldTreeStruct(const QJsonObject &parentObject, LogViewField *parent, const StructInformation &si, const QString &objectNameArrayHint, NGL::INGLLogger &logger); static void addFieldTreeJsonString(const QJsonValue &val, LogViewField *parent, const QString &name, bool isBinary, const QString &objectNameArrayHint, LogViewField::E_FieldKind fieldKind, NGL::INGLLogger &logger); static void addFieldTreeJsonPod(const QJsonValue &val, LogViewField *parent, const QString &name, const QString &type, const QString &objectNameArrayHint, LogViewField::E_FieldKind fieldKind, NGL::INGLLogger &logger); static void addFieldTreeJsonEnum(const QJsonValue &val, LogViewField *parent, const QString &name, const QString &type, const QString &objectNameArrayHint, LogViewField::E_FieldKind fieldKind, NGL::INGLLogger &logger); static QString typeFromStructInformation(const StructInformation &si, const QString &name); static MemberInformation memberFromStructInformation(const StructInformation &si, const QString &name); uint16_t getUInt16(const uint16_t a_offset) const; uint32_t getUInt32(const uint16_t a_offset) const; int32_t getInt32(const uint16_t a_offset) const; quint64 getUIntX(const uint16_t a_offset, const uint8_t a_size, const LogViewXdrStandardType::E_ByteOrder a_byteOrder = LogViewXdrStandardType::e_ByteOrderBigEndian) const; int32_t getSIntX(const uint16_t a_offset, const uint8_t a_size, const LogViewXdrStandardType::E_ByteOrder a_byteOrder = LogViewXdrStandardType::e_ByteOrderBigEndian) const; char getChar(const uint16_t a_offset, const uint8_t a_size) const; LogViewField* getContent(const LogViewXdrStandardType* a_standardType, uint16_t& a_offset, const uint16_t a_arraySize); bool isScalar(const LogViewXdrType* a_xdrType) const; void showMessageBox(const QString& a_errorText, const QString& a_title = QObject::tr("Invalid telegram")) const; uint16_t getDynArraySize(uint16_t& a_offset) const; static QString formatToolTipLine(const QString& a_name, const uint32_t a_value) { return formatToolTipLine(a_name, QString::number(a_value), a_value); } static QString formatToolTipLine(const QString& a_name, const QString& a_text, const uint32_t a_value); static QString formatToolTipLine(const QString& a_name, const std::string& a_text, const uint32_t a_value) { return formatToolTipLine(a_name, QString::fromStdString(a_text), a_value); } uint8_t getData(const uint16_t a_offset) const; private: NGL::INGLLogger &m_logger; friend class LogViewTabWidget; }; }