##// END OF EJS Templates
Add satic method to compute vector of in or not in ranges between...
Add satic method to compute vector of in or not in ranges between two ranges

File last commit:

r815:e8f1dd84704e
r816:97f935302b90
Show More
VariableController.cpp
901 lines | 37.1 KiB | text/x-c | CppLexer
/ core / src / Variable / VariableController.cpp
The mock plugin can now create data with view operation
r235 #include <Variable/Variable.h>
Implementation of V5 acquisition
r539 #include <Variable/VariableAcquisitionWorker.h>
#include <Variable/VariableCacheStrategy.h>
Alexandre Leroux
Updates cache strategy
r771 #include <Variable/VariableCacheStrategyFactory.h>
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 #include <Variable/VariableController.h>
Alexandre Leroux
Adds Variable model in the Variable controller
r113 #include <Variable/VariableModel.h>
Implementation of V5 acquisition
r539 #include <Variable/VariableSynchronizationGroup.h>
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111
Alexandre Leroux
Updates VariableController::createVariable() method...
r166 #include <Data/DataProviderParameters.h>
#include <Data/IDataProvider.h>
#include <Data/IDataSeries.h>
Add implementation of the Var Acquisition waiting
r626 #include <Data/VariableRequest.h>
Time widget is now used with the variable createion request
r193 #include <Time/TimeController.h>
Alexandre Leroux
Updates VariableController::createVariable() method...
r166
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 #include <QMutex>
#include <QThread>
Alexandre Leroux
Transits tokens in provider requests
r376 #include <QUuid>
Temporal parameters of the selected variables can be updated using the...
r304 #include <QtCore/QItemSelectionModel>
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111
Add implementation of the Var Acquisition waiting
r626 #include <deque>
Implementation of V5 acquisition
r539 #include <set>
Create a variable notify the variable cache parameter
r225 #include <unordered_map>
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 Q_LOGGING_CATEGORY(LOG_VariableController, "VariableController")
Implementation of V5 acquisition
r539 namespace {
change grapheRange to graphRange
r545 SqpRange computeSynchroRangeRequested(const SqpRange &varRange, const SqpRange &graphRange,
Implementation of V5 acquisition
r539 const SqpRange &oldGraphRange)
{
change grapheRange to graphRange
r545 auto zoomType = VariableController::getZoomType(graphRange, oldGraphRange);
Implementation of V5 acquisition
r539
auto varRangeRequested = varRange;
switch (zoomType) {
case AcquisitionZoomType::ZoomIn: {
change grapheRange to graphRange
r545 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
Implementation of V5 acquisition
r539 varRangeRequested.m_TStart += deltaLeft;
varRangeRequested.m_TEnd -= deltaRight;
break;
}
case AcquisitionZoomType::ZoomOut: {
change grapheRange to graphRange
r545 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
Implementation of V5 acquisition
r539 varRangeRequested.m_TStart -= deltaLeft;
varRangeRequested.m_TEnd += deltaRight;
break;
}
case AcquisitionZoomType::PanRight: {
Fix bug in synchro for operation (jump + rescaling)
r809 auto deltaLeft = graphRange.m_TStart - oldGraphRange.m_TStart;
change grapheRange to graphRange
r545 auto deltaRight = graphRange.m_TEnd - oldGraphRange.m_TEnd;
Fix bug in synchro for operation (jump + rescaling)
r809 varRangeRequested.m_TStart += deltaLeft;
Implementation of V5 acquisition
r539 varRangeRequested.m_TEnd += deltaRight;
break;
}
case AcquisitionZoomType::PanLeft: {
change grapheRange to graphRange
r545 auto deltaLeft = oldGraphRange.m_TStart - graphRange.m_TStart;
Fix bug in synchro for operation (jump + rescaling)
r809 auto deltaRight = oldGraphRange.m_TEnd - graphRange.m_TEnd;
Implementation of V5 acquisition
r539 varRangeRequested.m_TStart -= deltaLeft;
Fix bug in synchro for operation (jump + rescaling)
r809 varRangeRequested.m_TEnd -= deltaRight;
Implementation of V5 acquisition
r539 break;
}
case AcquisitionZoomType::Unknown: {
qCCritical(LOG_VariableController())
<< VariableController::tr("Impossible to synchronize: zoom type unknown");
break;
}
default:
qCCritical(LOG_VariableController()) << VariableController::tr(
"Impossible to synchronize: zoom type not take into account");
// No action
break;
}
return varRangeRequested;
}
}
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 struct VariableController::VariableControllerPrivate {
Alexandre Leroux
Use raw pointer for VariableModel (QObject class)
r159 explicit VariableControllerPrivate(VariableController *parent)
Create a variable notify the variable cache parameter
r225 : m_WorkingMutex{},
m_VariableModel{new VariableModel{parent}},
Temporal parameters of the selected variables can be updated using the...
r304 m_VariableSelectionModel{new QItemSelectionModel{m_VariableModel, parent}},
Alexandre Leroux
Updates cache strategy
r771 // m_VariableCacheStrategy{std::make_unique<VariableCacheStrategy>()},
m_VariableCacheStrategy{VariableCacheStrategyFactory::createCacheStrategy(
CacheStrategy::SingleThreshold)},
add Skeleton for displaying data which are already in cache
r571 m_VariableAcquisitionWorker{std::make_unique<VariableAcquisitionWorker>()},
q{parent}
Implementation of V5 acquisition
r539 {
m_VariableAcquisitionWorker->moveToThread(&m_VariableAcquisitionWorkerThread);
m_VariableAcquisitionWorkerThread.setObjectName("VariableAcquisitionWorkerThread");
}
virtual ~VariableControllerPrivate()
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 {
Implementation of V5 acquisition
r539 qCDebug(LOG_VariableController()) << tr("VariableControllerPrivate destruction");
m_VariableAcquisitionWorkerThread.quit();
m_VariableAcquisitionWorkerThread.wait();
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 }
Implementation of V5 acquisition
r539
Add implementation of the Var Acquisition waiting
r626 void processRequest(std::shared_ptr<Variable> var, const SqpRange &rangeRequested,
QUuid varRequestId);
Implementation of V5 acquisition
r539
Update worker for SqpRange compatibility
r530 QVector<SqpRange> provideNotInCacheDateTimeList(std::shared_ptr<Variable> variable,
const SqpRange &dateTime);
Add code of ProvideNotInCacheRange in VC controller
r529
Implementation of V5 acquisition
r539 std::shared_ptr<Variable> findVariable(QUuid vIdentifier);
std::shared_ptr<IDataSeries>
retrieveDataSeries(const QVector<AcquisitionDataPacket> acqDataPacketVector);
void registerProvider(std::shared_ptr<IDataProvider> provider);
Add implementation of the Var Acquisition waiting
r626 void storeVariableRequest(QUuid varId, QUuid varRequestId, const VariableRequest &varRequest);
QUuid acceptVariableRequest(QUuid varId, std::shared_ptr<IDataSeries> dataSeries);
void updateVariableRequest(QUuid varRequestId);
void cancelVariableRequest(QUuid varRequestId);
Next var request parameter is now based on previous request instead of...
r807 SqpRange getLastRequestedRange(QUuid varId);
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 QMutex m_WorkingMutex;
Alexandre Leroux
Use raw pointer for VariableModel (QObject class)
r159 /// Variable model. The VariableController has the ownership
VariableModel *m_VariableModel;
Temporal parameters of the selected variables can be updated using the...
r304 QItemSelectionModel *m_VariableSelectionModel;
Time widget is now used with the variable createion request
r193
Create a variable notify the variable cache parameter
r225
Correction MR
r195 TimeController *m_TimeController{nullptr};
Implementation of V5 acquisition
r539 std::unique_ptr<VariableCacheStrategy> m_VariableCacheStrategy;
std::unique_ptr<VariableAcquisitionWorker> m_VariableAcquisitionWorker;
QThread m_VariableAcquisitionWorkerThread;
The mock plugin can now create data with view operation
r235
std::unordered_map<std::shared_ptr<Variable>, std::shared_ptr<IDataProvider> >
m_VariableToProviderMap;
Alexandre Leroux
Corrects regression on variable destruction
r420 std::unordered_map<std::shared_ptr<Variable>, QUuid> m_VariableToIdentifierMap;
Implementation of V5 acquisition
r539 std::map<QUuid, std::shared_ptr<VariableSynchronizationGroup> >
m_GroupIdToVariableSynchronizationGroupMap;
std::map<QUuid, QUuid> m_VariableIdGroupIdMap;
std::set<std::shared_ptr<IDataProvider> > m_ProviderSet;
add Skeleton for displaying data which are already in cache
r571
Add implementation of the Var Acquisition waiting
r626 std::map<QUuid, std::map<QUuid, VariableRequest> > m_VarRequestIdToVarIdVarRequestMap;
std::map<QUuid, std::deque<QUuid> > m_VarIdToVarRequestIdQueueMap;
add Skeleton for displaying data which are already in cache
r571
VariableController *q;
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 };
Implementation of V5 acquisition
r539
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 VariableController::VariableController(QObject *parent)
Alexandre Leroux
Use raw pointer for VariableModel (QObject class)
r159 : QObject{parent}, impl{spimpl::make_unique_impl<VariableControllerPrivate>(this)}
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 {
Correction clang format
r365 qCDebug(LOG_VariableController()) << tr("VariableController construction")
<< QThread::currentThread();
Implement of the abort download process
r422
connect(impl->m_VariableModel, &VariableModel::abortProgessRequested, this,
&VariableController::onAbortProgressRequested);
Implementation of V5 acquisition
r539
Implementation of automatic cancel for request that failed
r761 connect(impl->m_VariableAcquisitionWorker.get(),
&VariableAcquisitionWorker::variableCanceledRequested, this,
&VariableController::onAbortAcquisitionRequested);
Implementation of V5 acquisition
r539 connect(impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::dataProvided, this,
&VariableController::onDataProvided);
connect(impl->m_VariableAcquisitionWorker.get(),
&VariableAcquisitionWorker::variableRequestInProgress, this,
&VariableController::onVariableRetrieveDataInProgress);
Implementation of automatic cancel for request that failed
r761
Implementation of V5 acquisition
r539 connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::started,
impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::initialize);
connect(&impl->m_VariableAcquisitionWorkerThread, &QThread::finished,
impl->m_VariableAcquisitionWorker.get(), &VariableAcquisitionWorker::finalize);
impl->m_VariableAcquisitionWorkerThread.start();
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 }
VariableController::~VariableController()
{
Correction clang format
r365 qCDebug(LOG_VariableController()) << tr("VariableController destruction")
<< QThread::currentThread();
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 this->waitForFinish();
}
Alexandre Leroux
Updates VariableController::createVariable() method...
r166 VariableModel *VariableController::variableModel() noexcept
Alexandre Leroux
Adds Variable model in the Variable controller
r113 {
Alexandre Leroux
Updates VariableController::createVariable() method...
r166 return impl->m_VariableModel;
Alexandre Leroux
Adds Variable model in the Variable controller
r113 }
Temporal parameters of the selected variables can be updated using the...
r304 QItemSelectionModel *VariableController::variableSelectionModel() noexcept
{
return impl->m_VariableSelectionModel;
}
Time widget is now used with the variable createion request
r193 void VariableController::setTimeController(TimeController *timeController) noexcept
{
impl->m_TimeController = timeController;
}
Alexandre Leroux
Adds 'Duplicate' action on variable menu
r706 std::shared_ptr<Variable>
VariableController::cloneVariable(std::shared_ptr<Variable> variable) noexcept
{
Alexandre Leroux
Creates duplicate only if the variable is in the model
r710 if (impl->m_VariableModel->containsVariable(variable)) {
// Clones variable
auto duplicate = variable->clone();
Alexandre Leroux
Clones variable
r707
Alexandre Leroux
Creates duplicate only if the variable is in the model
r710 // Adds clone to model
impl->m_VariableModel->addVariable(duplicate);
Alexandre Leroux
Adds variable to model
r708
Alexandre Leroux
Generates clone identifier in controller
r711 // Generates clone identifier
impl->m_VariableToIdentifierMap[duplicate] = QUuid::createUuid();
Alexandre Leroux
Generates and registers clone provider
r712 // Registers provider
auto variableProvider = impl->m_VariableToProviderMap.at(variable);
auto duplicateProvider = variableProvider != nullptr ? variableProvider->clone() : nullptr;
impl->m_VariableToProviderMap[duplicate] = duplicateProvider;
if (duplicateProvider) {
impl->registerProvider(duplicateProvider);
}
Alexandre Leroux
Creates duplicate only if the variable is in the model
r710 return duplicate;
}
else {
qCCritical(LOG_VariableController())
<< tr("Can't create duplicate of variable %1: variable not registered in the model")
.arg(variable->name());
return nullptr;
}
Alexandre Leroux
Adds 'Duplicate' action on variable menu
r706 }
Alexandre Leroux
Variable deletion (1)...
r329 void VariableController::deleteVariable(std::shared_ptr<Variable> variable) noexcept
{
if (!variable) {
qCCritical(LOG_VariableController()) << "Can't delete variable: variable is null";
return;
}
Alexandre Leroux
Variable deletion (6)...
r335 // Spreads in SciQlop that the variable will be deleted, so that potential receivers can
// make some treatments before the deletion
emit variableAboutToBeDeleted(variable);
Alexandre Leroux
Variable deletion (2)...
r330
Alexandre Leroux
Corrects regression on variable destruction
r420 // Deletes identifier
impl->m_VariableToIdentifierMap.erase(variable);
Alexandre Leroux
Variable deletion (2)...
r330 // Deletes provider
auto nbProvidersDeleted = impl->m_VariableToProviderMap.erase(variable);
qCDebug(LOG_VariableController())
<< tr("Number of providers deleted for variable %1: %2")
.arg(variable->name(), QString::number(nbProvidersDeleted));
Alexandre Leroux
Variable deletion (1)...
r329
Alexandre Leroux
Variable deletion (2)...
r331
Alexandre Leroux
Variable deletion (3)...
r332 // Deletes from model
impl->m_VariableModel->deleteVariable(variable);
}
Alexandre Leroux
Variable deletion (1)...
r329
void VariableController::deleteVariables(
const QVector<std::shared_ptr<Variable> > &variables) noexcept
{
for (auto variable : qAsConst(variables)) {
deleteVariable(variable);
}
}
Add test acquisition.
r590 std::shared_ptr<Variable>
VariableController::createVariable(const QString &name, const QVariantHash &metadata,
std::shared_ptr<IDataProvider> provider) noexcept
Alexandre Leroux
Affects model to the Variable Widget
r152 {
Time widget is now used with the variable createion request
r193 if (!impl->m_TimeController) {
qCCritical(LOG_VariableController())
<< tr("Impossible to create variable: The time controller is null");
Add test acquisition.
r590 return nullptr;
Time widget is now used with the variable createion request
r193 }
Implementation of V5 acquisition
r539 auto range = impl->m_TimeController->dateTime();
Alexandre Leroux
Updates variable creation to pass metadata...
r410
Fix bug when creating two variables crash the app. ...
r756 if (auto newVariable = impl->m_VariableModel->createVariable(name, metadata)) {
Implement the network controller to permit the execution of a request...
r389 auto identifier = QUuid::createUuid();
Create a variable notify the variable cache parameter
r225
The mock plugin can now create data with view operation
r235 // store the provider
Implementation of V5 acquisition
r539 impl->registerProvider(provider);
// Associate the provider
The mock plugin can now create data with view operation
r235 impl->m_VariableToProviderMap[newVariable] = provider;
Implementation of automatic cancel for request that failed
r761 qCInfo(LOG_VariableController()) << "createVariable: " << identifier;
Alexandre Leroux
Corrects regression on variable destruction
r420 impl->m_VariableToIdentifierMap[newVariable] = identifier;
The cache is now updated only if date requested has been successfully...
r318
Add implementation of the Var Acquisition waiting
r626 auto varRequestId = QUuid::createUuid();
impl->processRequest(newVariable, range, varRequestId);
impl->updateVariableRequest(varRequestId);
Add test acquisition.
r590
return newVariable;
Alexandre Leroux
Updates VariableController::createVariable() method...
r166 }
Alexandre Leroux
Affects model to the Variable Widget
r152 }
Change SqpRange for SqpDateTime
r512 void VariableController::onDateTimeOnSelection(const SqpRange &dateTime)
Temporal parameters of the selected variables can be updated using the...
r304 {
Implémentation timewidget
r811 // NOTE: Even if acquisition request is aborting, the graphe range will be changed
Correction clang format
r365 qCDebug(LOG_VariableController()) << "VariableController::onDateTimeOnSelection"
<< QThread::currentThread()->objectName();
Temporal parameters of the selected variables can be updated using the...
r304 auto selectedRows = impl->m_VariableSelectionModel->selectedRows();
Implémentation timewidget
r811 auto variables = QVector<std::shared_ptr<Variable> >{};
Temporal parameters of the selected variables can be updated using the...
r304
for (const auto &selectedRow : qAsConst(selectedRows)) {
if (auto selectedVariable = impl->m_VariableModel->variable(selectedRow.row())) {
Implémentation timewidget
r811 variables << selectedVariable;
Add comment
r442
// notify that rescale operation has to be done
Add connection logical for the rescale operation
r437 emit rangeChanged(selectedVariable, dateTime);
Temporal parameters of the selected variables can be updated using the...
r304 }
}
Implémentation timewidget
r811
if (!variables.isEmpty()) {
this->onRequestDataLoading(variables, dateTime, true);
}
Temporal parameters of the selected variables can be updated using the...
r304 }
Implementation of V5 acquisition
r539 void VariableController::onDataProvided(QUuid vIdentifier, const SqpRange &rangeRequested,
const SqpRange &cacheRangeRequested,
QVector<AcquisitionDataPacket> dataAcquired)
Add implementation of progress bar on variable inspector connected to...
r401 {
Add implementation of the Var Acquisition waiting
r626 auto retrievedDataSeries = impl->retrieveDataSeries(dataAcquired);
auto varRequestId = impl->acceptVariableRequest(vIdentifier, retrievedDataSeries);
if (!varRequestId.isNull()) {
impl->updateVariableRequest(varRequestId);
Implementation of V5 acquisition
r539 }
}
Add implementation of progress bar on variable inspector connected to...
r401
Implementation of V5 acquisition
r539 void VariableController::onVariableRetrieveDataInProgress(QUuid identifier, double progress)
{
request is now passed by shared pointer instead of const &
r751 qCDebug(LOG_VariableController())
<< "TORM: variableController::onVariableRetrieveDataInProgress"
<< QThread::currentThread()->objectName() << progress;
Correction for MR
r546 if (auto var = impl->findVariable(identifier)) {
Implementation of V5 acquisition
r539 impl->m_VariableModel->setDataProgress(var, progress);
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to notify progression of a null variable");
Add implementation of progress bar on variable inspector connected to...
r401 }
}
Implement of the abort download process
r422 void VariableController::onAbortProgressRequested(std::shared_ptr<Variable> variable)
{
Add thread protection on AbortDownload process
r423 auto it = impl->m_VariableToIdentifierMap.find(variable);
if (it != impl->m_VariableToIdentifierMap.cend()) {
Implementation of abort mechanism
r754 impl->m_VariableAcquisitionWorker->abortProgressRequested(it->second);
QUuid varRequestId;
auto varIdToVarRequestIdQueueMapIt = impl->m_VarIdToVarRequestIdQueueMap.find(it->second);
if (varIdToVarRequestIdQueueMapIt != impl->m_VarIdToVarRequestIdQueueMap.cend()) {
auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
varRequestId = varRequestIdQueue.front();
impl->cancelVariableRequest(varRequestId);
// Finish the progression for the request
impl->m_VariableModel->setDataProgress(variable, 0.0);
}
else {
qCWarning(LOG_VariableController())
<< tr("Aborting progression of inexistant variable request detected !!!")
<< QThread::currentThread()->objectName();
}
Implement of the abort download process
r422 }
else {
qCWarning(LOG_VariableController())
<< tr("Aborting progression of inexistant variable detected !!!")
<< QThread::currentThread()->objectName();
}
}
Implementation of automatic cancel for request that failed
r761 void VariableController::onAbortAcquisitionRequested(QUuid vIdentifier)
{
qCDebug(LOG_VariableController()) << "TORM: variableController::onAbortAcquisitionRequested"
<< QThread::currentThread()->objectName() << vIdentifier;
if (auto var = impl->findVariable(vIdentifier)) {
this->onAbortProgressRequested(var);
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to abort Acquisition Requestof a null variable");
}
}
Implementation of V5 acquisition
r539 void VariableController::onAddSynchronizationGroupId(QUuid synchronizationGroupId)
{
Add synchronization part of v5 acquisition
r540 qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronizationGroupId"
<< QThread::currentThread()->objectName()
<< synchronizationGroupId;
Implementation of V5 acquisition
r539 auto vSynchroGroup = std::make_shared<VariableSynchronizationGroup>();
impl->m_GroupIdToVariableSynchronizationGroupMap.insert(
std::make_pair(synchronizationGroupId, vSynchroGroup));
}
void VariableController::onRemoveSynchronizationGroupId(QUuid synchronizationGroupId)
{
impl->m_GroupIdToVariableSynchronizationGroupMap.erase(synchronizationGroupId);
}
Add synchronization part of v5 acquisition
r540 void VariableController::onAddSynchronized(std::shared_ptr<Variable> variable,
QUuid synchronizationGroupId)
{
qCDebug(LOG_VariableController()) << "TORM: VariableController::onAddSynchronized"
<< synchronizationGroupId;
Correction for MR
r546 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(variable);
if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
auto groupIdToVSGIt
Add synchronization part of v5 acquisition
r540 = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
Correction for MR
r546 if (groupIdToVSGIt != impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
Add synchronization part of v5 acquisition
r540 impl->m_VariableIdGroupIdMap.insert(
Correction for MR
r546 std::make_pair(varToVarIdIt->second, synchronizationGroupId));
groupIdToVSGIt->second->addVariableId(varToVarIdIt->second);
Add synchronization part of v5 acquisition
r540 }
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to synchronize a variable with an unknown sycnhronization group")
<< variable->name();
}
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to synchronize a variable with no identifier") << variable->name();
}
}
Alexandre Leroux
Handles desynchronisation when removing variable from a graph (1)...
r737 void VariableController::desynchronize(std::shared_ptr<Variable> variable,
QUuid synchronizationGroupId)
{
// Gets variable id
auto variableIt = impl->m_VariableToIdentifierMap.find(variable);
if (variableIt == impl->m_VariableToIdentifierMap.cend()) {
qCCritical(LOG_VariableController())
<< tr("Can't desynchronize variable %1: variable identifier not found")
.arg(variable->name());
return;
}
// Gets synchronization group
auto groupIt = impl->m_GroupIdToVariableSynchronizationGroupMap.find(synchronizationGroupId);
if (groupIt == impl->m_GroupIdToVariableSynchronizationGroupMap.cend()) {
qCCritical(LOG_VariableController())
<< tr("Can't desynchronize variable %1: unknown synchronization group")
.arg(variable->name());
return;
}
auto variableId = variableIt->second;
// Removes variable from synchronization group
auto synchronizationGroup = groupIt->second;
synchronizationGroup->removeVariableId(variableId);
// Removes link between variable and synchronization group
impl->m_VariableIdGroupIdMap.erase(variableId);
}
The mock plugin can now create data with view operation
r235
Implementation of V5 acquisition
r539 void VariableController::onRequestDataLoading(QVector<std::shared_ptr<Variable> > variables,
Implémentation timewidget
r811 const SqpRange &range, bool synchronise)
The mock plugin can now create data with view operation
r235 {
Implementation of V5 acquisition
r539 // NOTE: oldRange isn't really necessary since oldRange == variable->range().
The mock plugin can now create data with view operation
r235 // we want to load data of the variable for the dateTime.
// First we check if the cache contains some of them.
// For the other, we ask the provider to give them.
Add implementation of the Var Acquisition waiting
r626 auto varRequestId = QUuid::createUuid();
Implementation of abort mechanism
r754 qCDebug(LOG_VariableController()) << "VariableController::onRequestDataLoading"
<< QThread::currentThread()->objectName() << varRequestId;
Add implementation of the Var Acquisition waiting
r626
Correction for MR
r546 for (const auto &var : variables) {
Next range of a variable synchronized is now computed using:...
r627 qCDebug(LOG_VariableController()) << "processRequest for" << var->name() << varRequestId;
Add implementation of the Var Acquisition waiting
r626 impl->processRequest(var, range, varRequestId);
Implementation of V5 acquisition
r539 }
The mock plugin can now create data with view operation
r235
Implementation of V5 acquisition
r539 if (synchronise) {
// Get the group ids
Add synchronization part of v5 acquisition
r540 qCDebug(LOG_VariableController())
Correction for MR
r546 << "TORM VariableController::onRequestDataLoading for synchro var ENABLE";
Next range of a variable synchronized is now computed using:...
r627 auto groupIds = std::set<QUuid>{};
auto groupIdToOldRangeMap = std::map<QUuid, SqpRange>{};
Correction for MR
r546 for (const auto &var : variables) {
Add synchronization part of v5 acquisition
r540 auto varToVarIdIt = impl->m_VariableToIdentifierMap.find(var);
if (varToVarIdIt != impl->m_VariableToIdentifierMap.cend()) {
auto vId = varToVarIdIt->second;
auto varIdToGroupIdIt = impl->m_VariableIdGroupIdMap.find(vId);
if (varIdToGroupIdIt != impl->m_VariableIdGroupIdMap.cend()) {
auto gId = varIdToGroupIdIt->second;
Next range of a variable synchronized is now computed using:...
r627 groupIdToOldRangeMap.insert(std::make_pair(gId, var->range()));
Implementation of V5 acquisition
r539 if (groupIds.find(gId) == groupIds.cend()) {
Add synchronization part of v5 acquisition
r540 qCDebug(LOG_VariableController()) << "Synchro detect group " << gId;
Implementation of V5 acquisition
r539 groupIds.insert(gId);
}
}
}
Fix the cosinus bug....
r298 }
Implementation of V5 acquisition
r539
// We assume here all group ids exist
Correction for MR
r546 for (const auto &gId : groupIds) {
Implementation of V5 acquisition
r539 auto vSynchronizationGroup = impl->m_GroupIdToVariableSynchronizationGroupMap.at(gId);
auto vSyncIds = vSynchronizationGroup->getIds();
Add synchronization part of v5 acquisition
r540 qCDebug(LOG_VariableController()) << "Var in synchro group ";
Implementation of V5 acquisition
r539 for (auto vId : vSyncIds) {
auto var = impl->findVariable(vId);
Add synchronization part of v5 acquisition
r540
// Don't process already processed var
if (!variables.contains(var)) {
if (var != nullptr) {
qCDebug(LOG_VariableController()) << "processRequest synchro for"
<< var->name();
Next range of a variable synchronized is now computed using:...
r627 auto vSyncRangeRequested = computeSynchroRangeRequested(
var->range(), range, groupIdToOldRangeMap.at(gId));
qCDebug(LOG_VariableController()) << "synchro RR" << vSyncRangeRequested;
Add implementation of the Var Acquisition waiting
r626 impl->processRequest(var, vSyncRangeRequested, varRequestId);
Add synchronization part of v5 acquisition
r540 }
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to synchronize a null variable");
}
Implementation of V5 acquisition
r539 }
}
Fix the cosinus bug....
r298 }
The mock plugin can now create data with view operation
r235 }
Add implementation of the Var Acquisition waiting
r626
impl->updateVariableRequest(varRequestId);
The mock plugin can now create data with view operation
r235 }
Alexandre Leroux
Inits variable controller and adds it to the SciQlop app
r111 void VariableController::initialize()
{
qCDebug(LOG_VariableController()) << tr("VariableController init") << QThread::currentThread();
impl->m_WorkingMutex.lock();
qCDebug(LOG_VariableController()) << tr("VariableController init END");
}
void VariableController::finalize()
{
impl->m_WorkingMutex.unlock();
}
void VariableController::waitForFinish()
{
QMutexLocker locker{&impl->m_WorkingMutex};
}
Add code of ProvideNotInCacheRange in VC controller
r529
Implementation of V5 acquisition
r539 AcquisitionZoomType VariableController::getZoomType(const SqpRange &range, const SqpRange &oldRange)
{
// t1.m_TStart <= t2.m_TStart && t2.m_TEnd <= t1.m_TEnd
auto zoomType = AcquisitionZoomType::Unknown;
if (range.m_TStart <= oldRange.m_TStart && oldRange.m_TEnd <= range.m_TEnd) {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController()) << "zoomtype: ZoomOut";
Implementation of V5 acquisition
r539 zoomType = AcquisitionZoomType::ZoomOut;
}
else if (range.m_TStart > oldRange.m_TStart && range.m_TEnd > oldRange.m_TEnd) {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController()) << "zoomtype: PanRight";
Implementation of V5 acquisition
r539 zoomType = AcquisitionZoomType::PanRight;
}
else if (range.m_TStart < oldRange.m_TStart && range.m_TEnd < oldRange.m_TEnd) {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController()) << "zoomtype: PanLeft";
Implementation of V5 acquisition
r539 zoomType = AcquisitionZoomType::PanLeft;
}
else if (range.m_TStart > oldRange.m_TStart && oldRange.m_TEnd > range.m_TEnd) {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController()) << "zoomtype: ZoomIn";
Implementation of V5 acquisition
r539 zoomType = AcquisitionZoomType::ZoomIn;
}
else {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController()) << "getZoomType: Unknown type detected";
Implementation of V5 acquisition
r539 }
return zoomType;
}
Add code of ProvideNotInCacheRange in VC controller
r529
Implementation of V5 acquisition
r539 void VariableController::VariableControllerPrivate::processRequest(std::shared_ptr<Variable> var,
Add implementation of the Var Acquisition waiting
r626 const SqpRange &rangeRequested,
QUuid varRequestId)
Add code of ProvideNotInCacheRange in VC controller
r529 {
Add implementation of the Var Acquisition waiting
r626 auto varRequest = VariableRequest{};
Next var request parameter is now based on previous request instead of...
r807 auto it = m_VariableToIdentifierMap.find(var);
if (it != m_VariableToIdentifierMap.cend()) {
Alexandre Leroux
Fixes data loss in some cases of data recovery from the CosiunusProvider
r764
Next var request parameter is now based on previous request instead of...
r807 auto varId = it->second;
Implementation of V5 acquisition
r539
Next var request parameter is now based on previous request instead of...
r807 auto oldRange = getLastRequestedRange(varId);
Implementation of abort mechanism
r754
Next var request parameter is now based on previous request instead of...
r807 // check for update oldRange to the last request range.
if (oldRange == INVALID_RANGE) {
oldRange = var->range();
}
auto varStrategyRangesRequested
= m_VariableCacheStrategy->computeRange(oldRange, rangeRequested);
Add implementation of the Var Acquisition waiting
r626
Next var request parameter is now based on previous request instead of...
r807 auto notInCacheRangeList = QVector<SqpRange>{varStrategyRangesRequested.second};
auto inCacheRangeList = QVector<SqpRange>{};
if (m_VarIdToVarRequestIdQueueMap.find(varId) == m_VarIdToVarRequestIdQueueMap.cend()) {
notInCacheRangeList
= var->provideNotInCacheRangeList(varStrategyRangesRequested.second);
inCacheRangeList = var->provideInCacheRangeList(varStrategyRangesRequested.second);
}
if (!notInCacheRangeList.empty()) {
varRequest.m_RangeRequested = varStrategyRangesRequested.first;
varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second;
// store VarRequest
storeVariableRequest(varId, varRequestId, varRequest);
auto varProvider = m_VariableToProviderMap.at(var);
if (varProvider != nullptr) {
auto varRequestIdCanceled = m_VariableAcquisitionWorker->pushVariableRequest(
varRequestId, varId, varStrategyRangesRequested.first,
varStrategyRangesRequested.second,
DataProviderParameters{std::move(notInCacheRangeList), var->metadata()},
varProvider);
if (!varRequestIdCanceled.isNull()) {
Implementation of varRequestId cancel for the worker
r813 qCInfo(LOG_VariableAcquisitionWorker()) << tr("varRequestIdCanceled: ")
<< varRequestIdCanceled;
Next var request parameter is now based on previous request instead of...
r807 cancelVariableRequest(varRequestIdCanceled);
}
}
else {
qCCritical(LOG_VariableController())
<< "Impossible to provide data with a null provider";
}
Add implementation of the Var Acquisition waiting
r626
Next var request parameter is now based on previous request instead of...
r807 if (!inCacheRangeList.empty()) {
emit q->updateVarDisplaying(var, inCacheRangeList.first());
Add implementation of the Var Acquisition waiting
r626 }
Add code of ProvideNotInCacheRange in VC controller
r529 }
else {
Next var request parameter is now based on previous request instead of...
r807 varRequest.m_RangeRequested = varStrategyRangesRequested.first;
varRequest.m_CacheRangeRequested = varStrategyRangesRequested.second;
// store VarRequest
storeVariableRequest(varId, varRequestId, varRequest);
acceptVariableRequest(
varId, var->dataSeries()->subDataSeries(varStrategyRangesRequested.second));
add Skeleton for displaying data which are already in cache
r571 }
Add code of ProvideNotInCacheRange in VC controller
r529 }
Implementation of V5 acquisition
r539 }
std::shared_ptr<Variable>
VariableController::VariableControllerPrivate::findVariable(QUuid vIdentifier)
{
std::shared_ptr<Variable> var;
auto findReply = [vIdentifier](const auto &entry) { return vIdentifier == entry.second; };
auto end = m_VariableToIdentifierMap.cend();
auto it = std::find_if(m_VariableToIdentifierMap.cbegin(), end, findReply);
if (it != end) {
var = it->first;
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to find the variable with the identifier: ") << vIdentifier;
}
Add code of ProvideNotInCacheRange in VC controller
r529
Implementation of V5 acquisition
r539 return var;
}
std::shared_ptr<IDataSeries> VariableController::VariableControllerPrivate::retrieveDataSeries(
const QVector<AcquisitionDataPacket> acqDataPacketVector)
{
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size")
<< acqDataPacketVector.size();
Implementation of V5 acquisition
r539 std::shared_ptr<IDataSeries> dataSeries;
if (!acqDataPacketVector.isEmpty()) {
dataSeries = acqDataPacketVector[0].m_DateSeries;
for (int i = 1; i < acqDataPacketVector.size(); ++i) {
dataSeries->merge(acqDataPacketVector[i].m_DateSeries.get());
}
}
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 qCDebug(LOG_VariableController()) << tr("TORM: retrieveDataSeries acqDataPacketVector size END")
<< acqDataPacketVector.size();
Implementation of V5 acquisition
r539 return dataSeries;
}
void VariableController::VariableControllerPrivate::registerProvider(
std::shared_ptr<IDataProvider> provider)
{
if (m_ProviderSet.find(provider) == m_ProviderSet.end()) {
The dataSeries of a variable is now shared istead of uniq to avoid...
r542 qCDebug(LOG_VariableController()) << tr("Registering of a new provider")
<< provider->objectName();
Implementation of V5 acquisition
r539 m_ProviderSet.insert(provider);
connect(provider.get(), &IDataProvider::dataProvided, m_VariableAcquisitionWorker.get(),
&VariableAcquisitionWorker::onVariableDataAcquired);
connect(provider.get(), &IDataProvider::dataProvidedProgress,
m_VariableAcquisitionWorker.get(),
&VariableAcquisitionWorker::onVariableRetrieveDataInProgress);
Implementation of automatic cancel for request that failed
r761 connect(provider.get(), &IDataProvider::dataProvidedFailed,
m_VariableAcquisitionWorker.get(),
&VariableAcquisitionWorker::onVariableAcquisitionFailed);
Implementation of V5 acquisition
r539 }
else {
Add synchronization part of v5 acquisition
r540 qCDebug(LOG_VariableController()) << tr("Cannot register provider, it already exists ");
Implementation of V5 acquisition
r539 }
Add code of ProvideNotInCacheRange in VC controller
r529 }
Add implementation of the Var Acquisition waiting
r626
void VariableController::VariableControllerPrivate::storeVariableRequest(
QUuid varId, QUuid varRequestId, const VariableRequest &varRequest)
{
// First request for the variable. we can create an entry for it
auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.find(varId);
if (varIdToVarRequestIdQueueMapIt == m_VarIdToVarRequestIdQueueMap.cend()) {
auto varRequestIdQueue = std::deque<QUuid>{};
qCDebug(LOG_VariableController()) << tr("Store REQUEST in QUEUE");
varRequestIdQueue.push_back(varRequestId);
m_VarIdToVarRequestIdQueueMap.insert(std::make_pair(varId, std::move(varRequestIdQueue)));
}
else {
qCDebug(LOG_VariableController()) << tr("Store REQUEST in EXISTING QUEUE");
auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
varRequestIdQueue.push_back(varRequestId);
}
auto varRequestIdToVarIdVarRequestMapIt = m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
if (varRequestIdToVarIdVarRequestMapIt == m_VarRequestIdToVarIdVarRequestMap.cend()) {
auto varIdToVarRequestMap = std::map<QUuid, VariableRequest>{};
varIdToVarRequestMap.insert(std::make_pair(varId, varRequest));
qCDebug(LOG_VariableController()) << tr("Store REQUESTID in MAP");
m_VarRequestIdToVarIdVarRequestMap.insert(
std::make_pair(varRequestId, std::move(varIdToVarRequestMap)));
}
else {
auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
qCDebug(LOG_VariableController()) << tr("Store REQUESTID in EXISTING MAP");
varIdToVarRequestMap.insert(std::make_pair(varId, varRequest));
}
}
QUuid VariableController::VariableControllerPrivate::acceptVariableRequest(
QUuid varId, std::shared_ptr<IDataSeries> dataSeries)
{
QUuid varRequestId;
auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.find(varId);
if (varIdToVarRequestIdQueueMapIt != m_VarIdToVarRequestIdQueueMap.cend()) {
auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
varRequestId = varRequestIdQueue.front();
auto varRequestIdToVarIdVarRequestMapIt
= m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
if (varRequestIdToVarIdVarRequestMapIt != m_VarRequestIdToVarIdVarRequestMap.cend()) {
auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
auto varIdToVarRequestMapIt = varIdToVarRequestMap.find(varId);
if (varIdToVarRequestMapIt != varIdToVarRequestMap.cend()) {
qCDebug(LOG_VariableController()) << tr("acceptVariableRequest");
auto &varRequest = varIdToVarRequestMapIt->second;
varRequest.m_DataSeries = dataSeries;
varRequest.m_CanUpdate = true;
}
else {
qCDebug(LOG_VariableController())
<< tr("Impossible to acceptVariableRequest of a unknown variable id attached "
"to a variableRequestId")
<< varRequestId << varId;
}
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to acceptVariableRequest of a unknown variableRequestId")
<< varRequestId;
}
varRequestIdQueue.pop_front();
if (varRequestIdQueue.empty()) {
Improve synchro robustness.
r815 qCDebug(LOG_VariableController())
Implementation of automatic cancel for request that failed
r761 << tr("TORM Erase REQUEST because it has been accepted") << varId;
Add implementation of the Var Acquisition waiting
r626 m_VarIdToVarRequestIdQueueMap.erase(varId);
}
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to acceptVariableRequest of a unknown variable id") << varId;
}
return varRequestId;
}
void VariableController::VariableControllerPrivate::updateVariableRequest(QUuid varRequestId)
{
auto varRequestIdToVarIdVarRequestMapIt = m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
if (varRequestIdToVarIdVarRequestMapIt != m_VarRequestIdToVarIdVarRequestMap.cend()) {
bool processVariableUpdate = true;
auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
for (auto varIdToVarRequestMapIt = varIdToVarRequestMap.cbegin();
(varIdToVarRequestMapIt != varIdToVarRequestMap.cend()) && processVariableUpdate;
++varIdToVarRequestMapIt) {
processVariableUpdate &= varIdToVarRequestMapIt->second.m_CanUpdate;
qCDebug(LOG_VariableController()) << tr("updateVariableRequest")
<< processVariableUpdate;
}
if (processVariableUpdate) {
for (auto varIdToVarRequestMapIt = varIdToVarRequestMap.cbegin();
varIdToVarRequestMapIt != varIdToVarRequestMap.cend(); ++varIdToVarRequestMapIt) {
if (auto var = findVariable(varIdToVarRequestMapIt->first)) {
auto &varRequest = varIdToVarRequestMapIt->second;
var->setRange(varRequest.m_RangeRequested);
var->setCacheRange(varRequest.m_CacheRangeRequested);
Next range of a variable synchronized is now computed using:...
r627 qCDebug(LOG_VariableController()) << tr("1: onDataProvided")
<< varRequest.m_RangeRequested;
qCDebug(LOG_VariableController()) << tr("2: onDataProvided")
<< varRequest.m_CacheRangeRequested;
Add implementation of the Var Acquisition waiting
r626 var->mergeDataSeries(varRequest.m_DataSeries);
Alexandre Leroux
Removes unused method in DataSeries
r799 qCDebug(LOG_VariableController()) << tr("3: onDataProvided");
Alexandre Leroux
Blocks UI update of a variable while it has pending requests
r702
/// @todo MPL: confirm
// Variable update is notified only if there is no pending request for it
Implementation of abort mechanism
r754 // if
// (m_VarIdToVarRequestIdQueueMap.count(varIdToVarRequestMapIt->first)
// == 0) {
emit var->updated();
// }
Add implementation of the Var Acquisition waiting
r626 }
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to update data to a null variable");
}
}
// cleaning varRequestId
qCDebug(LOG_VariableController()) << tr("0: erase REQUEST in MAP ?")
<< m_VarRequestIdToVarIdVarRequestMap.size();
m_VarRequestIdToVarIdVarRequestMap.erase(varRequestId);
qCDebug(LOG_VariableController()) << tr("1: erase REQUEST in MAP ?")
<< m_VarRequestIdToVarIdVarRequestMap.size();
}
}
else {
qCCritical(LOG_VariableController())
<< tr("Cannot updateVariableRequest for a unknow varRequestId") << varRequestId;
}
}
void VariableController::VariableControllerPrivate::cancelVariableRequest(QUuid varRequestId)
{
// cleaning varRequestId
m_VarRequestIdToVarIdVarRequestMap.erase(varRequestId);
for (auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.begin();
varIdToVarRequestIdQueueMapIt != m_VarIdToVarRequestIdQueueMap.end();) {
auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
varRequestIdQueue.erase(
std::remove(varRequestIdQueue.begin(), varRequestIdQueue.end(), varRequestId),
varRequestIdQueue.end());
if (varRequestIdQueue.empty()) {
Implementation of varRequestId cancel for the worker
r813
qCCritical(LOG_VariableController())
<< tr("VariableControllerPrivate::cancelVariableRequest")
<< varIdToVarRequestIdQueueMapIt->first;
Add implementation of the Var Acquisition waiting
r626 varIdToVarRequestIdQueueMapIt
= m_VarIdToVarRequestIdQueueMap.erase(varIdToVarRequestIdQueueMapIt);
}
else {
++varIdToVarRequestIdQueueMapIt;
}
}
}
Next var request parameter is now based on previous request instead of...
r807
SqpRange VariableController::VariableControllerPrivate::getLastRequestedRange(QUuid varId)
{
auto lastRangeRequested = SqpRange{INVALID_RANGE};
auto varIdToVarRequestIdQueueMapIt = m_VarIdToVarRequestIdQueueMap.find(varId);
if (varIdToVarRequestIdQueueMapIt != m_VarIdToVarRequestIdQueueMap.cend()) {
auto &varRequestIdQueue = varIdToVarRequestIdQueueMapIt->second;
auto varRequestId = varRequestIdQueue.back();
auto varRequestIdToVarIdVarRequestMapIt
= m_VarRequestIdToVarIdVarRequestMap.find(varRequestId);
if (varRequestIdToVarIdVarRequestMapIt != m_VarRequestIdToVarIdVarRequestMap.cend()) {
auto &varIdToVarRequestMap = varRequestIdToVarIdVarRequestMapIt->second;
auto varIdToVarRequestMapIt = varIdToVarRequestMap.find(varId);
if (varIdToVarRequestMapIt != varIdToVarRequestMap.cend()) {
auto &varRequest = varIdToVarRequestMapIt->second;
lastRangeRequested = varRequest.m_RangeRequested;
}
else {
qCDebug(LOG_VariableController())
<< tr("Impossible to getLastRequestedRange of a unknown variable id attached "
"to a variableRequestId")
<< varRequestId << varId;
}
}
else {
qCCritical(LOG_VariableController())
<< tr("Impossible to getLastRequestedRange of a unknown variableRequestId")
<< varRequestId;
}
}
else {
qDebug(LOG_VariableController())
<< tr("Impossible to getLastRequestedRange of a unknown variable id") << varId;
}
return lastRangeRequested;
}