Initial commit (project based on widgets)
This commit is contained in:
304
widgets/rtdatatext.cpp
Normal file
304
widgets/rtdatatext.cpp
Normal file
@@ -0,0 +1,304 @@
|
||||
/*
|
||||
Copyright 2016 - 2017 Benjamin Vedder benjamin@vedder.se
|
||||
|
||||
This file is part of VESC Tool.
|
||||
|
||||
VESC Tool is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
VESC Tool is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "rtdatatext.h"
|
||||
#include <QFont>
|
||||
#include <QPainter>
|
||||
#include <QPaintEvent>
|
||||
#include <QDebug>
|
||||
|
||||
RtDataText::RtDataText(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
mBoxH = 10;
|
||||
mBoxW = 10;
|
||||
mTxtOfs = 2;
|
||||
|
||||
mValues.packVoltage = 0.0;
|
||||
mValues.packCurrent = 0.0;
|
||||
mValues.soC = 0;
|
||||
mValues.cVHigh = 0.0;
|
||||
mValues.cVAverage = 0.0;
|
||||
mValues.cVLow = 0.0;
|
||||
mValues.cVMisMatch = 0.0;
|
||||
mValues.loadLCVoltage = 0.0;
|
||||
mValues.loadLCCurrent = 0.0;
|
||||
mValues.loadHCVoltage = 0.0;
|
||||
mValues.loadHCCurrent = 0.0;
|
||||
mValues.chargerVoltage = 0.0;
|
||||
mValues.auxVoltage = 0.0;
|
||||
mValues.auxCurrent = 0.0;
|
||||
mValues.tempBattHigh = 0.0;
|
||||
mValues.tempBattAverage = 0.0;
|
||||
mValues.tempBattLow = 0.0;
|
||||
mValues.tempBMSHigh = 0.0;
|
||||
mValues.tempBMSAverage = 0.0;
|
||||
mValues.tempBMSLow = 0.0;
|
||||
mValues.humidity = 0.0;
|
||||
mValues.opState = "Unknown.";
|
||||
mValues.faultState = "Unknown.";
|
||||
|
||||
mMode = false;
|
||||
}
|
||||
|
||||
void RtDataText::setValues(const BMS_VALUES &values)
|
||||
{
|
||||
mValues = values;
|
||||
//mValues.opState.remove(0, 11);
|
||||
update();
|
||||
}
|
||||
|
||||
void RtDataText::setCells(const QVector<double> &values)
|
||||
{
|
||||
mCells = values;
|
||||
update();
|
||||
}
|
||||
|
||||
void RtDataText::setMode(bool newMode)
|
||||
{
|
||||
mMode = newMode;
|
||||
}
|
||||
|
||||
QSize RtDataText::sizeHint() const
|
||||
{
|
||||
QSize size;
|
||||
size.setWidth(mBoxW + 2 * mTxtOfs);
|
||||
size.setHeight(mBoxH + 2 * mTxtOfs);
|
||||
return size;
|
||||
}
|
||||
|
||||
void RtDataText::paintEvent(QPaintEvent *event)
|
||||
{
|
||||
if ( mMode )
|
||||
paintCellsEvent(event);
|
||||
else
|
||||
paintBMSEvent(event);
|
||||
}
|
||||
|
||||
void RtDataText::paintBMSEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
// Paint begins here
|
||||
painter.fillRect(event->rect(), QBrush(Qt::transparent));
|
||||
|
||||
QFont font;
|
||||
font.setFamily("DejaVu Sans Mono");
|
||||
font.setPointSize(11);
|
||||
painter.setFont(font);
|
||||
|
||||
QRectF br = painter.boundingRect(QRectF(0, 0, 4000, 4000),
|
||||
"Fault : 00000000000000000"
|
||||
"T\n"
|
||||
"T\n"
|
||||
"T\n"
|
||||
"T\n"
|
||||
"T\n"
|
||||
"T\n");
|
||||
|
||||
int boxh_new = br.height();
|
||||
int boxw_new = br.width();
|
||||
int txtofs_new = 5;
|
||||
|
||||
if (mBoxH != boxh_new || mBoxW != boxw_new || mTxtOfs != txtofs_new) {
|
||||
mBoxH = boxh_new;
|
||||
mBoxW = boxw_new;
|
||||
mTxtOfs = txtofs_new;
|
||||
updateGeometry();
|
||||
}
|
||||
|
||||
QString str;
|
||||
|
||||
const double bbox_w = mBoxW + 2 * mTxtOfs;
|
||||
const double bbow_h = mBoxH + 2 * mTxtOfs;
|
||||
const double vidw = event->rect().width();
|
||||
|
||||
// Left info box
|
||||
str.sprintf("V Pack : %.2f V\n"
|
||||
"I Pack : %.2f A\n"
|
||||
"P Pack : %.1f W\n"
|
||||
"CVHigh : %.3f V\n"
|
||||
"CVAverage : %.3f V\n"
|
||||
"CVLow : %.3f V\n"
|
||||
"CMismatch : %.3f V\n",
|
||||
mValues.packVoltage,
|
||||
mValues.packCurrent,
|
||||
mValues.packCurrent * mValues.packVoltage,
|
||||
mValues.cVHigh,
|
||||
mValues.cVAverage,
|
||||
mValues.cVLow,
|
||||
mValues.cVMisMatch);
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(0, 0, bbox_w, bbow_h, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(mTxtOfs, mTxtOfs, mBoxW, mBoxH),
|
||||
Qt::AlignLeft, str);
|
||||
|
||||
// Middle info box
|
||||
str.sprintf("T Batt High : %.1f \u00B0C\n"
|
||||
"T Batt Avrg : %.1f \u00B0C\n"
|
||||
"T Batt Low : %.1f \u00B0C\n"
|
||||
"T BMS High : %.1f \u00B0C\n"
|
||||
"T BMS Avrg : %.1f \u00B0C\n"
|
||||
"T BMS Low : %.1f \u00B0C\n"
|
||||
"Humidity : %.1f %%\n",
|
||||
mValues.tempBattHigh,
|
||||
mValues.tempBattAverage,
|
||||
mValues.tempBattLow,
|
||||
mValues.tempBMSHigh,
|
||||
mValues.tempBMSAverage,
|
||||
mValues.tempBMSLow,
|
||||
mValues.humidity);
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(vidw / 2.0 - bbox_w / 2.0, 0, bbox_w, bbow_h, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(vidw / 2.0 - bbox_w / 2.0 + mTxtOfs, mTxtOfs, mBoxW, mBoxH),
|
||||
Qt::AlignLeft, str);
|
||||
|
||||
// Right info box
|
||||
str.sprintf("V Load : %.1f V\n"
|
||||
"P Load : %.1f W\n"
|
||||
"V Charger : %.1f V\n"
|
||||
"P Charger : %.1f W\n"
|
||||
"SoC : %i %%\n"
|
||||
"OpState : %s\n"
|
||||
"FaultState : %s\n",
|
||||
mValues.loadLCVoltage,
|
||||
mValues.packCurrent * mValues.loadLCVoltage,
|
||||
mValues.chargerVoltage,
|
||||
mValues.packCurrent * mValues.chargerVoltage,
|
||||
mValues.soC,
|
||||
mValues.opState.toLocal8Bit().data(),
|
||||
mValues.faultState.toLocal8Bit().data());
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(vidw - bbox_w, 0, bbox_w,mBoxH + 2 * mTxtOfs, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(vidw - bbox_w + mTxtOfs, mTxtOfs, mBoxW, mBoxH),Qt::AlignLeft, str);
|
||||
}
|
||||
|
||||
void RtDataText::paintCellsEvent(QPaintEvent *event)
|
||||
{
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
// Paint begins here
|
||||
painter.fillRect(event->rect(), QBrush(Qt::transparent));
|
||||
|
||||
QFont font;
|
||||
font.setFamily("DejaVu Sans Mono");
|
||||
font.setPointSize(11);
|
||||
painter.setFont(font);
|
||||
|
||||
QRectF br = painter.boundingRect(QRectF(0, 0, 4000, 4000),
|
||||
"Cell 2 : 0.123 V\n"
|
||||
"T\n"
|
||||
"T\n"
|
||||
"T\n");
|
||||
|
||||
int boxh_new = br.height();
|
||||
int boxw_new = br.width();
|
||||
int txtofs_new = 5;
|
||||
|
||||
if (mBoxH != boxh_new || mBoxW != boxw_new || mTxtOfs != txtofs_new) {
|
||||
mBoxH = boxh_new;
|
||||
mBoxW = boxw_new;
|
||||
mTxtOfs = txtofs_new;
|
||||
updateGeometry();
|
||||
}
|
||||
|
||||
// convert voltages to text
|
||||
QVector<QString> voltages;
|
||||
for(auto v: mCells)
|
||||
{
|
||||
QString str;
|
||||
str.sprintf("%.3f V", v);
|
||||
voltages.push_back(str);
|
||||
}
|
||||
// guarantee at least 12 items in 'voltages' vector
|
||||
for(int i=voltages.length(); i<12; ++i)
|
||||
voltages.push_back("N/A");
|
||||
|
||||
QString str;
|
||||
|
||||
const double bbox_w = mBoxW + 2 * mTxtOfs;
|
||||
const double bbow_h = mBoxH + 2 * mTxtOfs;
|
||||
const double vidw = event->rect().width();
|
||||
|
||||
// Left info box
|
||||
str = QString::asprintf("Cell 1 : %ls\n"
|
||||
"Cell 2 : %ls\n"
|
||||
"Cell 3 : %ls\n"
|
||||
"Cell 4 : %ls\n",
|
||||
voltages[0].utf16(),
|
||||
voltages[1].utf16(),
|
||||
voltages[2].utf16(),
|
||||
voltages[3].utf16());
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(0, 0, bbox_w, bbow_h, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(mTxtOfs, mTxtOfs, mBoxW, mBoxH),
|
||||
Qt::AlignLeft, str);
|
||||
|
||||
// Middle info box
|
||||
str = QString::asprintf("Cell 5 : %ls\n"
|
||||
"Cell 6 : %ls\n"
|
||||
"Cell 7 : %ls\n"
|
||||
"Cell 8 : %ls\n",
|
||||
voltages[4].utf16(),
|
||||
voltages[5].utf16(),
|
||||
voltages[6].utf16(),
|
||||
voltages[7].utf16());
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(vidw / 2.0 - bbox_w / 2.0, 0, bbox_w, bbow_h, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(vidw / 2.0 - bbox_w / 2.0 + mTxtOfs, mTxtOfs, mBoxW, mBoxH),
|
||||
Qt::AlignLeft, str);
|
||||
|
||||
// Right info box
|
||||
str = QString::asprintf("Cell 9 : %ls\n"
|
||||
"Cell 10 : %ls\n"
|
||||
"Cell 11 : %ls\n"
|
||||
"Cell 12 : %ls\n",
|
||||
voltages[8].utf16(),
|
||||
voltages[9].utf16(),
|
||||
voltages[10].utf16(),
|
||||
voltages[11].utf16());
|
||||
|
||||
painter.setOpacity(0.7);
|
||||
painter.fillRect(vidw - bbox_w, 0, bbox_w,mBoxH + 2 * mTxtOfs, Qt::black);
|
||||
painter.setOpacity(1.0);
|
||||
|
||||
painter.setPen(Qt::white);
|
||||
painter.drawText(QRectF(vidw - bbox_w + mTxtOfs, mTxtOfs, mBoxW, mBoxH),Qt::AlignLeft, str);
|
||||
}
|
||||
Reference in New Issue
Block a user