File indexing completed on 2024-06-16 03:42:44
0001 /* 0002 File : CANFilterPrivate.h 0003 Project : LabPlot 0004 Description : Private implementation class for CANFilter. 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2023 <martin.marmsoler@gmail.com> 0007 0008 SPDX-License-Identifier: GPL-3.0-or-later 0009 */ 0010 #ifndef CANFILTERPRIVATE_H 0011 #define CANFILTERPRIVATE_H 0012 0013 #include <QList> 0014 0015 #include "AbstractFileFilter.h" 0016 #include "CANFilter.h" 0017 #include "DBCParser.h" 0018 #include <cmath> 0019 0020 class AbstractDataSource; 0021 class CANFilter; 0022 0023 class CANFilterPrivate { 0024 public: 0025 explicit CANFilterPrivate(CANFilter*); 0026 virtual ~CANFilterPrivate() { 0027 } 0028 QVector<QStringList> preview(const QString& fileName, int lines); 0029 int readDataFromFile(const QString& fileName, 0030 AbstractDataSource* = nullptr, 0031 AbstractFileFilter::ImportMode = AbstractFileFilter::ImportMode::Replace, 0032 int lines = -1); 0033 0034 /*! 0035 * \brief readDataFromFile 0036 * Read data from file and store them in the datacontainer \p m_dataContainer 0037 * \param fileName 0038 * \param lines 0039 * \return number of messages read 0040 */ 0041 int readDataFromFile(const QString& fileName, int lines = -1); 0042 void write(const QString& fileName, AbstractDataSource*); 0043 bool setDBCFile(const QString& filename); 0044 0045 virtual bool isValid(const QString&) const = 0; 0046 virtual QStringList lastErrors() const = 0; 0047 0048 const QVector<AbstractColumn::ColumnMode> columnModes(); 0049 0050 void clearParseState(); 0051 0052 const CANFilter* q; 0053 0054 DbcParser::Signals m_signals; 0055 0056 QString currentDataSetName; 0057 int startRow{1}; 0058 int endRow{-1}; 0059 int startColumn{1}; 0060 int endColumn{-1}; 0061 CANFilter::TimeHandling timeHandlingMode{CANFilter::TimeHandling::ConcatPrevious}; 0062 bool convertTimeToSeconds{true}; 0063 0064 private: 0065 virtual int readDataFromFileCommonTime(const QString& fileName, int lines = -1) = 0; 0066 virtual int readDataFromFileSeparateTime(const QString& fileName, int lines = -1) = 0; 0067 0068 protected: 0069 DbcParser m_dbcParser; 0070 struct DataContainer { 0071 void clear(); 0072 0073 template<class T> 0074 void appendVector(QVector<T>* data, AbstractColumn::ColumnMode cm) { 0075 m_dataContainer.push_back(data); 0076 m_columnModes.append(cm); 0077 } 0078 0079 template<class T> 0080 void setData(int indexDataContainer, int indexData, T value) { 0081 static_cast<QVector<T>*>(m_dataContainer.at(indexDataContainer))->operator[](indexData) = value; 0082 } 0083 0084 template<class T> 0085 T data(int indexDataContainer, int indexData) { 0086 return static_cast<QVector<T>*>(m_dataContainer.at(indexDataContainer))->at(indexData); 0087 } 0088 0089 size_t size() const; 0090 const QVector<AbstractColumn::ColumnMode> columnModes() const; 0091 0092 /*! 0093 * \brief dataContainer 0094 * Do not modify outside as long as DataContainer exists! 0095 * \return 0096 */ 0097 std::vector<void*> dataContainer() const; 0098 AbstractColumn::ColumnMode columnMode(int index) const; 0099 const void* datas(size_t index) const; 0100 bool resize(uint32_t) const; 0101 0102 private: 0103 QVector<AbstractColumn::ColumnMode> m_columnModes; 0104 std::vector<void*> m_dataContainer; // pointers to the actual data containers 0105 }; 0106 0107 DataContainer m_DataContainer; 0108 0109 struct ParseState { 0110 ParseState() { 0111 } 0112 ParseState(int requestedLines, int readLines) 0113 : ready(true) 0114 , requestedLines(requestedLines) 0115 , readLines(readLines) { 0116 } 0117 bool ready{false}; // If true m_DataContainer is up to date and it is not needed to update 0118 int requestedLines{0}; // Lines requested during read 0119 int readLines{0}; // Lines after read (Because file does not contain that much messages, a lot of message are not parsable, ...) 0120 }; 0121 0122 ParseState m_parseState; 0123 friend class BLFFilterTest; 0124 friend class CANFilter; 0125 }; 0126 0127 #endif // CANFILTERPRIVATE_H