From 47aa59860e2e4d1f1527fb02f2581b932942a03a Mon Sep 17 00:00:00 2001 From: NeoTheFox Date: Mon, 2 Mar 2015 15:01:17 +0300 Subject: [PATCH] Error handling --- README.md | 2 +- RepRaptor.pro | 11 ++-- erroricon.cpp | 38 ++++++++++++++ erroricon.h | 27 ++++++++++ errorwindow.cpp | 15 ++++++ errorwindow.h | 24 +++++++++ errorwindow.ui | 130 ++++++++++++++++++++++++++++++++++++++++++++++ graphics.qrc | 2 + icons/error_a.png | Bin 0 -> 44859 bytes icons/error_b.png | Bin 0 -> 44859 bytes mainwindow.cpp | 59 ++++++++++++++++++++- mainwindow.h | 2 + 12 files changed, 305 insertions(+), 5 deletions(-) create mode 100644 erroricon.cpp create mode 100644 erroricon.h create mode 100644 errorwindow.cpp create mode 100644 errorwindow.h create mode 100644 errorwindow.ui create mode 100644 icons/error_a.png create mode 100644 icons/error_b.png diff --git a/README.md b/README.md index 5fcdf07..bcdf61e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # RepRaptor A Qt RepRap gcode sender/host controller aimed to be fast and minimalistic. -Right now the project is in early stage, nigtly builds are available. +Right now the project is in early stage. ## Screenshots ![RepRaptor printing a file](http://reprap.org/mediawiki/images/2/2d/RepRaptor_screenshot0.png) diff --git a/RepRaptor.pro b/RepRaptor.pro index d856118..44ef6c1 100644 --- a/RepRaptor.pro +++ b/RepRaptor.pro @@ -16,15 +16,20 @@ CONFIG += static SOURCES += main.cpp\ mainwindow.cpp \ settingswindow.cpp \ - aboutwindow.cpp + aboutwindow.cpp \ + errorwindow.cpp \ + erroricon.cpp HEADERS += mainwindow.h \ settingswindow.h \ - aboutwindow.h + aboutwindow.h \ + errorwindow.h \ + erroricon.h FORMS += mainwindow.ui \ settingswindow.ui \ - aboutwindow.ui + aboutwindow.ui \ + errorwindow.ui RESOURCES += \ graphics.qrc diff --git a/erroricon.cpp b/erroricon.cpp new file mode 100644 index 0000000..7bd00fc --- /dev/null +++ b/erroricon.cpp @@ -0,0 +1,38 @@ +#include "erroricon.h" + +ErrorIcon::ErrorIcon(QWidget *parent) : QWidget(parent) +{ + framenum = 0; + frame = ":icons/error_a.png"; + animation.setInterval(300); + animation.start(); + + connect(&animation, SIGNAL(timeout()), this, SLOT(changeFrame())); +} + +void ErrorIcon::paintEvent(QPaintEvent *pe) +{ + QPainter painter(this); + painter.drawPixmap(0,0,128,87,QPixmap(frame)); +} + +void ErrorIcon::changeFrame() +{ + if(framenum == 0) + { + frame = ":icons/error_a.png"; + framenum = 1; + } + else if(framenum == 1) + { + frame = ":icons/error_b.png"; + framenum = 0; + } + this->update(); +} + +ErrorIcon::~ErrorIcon() +{ + +} + diff --git a/erroricon.h b/erroricon.h new file mode 100644 index 0000000..c338334 --- /dev/null +++ b/erroricon.h @@ -0,0 +1,27 @@ +#ifndef ERRORICON_H +#define ERRORICON_H + +#include +#include +#include + +class ErrorIcon : public QWidget +{ + Q_OBJECT +public: + explicit ErrorIcon(QWidget *parent = 0); + ~ErrorIcon(); + QTimer animation; + QString frame; + int framenum; + +protected: + virtual void paintEvent(QPaintEvent *pe); + +signals: + +public slots: + void changeFrame(); +}; + +#endif // ERRORICON_H diff --git a/errorwindow.cpp b/errorwindow.cpp new file mode 100644 index 0000000..c6787df --- /dev/null +++ b/errorwindow.cpp @@ -0,0 +1,15 @@ +#include "errorwindow.h" +#include "ui_errorwindow.h" + +ErrorWindow::ErrorWindow(QWidget *parent, QString errorText) : + QDialog(parent), + ui(new Ui::ErrorWindow) +{ + ui->setupUi(this); + ui->errorlabel->setText(errorText); +} + +ErrorWindow::~ErrorWindow() +{ + delete ui; +} diff --git a/errorwindow.h b/errorwindow.h new file mode 100644 index 0000000..20a8558 --- /dev/null +++ b/errorwindow.h @@ -0,0 +1,24 @@ +#ifndef ERRORWINDOW_H +#define ERRORWINDOW_H + +#include + +#include "erroricon.h" + +namespace Ui { +class ErrorWindow; +} + +class ErrorWindow : public QDialog +{ + Q_OBJECT + +public: + explicit ErrorWindow(QWidget *parent = 0, QString errorText = "Unknown error"); + ~ErrorWindow(); + +private: + Ui::ErrorWindow *ui; +}; + +#endif // ERRORWINDOW_H diff --git a/errorwindow.ui b/errorwindow.ui new file mode 100644 index 0000000..e8f9d3c --- /dev/null +++ b/errorwindow.ui @@ -0,0 +1,130 @@ + + + ErrorWindow + + + + 0 + 0 + 350 + 139 + + + + Error + + + + + 90 + 100 + 171 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + true + + + + + + 10 + 10 + 128 + 87 + + + + + 0 + 0 + + + + + 128 + 87 + + + + + + + 180 + 10 + 121 + 31 + + + + Serial port error: + + + Qt::AutoText + + + + + + 180 + 40 + 151 + 41 + + + + NaN + + + + + + ErrorIcon + QWidget +
erroricon.h
+ 1 +
+
+ + + + buttonBox + accepted() + ErrorWindow + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ErrorWindow + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/graphics.qrc b/graphics.qrc index 758ce20..1cfb75b 100644 --- a/graphics.qrc +++ b/graphics.qrc @@ -2,5 +2,7 @@ icons/icon.png icons/logo.png + icons/error_a.png + icons/error_b.png diff --git a/icons/error_a.png b/icons/error_a.png new file mode 100644 index 0000000000000000000000000000000000000000..b9f625204413ff54de15b70ffe9104bb908869b9 GIT binary patch literal 44859 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 literal 0 HcmV?d00001 diff --git a/icons/error_b.png b/icons/error_b.png new file mode 100644 index 0000000000000000000000000000000000000000..964f9b384b8b994ad06c7109cf34641fc8cdcc96 GIT binary patch literal 44859 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 literal 0 HcmV?d00001 diff --git a/mainwindow.cpp b/mainwindow.cpp index e901808..ce62a46 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -39,6 +39,7 @@ MainWindow::MainWindow(QWidget *parent) : serialupdate(); + connect(&printer, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(serialError(QSerialPort::SerialPortError))); connect(&printer, SIGNAL(readyRead()), this, SLOT(readSerial())); connect(&statusTimer, SIGNAL(timeout()), this, SLOT(checkStatus())); connect(&sendTimer, SIGNAL(timeout()), this, SLOT(sendNext())); @@ -199,6 +200,7 @@ void MainWindow::serialconnect() ui->progressBar->setValue(0); ui->controlBox->setDisabled(true); ui->consoleGroup->setDisabled(true); + } } @@ -440,6 +442,7 @@ void MainWindow::sendNext() currentLine = 0; ui->sendBtn->setText("Send"); ui->pauseBtn->setDisabled("true"); + ui->filelines->setText(QString::number(gcode.size()) + QString("/") + QString::number(currentLine) + QString(" Lines")); return; } sendLine(gcode.at(currentLine)); @@ -505,5 +508,59 @@ void MainWindow::injectCommand(QString command) void MainWindow::updateRecent() { - + //TODO +} + +void MainWindow::serialError(QSerialPort::SerialPortError error) +{ + if(error == QSerialPort::NoError) return; + + if(printer.isOpen()) printer.close(); + + if(sending) paused = true; + + ui->connectBtn->setText("Connect"); + ui->sendBtn->setDisabled(true); + ui->pauseBtn->setDisabled(true); + ui->progressBar->setValue(0); + ui->controlBox->setDisabled(true); + ui->consoleGroup->setDisabled(true); + + qDebug() << error; + + QString errorMsg; + switch(error) + { + case QSerialPort::DeviceNotFoundError: + errorMsg = "Device not found"; + break; + + case QSerialPort::PermissionError: + errorMsg = "Insufficient permissions\nAlready opened?"; + break; + + case QSerialPort::OpenError: + errorMsg = "Cant open port\nAlready opened?"; + break; + + case QSerialPort::TimeoutError: + errorMsg = "Serial connection timed out"; + break; + + case QSerialPort::WriteError: + case QSerialPort::ReadError: + errorMsg = "I/O Error"; + break; + + case QSerialPort::ResourceError: + errorMsg = "Disconnected"; + break; + + default: + errorMsg = "Unknown error\nSomething went wrong"; + break; + } + + ErrorWindow errorwindow(this, errorMsg); + errorwindow.exec(); } diff --git a/mainwindow.h b/mainwindow.h index 9b57a8f..a5f6d91 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -14,6 +14,7 @@ #include "settingswindow.h" #include "aboutwindow.h" +#include "errorwindow.h" namespace Ui { @@ -95,6 +96,7 @@ private slots: void on_actionSettings_triggered(); void on_releasebtn_clicked(); void on_actionAbout_triggered(); + void serialError(QSerialPort::SerialPortError error); }; #endif // MAINWINDOW_H