##// END OF EJS Templates
Generates vectors (3)...
Alexandre Leroux -
r786:595dafd656f6
parent child
Show More
@@ -1,164 +1,192
1 #include "CosinusProvider.h"
1 #include "CosinusProvider.h"
2 #include "MockDefs.h"
2 #include "MockDefs.h"
3
3
4 #include <Data/DataProviderParameters.h>
4 #include <Data/DataProviderParameters.h>
5 #include <Data/ScalarSeries.h>
5 #include <Data/ScalarSeries.h>
6 #include <Data/VectorSeries.h>
6 #include <Data/VectorSeries.h>
7
7
8 #include <cmath>
8 #include <cmath>
9
9
10 #include <QFuture>
10 #include <QFuture>
11 #include <QThread>
11 #include <QThread>
12 #include <QtConcurrent/QtConcurrent>
12 #include <QtConcurrent/QtConcurrent>
13
13
14 Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider")
14 Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider")
15
15
16 namespace {
16 namespace {
17
17
18 /// Abstract cosinus type
18 /// Abstract cosinus type
19 struct ICosinusType {
19 struct ICosinusType {
20 virtual ~ICosinusType() = default;
20 virtual ~ICosinusType() = default;
21 /// @return the number of components generated for the type
21 /// @return the number of components generated for the type
22 virtual int componentCount() const = 0;
22 virtual int componentCount() const = 0;
23 /// @return the data series created for the type
23 /// @return the data series created for the type
24 virtual std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
24 virtual std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
25 std::vector<double> valuesData,
25 std::vector<double> valuesData,
26 Unit xAxisUnit,
26 Unit xAxisUnit,
27 Unit valuesUnit) const = 0;
27 Unit valuesUnit) const = 0;
28 };
28 };
29
29
30 struct ScalarCosinus : public ICosinusType {
30 struct ScalarCosinus : public ICosinusType {
31 int componentCount() const override { return 1; }
31 int componentCount() const override { return 1; }
32
32
33 std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
33 std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
34 std::vector<double> valuesData, Unit xAxisUnit,
34 std::vector<double> valuesData, Unit xAxisUnit,
35 Unit valuesUnit) const override
35 Unit valuesUnit) const override
36 {
36 {
37 return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
37 return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
38 xAxisUnit, valuesUnit);
38 xAxisUnit, valuesUnit);
39 }
39 }
40 };
40 };
41 struct VectorCosinus : public ICosinusType {
41 struct VectorCosinus : public ICosinusType {
42 int componentCount() const override { return 3; }
42 int componentCount() const override { return 3; }
43
43
44 std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
44 std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
45 std::vector<double> valuesData, Unit xAxisUnit,
45 std::vector<double> valuesData, Unit xAxisUnit,
46 Unit valuesUnit) const override
46 Unit valuesUnit) const override
47 {
47 {
48 return std::make_shared<VectorSeries>(std::move(xAxisData), std::move(valuesData),
48 return std::make_shared<VectorSeries>(std::move(xAxisData), std::move(valuesData),
49 xAxisUnit, valuesUnit);
49 xAxisUnit, valuesUnit);
50 }
50 }
51 };
51 };
52
52
53 /// Converts string to cosinus type
54 /// @return the cosinus type if the string could be converted, nullptr otherwise
55 std::unique_ptr<ICosinusType> cosinusType(const QString &type) noexcept
56 {
57 if (type.compare(QStringLiteral("scalar"), Qt::CaseInsensitive) == 0) {
58 return std::make_unique<ScalarCosinus>();
59 }
60 else if (type.compare(QStringLiteral("vector"), Qt::CaseInsensitive) == 0) {
61 return std::make_unique<VectorCosinus>();
62 }
63 else {
64 return nullptr;
65 }
66 }
67
53 } // namespace
68 } // namespace
54
69
55 std::shared_ptr<IDataProvider> CosinusProvider::clone() const
70 std::shared_ptr<IDataProvider> CosinusProvider::clone() const
56 {
71 {
57 // No copy is made in clone
72 // No copy is made in clone
58 return std::make_shared<CosinusProvider>();
73 return std::make_shared<CosinusProvider>();
59 }
74 }
60
75
61 std::shared_ptr<IDataSeries> CosinusProvider::retrieveData(QUuid acqIdentifier,
76 std::shared_ptr<IDataSeries> CosinusProvider::retrieveData(QUuid acqIdentifier,
62 const SqpRange &dataRangeRequested,
77 const SqpRange &dataRangeRequested,
63 const QVariantHash &data)
78 const QVariantHash &data)
64 {
79 {
65 // TODO: Add Mutex
80 // TODO: Add Mutex
66 auto dataIndex = 0;
81 auto dataIndex = 0;
67
82
83 // Retrieves cosinus type
84 auto typeVariant = data.value(COSINUS_TYPE_KEY, COSINUS_TYPE_DEFAULT_VALUE);
85 if (!typeVariant.canConvert<QString>()) {
86 qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid type");
87 return nullptr;
88 }
89
90 auto type = cosinusType(typeVariant.toString());
91 if (!type) {
92 qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: unknown type");
93 return nullptr;
94 }
95
68 // Retrieves frequency
96 // Retrieves frequency
69 auto freqVariant = data.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE);
97 auto freqVariant = data.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE);
70 if (!freqVariant.canConvert<double>()) {
98 if (!freqVariant.canConvert<double>()) {
71 qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid frequency");
99 qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid frequency");
72 return nullptr;
100 return nullptr;
73 }
101 }
74
102
75 // Gets the timerange from the parameters
103 // Gets the timerange from the parameters
76 double freq = freqVariant.toDouble();
104 double freq = freqVariant.toDouble();
77 double start = std::ceil(dataRangeRequested.m_TStart * freq);
105 double start = std::ceil(dataRangeRequested.m_TStart * freq);
78 double end = std::floor(dataRangeRequested.m_TEnd * freq);
106 double end = std::floor(dataRangeRequested.m_TEnd * freq);
79
107
80 // We assure that timerange is valid
108 // We assure that timerange is valid
81 if (end < start) {
109 if (end < start) {
82 std::swap(start, end);
110 std::swap(start, end);
83 }
111 }
84
112
85 // Generates scalar series containing cosinus values (one value per second, end value is
113 // Generates scalar series containing cosinus values (one value per second, end value is
86 // included)
114 // included)
87 auto dataCount = end - start + 1;
115 auto dataCount = end - start + 1;
88
116
89 auto xAxisData = std::vector<double>{};
117 auto xAxisData = std::vector<double>{};
90 xAxisData.resize(dataCount);
118 xAxisData.resize(dataCount);
91
119
92 auto valuesData = std::vector<double>{};
120 auto valuesData = std::vector<double>{};
93 valuesData.resize(dataCount);
121 valuesData.resize(dataCount);
94
122
95 int progress = 0;
123 int progress = 0;
96 auto progressEnd = dataCount;
124 auto progressEnd = dataCount;
97 for (auto time = start; time <= end; ++time, ++dataIndex) {
125 for (auto time = start; time <= end; ++time, ++dataIndex) {
98 auto it = m_VariableToEnableProvider.find(acqIdentifier);
126 auto it = m_VariableToEnableProvider.find(acqIdentifier);
99 if (it != m_VariableToEnableProvider.end() && it.value()) {
127 if (it != m_VariableToEnableProvider.end() && it.value()) {
100 const auto timeOnFreq = time / freq;
128 const auto timeOnFreq = time / freq;
101
129
102 xAxisData[dataIndex] = timeOnFreq;
130 xAxisData[dataIndex] = timeOnFreq;
103 valuesData[dataIndex] = std::cos(timeOnFreq);
131 valuesData[dataIndex] = std::cos(timeOnFreq);
104
132
105 // progression
133 // progression
106 int currentProgress = (time - start) * 100.0 / progressEnd;
134 int currentProgress = (time - start) * 100.0 / progressEnd;
107 if (currentProgress != progress) {
135 if (currentProgress != progress) {
108 progress = currentProgress;
136 progress = currentProgress;
109
137
110 emit dataProvidedProgress(acqIdentifier, progress);
138 emit dataProvidedProgress(acqIdentifier, progress);
111 qCInfo(LOG_CosinusProvider()) << "TORM: CosinusProvider::retrieveData"
139 qCInfo(LOG_CosinusProvider()) << "TORM: CosinusProvider::retrieveData"
112 << QThread::currentThread()->objectName() << progress;
140 << QThread::currentThread()->objectName() << progress;
113 // NOTE: Try to use multithread if possible
141 // NOTE: Try to use multithread if possible
114 }
142 }
115 }
143 }
116 else {
144 else {
117 if (!it.value()) {
145 if (!it.value()) {
118 qCDebug(LOG_CosinusProvider())
146 qCDebug(LOG_CosinusProvider())
119 << "CosinusProvider::retrieveData: ARRET De l'acquisition detectΓ©"
147 << "CosinusProvider::retrieveData: ARRET De l'acquisition detectΓ©"
120 << end - time;
148 << end - time;
121 }
149 }
122 }
150 }
123 }
151 }
124 if (progress != 100) {
152 if (progress != 100) {
125 // We can close progression beacause all data has been retrieved
153 // We can close progression beacause all data has been retrieved
126 emit dataProvidedProgress(acqIdentifier, 100);
154 emit dataProvidedProgress(acqIdentifier, 100);
127 }
155 }
128 return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
156 return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
129 Unit{QStringLiteral("t"), true}, Unit{});
157 Unit{QStringLiteral("t"), true}, Unit{});
130 }
158 }
131
159
132 void CosinusProvider::requestDataLoading(QUuid acqIdentifier,
160 void CosinusProvider::requestDataLoading(QUuid acqIdentifier,
133 const DataProviderParameters &parameters)
161 const DataProviderParameters &parameters)
134 {
162 {
135 // TODO: Add Mutex
163 // TODO: Add Mutex
136 m_VariableToEnableProvider[acqIdentifier] = true;
164 m_VariableToEnableProvider[acqIdentifier] = true;
137 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::requestDataLoading"
165 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::requestDataLoading"
138 << QThread::currentThread()->objectName();
166 << QThread::currentThread()->objectName();
139 // NOTE: Try to use multithread if possible
167 // NOTE: Try to use multithread if possible
140 const auto times = parameters.m_Times;
168 const auto times = parameters.m_Times;
141
169
142 for (const auto &dateTime : qAsConst(times)) {
170 for (const auto &dateTime : qAsConst(times)) {
143 if (m_VariableToEnableProvider[acqIdentifier]) {
171 if (m_VariableToEnableProvider[acqIdentifier]) {
144 auto scalarSeries = this->retrieveData(acqIdentifier, dateTime, parameters.m_Data);
172 auto scalarSeries = this->retrieveData(acqIdentifier, dateTime, parameters.m_Data);
145 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::dataProvided";
173 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::dataProvided";
146 emit dataProvided(acqIdentifier, scalarSeries, dateTime);
174 emit dataProvided(acqIdentifier, scalarSeries, dateTime);
147 }
175 }
148 }
176 }
149 }
177 }
150
178
151 void CosinusProvider::requestDataAborting(QUuid acqIdentifier)
179 void CosinusProvider::requestDataAborting(QUuid acqIdentifier)
152 {
180 {
153 // TODO: Add Mutex
181 // TODO: Add Mutex
154 qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier
182 qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier
155 << QThread::currentThread()->objectName();
183 << QThread::currentThread()->objectName();
156 auto it = m_VariableToEnableProvider.find(acqIdentifier);
184 auto it = m_VariableToEnableProvider.find(acqIdentifier);
157 if (it != m_VariableToEnableProvider.end()) {
185 if (it != m_VariableToEnableProvider.end()) {
158 it.value() = false;
186 it.value() = false;
159 }
187 }
160 else {
188 else {
161 qCWarning(LOG_CosinusProvider())
189 qCWarning(LOG_CosinusProvider())
162 << tr("Aborting progression of inexistant identifier detected !!!");
190 << tr("Aborting progression of inexistant identifier detected !!!");
163 }
191 }
164 }
192 }
General Comments 0
You need to be logged in to leave comments. Login now