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