#include "windowrace.h" #include "qvectorhelper.h" #include "timemodel.h" #include "ui_windowrace.h" #include "unistd.h" #include #include #include #include #include #include using std::cout; using std::endl; using std::string; using std::vector; WindowRace::WindowRace(DataBase * db, QWidget * parent) : QMainWindow(parent), ui(new Ui::WindowRace) { ui->setupUi(this); this->ui->pBNextRace->setEnabled(false); this->finished = false; this->wRennlisteSeted = false; this->db = db; vector> res; res = db->getData("select dauer from renndauer", 1); this->fahrzeit = res[0][0].toInt(); string statement = "select minimumroundtime from rennen order by id DESC limit 1"; res = db->getData(statement, 1); this->minimumTime = res[0][0].toInt(); // fill minSecTimes vector statement = "select minsec1, minsec2, minsec3, mindestRundenDauer from " "renndauer order by id " "DESC limit 1"; // cout << statement << endl; res = db->getData(statement, 4); this->minSecTime.append(res[0][0].toInt()); this->minSecTime.append(res[0][1].toInt()); this->minSecTime.append(res[0][2].toInt()); this->minSecTime.append(res[0][3].toInt()); QVectorHelper::minSec1 = this->minSecTime.at(0); QVectorHelper::minSec2 = this->minSecTime.at(1); QVectorHelper::minSec3 = this->minSecTime.at(2); QVectorHelper::minTrackTime = this->minSecTime.at(3); // cout << "Track time minimum:" << QVectorHelper::minTrackTime << endl; firstTimeDea = true; firstTimeShell = true; started = false; countdownValue = this->fahrzeit; countdown = new Countdown; startAmpelThread = new Ampel; ampelCounter = 0; ui->pBStart->setFocus(); paused = false; Hardware = new HardwareSetup; Hardware->start(); QObject::connect(Hardware, SIGNAL(Dea(int, int)), this, SLOT(deaSlot(int, int))); QObject::connect(Hardware, SIGNAL(Shell(int, int)), this, SLOT(shellSlot(int, int))); QObject::connect(ui->pBStart, SIGNAL(clicked()), this, SLOT(go())); QObject::connect(countdown, SIGNAL(CountdownUpdate()), this, SLOT(countdownUpdate())); QObject::connect(startAmpelThread, SIGNAL(ampelUpdate()), this, SLOT(ampelSlot())); QObject::connect(startAmpelThread, SIGNAL(ampelUpdate()), this, SLOT(laufcheck())); QObject::connect(ui->pBBreak, SIGNAL(clicked()), this, SLOT(breakCounter())); QObject::connect(this->ui->pBNextRace, SIGNAL(clicked()), this, SLOT(prepareNextRace())); QObject::connect(this->ui->pBStop, SIGNAL(clicked()), this, SLOT(stopClicked())); ui->lCountdown->setText(timeWrapper(countdownValue)); // Ampelsetup ui->WAmpel15->hide(); ui->WAmpel25->hide(); ui->hW15->setVisible(true); ui->hW25->setVisible(true); ui->WAmpel14->hide(); ui->WAmpel24->hide(); ui->hW14->setVisible(true); ui->hW24->setVisible(true); ui->WAmpel13->hide(); ui->WAmpel23->hide(); ui->hW13->setVisible(true); ui->hW23->setVisible(true); ui->WAmpel12->hide(); ui->WAmpel22->hide(); ui->hW12->setVisible(true); ui->hw22->setVisible(true); ui->WAmpel11->hide(); ui->WAmpel21->hide(); ui->hW11->setVisible(true); ui->hW21->setVisible(true); vector> fahrer, autos, rennid, tableData; statement = "select id_rennen from aktrennen group by id_rennen order by " "id_rennen DESC limit 1"; rennid = this->db->getData(statement, 1); this->renn_id = rennid[0][0].toInt(); statement = "select fahrershellid, autoshellid, fahrerdeaid, autodeaid " "from aktrennen where id_rennen like " + rennid[0][0].toStdString() + " limit 1"; tableData = db->getData2(statement, 4); statement = "select name from fahrer where id like " + tableData[0][0].toStdString(); fahrer = this->db->getData2(statement, 1); statement = "select name from AutoKonfiguration where id_auto like " + tableData[0][1].toStdString() + " order by seit DESC"; autos = this->db->getData2(statement, 1); this->ui->gbShell->setTitle("Shell, " + fahrer[0][0] + ", " + autos[0][0]); statement = "select name from fahrer where id like " + tableData[0][2].toStdString(); fahrer = this->db->getData2(statement, 1); statement = "select name from AutoKonfiguration where id_auto like " + tableData[0][3].toStdString() + " order by seit DESC"; autos = this->db->getData2(statement, 1); this->ui->gbDea->setTitle("Dea, " + fahrer[0][0] + ", " + autos[0][0]); this->shellDriverId = tableData[0][0].toInt(); this->shellCarId = tableData[0][1].toInt(); this->deaDriverId = tableData[0][2].toInt(); this->deaCarId = tableData[0][3].toInt(); // progressbar this->ui->pbTime->setMaximum(this->fahrzeit); this->ui->pbTime->setMinimum(0); this->ui->pbTime->setTextVisible(false); this->ui->pbTime->setStyleSheet("QProgressBar::chunk { color: #05B8CC;}"); this->ui->pbTime->setValue(0); QKeySequence ks(Qt::Key_Return); // btw, this is numpad enter QShortcut * keyReturn = new QShortcut(ks, this); QObject::connect(keyReturn, SIGNAL(activated()), this, SLOT(ReturnPress())); // QObject::connect(shortcut, SIGNAL(activated()), this, SLOT(close())); } void WindowRace::ReturnPress() { // cout << "Return pressed" << endl; if (this->ui->pBNextRace->isEnabled()) { this->prepareNextRace(); if (this->wRennlisteSeted) { this->wRennliste->changeSelection(); } else { cout << "Problem with racelist" << endl; } } else { if (started) { this->breakCounter(); } else { this->go(); } } } void WindowRace::prepareNextRace() { this->firstTimeShell = true; this->firstTimeDea = true; // this->ui->lWShellTime->clear(); // this->ui->lWDeaTime->clear(); this->ui->lBestZeitDea->setText("∞"); this->ui->lBestZeitShell->setText("∞"); this->ui->lCurRoundTimeShell->setText("∞"); this->ui->lCurRoundDea->setText("∞"); this->ui->lBridgeShell->setText("∞"); this->ui->lStraightShell->setText("∞"); this->ui->lCurvesShell->setText("∞"); this->ui->lDeltaShellTop->setText("∞"); this->ui->lBridgeDea->setText("∞"); this->ui->lStraightDea->setText("∞"); this->ui->lCurvesDea->setText("∞"); this->ui->lDeltaDeaTop->setText("∞"); this->VecShell.clear(); this->VecDea.clear(); // clear tableview shell timeModelShell = new TimeModel(VecShell, minSecTime); ui->lWShellTime->setModel(timeModelShell); // clear tableview dea timeModelDea = new TimeModel(VecDea, minSecTime); ui->lWDeaTime->setModel(timeModelDea); this->finished = false; this->paused = false; this->started = false; this->countdownValue = this->fahrzeit; this->ampelCounter = 0; this->startAmpelThread->terminate(); this->countdown->terminate(); this->ui->pBNextRace->setEnabled(false); this->ui->lCountdown->setText(timeWrapper(countdownValue)); // progressbar this->ui->pbTime->setStyleSheet("QProgressBar::chunk { color: #05B8CC;}"); this->ui->pbTime->setValue(0); // countdown this->ui->lCountdown->setStyleSheet("QLabel { color: black; }"); // Ampel Setup ui->WAmpel15->hide(); ui->WAmpel25->hide(); ui->hW15->setVisible(true); ui->hW25->setVisible(true); ui->WAmpel14->hide(); ui->WAmpel24->hide(); ui->hW14->setVisible(true); ui->hW24->setVisible(true); ui->WAmpel13->hide(); ui->WAmpel23->hide(); ui->hW13->setVisible(true); ui->hW23->setVisible(true); ui->WAmpel12->hide(); ui->WAmpel22->hide(); ui->hW12->setVisible(true); ui->hw22->setVisible(true); ui->WAmpel11->hide(); ui->WAmpel21->hide(); ui->hW11->setVisible(true); ui->hW21->setVisible(true); } void WindowRace::setDriverAndCar(vector vec) { this->ui->gbShell->setTitle("Shell, " + vec[0] + ", " + vec[1]); this->ui->gbDea->setTitle("Dea, " + vec[2] + ", " + vec[3]); } void WindowRace::stopClicked() { this->prepareNextRace(); } void WindowRace::setWindowRennliste(WindowRennliste * ptrInstance) { this->wRennliste = ptrInstance; this->wRennlisteSeted = true; QObject::connect(this->ui->pBNextRace, SIGNAL(clicked()), this->wRennliste, SLOT(changeSelection())); } void WindowRace::setDriverAndCarId(vector vec) { this->shellDriverId = vec[0].toInt(); this->shellCarId = vec[1].toInt(); this->deaDriverId = vec[2].toInt(); this->deaCarId = vec[3].toInt(); } void WindowRace::closeEvent(QCloseEvent * event) { countdown->setStop(); QMessageBox msgBox; msgBox.setText("Wirklich schliessen?"); msgBox.setInformativeText(""); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); int ret = msgBox.exec(); switch (ret) { case QMessageBox::No: event->ignore(); break; case QMessageBox::Yes: this->wRennliste->schliessen(); this->Hardware->setStop(); event->accept(); break; default: // should never be reached break; } } void WindowRace::breakCounter() { if (!paused) { paused = true; ui->pBBreak->setText("Weiter"); } else { ui->pBBreak->setText("Pause"); paused = false; } } void WindowRace::laufcheck() { // std::cout << "thread lauft noch" << std::endl; } QString WindowRace::timeWrapper(long zahl) { long min = zahl / 60; int sec = zahl % 60; QString sec_q; if (sec < 10) { sec_q = "0" + QString::number(sec); } else { sec_q = QString::number(sec); } QString min_q = QString::number(min); return min_q + ":" + sec_q; } void WindowRace::countdownUpdate() { if (!paused) { countdownValue -= 1; if (countdownValue <= 15) { this->ui->lCountdown->setStyleSheet("QLabel { color: red; }"); this->ui->pbTime->setStyleSheet( "QProgressBar::chunk { background-color: orange; }"); // this->ui->pbTime-> } if (countdownValue <= -1) { this->finished = true; this->wRennliste->setBesttime(QVectorHelper::getMin(VecShell), QVectorHelper::getMin(this->VecDea)); this->ui->pBNextRace->setEnabled(true); } else { ui->lCountdown->setText(timeWrapper(countdownValue)); this->ui->pbTime->setValue(this->fahrzeit - static_cast(countdownValue)); } } } WindowRace::~WindowRace() { this->startAmpelThread->setStop(); this->countdown->setStop(); this->Hardware->setStop(); usleep(1000010); // eine Sekunde delete this->countdown; delete this->Hardware; delete this->startAmpelThread; // delete this->db; delete ui; } void WindowRace::shellSlot(int time, int sector) { if (started && !paused && !this->finished) { if (firstTimeShell) { firstTimeShell = false; // counterShell.start(); } else { // long zeit = counterShell.getTime(); QVector test; switch (sector) { case 1: VecShell.append(QVector()); VecShell.last().append(time); // update tableview test.append(1); test.append(2); test.append(3); this->timeModelShell = new TimeModel(VecShell, minSecTime, test, this); // this->ui->lWShellTime->setModel(this->timeModelShell); ui->lWShellTime->setModel(this->timeModelShell); this->ui->lBridgeShell->setText(QString::number( static_cast(QVectorHelper::getMinSec1(VecShell)) / 1000)); break; case 2: if (VecShell.size() > 0) { if (VecShell.last().size() == 1) { VecShell.last().append(time); } // update tableview test.append(1); test.append(2); test.append(3); this->timeModelShell = new TimeModel(VecShell, minSecTime, test, this); // timeModelShell = new // TimeModel(VecShell, this); this->ui->lWShellTime->setModel(timeModelShell); this->ui->lStraightShell->setText(QString::number( static_cast( QVectorHelper::getMinSec2(VecShell)) / 1000)); } break; case 3: if (VecShell.size() > 0) { if (VecShell.last().size() == 2) { VecShell.last().append(time); VecShell.last().append( QVectorHelper::getCurTime(VecShell.last())); if (QVectorHelper::getCurTime(VecShell.last()) <= QVectorHelper::getMin(VecShell)) { ui->lBestZeitShell->setText(QString::number( static_cast( QVectorHelper::getMin(VecShell)) / 1000)); } ui->lCurRoundTimeShell->setText(QString::number( static_cast( QVectorHelper::getCurTime(VecShell.last())) / 1000)); // update tableview test.append(1); test.append(2); test.append(3); this->timeModelShell = new TimeModel(VecShell, minSecTime, test, this); // timeModelShell = new // TimeModel(VecShell, this); this->ui->lWShellTime->setModel(timeModelShell); this->ui->lCurvesShell->setText(QString::number( static_cast( QVectorHelper::getMinSec3(VecShell)) / 1000)); theoreticalMinShell = 9999; theoreticalMinShell = QVectorHelper::getMinSec1(VecShell) + QVectorHelper::getMinSec2(VecShell) + QVectorHelper::getMinSec3(VecShell); deltaShell = QVectorHelper::getMin(VecShell) - theoreticalMinShell; this->ui->lDeltaShellTop->setText(QString::number( static_cast(deltaShell) / 1000)); if (VecShell.size() > 0) { int zeit = QVectorHelper::getCurTime(VecShell.last()); QString statement = "insert into Zeiten (id_rennen, id_fahrer, " "id_auto, id_bahn, zeit) values (" + QString::number(this->renn_id) + ", " + QString::number(this->shellDriverId) + ", " + QString::number(this->shellCarId) + ", 1, " + QString::number(zeit) + ")"; // cout << statement.toStdString() << endl; this->db->setData(statement.toStdString()); } } } break; } if (sector == 3) { } ui->lWShellTime->scrollToBottom(); } } ui->lWShellTime->scrollToBottom(); ui->lWShellTime->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch); } void WindowRace::deaSlot(int time, int sector) { if (started && !paused && !this->finished) { if (firstTimeDea) { firstTimeDea = false; counterDea.start(); } else { switch (sector) { case 1: VecDea.push_back(QVector()); VecDea.last().push_back(time); cout << "Dea Sektor 1" << endl; timeModelDea = new TimeModel(VecDea, minSecTime, this); this->ui->lWDeaTime->setModel(timeModelDea); this->ui->lBridgeDea->setText(QString::number( static_cast(QVectorHelper::getMinSec1(VecDea)) / 1000)); break; case 2: if (VecDea.size() > 0) { if (VecDea.last().size() == 1) { cout << time << sector << endl; VecDea[VecDea.size() - 1].push_back(time); timeModelDea = new TimeModel(VecDea, minSecTime, this); this->ui->lWDeaTime->setModel(timeModelDea); this->ui->lStraightDea->setText(QString::number( static_cast( QVectorHelper::getMinSec2(VecDea)) / 1000)); } else { // VecDea[VecDea.size()-1].append(9999); } } break; case 3: if (VecDea.size() > 0) { // cout << "Time sec 3: " << time << endl; if (VecDea.last().size() == 2) { // cout << time << sector << // endl; VecDea.last().push_back(time); // add sum to vector VecDea.last().push_back( QVectorHelper::getCurTime(VecDea.last())); timeModelDea = new TimeModel(VecDea, minSecTime, this); this->ui->lWDeaTime->setModel(timeModelDea); } // best time on widget cout << "cur time: " << QVectorHelper::getCurTime(VecDea.last()) << endl; cout << "min time: " << QVectorHelper::getMin(VecDea) << endl; if (QVectorHelper::getCurTime(VecDea.last()) <= QVectorHelper::getMin(VecDea)) { ui->lBestZeitDea->setText(QString::number( static_cast(QVectorHelper::getMin(VecDea)) / 1000)); } ui->lCurRoundDea->setText(QString::number( static_cast( QVectorHelper::getCurTime(VecDea.last())) / 1000)); } this->ui->lCurvesDea->setText(QString::number( static_cast(QVectorHelper::getMinSec3(VecDea)) / 1000)); theoreticalMinDea = 9999; theoreticalMinDea = QVectorHelper::getMinSec1(VecDea) + QVectorHelper::getMinSec2(VecDea) + QVectorHelper::getMinSec3(VecDea); deltaDea = QVectorHelper::getMin(VecDea) - theoreticalMinDea; this->ui->lDeltaDeaTop->setText( QString::number(static_cast(deltaDea) / 1000)); if (VecDea.size() > 0) { int zeit = QVectorHelper::getCurTime(VecDea.last()); QString statement = "insert into Zeiten (id_rennen, id_fahrer, " "id_auto, id_bahn, zeit) values (" + QString::number(this->renn_id) + ", " + QString::number(this->deaDriverId) + ", " + QString::number(this->deaCarId) + ", 2, " + QString::number(zeit) + ")"; // cout << statement.toStdString() << endl; this->db->setData(statement.toStdString()); ui->lWDeaTime->scrollToBottom(); } break; } } } ui->lWDeaTime->scrollToBottom(); ui->lWDeaTime->horizontalHeader()->setSectionResizeMode( QHeaderView::Stretch); } long WindowRace::getMinimum(std::vector a) { long minimum = -1; for (unsigned int i = 0; i < a.size(); i++) { if (minimum < 0) { if (a[i] >= this->minimumTime) { minimum = a[i]; } } else { if (a[i] < minimum && a[i] >= this->minimumTime) { minimum = a[i]; } } } return minimum; } void WindowRace::ampelSlot() { if (ampelCounter == 5) { ui->WAmpel15->hide(); ui->WAmpel25->hide(); ui->hW15->setVisible(true); ui->hW25->setVisible(true); ui->WAmpel14->hide(); ui->WAmpel24->hide(); ui->hW14->setVisible(true); ui->hW24->setVisible(true); ui->WAmpel13->hide(); ui->WAmpel23->hide(); ui->hW13->setVisible(true); ui->hW23->setVisible(true); ui->WAmpel12->hide(); ui->WAmpel22->hide(); ui->hW12->setVisible(true); ui->hw22->setVisible(true); ui->WAmpel11->hide(); ui->WAmpel21->hide(); ui->hW11->setVisible(true); ui->hW21->setVisible(true); startAmpelThread->terminate(); started = true; countdown->start(); } if (ampelCounter == 4) { ampelCounter = 5; ui->WAmpel15->setVisible(true); ui->WAmpel25->setVisible(true); ui->hW15->hide(); ui->hW25->hide(); } if (ampelCounter == 3) { ampelCounter = 4; ui->WAmpel14->setVisible(true); ui->WAmpel24->setVisible(true); ui->hW14->hide(); ui->hW24->hide(); } if (ampelCounter == 2) { ampelCounter = 3; ui->WAmpel13->setVisible(true); ui->WAmpel23->setVisible(true); ui->hW13->hide(); ui->hW23->hide(); } if (ampelCounter == 1) { ampelCounter = 2; ui->WAmpel12->setVisible(true); ui->WAmpel22->setVisible(true); ui->hW12->hide(); ui->hw22->hide(); } if (ampelCounter == 0) { ampelCounter = 1; ui->WAmpel11->setVisible(true); ui->WAmpel21->setVisible(true); ui->hW11->hide(); ui->hW21->hide(); } } void WindowRace::go() { startAmpelThread->start(); }