CosinusProvider.cpp
109 lines
| 3.7 KiB
| text/x-c
|
CppLexer
Alexandre Leroux
|
r120 | #include "CosinusProvider.h" | ||
#include <Data/DataProviderParameters.h> | ||||
#include <Data/ScalarSeries.h> | ||||
r127 | #include <cmath> | |||
r394 | #include <QFuture> | |||
r336 | #include <QThread> | |||
r394 | #include <QtConcurrent/QtConcurrent> | |||
r276 | ||||
r215 | Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider") | |||
Alexandre Leroux
|
r656 | std::shared_ptr<IDataProvider> CosinusProvider::clone() const | ||
{ | ||||
// No copy is made in clone | ||||
return std::make_shared<CosinusProvider>(); | ||||
} | ||||
r510 | std::shared_ptr<IDataSeries> CosinusProvider::retrieveData(QUuid acqIdentifier, | |||
const SqpRange &dataRangeRequested) | ||||
Alexandre Leroux
|
r120 | { | ||
r394 | // TODO: Add Mutex | |||
r276 | auto dataIndex = 0; | |||
r215 | ||||
// Gets the timerange from the parameters | ||||
Alexandre Leroux
|
r680 | double freq = 1.0; | ||
r510 | double start = std::ceil(dataRangeRequested.m_TStart * freq); // 100 htz | |||
double end = std::floor(dataRangeRequested.m_TEnd * freq); // 100 htz | ||||
r215 | ||||
// We assure that timerange is valid | ||||
if (end < start) { | ||||
std::swap(start, end); | ||||
} | ||||
// Generates scalar series containing cosinus values (one value per second) | ||||
Alexandre Leroux
|
r418 | auto dataCount = end - start; | ||
r215 | ||||
Alexandre Leroux
|
r644 | auto xAxisData = std::vector<double>{}; | ||
Alexandre Leroux
|
r418 | xAxisData.resize(dataCount); | ||
Alexandre Leroux
|
r644 | auto valuesData = std::vector<double>{}; | ||
Alexandre Leroux
|
r418 | valuesData.resize(dataCount); | ||
r394 | ||||
int progress = 0; | ||||
Alexandre Leroux
|
r418 | auto progressEnd = dataCount; | ||
r215 | for (auto time = start; time < end; ++time, ++dataIndex) { | |||
r510 | auto it = m_VariableToEnableProvider.find(acqIdentifier); | |||
r394 | if (it != m_VariableToEnableProvider.end() && it.value()) { | |||
const auto timeOnFreq = time / freq; | ||||
Alexandre Leroux
|
r418 | |||
Alexandre Leroux
|
r644 | xAxisData[dataIndex] = timeOnFreq; | ||
valuesData[dataIndex] = std::cos(timeOnFreq); | ||||
r394 | ||||
// progression | ||||
int currentProgress = (time - start) * 100.0 / progressEnd; | ||||
if (currentProgress != progress) { | ||||
progress = currentProgress; | ||||
r510 | emit dataProvidedProgress(acqIdentifier, progress); | |||
r394 | } | |||
} | ||||
else { | ||||
if (!it.value()) { | ||||
qCDebug(LOG_CosinusProvider()) | ||||
<< "CosinusProvider::retrieveData: ARRET De l'acquisition detecté" | ||||
<< end - time; | ||||
} | ||||
} | ||||
r215 | } | |||
r510 | emit dataProvidedProgress(acqIdentifier, 0.0); | |||
r394 | ||||
Alexandre Leroux
|
r418 | return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData), | ||
Unit{QStringLiteral("t"), true}, Unit{}); | ||||
Alexandre Leroux
|
r120 | } | ||
Alexandre Leroux
|
r287 | |||
r510 | void CosinusProvider::requestDataLoading(QUuid acqIdentifier, | |||
const DataProviderParameters ¶meters) | ||||
Alexandre Leroux
|
r287 | { | ||
r394 | // TODO: Add Mutex | |||
r510 | m_VariableToEnableProvider[acqIdentifier] = true; | |||
Alexandre Leroux
|
r680 | qCDebug(LOG_CosinusProvider()) | ||
<< "TORM: CosinusProvider::requestDataLoading" << QThread::currentThread()->objectName(); | ||||
Alexandre Leroux
|
r287 | // NOTE: Try to use multithread if possible | ||
Alexandre Leroux
|
r375 | const auto times = parameters.m_Times; | ||
r394 | ||||
Alexandre Leroux
|
r375 | for (const auto &dateTime : qAsConst(times)) { | ||
r510 | if (m_VariableToEnableProvider[acqIdentifier]) { | |||
auto scalarSeries = this->retrieveData(acqIdentifier, dateTime); | ||||
r518 | qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::dataProvided"; | |||
r510 | emit dataProvided(acqIdentifier, scalarSeries, dateTime); | |||
r394 | } | |||
Alexandre Leroux
|
r287 | } | ||
} | ||||
r388 | ||||
r510 | void CosinusProvider::requestDataAborting(QUuid acqIdentifier) | |||
r388 | { | |||
r394 | // TODO: Add Mutex | |||
r510 | qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier | |||
r398 | << QThread::currentThread()->objectName(); | |||
r510 | auto it = m_VariableToEnableProvider.find(acqIdentifier); | |||
r394 | if (it != m_VariableToEnableProvider.end()) { | |||
it.value() = false; | ||||
} | ||||
else { | ||||
qCWarning(LOG_CosinusProvider()) | ||||
<< tr("Aborting progression of inexistant identifier detected !!!"); | ||||
} | ||||
r388 | } | |||