Files
CuboBmsTool/visualizationpage.cpp
2022-08-01 21:53:36 +03:00

1434 lines
63 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "visualizationpage.h"
#include "ui_visualizationpage.h"
#include <QTimer>
#include <QRandomGenerator>
VisualizationPage::VisualizationPage(QWidget *parent) :
QFrame(parent),
ui(new Ui::VisualizationPage),
mDieBieMS(nullptr)
{
ui->setupUi(this);
mIsThisPageActivated = false;
ui->pbPlus->hide();
ui->rtText->hide();
ui->tempGraph->hide();
ui->lbTCurTemp->hide();
ui->lbVTime->hide();
ui->lbATime->hide();
ui->lbTTime->hide();
ui->lbCTime->hide();
//V
ui->lbVMidLegendVal->hide();
ui->lbVMidLegendMeasure->hide();
ui->lbVSecondLegendColorLine->hide();
ui->lbVSecondLegendSubTitle->hide();
//V
ui->lbVMinLegendVal->hide();
ui->lbVMinLegendMeasure->hide();
ui->lbVThirdLegendColorLine->hide();
ui->lbVThirdLegendSubTitle->hide();
//A
ui->lbAMidLegendVal->hide();
ui->lbAMidLegendMeasure->hide();
ui->lbASecondLegendColorLine->hide();
ui->lbASecondLegendSubTitle->hide();
//A
ui->lbAMinLegendVal->hide();
ui->lbAMinLegendMeasure->hide();
ui->lbAThirdLegendColorLine->hide();
ui->lbAThirdLegendSubTitle->hide();
ui->checkBox->hide();
/*
ui->lbTMinLegendVal->hide();
ui->lbTMinLegendMeasure->hide();
ui->lbTThirdLegendColorLine->hide();
ui->lbTThirdLegendSubTitle->hide();
ui->lbTMinLegendValBms->hide();
ui->lbTMinLegendMeasureBms->hide();
ui->lbTThirdLegendColorLineBms->hide();
ui->lbTThirdLegendSubTitleBms->hide();
*/
m_btnGroup = new QButtonGroup(this);
m_btnGroup->addButton(ui->pbVisualizationMenuBarVoltage );
m_btnGroup->addButton(ui->pbVisualizationMenuBarAmperage );
m_btnGroup->addButton(ui->pbVisualizationMenuBarTemperatureBat );
m_btnGroup->addButton(ui->pbVisualizationMenuBarTemperatureBms );
m_btnGroup->addButton(ui->pbVisualizationMenuBarCells );
m_btnGroup->addButton(ui->pbVisualizationMenuBarCellsAll );
m_currentPageIndex = TabWidgetPage::TemperatureBat;
onTabBarButtonClicked();
chartV = new VisualizationChart(ui->chartViewVoltage->geometry().width(), ui->chartViewVoltage->geometry().height());
chartV->setTitleForY("Напряжение, В");
chartV->addSeriesWithNumber(VoltageMax , tr("Максимальная"), Qt::red);
//chartV->addSeriesWithNumber(VoltageMid , tr("Средняя"), Qt::green);
//chartV->addSeriesWithNumber(VoltageMin , tr("Низкая"), Qt::yellow);
chartA = new VisualizationChart(ui->chartViewAmperage->geometry().width(), ui->chartViewAmperage->geometry().height());
chartA->setTitleForY("Ток, А");
chartA->addSeriesWithNumber(AmperageMax , tr("Максимальная"), Qt::red);
//chartA->addSeriesWithNumber(AmperageMid , tr("Средняя"), Qt::green);
//chartA->addSeriesWithNumber(AmperageMin , tr("Низкая"), Qt::yellow);
//ui->chartViewTemperature->geometry().width(),
//ui->chartViewTemperature->geometry().height(),
//-10, 50, false);
/*
chartT->addSeriesWithNumber(TemperatureMax , tr("Максимальная"), Qt::red);
chartT->addSeriesWithNumber(TemperatureMid , tr("Средняя"), Qt::green);
chartT->addSeriesWithNumber(TemperatureMin , tr("Низкая"), Qt::yellow);
*/
chartT = new VisualizationChart(ui->chartViewTemperature->geometry().width(), ui->chartViewTemperature->geometry().height());
chartT->setTitleForY("Температура, °C");
chartT->addSeriesWithNumber(TemperatureBatMax , tr("Максимальная"), Qt::red);
chartT->addSeriesWithNumber(TemperatureBatMid , tr("Средняя"), Qt::green);
chartT->addSeriesWithNumber(TemperatureBatMin , tr("Низкая"), Qt::yellow);
chartTB = new VisualizationChart(ui->chartViewTemperatureBms->geometry().width(), ui->chartViewTemperatureBms->geometry().height());
chartTB->setTitleForY("Температура, °C");
chartTB->addSeriesWithNumber(TemperatureBmsMax , tr("Максимальная"), Qt::red);
chartTB->addSeriesWithNumber(TemperatureBmsMid , tr("Средняя"), Qt::green);
chartTB->addSeriesWithNumber(TemperatureBmsMin , tr("Низкая"), Qt::yellow);
chartC = new VisualizationChart(ui->chartViewCells->geometry().width(), ui->chartViewCells->geometry().height());
chartC->setTitleForY("Напряжение, В");
chartC->addSeriesWithNumber(CellsMax , tr("Максимальная"), Qt::red);
chartC->addSeriesWithNumber(CellsMid , tr("Средняя"), Qt::green);
chartC->addSeriesWithNumber(CellsMin , tr("Низкая"), Qt::yellow);
chartCA = new VisualizationChart(ui->chartViewCellsAll->geometry().width(), ui->chartViewCellsAll->geometry().height());
chartCA->setTitleForY("Напряжение, В");
initColorsForChartCellsAll();
//chartCA->legend();
/*
chartC->addSeriesWithNumber(CellsMax , tr("Максимальная"), Qt::red);
chartC->addSeriesWithNumber(CellsMid , tr("Средняя"), Qt::green);
chartC->addSeriesWithNumber(CellsMin , tr("Низкая"), Qt::yellow);
*/
//chartV->setTitleForY(tr("Напряжение, В"));
//chartA->setTitleForY(tr("Ток, А"));
//chartT->setTitleForY(tr("Температура, °C"));
//chartC->setTitleForY(tr("?????, ??"));
ui->chartViewVoltage->setChart(chartV);
ui->chartViewAmperage->setChart(chartA);
ui->chartViewTemperature->setChart(chartT);
ui->chartViewTemperatureBms->setChart(chartTB);
ui->chartViewCells->setChart(chartC);
ui->chartViewCellsAll->setChart(chartCA);
ui->chartViewVoltage->setRenderHint(QPainter::Antialiasing);
ui->chartViewAmperage->setRenderHint(QPainter::Antialiasing);
ui->chartViewTemperature->setRenderHint(QPainter::Antialiasing);
ui->chartViewTemperatureBms->setRenderHint(QPainter::Antialiasing);
ui->chartViewCells->setRenderHint(QPainter::Antialiasing);
ui->chartViewCellsAll->setRenderHint(QPainter::Antialiasing);
connect(chartV, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsV);
connect(chartA, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsA);
connect(chartT, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsT);
connect(chartTB, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsT);
connect(chartC, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsC);
//connect(chartCA, &VisualizationChart::sendSecs, this, &VisualizationPage::onSetSecsCA);
connect(m_btnGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), this, &VisualizationPage::onTabBarButtonClicked);
//initForPlot();
initForCharts();
#if TURN_ON_DUMMY_DATA_FLOW_TO_GRAPHS
onVisualizationPageSelected();
initListWidgetOfCells(10);
#endif
}
VisualizationPage::~VisualizationPage()
{
delete ui;
}
int VisualizationPage::mOldCellsNumber = 0;
void VisualizationPage::initListWidgetOfCells(int cells)
{
bool doResetCellsList = (mOldCellsNumber != cells);
mOldCellsNumber = cells;
if(doResetCellsList)
{
ui->listwgtCells->clear();
for(int i = 0; i < cells; ++i)
{
QListWidgetItem *item = new QListWidgetItem;
//item->setData(Qt::UserRole, i);
item->setData(Qt::CheckStateRole, Qt::Checked);
QString name;
QColor color;
chartCA->getSeriesWithNumberNameAndColor(i, name, color);
QString cname = color.name();
QString cnumber = QString::number(i+1);
//item->setData(Qt::DisplayRole, "["+ QString::number(i+1) + "] - " + name );
item->setData(Qt::DisplayRole, "["+ cnumber + "] - Ячейка " + cnumber );
item->setForeground(color); //(Qt::red);
//connect (item, QListWidgetItem:: );
connect(ui->listwgtCells, &QListWidget::itemChanged, this, &VisualizationPage::onChecked);
ui->listwgtCells->addItem(item);
}
}
}
void VisualizationPage::onChecked(QListWidgetItem *item)
{
int irow = ui->listwgtCells->row(item); // starts with ZERO
QString text = item->text();
bool checked = (item->checkState() == Qt::CheckState::Checked);
//int colorMapIndex = item->data(Qt::UserRole).toInt();
if(checked) //ui->checkBox->isChecked())
{
chartCA->showSeriesWithNumber(irow);
}
else
{
chartCA->hideSeriesWithNumber(irow);
}
//connect(ui->listwgtCells, &QListWidget::itemChanged,
}
void VisualizationPage::initColorsForChartCellsAll()
{
//Qt::white
//Qt::color0
//Qt::color1
//chartCA->addSeriesWithNumber( CellQtwhite ,tr("CellQtwhite "), QColor(Qt::white ) );
chartCA->addSeriesWithNumber( CellQtblack ,tr("CellQtblack "), QColor(Qt::black ) );
chartCA->addSeriesWithNumber( CellQtdarkGray ,tr("CellQtdarkGray "), QColor(Qt::darkGray ) );
chartCA->addSeriesWithNumber( CellQtgray ,tr("CellQtgray "), QColor(Qt::gray ) );
chartCA->addSeriesWithNumber( CellQtlightGray ,tr("CellQtlightGray "), QColor(Qt::lightGray ) );
chartCA->addSeriesWithNumber( CellQtred ,tr("CellQtred "), QColor(Qt::red ) );
chartCA->addSeriesWithNumber( CellQtgreen ,tr("CellQtgreen "), QColor(Qt::green ) );
chartCA->addSeriesWithNumber( CellQtblue ,tr("CellQtblue "), QColor(Qt::blue ) );
chartCA->addSeriesWithNumber( CellQtcyan ,tr("CellQtcyan "), QColor(Qt::cyan ) );
chartCA->addSeriesWithNumber( CellQtmagenta ,tr("CellQtmagenta "), QColor(Qt::magenta ) );
chartCA->addSeriesWithNumber( CellQtyellow ,tr("CellQtyellow "), QColor(Qt::yellow ) );
chartCA->addSeriesWithNumber( CellQtdarkRed ,tr("CellQtdarkRed "), QColor(Qt::darkRed ) );
chartCA->addSeriesWithNumber( CellQtdarkGreen ,tr("CellQtdarkGreen "), QColor(Qt::darkGreen ) );
chartCA->addSeriesWithNumber( CellQtdarkBlue ,tr("CellQtdarkBlue "), QColor(Qt::darkBlue ) );
chartCA->addSeriesWithNumber( CellQtdarkCyan ,tr("CellQtdarkCyan "), QColor(Qt::darkCyan ) );
chartCA->addSeriesWithNumber( CellQtdarkMagenta ,tr("CellQtdarkMagenta "), QColor(Qt::darkMagenta ) );
chartCA->addSeriesWithNumber( CellQtdarkYellow ,tr("CellQtdarkYellow "), QColor(Qt::darkYellow ) );
//chartCA->addSeriesWithNumber(CellsMax , tr("Максимальная"), Qt::red);
chartCA->addSeriesWithNumber( CellAlmond ,tr("CellAlmond "), QColor("#EFDBC5") ); // 239,219,197
chartCA->addSeriesWithNumber( CellAntiqueBrass ,tr("CellAntiqueBrass "), QColor("#CD9575") ); // 205,149,117
chartCA->addSeriesWithNumber( CellApricot ,tr("CellApricot "), QColor("#FDD9B5") ); // 253,217,181
chartCA->addSeriesWithNumber( CellAquamarine ,tr("CellAquamarine "), QColor("#78DBE2") ); // 120,219,226
chartCA->addSeriesWithNumber( CellAsparagus ,tr("CellAsparagus "), QColor("#87A96B") ); // 135,169,107
chartCA->addSeriesWithNumber( CellAtomicTangerine ,tr("CellAtomicTangerine "), QColor("#FFA474") ); // 255,164,116
chartCA->addSeriesWithNumber( CellBananaMania ,tr("CellBananaMania "), QColor("#FAE7B5") ); // 250,231,181
chartCA->addSeriesWithNumber( CellBeaver ,tr("CellBeaver "), QColor("#9F8170") ); // 159,129,112
chartCA->addSeriesWithNumber( CellBittersweet ,tr("CellBittersweet "), QColor("#FD7C6E") ); // 253,124,110
chartCA->addSeriesWithNumber( CellBlack ,tr("CellBlack "), QColor("#232323") ); // 35,35,35
chartCA->addSeriesWithNumber( CellBlue ,tr("CellBlue "), QColor("#1F75FE") ); // 31,117,254
chartCA->addSeriesWithNumber( CellBlueBell ,tr("CellBlueBell "), QColor("#ADADD6") ); // 173,173,214
chartCA->addSeriesWithNumber( CellBlueGreen ,tr("CellBlueGreen "), QColor("#199EBD") ); // 25,158,189
chartCA->addSeriesWithNumber( CellBlueViolet ,tr("CellBlueViolet "), QColor("#2E5090") ); // 115,102,189
chartCA->addSeriesWithNumber( CellBluetiful ,tr("CellBluetiful "), QColor("#7366BD") ); // 46,80,144
chartCA->addSeriesWithNumber( CellBlush ,tr("CellBlush "), QColor("#DE5D83") ); // 222,93,131
chartCA->addSeriesWithNumber( CellBrickRed ,tr("CellBrickRed "), QColor("#CB4154") ); // 203,65,84
chartCA->addSeriesWithNumber( CellBrown ,tr("CellBrown "), QColor("#B5674D") ); // 180,103,77
chartCA->addSeriesWithNumber( CellBurntOrange ,tr("CellBurntOrange "), QColor("#FF7F49") ); // 255,127,73
chartCA->addSeriesWithNumber( CellBurntSienna ,tr("CellBurntSienna "), QColor("#EA7E5D") ); // 234,126,93
chartCA->addSeriesWithNumber( CellCadetBlue ,tr("CellCadetBlue "), QColor("#B0B7C6") ); // 176,183,198
chartCA->addSeriesWithNumber( CellCanary ,tr("CellCanary "), QColor("#FFFF99") ); // 255,255,159
chartCA->addSeriesWithNumber( CellCaribbeanGreen ,tr("CellCaribbeanGreen "), QColor("#1CD3A2") ); // 28,211,162
chartCA->addSeriesWithNumber( CellCarnationPink ,tr("CellCarnationPink "), QColor("#FFAACC") ); // 255,170,204
chartCA->addSeriesWithNumber( CellCerise ,tr("CellCerise "), QColor("#FF43A4") ); // 221,68,146
chartCA->addSeriesWithNumber( CellCerulean ,tr("CellCerulean "), QColor("#1DACD6") ); // 29,172,214
chartCA->addSeriesWithNumber( CellChestnut ,tr("CellChestnut "), QColor("#BC5D58") ); // 188,93,88
chartCA->addSeriesWithNumber( CellCopper ,tr("CellCopper "), QColor("#DD9475") ); // 221,148,117
chartCA->addSeriesWithNumber( CellCornflower ,tr("CellCornflower "), QColor("#9ACEEB") ); // 154,206,235
chartCA->addSeriesWithNumber( CellCottonCandy ,tr("CellCottonCandy "), QColor("#FFBCD9") ); // 255,188,217
chartCA->addSeriesWithNumber( CellDenim ,tr("CellDenim "), QColor("#2B6CC4") ); // 43,108,196
chartCA->addSeriesWithNumber( CellDesertSand ,tr("CellDesertSand "), QColor("#EFCDB8") ); // 239,205,184
chartCA->addSeriesWithNumber( CellEggplant ,tr("CellEggplant "), QColor("#DD4492") ); // 110,81,96
chartCA->addSeriesWithNumber( CellElectricLime ,tr("CellElectricLime "), QColor("#1DF914") ); // 29,249,20
chartCA->addSeriesWithNumber( CellFern ,tr("CellFern "), QColor("#71BC78") ); // 113,188,120
chartCA->addSeriesWithNumber( CellForestGreen ,tr("CellForestGreen "), QColor("#6DAE81") ); // 109,174,129
chartCA->addSeriesWithNumber( CellFuchsia ,tr("CellFuchsia "), QColor("#C364C5") ); // 195,100,197
chartCA->addSeriesWithNumber( CellFuzzyWuzzy ,tr("CellFuzzyWuzzy "), QColor("#CC6666") ); // 204,102,102
chartCA->addSeriesWithNumber( CellGold ,tr("CellGold "), QColor("#E7C697") ); // 231,198,151
chartCA->addSeriesWithNumber( CellGoldenrod ,tr("CellGoldenrod "), QColor("#FCD975") ); // 255,217,117
chartCA->addSeriesWithNumber( CellGrannySmithApple ,tr("CellGrannySmithApple "), QColor("#A8E4A0") ); // 168,228,160
chartCA->addSeriesWithNumber( CellGray ,tr("CellGray "), QColor("#95918C") ); // 149,145,140
chartCA->addSeriesWithNumber( CellGreen ,tr("CellGreen "), QColor("#1CAC78") ); // 28,172,120
chartCA->addSeriesWithNumber( CellGreenYellow ,tr("CellGreenYellow "), QColor("#F0E891") ); // 240,232,145
chartCA->addSeriesWithNumber( CellHotMagenta ,tr("CellHotMagenta "), QColor("#FF1DCE") ); // 255,29,206
chartCA->addSeriesWithNumber( CellInchworm ,tr("CellInchworm "), QColor("#B2EC5D") ); // 178,236,93
chartCA->addSeriesWithNumber( CellIndigo ,tr("CellIndigo "), QColor("#5D76CB") ); // 93,118,203
chartCA->addSeriesWithNumber( CellJazzberryJam ,tr("CellJazzberryJam "), QColor("#CA3767") ); // 202,55,103
chartCA->addSeriesWithNumber( CellJungleGreen ,tr("CellJungleGreen "), QColor("#3BB08F") ); // 59,176,143
chartCA->addSeriesWithNumber( CellLaserLemon ,tr("CellLaserLemon "), QColor("#FDFC74") ); // 253,252,116
chartCA->addSeriesWithNumber( CellLavender ,tr("CellLavender "), QColor("#FCB4D5") ); // 252,180,213
chartCA->addSeriesWithNumber( CellMacaroniAndCheese ,tr("CellMacaroniAndCheese "), QColor("#FFBD88") ); // 255,189,136
chartCA->addSeriesWithNumber( CellMagenta ,tr("CellMagenta "), QColor("#FCB4D5") ); // 246,100,175
chartCA->addSeriesWithNumber( CellMahogany ,tr("CellMahogany "), QColor("#CD4A4A") ); // 205,74,74
chartCA->addSeriesWithNumber( CellManatee ,tr("CellManatee "), QColor("#979AAA") ); // 151,154,170
chartCA->addSeriesWithNumber( CellMangoTango ,tr("CellMangoTango "), QColor("#FF8243") ); // 255,130,67
chartCA->addSeriesWithNumber( CellMaroon ,tr("CellMaroon "), QColor("#C8385A") ); // 200,56,90
chartCA->addSeriesWithNumber( CellMauvelous ,tr("CellMauvelous "), QColor("#EF98AA") ); // 239,152,170
chartCA->addSeriesWithNumber( CellMelon ,tr("CellMelon "), QColor("#FDBCB4") ); // 253,188,180
chartCA->addSeriesWithNumber( CellMidnightBlue ,tr("CellMidnightBlue "), QColor("#1A4876") ); // 26,72,118
chartCA->addSeriesWithNumber( CellMountainMeadow ,tr("CellMountainMeadow "), QColor("#30BA8F") ); // 48,186,143
chartCA->addSeriesWithNumber( CellNavyBlue ,tr("CellNavyBlue "), QColor("#1974D2") ); // 25,116,210
chartCA->addSeriesWithNumber( CellNeonCarrot ,tr("CellNeonCarrot "), QColor("#FFA343") ); // 255,163,67
chartCA->addSeriesWithNumber( CellOliveGreen ,tr("CellOliveGreen "), QColor("#BAB86C") ); // 186,184,108
chartCA->addSeriesWithNumber( CellOrange ,tr("CellOrange "), QColor("#FF7538") ); // 255,117,56
chartCA->addSeriesWithNumber( CellOrchid ,tr("CellOrchid "), QColor("#C0448F") ); // 230,168,215
chartCA->addSeriesWithNumber( CellOuterSpace ,tr("CellOuterSpace "), QColor("#414AAC") ); // 65,74,76
chartCA->addSeriesWithNumber( CellOutrageousOrange ,tr("CellOutrageousOrange "), QColor("#FF6E4A") ); // 255,110,74
chartCA->addSeriesWithNumber( CellPacificBlue ,tr("CellPacificBlue "), QColor("#1CA9C9") ); // 28,169,201
chartCA->addSeriesWithNumber( CellPeach ,tr("CellPeach "), QColor("#FFCFAB") ); // 255,207,171
chartCA->addSeriesWithNumber( CellPeriwinkle ,tr("CellPeriwinkle "), QColor("#C5D0E6") ); // 197,208,230
chartCA->addSeriesWithNumber( CellPiggyPink ,tr("CellPiggyPink "), QColor("#FDD7E4") ); // 253,215,228
chartCA->addSeriesWithNumber( CellPineGreen ,tr("CellPineGreen "), QColor("#158078") ); // 21,128,120
chartCA->addSeriesWithNumber( CellPinkFlamingo ,tr("CellPinkFlamingo "), QColor("#FC74FD") ); // 252,116,253
chartCA->addSeriesWithNumber( CellPinkSherbet ,tr("CellPinkSherbet "), QColor("#F780A1") ); // 247,128,161
chartCA->addSeriesWithNumber( CellPlum ,tr("CellPlum "), QColor("#8E4584") ); // 142,69,133
chartCA->addSeriesWithNumber( CellPurpleHeart ,tr("CellPurpleHeart "), QColor("#7442C8") ); // 116,66,200
chartCA->addSeriesWithNumber( CellPurpleMountainsMajesty ,tr("CellPurpleMountainsMajesty "), QColor("#9D81BA") ); // 157,129,186
chartCA->addSeriesWithNumber( CellPurplePizza ,tr("CellPurplePizza "), QColor("#FF1DCE") ); // 255,29,206
chartCA->addSeriesWithNumber( CellRadicalRed ,tr("CellRadicalRed "), QColor("#FF496C") ); // 255,73,107
chartCA->addSeriesWithNumber( CellRawSienna ,tr("CellRawSienna "), QColor("#D68A59") ); // 214,138,89
chartCA->addSeriesWithNumber( CellRazzleDazzleRose ,tr("CellRazzleDazzleRose "), QColor("#E6A8D7") ); // 255,72,208
chartCA->addSeriesWithNumber( CellRazzmatazz ,tr("CellRazzmatazz "), QColor("#E3256B") ); // 227,37,107
chartCA->addSeriesWithNumber( CellRed ,tr("CellRed "), QColor("#EE204D") ); // 238,32,77
chartCA->addSeriesWithNumber( CellRedOrange ,tr("CellRedOrange "), QColor("#FF5349") ); // 255,83,73
chartCA->addSeriesWithNumber( CellRedViolet ,tr("CellRedViolet "), QColor("#c0448f") ); // 192,68,143
chartCA->addSeriesWithNumber( CellRobinsEggBlue ,tr("CellRobinsEggBlue "), QColor("#1FCECB") ); // 31,206,203
chartCA->addSeriesWithNumber( CellRoyalPurple ,tr("CellRoyalPurple "), QColor("#7851A9") ); // 120,81,169
chartCA->addSeriesWithNumber( CellSalmon ,tr("CellSalmon "), QColor("#FF9BAA") ); // 255,155,170
chartCA->addSeriesWithNumber( CellScarlet ,tr("CellScarlet "), QColor("#FC2847") ); // 242,40,71
chartCA->addSeriesWithNumber( CellScreaminGreen ,tr("CellScreaminGreen "), QColor("#76FF7A") ); // 118,255,122
chartCA->addSeriesWithNumber( CellSeaGreen ,tr("CellSeaGreen "), QColor("#9FE2BF") ); // 159,226,191
chartCA->addSeriesWithNumber( CellSepia ,tr("CellSepia "), QColor("#A5694F") ); // 165,105,79
chartCA->addSeriesWithNumber( CellShadow ,tr("CellShadow "), QColor("#8A795D") ); // 138,121,93
chartCA->addSeriesWithNumber( CellShamrock ,tr("CellShamrock "), QColor("#45CEA2") ); // 69,206,162
chartCA->addSeriesWithNumber( CellShockingPink ,tr("CellShockingPink "), QColor("#FB7EFD") ); // 251,126,253
chartCA->addSeriesWithNumber( CellSilver ,tr("CellSilver "), QColor("#CDC5C2") ); // 205,197,194
chartCA->addSeriesWithNumber( CellSkyBlue ,tr("CellSkyBlue "), QColor("#80DAEB") ); // 128,218,235
chartCA->addSeriesWithNumber( CellSpringGreen ,tr("CellSpringGreen "), QColor("#ECEABE") ); // 236,234,190
chartCA->addSeriesWithNumber( CellSunglow ,tr("CellSunglow "), QColor("#FFCF48") ); // 255,207,72
chartCA->addSeriesWithNumber( CellSunsetOrange ,tr("CellSunsetOrange "), QColor("#FD5E53") ); // 253,94,83
chartCA->addSeriesWithNumber( CellTan ,tr("CellTan "), QColor("#FAA76C") ); // 250,167,108
chartCA->addSeriesWithNumber( CellTickleMePink ,tr("CellTickleMePink "), QColor("#FC89AC") ); // 252,137,172
chartCA->addSeriesWithNumber( CellTimberwolf ,tr("CellTimberwolf "), QColor("#DBD7D2") ); // 219,215,210
chartCA->addSeriesWithNumber( CellTropicalRainForest ,tr("CellTropicalRainForest "), QColor("#17806D") ); // 23,128,109
chartCA->addSeriesWithNumber( CellTumbleweed ,tr("CellTumbleweed "), QColor("#DEAA88") ); // 222,170,136
chartCA->addSeriesWithNumber( CellTurquoiseBlue ,tr("CellTurquoiseBlue "), QColor("#77DDE7") ); // 119,221,231
chartCA->addSeriesWithNumber( CellUnmellowYellow ,tr("CellUnmellowYellow "), QColor("#FDFC74") ); // 253,252,116
chartCA->addSeriesWithNumber( CellVioletPurple ,tr("CellVioletPurple "), QColor("#926EAE") ); // 146,110,174
chartCA->addSeriesWithNumber( CellVioletRed ,tr("CellVioletRed "), QColor("#F75394") ); // 247,83,148
chartCA->addSeriesWithNumber( CellVividTangerine ,tr("CellVividTangerine "), QColor("#FFA089") ); // 255,160,137
chartCA->addSeriesWithNumber( CellVividViolet ,tr("CellVividViolet "), QColor("#8F509D") ); // 143,80,157
chartCA->addSeriesWithNumber( CellWhite ,tr("CellWhite "), QColor("#EDEDED") ); // 237,237,237
chartCA->addSeriesWithNumber( CellWildBlueYonder ,tr("CellWildBlueYonder "), QColor("#A2ADD0") ); // 162,173,208
chartCA->addSeriesWithNumber( CellWildStrawberry ,tr("CellWildStrawberry "), QColor("#F664AF") ); // 255,67,164
chartCA->addSeriesWithNumber( CellWildWatermelon ,tr("CellWildWatermelon "), QColor("#FC6C85") ); // 252,108,133
chartCA->addSeriesWithNumber( CellWisteria ,tr("CellWisteria "), QColor("#CDA4DE") ); // 205,164,222
chartCA->addSeriesWithNumber( CellYellow ,tr("CellYellow "), QColor("#FCE883") ); // 252,232,131
chartCA->addSeriesWithNumber( CellYellowGreen ,tr("CellYellowGreen "), QColor("#C5E384") ); // 197,227,132
chartCA->addSeriesWithNumber( CellYellowOrange ,tr("CellYellowOrange "), QColor("#FB6530") ); // 255,182,83
}
void VisualizationPage::setIsPageActivated(bool isActivated)
{
mIsThisPageActivated = isActivated;
}
bool VisualizationPage::isPageActivated()
{
return mIsThisPageActivated;
}
void VisualizationPage::onVisualizationPageSelected()
{
/*
QTimer* timerV = new QTimer(this);
connect(timerV, &QTimer::timeout, this, &VisualizationPage::onSetValV);
timerV->setInterval(1000);
timerV->start();
QTimer* timerA = new QTimer(this);
connect(timerA, &QTimer::timeout, this, &VisualizationPage::onSetValA);
timerA->setInterval(1000);
timerA->start();
*/
QTimer* timerT = new QTimer(this);
connect(timerT, &QTimer::timeout, this, &VisualizationPage::onSetValT);
timerT->setInterval(1000);
timerT->start();
//*/
}
BMSInterface *VisualizationPage::bms() const
{
return mDieBieMS;
}
void VisualizationPage::setDieBieMS(BMSInterface *dieBieMS)
{
mDieBieMS = dieBieMS;
/*if (mDieBieMS) {
connect(mDieBieMS->commands(), SIGNAL(valuesReceived(BMS_VALUES)),this, SLOT(valuesReceived(BMS_VALUES)));
connect(mDieBieMS->commands(), SIGNAL(cellsReceived(int,QVector<double>)),this, SLOT(cellsReceived(int,QVector<double>)));
}
*/
if (mDieBieMS) {
connect(mDieBieMS->commands(), &Commands::valuesReceived, this, &VisualizationPage::valuesReceived);
connect(mDieBieMS->commands(), &Commands::cellsReceived, this, &VisualizationPage::cellsReceived);
connect(mDieBieMS->commands(), &Commands::auxReceived, this, &VisualizationPage::auxReceived); //(int,QVector<double>)));
connect(mDieBieMS->commands(), &Commands::expTempReceived, this, &VisualizationPage::expTempReceived); //(int,QVector<double>)));
//connect(mDieBieMS->commands(), SIGNAL(valuesReceived(BMS_VALUES)),this, SLOT(valuesReceived(BMS_VALUES)));
//connect(mDieBieMS->commands(), SIGNAL(cellsReceived(int,QVector<double>)),this, SLOT(cellsReceived(int,QVector<double>)));
}
}
void VisualizationPage::onSetValV()
{
int val = (QRandomGenerator::global()->generate() % 100); // +
//10;
/* if (val > 0) {
//ui->lbV->setText(QString::number(val));
chartV->append(val);
chartV->update();
ui->chartViewVoltage->repaint();
}
*/
mHCLoadVoltage.append(val);
}
void VisualizationPage::onSetValA()
{
int val = /*(QRandomGenerator::global()->generate() % 10) +*/ 10;
if (val > 0) {
//ui->lbA->setText(QString::number(val));
chartA->append(val);
chartA->update();
ui->chartViewAmperage->repaint();
}
}
void VisualizationPage::onSetValT()
{
//int val = (QRandomGenerator::global()->generate(-10,10) % T_MODUS);
//int val = QRandomGenerator::global()->bounded(-10, 50);
int valMax = QRandomGenerator::global()->bounded(-10, 50) + 0;
int valMid = QRandomGenerator::global()->bounded(-10, 50) + 0;
int valMin = QRandomGenerator::global()->bounded(-10, 50) + 0;
//if (val > 0) {
//ui->lbT->setText(QString::number(val));
//chartT->append(val);
// increas X
chartT->appendNextX();
// then set all new Ys
/*
chartT->appendYToSeries(TemperatureMax, valMax);
chartT->appendYToSeries(TemperatureMid, valMid);
chartT->appendYToSeries(TemperatureMin, valMin);
*/
chartT->appendYToSeries(TemperatureBatMax, valMax);
chartT->appendYToSeries(TemperatureBatMid, valMid);
chartT->appendYToSeries(TemperatureBatMin, valMin);
ui->lbTMaxLegendVal->setText(QString("%1").arg(valMax));
ui->lbTMidLegendVal->setText(QString("%1").arg(valMid));
ui->lbTMinLegendVal->setText(QString("%1").arg(valMin));
//chartT->refreshSeries(TemperatureMax);
//chartT->refreshSeries(TemperatureMid);
//chartT->refreshSeries(TemperatureMin);
chartT->update();
ui->chartViewTemperature->repaint();
//}
///ui->lbTCurTemp->setText(QString::number(val));
ui->lbTCurTemp->setText("");
}
void VisualizationPage::onSetSecsV(int secs)
{
if(secs <= 0)
ui->lbVTime->setText(QString(""));
else if(secs < 60)
ui->lbVTime->setText(QString("%1 с").arg(secs));
else if(secs % 60 == 0)
ui->lbVTime->setText(QString("%1 мин").arg(secs/60));
else if(secs > 60)
ui->lbVTime->setText(QString("%1 мин %2 с").arg(secs/60).arg(secs%60));
}
void VisualizationPage::onSetSecsA(int secs)
{
if(secs <= 0)
ui->lbATime->setText(QString(""));
else if(secs < 60)
ui->lbATime->setText(QString("%1 с").arg(secs));
else if(secs % 60 == 0)
ui->lbATime->setText(QString("%1 мин").arg(secs/60));
else if(secs > 60)
ui->lbATime->setText(QString("%1 мин %2 с").arg(secs/60).arg(secs%60));
}
void VisualizationPage::onSetSecsT(int secs)
{
if(secs <= 0)
ui->lbTTime->setText(QString(""));
else if(secs < 60)
ui->lbTTime->setText(QString("%1 с").arg(secs));
else if(secs % 60 == 0)
ui->lbTTime->setText(QString("%1 мин").arg(secs/60));
else if(secs > 60)
ui->lbTTime->setText(QString("%1 мин %2 с").arg(secs/60).arg(secs%60));
}
void VisualizationPage::onSetSecsC(int secs)
{
if(secs <= 0)
ui->lbCTime->setText(QString(""));
else if(secs < 60)
ui->lbCTime->setText(QString("%1 с").arg(secs));
else if(secs % 60 == 0)
ui->lbCTime->setText(QString("%1 мин").arg(secs/60));
else if(secs > 60)
ui->lbCTime->setText(QString("%1 мин %2 с").arg(secs/60).arg(secs%60));
}
/*void VisualizationPage::onSetSecsCA(int secs)
{
if(secs <= 0)
ui->lbCATime->setText(QString(""));
else if(secs < 60)
ui->lbCATime->setText(QString("%1 с").arg(secs));
else if(secs % 60 == 0)
ui->lbCATime->setText(QString("%1 мин").arg(secs/60));
else if(secs > 60)
ui->lbCATime->setText(QString("%1 мин %2 с").arg(secs/60).arg(secs%60));
}
*/
void VisualizationPage::onTabBarButtonClicked()
{
for(auto btn: m_btnGroup->buttons())
{
if(!btn->isChecked())
continue;
if ( btn->objectName() == ui->pbVisualizationMenuBarVoltage ->objectName() ) m_currentPageIndex = Voltage ;
else if( btn->objectName() == ui->pbVisualizationMenuBarAmperage ->objectName() ) m_currentPageIndex = Apmerage ;
//else if( btn->objectName() == ui->pbVisualizationMenuBarTemperature->objectName() ) m_currentPageIndex = Temperature ;
else if( btn->objectName() == ui->pbVisualizationMenuBarTemperatureBat->objectName() ) m_currentPageIndex = TemperatureBat ;
else if( btn->objectName() == ui->pbVisualizationMenuBarTemperatureBms->objectName() ) m_currentPageIndex = TemperatureBms ;
else if( btn->objectName() == ui->pbVisualizationMenuBarCells ->objectName() ) m_currentPageIndex = Cells ;
else if( btn->objectName() == ui->pbVisualizationMenuBarCellsAll ->objectName() ) m_currentPageIndex = CellsAll ;
ui->tabWidgetVisualizationContent->setCurrentIndex(m_currentPageIndex);
}
}
void VisualizationPage::initForPlot()
{
ui->rtText->setVisible(false);
mTimer = new QTimer(this);
mTimer->start(20);
mSecondCounter = 0.0;
mLastUpdateTime = 0;
mUpdateValPlot = false;
/*
ui->ivLCGraph->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
ui->ivHCGraph->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
ui->cellGraph->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
*/
ui->tempGraph->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
// LC IVGraph
int graphIndex = 0;
/*
ui->ivLCGraph->addGraph();
ui->ivLCGraph->graph(graphIndex)->setPen(QPen(Qt::red));
ui->ivLCGraph->graph(graphIndex)->setName("Pack");
graphIndex++;
ui->ivLCGraph->addGraph();
ui->ivLCGraph->graph(graphIndex)->setPen(QPen(Qt::darkGreen));
ui->ivLCGraph->graph(graphIndex)->setName("LC Voltage");
graphIndex++;
ui->ivLCGraph->addGraph(ui->ivLCGraph->xAxis, ui->ivLCGraph->yAxis2);
ui->ivLCGraph->graph(graphIndex)->setPen(QPen(Qt::green));
ui->ivLCGraph->graph(graphIndex)->setName("LC Current");
graphIndex++;
// HC IVGraph
graphIndex = 0;
ui->ivHCGraph->addGraph();
ui->ivHCGraph->graph(graphIndex)->setPen(QPen(Qt::blue));
ui->ivHCGraph->graph(graphIndex)->setName("HC Voltage");
graphIndex++;
ui->ivHCGraph->addGraph(ui->ivHCGraph->xAxis, ui->ivHCGraph->yAxis2);
ui->ivHCGraph->graph(graphIndex)->setPen(QPen(Qt::magenta));
ui->ivHCGraph->graph(graphIndex)->setName("HC Current");
graphIndex++;
// Cell voltage graph
graphIndex = 0;
ui->cellGraph->addGraph();
ui->cellGraph->graph(graphIndex)->setPen(QPen(Qt::green));
ui->cellGraph->graph(graphIndex)->setName("Cell high");
graphIndex++;
ui->cellGraph->addGraph();
ui->cellGraph->graph(graphIndex)->setPen(QPen(Qt::blue));
ui->cellGraph->graph(graphIndex)->setName("Cell average");
graphIndex++;
ui->cellGraph->addGraph();
ui->cellGraph->graph(graphIndex)->setPen(QPen(Qt::red));
ui->cellGraph->graph(graphIndex)->setName("Cell low");
graphIndex++;
// Temperature graph
// LC IVGraph
graphIndex = 0;
*/
ui->tempGraph->addGraph();
ui->tempGraph->graph(graphIndex)->setPen(QPen(Qt::red));
ui->tempGraph->graph(graphIndex)->setName("BMS High");
graphIndex++;
ui->tempGraph->addGraph();
ui->tempGraph->graph(graphIndex)->setPen(QPen(Qt::green));
ui->tempGraph->graph(graphIndex)->setName("BMS Average");
graphIndex++;
ui->tempGraph->addGraph();
ui->tempGraph->graph(graphIndex)->setPen(QPen(Qt::yellow));
ui->tempGraph->graph(graphIndex)->setName("BMS Low");
graphIndex++;
///ui->tempGraph->addGraph();
///ui->tempGraph->graph(graphIndex)->setPen(QPen(Qt::green));
///ui->tempGraph->graph(graphIndex)->setName("Battery high");
///graphIndex++;
///ui->tempGraph->addGraph();
///ui->tempGraph->graph(graphIndex)->setPen(QPen(Qt::darkGreen));
///ui->tempGraph->graph(graphIndex)->setName("Battery Average");
///graphIndex++;
QFont legendFont = font();
legendFont.setPointSize(9);
/*
//LC Graph
ui->ivLCGraph->legend->setVisible(true);
ui->ivLCGraph->legend->setFont(legendFont);
ui->ivLCGraph->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignRight|Qt::AlignBottom);
ui->ivLCGraph->legend->setBrush(QBrush(QColor(255,255,255,230)));
ui->ivLCGraph->xAxis->setLabel("Seconds (s)");
ui->ivLCGraph->yAxis->setLabel("Voltage (V)");
ui->ivLCGraph->yAxis2->setLabel("Current (A)");
ui->ivLCGraph->yAxis->setRange(0, 60);
ui->ivLCGraph->yAxis2->setRange(-5, 5);
ui->ivLCGraph->yAxis2->setVisible(true);
//HC Graph
ui->ivHCGraph->legend->setVisible(true);
ui->ivHCGraph->legend->setFont(legendFont);
ui->ivHCGraph->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignRight|Qt::AlignBottom);
ui->ivHCGraph->legend->setBrush(QBrush(QColor(255,255,255,230)));
ui->ivHCGraph->xAxis->setLabel("Seconds (s)");
ui->ivHCGraph->yAxis->setLabel("Voltage (V)");
ui->ivHCGraph->yAxis2->setLabel("Current (A)");
ui->ivHCGraph->yAxis->setRange(0, 60);
ui->ivHCGraph->yAxis2->setRange(-5, 5);
ui->ivHCGraph->yAxis2->setVisible(true);
//Cell voltage Graph
ui->cellGraph->legend->setVisible(true);
ui->cellGraph->legend->setFont(legendFont);
ui->cellGraph->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignRight|Qt::AlignBottom);
ui->cellGraph->legend->setBrush(QBrush(QColor(255,255,255,230)));
ui->cellGraph->xAxis->setLabel("Seconds (s)");
ui->cellGraph->yAxis->setLabel("Voltage (V)");
ui->cellGraph->yAxis->setRange(0, 4.2);
*/
//Temperature Graph
ui->tempGraph->legend->setVisible(true);
ui->tempGraph->legend->setFont(legendFont);
ui->tempGraph->axisRect()->insetLayout()->setInsetAlignment(0, Qt::AlignRight|Qt::AlignBottom);
ui->tempGraph->legend->setBrush(QBrush(QColor(255,255,255,230)));
ui->tempGraph->xAxis->setLabel("Seconds (s)");
ui->tempGraph->yAxis->setLabel("Temperature (\u00B0C)");
ui->tempGraph->yAxis->setRange(0, 70);
/*
// Cell bar graph
group = new QCPBarsGroup(ui->cellBarGraph);
barsNormal = new QCPBars(ui->cellBarGraph->xAxis, ui->cellBarGraph->yAxis);
barsBalance = new QCPBars(ui->cellBarGraph->xAxis, ui->cellBarGraph->yAxis);
barsNormal->setBrush(QColor(0, 255, 0, 50));
barsNormal->setPen(QColor(0, 211, 56));
barsNormal->setWidth(0.9);
barsNormal->setBarsGroup(group);
barsBalance->setBrush(QColor(0, 0, 255, 50));
barsBalance->setPen(QColor(0, 211, 56));
barsBalance->setWidth(0.9);
barsBalance->setBarsGroup(group);
barsBalance->moveAbove(barsNormal);
ui->cellBarGraph->xAxis->setRange(0.5, 12);
ui->cellBarGraph->yAxis->setRange(2.5, 4.15);
ui->cellBarGraph->yAxis->setLabel("Voltage (V)");
ui->cellBarGraph->xAxis->setTickLabelRotation(85);
ui->cellBarGraph->xAxis->setSubTicks(false);
ui->cellBarGraph->xAxis->setTickLength(0, 5);
*/
connect(mTimer, &QTimer::timeout,this, &VisualizationPage::timerSlot);
}
void VisualizationPage::initForCharts()
{
ui->rtText->setVisible(false);
mTimer = new QTimer(this);
//mTimer->start(20);
mTimer->start(1000);
mSecondCounter = 0.0;
mLastUpdateTime = 0;
mUpdateValPlot = false;
QFont legendFont = font();
legendFont.setPointSize(9);
connect(mTimer, &QTimer::timeout,this, &VisualizationPage::timerSlot);
}
void VisualizationPage::timerSlot()
{
//
// We will start revieve Data WHEN
// SEE - void MainWindowNew::onTimerSlot()
// one of those left-tab-bar buttons are selected (ui->pbMainMenuBarVisualization->isChecked() || ui->pbMainMenuBarVisualization->isChecked())
//
if
(
#if TURN_ON_DUMMY_DATA_FLOW_TO_GRAPHS
true
#else
mUpdateValPlot && mIsThisPageActivated
#endif
)
{
//COMM_GET_BMS_CELLS
/*
int dataSize = mPackVoltage.size();
QVector<double> xAxis(dataSize);
for (int i = 0;i < mSeconds.size();i++) {
xAxis[i] = mSeconds[i];
}
*/
// Current and duty-plot
///int graphIndex = 0;
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mPackVoltage);
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadVoltage);
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadCurrent);
///graphIndex = 0;
///ui->ivHCGraph->graph(graphIndex++)->setData(xAxis, mHCLoadVoltage);
///ui->ivHCGraph->graph(graphIndex++)->setData(xAxis, mHCLoadCurrent);
///graphIndex = 0;
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVHigh);
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVAverage);
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVLow);
///graphIndex = 0;
///mTempBMSLow.fill(0,1);
///ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSHigh);
///ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSAverage);
///ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSLow);
// V
double valV = mPackVoltage.empty() ? 0 : mPackVoltage.last();
//double valVMax = mHCLoadVoltage.empty() ? 0 : mHCLoadVoltage.last();
//double valVMid = mPackVoltage.empty() ? 0 : mPackVoltage.last();
//double valVMin = mLCLoadVoltage.empty() ? 0 : mLCLoadVoltage.last();
// increas X
chartV->appendNextX();
// then set all new Ys
chartV->appendYToSeries(VoltageMax, valV);
//chartV->appendYToSeries(VoltageMax, valVMax);
//chartV->appendYToSeries(VoltageMid, valVMid);
//chartV->appendYToSeries(VoltageMin, valVMin);
ui->lbVMaxLegendVal->setText(QString::number(valV,'f',2));
//ui->lbVMaxLegendVal->setText(QString::number(valVMax,'f',2));
//ui->lbVMidLegendVal->setText(QString::number(valVMid,'f',2));
//ui->lbVMinLegendVal->setText(QString::number(valVMin,'f',2));
chartV->update();
ui->chartViewVoltage->repaint();
// A
//mMCLoadCurrent_.fill(0, 1);
double valA = mPackCurrent.empty() ? 0 : mPackCurrent.last();
//double valAMax = mHCLoadCurrent.empty() ? 0 : mHCLoadCurrent.last();
//double valAMid = mMCLoadCurrent_.empty() ? 0 : mMCLoadCurrent_.last();
//double valAMin = mLCLoadCurrent.empty() ? 0 : mLCLoadCurrent.last();
// increas X
chartA->appendNextX();
// then set all new Ys
chartA->appendYToSeries(AmperageMax, valA);
//chartA->appendYToSeries(AmperageMax, valAMax);
//chartA->appendYToSeries(AmperageMid, valAMid);
//chartA->appendYToSeries(AmperageMin, valAMin);
ui->lbAMaxLegendVal->setText(QString::number(valA,'f',2));
//ui->lbAMaxLegendVal->setText(QString::number(valAMax,'f',2));
//ui->lbAMidLegendVal->setText(QString::number(valAMid,'f',2));
//ui->lbAMinLegendVal->setText(QString::number(valAMin,'f',2));
chartA->update();
ui->chartViewAmperage->repaint();
// T Bat
//mTempBattLow_.fill(0, 1);
double valTMax = mTempBattHigh.empty() ? 0 : mTempBattHigh.last();
double valTMid = mTempBattAverage.empty() ? 0 : mTempBattAverage.last();
double valTMin = mTempBattLow.empty() ? 0 : mTempBattLow.last();
// increas X
chartT->appendNextX();
// then set all new Ys
/*
chartT->appendYToSeries(TemperatureMax, valTMax);
chartT->appendYToSeries(TemperatureMid, valTMid);
chartT->appendYToSeries(TemperatureMin, valTMin);
*/
chartT->appendYToSeries(TemperatureBatMax, valTMax);
chartT->appendYToSeries(TemperatureBatMid, valTMid);
chartT->appendYToSeries(TemperatureBatMin, valTMin);
ui->lbTMaxLegendVal->setText(QString::number(valTMax,'f',2));
ui->lbTMidLegendVal->setText(QString::number(valTMid,'f',2));
ui->lbTMinLegendVal->setText(QString::number(valTMin,'f',2));
chartT->update();
ui->chartViewTemperature->repaint();
// T Bms
//mTempBMSLow_.fill(0, 1);
double valTBMax = mTempBMSHigh.empty() ? 0 : mTempBMSHigh.last();
double valTBMid = mTempBMSAverage.empty() ? 0 : mTempBMSAverage.last();
double valTBMin = mTempBMSLow.empty() ? 0 : mTempBMSLow.last();
// increas X
chartTB->appendNextX();
// then set all new Ys
/*
chartT->appendYToSeries(TemperatureMax, valTMax);
chartT->appendYToSeries(TemperatureMid, valTMid);
chartT->appendYToSeries(TemperatureMin, valTMin);
*/
chartTB->appendYToSeries(TemperatureBmsMax, valTBMax);
chartTB->appendYToSeries(TemperatureBmsMid, valTBMid);
chartTB->appendYToSeries(TemperatureBmsMin, valTBMin);
ui->lbTMaxLegendValBms->setText(QString::number(valTBMax,'f',2));
ui->lbTMidLegendValBms->setText(QString::number(valTBMid,'f',2));
ui->lbTMinLegendValBms->setText(QString::number(valTBMin,'f',2));
chartTB->update();
ui->chartViewTemperatureBms->repaint();
// C
double valCMax = mCellVHigh.empty() ? 0 : mCellVHigh.last();
double valCMid = mCellVAverage.empty() ? 0 : mCellVAverage.last();
double valCMin = mCellVLow.empty() ? 0 : mCellVLow.last();
// increas X
chartC->appendNextX();
// then set all new Ys
chartC->appendYToSeries(CellsMax, valCMax);
chartC->appendYToSeries(CellsMid, valCMid);
chartC->appendYToSeries(CellsMin, valCMin);
ui->lbCMaxLegendVal->setText(QString::number(valCMax,'f',2));
ui->lbCMidLegendVal->setText(QString::number(valCMid,'f',2));
ui->lbCMinLegendVal->setText(QString::number(valCMin,'f',2));
chartC->update();
ui->chartViewCells->repaint();
// Cells //
mCellsVals;
//double valCMax = mCellVHigh.empty() ? 0 : mCellVHigh.last();
//double valCMid = mCellVAverage.empty() ? 0 : mCellVAverage.last();
//double valCMin = mCellVLow.empty() ? 0 : mCellVLow.last();
// increas X
chartCA->appendNextX();
// then set all new Ys
try
{
for(int i = 0; i < mCellsVals.size(); ++i)
{
chartCA->appendYToSeries((ChartsForCellsIndex)(i), mCellsVals.at(i));
}
}
catch (...) {
// mCellsVals.at out of bound EXCEPTION handling
}
//ui->lbCMaxLegendVal->setText(QString::number(valCMax,'f',2));
//ui->lbCMidLegendVal->setText(QString::number(valCMid,'f',2));
//ui->lbCMinLegendVal->setText(QString::number(valCMin,'f',2));
chartCA->update();
ui->chartViewCellsAll->repaint();
/*
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattHigh);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattAverage);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattLow);
///if (ui->autoscaleButton->isChecked())
{
///ui->ivLCGraph->rescaleAxes();
///ui->ivHCGraph->rescaleAxes();
///ui->cellGraph->rescaleAxes();
ui->tempGraph->rescaleAxes();
}
///ui->ivLCGraph->replot();
///ui->ivHCGraph->replot();
///ui->cellGraph->replot();
ui->tempGraph->replot();
///ui->cellBarGraph->replot();
mUpdateValPlot = false;
*/
}
}
/* // OLD CODE
void VisualizationPage::timerSlot()
{
if (mUpdateValPlot) {
int dataSize = mPackVoltage.size();
QVector<double> xAxis(dataSize);
for (int i = 0;i < mSeconds.size();i++) {
xAxis[i] = mSeconds[i];
}
// Current and duty-plot
int graphIndex = 0;
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mPackVoltage);
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadVoltage);
///ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadCurrent);
graphIndex = 0;
///ui->ivHCGraph->graph(graphIndex++)->setData(xAxis, mHCLoadVoltage);
///ui->ivHCGraph->graph(graphIndex++)->setData(xAxis, mHCLoadCurrent);
graphIndex = 0;
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVHigh);
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVAverage);
///ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVLow);
graphIndex = 0;
mTempBMSLow.fill(0,1);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSHigh);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSAverage);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSLow);
//ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattHigh);
//ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattAverage);
///if (ui->autoscaleButton->isChecked())
{
///ui->ivLCGraph->rescaleAxes();
///ui->ivHCGraph->rescaleAxes();
///ui->cellGraph->rescaleAxes();
ui->tempGraph->rescaleAxes();
}
///ui->ivLCGraph->replot();
///ui->ivHCGraph->replot();
///ui->cellGraph->replot();
ui->tempGraph->replot();
///ui->cellBarGraph->replot();
mUpdateValPlot = false;
}
}
*/
void VisualizationPage::valuesReceived(BMS_VALUES values)
{
ui->rtText->setValues(values);
const int maxS = 500;
appendDoubleAndTrunc(&mPackVoltage, values.packVoltage, maxS);
appendDoubleAndTrunc(&mPackCurrent, values.packCurrent, maxS);
appendDoubleAndTrunc(&mLCLoadVoltage, values.loadLCVoltage, maxS);
appendDoubleAndTrunc(&mLCLoadCurrent, values.loadLCCurrent, maxS);
appendDoubleAndTrunc(&mHCLoadVoltage, values.loadHCVoltage, maxS);
appendDoubleAndTrunc(&mHCLoadCurrent, values.loadHCCurrent, maxS);
appendDoubleAndTrunc(&mChargerVoltage, values.chargerVoltage, maxS);
appendDoubleAndTrunc(&mAuxVoltage, values.auxVoltage, maxS);
appendDoubleAndTrunc(&mAuxCurrent, values.auxCurrent, maxS);
appendDoubleAndTrunc(&mCellVHigh, values.cVHigh, maxS);
appendDoubleAndTrunc(&mCellVAverage, values.cVAverage, maxS);
appendDoubleAndTrunc(&mCellVLow, values.cVLow, maxS);
appendDoubleAndTrunc(&mTempBMSHigh, values.tempBMSHigh, maxS);
appendDoubleAndTrunc(&mTempBMSAverage, values.tempBMSAverage, maxS);
appendDoubleAndTrunc(&mTempBMSLow, values.tempBMSLow, maxS);
appendDoubleAndTrunc(&mTempBattHigh, values.tempBattHigh, maxS);
appendDoubleAndTrunc(&mTempBattAverage, values.tempBattAverage, maxS);
appendDoubleAndTrunc(&mTempBattLow, values.tempBattLow, maxS);
appendDoubleAndTrunc(&mHumidity, values.humidity, maxS);
qint64 tNow = QDateTime::currentMSecsSinceEpoch();
double elapsed = (double)(tNow - mLastUpdateTime) / 1000.0;
if (elapsed > 1.0) {
elapsed = 1.0;
}
mSecondCounter += elapsed;
appendDoubleAndTrunc(&mSeconds, mSecondCounter, maxS);
mLastUpdateTime = tNow;
mUpdateValPlot = true;
/*
ui->rtText->setValues(values);
const int maxS = 500;
appendDoubleAndTrunc(&mPackVoltage, values.packVoltage, maxS);
appendDoubleAndTrunc(&mLCLoadVoltage, values.loadLCVoltage, maxS);
appendDoubleAndTrunc(&mLCLoadCurrent, values.loadLCCurrent, maxS);
appendDoubleAndTrunc(&mHCLoadVoltage, values.loadHCVoltage, maxS);
appendDoubleAndTrunc(&mHCLoadCurrent, values.loadHCCurrent, maxS);
appendDoubleAndTrunc(&mAuxVoltage, values.auxVoltage, maxS);
appendDoubleAndTrunc(&mAuxCurrent, values.auxCurrent, maxS);
appendDoubleAndTrunc(&mCellVHigh, values.cVHigh, maxS);
appendDoubleAndTrunc(&mCellVAverage, values.cVAverage, maxS);
appendDoubleAndTrunc(&mCellVLow, values.cVLow, maxS);
appendDoubleAndTrunc(&mTempBMSHigh, values.tempBMSHigh, maxS);
appendDoubleAndTrunc(&mTempBMSAverage, values.tempBMSAverage, maxS);
//appendDoubleAndTrunc(&mTempBMSLow_, values.tempBMSLow_, maxS);
appendDoubleAndTrunc(&mTempBattHigh, values.tempBattHigh, maxS);
appendDoubleAndTrunc(&mTempBattAverage, values.tempBattAverage, maxS);
//appendDoubleAndTrunc(&mTempBattLow_, values.tempBattLow_, maxS);
qint64 tNow = QDateTime::currentMSecsSinceEpoch();
double elapsed = (double)(tNow - mLastUpdateTime) / 1000.0;
if (elapsed > 1.0) {
elapsed = 1.0;
}
mSecondCounter += elapsed;
appendDoubleAndTrunc(&mSeconds, mSecondCounter, maxS);
mLastUpdateTime = tNow;
mUpdateValPlot = true;
*/
}
void VisualizationPage::cellsReceived(int cellCount, QVector<double> cellVoltageArray)
{
initListWidgetOfCells(cellCount);
mCellsVals = cellVoltageArray;
QVector<double> dataxNew;
dataxNew.clear();
QVector<double> datayNormal;
datayNormal.clear();
QVector<double> datayBalance;
datayBalance.clear();
QVector<QString> labels;
int indexPointer;
double cellHardUnder = mDieBieMS->bmsConfig()->getParamDouble("cellHardUnderVoltage");
double cellHardOver = mDieBieMS->bmsConfig()->getParamDouble("cellHardOverVoltage");
for(indexPointer = 0; indexPointer < cellCount; indexPointer++){
dataxNew.append(indexPointer + 1);
if(cellVoltageArray[indexPointer] < 0.0){
datayNormal.append(0.0);
datayBalance.append(fabs(cellVoltageArray[indexPointer]));
}else{
datayNormal.append(fabs(cellVoltageArray[indexPointer]));
datayBalance.append(0.0);
}
QString voltageString = QStringLiteral("%1V (C").arg(fabs(cellVoltageArray[indexPointer]), 0, 'f',3);
labels.append(voltageString + QString::number(indexPointer) + ")");
}
int z =0;
//QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
//textTicker->addTicks(dataxNew, labels);
//ui->cellBarGraph->xAxis->setTicker(textTicker);
//ui->cellBarGraph->xAxis->setRange(0.5, indexPointer + 0.5);
//ui->cellBarGraph->yAxis->setRange(cellHardUnder, cellHardOver);
//barsNormal->setData(dataxNew, datayNormal);
//barsBalance->setData(dataxNew, datayBalance);
}
/*
void VisualizationPage::timerSlot()
{
if (mUpdateValPlot) {
int dataSize = mPackVoltage.size();
QVector<double> xAxis(dataSize);
for (int i = 0;i < mSeconds.size();i++) {
xAxis[i] = mSeconds[i];
}
// Current and duty-plot
int graphIndex = 0;
ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mPackVoltage);
ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadVoltage);
ui->ivLCGraph->graph(graphIndex++)->setData(xAxis, mLCLoadCurrent);
#if 0
graphIndex = 0;
ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVHigh);
ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVAverage);
ui->cellGraph->graph(graphIndex++)->setData(xAxis, mCellVLow);
#endif
graphIndex = 0;
ui->cellLimitsGraph->graph(graphIndex++)->setData(xAxis, mCellVHigh);
ui->cellLimitsGraph->graph(graphIndex++)->setData(xAxis, mCellVAverage);
ui->cellLimitsGraph->graph(graphIndex++)->setData(xAxis, mCellVLow);
graphIndex = 0;
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSHigh);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSAverage);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBMSLow);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattHigh);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattAverage);
ui->tempGraph->graph(graphIndex++)->setData(xAxis, mTempBattLow);
if (ui->autoscaleButton->isChecked()) {
ui->ivLCGraph->rescaleAxes();
#if 0 // do not autoscale since we're displaying cell voltages
ui->cellGraph->rescaleAxes();
#endif
// only scale X axis
ui->cellGraph->xAxis->rescale();
ui->cellLimitsGraph->xAxis->rescale();
ui->tempGraph->rescaleAxes();
}
ui->ivLCGraph->replot();
ui->cellGraph->replot();
ui->cellLimitsGraph->replot();
ui->tempGraph->replot();
ui->cellBarGraph->replot();
ui->auxBarGraph->replot();
ui->expBarGraph->replot();
mUpdateValPlot = false;
}
}
void VisualizationPage::valuesReceived(BMS_VALUES values)
{
ui->rtText->setValues(values);
const int maxS = 500;
appendDoubleAndTrunc(&mPackVoltage, values.packVoltage, maxS);
appendDoubleAndTrunc(&mLCLoadVoltage, values.loadLCVoltage, maxS);
appendDoubleAndTrunc(&mLCLoadCurrent, values.loadLCCurrent, maxS);
appendDoubleAndTrunc(&mHCLoadVoltage, values.loadHCVoltage, maxS);
appendDoubleAndTrunc(&mHCLoadCurrent, values.loadHCCurrent, maxS);
appendDoubleAndTrunc(&mChargerVoltage, values.chargerVoltage, maxS);
appendDoubleAndTrunc(&mAuxVoltage, values.auxVoltage, maxS);
appendDoubleAndTrunc(&mAuxCurrent, values.auxCurrent, maxS);
appendDoubleAndTrunc(&mCellVHigh, values.cVHigh, maxS);
appendDoubleAndTrunc(&mCellVAverage, values.cVAverage, maxS);
appendDoubleAndTrunc(&mCellVLow, values.cVLow, maxS);
appendDoubleAndTrunc(&mTempBMSHigh, values.tempBMSHigh, maxS);
appendDoubleAndTrunc(&mTempBMSAverage, values.tempBMSAverage, maxS);
appendDoubleAndTrunc(&mTempBMSLow, values.tempBMSLow, maxS);
appendDoubleAndTrunc(&mTempBattHigh, values.tempBattHigh, maxS);
appendDoubleAndTrunc(&mTempBattAverage, values.tempBattAverage, maxS);
appendDoubleAndTrunc(&mTempBattLow, values.tempBattLow, maxS);
appendDoubleAndTrunc(&mHumidity, values.humidity, maxS);
qint64 tNow = QDateTime::currentMSecsSinceEpoch();
double elapsed = (double)(tNow - mLastUpdateTime) / 1000.0;
if (elapsed > 1.0) {
elapsed = 1.0;
}
mSecondCounter += elapsed;
appendDoubleAndTrunc(&mSeconds, mSecondCounter, maxS);
mLastUpdateTime = tNow;
mUpdateValPlot = true;
}
void VisualizationPage::cellsReceived(int cellCount, QVector<double> cellVoltageArray){
QVector<double> dataxNew;
dataxNew.clear();
QVector<double> datayNormal;
datayNormal.clear();
QVector<double> datayBalance;
datayBalance.clear();
QVector<QString> labels;
int indexPointer;
double cellHardUnder = mDieBieMS->bmsConfig()->getParamDouble("cellHardUnderVoltage");
double cellHardOver = mDieBieMS->bmsConfig()->getParamDouble("cellHardOverVoltage");
for(indexPointer = 0; indexPointer < cellCount; indexPointer++){
dataxNew.append(indexPointer + 1);
if(cellVoltageArray[indexPointer] < 0.0){
datayNormal.append(0.0);
datayBalance.append(fabs(cellVoltageArray[indexPointer]));
}else{
datayNormal.append(fabs(cellVoltageArray[indexPointer]));
datayBalance.append(0.0);
}
QString voltageString = QStringLiteral("%1V (C").arg(fabs(cellVoltageArray[indexPointer]), 0, 'f',3);
labels.append(voltageString + QString::number(indexPointer+1) + ")");
}
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
textTicker->addTicks(dataxNew, labels);
int idx = 0;
double plotx = mSeconds.empty() ? 0 : mSeconds.last();
for(auto v : cellVoltageArray)
{
// if ( auto *pg = ui->cellGraph->graph(idx) )
// {
// auto ploty = fabs(v);
// pg->addData(plotx, ploty);
// }
//
++idx;
}
// ui->cellBarGraph->xAxis->setTicker(textTicker);
// ui->cellBarGraph->xAxis->setRange(0.5, indexPointer + 0.5);
// ui->cellBarGraph->yAxis->setRange(cellHardUnder, cellHardOver);
// barsNormal->setData(dataxNew, datayNormal);
// barsBalance->setData(dataxNew, datayBalance);
}
*/
void VisualizationPage::auxReceived(int auxCount, QVector<double> auxVoltageArray){
QVector<double> dataxNew;
dataxNew.clear();
QVector<double> datayNormal;
datayNormal.clear();
QVector<QString> labels;
int indexPointer;
for(indexPointer = 0; indexPointer < auxCount; indexPointer++){
dataxNew.append(indexPointer + 1);
if(auxVoltageArray[indexPointer] < -50.0){
datayNormal.append(0.0);
}else{
datayNormal.append(auxVoltageArray[indexPointer]);
}
QString voltageString = QStringLiteral("%1°C (TH").arg(auxVoltageArray[indexPointer], 0, 'f',3);
labels.append(voltageString + QString::number(indexPointer+1) + ")");
}
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
textTicker->addTicks(dataxNew, labels);
/*ui->auxBarGraph->xAxis->setTicker(textTicker);
ui->auxBarGraph->xAxis->setRange(0.5, indexPointer + 0.5);
ui->auxBarGraph->yAxis->setRange(-40, 75);
barsTemperature->setData(dataxNew, datayNormal);*/
}
void VisualizationPage::expTempReceived(int expTempCount, QVector<double> expTempVoltageArray){
QVector<double> dataxNew;
dataxNew.clear();
QVector<double> datayNormal;
datayNormal.clear();
QVector<QString> labels;
int indexPointer;
for(indexPointer = 0; indexPointer < expTempCount; indexPointer++){
dataxNew.append(indexPointer + 1);
if(expTempVoltageArray[indexPointer] < -50.0){
datayNormal.append(0.0);
}else{
datayNormal.append(expTempVoltageArray[indexPointer]);
}
QString voltageString = QStringLiteral("%1°C (T").arg(expTempVoltageArray[indexPointer], 0, 'f',3);
labels.append(voltageString + QString::number(indexPointer) + ")");
}
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
textTicker->addTicks(dataxNew, labels);
/*ui->expBarGraph->xAxis->setTicker(textTicker);
ui->expBarGraph->xAxis->setRange(0.5, indexPointer + 0.5);
ui->expBarGraph->yAxis->setRange(-40, 75);
ExpBarsTemperature->setData(dataxNew, datayNormal);*/
}
void VisualizationPage::appendDoubleAndTrunc(QVector<double> *vec, double num, int maxSize)
{
vec->append(num);
if(vec->size() > maxSize) {
vec->remove(0, vec->size() - maxSize);
}
}
void VisualizationPage::on_checkBox_stateChanged(int arg1)
{
if(ui->checkBox->isChecked())
{
chartT->hideSeriesWithNumber(TemperatureBatMax);
}
else
{
chartT->showSeriesWithNumber(TemperatureBatMax);
}
}