diff --git a/RepRaptor.pro b/RepRaptor.pro index 6c423e0..8fa61af 100644 --- a/RepRaptor.pro +++ b/RepRaptor.pro @@ -21,7 +21,8 @@ SOURCES += main.cpp\ errorwindow.cpp \ erroricon.cpp \ sdwindow.cpp \ - eepromwindow.cpp + eepromwindow.cpp \ + parser.cpp HEADERS += mainwindow.h \ settingswindow.h \ @@ -30,7 +31,8 @@ HEADERS += mainwindow.h \ erroricon.h \ sdwindow.h \ repraptor.h \ - eepromwindow.h + eepromwindow.h \ + parser.h FORMS += mainwindow.ui \ settingswindow.ui \ diff --git a/eepromwindow.cpp b/eepromwindow.cpp index 9f75a64..dbb2695 100644 --- a/eepromwindow.cpp +++ b/eepromwindow.cpp @@ -37,7 +37,7 @@ EEPROMWindow::EEPROMWindow(QStringList eepromLines, QWidget *parent) : hline->setFrameShadow(QFrame::Sunken); line->addWidget(hline); - edit->setObjectName("e"+QString::number(j)); + edit->setObjectName("e"+QString::number(j)); //Name the LineEdit, so when it emits signal we know where it came from QRegExpValidator *doublevalidator = new QRegExpValidator( QRegExp("^\\-?\\d+\\.?\\d+(e\\-?\\d+)?$", diff --git a/mainwindow.cpp b/mainwindow.cpp index 3d12a59..d56dc80 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -59,6 +59,7 @@ MainWindow::MainWindow(QWidget *parent) : userCommand = ""; currentLine = 0; readyRecieve = 0; + lastRecieved = 0; readingEEPROM = false; EEPROMReadingStarted = false; @@ -77,11 +78,28 @@ MainWindow::MainWindow(QWidget *parent) : connect(&statusTimer, SIGNAL(timeout()), this, SLOT(checkStatus())); connect(&sendTimer, SIGNAL(timeout()), this, SLOT(sendNext())); connect(&statusWatcher, SIGNAL(finished()), this, SLOT(updateStatus())); - connect(&sdWatcher, SIGNAL(finished()), this, SLOT(updateSDStatus())); - connect(this, SIGNAL(sdReady()), this, SLOT(initSDprinting())); connect(&progressSDTimer, SIGNAL(timeout()), this, SLOT(checkSDStatus())); connect(this, SIGNAL(eepromReady()), this, SLOT(openEEPROMeditor())); + qRegisterMetaType("TemperatureReadings"); + parser = new Parser(); + parserThread = new QThread(); + parser->moveToThread(parserThread); + connect(parserThread, &QThread::finished, parser, &QObject::deleteLater); + connect(this, &MainWindow::recievedData, parser, &Parser::parse); + connect(this, &MainWindow::startedReadingEEPROM, parser, &Parser::setEEPROMReadingMode); + connect(parser, &Parser::recievedTemperature, this, &MainWindow::updateTemperature); + connect(parser, &Parser::recievedOkNum, this, &MainWindow::recievedOkNum); + connect(parser, &Parser::recievedOkWait, this, &MainWindow::recievedWait); + connect(parser, &Parser::recievedSDFilesList, this, &MainWindow::initSDprinting); + connect(parser, &Parser::recievedEEPROMLine, this, &MainWindow::EEPROMSettingRecieved); + connect(parser, &Parser::recievingEEPROMDone, this, &MainWindow::openEEPROMeditor); + connect(parser, &Parser::recievedError, this, &MainWindow::recievedError); + connect(parser, &Parser::recievedSDDone, this, &MainWindow::recievedSDDone); + connect(parser, &Parser::recievedResend, this, &MainWindow::recievedResend); + connect(parser, &Parser::recievedSDUpdate, this, &MainWindow::updateSDStatus); + parserThread->start(); + if(settings.value("core/statusinterval").toInt()) statusTimer.setInterval(settings.value("core/statusinterval").toInt()); else statusTimer.setInterval(3000); statusTimer.start(); @@ -108,6 +126,8 @@ MainWindow::~MainWindow() { if(gfile.isOpen()) gfile.close(); if(printer.isOpen()) printer.close(); + parserThread->quit(); + parserThread->wait(); if(firstrun) settings.setValue("core/firstrun", true); //firstrun is inverted! @@ -457,6 +477,8 @@ void MainWindow::on_haltbtn_clicked() void MainWindow::readSerial() { + QByteArray data = printer.readLine(); + /* if(printer.canReadLine()) { QByteArray data = printer.readLine(); @@ -541,9 +563,9 @@ void MainWindow::readSerial() sdFiles.clear(); readingFiles = true; //start reading files from SD } - - printMsg(QString(data)); //echo - } +*/ + emit recievedData(data); + printMsg(QString(data)); //echo } void MainWindow::printMsg(const char* text) @@ -805,10 +827,14 @@ TemperatureReadings MainWindow::parseStatus(QByteArray data) void MainWindow::updateStatus() { TemperatureReadings r = statusWatcher.future().result(); + updateTemperature(r); + sinceLastTemp.restart(); +} + +void MainWindow::updateTemperature(TemperatureReadings r) +{ ui->extruderlcd->display(r.e); ui->bedlcd->display(r.b); - - sinceLastTemp.restart(); } void MainWindow::on_actionPrint_from_SD_triggered() @@ -821,7 +847,7 @@ void MainWindow::on_actionAbout_Qt_triggered() qApp->aboutQt(); } -void MainWindow::initSDprinting() +void MainWindow::initSDprinting(QStringList sdFiles) { SDWindow sdwindow(sdFiles, this); //Made it to 666 lines! @@ -870,9 +896,8 @@ void MainWindow::selectSDfile(QString file) ui->fileBox->setDisabled(false); } -void MainWindow::updateSDStatus() +void MainWindow::updateSDStatus(double currentSDbytes) { - double currentSDbytes = sdWatcher.future().result(); ui->filelines->setText(QString::number(sdBytes) + QString("/") + QString::number(currentSDbytes) @@ -909,6 +934,7 @@ void MainWindow::on_actionSet_SD_printing_mode_triggered() void MainWindow::requestEEPROMSettings() { userCommands.clear(); + EEPROMSettings.clear(); switch(firmware) { @@ -922,7 +948,7 @@ void MainWindow::requestEEPROMSettings() return; } - readingEEPROM = true; + emit startedReadingEEPROM(); } void MainWindow::on_actionEEPROM_editor_triggered() @@ -948,3 +974,38 @@ void MainWindow::sendEEPROMsettings(QStringList changes) //printMsg(str); } } + +void MainWindow::recievedOkNum(int num) +{ + readyRecieve++; + lastRecieved = num; +} + +void MainWindow::recievedWait() +{ + readyRecieve = 1; +} + +void MainWindow::EEPROMSettingRecieved(QString esetting) +{ + EEPROMSettings.append(esetting); +} + +void MainWindow::recievedError() +{ + ErrorWindow errorwindow(this,"Hardware failure"); + errorwindow.exec(); +} + +void MainWindow::recievedSDDone() +{ + sdprinting=false; + ui->progressBar->setValue(0); + ui->filename->setText(""); + ui->fileBox->setDisabled(true); +} + +void MainWindow::recievedResend(int num) +{ + if(!sendingChecksum) currentLine--; +} diff --git a/mainwindow.h b/mainwindow.h index 4631bb2..69d7ebb 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -20,6 +20,7 @@ #include "sdwindow.h" #include "repraptor.h" #include "eepromwindow.h" +#include "parser.h" using namespace RepRaptor; @@ -35,6 +36,9 @@ public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); + Parser *parser; + QThread *parserThread; + protected: QFile gfile; QVector gcode; @@ -46,7 +50,6 @@ protected: QElapsedTimer sinceLastTemp; QSettings settings; QStringList recentFiles; - QStringList sdFiles; QStringList EEPROMSettings; QFutureWatcher statusWatcher; QFutureWatcher sdWatcher; @@ -73,6 +76,7 @@ private: bool chekingSDStatus; int firmware; long int currentLine; + unsigned long int lastRecieved; int readyRecieve; unsigned long int sdBytes; QString userCommand; @@ -91,15 +95,22 @@ private slots: void updateRecent(); void injectCommand(QString command); void updateStatus(); - void initSDprinting(); + void initSDprinting(QStringList sdFiles); void selectSDfile(QString file); void checkSDStatus(); - void updateSDStatus(); + void updateSDStatus(double currentSDbytes); TemperatureReadings parseStatus(QByteArray data); double parseSDStatus(QByteArray data); void requestEEPROMSettings(); void openEEPROMeditor(); void sendEEPROMsettings(QStringList changes); + void updateTemperature(TemperatureReadings r); + void EEPROMSettingRecieved(QString esetting); + void recievedOkNum(int num); + void recievedWait(); + void recievedError(); + void recievedSDDone(); + void recievedResend(int num); void xplus(); void yplus(); @@ -150,6 +161,8 @@ private slots: signals: void sdReady(); void eepromReady(); + void recievedData(QByteArray); + void startedReadingEEPROM(); }; #endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui index 0c6695d..7049331 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -897,6 +897,12 @@ STOP + + + 190 + 16777215 + + File diff --git a/parser.cpp b/parser.cpp new file mode 100644 index 0000000..8166897 --- /dev/null +++ b/parser.cpp @@ -0,0 +1,106 @@ +#include "parser.h" + +Parser::Parser(QObject *parent): + QObject(parent) +{ + this->setParent(parent); + temperatureRegxp.setCaseSensitivity(Qt::CaseInsensitive); + temperatureRegxp.setPatternSyntax(QRegExp::RegExp); + temperatureRegxp.setPattern("\\d+\\.\\d+"); // Find float in string + + readingFiles = false; + readingEEPROM = false; + EEPROMReadingStarted = false; + + QSettings settings; + firmware = settings.value("printer/firmware").toInt(); +} + +Parser::~Parser() +{ + +} + +void Parser::parse(QByteArray data) +{ + if(!data.isEmpty()) + { + if(readingFiles) + { + if(!data.contains("End file list")) SDFilesList.append(data); + else + { + readingFiles = false; + emit recievedSDFilesList(SDFilesList); + } + return; + } + + if(readingEEPROM) + { + if(firmware == Repetier) + { + if(data.startsWith("EPR")) + { + emit recievedEEPROMLine(QString(data)); + EEPROMReadingStarted = true; + } + else if(EEPROMReadingStarted) + { + readingEEPROM = false; + EEPROMReadingStarted = false; + emit recievingEEPROMDone(); + } + + return; + } + } + + if(data.startsWith("ok")) + emit recievedOkNum(data.split(' ').at(1).toInt()); + else if(data.startsWith("T:")) + { + TemperatureReadings r; + + if(temperatureRegxp.indexIn(QString(data)) != -1) + r.e = temperatureRegxp.cap(0).toDouble(); + else return; + if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1) + r.b = temperatureRegxp.cap(0).toDouble(); + else return; + + emit recievedTemperature(r); + } + else if(data.startsWith("wait")) emit recievedOkWait(); + else if(data.startsWith("rs") || data.startsWith("Resend")) + emit recievedResend(data.split(' ').at(0).toInt()); + else if(data.startsWith("!!")) emit recievedError(); + else if(data.startsWith("Done")) emit recievedSDDone(); + else if(data.startsWith("start")) emit recievedStart(); + else if(data.startsWith("SD pr")) + { + QString tmp; + QString fragment = data.split(' ').at(3); + for(int i = 0; fragment.at(i) != '/'; ++i) + { + tmp += fragment.at(i); + } + emit recievedSDUpdate(tmp.toDouble()); + } + else if(data.startsWith("Not SD ")); + else if(data.contains("Begin file list")) + { + SDFilesList.clear(); + readingFiles = true; //start reading files from SD + } + else if(data.contains("REPETIER")) emit recievedFirmware(Repetier); + else if(data.contains("MARLIN")) emit recievedFirmware(Marlin); + + } +} + + +void Parser::setEEPROMReadingMode() +{ + readingEEPROM = true; +} diff --git a/parser.h b/parser.h new file mode 100644 index 0000000..2cb5670 --- /dev/null +++ b/parser.h @@ -0,0 +1,47 @@ +#ifndef PARSETHREAD_H +#define PARSETHREAD_H + +#include +#include + +#include "repraptor.h" + +using namespace RepRaptor; + +class Parser : public QObject +{ + Q_OBJECT + +public: + explicit Parser(QObject *parent = 0); + ~Parser(); + +protected: + QByteArray data; + QStringList SDFilesList; + int firmware; + bool readingFiles; + bool readingEEPROM; + bool EEPROMReadingStarted; + QRegExp temperatureRegxp; + +signals: + void recievedTemperature(TemperatureReadings); + void recievedSDUpdate(double); + void recievedEEPROMLine(QString); + void recievingEEPROMDone(); + void recievedSDFilesList(QStringList); + void recievedOkWait(); + void recievedOkNum(int); + void recievedStart(); + void recievedResend(int); + void recievedError(); + void recievedFirmware(int); + void recievedSDDone(); + +public slots: + void parse(QByteArray data); + void setEEPROMReadingMode(); +}; + +#endif // PARSETHREAD_H