##// 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:

r818:68959f479714
r821:97f935302b90
Show More
CosinusProvider.cpp
213 lines | 7.9 KiB | text/x-c | CppLexer
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 #include "CosinusProvider.h"
Alexandre Leroux
Handles parametric frequency
r780 #include "MockDefs.h"
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128
#include <Data/DataProviderParameters.h>
#include <Data/ScalarSeries.h>
Alexandre Leroux
Generates vectors (2)...
r783 #include <Data/VectorSeries.h>
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128
Add cmath header missing
r135 #include <cmath>
Add DownloadProgress emission for mock plugin
r428 #include <QFuture>
Add current progression for thread fix
r364 #include <QThread>
Add DownloadProgress emission for mock plugin
r428 #include <QtConcurrent/QtConcurrent>
Fix the cosinus bug....
r298
The cosinus provider can now handle data request
r231 Q_LOGGING_CATEGORY(LOG_CosinusProvider, "CosinusProvider")
Alexandre Leroux
Generates vectors (1)...
r782 namespace {
/// Abstract cosinus type
struct ICosinusType {
virtual ~ICosinusType() = default;
/// @return the number of components generated for the type
virtual int componentCount() const = 0;
/// @return the data series created for the type
virtual std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
std::vector<double> valuesData,
Unit xAxisUnit,
Unit valuesUnit) const = 0;
};
Alexandre Leroux
Generates vectors (2)...
r783 struct ScalarCosinus : public ICosinusType {
int componentCount() const override { return 1; }
std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
std::vector<double> valuesData, Unit xAxisUnit,
Unit valuesUnit) const override
{
return std::make_shared<ScalarSeries>(std::move(xAxisData), std::move(valuesData),
xAxisUnit, valuesUnit);
}
};
struct VectorCosinus : public ICosinusType {
int componentCount() const override { return 3; }
std::shared_ptr<IDataSeries> createDataSeries(std::vector<double> xAxisData,
std::vector<double> valuesData, Unit xAxisUnit,
Unit valuesUnit) const override
{
return std::make_shared<VectorSeries>(std::move(xAxisData), std::move(valuesData),
xAxisUnit, valuesUnit);
}
};
Alexandre Leroux
Generates vectors (3)...
r784 /// Converts string to cosinus type
/// @return the cosinus type if the string could be converted, nullptr otherwise
std::unique_ptr<ICosinusType> cosinusType(const QString &type) noexcept
{
if (type.compare(QStringLiteral("scalar"), Qt::CaseInsensitive) == 0) {
return std::make_unique<ScalarCosinus>();
}
else if (type.compare(QStringLiteral("vector"), Qt::CaseInsensitive) == 0) {
return std::make_unique<VectorCosinus>();
}
else {
return nullptr;
}
}
Alexandre Leroux
Generates vectors (1)...
r782 } // namespace
Alexandre Leroux
Generates and registers clone provider
r712 std::shared_ptr<IDataProvider> CosinusProvider::clone() const
{
// No copy is made in clone
return std::make_shared<CosinusProvider>();
}
Implementation of V5 acquisition
r539 std::shared_ptr<IDataSeries> CosinusProvider::retrieveData(QUuid acqIdentifier,
Alexandre Leroux
Updates cosinus provider to handle metadata
r779 const SqpRange &dataRangeRequested,
const QVariantHash &data)
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 {
Add DownloadProgress emission for mock plugin
r428 // TODO: Add Mutex
Fix the cosinus bug....
r298 auto dataIndex = 0;
The cosinus provider can now handle data request
r231
Alexandre Leroux
Generates vectors (3)...
r784 // Retrieves cosinus type
auto typeVariant = data.value(COSINUS_TYPE_KEY, COSINUS_TYPE_DEFAULT_VALUE);
if (!typeVariant.canConvert<QString>()) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid type");
return nullptr;
}
auto type = cosinusType(typeVariant.toString());
if (!type) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: unknown type");
return nullptr;
}
Alexandre Leroux
Handles parametric frequency
r780 // Retrieves frequency
auto freqVariant = data.value(COSINUS_FREQUENCY_KEY, COSINUS_FREQUENCY_DEFAULT_VALUE);
if (!freqVariant.canConvert<double>()) {
qCCritical(LOG_CosinusProvider()) << tr("Can't retrieve data: invalid frequency");
return nullptr;
}
The cosinus provider can now handle data request
r231 // Gets the timerange from the parameters
Alexandre Leroux
Handles parametric frequency
r780 double freq = freqVariant.toDouble();
double start = std::ceil(dataRangeRequested.m_TStart * freq);
double end = std::floor(dataRangeRequested.m_TEnd * freq);
The cosinus provider can now handle data request
r231
// We assure that timerange is valid
if (end < start) {
std::swap(start, end);
}
Alexandre Leroux
Implements unit test (3)...
r745 // Generates scalar series containing cosinus values (one value per second, end value is
// included)
auto dataCount = end - start + 1;
The cosinus provider can now handle data request
r231
Alexandre Leroux
Generates vectors (4)...
r785 // Number of components (depending on the cosinus type)
auto componentCount = type->componentCount();
Alexandre Leroux
Uses std::vector instead of QVector in ArrayData (1)...
r694 auto xAxisData = std::vector<double>{};
Alexandre Leroux
Updates cosinus provider...
r452 xAxisData.resize(dataCount);
Alexandre Leroux
Uses std::vector instead of QVector in ArrayData (1)...
r694 auto valuesData = std::vector<double>{};
Alexandre Leroux
Generates vectors (4)...
r785 valuesData.resize(dataCount * componentCount);
Add DownloadProgress emission for mock plugin
r428
int progress = 0;
Alexandre Leroux
Updates cosinus provider...
r452 auto progressEnd = dataCount;
Alexandre Leroux
Implements unit test (3)...
r745 for (auto time = start; time <= end; ++time, ++dataIndex) {
Implementation of V5 acquisition
r539 auto it = m_VariableToEnableProvider.find(acqIdentifier);
Add DownloadProgress emission for mock plugin
r428 if (it != m_VariableToEnableProvider.end() && it.value()) {
const auto timeOnFreq = time / freq;
Alexandre Leroux
Updates cosinus provider...
r452
Alexandre Leroux
Uses std::vector instead of QVector in ArrayData (1)...
r694 xAxisData[dataIndex] = timeOnFreq;
Alexandre Leroux
Generates vectors (4)...
r785
// Generates all components' values
// Example: for a vector, values will be : cos(x), cos(x)/2, cos(x)/3
auto value = std::cos(timeOnFreq);
for (auto i = 0; i < componentCount; ++i) {
valuesData[componentCount * dataIndex + i] = value / (i + 1);
}
Add DownloadProgress emission for mock plugin
r428
// progression
int currentProgress = (time - start) * 100.0 / progressEnd;
if (currentProgress != progress) {
progress = currentProgress;
Implementation of V5 acquisition
r539 emit dataProvidedProgress(acqIdentifier, progress);
Improve cosinus tests with:...
r811 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::retrieveData"
<< QThread::currentThread()->objectName()
<< progress;
Implementation of progression
r750 // NOTE: Try to use multithread if possible
Add DownloadProgress emission for mock plugin
r428 }
}
else {
if (!it.value()) {
qCDebug(LOG_CosinusProvider())
<< "CosinusProvider::retrieveData: ARRET De l'acquisition detecté"
<< end - time;
}
}
The cosinus provider can now handle data request
r231 }
Implementation of progression
r750 if (progress != 100) {
// We can close progression beacause all data has been retrieved
emit dataProvidedProgress(acqIdentifier, 100);
}
Alexandre Leroux
Generates vectors (4)...
r785 return type->createDataSeries(std::move(xAxisData), std::move(valuesData),
Unit{QStringLiteral("t"), true}, Unit{});
Alexandre Leroux
Creates a default provider that will be returned by the mock plugin
r128 }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310
Implementation of V5 acquisition
r539 void CosinusProvider::requestDataLoading(QUuid acqIdentifier,
const DataProviderParameters &parameters)
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 {
Add DownloadProgress emission for mock plugin
r428 // TODO: Add Mutex
Implementation of V5 acquisition
r539 m_VariableToEnableProvider[acqIdentifier] = true;
Initialisation of the graph range at creation in a new graphe, or inside...
r548 qCDebug(LOG_CosinusProvider()) << "TORM: CosinusProvider::requestDataLoading"
Change info to debug on thread display log
r367 << QThread::currentThread()->objectName();
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 // NOTE: Try to use multithread if possible
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r408 const auto times = parameters.m_Times;
Add DownloadProgress emission for mock plugin
r428
Alexandre Leroux
Updates IDataProvider::requestDataLoading() method's signature...
r408 for (const auto &dateTime : qAsConst(times)) {
Implementation of V5 acquisition
r539 if (m_VariableToEnableProvider[acqIdentifier]) {
Alexandre Leroux
Updates cosinus provider to handle metadata
r779 auto scalarSeries = this->retrieveData(acqIdentifier, dateTime, parameters.m_Data);
Implementation of varRequestId cancel for the worker
r818 qCCritical(LOG_CosinusProvider()) << "TORM: CosinusProvider::dataProvided";
Implementation of V5 acquisition
r539 emit dataProvided(acqIdentifier, scalarSeries, dateTime);
Add DownloadProgress emission for mock plugin
r428 }
Alexandre Leroux
Use std::shared_ptr in CosinusProvider
r310 }
}
Implement of the abort download process
r422
Implementation of V5 acquisition
r539 void CosinusProvider::requestDataAborting(QUuid acqIdentifier)
Implement of the abort download process
r422 {
Add DownloadProgress emission for mock plugin
r428 // TODO: Add Mutex
Implementation of V5 acquisition
r539 qCDebug(LOG_CosinusProvider()) << "CosinusProvider::requestDataAborting" << acqIdentifier
Remove abort button validity when the progress is finished (eg. == 0)
r432 << QThread::currentThread()->objectName();
Implementation of V5 acquisition
r539 auto it = m_VariableToEnableProvider.find(acqIdentifier);
Add DownloadProgress emission for mock plugin
r428 if (it != m_VariableToEnableProvider.end()) {
it.value() = false;
}
else {
qCWarning(LOG_CosinusProvider())
<< tr("Aborting progression of inexistant identifier detected !!!");
}
Implement of the abort download process
r422 }
Improve cosinus tests with:...
r811
std::shared_ptr<IDataSeries> CosinusProvider::provideDataSeries(const SqpRange &dataRangeRequested,
const QVariantHash &data)
{
auto uid = QUuid::createUuid();
m_VariableToEnableProvider[uid] = true;
auto dataSeries = this->retrieveData(uid, dataRangeRequested, data);
m_VariableToEnableProvider.remove(uid);
return dataSeries;
}