Compare commits

..

No commits in common. "master" and "v0.3.5" have entirely different histories.

28 changed files with 685 additions and 1449 deletions

9
.gitignore vendored
View File

@ -1,8 +1 @@
RepRaptor ./RepRaptor
Makefile
*.user
*.o
ui_*.h
moc_*
qrc_*
*~

View File

@ -1,26 +0,0 @@
language: cpp
compiler: gcc
sudo: require
dist: trusty
before_install:
- sudo add-apt-repository ppa:beineri/opt-qt58-trusty -y
- sudo apt-get update -qq
install:
- sudo apt-get -y install qt58base qt58serialport qt58tools
- source /opt/qt58/bin/qt58-env.sh
script:
- qmake PREFIX=/usr
- make -j4
- sudo make INSTALL_ROOT=appdir install ; sudo chown -R $USER appdir ; find appdir/
after_success:
- wget -c "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage"
- chmod a+x linuxdeployqt*.AppImage
- unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH
- ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -bundle-non-qt-libs
- ./linuxdeployqt*.AppImage ./appdir/usr/share/applications/*.desktop -appimage
- find ./appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq
- curl --upload-file ./RepRaptor*.AppImage https://transfer.sh/RepRaptor-git.$(git rev-parse --short HEAD)-x86_64.AppImage

View File

@ -1,5 +1,5 @@
![RepRaptor logo](http://reprap.org/mediawiki/images/b/b0/RepRaptor_logo2.png) ![RepRaptor logo](http://reprap.org/mediawiki/images/b/b0/RepRaptor_logo2.png)
# RepRaptor [![Build Status](https://travis-ci.org/NeoTheFox/RepRaptor.svg?branch=master)](https://travis-ci.org/NeoTheFox/RepRaptor) # RepRaptor
A Qt RepRap gcode sender/host controller aimed to be fast and minimalistic. A Qt RepRap gcode sender/host controller aimed to be fast and minimalistic.
Right now the project is in early stage. This means some features are still absent, but it is already usable. Right now the project is in early stage. This means some features are still absent, but it is already usable.
@ -18,7 +18,7 @@ sudo apt-get install repraptor
## Building on Ubuntu 14.04 ## Building on Ubuntu 14.04
``` ```
sudo apt-get install qt5-default libqt5serialport libqt5serialport5-dev git build-essential libudev-dev sudo apt-get install libqt5serialport5-dev git build-essential
git clone https://github.com/NeoTheFox/RepRaptor && cd RepRaptor git clone https://github.com/NeoTheFox/RepRaptor && cd RepRaptor
@ -26,15 +26,10 @@ qmake RepRaptor.pro
make make
``` ```
And if you want to install system-wide
```
sudo make install
```
## Links ## Links
- [Binary release downloads (Windows, Linux)](https://github.com/NeoTheFox/RepRaptor/releases) - [Binary release downloads](https://github.com/NeoTheFox/RepRaptor/releases)
- [RepRap wiki](http://reprap.org/wiki/RepRaptor) - [RepRap wiki](http://reprap.org/wiki/RepRaptor)
- [AUR](https://aur.archlinux.org/packages/repraptor-git/) - [Windows dev builds](http://reprap.org/wiki/File:RepRaptor-000-windows.zip)
[![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.3.0/dist/gratipay.svg)](https://gratipay.com/NeoTheFox/) [![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.3.0/dist/gratipay.svg)](https://gratipay.com/NeoTheFox/)

View File

@ -1,8 +1,9 @@
[Desktop Entry] [Desktop Entry]
Name=RepRaptor Name=RepRaptor
Comment=A Qt RepRap gcode sender/host controller aimed to be fast and minimalistic. Comment=A Qt RepRap gcode sender/host controller aimed to be fast and minimalistic.
Exec=RepRaptor Exec=/usr/bin/RepRaptor
Icon=repraptor Icon=/usr/share/icons/repraptor.png
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Utility;Application; Categories=Utility;Application;

View File

@ -5,7 +5,7 @@
# #
#------------------------------------------------- #-------------------------------------------------
QT += core gui serialport QT += core gui serialport concurrent
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@ -44,8 +44,7 @@ SOURCES += main.cpp\
erroricon.cpp \ erroricon.cpp \
sdwindow.cpp \ sdwindow.cpp \
eepromwindow.cpp \ eepromwindow.cpp \
parser.cpp \ parser.cpp
sender.cpp
HEADERS += mainwindow.h \ HEADERS += mainwindow.h \
settingswindow.h \ settingswindow.h \
@ -55,8 +54,7 @@ HEADERS += mainwindow.h \
sdwindow.h \ sdwindow.h \
repraptor.h \ repraptor.h \
eepromwindow.h \ eepromwindow.h \
parser.h \ parser.h
sender.h
FORMS += mainwindow.ui \ FORMS += mainwindow.ui \
settingswindow.ui \ settingswindow.ui \
@ -71,5 +69,4 @@ RESOURCES += \
DISTFILES += \ DISTFILES += \
LICENCE \ LICENCE \
README.md \ README.md \
RepRaptor.desktop \ RepRaptor.desktop
.travis.yml

View File

@ -6,11 +6,6 @@ AboutWindow::AboutWindow(QWidget *parent) :
ui(new Ui::AboutWindow) ui(new Ui::AboutWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
QString info;
info += "RepRaptor v" + qApp->applicationVersion() + ", ";
info += "built with Qt " + QString(QT_VERSION_STR) + " on ";
info += QString(__DATE__) + ", " + QString(__TIME__);
ui->versionLabel->setText(info);
} }
AboutWindow::~AboutWindow() AboutWindow::~AboutWindow()

View File

@ -3,8 +3,6 @@
#include <QDialog> #include <QDialog>
#include "repraptor.h"
namespace Ui { namespace Ui {
class AboutWindow; class AboutWindow;
} }

View File

@ -6,16 +6,10 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>359</width> <width>424</width>
<height>363</height> <height>308</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>About RepRaptor</string> <string>About RepRaptor</string>
</property> </property>
@ -24,7 +18,7 @@
<normaloff>:/icons/about.png</normaloff>:/icons/about.png</iconset> <normaloff>:/icons/about.png</normaloff>:/icons/about.png</iconset>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="3" column="0"> <item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -34,7 +28,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="0" column="0">
<widget class="QTextBrowser" name="textBrowser"> <widget class="QTextBrowser" name="textBrowser">
<property name="acceptDrops"> <property name="acceptDrops">
<bool>false</bool> <bool>false</bool>
@ -45,8 +39,8 @@
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;img src=&quot;:/icons/logo.png&quot; /&gt;&lt;/p&gt; &lt;p align=&quot;center&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;img src=&quot;:/icons/logo.png&quot; /&gt;&lt;/p&gt;
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt; RepRaptor&lt;/span&gt; is free and open source software for controlling RepRap and similar machines. This software is distributed by terms of &lt;a href=&quot;https://www.gnu.org/licenses/gpl-2.0.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GPL v2 licence.&lt;/span&gt;&lt;/a&gt; Some graphical images (Fugue Icons) are distributed by terms of &lt;a href=&quot;https://creativecommons.org/licenses/by/3.0/deed.ru&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Creative Commons 3 licence&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt; &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt; RepRaptor&lt;/span&gt; is a free and open source software for controlling RepRap and similar mashines. This software is distributed by terms of &lt;a href=&quot;https://www.gnu.org/licenses/gpl-2.0.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GPL v2 licence.&lt;/span&gt;&lt;/a&gt; Some graphical images (Fugue Icons) are distributed by terms of &lt;a href=&quot;https://creativecommons.org/licenses/by/3.0/deed.ru&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Creative Commons 3 licence&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; RepRaptor's main goal is to be as simple as possible and fast, yet functional. This software is being developed as a primary host software for &lt;span style=&quot; font-weight:600;&quot;&gt;MGTU MIREA&lt;/span&gt; university's 3D printing laboratory by&lt;/p&gt; &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt; RepRaptor's main goal is to be as simple as possible and fast, yet functional. This software is being developed as a primary host software for &lt;span style=&quot; font-weight:600;&quot;&gt;MGTU MIREA&lt;/span&gt; university's 3D printing labratory by&lt;/p&gt;
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;mailto:repraptor-dev@repraptor.33mail.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Nickolay (aka &amp;quot;NeoTheFox&amp;quot;) Mardanov.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt; &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;mailto:repraptor-dev@repraptor.33mail.com&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Nickolay (aka &amp;quot;NeoTheFox&amp;quot;) Mardanov.&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;https://github.com/NeoTheFox/RepRaptor&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;https://github.com/NeoTheFox/RepRaptor&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;GitHub&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
@ -62,13 +56,6 @@ p, li { white-space: pre-wrap; }
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QLabel" name="versionLabel">
<property name="text">
<string>Build info</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources> <resources>

View File

@ -64,7 +64,7 @@ EEPROMWindow::EEPROMWindow(QStringList eepromLines, QWidget *parent) :
break; break;
} }
connect(edit, &QLineEdit::textChanged, this, &EEPROMWindow::lineChanged); connect(edit, SIGNAL(textChanged(QString)), this, SLOT(lineChanged(QString)));
line->addWidget(label); line->addWidget(label);
line->addWidget(edit); line->addWidget(edit);

View File

@ -4,18 +4,16 @@ ErrorIcon::ErrorIcon(QWidget *parent) : QWidget(parent)
{ {
framenum = 0; framenum = 0;
frame = ":icons/error_a.png"; frame = ":icons/error_a.png";
animation = new QTimer(this); animation.setInterval(300);
animation->setInterval(300); animation.start();
animation->start();
connect(animation, &QTimer::timeout, this, &ErrorIcon::changeFrame); connect(&animation, SIGNAL(timeout()), this, SLOT(changeFrame()));
} }
void ErrorIcon::paintEvent(QPaintEvent *) void ErrorIcon::paintEvent(QPaintEvent *pe)
{ {
QPainter painter(this); QPainter painter(this);
QPixmap pframe(frame); painter.drawPixmap(0,0,128,87,QPixmap(frame));
painter.drawPixmap(0,0,pframe.width(),pframe.height(),pframe);
} }
void ErrorIcon::changeFrame() void ErrorIcon::changeFrame()
@ -35,6 +33,6 @@ void ErrorIcon::changeFrame()
ErrorIcon::~ErrorIcon() ErrorIcon::~ErrorIcon()
{ {
animation->stop();
} }

View File

@ -11,12 +11,12 @@ class ErrorIcon : public QWidget
public: public:
explicit ErrorIcon(QWidget *parent = 0); explicit ErrorIcon(QWidget *parent = 0);
~ErrorIcon(); ~ErrorIcon();
QTimer *animation; QTimer animation;
QString frame; QString frame;
int framenum; int framenum;
protected: protected:
virtual void paintEvent(QPaintEvent *); virtual void paintEvent(QPaintEvent *pe);
signals: signals:

View File

@ -1,29 +1,11 @@
#include "errorwindow.h" #include "errorwindow.h"
#include "ui_errorwindow.h" #include "ui_errorwindow.h"
using namespace RepRaptor; ErrorWindow::ErrorWindow(QWidget *parent, QString errorText) :
ErrorWindow::ErrorWindow(QWidget *parent, QString errorText, int errType):
QDialog(parent), QDialog(parent),
ui(new Ui::ErrorWindow) ui(new Ui::ErrorWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
switch(errType)
{
case SerialPortError:
ui->label->setText(tr("Serial port error:"));
break;
case OpenFileError:
ui->label->setText(tr("File open error:"));
break;
case HardwareFailure:
ui->label->setText(tr("Hardware failure:"));
break;
default:
ui->label->setText(tr("Unknown error type:"));
break;
}
ui->errorlabel->setText(errorText); ui->errorlabel->setText(errorText);
} }

View File

@ -4,7 +4,6 @@
#include <QDialog> #include <QDialog>
#include "erroricon.h" #include "erroricon.h"
#include "repraptor.h"
namespace Ui { namespace Ui {
class ErrorWindow; class ErrorWindow;
@ -15,7 +14,7 @@ class ErrorWindow : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit ErrorWindow(QWidget *parent = 0, QString errorText = "Unknown error", int errType = 0); explicit ErrorWindow(QWidget *parent = 0, QString errorText = "Unknown error");
~ErrorWindow(); ~ErrorWindow();
private: private:

View File

@ -1,16 +1,15 @@
#include "mainwindow.h" #include "mainwindow.h"
#include "repraptor.h"
#include <QApplication> #include <QApplication>
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
//Set some props in order to fetch and save QSettings
QCoreApplication::setOrganizationName("NeoTheFox"); QCoreApplication::setOrganizationName("NeoTheFox");
QCoreApplication::setOrganizationDomain("https://github.com/NeoTheFox"); QCoreApplication::setOrganizationDomain("https://github.com/NeoTheFox");
QCoreApplication::setApplicationName("RepRaptor"); QCoreApplication::setApplicationName("RepRaptor");
QCoreApplication::setApplicationVersion(REPRAPTOR_VERSION);
QThread::currentThread()->setPriority(QThread::HighestPriority);
MainWindow w; MainWindow w;
w.show(); w.show();

File diff suppressed because it is too large Load Diff

View File

@ -3,16 +3,16 @@
#include <QMainWindow> #include <QMainWindow>
#include <QFileDialog> #include <QFileDialog>
#include <QSystemTrayIcon>
#include <QtSerialPort/QtSerialPort> #include <QtSerialPort/QtSerialPort>
#include <QFile> #include <QFile>
#include <QThread> #include <QFuture>
#include <QVector> #include <QVector>
#include <QTextStream> #include <QTextStream>
#include <QtConcurrent/QtConcurrent>
#include <QSettings> #include <QSettings>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QMessageBox>
#include <QRegExp> #include <QRegExp>
#include <QMap>
#include "settingswindow.h" #include "settingswindow.h"
#include "aboutwindow.h" #include "aboutwindow.h"
@ -21,7 +21,6 @@
#include "repraptor.h" #include "repraptor.h"
#include "eepromwindow.h" #include "eepromwindow.h"
#include "parser.h" #include "parser.h"
#include "sender.h"
using namespace RepRaptor; using namespace RepRaptor;
@ -37,52 +36,45 @@ public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
~MainWindow(); ~MainWindow();
Parser *parserWorker; Parser *parser;
Sender *senderWorker;
QThread *parserThread; QThread *parserThread;
QThread *senderThread;
protected: protected:
QMap <QString, QString> macros;
QFile gfile; QFile gfile;
QVector<QString> gcode; QVector<QString> gcode;
QQueue <QString> userCommands; QQueue <QString> userCommands;
QTimer *progressSDTimer; QTimer sendTimer;
QTimer *statusTimer; QTimer progressSDTimer;
QSystemTrayIcon *trayIcon; QTimer statusTimer;
QMenu *recentMenu; QElapsedTimer sinceLastTemp;
QMenu *trayIconMenu; QElapsedTimer sinceLastSDStatus;
QElapsedTimer *sinceLastTemp;
QElapsedTimer *sinceLastSDStatus;
QSettings settings; QSettings settings;
QStringList recentFiles; QStringList recentFiles;
QStringList EEPROMSettings; QStringList EEPROMSettings;
QStringList userHistory; QStringList userHistory;
QSerialPortInfo printerinfo; QMenu *recentMenu;
QTextCursor terminalCursor;
void closeEvent(QCloseEvent *event);
bool eventFilter(QObject *target, QEvent *event); bool eventFilter(QObject *target, QEvent *event);
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
QString lastDir; QSerialPort printer;
bool opened; QSerialPortInfo printerinfo;
bool firstrun; bool firstrun;
bool autolock; bool autolock;
bool printing;
bool sending; bool sending;
bool paused; bool paused;
bool checkingTemperature; bool checkingTemperature;
bool readingFiles;
bool sdprinting; bool sdprinting;
bool echo; bool echo;
bool sendingChecksum;
bool chekingSDStatus; bool chekingSDStatus;
bool trayIconEnabled;
bool supressWait;
int firmware; int firmware;
int feedrate; long int currentLine;
int extruderFeedrate; unsigned long int lastRecieved;
int readyRecieve;
int userHistoryPos; int userHistoryPos;
unsigned long int sdBytes; unsigned long int sdBytes;
@ -90,11 +82,14 @@ private slots:
void open(); void open();
void serialconnect(); void serialconnect();
void serialupdate(); void serialupdate();
void updatesettings(); bool sendLine(QString line);
void readSerial(QByteArray data); void readSerial();
void printMsg(QString text); void printMsg(QString text);
void printMsg(const char* text);
void sendNext();
void checkStatus(); void checkStatus();
void updateRecent(); void updateRecent();
void injectCommand(QString command);
void initSDprinting(QStringList sdFiles); void initSDprinting(QStringList sdFiles);
void selectSDfile(QString file); void selectSDfile(QString file);
void checkSDStatus(); void checkSDStatus();
@ -103,15 +98,14 @@ private slots:
void openEEPROMeditor(); void openEEPROMeditor();
void sendEEPROMsettings(QStringList changes); void sendEEPROMsettings(QStringList changes);
void updateTemperature(TemperatureReadings r); void updateTemperature(TemperatureReadings r);
void EEPROMSettingReceived(QString esetting); void EEPROMSettingRecieved(QString esetting);
void receivedError(); void recievedOkNum(int num);
void receivedSDDone(); void recievedWait();
void receivedNotSDPrinting(); void recievedError();
void recievedSDDone();
void recievedResend(int num);
void parseFile(QString filename); void parseFile(QString filename);
void recentClicked(); void recentClicked();
void updateFileProgress(FileProgress);
void baudrateSetFailed(int b);
void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
void xplus(); void xplus();
void yplus(); void yplus();
@ -159,17 +153,9 @@ private slots:
signals: signals:
void sdReady(); void sdReady();
void eepromReady();
void recievedData(QByteArray);
void startedReadingEEPROM(); void startedReadingEEPROM();
void openPort(QSerialPortInfo i);
void closePort();
void startPrinting();
void stopPrinting();
void pause(bool p);
void setBaudrate(int b);
void setFile(QVector <QString> f);
void injectCommand(QString command);
void flushInjectionBuffer();
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>791</width> <width>761</width>
<height>514</height> <height>456</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -43,6 +43,13 @@
<string>Serial</string> <string>Serial</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="portsBtn">
<property name="text">
<string>Ports</string>
</property>
</widget>
</item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="serialBox"> <widget class="QComboBox" name="serialBox">
<property name="maximumSize"> <property name="maximumSize">
@ -51,23 +58,6 @@
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
<property name="editable">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="baudbox">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="portsBtn">
<property name="text">
<string>Ports</string>
</property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
@ -77,6 +67,9 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QComboBox" name="baudbox"/>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -150,15 +143,6 @@
</item> </item>
<item row="1" column="4"> <item row="1" column="4">
<widget class="QPushButton" name="ezerobtn"> <widget class="QPushButton" name="ezerobtn">
<property name="toolTip">
<string>this is tool tip e0</string>
</property>
<property name="statusTip">
<string>this is status e0</string>
</property>
<property name="whatsThis">
<string>this is e0</string>
</property>
<property name="text"> <property name="text">
<string>E0</string> <string>E0</string>
</property> </property>
@ -180,9 +164,6 @@
</item> </item>
<item row="1" column="6"> <item row="1" column="6">
<widget class="QPushButton" name="homeybtn"> <widget class="QPushButton" name="homeybtn">
<property name="whatsThis">
<string/>
</property>
<property name="text"> <property name="text">
<string>H Y</string> <string>H Y</string>
</property> </property>
@ -212,7 +193,7 @@
<item row="3" column="3" colspan="4"> <item row="3" column="3" colspan="4">
<widget class="QPushButton" name="releasebtn"> <widget class="QPushButton" name="releasebtn">
<property name="text"> <property name="text">
<string>Motors off</string> <string>Release</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -225,9 +206,6 @@
</item> </item>
<item row="6" column="2" colspan="2"> <item row="6" column="2" colspan="2">
<widget class="QSpinBox" name="etmpspin"> <widget class="QSpinBox" name="etmpspin">
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="maximum"> <property name="maximum">
<number>500</number> <number>500</number>
</property> </property>
@ -236,22 +214,19 @@
<item row="6" column="6"> <item row="6" column="6">
<widget class="QPushButton" name="etmpoff"> <widget class="QPushButton" name="etmpoff">
<property name="text"> <property name="text">
<string>Off</string> <string>OFF</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="4"> <item row="6" column="4">
<widget class="QPushButton" name="etmpset"> <widget class="QPushButton" name="etmpset">
<property name="text"> <property name="text">
<string>Set</string> <string>SET</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="2" colspan="2"> <item row="7" column="2" colspan="2">
<widget class="QSpinBox" name="btmpspin"> <widget class="QSpinBox" name="btmpspin">
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="maximum"> <property name="maximum">
<number>500</number> <number>500</number>
</property> </property>
@ -260,14 +235,14 @@
<item row="7" column="4"> <item row="7" column="4">
<widget class="QPushButton" name="btmpset"> <widget class="QPushButton" name="btmpset">
<property name="text"> <property name="text">
<string>Set</string> <string>SET</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="6"> <item row="7" column="6">
<widget class="QPushButton" name="btmpoff"> <widget class="QPushButton" name="btmpoff">
<property name="text"> <property name="text">
<string>Off</string> <string>OFF</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -276,12 +251,6 @@
<property name="text"> <property name="text">
<string>100</string> <string>100</string>
</property> </property>
<property name="maxLength">
<number>3</number>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="clearButtonEnabled"> <property name="clearButtonEnabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -306,26 +275,15 @@
<item row="8" column="5" colspan="2"> <item row="8" column="5" colspan="2">
<widget class="QPushButton" name="speedsetbtn"> <widget class="QPushButton" name="speedsetbtn">
<property name="text"> <property name="text">
<string>Set</string> <string>SET</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="2"> <item row="9" column="2">
<widget class="QLineEdit" name="flowedit"> <widget class="QLineEdit" name="flowedit">
<property name="font">
<font>
<pointsize>9</pointsize>
</font>
</property>
<property name="text"> <property name="text">
<string>100</string> <string>100</string>
</property> </property>
<property name="maxLength">
<number>3</number>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="clearButtonEnabled"> <property name="clearButtonEnabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -350,35 +308,35 @@
<item row="9" column="5" colspan="2"> <item row="9" column="5" colspan="2">
<widget class="QPushButton" name="flowbutton"> <widget class="QPushButton" name="flowbutton">
<property name="text"> <property name="text">
<string>Set</string> <string>SET</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="2" colspan="2"> <item row="10" column="2" colspan="2">
<widget class="QPushButton" name="fanonbtn"> <widget class="QPushButton" name="fanonbtn">
<property name="text"> <property name="text">
<string>Fan On</string> <string>FAN ON</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="4" colspan="3"> <item row="10" column="4" colspan="3">
<widget class="QPushButton" name="fanoffbtn"> <widget class="QPushButton" name="fanoffbtn">
<property name="text"> <property name="text">
<string>Fan Off</string> <string>FAN OFF</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="11" column="2" colspan="2"> <item row="11" column="2" colspan="2">
<widget class="QPushButton" name="atxonbtn"> <widget class="QPushButton" name="atxonbtn">
<property name="text"> <property name="text">
<string>ATX On</string> <string>ATX ON</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="11" column="4" colspan="3"> <item row="11" column="4" colspan="3">
<widget class="QPushButton" name="atxoffbtn"> <widget class="QPushButton" name="atxoffbtn">
<property name="text"> <property name="text">
<string>ATX Off</string> <string>ATX OFF</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -418,6 +376,19 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="text">
<string>Step</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3"> <item row="5" column="0" colspan="3">
<widget class="QDoubleSpinBox" name="stepspin"> <widget class="QDoubleSpinBox" name="stepspin">
<property name="locale"> <property name="locale">
@ -444,7 +415,7 @@
<item row="7" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Bed tmp</string> <string>B tmp</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -897,19 +868,6 @@ STOP</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0" colspan="3">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>15</height>
</size>
</property>
<property name="text">
<string>Step Increment</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -931,13 +889,6 @@ STOP</string>
<string>Console</string> <string>Console</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="3" column="0">
<widget class="QPushButton" name="sendbtn">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QTextBrowser" name="terminal"> <widget class="QTextBrowser" name="terminal">
<property name="acceptDrops"> <property name="acceptDrops">
@ -958,6 +909,13 @@ STOP</string>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLineEdit" name="sendtext"/> <widget class="QLineEdit" name="sendtext"/>
</item> </item>
<item row="3" column="0">
<widget class="QPushButton" name="sendbtn">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -1056,7 +1014,7 @@ STOP</string>
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Temperature</string> <string>Status</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0"> <item row="0" column="0">
@ -1092,7 +1050,7 @@ STOP</string>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>15</height> <height>14</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
@ -1129,7 +1087,7 @@ STOP</string>
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>791</width> <width>761</width>
<height>20</height> <height>20</height>
</rect> </rect>
</property> </property>
@ -1220,9 +1178,6 @@ STOP</string>
<property name="text"> <property name="text">
<string>Open...</string> <string>Open...</string>
</property> </property>
<property name="iconText">
<string>Open File</string>
</property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+O</string> <string>Ctrl+O</string>
</property> </property>

View File

@ -3,17 +3,15 @@
Parser::Parser(QObject *parent): Parser::Parser(QObject *parent):
QObject(parent) QObject(parent)
{ {
//Init regexp this->setParent(parent);
temperatureRegxp.setCaseSensitivity(Qt::CaseInsensitive); temperatureRegxp.setCaseSensitivity(Qt::CaseInsensitive);
temperatureRegxp.setPatternSyntax(QRegExp::RegExp); temperatureRegxp.setPatternSyntax(QRegExp::RegExp);
temperatureRegxp.setPattern("\\d+\\.\\d+"); // Find float in string temperatureRegxp.setPattern("\\d+\\.\\d+"); // Find float in string
//Init values
readingFiles = false; readingFiles = false;
readingEEPROM = false; readingEEPROM = false;
EEPROMReadingStarted = false; EEPROMReadingStarted = false;
//Load settings
QSettings settings; QSettings settings;
firmware = settings.value("printer/firmware").toInt(); firmware = settings.value("printer/firmware").toInt();
} }
@ -25,26 +23,26 @@ Parser::~Parser()
void Parser::parse(QByteArray data) void Parser::parse(QByteArray data)
{ {
if(!data.isEmpty()) //Dont need to process empty strings if(!data.isEmpty())
{ {
if(readingFiles) //SD files list reading mode if(readingFiles)
{ {
if(!data.contains("End file list")) SDFilesList.append(data.remove(data.size()-2, 2)); if(!data.contains("End file list")) SDFilesList.append(data);
else else
{ {
readingFiles = false; readingFiles = false;
emit receivedSDFilesList(SDFilesList); emit recievedSDFilesList(SDFilesList);
} }
return; return;
} }
if(readingEEPROM) // EEPROM reading mode if(readingEEPROM)
{ {
if(firmware == Repetier) if(firmware == Repetier)
{ {
if(data.startsWith("EPR")) if(data.startsWith("EPR"))
{ {
emit receivedEEPROMLine(QString(data)); emit recievedEEPROMLine(QString(data));
EEPROMReadingStarted = true; EEPROMReadingStarted = true;
} }
else if(EEPROMReadingStarted) else if(EEPROMReadingStarted)
@ -57,38 +55,48 @@ void Parser::parse(QByteArray data)
return; return;
} }
} }
/* /*
if(data.startsWith("ok")) if(data.startsWith("ok"))
{ {
QStringList tmp = QString(data).split(' '); QStringList tmp = QString(data).split(' ');
if(tmp.size() > 1) if(tmp.size() > 1)
emit receivedOkNum(tmp.at(1).toInt()); emit recievedOkNum(tmp.at(1).toInt());
else emit receivedOkNum(0); else emit recievedOkNum(0);
} }
*/ */
else if(data.contains("T:")) else if(data.startsWith("T:"))
{ {
TemperatureReadings r; TemperatureReadings r;
if(temperatureRegxp.indexIn(QString(data)) != -1) if(temperatureRegxp.indexIn(QString(data)) != -1)
r.e = temperatureRegxp.cap(0).toDouble(); r.e = temperatureRegxp.cap(0).toDouble();
else r.e = 0; else return;
if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1) if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1)
r.b = temperatureRegxp.cap(0).toDouble(); r.b = temperatureRegxp.cap(0).toDouble();
else r.b = 0; else return;
r.raw = QString(data); r.raw = QString(data);
emit receivedTemperature(r); emit recievedTemperature(r);
} }
//else if(data.startsWith("wait")) emit receivedOkWait(); //else if(data.startsWith("wait")) emit recievedOkWait();
else if(data.startsWith("rs") || data.toLower().startsWith("resend")) else if(data.startsWith("rs") || data.startsWith("Resend"))
emit receivedResend(data.split(':').at(1).toInt()); emit recievedResend(data.split(' ').at(0).toInt());
else if(data.startsWith("!!")) emit receivedError(); else if(data.startsWith("!!")) emit recievedError();
else if(data.startsWith("Done")) emit receivedSDDone(); else if(data.startsWith("Done")) emit recievedSDDone();
else if(data.startsWith("start")) emit receivedStart(); else if(data.startsWith("start")) emit recievedStart();
else if(data.startsWith("SD pr")) 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());
*/
SDProgress p; SDProgress p;
QRegExp rxp("\\d+/\\d+"); QRegExp rxp("\\d+/\\d+");
QStringList tmp; QStringList tmp;
@ -102,17 +110,17 @@ void Parser::parse(QByteArray data)
} }
else return; else return;
emit receivedSDUpdate(p); emit recievedSDUpdate(p);
} }
else if(data.startsWith("Not SD ")) emit receivedNotSDPrinting(); else if(data.startsWith("Not SD "));
else if(data.contains("Begin file list")) else if(data.contains("Begin file list"))
{ {
SDFilesList.clear(); SDFilesList.clear();
readingFiles = true; //start reading files from SD readingFiles = true; //start reading files from SD
} }
//else if(data.contains("REPETIER")) emit receivedFirmware(Repetier); //else if(data.contains("REPETIER")) emit recievedFirmware(Repetier);
//else if(data.contains("MARLIN")) emit receivedFirmware(Marlin); //else if(data.contains("MARLIN")) emit recievedFirmware(Marlin);
} }
} }

View File

@ -19,26 +19,25 @@ public:
protected: protected:
QByteArray data; QByteArray data;
QStringList SDFilesList; QStringList SDFilesList;
QRegExp temperatureRegxp;
int firmware; int firmware;
bool readingFiles; bool readingFiles;
bool readingEEPROM; bool readingEEPROM;
bool EEPROMReadingStarted; bool EEPROMReadingStarted;
QRegExp temperatureRegxp;
signals: signals:
void receivedTemperature(TemperatureReadings); void recievedTemperature(TemperatureReadings);
void receivedSDUpdate(SDProgress); void recievedSDUpdate(SDProgress);
void receivedNotSDPrinting(); void recievedEEPROMLine(QString);
void receivedEEPROMLine(QString);
void recievingEEPROMDone(); void recievingEEPROMDone();
void receivedSDFilesList(QStringList); void recievedSDFilesList(QStringList);
void receivedOkWait(); void recievedOkWait();
void receivedOkNum(int); void recievedOkNum(int);
void receivedStart(); void recievedStart();
void receivedResend(int); void recievedResend(int);
void receivedError(); void recievedError();
void receivedFirmware(int); void recievedFirmware(int);
void receivedSDDone(); void recievedSDDone();
public slots: public slots:
void parse(QByteArray data); void parse(QByteArray data);

View File

@ -1,13 +1,7 @@
/////////////////////////////////////////////////
//This file contains RepRaptor - specific stuff//
/////////////////////////////////////////////////
#ifndef REPRAPTOR_H #ifndef REPRAPTOR_H
#define REPRAPTOR_H #define REPRAPTOR_H
#ifndef REPRAPTOR_VERSION #include <QString>
#define REPRAPTOR_VERSION "0.3.9"
#endif
namespace RepRaptor namespace RepRaptor
{ {
@ -24,13 +18,6 @@ namespace RepRaptor
OtherFirmware OtherFirmware
}; };
enum ErrorType
{
SerialPortError,
OpenFileError,
HardwareFailure
};
typedef struct typedef struct
{ {
int T, P; int T, P;
@ -41,11 +28,6 @@ namespace RepRaptor
{ {
unsigned long int progress, total; unsigned long int progress, total;
} SDProgress; } SDProgress;
typedef struct
{
unsigned int T, P;
} FileProgress;
} }
#endif // REPRAPTOR_H #endif // REPRAPTOR_H

View File

@ -7,13 +7,7 @@ SDWindow::SDWindow(QStringList files, QWidget *parent) :
{ {
ui->setupUi(this); ui->setupUi(this);
ui->fileslist->setSelectionMode(QListView::SingleSelection); ui->fileslist->addItems(files);
if(!files.isEmpty())
{
ui->fileslist->addItems(files);
ui->fileslist->setCurrentItem(ui->fileslist->itemAt(0,0));
}
} }
SDWindow::~SDWindow() SDWindow::~SDWindow()
@ -23,11 +17,11 @@ SDWindow::~SDWindow()
void SDWindow::on_buttonBox_accepted() void SDWindow::on_buttonBox_accepted()
{ {
if(ui->fileslist->count() > 0) emit fileSelected(ui->fileslist->currentItem()->text()); emit fileSelected(ui->fileslist->currentItem()->text());
} }
void SDWindow::on_fileslist_doubleClicked(const QModelIndex &) void SDWindow::on_fileslist_doubleClicked(const QModelIndex &index)
{ {
if(ui->fileslist->count() > 0) emit fileSelected(ui->fileslist->currentItem()->text()); emit fileSelected(ui->fileslist->currentItem()->text());
this->close(); this->close();
} }

View File

@ -21,7 +21,7 @@ signals:
private slots: private slots:
void on_buttonBox_accepted(); void on_buttonBox_accepted();
void on_fileslist_doubleClicked(const QModelIndex &); void on_fileslist_doubleClicked(const QModelIndex &index);
private: private:
Ui::SDWindow *ui; Ui::SDWindow *ui;

View File

@ -6,16 +6,10 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>274</width> <width>249</width>
<height>302</height> <height>246</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Print from SD</string> <string>Print from SD</string>
</property> </property>
@ -27,7 +21,7 @@
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Select file:</string> <string>Print file:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -46,14 +40,8 @@
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QListWidget" name="fileslist"> <widget class="QListWidget" name="fileslist">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="autoScroll"> <property name="autoScroll">
<bool>true</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -1,224 +0,0 @@
#include "sender.h"
Sender::Sender(QObject *parent) : QObject(parent)
{
//Initial values
currentLine=0;
totalLineNum=0;
baudrate=115200;
resendNum = 0;
resending = false;
sendingChecksum=false;
paused=false;
sending=false;
readyReceive = false;
printer = new QSerialPort(this);
sendTimer = new QTimer(this);
//Fetch settings
QSettings settings(this);
sendTimer->setInterval(settings.value("core/senderinterval", 2).toInt());
sendingChecksum = settings.value("core/checksums", 0).toBool();
dtr = settings.value("core/dtr", 1).toBool();
flowcontrol = settings.value("core/flowcontrol", 0).toInt();
sendTimer->start();
connect(printer, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(receivedError(QSerialPort::SerialPortError)));
connect(printer, &QSerialPort::readyRead, this, &Sender::receivedData);
connect(sendTimer, &QTimer::timeout, this, &Sender::sendNext);
}
Sender::~Sender()
{
closePort();
sendTimer->stop();
}
//Mainloop of sending
void Sender::sendNext()
{
if(printer->isWritable() && readyReceive)
{
//Checksums
if(sendingChecksum && resending)
{
if(resendNum < sentCommands.size())
{
sendLine(sentCommands.at(resendNum));
resendNum++;
}
else if(resendNum == sentCommands.size())
{
resending = false;
resendNum = 0;
}
else if(resendNum > sentCommands.size())
{
sendLine("M110 N0");
totalLineNum = 0;
resendNum = 0;
sentCommands.clear();
}
return;
}
if(!userCommands.isEmpty()) //Inject user command
{
sendLine(userCommands.dequeue());
readyReceive = false;
return;
}
else if(sending && !paused) //Send line of gcode
{
FileProgress p;
if(currentLine >= gcode.size()) //check if we are at the end of array
{
sending = false;
currentLine = 0;
if(sendingChecksum) sendLine("M110 N0");
p.P = gcode.size();
p.T = gcode.size();
emit reportProgress(p);
return;
}
sendLine(gcode.at(currentLine));
currentLine++;
readyReceive=false;
p.P = currentLine;
p.T = gcode.size();
emit reportProgress(p);
}
}
}
bool Sender::sendLine(QString line)
{
sentCommands.clear();
if(printer->isOpen())
{
if(sendingChecksum)
{
if(line.contains("M110")) totalLineNum = 0;
sentCommands.append(line);
//Checksum algorithm from RepRap wiki
line = "N"+QString::number(totalLineNum)+line+"*";
int cs = 0;
for(int i = 0; line.at(i) != '*'; i++) cs = cs ^ line.at(i).toLatin1();
cs &= 0xff;
line += QString::number(cs);
totalLineNum++;
}
if(printer->write(line.toUtf8()+'\n')) return true;
else return false;
}
else return false;
}
void Sender::openPort(QSerialPortInfo i)
{
printer->setPort(i);
if(!printer->isOpen() && printer->open(QIODevice::ReadWrite))
{
//Moved here to be compatible with Qt 5.2.1
printer->setDataTerminalReady(dtr);
if(!printer->setBaudRate(baudrate))
emit baudrateSetFailed(baudrate);
printer->setFlowControl(static_cast<QSerialPort::FlowControl>(flowcontrol));
}
readyReceive = true;
}
void Sender::closePort()
{
if(printer->isOpen()) printer->close();
}
void Sender::startPrinting()
{
currentLine = 0;
paused = false;
sending = true;
}
void Sender::stopPrinting()
{
currentLine = 0;
paused = false;
sending = false;
}
void Sender::pause(bool p)
{
paused = p;
}
void Sender::setBaudrate(int b)
{
baudrate = b;
}
void Sender::setFile(QVector <QString> f)
{
gcode = f;
}
void Sender::injectCommand(QString command)
{
if(!userCommands.contains(command)) userCommands.enqueue(command);
}
void Sender::receivedOkWait()
{
readyReceive = true;
}
void Sender::receivedOkNum(int)
{
readyReceive = true;
}
void Sender::receivedStart()
{
readyReceive = true;
}
void Sender::flushInjectionBuffer()
{
userCommands.clear();
}
void Sender::receivedResend(int r)
{
if(sendingChecksum)
{
resending = true;
resendNum = r;
}
else currentLine--;
}
void Sender::receivedData()
{
if(printer->canReadLine())
{
QByteArray data = printer->readLine();
if(data == "") return;
emit dataReceived(data);
//Yeah, yeah, I know. This class is called "Sender", but checking this here is faster.
if(data.startsWith("ok") || data.startsWith("wait")) readyReceive=true;
}
}
void Sender::receivedError(QSerialPort::SerialPortError error)
{
if(error > 0)
{
closePort();
emit errorReceived(error);
}
}

View File

@ -1,71 +0,0 @@
#ifndef SENDER_H
#define SENDER_H
#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QQueue>
#include <QTimer>
#include <QSettings>
#include <QVector>
#include "repraptor.h"
using namespace RepRaptor;
class Sender : public QObject
{
Q_OBJECT
public:
explicit Sender(QObject *parent = 0);
~Sender();
protected:
QSerialPort *printer;
QTimer *sendTimer;
long int currentLine;
long int totalLineNum;
long int resendNum;
long int baudrate;
long int flowcontrol;
bool paused;
bool sending;
bool dtr;
bool readyReceive;
bool sendingChecksum;
bool resending;
QQueue <QString> userCommands;
QStringList sentCommands;
QVector <QString> gcode;
bool sendLine(QString s);
signals:
void errorReceived(QSerialPort::SerialPortError error);
void dataReceived(QByteArray data);
void reportProgress(FileProgress p);
void baudrateSetFailed(int b);
public slots:
void openPort(QSerialPortInfo i);
void closePort();
void startPrinting();
void stopPrinting();
void pause(bool p);
void setBaudrate(int b);
void setFile(QVector <QString> f);
void injectCommand(QString);
void flushInjectionBuffer();
void receivedOkWait();
void receivedOkNum(int);
void receivedStart();
void receivedResend(int r);
void sendNext();
void receivedData();
void receivedError(QSerialPort::SerialPortError error);
};
#endif // SENDER_H

View File

@ -6,27 +6,17 @@ SettingsWindow::SettingsWindow(QWidget *parent) :
ui(new Ui::SettingsWindow) ui(new Ui::SettingsWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->flowcontrolbox->addItem(tr("No control"));
ui->flowcontrolbox->addItem(tr("Hardware control"));
ui->flowcontrolbox->addItem(tr("Software control"));
//bool firstrun = !settings.value("core/firstrun").toBool(); //firstrun is inverted! //bool firstrun = !settings.value("core/firstrun").toBool(); //firstrun is inverted!
settings.setParent(this); ui->senderbox->setValue(settings.value("core/senderinterval", 2).toFloat());
ui->flowcontrolbox->setCurrentIndex(settings.value("core/flowcontrol", 0).toInt()); ui->echobox->setChecked(settings.value("core/echo", 0).toBool());
ui->senderbox->setValue(settings.value("core/senderinterval", 2).toInt());
ui->traybox->setChecked(settings.value("core/trayiconenabled", 1).toBool());
ui->statusbox->setValue(settings.value("core/statusinterval", 2000).toInt()); ui->statusbox->setValue(settings.value("core/statusinterval", 2000).toInt());
ui->bedxbox->setValue(settings.value("printer/bedx", 200).toInt()); ui->bedxbox->setValue(settings.value("printer/bedx", 200).toInt());
ui->bedybox->setValue(settings.value("printer/bedy", 200).toInt()); ui->bedybox->setValue(settings.value("printer/bedy", 200).toInt());
ui->feedrateBox->setValue(settings.value("printer/feedrate", 1500).toInt());
ui->extruderFeedrateBox->setValue(settings.value("printer/extruderfeedrate", 200).toInt());
ui->lockbox->setChecked(settings.value("core/lockcontrols", 0).toBool()); ui->lockbox->setChecked(settings.value("core/lockcontrols", 0).toBool());
ui->checksumbox->setChecked(settings.value("core/checksums", 0).toBool()); ui->checksumbox->setChecked(settings.value("core/checksums", 0).toBool());
ui->sdbox->setChecked(settings.value("core/checksdstatus", 1).toBool()); ui->sdbox->setChecked(settings.value("core/checksdstatus", 1).toBool());
ui->dtrbox->setChecked(settings.value("core/dtr", 1).toBool());
ui->supresswaitbox->setChecked(settings.value("user/supresswait").toBool());
ui->bufferbox->setValue(settings.value("core/logbuffersize", 1000).toInt());
ui->firmwarecombo->addItem("Marlin"); //0 ui->firmwarecombo->addItem("Marlin"); //0
ui->firmwarecombo->addItem("Repetier"); //1 ui->firmwarecombo->addItem("Repetier"); //1
@ -49,21 +39,13 @@ SettingsWindow::~SettingsWindow()
void SettingsWindow::on_buttonBox_accepted() void SettingsWindow::on_buttonBox_accepted()
{ {
settings.setValue("core/flowcontrol", ui->flowcontrolbox->currentIndex());
settings.setValue("core/trayiconenabled", ui->traybox->isChecked());
settings.setValue("core/senderinterval", ui->senderbox->value()); settings.setValue("core/senderinterval", ui->senderbox->value());
settings.setValue("core/statusinterval", ui->statusbox->value()); settings.setValue("core/statusinterval", ui->statusbox->value());
settings.setValue("printer/bedy", ui->bedybox->value()); settings.setValue("printer/bedy", ui->bedybox->value());
settings.setValue("printer/bedx", ui->bedxbox->value()); settings.setValue("printer/bedx", ui->bedxbox->value());
settings.setValue("printer/feedrate", ui->feedrateBox->value()); settings.setValue("core/echo", ui->echobox->isChecked());
settings.setValue("printer/extruderfeedrate", ui->extruderFeedrateBox->value());
settings.setValue("core/lockcontrols", ui->lockbox->isChecked()); settings.setValue("core/lockcontrols", ui->lockbox->isChecked());
settings.setValue("core/checksums", ui->checksumbox->isChecked()); settings.setValue("core/checksums", ui->checksumbox->isChecked());
settings.setValue("core/checksdstatus", ui->sdbox->isChecked()); settings.setValue("core/checksdstatus", ui->sdbox->isChecked());
settings.setValue("core/dtr", ui->dtrbox->isChecked());
settings.setValue("printer/firmware", ui->firmwarecombo->currentIndex()); settings.setValue("printer/firmware", ui->firmwarecombo->currentIndex());
settings.setValue("user/supresswait", ui->supresswaitbox->isChecked());
settings.setValue("core/logbuffersize", ui->bufferbox->value());
emit updatesettings();
} }

View File

@ -27,10 +27,6 @@ private slots:
private: private:
Ui::SettingsWindow *ui; Ui::SettingsWindow *ui;
signals:
void updatesettings();
}; };
#endif // SETTINGSWINDOW_H #endif // SETTINGSWINDOW_H

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>603</width> <width>253</width>
<height>491</height> <height>386</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -18,322 +18,66 @@
<normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset> <normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0"> <item row="1" column="0">
<widget class="QTabWidget" name="tabWidget"> <widget class="QGroupBox" name="groupBox">
<property name="minimumSize"> <property name="sizePolicy">
<size> <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<width>200</width> <horstretch>0</horstretch>
<height>400</height> <verstretch>0</verstretch>
</size> </sizepolicy>
</property> </property>
<property name="currentIndex"> <property name="title">
<number>0</number> <string>Printer</string>
</property> </property>
<widget class="QWidget" name="tab_general"> <layout class="QGridLayout" name="gridLayout_2">
<attribute name="title"> <item row="1" column="1">
<string>General</string> <widget class="QSpinBox" name="bedxbox">
</attribute> <property name="minimum">
<layout class="QFormLayout" name="formLayout"> <number>1</number>
<item row="0" column="0"> </property>
<widget class="QGroupBox" name="internalGroup"> <property name="maximum">
<property name="title"> <number>9999</number>
<string>Internal</string> </property>
</property> </widget>
<layout class="QGridLayout" name="gridLayout"> </item>
<item row="1" column="1"> <item row="1" column="2">
<widget class="QDoubleSpinBox" name="senderbox"> <widget class="QLabel" name="label_6">
<property name="toolTip"> <property name="text">
<string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string> <string>X</string>
</property> </property>
<property name="toolTipDuration"> </widget>
<number>-1</number> </item>
</property> <item row="1" column="3">
<property name="locale"> <widget class="QSpinBox" name="bedybox">
<locale language="English" country="UnitedStates"/> <property name="minimum">
</property> <number>1</number>
<property name="minimum"> </property>
<double>0.000000000000000</double> <property name="maximum">
</property> <number>9999</number>
<property name="maximum"> </property>
<double>999.990000000000009</double> </widget>
</property> </item>
<property name="singleStep"> <item row="1" column="0">
<double>1.000000000000000</double> <widget class="QLabel" name="label_5">
</property> <property name="text">
<property name="value"> <string>Bed size</string>
<double>2.000000000000000</double> </property>
</property> </widget>
</widget> </item>
</item> <item row="0" column="0">
<item row="2" column="1"> <widget class="QLabel" name="label_8">
<widget class="QSpinBox" name="statusbox"> <property name="text">
<property name="toolTip"> <string>Firmware</string>
<string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string> </property>
</property> </widget>
<property name="toolTipDuration"> </item>
<number>-1</number> <item row="0" column="1" colspan="3">
</property> <widget class="QComboBox" name="firmwarecombo"/>
<property name="minimum"> </item>
<number>1500</number> </layout>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Status</string>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="checksumbox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Checksums</string>
</property>
</widget>
</item>
<item row="9" column="0" colspan="3">
<widget class="QCheckBox" name="sdbox">
<property name="text">
<string>Check SD printing status</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_7">
<property name="minimumSize">
<size>
<width>0</width>
<height>28</height>
</size>
</property>
<property name="text">
<string>This settings are applied after restart</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_11">
<property name="text">
<string>Flow control</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="dtrbox">
<property name="text">
<string>DTR</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Sender</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="flowcontrolbox">
<property name="toolTip">
<string/>
</property>
</widget>
</item>
<item row="8" column="0" colspan="3">
<widget class="QCheckBox" name="lockbox">
<property name="text">
<string>Lock controls when printing</string>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="traybox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Show tray icon</string>
</property>
<property name="text">
<string>Tray icon</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="2">
<widget class="QCheckBox" name="supresswaitbox">
<property name="text">
<string>Supress &quot;wait&quot; responce</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Log buffer</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="bufferbox">
<property name="maximum">
<number>100000</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_network">
<attribute name="title">
<string>Network</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_hardware">
<attribute name="title">
<string>Hardware</string>
</attribute>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>249</width>
<height>171</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Printer</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="1">
<widget class="QSpinBox" name="bedxbox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>X</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSpinBox" name="bedybox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Bed size</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Firmware</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QComboBox" name="firmwarecombo"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Feedrate</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="feedrateBox">
<property name="toolTip">
<string>Speed of axis movements (only affect buttons)</string>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Extruder
feedrate</string>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QSpinBox" name="extruderFeedrateBox">
<property name="toolTip">
<string>Extruder speed (only affect buttons)</string>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="2" column="0">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -346,6 +90,140 @@ feedrate</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0">
<widget class="QGroupBox" name="internalGroup">
<property name="title">
<string>Internal</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="0" colspan="3">
<widget class="QCheckBox" name="echobox">
<property name="toolTip">
<string>Show every sent command in console</string>
</property>
<property name="text">
<string>Echo commands</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="senderbox">
<property name="toolTip">
<string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string>
</property>
<property name="toolTipDuration">
<number>-1</number>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>999.990000000000009</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>2.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Status</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="statusbox">
<property name="toolTip">
<string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string>
</property>
<property name="toolTipDuration">
<number>-1</number>
</property>
<property name="minimum">
<number>1500</number>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Sender</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QCheckBox" name="lockbox">
<property name="text">
<string>Lock controls when printing</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_3">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="checksumbox">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Checksums</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="label_7">
<property name="minimumSize">
<size>
<width>0</width>
<height>28</height>
</size>
</property>
<property name="text">
<string>This settings are applied after restart</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="5" column="0" colspan="3">
<widget class="QCheckBox" name="sdbox">
<property name="text">
<string>Check SD printing status</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources> <resources>