##// END OF EJS Templates
Add implementation of the Var Acquisition waiting
perrinel -
r585:fa45b8492b4d
parent child
Show More
@@ -1,552 +1,734
1 #include <Variable/Variable.h>
1 #include <Variable/Variable.h>
2 #include <Variable/VariableAcquisitionWorker.h>
2 #include <Variable/VariableAcquisitionWorker.h>
3 #include <Variable/VariableCacheController.h>
3 #include <Variable/VariableCacheController.h>
4 #include <Variable/VariableCacheStrategy.h>
4 #include <Variable/VariableCacheStrategy.h>
5 #include <Variable/VariableController.h>
5 #include <Variable/VariableController.h>
6 #include <Variable/VariableModel.h>
6 #include <Variable/VariableModel.h>
7 #include <Variable/VariableSynchronizationGroup.h>
7 #include <Variable/VariableSynchronizationGroup.h>
8
8
9 #include <Data/DataProviderParameters.h>
9 #include <Data/DataProviderParameters.h>
10 #include <Data/IDataProvider.h>
10 #include <Data/IDataProvider.h>
11 #include <Data/IDataSeries.h>
11 #include <Data/IDataSeries.h>
12 #include <Data/VariableRequest.h>
12 #include <Time/TimeController.h>
13 #include <Time/TimeController.h>
13
14
14 #include <QMutex>
15 #include <QMutex>
15 #include <QThread>
16 #include <QThread>
16 #include <QUuid>
17 #include <QUuid>
17 #include <QtCore/QItemSelectionModel>
18 #include <QtCore/QItemSelectionModel>
18
19
20 #include <deque>
19 #include <set>
21 #include <set>
20 #include <unordered_map>
22 #include <unordered_map>
21
23
22 Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController")
24 Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController")
23
25
24 namespace {
26 namespace {
25
27
26 SqpRange computeSynchroRangeRequested(const SqpRange &varRange, const SqpRange &graphRange,
28 SqpRange computeSynchroRangeRequested(const SqpRange &varRange, const SqpRange &graphRange,
27 const SqpRange &oldGraphRange)
29 const SqpRange &oldGraphRange)
28 {
30 {
29 auto zoomType = VariableController::getZoomType(graphRange, oldGraphRange);
31 auto zoomType = VariableController::getZoomType(graphRange, oldGraphRange);
30
32
31 auto varRangeRequested = varRange;
33 auto varRangeRequested = varRange;
32 switch (zoomType) {
34 switch (zoomType) {
33 case AcquisitionZoomType::ZoomIn: {
35 case AcquisitionZoomType::ZoomIn: {
34 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
36 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
35 auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
37 auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
36 varRangeRequested.m_TStart += deltaLeft;
38 varRangeRequested.m_TStart += deltaLeft;
37 varRangeRequested.m_TEnd -= deltaRight;
39 varRangeRequested.m_TEnd -= deltaRight;
38 break;
40 break;
39 }
41 }
40
42
41 case AcquisitionZoomType::ZoomOut: {
43 case AcquisitionZoomType::ZoomOut: {
42 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
44 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
43 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
45 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
44 varRangeRequested.m_TStart -= deltaLeft;
46 varRangeRequested.m_TStart -= deltaLeft;
45 varRangeRequested.m_TEnd += deltaRight;
47 varRangeRequested.m_TEnd += deltaRight;
46 break;
48 break;
47 }
49 }
48 case AcquisitionZoomType::PanRight: {
50 case AcquisitionZoomType::PanRight: {
49 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
51 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
50 varRangeRequested.m_TStart += deltaRight;
52 varRangeRequested.m_TStart += deltaRight;
51 varRangeRequested.m_TEnd += deltaRight;
53 varRangeRequested.m_TEnd += deltaRight;
52 break;
54 break;
53 }
55 }
54 case AcquisitionZoomType::PanLeft: {
56 case AcquisitionZoomType::PanLeft: {
55 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
57 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
56 varRangeRequested.m_TStart -= deltaLeft;
58 varRangeRequested.m_TStart -= deltaLeft;
57 varRangeRequested.m_TEnd -= deltaLeft;
59 varRangeRequested.m_TEnd -= deltaLeft;
58 break;
60 break;
59 }
61 }
60 case AcquisitionZoomType::Unknown: {
62 case AcquisitionZoomType::Unknown: {
61 qCCritical(LOG_VariableController())
63 qCCritical(LOG_VariableController())
62 << VariableController::tr("Impossible to synchronize: zoom type unknown");
64 << VariableController::tr("Impossible to synchronize: zoom type unknown");
63 break;
65 break;
64 }
66 }
65 default:
67 default:
66 qCCritical(LOG_VariableController()) << VariableController::tr(
68 qCCritical(LOG_VariableController()) << VariableController::tr(
67 "Impossible to synchronize: zoom type not take into account");
69 "Impossible to synchronize: zoom type not take into account");
68 // No action
70 // No action
69 break;
71 break;
70 }
72 }
71
73
72 return varRangeRequested;
74 return varRangeRequested;
73 }
75 }
74 }
76 }
75
77
76 struct VariableController::VariableControllerPrivate {
78 struct VariableController::VariableControllerPrivate {
77 explicit VariableControllerPrivate(VariableController *parent)
79 explicit VariableControllerPrivate(VariableController *parent)
78 : m_WorkingMutex{},
80 : m_WorkingMutex{},
79 m_VariableModel{new VariableModel{parent}},
81 m_VariableModel{new VariableModel{parent}},
80 m_VariableSelectionModel{new QItemSelectionModel{m_VariableModel, parent}},
82 m_VariableSelectionModel{new QItemSelectionModel{m_VariableModel, parent}},
81 m_VariableCacheController{std::make_unique<VariableCacheController>()},
83 m_VariableCacheController{std::make_unique<VariableCacheController>()},
82 m_VariableCacheStrategy{std::make_unique<VariableCacheStrategy>()},
84 m_VariableCacheStrategy{std::make_unique<VariableCacheStrategy>()},
83 m_VariableAcquisitionWorker{std::make_unique<VariableAcquisitionWorker>()},
85 m_VariableAcquisitionWorker{std::make_unique<VariableAcquisitionWorker>()},
84 q{parent}
86 q{parent}
85 {
87 {
86
88
87 m_VariableAcquisitionWorker->moveToThread(&m_VariableAcquisitionWorkerThread);
89 m_VariableAcquisitionWorker->moveToThread(&m_VariableAcquisitionWorkerThread);
88 m_VariableAcquisitionWorkerThread.setObjectName("VariableAcquisitionWorkerThread");
90 m_VariableAcquisitionWorkerThread.setObjectName("VariableAcquisitionWorkerThread");
89 }
91 }
90
92
91
93
92 virtual ~VariableControllerPrivate()
94 virtual ~VariableControllerPrivate()
93 {
95 {
94 qCDebug(LOG_VariableController()) << tr("VariableControllerPrivate destruction");
96 qCDebug(LOG_VariableController()) << tr("VariableControllerPrivate destruction");
95 m_VariableAcquisitionWorkerThread.quit();
97 m_VariableAcquisitionWorkerThread.quit();
96 m_VariableAcquisitionWorkerThread.wait();
98 m_VariableAcquisitionWorkerThread.wait();
97 }
99 }
98
100
99
101
100 void processRequest(std::shared_ptr<Variable> var, const SqpRange &rangeRequested);
102 void processRequest(std::shared_ptr<Variable> var, const SqpRange &rangeRequested,
103 QUuid varRequestId);
101
104
102 QVector<SqpRange> provideNotInCacheDateTimeList(std::shared_ptr<Variable> variable,
105 QVector<SqpRange> provideNotInCacheDateTimeList(std::shared_ptr<Variable> variable,
103 const SqpRange &dateTime);
106 const SqpRange &dateTime);
104
107
105 std::shared_ptr<Variable> findVariable(QUuid vIdentifier);
108 std::shared_ptr<Variable> findVariable(QUuid vIdentifier);
106 std::shared_ptr<IDataSeries>
109 std::shared_ptr<IDataSeries>
107 retrieveDataSeries(const QVector<AcquisitionDataPacket> acqDataPacketVector);
110 retrieveDataSeries(const QVector<AcquisitionDataPacket> acqDataPacketVector);
108
111
109 void registerProvider(std::shared_ptr<IDataProvider> provider);
112 void registerProvider(std::shared_ptr<IDataProvider> provider);
110
113
114 void storeVariableRequest(QUuid varId, QUuid varRequestId, const VariableRequest &varRequest);
115 QUuid acceptVariableRequest(QUuid varId, std::shared_ptr<IDataSeries> dataSeries);
116 void updateVariableRequest(QUuid varRequestId);
117 void cancelVariableRequest(QUuid varRequestId);
118
111 QMutex m_WorkingMutex;
119 QMutex m_WorkingMutex;
112 /// Variable model. The VariableController has the ownership
120 /// Variable model. The VariableController has the ownership
113 VariableModel *m_VariableModel;
121 VariableModel *m_VariableModel;
114 QItemSelectionModel *m_VariableSelectionModel;
122 QItemSelectionModel *m_VariableSelectionModel;
115
123
116
124
117 TimeController *m_TimeController{nullptr};
125 TimeController *m_TimeController{nullptr};
118 std::unique_ptr<VariableCacheController> m_VariableCacheController;
126 std::unique_ptr<VariableCacheController> m_VariableCacheController;
119 std::unique_ptr<VariableCacheStrategy> m_VariableCacheStrategy;
127 std::unique_ptr<VariableCacheStrategy> m_VariableCacheStrategy;
120 std::unique_ptr<VariableAcquisitionWorker> m_VariableAcquisitionWorker;
128 std::unique_ptr<VariableAcquisitionWorker> m_VariableAcquisitionWorker;
121 QThread m_VariableAcquisitionWorkerThread;
129 QThread m_VariableAcquisitionWorkerThread;
122
130
123 std::unordered_map<std::shared_ptr<Variable>, std::shared_ptr<IDataProvider> >
131 std::unordered_map<std::shared_ptr<Variable>, std::shared_ptr<IDataProvider> >
124 m_VariableToProviderMap;
132 m_VariableToProviderMap;
125 std::unordered_map<std::shared_ptr<Variable>, QUuid> m_VariableToIdentifierMap;
133 std::unordered_map<std::shared_ptr<Variable>, QUuid> m_VariableToIdentifierMap;
126 std::map<QUuid, std::shared_ptr<VariableSynchronizationGroup> >
134 std::map<QUuid, std::shared_ptr<VariableSynchronizationGroup> >
127 m_GroupIdToVariableSynchronizationGroupMap;
135 m_GroupIdToVariableSynchronizationGroupMap;
128 std::map<QUuid, QUuid> m_VariableIdGroupIdMap;
136 std::map<QUuid, QUuid> m_VariableIdGroupIdMap;
129 std::set<std::shared_ptr<IDataProvider> > m_ProviderSet;
137 std::set<std::shared_ptr<IDataProvider> > m_ProviderSet;
130
138
139 std::map<QUuid, std::map<QUuid, VariableRequest> > m_VarRequestIdToVarIdVarRequestMap;
140
141 std::map<QUuid, std::deque<QUuid> > m_VarIdToVarRequestIdQueueMap;
142
131
143
132 VariableController *q;
144 VariableController *q;
133 };
145 };
134
146
135
147
136 VariableController::VariableController(QObject *parent)
148 VariableController::VariableController(QObject *parent)
137 : QObject{parent}, impl{spimpl::make_unique_impl<VariableControllerPrivate>(this)}
149 : QObject{parent}, impl{spimpl::make_unique_impl<VariableControllerPrivate>(this)}
138 {
150 {
139 qCDebug(LOG_VariableController()) << tr("VariableController construction")
151 qCDebug(LOG_VariableController()) << tr("VariableController construction")
140 << QThread::currentThread();
152 << QThread::currentThread();
141
153
142 connect(impl->m_VariableModel, &VariableModel::abortProgessRequested, this,
154 connect(impl->m_VariableModel, &VariableModel::abortProgessRequested, this,
143 &VariableController::onAbortProgressRequested);
155 &VariableController::onAbortProgressRequested);
144
156
145 connect(impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::dataProvided, this,
157 connect(impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::dataProvided, this,
146 &VariableController::onDataProvided);
158 &VariableController::onDataProvided);
147 connect(impl->m_VariableAcquisitionWorker.get(),
159 connect(impl->m_VariableAcquisitionWorker.get(),
148 &VariableAcquisitionWorker::variableRequestInProgress, this,
160 &VariableAcquisitionWorker::variableRequestInProgress, this,
149 &VariableController::onVariableRetrieveDataInProgress);
161 &VariableController::onVariableRetrieveDataInProgress);
150
162
151 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::started,
163 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::started,
152 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::initialize);
164 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::initialize);
153 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
165 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
154 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
166 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
155
167
156
168
157 impl->m_VariableAcquisitionWorkerThread.start();
169 impl->m_VariableAcquisitionWorkerThread.start();
158 }
170 }
159
171
160 VariableController::~VariableController()
172 VariableController::~VariableController()
161 {
173 {
162 qCDebug(LOG_VariableController()) << tr("VariableController destruction")
174 qCDebug(LOG_VariableController()) << tr("VariableController destruction")
163 << QThread::currentThread();
175 << QThread::currentThread();
164 this->waitForFinish();
176 this->waitForFinish();
165 }
177 }
166
178
167 VariableModel *VariableController::variableModel() noexcept
179 VariableModel *VariableController::variableModel() noexcept
168 {
180 {
169 return impl->m_VariableModel;
181 return impl->m_VariableModel;
170 }
182 }
171
183
172 QItemSelectionModel *VariableController::variableSelectionModel() noexcept
184 QItemSelectionModel *VariableController::variableSelectionModel() noexcept
173 {
185 {
174 return impl->m_VariableSelectionModel;
186 return impl->m_VariableSelectionModel;
175 }
187 }
176
188
177 void VariableController::setTimeController(TimeController *timeController) noexcept
189 void VariableController::setTimeController(TimeController *timeController) noexcept
178 {
190 {
179 impl->m_TimeController = timeController;
191 impl->m_TimeController = timeController;
180 }
192 }
181
193
182 void VariableController::deleteVariable(std::shared_ptr<Variable> variable) noexcept
194 void VariableController::deleteVariable(std::shared_ptr<Variable> variable) noexcept
183 {
195 {
184 if (!variable) {
196 if (!variable) {
185 qCCritical(LOG_VariableController()) << "Can't delete variable: variable is null";
197 qCCritical(LOG_VariableController()) << "Can't delete variable: variable is null";
186 return;
198 return;
187 }
199 }
188
200
189 // Spreads in SciQlop that the variable will be deleted, so that potential receivers can
201 // Spreads in SciQlop that the variable will be deleted, so that potential receivers can
190 // make some treatments before the deletion
202 // make some treatments before the deletion
191 emit variableAboutToBeDeleted(variable);
203 emit variableAboutToBeDeleted(variable);
192
204
193 // Deletes identifier
205 // Deletes identifier
194 impl->m_VariableToIdentifierMap.erase(variable);
206 impl->m_VariableToIdentifierMap.erase(variable);
195
207
196 // Deletes provider
208 // Deletes provider
197 auto nbProvidersDeleted = impl->m_VariableToProviderMap.erase(variable);
209 auto nbProvidersDeleted = impl->m_VariableToProviderMap.erase(variable);
198 qCDebug(LOG_VariableController())
210 qCDebug(LOG_VariableController())
199 << tr("Number of providers deleted for variable %1: %2")
211 << tr("Number of providers deleted for variable %1: %2")
200 .arg(variable->name(), QString::number(nbProvidersDeleted));
212 .arg(variable->name(), QString::number(nbProvidersDeleted));
201
213
202 // Clears cache
214 // Clears cache
203 impl->m_VariableCacheController->clear(variable);
215 impl->m_VariableCacheController->clear(variable);
204
216
205 // Deletes from model
217 // Deletes from model
206 impl->m_VariableModel->deleteVariable(variable);
218 impl->m_VariableModel->deleteVariable(variable);
207 }
219 }
208
220
209 void VariableController::deleteVariables(
221 void VariableController::deleteVariables(
210 const QVector<std::shared_ptr<Variable> > &variables) noexcept
222 const QVector<std::shared_ptr<Variable> > &variables) noexcept
211 {
223 {
212 for (auto variable : qAsConst(variables)) {
224 for (auto variable : qAsConst(variables)) {
213 deleteVariable(variable);
225 deleteVariable(variable);
214 }
226 }
215 }
227 }
216
228
217 void VariableController::abortProgress(std::shared_ptr<Variable> variable)
229 void VariableController::abortProgress(std::shared_ptr<Variable> variable)
218 {
230 {
219 }
231 }
220
232
221 std::shared_ptr<Variable>
233 std::shared_ptr<Variable>
222 VariableController::createVariable(const QString &name, const QVariantHash &metadata,
234 VariableController::createVariable(const QString &name, const QVariantHash &metadata,
223 std::shared_ptr<IDataProvider> provider) noexcept
235 std::shared_ptr<IDataProvider> provider) noexcept
224 {
236 {
225 if (!impl->m_TimeController) {
237 if (!impl->m_TimeController) {
226 qCCritical(LOG_VariableController())
238 qCCritical(LOG_VariableController())
227 << tr("Impossible to create variable: The time controller is null");
239 << tr("Impossible to create variable: The time controller is null");
228 return nullptr;
240 return nullptr;
229 }
241 }
230
242
231 auto range = impl->m_TimeController->dateTime();
243 auto range = impl->m_TimeController->dateTime();
232
244
233 if (auto newVariable = impl->m_VariableModel->createVariable(name, range, metadata)) {
245 if (auto newVariable = impl->m_VariableModel->createVariable(name, range, metadata)) {
234 auto identifier = QUuid::createUuid();
246 auto identifier = QUuid::createUuid();
235
247
236 // store the provider
248 // store the provider
237 impl->registerProvider(provider);
249 impl->registerProvider(provider);
238
250
239 // Associate the provider
251 // Associate the provider
240 impl->m_VariableToProviderMap[newVariable] = provider;
252 impl->m_VariableToProviderMap[newVariable] = provider;
241 impl->m_VariableToIdentifierMap[newVariable] = identifier;
253 impl->m_VariableToIdentifierMap[newVariable] = identifier;
242
254
243
255
244 impl->processRequest(newVariable, range);
256 auto varRequestId = QUuid::createUuid();
257 qCInfo(LOG_VariableController()) << "processRequest for" << name << varRequestId;
258 impl->processRequest(newVariable, range, varRequestId);
259 impl->updateVariableRequest(varRequestId);
245
260
246 return newVariable;
261 return newVariable;
247 }
262 }
248 }
263 }
249
264
250 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
265 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
251 {
266 {
252 // TODO check synchronisation
267 // TODO check synchronisation and Rescale
253 qCDebug(LOG_VariableController()) << "VariableController::onDateTimeOnSelection"
268 qCDebug(LOG_VariableController()) << "VariableController::onDateTimeOnSelection"
254 << QThread::currentThread()->objectName();
269 << QThread::currentThread()->objectName();
255 auto selectedRows = impl->m_VariableSelectionModel->selectedRows();
270 auto selectedRows = impl->m_VariableSelectionModel->selectedRows();
271 auto varRequestId = QUuid::createUuid();
256
272
257 for (const auto &selectedRow : qAsConst(selectedRows)) {
273 for (const auto &selectedRow : qAsConst(selectedRows)) {
258 if (auto selectedVariable = impl->m_VariableModel->variable(selectedRow.row())) {
274 if (auto selectedVariable = impl->m_VariableModel->variable(selectedRow.row())) {
259 selectedVariable->setRange(dateTime);
275 selectedVariable->setRange(dateTime);
260 impl->processRequest(selectedVariable, dateTime);
276 impl->processRequest(selectedVariable, dateTime, varRequestId);
261
277
262 // notify that rescale operation has to be done
278 // notify that rescale operation has to be done
263 emit rangeChanged(selectedVariable, dateTime);
279 emit rangeChanged(selectedVariable, dateTime);
264 }
280 }
265 }
281 }
282 impl->updateVariableRequest(varRequestId);
266 }
283 }
267
284
268 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
285 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
269 const SqpRange &cacheRangeRequested,
286 const SqpRange &cacheRangeRequested,
270 QVector<AcquisitionDataPacket> dataAcquired)
287 QVector<AcquisitionDataPacket> dataAcquired)
271 {
288 {
272 if (auto var = impl->findVariable(vIdentifier)) {
289 auto retrievedDataSeries = impl->retrieveDataSeries(dataAcquired);
273 var->setRange(rangeRequested);
290 auto varRequestId = impl->acceptVariableRequest(vIdentifier, retrievedDataSeries);
274 var->setCacheRange(cacheRangeRequested);
291 if (!varRequestId.isNull()) {
275 qCDebug(LOG_VariableController()) << tr("1: onDataProvided") << rangeRequested;
292 impl->updateVariableRequest(varRequestId);
276 qCDebug(LOG_VariableController()) << tr("2: onDataProvided") << cacheRangeRequested;
277
278 auto retrievedDataSeries = impl->retrieveDataSeries(dataAcquired);
279 qCDebug(LOG_VariableController()) << tr("3: onDataProvided")
280 << retrievedDataSeries->range();
281 var->mergeDataSeries(retrievedDataSeries);
282 qCDebug(LOG_VariableController()) << tr("4: onDataProvided");
283 emit var->updated();
284 }
285 else {
286 qCCritical(LOG_VariableController()) << tr("Impossible to provide data to a null variable");
287 }
293 }
288 }
294 }
289
295
290 void VariableController::onVariableRetrieveDataInProgress(QUuid identifier, double progress)
296 void VariableController::onVariableRetrieveDataInProgress(QUuid identifier, double progress)
291 {
297 {
292 if (auto var = impl->findVariable(identifier)) {
298 if (auto var = impl->findVariable(identifier)) {
293 impl->m_VariableModel->setDataProgress(var, progress);
299 impl->m_VariableModel->setDataProgress(var, progress);
294 }
300 }
295 else {
301 else {
296 qCCritical(LOG_VariableController())
302 qCCritical(LOG_VariableController())
297 << tr("Impossible to notify progression of a null variable");
303 << tr("Impossible to notify progression of a null variable");
298 }
304 }
299 }
305 }
300
306
301 void VariableController::onAbortProgressRequested(std::shared_ptr<Variable> variable)
307 void VariableController::onAbortProgressRequested(std::shared_ptr<Variable> variable)
302 {
308 {
303 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAbortProgressRequested"
309 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAbortProgressRequested"
304 << QThread::currentThread()->objectName();
310 << QThread::currentThread()->objectName();
305
311
306 auto it = impl->m_VariableToIdentifierMap.find(variable);
312 auto it = impl->m_VariableToIdentifierMap.find(variable);
307 if (it != impl->m_VariableToIdentifierMap.cend()) {
313 if (it != impl->m_VariableToIdentifierMap.cend()) {
308 impl->m_VariableToProviderMap.at(variable)->requestDataAborting(it->second);
314 impl->m_VariableToProviderMap.at(variable)->requestDataAborting(it->second);
309 }
315 }
310 else {
316 else {
311 qCWarning(LOG_VariableController())
317 qCWarning(LOG_VariableController())
312 << tr("Aborting progression of inexistant variable detected !!!")
318 << tr("Aborting progression of inexistant variable detected !!!")
313 << QThread::currentThread()->objectName();
319 << QThread::currentThread()->objectName();
314 }
320 }
315 }
321 }
316
322
317 void VariableController::onAddSynchronizationGroupId(QUuid synchronizationGroupId)
323 void VariableController::onAddSynchronizationGroupId(QUuid synchronizationGroupId)
318 {
324 {
319 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronizationGroupId"
325 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronizationGroupId"
320 << QThread::currentThread()->objectName()
326 << QThread::currentThread()->objectName()
321 << synchronizationGroupId;
327 << synchronizationGroupId;
322 auto vSynchroGroup = std::make_shared<VariableSynchronizationGroup>();
328 auto vSynchroGroup = std::make_shared<VariableSynchronizationGroup>();
323 impl->m_GroupIdToVariableSynchronizationGroupMap.insert(
329 impl->m_GroupIdToVariableSynchronizationGroupMap.insert(
324 std::make_pair(synchronizationGroupId, vSynchroGroup));
330 std::make_pair(synchronizationGroupId, vSynchroGroup));
325 }
331 }
326
332
327 void VariableController::onRemoveSynchronizationGroupId(QUuid synchronizationGroupId)
333 void VariableController::onRemoveSynchronizationGroupId(QUuid synchronizationGroupId)
328 {
334 {
329 impl->m_GroupIdToVariableSynchronizationGroupMap.erase(synchronizationGroupId);
335 impl->m_GroupIdToVariableSynchronizationGroupMap.erase(synchronizationGroupId);
330 }
336 }
331
337
332 void VariableController::onAddSynchronized(std::shared_ptr<Variable> variable,
338 void VariableController::onAddSynchronized(std::shared_ptr<Variable> variable,
333 QUuid synchronizationGroupId)
339 QUuid synchronizationGroupId)
334
340
335 {
341 {
336 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronized"
342 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronized"
337 << synchronizationGroupId;
343 << synchronizationGroupId;
338 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(variable);
344 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(variable);
339 if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
345 if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
340 auto groupIdToVSGIt
346 auto groupIdToVSGIt
341 = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
347 = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
342 if (groupIdToVSGIt != impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
348 if (groupIdToVSGIt != impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
343 impl->m_VariableIdGroupIdMap.insert(
349 impl->m_VariableIdGroupIdMap.insert(
344 std::make_pair(varToVarIdIt->second, synchronizationGroupId));
350 std::make_pair(varToVarIdIt->second, synchronizationGroupId));
345 groupIdToVSGIt->second->addVariableId(varToVarIdIt->second);
351 groupIdToVSGIt->second->addVariableId(varToVarIdIt->second);
346 }
352 }
347 else {
353 else {
348 qCCritical(LOG_VariableController())
354 qCCritical(LOG_VariableController())
349 << tr("Impossible to synchronize a variable with an unknown sycnhronization group")
355 << tr("Impossible to synchronize a variable with an unknown sycnhronization group")
350 << variable->name();
356 << variable->name();
351 }
357 }
352 }
358 }
353 else {
359 else {
354 qCCritical(LOG_VariableController())
360 qCCritical(LOG_VariableController())
355 << tr("Impossible to synchronize a variable with no identifier") << variable->name();
361 << tr("Impossible to synchronize a variable with no identifier") << variable->name();
356 }
362 }
357 }
363 }
358
364
359
365
360 void VariableController::onRequestDataLoading(QVector<std::shared_ptr<Variable> > variables,
366 void VariableController::onRequestDataLoading(QVector<std::shared_ptr<Variable> > variables,
361 const SqpRange &range, const SqpRange &oldRange,
367 const SqpRange &range, const SqpRange &oldRange,
362 bool synchronise)
368 bool synchronise)
363 {
369 {
364 // NOTE: oldRange isn't really necessary since oldRange == variable->range().
370 // NOTE: oldRange isn't really necessary since oldRange == variable->range().
365
371
366 qCDebug(LOG_VariableController()) << "VariableController::onRequestDataLoading"
372 qCDebug(LOG_VariableController()) << "VariableController::onRequestDataLoading"
367 << QThread::currentThread()->objectName();
373 << QThread::currentThread()->objectName();
368 // we want to load data of the variable for the dateTime.
374 // we want to load data of the variable for the dateTime.
369 // First we check if the cache contains some of them.
375 // First we check if the cache contains some of them.
370 // For the other, we ask the provider to give them.
376 // For the other, we ask the provider to give them.
371
377
378 auto varRequestId = QUuid::createUuid();
379
372 for (const auto &var : variables) {
380 for (const auto &var : variables) {
373 qCDebug(LOG_VariableController()) << "processRequest for" << var->name();
381 qCInfo(LOG_VariableController()) << "processRequest for" << var->name() << varRequestId;
374 impl->processRequest(var, range);
382 impl->processRequest(var, range, varRequestId);
375 }
383 }
376
384
377 if (synchronise) {
385 if (synchronise) {
378 // Get the group ids
386 // Get the group ids
379 qCDebug(LOG_VariableController())
387 qCDebug(LOG_VariableController())
380 << "TORM VariableController::onRequestDataLoading for synchro var ENABLE";
388 << "TORM VariableController::onRequestDataLoading for synchro var ENABLE";
381 auto groupIds = std::set<QUuid>();
389 auto groupIds = std::set<QUuid>();
382 for (const auto &var : variables) {
390 for (const auto &var : variables) {
383 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(var);
391 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(var);
384 if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
392 if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
385 auto vId = varToVarIdIt->second;
393 auto vId = varToVarIdIt->second;
386 auto varIdToGroupIdIt = impl->m_VariableIdGroupIdMap.find(vId);
394 auto varIdToGroupIdIt = impl->m_VariableIdGroupIdMap.find(vId);
387 if (varIdToGroupIdIt != impl->m_VariableIdGroupIdMap.cend()) {
395 if (varIdToGroupIdIt != impl->m_VariableIdGroupIdMap.cend()) {
388 auto gId = varIdToGroupIdIt->second;
396 auto gId = varIdToGroupIdIt->second;
389 if (groupIds.find(gId) == groupIds.cend()) {
397 if (groupIds.find(gId) == groupIds.cend()) {
390 qCDebug(LOG_VariableController()) << "Synchro detect group " << gId;
398 qCDebug(LOG_VariableController()) << "Synchro detect group " << gId;
391 groupIds.insert(gId);
399 groupIds.insert(gId);
392 }
400 }
393 }
401 }
394 }
402 }
395 }
403 }
396
404
397 // We assume here all group ids exist
405 // We assume here all group ids exist
398 for (const auto &gId : groupIds) {
406 for (const auto &gId : groupIds) {
399 auto vSynchronizationGroup = impl->m_GroupIdToVariableSynchronizationGroupMap.at(gId);
407 auto vSynchronizationGroup = impl->m_GroupIdToVariableSynchronizationGroupMap.at(gId);
400 auto vSyncIds = vSynchronizationGroup->getIds();
408 auto vSyncIds = vSynchronizationGroup->getIds();
401 qCDebug(LOG_VariableController()) << "Var in synchro group ";
409 qCDebug(LOG_VariableController()) << "Var in synchro group ";
402 for (auto vId : vSyncIds) {
410 for (auto vId : vSyncIds) {
403 auto var = impl->findVariable(vId);
411 auto var = impl->findVariable(vId);
404
412
405 // Don't process already processed var
413 // Don't process already processed var
406 if (!variables.contains(var)) {
414 if (!variables.contains(var)) {
407 if (var != nullptr) {
415 if (var != nullptr) {
408 qCDebug(LOG_VariableController()) << "processRequest synchro for"
416 qCDebug(LOG_VariableController()) << "processRequest synchro for"
409 << var->name();
417 << var->name();
410 auto vSyncRangeRequested
418 auto vSyncRangeRequested
411 = computeSynchroRangeRequested(var->range(), range, oldRange);
419 = computeSynchroRangeRequested(var->range(), range, oldRange);
412 impl->processRequest(var, vSyncRangeRequested);
420 impl->processRequest(var, vSyncRangeRequested, varRequestId);
413 }
421 }
414 else {
422 else {
415 qCCritical(LOG_VariableController())
423 qCCritical(LOG_VariableController())
416
424
417 << tr("Impossible to synchronize a null variable");
425 << tr("Impossible to synchronize a null variable");
418 }
426 }
419 }
427 }
420 }
428 }
421 }
429 }
422 }
430 }
431
432 impl->updateVariableRequest(varRequestId);
423 }
433 }
424
434
425
435
426 void VariableController::initialize()
436 void VariableController::initialize()
427 {
437 {
428 qCDebug(LOG_VariableController()) << tr("VariableController init") << QThread::currentThread();
438 qCDebug(LOG_VariableController()) << tr("VariableController init") << QThread::currentThread();
429 impl->m_WorkingMutex.lock();
439 impl->m_WorkingMutex.lock();
430 qCDebug(LOG_VariableController()) << tr("VariableController init END");
440 qCDebug(LOG_VariableController()) << tr("VariableController init END");
431 }
441 }
432
442
433 void VariableController::finalize()
443 void VariableController::finalize()
434 {
444 {
435 impl->m_WorkingMutex.unlock();
445 impl->m_WorkingMutex.unlock();
436 }
446 }
437
447
438 void VariableController::waitForFinish()
448 void VariableController::waitForFinish()
439 {
449 {
440 QMutexLocker locker{&impl->m_WorkingMutex};
450 QMutexLocker locker{&impl->m_WorkingMutex};
441 }
451 }
442
452
443 AcquisitionZoomType VariableController::getZoomType(const SqpRange &range, const SqpRange &oldRange)
453 AcquisitionZoomType VariableController::getZoomType(const SqpRange &range, const SqpRange &oldRange)
444 {
454 {
445 // t1.m_TStart <= t2.m_TStart && t2.m_TEnd <= t1.m_TEnd
455 // t1.m_TStart <= t2.m_TStart && t2.m_TEnd <= t1.m_TEnd
446 auto zoomType = AcquisitionZoomType::Unknown;
456 auto zoomType = AcquisitionZoomType::Unknown;
447 if (range.m_TStart <= oldRange.m_TStart && oldRange.m_TEnd <= range.m_TEnd) {
457 if (range.m_TStart <= oldRange.m_TStart && oldRange.m_TEnd <= range.m_TEnd) {
448 zoomType = AcquisitionZoomType::ZoomOut;
458 zoomType = AcquisitionZoomType::ZoomOut;
449 }
459 }
450 else if (range.m_TStart > oldRange.m_TStart && range.m_TEnd > oldRange.m_TEnd) {
460 else if (range.m_TStart > oldRange.m_TStart && range.m_TEnd > oldRange.m_TEnd) {
451 zoomType = AcquisitionZoomType::PanRight;
461 zoomType = AcquisitionZoomType::PanRight;
452 }
462 }
453 else if (range.m_TStart < oldRange.m_TStart && range.m_TEnd < oldRange.m_TEnd) {
463 else if (range.m_TStart < oldRange.m_TStart && range.m_TEnd < oldRange.m_TEnd) {
454 zoomType = AcquisitionZoomType::PanLeft;
464 zoomType = AcquisitionZoomType::PanLeft;
455 }
465 }
456 else if (range.m_TStart > oldRange.m_TStart && oldRange.m_TEnd > range.m_TEnd) {
466 else if (range.m_TStart > oldRange.m_TStart && oldRange.m_TEnd > range.m_TEnd) {
457 zoomType = AcquisitionZoomType::ZoomIn;
467 zoomType = AcquisitionZoomType::ZoomIn;
458 }
468 }
459 else {
469 else {
460 qCCritical(LOG_VariableController()) << "getZoomType: Unknown type detected";
470 qCCritical(LOG_VariableController()) << "getZoomType: Unknown type detected";
461 }
471 }
462 return zoomType;
472 return zoomType;
463 }
473 }
464
474
465 void VariableController::VariableControllerPrivate::processRequest(std::shared_ptr<Variable> var,
475 void VariableController::VariableControllerPrivate::processRequest(std::shared_ptr<Variable> var,
466 const SqpRange &rangeRequested)
476 const SqpRange &rangeRequested,
477 QUuid varRequestId)
467 {
478 {
468
479
469 auto varRangesRequested
480 // TODO: protect at
470 = m_VariableCacheStrategy->computeCacheRange(var->range(), rangeRequested);
481 auto varRequest = VariableRequest{};
471 auto notInCacheRangeList = var->provideNotInCacheRangeList(varRangesRequested.second);
482 auto varId = m_VariableToIdentifierMap.at(var);
472 auto inCacheRangeList = var->provideInCacheRangeList(varRangesRequested.second);
483
484
485 auto varStrategyRangesRequested
486 = m_VariableCacheStrategy->computeStrategyRanges(var->range(), rangeRequested);
487 auto notInCacheRangeList = var->provideNotInCacheRangeList(varStrategyRangesRequested.second);
488 auto inCacheRangeList = var->provideInCacheRangeList(varStrategyRangesRequested.second);
473
489
474 if (!notInCacheRangeList.empty()) {
490 if (!notInCacheRangeList.empty()) {
475 auto identifier = m_VariableToIdentifierMap.at(var);
491 varRequest.m_RangeRequested = varStrategyRangesRequested.first;
492 varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second;
493 // store VarRequest
494 storeVariableRequest(varId, varRequestId, varRequest);
495
476 auto varProvider = m_VariableToProviderMap.at(var);
496 auto varProvider = m_VariableToProviderMap.at(var);
477 if (varProvider != nullptr) {
497 if (varProvider != nullptr) {
478 m_VariableAcquisitionWorker->pushVariableRequest(
498 auto varRequestIdCanceled = m_VariableAcquisitionWorker->pushVariableRequest(
479 identifier, varRangesRequested.first, varRangesRequested.second,
499 varRequestId, varId, varStrategyRangesRequested.first,
500 varStrategyRangesRequested.second,
480 DataProviderParameters{std::move(notInCacheRangeList), var->metadata()},
501 DataProviderParameters{std::move(notInCacheRangeList), var->metadata()},
481 varProvider);
502 varProvider);
503
504 if (!varRequestIdCanceled.isNull()) {
505 cancelVariableRequest(varRequestIdCanceled);
506 }
482 }
507 }
483 else {
508 else {
484 qCCritical(LOG_VariableController())
509 qCCritical(LOG_VariableController())
485 << "Impossible to provide data with a null provider";
510 << "Impossible to provide data with a null provider";
486 }
511 }
487
512
488 if (!inCacheRangeList.empty()) {
513 if (!inCacheRangeList.empty()) {
489 emit q->updateVarDisplaying(var, inCacheRangeList.first());
514 emit q->updateVarDisplaying(var, inCacheRangeList.first());
490 }
515 }
491 }
516 }
492 else {
517 else {
493 var->setRange(rangeRequested);
518
494 var->setCacheRange(varRangesRequested.second);
519 varRequest.m_RangeRequested = varStrategyRangesRequested.first;
495 var->setDataSeries(var->dataSeries()->subDataSeries(varRangesRequested.second));
520 varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second;
496 emit var->updated();
521 // store VarRequest
522 storeVariableRequest(varId, varRequestId, varRequest);
523 acceptVariableRequest(varId,
524 var->dataSeries()->subDataSeries(varStrategyRangesRequested.second));
497 }
525 }
498 }
526 }
499
527
500 std::shared_ptr<Variable>
528 std::shared_ptr<Variable>
501 VariableController::VariableControllerPrivate::findVariable(QUuid vIdentifier)
529 VariableController::VariableControllerPrivate::findVariable(QUuid vIdentifier)
502 {
530 {
503 std::shared_ptr<Variable> var;
531 std::shared_ptr<Variable> var;
504 auto findReply = [vIdentifier](const auto &entry) { return vIdentifier == entry.second; };
532 auto findReply = [vIdentifier](const auto &entry) { return vIdentifier == entry.second; };
505
533
506 auto end = m_VariableToIdentifierMap.cend();
534 auto end = m_VariableToIdentifierMap.cend();
507 auto it = std::find_if(m_VariableToIdentifierMap.cbegin(), end, findReply);
535 auto it = std::find_if(m_VariableToIdentifierMap.cbegin(), end, findReply);
508 if (it != end) {
536 if (it != end) {
509 var = it->first;
537 var = it->first;
510 }
538 }
511 else {
539 else {
512 qCCritical(LOG_VariableController())
540 qCCritical(LOG_VariableController())
513 << tr("Impossible to find the variable with the identifier: ") << vIdentifier;
541 << tr("Impossible to find the variable with the identifier: ") << vIdentifier;
514 }
542 }
515
543
516 return var;
544 return var;
517 }
545 }
518
546
519 std::shared_ptr<IDataSeries> VariableController::VariableControllerPrivate::retrieveDataSeries(
547 std::shared_ptr<IDataSeries> VariableController::VariableControllerPrivate::retrieveDataSeries(
520 const QVector<AcquisitionDataPacket> acqDataPacketVector)
548 const QVector<AcquisitionDataPacket> acqDataPacketVector)
521 {
549 {
522 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size")
550 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size")
523 << acqDataPacketVector.size();
551 << acqDataPacketVector.size();
524 std::shared_ptr<IDataSeries> dataSeries;
552 std::shared_ptr<IDataSeries> dataSeries;
525 if (!acqDataPacketVector.isEmpty()) {
553 if (!acqDataPacketVector.isEmpty()) {
526 dataSeries = acqDataPacketVector[0].m_DateSeries;
554 dataSeries = acqDataPacketVector[0].m_DateSeries;
527 for (int i = 1; i < acqDataPacketVector.size(); ++i) {
555 for (int i = 1; i < acqDataPacketVector.size(); ++i) {
528 dataSeries->merge(acqDataPacketVector[i].m_DateSeries.get());
556 dataSeries->merge(acqDataPacketVector[i].m_DateSeries.get());
529 }
557 }
530 }
558 }
531 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size END")
559 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size END")
532 << acqDataPacketVector.size();
560 << acqDataPacketVector.size();
533 return dataSeries;
561 return dataSeries;
534 }
562 }
535
563
536 void VariableController::VariableControllerPrivate::registerProvider(
564 void VariableController::VariableControllerPrivate::registerProvider(
537 std::shared_ptr<IDataProvider> provider)
565 std::shared_ptr<IDataProvider> provider)
538 {
566 {
539 if (m_ProviderSet.find(provider) == m_ProviderSet.end()) {
567 if (m_ProviderSet.find(provider) == m_ProviderSet.end()) {
540 qCDebug(LOG_VariableController()) << tr("Registering of a new provider")
568 qCDebug(LOG_VariableController()) << tr("Registering of a new provider")
541 << provider->objectName();
569 << provider->objectName();
542 m_ProviderSet.insert(provider);
570 m_ProviderSet.insert(provider);
543 connect(provider.get(), &IDataProvider::dataProvided, m_VariableAcquisitionWorker.get(),
571 connect(provider.get(), &IDataProvider::dataProvided, m_VariableAcquisitionWorker.get(),
544 &VariableAcquisitionWorker::onVariableDataAcquired);
572 &VariableAcquisitionWorker::onVariableDataAcquired);
545 connect(provider.get(), &IDataProvider::dataProvidedProgress,
573 connect(provider.get(), &IDataProvider::dataProvidedProgress,
546 m_VariableAcquisitionWorker.get(),
574 m_VariableAcquisitionWorker.get(),
547 &VariableAcquisitionWorker::onVariableRetrieveDataInProgress);
575 &VariableAcquisitionWorker::onVariableRetrieveDataInProgress);
548 }
576 }
549 else {
577 else {
550 qCDebug(LOG_VariableController()) << tr("Cannot register provider, it already exists ");
578 qCDebug(LOG_VariableController()) << tr("Cannot register provider, it already exists ");
551 }
579 }
552 }
580 }
581
582 void VariableController::VariableControllerPrivate::storeVariableRequest(
note

It' too long I agree. Let's see that later

583 QUuid varId, QUuid varRequestId, const VariableRequest &varRequest)
584 {
585 // First request for the variable. we can create an entry for it
586 auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.find(varId);
587 if (varIdToVarRequestIdQueueMapIt == m_VarIdToVarRequestIdQueueMap.cend()) {
588 auto varRequestIdQueue = std::deque<QUuid>{};
589 qCDebug(LOG_VariableController()) << tr("Store REQUEST in QUEUE");
590 varRequestIdQueue.push_back(varRequestId);
591 m_VarIdToVarRequestIdQueueMap.insert(std::make_pair(varId, std::move(varRequestIdQueue)));
592 }
593 else {
594 qCDebug(LOG_VariableController()) << tr("Store REQUEST in EXISTING QUEUE");
595 auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
596 varRequestIdQueue.push_back(varRequestId);
597 }
598
599 auto varRequestIdToVarIdVarRequestMapIt = m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
600 if (varRequestIdToVarIdVarRequestMapIt == m_VarRequestIdToVarIdVarRequestMap.cend()) {
601 auto varIdToVarRequestMap = std::map<QUuid, VariableRequest>{};
602 varIdToVarRequestMap.insert(std::make_pair(varId, varRequest));
603 qCDebug(LOG_VariableController()) << tr("Store REQUESTID in MAP");
604 m_VarRequestIdToVarIdVarRequestMap.insert(
605 std::make_pair(varRequestId, std::move(varIdToVarRequestMap)));
606 }
607 else {
608 auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
609 qCDebug(LOG_VariableController()) << tr("Store REQUESTID in EXISTING MAP");
610 varIdToVarRequestMap.insert(std::make_pair(varId, varRequest));
611 }
612 }
613
614 QUuid VariableController::VariableControllerPrivate::acceptVariableRequest(
615 QUuid varId, std::shared_ptr<IDataSeries> dataSeries)
616 {
617 QUuid varRequestId;
618 auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.find(varId);
619 if (varIdToVarRequestIdQueueMapIt != m_VarIdToVarRequestIdQueueMap.cend()) {
620 auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
621 varRequestId = varRequestIdQueue.front();
622 auto varRequestIdToVarIdVarRequestMapIt
623 = m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
624 if (varRequestIdToVarIdVarRequestMapIt != m_VarRequestIdToVarIdVarRequestMap.cend()) {
625 auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
626 auto varIdToVarRequestMapIt = varIdToVarRequestMap.find(varId);
627 if (varIdToVarRequestMapIt != varIdToVarRequestMap.cend()) {
628 qCDebug(LOG_VariableController()) << tr("acceptVariableRequest");
629 auto &varRequest = varIdToVarRequestMapIt->second;
630 varRequest.m_DataSeries = dataSeries;
631 varRequest.m_CanUpdate = true;
632 }
633 else {
634 qCDebug(LOG_VariableController())
635 << tr("Impossible to acceptVariableRequest of a unknown variable id attached "
636 "to a variableRequestId")
637 << varRequestId << varId;
638 }
639 }
640 else {
641 qCCritical(LOG_VariableController())
642 << tr("Impossible to acceptVariableRequest of a unknown variableRequestId")
643 << varRequestId;
644 }
645
646 qCDebug(LOG_VariableController()) << tr("1: erase REQUEST in QUEUE ?")
647 << varRequestIdQueue.size();
648 varRequestIdQueue.pop_front();
649 qCDebug(LOG_VariableController()) << tr("2: erase REQUEST in QUEUE ?")
650 << varRequestIdQueue.size();
651 if (varRequestIdQueue.empty()) {
652 m_VarIdToVarRequestIdQueueMap.erase(varId);
653 }
654 }
655 else {
656 qCCritical(LOG_VariableController())
657 << tr("Impossible to acceptVariableRequest of a unknown variable id") << varId;
658 }
659
660 return varRequestId;
661 }
662
663 void VariableController::VariableControllerPrivate::updateVariableRequest(QUuid varRequestId)
664 {
665
666 auto varRequestIdToVarIdVarRequestMapIt = m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
667 if (varRequestIdToVarIdVarRequestMapIt != m_VarRequestIdToVarIdVarRequestMap.cend()) {
668 bool processVariableUpdate = true;
669 auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
670 for (auto varIdToVarRequestMapIt = varIdToVarRequestMap.cbegin();
671 (varIdToVarRequestMapIt != varIdToVarRequestMap.cend()) && processVariableUpdate;
672 ++varIdToVarRequestMapIt) {
673 processVariableUpdate &= varIdToVarRequestMapIt->second.m_CanUpdate;
674 qCDebug(LOG_VariableController()) << tr("updateVariableRequest")
675 << processVariableUpdate;
676 }
677
678 if (processVariableUpdate) {
679 for (auto varIdToVarRequestMapIt = varIdToVarRequestMap.cbegin();
680 varIdToVarRequestMapIt != varIdToVarRequestMap.cend(); ++varIdToVarRequestMapIt) {
681 if (auto var = findVariable(varIdToVarRequestMapIt->first)) {
682 auto &varRequest = varIdToVarRequestMapIt->second;
683 var->setRange(varRequest.m_RangeRequested);
684 var->setCacheRange(varRequest.m_CacheRangeRequested);
685 qCInfo(LOG_VariableController()) << tr("1: onDataProvided")
686 << varRequest.m_RangeRequested;
687 qCInfo(LOG_VariableController()) << tr("2: onDataProvided")
688 << varRequest.m_CacheRangeRequested;
689 var->mergeDataSeries(varRequest.m_DataSeries);
690 qCInfo(LOG_VariableController()) << tr("3: onDataProvided")
691 << varRequest.m_DataSeries->range();
692 qCDebug(LOG_VariableController()) << tr("4: onDataProvided");
693 emit var->updated();
694 }
695 else {
696 qCCritical(LOG_VariableController())
697 << tr("Impossible to update data to a null variable");
698 }
699 }
700
701 // cleaning varRequestId
702 qCDebug(LOG_VariableController()) << tr("0: erase REQUEST in MAP ?")
703 << m_VarRequestIdToVarIdVarRequestMap.size();
704 m_VarRequestIdToVarIdVarRequestMap.erase(varRequestId);
705 qCDebug(LOG_VariableController()) << tr("1: erase REQUEST in MAP ?")
706 << m_VarRequestIdToVarIdVarRequestMap.size();
707 }
708 }
709 else {
710 qCCritical(LOG_VariableController())
711 << tr("Cannot updateVariableRequest for a unknow varRequestId") << varRequestId;
712 }
713 }
714
715 void VariableController::VariableControllerPrivate::cancelVariableRequest(QUuid varRequestId)
716 {
717 // cleaning varRequestId
718 m_VarRequestIdToVarIdVarRequestMap.erase(varRequestId);
719
720 for (auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.begin();
721 varIdToVarRequestIdQueueMapIt != m_VarIdToVarRequestIdQueueMap.end();) {
722 auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
723 varRequestIdQueue.erase(
724 std::remove(varRequestIdQueue.begin(), varRequestIdQueue.end(), varRequestId),
725 varRequestIdQueue.end());
726 if (varRequestIdQueue.empty()) {
727 varIdToVarRequestIdQueueMapIt
728 = m_VarIdToVarRequestIdQueueMap.erase(varIdToVarRequestIdQueueMapIt);
729 }
730 else {
731 ++varIdToVarRequestIdQueueMapIt;
732 }
733 }
734 }
General Comments 3
Under Review
author

Pull request updated. Auto status change to "Under Review"

Changed commits:
  * 1 added
  * 0 removed

Changed files:
  * M core/include/Data/AcquisitionRequest.h
  * M core/include/Variable/VariableAcquisitionWorker.h
  * M core/include/Variable/VariableCacheStrategy.h
  * M core/include/Variable/VariableController.h
  * M core/src/Variable/VariableAcquisitionWorker.cpp
  * M core/src/Variable/VariableCacheStrategy.cpp
  * M core/src/Variable/VariableController.cpp
  * M gui/src/Visualization/VisualizationZoneWidget.cpp
  * M plugins/amda/include/AmdaPlugin.h
  * M plugins/amda/src/AmdaProvider.cpp
  * M plugins/amda/tests/TestAmdaAcquisition.cpp
  * M plugins/mockplugin/include/MockPlugin.h
  * R COPYING
  * R app/src/MainWindow.cpp
  * R app/ui/MainWindow.ui
  * R cmake/sciqlop_package_qt.cmake
  * R core/include/Common/DateUtils.h
  * R core/include/Common/MetaTypes.h
  * R core/include/Common/SortUtils.h
  * R core/include/CoreGlobal.h
  * R core/include/Data/AcquisitionDataPacket.h
  * R core/include/Data/ArrayData.h
  * R core/include/Data/DataProviderParameters.h
  * R core/include/Data/DataSeries.h
  * R core/include/Data/DataSeriesIterator.h
  * R core/include/Data/IDataProvider.h
  * R core/include/Data/IDataSeries.h
  * R core/include/Data/ScalarSeries.h
  * R core/include/Data/SqpRange.h
  * R core/include/Data/VectorSeries.h
  * R core/include/DataSource/DataSourceItemAction.h
  * R core/include/Network/NetworkController.h
  * R core/include/Plugin/PluginManager.h
  * R core/include/Settings/ISqpSettingsBindable.h
  * R core/include/Settings/SqpSettingsDefs.h
  * R core/include/Time/TimeController.h
  * R core/include/Variable/Variable.h
  * R core/include/Variable/VariableCacheController.h
  * R core/include/Variable/VariableModel.h
  * R core/include/Variable/VariableSynchronizationGroup.h
  * R core/include/Visualization/VisualizationController.h
  * R core/src/Common/DateUtils.cpp
  * R core/src/Data/DataSeriesIterator.cpp
  * R core/src/Data/ScalarSeries.cpp
  * R core/src/Data/VectorSeries.cpp
  * R core/src/DataSource/DataSourceItemAction.cpp
  * R core/src/Network/NetworkController.cpp
  * R core/src/Plugin/PluginManager.cpp
  * R core/src/Settings/SqpSettingsDefs.cpp
  * R core/src/Time/TimeController.cpp
  * R core/src/Variable/Variable.cpp
  * R core/src/Variable/VariableCacheController.cpp
  * R core/src/Variable/VariableModel.cpp
  * R core/src/Variable/VariableSynchronizationGroup.cpp
  * R core/src/Visualization/VisualizationController.cpp
  * R core/tests/Data/TestDataSeries.cpp
  * R core/tests/Data/TestOneDimArrayData.cpp
  * R core/tests/Data/TestTwoDimArrayData.cpp
  * R core/tests/Variable/TestVariable.cpp
  * R core/tests/Variable/TestVariableCacheController.cpp
  * R gui/include/Common/ColorUtils.h
  * R gui/include/DataSource/DataSourceTreeWidgetHelper.h
  * R gui/include/DataSource/DataSourceTreeWidgetItem.h
  * R gui/include/DataSource/DataSourceWidget.h
  * R gui/include/Settings/SqpSettingsDialog.h
  * R gui/include/Settings/SqpSettingsGeneralWidget.h
  * R gui/include/SidePane/SqpSidePane.h
  * R gui/include/TimeWidget/TimeWidget.h
  * R gui/include/Variable/VariableInspectorWidget.h
  * R gui/include/Variable/VariableMenuHeaderWidget.h
  * R gui/include/Visualization/IVariableContainer.h
  * R gui/include/Visualization/IVisualizationWidget.h
  * R gui/include/Visualization/IVisualizationWidgetVisitor.h
  * R gui/include/Visualization/VisualizationDefs.h
  * R gui/include/Visualization/VisualizationGraphHelper.h
  * R gui/include/Visualization/VisualizationGraphRenderingDelegate.h
  * R gui/include/Visualization/VisualizationGraphWidget.h
  * R gui/include/Visualization/VisualizationTabWidget.h
  * R gui/include/Visualization/VisualizationWidget.h
  * R gui/include/Visualization/VisualizationZoneWidget.h
  * R gui/include/Visualization/operations/GenerateVariableMenuOperation.h
  * R gui/include/Visualization/operations/MenuBuilder.h
  * R gui/include/Visualization/operations/RemoveVariableOperation.h
  * R gui/include/Visualization/operations/RescaleAxeOperation.h
  * R gui/include/Visualization/qcustomplot.h
  * R gui/resources/icones/dataSourceComponent.png
  * R gui/resources/icones/dataSourceNode.png
  * R gui/resources/icones/dataSourceProduct.png
  * R gui/resources/icones/dataSourceRoot.png
  * R gui/resources/icones/delete.png
  * R gui/resources/icones/next.png
  * R gui/resources/icones/openInspector.png
  * R gui/resources/icones/plot.png
  * R gui/resources/icones/previous.png
  * R gui/resources/icones/sciqlop2PNG_1024.png
  * R gui/resources/icones/unplot.png
  * R gui/resources/sqpguiresources.qrc
  * R gui/src/Common/ColorUtils.cpp
  * R gui/src/DataSource/DataSourceTreeWidgetHelper.cpp
  * R gui/src/DataSource/DataSourceTreeWidgetItem.cpp
  * R gui/src/DataSource/DataSourceWidget.cpp
  * R gui/src/Settings/SqpSettingsDialog.cpp
  * R gui/src/Settings/SqpSettingsGeneralWidget.cpp
  * R gui/src/SidePane/SqpSidePane.cpp
  * R gui/src/TimeWidget/TimeWidget.cpp
  * R gui/src/Variable/VariableInspectorWidget.cpp
  * R gui/src/Variable/VariableMenuHeaderWidget.cpp
  * R gui/src/Visualization/VisualizationGraphHelper.cpp
  * R gui/src/Visualization/VisualizationGraphRenderingDelegate.cpp
  * R gui/src/Visualization/VisualizationGraphWidget.cpp
  * R gui/src/Visualization/VisualizationTabWidget.cpp
  * R gui/src/Visualization/VisualizationWidget.cpp
  * R gui/src/Visualization/operations/GenerateVariableMenuOperation.cpp
  * R gui/src/Visualization/operations/MenuBuilder.cpp
  * R gui/src/Visualization/operations/RemoveVariableOperation.cpp
  * R gui/src/Visualization/operations/RescaleAxeOperation.cpp
  * R gui/src/Visualization/qcustomplot.cpp
  * R gui/ui/DataSource/DataSourceWidget.ui
  * R gui/ui/Settings/SqpSettingsDialog.ui
  * R gui/ui/Settings/SqpSettingsGeneralWidget.ui
  * R gui/ui/SidePane/SqpSidePane.ui
  * R gui/ui/TimeWidget/TimeWidget.ui
  * R gui/ui/Variable/VariableInspectorWidget.ui
  * R gui/ui/Variable/VariableMenuHeaderWidget.ui
  * R gui/ui/Visualization/VisualizationGraphWidget.ui
  * R gui/ui/Visualization/VisualizationTabWidget.ui
  * R gui/ui/Visualization/VisualizationWidget.ui
  * R gui/ui/Visualization/VisualizationZoneWidget.ui
  * R gui/vera-exclusions/exclusions.txt
  * R plugin/CMakeLists.txt
  * R plugin/cmake/Findsciqlop-plugin.cmake
  * R plugin/include/Plugin/IPlugin.h
  * R plugins/amda/CMakeLists.txt
  * R plugins/amda/cmake/Findsciqlop-amda.cmake
  * R plugins/amda/include/AmdaDefs.h
  * R plugins/amda/include/AmdaGlobal.h
  * R plugins/amda/include/AmdaParser.h
  * R plugins/amda/include/AmdaProvider.h
  * R plugins/amda/include/AmdaResultParser.h
  * R plugins/amda/resources/amda.json
  * R plugins/amda/resources/amdaresources.qrc
  * R plugins/amda/resources/samples/AmdaSample.json
  * R plugins/amda/resources/samples/AmdaSampleV2.json
  * R plugins/amda/src/AmdaDefs.cpp
  * R plugins/amda/src/AmdaParser.cpp
  * R plugins/amda/src/AmdaPlugin.cpp
  * R plugins/amda/src/AmdaResultParser.cpp
  * R plugins/amda/tests-resources/TestAmdaAcquisition/AmdaData-2012-01-01-12-00-00_2012-01-03-12-00-00.txt
  * R plugins/amda/tests-resources/TestAmdaParser/TwoRootsFile.json
  * R plugins/amda/tests-resources/TestAmdaParser/ValidFile1.json
  * R plugins/amda/tests-resources/TestAmdaParser/WrongRootKey.json
  * R plugins/amda/tests-resources/TestAmdaParser/WrongRootType.json
  * R plugins/amda/tests-resources/TestAmdaResultParser/FileNotFound.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/NaNValue.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/NaNX.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/NoUnit.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/TooManyValues.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/ValidScalar1.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/ValidVector1.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/WrongDate.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/WrongUnit.txt
  * R plugins/amda/tests-resources/TestAmdaResultParser/WrongValue.txt
  * R plugins/amda/tests/TestAmdaParser.cpp
  * R plugins/amda/tests/TestAmdaResultParser.cpp
  * R plugins/mockplugin/CMakeLists.txt
  * R plugins/mockplugin/cmake/Findsciqlop-mockplugin.cmake
  * R plugins/mockplugin/include/CosinusProvider.h
  * R plugins/mockplugin/include/MockPluginGlobal.h
  * R plugins/mockplugin/resources/mockplugin.json
  * R plugins/mockplugin/src/CosinusProvider.cpp
  * R plugins/mockplugin/src/MockPlugin.cpp
  * R README.md
  * R app/CMakeLists.txt
  * R app/include/MainWindow.h
  * R app/src/Main.cpp
  * R app/vera-exclusions/exclusions.txt
  * R cmake/sciqlop.cmake
  * R cmake/sciqlop_applications.cmake
  * R cmake/sciqlop_package.cmake
  * R cmake/sciqlop_params.cmake
  * R core/CMakeLists.txt
  * R core/include/Common/spimpl.h
  * R core/include/DataSource/DataSourceController.h
  * R core/include/DataSource/DataSourceItem.h
  * R core/src/DataSource/DataSourceController.cpp
  * R core/src/DataSource/DataSourceItem.cpp
  * R core/tests/DataSource/TestDataSourceController.cpp
  * R core/vera-exclusions/exclusions.txt
  * R formatting/cmake/use_clangformat.cmake
  * R formatting/vera-exclusions/exclusions.txt
  * R gui/CMakeLists.txt
  * R gui/include/SqpApplication.h
  * R gui/src/SqpApplication.cpp
  * R LICENSE
  * R app/src/mainwindow.cpp
  * R app/src/mainwindow.ui
Approved
author

Status change > Approved

You need to be logged in to leave comments. Login now