Some fixes in the energy graph

This commit is contained in:
Michael Zanetti 2020-08-27 13:30:51 +02:00
parent 0f9caa03df
commit cfd6e0e1e9
4 changed files with 48 additions and 26 deletions

View File

@ -93,7 +93,7 @@ qreal XYSeriesAdapter::minValue() const
return m_minValue;
}
void XYSeriesAdapter::logEntryAdded(LogEntry *entry)
void XYSeriesAdapter::ensureSamples(const QDateTime &from, const QDateTime &to)
{
if (!m_series) {
return;
@ -101,34 +101,37 @@ void XYSeriesAdapter::logEntryAdded(LogEntry *entry)
if (m_samples.isEmpty()) {
Sample *sample = new Sample();
sample->timestamp = entry->timestamp().addSecs(m_sampleRate);
sample->entries.append(entry);
sample->last = entry;
sample->timestamp = from.addSecs(m_sampleRate);
m_newestSample = sample->timestamp;
m_oldestSample = m_newestSample;
m_samples.append(sample);
m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), entry->value().toDouble()));
m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), 0));
}
while (to > m_newestSample) {
Sample *sample = new Sample();
sample->timestamp = m_newestSample.addSecs(m_sampleRate);
m_newestSample = sample->timestamp;
m_samples.prepend(sample);
m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), 0));
}
while (from < m_oldestSample.addSecs(m_sampleRate)) {
Sample *sample = new Sample();
sample->timestamp = m_oldestSample.addSecs(-m_sampleRate);
m_oldestSample = sample->timestamp;
m_samples.append(sample);
m_series->append(sample->timestamp.toMSecsSinceEpoch(), 0);
}
}
void XYSeriesAdapter::logEntryAdded(LogEntry *entry)
{
if (!m_series) {
return;
}
while (entry->timestamp() > m_newestSample) {
Sample *sample = new Sample();
sample->timestamp = m_newestSample.addSecs(m_sampleRate);
sample->last = m_samples.value(0)->last;
m_newestSample = sample->timestamp;
m_samples.prepend(sample);
m_series->insert(0, QPointF(sample->timestamp.toMSecsSinceEpoch(), sample->last->value().toDouble()));
}
while (entry->timestamp() < m_oldestSample.addSecs(m_sampleRate)) {
Sample *sample = new Sample();
sample->timestamp = m_oldestSample.addSecs(-m_sampleRate);
sample->last = entry;
m_oldestSample = sample->timestamp;
m_samples.append(sample);
m_series->append(sample->timestamp.toMSecsSinceEpoch(), sample->last->value().toDouble());
}
ensureSamples(entry->timestamp(), entry->timestamp());
int idx = entry->timestamp().secsTo(m_newestSample) / m_sampleRate;
if (idx > m_samples.count()) {
@ -137,6 +140,15 @@ void XYSeriesAdapter::logEntryAdded(LogEntry *entry)
}
Sample *sample = m_samples.at(static_cast<int>(idx));
sample->entries.append(entry);
for (int i = idx; i > 0; i--) {
Sample *nextSample = m_samples.at(i);
if (!nextSample->last) {
nextSample->last = entry;
m_series->replace(i, nextSample->timestamp.toMSecsSinceEpoch(), calculateSampleValue(i));
} else {
break;
}
}
qreal value = calculateSampleValue(idx);
m_series->replace(idx, sample->timestamp.toMSecsSinceEpoch(), value);
@ -158,8 +170,10 @@ qreal XYSeriesAdapter::calculateSampleValue(int index)
int count = 0;
if (m_samples.length() > index + 1) {
Sample *previousSample = m_samples.at(static_cast<int>(index) + 1);
value = previousSample->last->value().toDouble();
count++;
if (previousSample->last) {
value = previousSample->last->value().toDouble();
count++;
}
}
foreach (LogEntry *entry, sample->entries) {
value += entry->value().toDouble();

View File

@ -48,6 +48,8 @@ public:
qreal maxValue() const;
qreal minValue() const;
Q_INVOKABLE void ensureSamples(const QDateTime &from, const QDateTime &to);
signals:
void xySeriesChanged();
void logsModelChanged();

View File

@ -437,7 +437,7 @@ Page {
if (!configListView.dragging) {
return 0;
}
return dndArea.mouseX < 50 ? -1 : dndArea.mouseX > dndArea.width - 50 ? 1 : 0
return dndArea.mouseX < 50 ? -2 : dndArea.mouseX > dndArea.width - 50 ? 2 : 0
}
onTriggered: {
configListView.contentX = Math.min(Math.max(0, configListView.contentX + direction), configListView.contentWidth - configListView.width)

View File

@ -129,6 +129,11 @@ MainViewBase {
sampleRate: chartView.sampleRate
xySeries: upperSeries
}
Connections {
target: xAxis
onMinChanged: seriesAdapter.ensureSamples(xAxis.min, xAxis.max)
onMaxChanged: seriesAdapter.ensureSamples(xAxis.min, xAxis.max)
}
property XYSeries lineSeries: LineSeries {
id: upperSeries
onPointAdded: {
@ -150,6 +155,7 @@ MainViewBase {
Component.onCompleted: {
print("creating series")
seriesAdapter.ensureSamples(xAxis.min, xAxis.max)
var areaSeries = chartView.createSeries(ChartView.SeriesTypeArea, consumer.thing.name, xAxis, yAxis)
areaSeries.upperSeries = upperSeries;
if (index > 0) {