diff --git a/RepRaptor.pro b/RepRaptor.pro index 44ef6c1..d3c0a0b 100644 --- a/RepRaptor.pro +++ b/RepRaptor.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui serialport +QT += core gui serialport concurrent greaterThan(QT_MAJOR_VERSION, 4): QT += widgets diff --git a/mainwindow.cpp b/mainwindow.cpp index 6a6eeee..0d59d63 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -45,6 +45,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(&printer, SIGNAL(readyRead()), this, SLOT(readSerial())); connect(&statusTimer, SIGNAL(timeout()), this, SLOT(checkStatus())); connect(&sendTimer, SIGNAL(timeout()), this, SLOT(sendNext())); + connect(&statusWatcher, SIGNAL(finished()), this, SLOT(updateStatus())); if(settings.value("core/statusinterval").toInt()) statusTimer.setInterval(settings.value("core/statusinterval").toInt()); else statusTimer.setInterval(3000); @@ -354,7 +355,11 @@ void MainWindow::readSerial() { QByteArray data = printer.readLine(); if(data.startsWith("ok") || data.startsWith("wait")) commandDone = true; //Can send next command - else if(checkingTemperature && data.startsWith("T:")) parseStatus(data); //Parse temperature readings if any + else if(checkingTemperature && data.startsWith("T:")) + { + QFuture parseThread = QtConcurrent::run(this, &MainWindow::parseStatus, data); + statusWatcher.setFuture(parseThread); + } else if(data.startsWith("Resend")) //Handle resend if requested { if(currentLine > 0) currentLine -= data.split(':')[1].toInt(); @@ -552,7 +557,7 @@ void MainWindow::serialError(QSerialPort::SerialPortError error) errorwindow.exec(); } -void MainWindow::parseStatus(QByteArray data) +TemperatureReadings MainWindow::parseStatus(QByteArray data) { QString extmp = ""; QString btmp = ""; @@ -566,11 +571,33 @@ void MainWindow::parseStatus(QByteArray data) btmp+=data.at(i); } - ui->extruderlcd->display(extmp.toDouble()); - ui->bedlcd->display(btmp.toDouble()); + //ui->extruderlcd->display(extmp.toDouble()); + //ui->bedlcd->display(btmp.toDouble()); + //sinceLastTemp.restart(); + + TemperatureReadings t; + t.e = extmp.toDouble(); + t.b = btmp.toDouble(); + + return t; +} + +void MainWindow::updateStatus(TemperatureReadings r) +{ + ui->extruderlcd->display(r.e); + ui->bedlcd->display(r.b); + sinceLastTemp.restart(); } +void MainWindow::updateStatus() +{ + TemperatureReadings r = statusWatcher.future().result(); + ui->extruderlcd->display(r.e); + ui->bedlcd->display(r.b); + + sinceLastTemp.restart(); +} void MainWindow::on_actionPrint_from_SD_triggered() { diff --git a/mainwindow.h b/mainwindow.h index 87d7863..963b398 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include @@ -22,6 +22,11 @@ namespace Ui { class MainWindow; } +typedef struct +{ + double e, b; +} TemperatureReadings; + class MainWindow : public QMainWindow { Q_OBJECT @@ -38,6 +43,7 @@ public: QElapsedTimer sinceLastTemp; QSettings settings; QStringList recentFiles; + QFutureWatcher statusWatcher; private: Ui::MainWindow *ui; @@ -66,7 +72,7 @@ private slots: void checkStatus(); void updateRecent(); void injectCommand(QString command); - void parseStatus(QByteArray data); + TemperatureReadings parseStatus(QByteArray data); void xplus(); void yplus(); @@ -99,6 +105,8 @@ private slots: void on_actionAbout_triggered(); void serialError(QSerialPort::SerialPortError error); void on_actionPrint_from_SD_triggered(); + void updateStatus(TemperatureReadings r); + void updateStatus(); }; #endif // MAINWINDOW_H