##// END OF EJS Templates
Fixes problems at variable deletion...
Alexandre Leroux -
r1327:d0b687dbfe3e
parent child
Show More
@@ -1,1070 +1,1102
1 1 #include <Variable/Variable.h>
2 2 #include <Variable/VariableAcquisitionWorker.h>
3 3 #include <Variable/VariableCacheStrategy.h>
4 4 #include <Variable/VariableCacheStrategyFactory.h>
5 5 #include <Variable/VariableController.h>
6 6 #include <Variable/VariableModel.h>
7 7 #include <Variable/VariableSynchronizationGroup.h>
8 8
9 9 #include <Data/DataProviderParameters.h>
10 10 #include <Data/IDataProvider.h>
11 11 #include <Data/IDataSeries.h>
12 12 #include <Data/VariableRequest.h>
13 13 #include <Time/TimeController.h>
14 14
15 15 #include <QDataStream>
16 16 #include <QMutex>
17 17 #include <QThread>
18 18 #include <QUuid>
19 19 #include <QtCore/QItemSelectionModel>
20 20
21 21 #include <deque>
22 22 #include <set>
23 23 #include <unordered_map>
24 24
25 25 Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController")
26 26
27 27 namespace {
28 28
29 29 SqpRange computeSynchroRangeRequested(const SqpRange &varRange, const SqpRange &graphRange,
30 30 const SqpRange &oldGraphRange)
31 31 {
32 32 auto zoomType = VariableController::getZoomType(graphRange, oldGraphRange);
33 33
34 34 auto varRangeRequested = varRange;
35 35 switch (zoomType) {
36 36 case AcquisitionZoomType::ZoomIn: {
37 37 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
38 38 auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
39 39 varRangeRequested.m_TStart += deltaLeft;
40 40 varRangeRequested.m_TEnd -= deltaRight;
41 41 break;
42 42 }
43 43
44 44 case AcquisitionZoomType::ZoomOut: {
45 45 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
46 46 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
47 47 varRangeRequested.m_TStart -= deltaLeft;
48 48 varRangeRequested.m_TEnd += deltaRight;
49 49 break;
50 50 }
51 51 case AcquisitionZoomType::PanRight: {
52 52 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
53 53 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
54 54 varRangeRequested.m_TStart += deltaLeft;
55 55 varRangeRequested.m_TEnd += deltaRight;
56 56 break;
57 57 }
58 58 case AcquisitionZoomType::PanLeft: {
59 59 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
60 60 auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
61 61 varRangeRequested.m_TStart -= deltaLeft;
62 62 varRangeRequested.m_TEnd -= deltaRight;
63 63 break;
64 64 }
65 65 case AcquisitionZoomType::Unknown: {
66 66 qCCritical(LOG_VariableController())
67 67 << VariableController::tr("Impossible to synchronize: zoom type unknown");
68 68 break;
69 69 }
70 70 default:
71 71 qCCritical(LOG_VariableController()) << VariableController::tr(
72 72 "Impossible to synchronize: zoom type not take into account");
73 73 // No action
74 74 break;
75 75 }
76 76
77 77 return varRangeRequested;
78 78 }
79 79 }
80 80
81 81 enum class VariableRequestHandlerState { OFF, RUNNING, PENDING };
82 82
83 83 struct VariableRequestHandler {
84 84
85 85 VariableRequestHandler()
86 86 {
87 87 m_CanUpdate = false;
88 88 m_State = VariableRequestHandlerState::OFF;
89 89 }
90 90
91 91 QUuid m_VarId;
92 92 VariableRequest m_RunningVarRequest;
93 93 VariableRequest m_PendingVarRequest;
94 94 VariableRequestHandlerState m_State;
95 95 bool m_CanUpdate;
96 96 };
97 97
98 98 struct VariableController::VariableControllerPrivate {
99 99 explicit VariableControllerPrivate(VariableController *parent)
100 100 : m_WorkingMutex{},
101 101 m_VariableModel{new VariableModel{parent}},
102 102 m_VariableSelectionModel{new QItemSelectionModel{m_VariableModel, parent}},
103 103 // m_VariableCacheStrategy{std::make_unique<VariableCacheStrategy>()},
104 104 m_VariableCacheStrategy{VariableCacheStrategyFactory::createCacheStrategy(
105 105 CacheStrategy::SingleThreshold)},
106 106 m_VariableAcquisitionWorker{std::make_unique<VariableAcquisitionWorker>()},
107 107 q{parent}
108 108 {
109 109
110 110 m_VariableAcquisitionWorker->moveToThread(&m_VariableAcquisitionWorkerThread);
111 111 m_VariableAcquisitionWorkerThread.setObjectName("VariableAcquisitionWorkerThread");
112 112 }
113 113
114 114
115 115 virtual ~VariableControllerPrivate()
116 116 {
117 117 qCDebug(LOG_VariableController()) << tr("VariableControllerPrivate destruction");
118 118 m_VariableAcquisitionWorkerThread.quit();
119 119 m_VariableAcquisitionWorkerThread.wait();
120 120 }
121 121
122 122
123 123 void processRequest(std::shared_ptr<Variable> var, const SqpRange &rangeRequested,
124 124 QUuid varRequestId);
125 125
126 126 std::shared_ptr<Variable> findVariable(QUuid vIdentifier);
127 127 std::shared_ptr<IDataSeries>
128 128 retrieveDataSeries(const QVector<AcquisitionDataPacket> acqDataPacketVector);
129 129
130 130 void registerProvider(std::shared_ptr<IDataProvider> provider);
131 131
132 132 void storeVariableRequest(QUuid varId, QUuid varRequestId, const VariableRequest &varRequest);
133 133 QUuid acceptVariableRequest(QUuid varId, std::shared_ptr<IDataSeries> dataSeries);
134 134 void updateVariables(QUuid varRequestId);
135 135 void updateVariableRequest(QUuid varRequestId);
136 136 void cancelVariableRequest(QUuid varRequestId);
137 137 void executeVarRequest(std::shared_ptr<Variable> var, VariableRequest &varRequest);
138 138
139 template <typename VariableIterator>
140 void desynchronize(VariableIterator variableIt, const QUuid &syncGroupId);
141
139 142 QMutex m_WorkingMutex;
140 143 /// Variable model. The VariableController has the ownership
141 144 VariableModel *m_VariableModel;
142 145 QItemSelectionModel *m_VariableSelectionModel;
143 146
144 147
145 148 TimeController *m_TimeController{nullptr};
146 149 std::unique_ptr<VariableCacheStrategy> m_VariableCacheStrategy;
147 150 std::unique_ptr<VariableAcquisitionWorker> m_VariableAcquisitionWorker;
148 151 QThread m_VariableAcquisitionWorkerThread;
149 152
150 153 std::unordered_map<std::shared_ptr<Variable>, std::shared_ptr<IDataProvider> >
151 154 m_VariableToProviderMap;
152 155 std::unordered_map<std::shared_ptr<Variable>, QUuid> m_VariableToIdentifierMap;
153 156 std::map<QUuid, std::shared_ptr<VariableSynchronizationGroup> >
154 157 m_GroupIdToVariableSynchronizationGroupMap;
155 158 std::map<QUuid, QUuid> m_VariableIdGroupIdMap;
156 159 std::set<std::shared_ptr<IDataProvider> > m_ProviderSet;
157 160
158 161 std::map<QUuid, std::list<QUuid> > m_VarGroupIdToVarIds;
159 162 std::map<QUuid, std::unique_ptr<VariableRequestHandler> > m_VarIdToVarRequestHandler;
160 163
161 164 VariableController *q;
162 165 };
163 166
164 167
165 168 VariableController::VariableController(QObject *parent)
166 169 : QObject{parent}, impl{spimpl::make_unique_impl<VariableControllerPrivate>(this)}
167 170 {
168 171 qCDebug(LOG_VariableController()) << tr("VariableController construction")
169 172 << QThread::currentThread();
170 173
171 174 connect(impl->m_VariableModel, &VariableModel::abortProgessRequested, this,
172 175 &VariableController::onAbortProgressRequested);
173 176
174 177 connect(impl->m_VariableAcquisitionWorker.get(),
175 178 &VariableAcquisitionWorker::variableCanceledRequested, this,
176 179 &VariableController::onAbortAcquisitionRequested);
177 180
178 181 connect(impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::dataProvided, this,
179 182 &VariableController::onDataProvided);
180 183 connect(impl->m_VariableAcquisitionWorker.get(),
181 184 &VariableAcquisitionWorker::variableRequestInProgress, this,
182 185 &VariableController::onVariableRetrieveDataInProgress);
183 186
184 187
185 188 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::started,
186 189 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::initialize);
187 190 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
188 191 impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
189 192
190 193 connect(impl->m_VariableModel, &VariableModel::requestVariableRangeUpdate, this,
191 194 &VariableController::onUpdateDateTime);
192 195
193 196 impl->m_VariableAcquisitionWorkerThread.start();
194 197 }
195 198
196 199 VariableController::~VariableController()
197 200 {
198 201 qCDebug(LOG_VariableController()) << tr("VariableController destruction")
199 202 << QThread::currentThread();
200 203 this->waitForFinish();
201 204 }
202 205
203 206 VariableModel *VariableController::variableModel() noexcept
204 207 {
205 208 return impl->m_VariableModel;
206 209 }
207 210
208 211 QItemSelectionModel *VariableController::variableSelectionModel() noexcept
209 212 {
210 213 return impl->m_VariableSelectionModel;
211 214 }
212 215
213 216 void VariableController::setTimeController(TimeController *timeController) noexcept
214 217 {
215 218 impl->m_TimeController = timeController;
216 219 }
217 220
218 221 std::shared_ptr<Variable>
219 222 VariableController::cloneVariable(std::shared_ptr<Variable> variable) noexcept
220 223 {
221 224 if (impl->m_VariableModel->containsVariable(variable)) {
222 225 // Clones variable
223 226 auto duplicate = variable->clone();
224 227
225 228 // Adds clone to model
226 229 impl->m_VariableModel->addVariable(duplicate);
227 230
228 231 // Generates clone identifier
229 232 impl->m_VariableToIdentifierMap[duplicate] = QUuid::createUuid();
230 233
231 234 // Registers provider
232 235 auto variableProvider = impl->m_VariableToProviderMap.at(variable);
233 236 auto duplicateProvider = variableProvider != nullptr ? variableProvider->clone() : nullptr;
234 237
235 238 impl->m_VariableToProviderMap[duplicate] = duplicateProvider;
236 239 if (duplicateProvider) {
237 240 impl->registerProvider(duplicateProvider);
238 241 }
239 242
240 243 return duplicate;
241 244 }
242 245 else {
243 246 qCCritical(LOG_VariableController())
244 247 << tr("Can't create duplicate of variable %1: variable not registered in the model")
245 248 .arg(variable->name());
246 249 return nullptr;
247 250 }
248 251 }
249 252
250 253 void VariableController::deleteVariable(std::shared_ptr<Variable> variable) noexcept
251 254 {
252 255 if (!variable) {
253 256 qCCritical(LOG_VariableController()) << "Can't delete variable: variable is null";
254 257 return;
255 258 }
256 259
257 260 // Spreads in SciQlop that the variable will be deleted, so that potential receivers can
258 261 // make some treatments before the deletion
259 262 emit variableAboutToBeDeleted(variable);
260 263
264 auto variableIt = impl->m_VariableToIdentifierMap.find(variable);
265 Q_ASSERT(variableIt != impl->m_VariableToIdentifierMap.cend());
266
267 auto variableId = variableIt->second;
268
269 // Removes variable's handler
270 impl->m_VarIdToVarRequestHandler.erase(variableId);
271
272 // Desynchronizes variable (if the variable is in a sync group)
273 auto syncGroupIt = impl->m_VariableIdGroupIdMap.find(variableId);
274 if (syncGroupIt != impl->m_VariableIdGroupIdMap.cend()) {
275 impl->desynchronize(variableIt, syncGroupIt->second);
276 }
277
261 278 // Deletes identifier
262 impl->m_VariableToIdentifierMap.erase(variable);
279 impl->m_VariableToIdentifierMap.erase(variableIt);
263 280
264 281 // Deletes provider
265 282 auto nbProvidersDeleted = impl->m_VariableToProviderMap.erase(variable);
266 283 qCDebug(LOG_VariableController())
267 284 << tr("Number of providers deleted for variable %1: %2")
268 285 .arg(variable->name(), QString::number(nbProvidersDeleted));
269 286
270 287
271 288 // Deletes from model
272 289 impl->m_VariableModel->deleteVariable(variable);
273 290 }
274 291
275 292 void VariableController::deleteVariables(
276 293 const QVector<std::shared_ptr<Variable> > &variables) noexcept
277 294 {
278 295 for (auto variable : qAsConst(variables)) {
279 296 deleteVariable(variable);
280 297 }
281 298 }
282 299
283 300 QByteArray
284 301 VariableController::mimeDataForVariables(const QList<std::shared_ptr<Variable> > &variables) const
285 302 {
286 303 auto encodedData = QByteArray{};
287 304
288 305 QVariantList ids;
289 306 for (auto &var : variables) {
290 307 auto itVar = impl->m_VariableToIdentifierMap.find(var);
291 308 if (itVar == impl->m_VariableToIdentifierMap.cend()) {
292 309 qCCritical(LOG_VariableController())
293 310 << tr("Impossible to find the data for an unknown variable.");
294 311 }
295 312
296 313 ids << itVar->second.toByteArray();
297 314 }
298 315
299 316 QDataStream stream{&encodedData, QIODevice::WriteOnly};
300 317 stream << ids;
301 318
302 319 return encodedData;
303 320 }
304 321
305 322 QList<std::shared_ptr<Variable> >
306 323 VariableController::variablesForMimeData(const QByteArray &mimeData) const
307 324 {
308 325 auto variables = QList<std::shared_ptr<Variable> >{};
309 326 QDataStream stream{mimeData};
310 327
311 328 QVariantList ids;
312 329 stream >> ids;
313 330
314 331 for (auto id : ids) {
315 332 auto uuid = QUuid{id.toByteArray()};
316 333 auto var = impl->findVariable(uuid);
317 334 variables << var;
318 335 }
319 336
320 337 return variables;
321 338 }
322 339
323 340 std::shared_ptr<Variable>
324 341 VariableController::createVariable(const QString &name, const QVariantHash &metadata,
325 342 std::shared_ptr<IDataProvider> provider) noexcept
326 343 {
327 344 if (!impl->m_TimeController) {
328 345 qCCritical(LOG_VariableController())
329 346 << tr("Impossible to create variable: The time controller is null");
330 347 return nullptr;
331 348 }
332 349
333 350 auto range = impl->m_TimeController->dateTime();
334 351
335 352 if (auto newVariable = impl->m_VariableModel->createVariable(name, metadata)) {
336 353 auto varId = QUuid::createUuid();
337 354
338 355 // Create the handler
339 356 auto varRequestHandler = std::make_unique<VariableRequestHandler>();
340 357 varRequestHandler->m_VarId = varId;
341 358
342 359 impl->m_VarIdToVarRequestHandler.insert(
343 360 std::make_pair(varId, std::move(varRequestHandler)));
344 361
345 362 // store the provider
346 363 impl->registerProvider(provider);
347 364
348 365 // Associate the provider
349 366 impl->m_VariableToProviderMap[newVariable] = provider;
350 367 impl->m_VariableToIdentifierMap[newVariable] = varId;
351 368
352 369 this->onRequestDataLoading(QVector<std::shared_ptr<Variable> >{newVariable}, range, false);
353 370
354 371 // auto varRequestId = QUuid::createUuid();
355 372 // qCInfo(LOG_VariableController()) << "createVariable: " << varId << varRequestId;
356 373 // impl->processRequest(newVariable, range, varRequestId);
357 374 // impl->updateVariableRequest(varRequestId);
358 375
359 376 return newVariable;
360 377 }
361 378
362 379 qCCritical(LOG_VariableController()) << tr("Impossible to create variable");
363 380 return nullptr;
364 381 }
365 382
366 383 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
367 384 {
368 385 // NOTE: Even if acquisition request is aborting, the graphe range will be changed
369 386 qCDebug(LOG_VariableController()) << "VariableController::onDateTimeOnSelection"
370 387 << QThread::currentThread()->objectName();
371 388 auto selectedRows = impl->m_VariableSelectionModel->selectedRows();
372 389
373 390 // NOTE we only permit the time modification for one variable
374 391 // DEPRECATED
375 392 // auto variables = QVector<std::shared_ptr<Variable> >{};
376 393 // for (const auto &selectedRow : qAsConst(selectedRows)) {
377 394 // if (auto selectedVariable =
378 395 // impl->m_VariableModel->variable(selectedRow.row())) {
379 396 // variables << selectedVariable;
380 397
381 398 // // notify that rescale operation has to be done
382 399 // emit rangeChanged(selectedVariable, dateTime);
383 400 // }
384 401 // }
385 402 // if (!variables.isEmpty()) {
386 403 // this->onRequestDataLoading(variables, dateTime, synchro);
387 404 // }
388 405 if (selectedRows.size() == 1) {
389 406
390 407 if (auto selectedVariable
391 408 = impl->m_VariableModel->variable(qAsConst(selectedRows).first().row())) {
392 409
393 410 onUpdateDateTime(selectedVariable, dateTime);
394 411 }
395 412 }
396 413 else if (selectedRows.size() > 1) {
397 414 qCCritical(LOG_VariableController())
398 415 << tr("Impossible to set time for more than 1 variable in the same time");
399 416 }
400 417 else {
401 418 qCWarning(LOG_VariableController())
402 419 << tr("There is no variable selected to set the time one");
403 420 }
404 421 }
405 422
406 423 void VariableController::onUpdateDateTime(std::shared_ptr<Variable> variable,
407 424 const SqpRange &dateTime)
408 425 {
409 426 auto itVar = impl->m_VariableToIdentifierMap.find(variable);
410 427 if (itVar == impl->m_VariableToIdentifierMap.cend()) {
411 428 qCCritical(LOG_VariableController())
412 429 << tr("Impossible to onDateTimeOnSelection request for unknown variable");
413 430 return;
414 431 }
415 432
416 433 // notify that rescale operation has to be done
417 434 emit rangeChanged(variable, dateTime);
418 435
419 436 auto synchro
420 437 = impl->m_VariableIdGroupIdMap.find(itVar->second) != impl->m_VariableIdGroupIdMap.cend();
421 438
422 439 this->onRequestDataLoading(QVector<std::shared_ptr<Variable> >{variable}, dateTime, synchro);
423 440 }
424 441
425 442 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
426 443 const SqpRange &cacheRangeRequested,
427 444 QVector<AcquisitionDataPacket> dataAcquired)
428 445 {
429 446 qCDebug(LOG_VariableController()) << tr("onDataProvided") << QThread::currentThread();
430 447 auto retrievedDataSeries = impl->retrieveDataSeries(dataAcquired);
431 448 auto varRequestId = impl->acceptVariableRequest(vIdentifier, retrievedDataSeries);
432 449 if (!varRequestId.isNull()) {
433 450 impl->updateVariables(varRequestId);
434 451 }
435 452 }
436 453
437 454 void VariableController::onVariableRetrieveDataInProgress(QUuid identifier, double progress)
438 455 {
439 456 qCDebug(LOG_VariableController())
440 457 << "TORM: variableController::onVariableRetrieveDataInProgress"
441 458 << QThread::currentThread()->objectName() << progress;
442 459 if (auto var = impl->findVariable(identifier)) {
443 460 impl->m_VariableModel->setDataProgress(var, progress);
444 461 }
445 462 else {
446 463 qCCritical(LOG_VariableController())
447 464 << tr("Impossible to notify progression of a null variable");
448 465 }
449 466 }
450 467
451 468 void VariableController::onAbortProgressRequested(std::shared_ptr<Variable> variable)
452 469 {
453 470 qCDebug(LOG_VariableController()) << "TORM: variableController::onAbortProgressRequested"
454 471 << QThread::currentThread()->objectName() << variable->name();
455 472
456 473 auto itVar = impl->m_VariableToIdentifierMap.find(variable);
457 474 if (itVar == impl->m_VariableToIdentifierMap.cend()) {
458 475 qCCritical(LOG_VariableController())
459 476 << tr("Impossible to onAbortProgressRequested request for unknown variable");
460 477 return;
461 478 }
462 479
463 480 auto varId = itVar->second;
464 481
465 482 auto itVarHandler = impl->m_VarIdToVarRequestHandler.find(varId);
466 483 if (itVarHandler == impl->m_VarIdToVarRequestHandler.cend()) {
467 484 qCCritical(LOG_VariableController())
468 485 << tr("Impossible to onAbortProgressRequested for variable with unknown handler");
469 486 return;
470 487 }
471 488
472 489 auto varHandler = itVarHandler->second.get();
473 490
474 491 // case where a variable has a running request
475 492 if (varHandler->m_State != VariableRequestHandlerState::OFF) {
476 493 impl->cancelVariableRequest(varHandler->m_RunningVarRequest.m_VariableGroupId);
477 494 }
478 495 }
479 496
480 497 void VariableController::onAbortAcquisitionRequested(QUuid vIdentifier)
481 498 {
482 499 qCDebug(LOG_VariableController()) << "TORM: variableController::onAbortAcquisitionRequested"
483 500 << QThread::currentThread()->objectName() << vIdentifier;
484 501
485 502 if (auto var = impl->findVariable(vIdentifier)) {
486 503 this->onAbortProgressRequested(var);
487 504 }
488 505 else {
489 506 qCCritical(LOG_VariableController())
490 507 << tr("Impossible to abort Acquisition Requestof a null variable");
491 508 }
492 509 }
493 510
494 511 void VariableController::onAddSynchronizationGroupId(QUuid synchronizationGroupId)
495 512 {
496 513 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronizationGroupId"
497 514 << QThread::currentThread()->objectName()
498 515 << synchronizationGroupId;
499 516 auto vSynchroGroup = std::make_shared<VariableSynchronizationGroup>();
500 517 impl->m_GroupIdToVariableSynchronizationGroupMap.insert(
501 518 std::make_pair(synchronizationGroupId, vSynchroGroup));
502 519 }
503 520
504 521 void VariableController::onRemoveSynchronizationGroupId(QUuid synchronizationGroupId)
505 522 {
506 523 impl->m_GroupIdToVariableSynchronizationGroupMap.erase(synchronizationGroupId);
507 524 }
508 525
509 526 void VariableController::onAddSynchronized(std::shared_ptr<Variable> variable,
510 527 QUuid synchronizationGroupId)
511 528
512 529 {
513 530 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronized"
514 531 << synchronizationGroupId;
515 532 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(variable);
516 533 if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
517 534 auto groupIdToVSGIt
518 535 = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
519 536 if (groupIdToVSGIt != impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
520 537 impl->m_VariableIdGroupIdMap.insert(
521 538 std::make_pair(varToVarIdIt->second, synchronizationGroupId));
522 539 groupIdToVSGIt->second->addVariableId(varToVarIdIt->second);
523 540 }
524 541 else {
525 542 qCCritical(LOG_VariableController())
526 543 << tr("Impossible to synchronize a variable with an unknown sycnhronization group")
527 544 << variable->name();
528 545 }
529 546 }
530 547 else {
531 548 qCCritical(LOG_VariableController())
532 549 << tr("Impossible to synchronize a variable with no identifier") << variable->name();
533 550 }
534 551 }
535 552
536 553 void VariableController::desynchronize(std::shared_ptr<Variable> variable,
537 554 QUuid synchronizationGroupId)
538 555 {
539 556 // Gets variable id
540 557 auto variableIt = impl->m_VariableToIdentifierMap.find(variable);
541 558 if (variableIt == impl->m_VariableToIdentifierMap.cend()) {
542 559 qCCritical(LOG_VariableController())
543 560 << tr("Can't desynchronize variable %1: variable identifier not found")
544 561 .arg(variable->name());
545 562 return;
546 563 }
547 564
548 // Gets synchronization group
549 auto groupIt = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
550 if (groupIt == impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
551 qCCritical(LOG_VariableController())
552 << tr("Can't desynchronize variable %1: unknown synchronization group")
553 .arg(variable->name());
554 return;
555 }
556
557 auto variableId = variableIt->second;
558
559 // Removes variable from synchronization group
560 auto synchronizationGroup = groupIt->second;
561 synchronizationGroup->removeVariableId(variableId);
562
563 // Removes link between variable and synchronization group
564 impl->m_VariableIdGroupIdMap.erase(variableId);
565 impl->desynchronize(variableIt, synchronizationGroupId);
565 566 }
566 567
567 568 void VariableController::onRequestDataLoading(QVector<std::shared_ptr<Variable> > variables,
568 569 const SqpRange &range, bool synchronise)
569 570 {
570 571 // variables is assumed synchronized
571 572 // TODO: Asser variables synchronization
572 573 // we want to load data of the variable for the dateTime.
573 574 if (variables.isEmpty()) {
574 575 return;
575 576 }
576 577
577 578 auto varRequestId = QUuid::createUuid();
578 579 qCDebug(LOG_VariableController()) << "VariableController::onRequestDataLoading"
579 580 << QThread::currentThread()->objectName() << varRequestId
580 581 << range << synchronise;
581 582
582 583 if (!synchronise) {
583 584 auto varIds = std::list<QUuid>{};
584 585 for (const auto &var : variables) {
585 586 auto vId = impl->m_VariableToIdentifierMap.at(var);
586 587 varIds.push_back(vId);
587 588 }
588 589 impl->m_VarGroupIdToVarIds.insert(std::make_pair(varRequestId, varIds));
589 590 for (const auto &var : variables) {
590 591 qCDebug(LOG_VariableController()) << "processRequest for" << var->name() << varRequestId
591 592 << varIds.size();
592 593 impl->processRequest(var, range, varRequestId);
593 594 }
594 595 }
595 596 else {
596 597 auto vId = impl->m_VariableToIdentifierMap.at(variables.first());
597 598 auto varIdToGroupIdIt = impl->m_VariableIdGroupIdMap.find(vId);
598 599 if (varIdToGroupIdIt != impl->m_VariableIdGroupIdMap.cend()) {
599 600 auto groupId = varIdToGroupIdIt->second;
600 601
601 602 auto vSynchronizationGroup
602 603 = impl->m_GroupIdToVariableSynchronizationGroupMap.at(groupId);
603 604 auto vSyncIds = vSynchronizationGroup->getIds();
604 605
605 606 auto varIds = std::list<QUuid>{};
606 607 for (auto vId : vSyncIds) {
607 608 varIds.push_back(vId);
608 609 }
609 610 impl->m_VarGroupIdToVarIds.insert(std::make_pair(varRequestId, varIds));
610 611
611 612 for (auto vId : vSyncIds) {
612 613 auto var = impl->findVariable(vId);
613 614
614 615 // Don't process already processed var
615 616 if (var != nullptr) {
616 617 qCDebug(LOG_VariableController()) << "processRequest synchro for" << var->name()
617 618 << varRequestId;
618 619 auto vSyncRangeRequested
619 620 = variables.contains(var)
620 621 ? range
621 622 : computeSynchroRangeRequested(var->range(), range,
622 623 variables.first()->range());
623 624 qCDebug(LOG_VariableController()) << "synchro RR" << vSyncRangeRequested;
624 625 impl->processRequest(var, vSyncRangeRequested, varRequestId);
625 626 }
626 627 else {
627 628 qCCritical(LOG_VariableController())
628 629
629 630 << tr("Impossible to synchronize a null variable");
630 631 }
631 632 }
632 633 }
633 634 }
634 635
635 636 impl->updateVariables(varRequestId);
636 637 }
637 638
638 639
639 640 void VariableController::initialize()
640 641 {
641 642 qCDebug(LOG_VariableController()) << tr("VariableController init") << QThread::currentThread();
642 643 impl->m_WorkingMutex.lock();
643 644 qCDebug(LOG_VariableController()) << tr("VariableController init END");
644 645 }
645 646
646 647 void VariableController::finalize()
647 648 {
648 649 impl->m_WorkingMutex.unlock();
649 650 }
650 651
651 652 void VariableController::waitForFinish()
652 653 {
653 654 QMutexLocker locker{&impl->m_WorkingMutex};
654 655 }
655 656
656 657 AcquisitionZoomType VariableController::getZoomType(const SqpRange &range, const SqpRange &oldRange)
657 658 {
658 659 // t1.m_TStart <= t2.m_TStart && t2.m_TEnd <= t1.m_TEnd
659 660 auto zoomType = AcquisitionZoomType::Unknown;
660 661 if (range.m_TStart <= oldRange.m_TStart && oldRange.m_TEnd <= range.m_TEnd) {
661 662 qCDebug(LOG_VariableController()) << "zoomtype: ZoomOut";
662 663 zoomType = AcquisitionZoomType::ZoomOut;
663 664 }
664 665 else if (range.m_TStart > oldRange.m_TStart && range.m_TEnd > oldRange.m_TEnd) {
665 666 qCDebug(LOG_VariableController()) << "zoomtype: PanRight";
666 667 zoomType = AcquisitionZoomType::PanRight;
667 668 }
668 669 else if (range.m_TStart < oldRange.m_TStart && range.m_TEnd < oldRange.m_TEnd) {
669 670 qCDebug(LOG_VariableController()) << "zoomtype: PanLeft";
670 671 zoomType = AcquisitionZoomType::PanLeft;
671 672 }
672 673 else if (range.m_TStart >= oldRange.m_TStart && oldRange.m_TEnd >= range.m_TEnd) {
673 674 qCDebug(LOG_VariableController()) << "zoomtype: ZoomIn";
674 675 zoomType = AcquisitionZoomType::ZoomIn;
675 676 }
676 677 else {
677 678 qCDebug(LOG_VariableController()) << "getZoomType: Unknown type detected";
678 679 }
679 680 return zoomType;
680 681 }
681 682
682 683 void VariableController::VariableControllerPrivate::processRequest(std::shared_ptr<Variable> var,
683 684 const SqpRange &rangeRequested,
684 685 QUuid varRequestId)
685 686 {
686 687 auto itVar = m_VariableToIdentifierMap.find(var);
687 688 if (itVar == m_VariableToIdentifierMap.cend()) {
688 689 qCCritical(LOG_VariableController())
689 690 << tr("Impossible to process request for unknown variable");
690 691 return;
691 692 }
692 693
693 694 auto varId = itVar->second;
694 695
695 696 auto itVarHandler = m_VarIdToVarRequestHandler.find(varId);
696 697 if (itVarHandler == m_VarIdToVarRequestHandler.cend()) {
697 698 qCCritical(LOG_VariableController())
698 699 << tr("Impossible to process request for variable with unknown handler");
699 700 return;
700 701 }
701 702
702 703 auto oldRange = var->range();
703 704
704 705 auto varHandler = itVarHandler->second.get();
705 706
706 707 if (varHandler->m_State != VariableRequestHandlerState::OFF) {
707 708 oldRange = varHandler->m_RunningVarRequest.m_RangeRequested;
708 709 }
709 710
710 711 auto varRequest = VariableRequest{};
711 712 varRequest.m_VariableGroupId = varRequestId;
712 713 auto varStrategyRangesRequested
713 714 = m_VariableCacheStrategy->computeRange(oldRange, rangeRequested);
714 715 varRequest.m_RangeRequested = varStrategyRangesRequested.first;
715 716 varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second;
716 717
717 718 switch (varHandler->m_State) {
718 719 case VariableRequestHandlerState::OFF: {
719 720 qCDebug(LOG_VariableController()) << tr("Process Request OFF")
720 721 << varRequest.m_RangeRequested
721 722 << varRequest.m_CacheRangeRequested;
722 723 varHandler->m_RunningVarRequest = varRequest;
723 724 varHandler->m_State = VariableRequestHandlerState::RUNNING;
724 725 executeVarRequest(var, varRequest);
725 726 break;
726 727 }
727 728 case VariableRequestHandlerState::RUNNING: {
728 729 qCDebug(LOG_VariableController()) << tr("Process Request RUNNING")
729 730 << varRequest.m_RangeRequested
730 731 << varRequest.m_CacheRangeRequested;
731 732 varHandler->m_State = VariableRequestHandlerState::PENDING;
732 733 varHandler->m_PendingVarRequest = varRequest;
733 734 break;
734 735 }
735 736 case VariableRequestHandlerState::PENDING: {
736 737 qCDebug(LOG_VariableController()) << tr("Process Request PENDING")
737 738 << varRequest.m_RangeRequested
738 739 << varRequest.m_CacheRangeRequested;
739 740 auto variableGroupIdToCancel = varHandler->m_PendingVarRequest.m_VariableGroupId;
740 741 cancelVariableRequest(variableGroupIdToCancel);
741 742 // Cancel variable can make state downgrade
742 743 varHandler->m_State = VariableRequestHandlerState::PENDING;
743 744 varHandler->m_PendingVarRequest = varRequest;
744 745
745 746 break;
746 747 }
747 748 default:
748 749 qCCritical(LOG_VariableController())
749 750 << QObject::tr("Unknown VariableRequestHandlerState");
750 751 }
751 752 }
752 753
753 754 std::shared_ptr<Variable>
754 755 VariableController::VariableControllerPrivate::findVariable(QUuid vIdentifier)
755 756 {
756 757 std::shared_ptr<Variable> var;
757 758 auto findReply = [vIdentifier](const auto &entry) { return vIdentifier == entry.second; };
758 759
759 760 auto end = m_VariableToIdentifierMap.cend();
760 761 auto it = std::find_if(m_VariableToIdentifierMap.cbegin(), end, findReply);
761 762 if (it != end) {
762 763 var = it->first;
763 764 }
764 765 else {
765 766 qCCritical(LOG_VariableController())
766 767 << tr("Impossible to find the variable with the identifier: ") << vIdentifier;
767 768 }
768 769
769 770 return var;
770 771 }
771 772
772 773 std::shared_ptr<IDataSeries> VariableController::VariableControllerPrivate::retrieveDataSeries(
773 774 const QVector<AcquisitionDataPacket> acqDataPacketVector)
774 775 {
775 776 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size")
776 777 << acqDataPacketVector.size();
777 778 std::shared_ptr<IDataSeries> dataSeries;
778 779 if (!acqDataPacketVector.isEmpty()) {
779 780 dataSeries = acqDataPacketVector[0].m_DateSeries;
780 781 for (int i = 1; i < acqDataPacketVector.size(); ++i) {
781 782 dataSeries->merge(acqDataPacketVector[i].m_DateSeries.get());
782 783 }
783 784 }
784 785 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size END")
785 786 << acqDataPacketVector.size();
786 787 return dataSeries;
787 788 }
788 789
789 790 void VariableController::VariableControllerPrivate::registerProvider(
790 791 std::shared_ptr<IDataProvider> provider)
791 792 {
792 793 if (m_ProviderSet.find(provider) == m_ProviderSet.end()) {
793 794 qCDebug(LOG_VariableController()) << tr("Registering of a new provider")
794 795 << provider->objectName();
795 796 m_ProviderSet.insert(provider);
796 797 connect(provider.get(), &IDataProvider::dataProvided, m_VariableAcquisitionWorker.get(),
797 798 &VariableAcquisitionWorker::onVariableDataAcquired);
798 799 connect(provider.get(), &IDataProvider::dataProvidedProgress,
799 800 m_VariableAcquisitionWorker.get(),
800 801 &VariableAcquisitionWorker::onVariableRetrieveDataInProgress);
801 802 connect(provider.get(), &IDataProvider::dataProvidedFailed,
802 803 m_VariableAcquisitionWorker.get(),
803 804 &VariableAcquisitionWorker::onVariableAcquisitionFailed);
804 805 }
805 806 else {
806 807 qCDebug(LOG_VariableController()) << tr("Cannot register provider, it already exists ");
807 808 }
808 809 }
809 810
810 811 QUuid VariableController::VariableControllerPrivate::acceptVariableRequest(
811 812 QUuid varId, std::shared_ptr<IDataSeries> dataSeries)
812 813 {
813 814 auto itVarHandler = m_VarIdToVarRequestHandler.find(varId);
814 815 if (itVarHandler == m_VarIdToVarRequestHandler.cend()) {
815 816 return QUuid();
816 817 }
817 818
818 819 auto varHandler = itVarHandler->second.get();
819 820 if (varHandler->m_State == VariableRequestHandlerState::OFF) {
820 821 qCCritical(LOG_VariableController())
821 822 << tr("acceptVariableRequest impossible on a variable with OFF state");
822 823 }
823 824
824 825 varHandler->m_RunningVarRequest.m_DataSeries = dataSeries;
825 826 varHandler->m_CanUpdate = true;
826 827
827 828 // Element traitΓ©, on a dΓ©jΓ  toutes les donnΓ©es necessaires
828 829 auto varGroupId = varHandler->m_RunningVarRequest.m_VariableGroupId;
829 830 qCDebug(LOG_VariableController()) << "Variable::acceptVariableRequest" << varGroupId
830 831 << m_VarGroupIdToVarIds.size();
831 832
832 833 return varHandler->m_RunningVarRequest.m_VariableGroupId;
833 834 }
834 835
835 836 void VariableController::VariableControllerPrivate::updateVariables(QUuid varRequestId)
836 837 {
837 838 qCDebug(LOG_VariableController()) << "VariableControllerPrivate::updateVariables"
838 839 << QThread::currentThread()->objectName() << varRequestId;
839 840
840 841 auto varGroupIdToVarIdsIt = m_VarGroupIdToVarIds.find(varRequestId);
841 842 if (varGroupIdToVarIdsIt == m_VarGroupIdToVarIds.end()) {
842 843 qCWarning(LOG_VariableController())
843 844 << tr("Impossible to updateVariables of unknown variables") << varRequestId;
844 845 return;
845 846 }
846 847
847 848 auto &varIds = varGroupIdToVarIdsIt->second;
848 849 auto varIdsEnd = varIds.end();
849 850 bool processVariableUpdate = true;
850 851 qCDebug(LOG_VariableController()) << "VariableControllerPrivate::updateVariables"
851 852 << varRequestId << varIds.size();
852 853 for (auto varIdsIt = varIds.begin(); (varIdsIt != varIdsEnd) && processVariableUpdate;
853 854 ++varIdsIt) {
854 855 auto itVarHandler = m_VarIdToVarRequestHandler.find(*varIdsIt);
855 856 if (itVarHandler != m_VarIdToVarRequestHandler.cend()) {
856 857 processVariableUpdate &= itVarHandler->second->m_CanUpdate;
857 858 }
858 859 }
859 860
860 861 if (processVariableUpdate) {
861 862 qCDebug(LOG_VariableController()) << "Final update OK for the var request" << varIds.size();
862 863 for (auto varIdsIt = varIds.begin(); varIdsIt != varIdsEnd; ++varIdsIt) {
863 864 auto itVarHandler = m_VarIdToVarRequestHandler.find(*varIdsIt);
864 865 if (itVarHandler != m_VarIdToVarRequestHandler.cend()) {
865 866 if (auto var = findVariable(*varIdsIt)) {
866 867 auto &varRequest = itVarHandler->second->m_RunningVarRequest;
867 868 var->setRange(varRequest.m_RangeRequested);
868 869 var->setCacheRange(varRequest.m_CacheRangeRequested);
869 870 qCDebug(LOG_VariableController()) << tr("1: onDataProvided")
870 871 << varRequest.m_RangeRequested
871 872 << varRequest.m_CacheRangeRequested;
872 873 qCDebug(LOG_VariableController()) << tr("2: onDataProvided var points before")
873 874 << var->nbPoints()
874 875 << varRequest.m_DataSeries->nbPoints();
875 876 var->mergeDataSeries(varRequest.m_DataSeries);
876 877 qCDebug(LOG_VariableController()) << tr("3: onDataProvided var points after")
877 878 << var->nbPoints();
878 879
879 880 emit var->updated();
880 881 qCDebug(LOG_VariableController()) << tr("Update OK");
881 882 }
882 883 else {
883 884 qCCritical(LOG_VariableController())
884 885 << tr("Impossible to update data to a null variable");
885 886 }
886 887 }
887 888 }
888 889 updateVariableRequest(varRequestId);
889 890
890 891 // cleaning varRequestId
891 892 qCDebug(LOG_VariableController()) << tr("m_VarGroupIdToVarIds erase") << varRequestId;
892 893 m_VarGroupIdToVarIds.erase(varRequestId);
893 894 if (m_VarGroupIdToVarIds.empty()) {
894 895 emit q->acquisitionFinished();
895 896 }
896 897 }
897 898 }
898 899
899 900
900 901 void VariableController::VariableControllerPrivate::updateVariableRequest(QUuid varRequestId)
901 902 {
902 903 auto varGroupIdToVarIdsIt = m_VarGroupIdToVarIds.find(varRequestId);
903 904 if (varGroupIdToVarIdsIt == m_VarGroupIdToVarIds.end()) {
904 905 qCCritical(LOG_VariableController()) << QObject::tr(
905 906 "Impossible to updateVariableRequest since varGroupdId isn't here anymore");
906 907
907 908 return;
908 909 }
909 910
910 911 auto &varIds = varGroupIdToVarIdsIt->second;
911 912 auto varIdsEnd = varIds.end();
912 913 for (auto varIdsIt = varIds.begin(); (varIdsIt != varIdsEnd); ++varIdsIt) {
913 914 auto itVarHandler = m_VarIdToVarRequestHandler.find(*varIdsIt);
914 915 if (itVarHandler != m_VarIdToVarRequestHandler.cend()) {
915 916
916 917 auto varHandler = itVarHandler->second.get();
917 918 varHandler->m_CanUpdate = false;
918 919
919 920
920 921 switch (varHandler->m_State) {
921 922 case VariableRequestHandlerState::OFF: {
922 923 qCCritical(LOG_VariableController())
923 924 << QObject::tr("Impossible to update a variable with handler in OFF state");
924 925 } break;
925 926 case VariableRequestHandlerState::RUNNING: {
926 927 varHandler->m_State = VariableRequestHandlerState::OFF;
927 928 varHandler->m_RunningVarRequest = VariableRequest{};
928 929 break;
929 930 }
930 931 case VariableRequestHandlerState::PENDING: {
931 932 varHandler->m_State = VariableRequestHandlerState::RUNNING;
932 933 varHandler->m_RunningVarRequest = varHandler->m_PendingVarRequest;
933 934 varHandler->m_PendingVarRequest = VariableRequest{};
934 935 auto var = findVariable(itVarHandler->first);
935 936 executeVarRequest(var, varHandler->m_RunningVarRequest);
936 937 updateVariables(varHandler->m_RunningVarRequest.m_VariableGroupId);
937 938 break;
938 939 }
939 940 default:
940 941 qCCritical(LOG_VariableController())
941 942 << QObject::tr("Unknown VariableRequestHandlerState");
942 943 }
943 944 }
944 945 }
945 946 }
946 947
947 948
948 949 void VariableController::VariableControllerPrivate::cancelVariableRequest(QUuid varRequestId)
949 950 {
950 951 qCDebug(LOG_VariableController()) << tr("cancelVariableRequest") << varRequestId;
951 952
952 953 auto varGroupIdToVarIdsIt = m_VarGroupIdToVarIds.find(varRequestId);
953 954 if (varGroupIdToVarIdsIt == m_VarGroupIdToVarIds.end()) {
954 955 qCCritical(LOG_VariableController())
955 956 << tr("Impossible to cancelVariableRequest for unknown varGroupdId") << varRequestId;
956 957 return;
957 958 }
958 959
959 960 auto &varIds = varGroupIdToVarIdsIt->second;
960 961 auto varIdsEnd = varIds.end();
961 962 for (auto varIdsIt = varIds.begin(); (varIdsIt != varIdsEnd); ++varIdsIt) {
962 963 auto itVarHandler = m_VarIdToVarRequestHandler.find(*varIdsIt);
963 964 if (itVarHandler != m_VarIdToVarRequestHandler.cend()) {
964 965
965 966 auto varHandler = itVarHandler->second.get();
966 967 varHandler->m_VarId = QUuid{};
967 968 switch (varHandler->m_State) {
968 969 case VariableRequestHandlerState::OFF: {
969 970 qCWarning(LOG_VariableController())
970 971 << QObject::tr("Impossible to cancel a variable with no running request");
971 972 break;
972 973 }
973 974 case VariableRequestHandlerState::RUNNING: {
974 975
975 976 if (varHandler->m_RunningVarRequest.m_VariableGroupId == varRequestId) {
976 977 auto var = findVariable(itVarHandler->first);
977 978 auto varProvider = m_VariableToProviderMap.at(var);
978 979 if (varProvider != nullptr) {
979 980 m_VariableAcquisitionWorker->abortProgressRequested(
980 981 itVarHandler->first);
981 982 }
982 983 m_VariableModel->setDataProgress(var, 0.0);
983 984 varHandler->m_CanUpdate = false;
984 985 varHandler->m_State = VariableRequestHandlerState::OFF;
985 986 varHandler->m_RunningVarRequest = VariableRequest{};
986 987 }
987 988 else {
988 989 // TODO: log Impossible to cancel the running variable request beacause its
989 990 // varRequestId isn't not the canceled one
990 991 }
991 992 break;
992 993 }
993 994 case VariableRequestHandlerState::PENDING: {
994 995 if (varHandler->m_RunningVarRequest.m_VariableGroupId == varRequestId) {
995 996 auto var = findVariable(itVarHandler->first);
996 997 auto varProvider = m_VariableToProviderMap.at(var);
997 998 if (varProvider != nullptr) {
998 999 m_VariableAcquisitionWorker->abortProgressRequested(
999 1000 itVarHandler->first);
1000 1001 }
1001 1002 m_VariableModel->setDataProgress(var, 0.0);
1002 1003 varHandler->m_CanUpdate = false;
1003 1004 varHandler->m_State = VariableRequestHandlerState::RUNNING;
1004 1005 varHandler->m_RunningVarRequest = varHandler->m_PendingVarRequest;
1005 1006 varHandler->m_PendingVarRequest = VariableRequest{};
1006 1007 executeVarRequest(var, varHandler->m_RunningVarRequest);
1007 1008 }
1008 1009 else if (varHandler->m_PendingVarRequest.m_VariableGroupId == varRequestId) {
1009 1010 varHandler->m_State = VariableRequestHandlerState::RUNNING;
1010 1011 varHandler->m_PendingVarRequest = VariableRequest{};
1011 1012 }
1012 1013 else {
1013 1014 // TODO: log Impossible to cancel the variable request beacause its
1014 1015 // varRequestId isn't not the canceled one
1015 1016 }
1016 1017 break;
1017 1018 }
1018 1019 default:
1019 1020 qCCritical(LOG_VariableController())
1020 1021 << QObject::tr("Unknown VariableRequestHandlerState");
1021 1022 }
1022 1023 }
1023 1024 }
1024 1025 qCDebug(LOG_VariableController()) << tr("cancelVariableRequest: erase") << varRequestId;
1025 1026 m_VarGroupIdToVarIds.erase(varRequestId);
1026 1027 if (m_VarGroupIdToVarIds.empty()) {
1027 1028 emit q->acquisitionFinished();
1028 1029 }
1029 1030 }
1030 1031
1031 1032 void VariableController::VariableControllerPrivate::executeVarRequest(std::shared_ptr<Variable> var,
1032 1033 VariableRequest &varRequest)
1033 1034 {
1034 1035 qCDebug(LOG_VariableController()) << tr("TORM: executeVarRequest");
1035 1036
1036 auto varId = m_VariableToIdentifierMap.at(var);
1037 auto varIdIt = m_VariableToIdentifierMap.find(var);
1038 if (varIdIt == m_VariableToIdentifierMap.cend()) {
1039 qCWarning(LOG_VariableController()) << tr(
1040 "Can't execute request of a variable that is not registered (may has been deleted)");
1041 return;
1042 }
1043
1044 auto varId = varIdIt->second;
1037 1045
1038 1046 auto varCacheRange = var->cacheRange();
1039 1047 auto varCacheRangeRequested = varRequest.m_CacheRangeRequested;
1040 1048 auto notInCacheRangeList
1041 1049 = Variable::provideNotInCacheRangeList(varCacheRange, varCacheRangeRequested);
1042 1050 auto inCacheRangeList
1043 1051 = Variable::provideInCacheRangeList(varCacheRange, varCacheRangeRequested);
1044 1052
1045 1053 if (!notInCacheRangeList.empty()) {
1046 1054
1047 1055 auto varProvider = m_VariableToProviderMap.at(var);
1048 1056 if (varProvider != nullptr) {
1049 1057 qCDebug(LOG_VariableController()) << "executeVarRequest " << varRequest.m_RangeRequested
1050 1058 << varRequest.m_CacheRangeRequested;
1051 1059 m_VariableAcquisitionWorker->pushVariableRequest(
1052 1060 varRequest.m_VariableGroupId, varId, varRequest.m_RangeRequested,
1053 1061 varRequest.m_CacheRangeRequested,
1054 1062 DataProviderParameters{std::move(notInCacheRangeList), var->metadata()},
1055 1063 varProvider);
1056 1064 }
1057 1065 else {
1058 1066 qCCritical(LOG_VariableController())
1059 1067 << "Impossible to provide data with a null provider";
1060 1068 }
1061 1069
1062 1070 if (!inCacheRangeList.empty()) {
1063 1071 emit q->updateVarDisplaying(var, inCacheRangeList.first());
1064 1072 }
1065 1073 }
1066 1074 else {
1067 1075 acceptVariableRequest(varId,
1068 1076 var->dataSeries()->subDataSeries(varRequest.m_CacheRangeRequested));
1069 1077 }
1070 1078 }
1079
1080 template <typename VariableIterator>
1081 void VariableController::VariableControllerPrivate::desynchronize(VariableIterator variableIt,
1082 const QUuid &syncGroupId)
1083 {
1084 const auto &variable = variableIt->first;
1085 const auto &variableId = variableIt->second;
1086
1087 // Gets synchronization group
1088 auto groupIt = m_GroupIdToVariableSynchronizationGroupMap.find(syncGroupId);
1089 if (groupIt == m_GroupIdToVariableSynchronizationGroupMap.cend()) {
1090 qCCritical(LOG_VariableController())
1091 << tr("Can't desynchronize variable %1: unknown synchronization group")
1092 .arg(variable->name());
1093 return;
1094 }
1095
1096 // Removes variable from synchronization group
1097 auto synchronizationGroup = groupIt->second;
1098 synchronizationGroup->removeVariableId(variableId);
1099
1100 // Removes link between variable and synchronization group
1101 m_VariableIdGroupIdMap.erase(variableId);
1102 }
General Comments 0
You need to be logged in to leave comments. Login now