Compare commits

...

122 Commits

Author SHA1 Message Date
cf81418938 Merge pull request #8 from probonopd/patch-1
Build and upload AppImage for Linux
2017-03-27 15:08:22 +04:00
probonopd
9a3af3047f Update RepRaptor.desktop 2017-03-25 14:03:19 +01:00
probonopd
f94938b372 Update .travis.yml 2017-03-25 13:55:45 +01:00
60bb57f374 Switched settingswindow.ui to tabbed mode 2017-03-06 15:10:33 +03:00
98b10de3f4 Bumped version 2016-04-16 13:11:29 +03:00
1589d1a4ae New PPA name to fix build 2016-04-16 12:59:36 +03:00
5c790251c1 Added log buffe settings (should also fix the memory leak) 2016-04-16 12:56:30 +03:00
094d7a04b3 Updated printMsg to prevent possible bugs 2016-04-16 12:41:14 +03:00
1533625411 Added travis icon 2015-12-04 10:22:13 +01:00
747b9ebe62 Cleanup for travis 2015-12-04 10:20:13 +01:00
b5b4af8a2e forgot --yes for travis 2015-12-04 10:17:22 +01:00
549d7a76f5 changed travis qt to 55 2015-12-04 10:15:12 +01:00
de6e25391a More travis scripting 2015-12-04 10:08:04 +01:00
705e6ef5b6 Travis package change 2015-12-04 10:02:32 +01:00
c64598d640 Changed travis qmake 2015-12-04 09:57:47 +01:00
bd76f479e7 Second attempt at travis config 2015-12-04 09:55:36 +01:00
a0fb0d588b Fixed apt name 2015-12-04 09:51:58 +01:00
5ae242b4e4 Added travis config 2015-12-04 09:44:13 +01:00
8469e2a6b6 Remember last folder 2015-05-20 17:02:55 +03:00
10365239a5 Remember Step and EStep 2015-05-15 14:37:57 +03:00
7eabc94adf Added "wait" supression 2015-05-02 14:22:54 +03:00
c90153a750 Code cleanup 2015-05-02 14:06:54 +03:00
f7ff8882f2 Release version updated 2015-03-29 14:03:12 +03:00
169cb07d28 Minor refactoring 2015-03-28 21:39:20 +03:00
ce33d5a804 Added new error type 2015-03-28 21:34:49 +03:00
deceb81c8b Flush user buffer upon printing 2015-03-27 23:29:01 +03:00
2d6d09743e Fixed crash in SD window
Fixed '\r\n' at the end of string and pressing "ok" with no selection
2015-03-26 21:12:38 +03:00
ecc6e5570d Ui tweaks 2015-03-26 18:17:24 +03:00
136c2f1077 Set parent for QSettings 2015-03-26 18:10:44 +03:00
a6b57d0da0 Set parent for QSettings 2015-03-26 18:10:11 +03:00
74ec8c9806 Prevent SD printing if no files available 2015-03-26 17:59:47 +03:00
83a5f0eb1d Handle "Not SD printing" 2015-03-26 17:32:48 +03:00
b986c98f9c Optimized priority 2015-03-26 15:33:32 +03:00
c4ba7c8e4f Moved set priority 2015-03-26 15:22:43 +03:00
ae27a3cc96 Merged 2015-03-26 14:42:08 +03:00
7f57b698a1 Merge branch 'master' of https://github.com/NeoTheFox/RepRaptor 2015-03-26 14:40:06 +03:00
6e52256bd9 Better user history 2015-03-26 14:39:00 +03:00
70963c8f59 No need for QPixmap 2015-03-25 23:00:05 +03:00
3cc2dcabb5 Added check for empty filename 2015-03-25 22:36:49 +03:00
1294d65618 Added tray icon 2015-03-25 16:54:08 +03:00
7e18e2fd2f Added tooltips 2015-03-25 15:32:58 +03:00
933163257d Set dialog title 2015-03-24 16:18:12 +03:00
c7b4ba29de Corrected event 2015-03-24 16:16:01 +03:00
dd59c0c54a Added warning on closeEvent 2015-03-24 16:13:43 +03:00
908f49389a Sender priority tweak 2015-03-24 15:09:43 +03:00
2fdd05cac1 Auto-capitalize manual commands 2015-03-23 16:04:41 +03:00
b0190ded97 Made dirty hack less dirty 2015-03-23 14:28:18 +03:00
ec902e01b6 Update settings on change 2015-03-22 14:42:25 +03:00
2e24c28bbf Got rid of compilation warnings
More refactoring
2015-03-21 18:42:44 +03:00
7e354a56d7 More error messages 2015-03-21 16:36:14 +03:00
9fff9d6743 Typo fix 2015-03-21 16:16:53 +03:00
157f3e5535 Refactoring 2015-03-21 01:16:15 +03:00
5f1c9d68f7 Refactoring
Converted old signals and slots to new style
Cleanup
2015-03-21 01:11:50 +03:00
f38e1bf069 Unsupported by OS error handling 2015-03-21 00:57:03 +03:00
6cd2ac8d2e Editable baudrate
Minor UI fixes
2015-03-21 00:52:28 +03:00
b24017e138 Moved to the next version development 2015-03-20 21:44:34 +03:00
c99f298348 Added version and build info 2015-03-20 01:53:24 +03:00
e28c4d71fc Flush user buffer before requesting SD files list 2015-03-19 21:45:59 +03:00
2f4519634a Static cast int to enum 2015-03-19 19:36:29 +03:00
c94afa3986 Added settings for flow control 2015-03-19 19:31:36 +03:00
a5a74d5581 Removed hardware control 2015-03-19 19:02:54 +03:00
17ba5d7e11 Updated README.md with AUR 2015-03-18 19:10:28 +03:00
1b8ca64fc9 Missed typo 2015-03-18 13:27:49 +03:00
c6aab765b5 Merge branch 'master' of https://github.com/NeoTheFox/RepRaptor
Conflicts:
	sender.cpp
	sender.h
2015-03-18 13:25:35 +03:00
079594f6dc Added DTR switch 2015-03-18 13:03:49 +03:00
61f1fc66c2 Merge pull request #7 from J0eC00l/master
Typo fix + additions to .gitignore
2015-03-18 01:06:02 +03:00
Joe Cool
866aa1bc3d merge 2015-03-17 22:53:31 +01:00
Joe Cool
7bc963e526 typo 2015-03-17 22:51:15 +01:00
82b444f066 Fixed range 2015-03-17 14:52:16 +03:00
7831246599 Added feedrate settings 2015-03-17 14:42:05 +03:00
16b3adf8dc Set readyRecieve to true upon connection 2015-03-16 22:00:09 +03:00
16de411b2d Added warning if baudrate set failed 2015-03-16 21:19:33 +03:00
Joe Cool
376428070c Added generated files to .gitignore,
Fixed typo [recieved -> received]
2015-03-16 00:33:46 +01:00
1162748acd More comments 2015-03-15 19:54:40 +03:00
9fa7e3d2c8 Set temperature by pressing return 2015-03-15 19:40:13 +03:00
71bb8a7fa3 Updated README.md 2015-03-15 17:15:09 +03:00
654c0b6546 Made QSerialPortInfo protected 2015-03-15 16:50:51 +03:00
bdb3660134 Removed unneeded concurrent module 2015-03-15 16:42:50 +03:00
12edb52d0c Updated README.md
More comments
2015-03-14 18:28:57 +03:00
a5a8dc662b Cleanup and comments 2015-03-14 18:19:44 +03:00
53283605e0 Added comments and reorganized 2015-03-14 18:15:31 +03:00
a30e869e61 More cleanup
Set parent for all QTimers
2015-03-14 18:00:34 +03:00
5db118ebf6 Cleaned up old sender 2015-03-14 15:08:14 +03:00
8803269616 Tweaked UI 2015-03-14 03:14:09 +03:00
0942248989 QTimer has a resolution of ms 2015-03-14 03:04:53 +03:00
aa05845e51 Fixed interval setting type 2015-03-14 02:45:37 +03:00
690388624f Checksum optimizations 2015-03-14 02:42:00 +03:00
d62be051dd Optimizations and bugfixes 2015-03-14 02:34:35 +03:00
e57406ee6b Set parent of QTimer for it to work correctly; 2015-03-14 01:55:55 +03:00
3f0d2a135f Monor structure tweaks 2015-03-14 01:11:54 +03:00
fb02f184ed Merge pull request #6 from NeoTheFox/activedev
Activedev merged
2015-03-14 01:06:16 +03:00
228d7abd78 Bugfixes and cleanup 2015-03-14 00:28:20 +03:00
b4ce73c959 Moved sender to other thread 2015-03-13 23:55:12 +03:00
fea7f342c1 Initial sender move 2015-03-13 22:19:00 +03:00
314f853e40 Moved checksum algorithm 2015-03-13 14:49:08 +03:00
d007eb32d9 Merge pull request #5 from quillford/master
Changed Step to Step increment
2015-03-13 13:22:58 +03:00
quillford
0942f54ab7 Centered temperatrue input fields 2015-03-12 16:14:24 -07:00
quillford
0b6b327b0e Disable/Enable Temperature UI with other elements 2015-03-12 15:55:10 -07:00
quillford
d33612959b Centered speed and flow 2015-03-12 15:30:59 -07:00
quillford
81b1a73fbb Changed case of buttons 2015-03-12 15:20:41 -07:00
quillford
20ab52821b Renamed Status to Temperature 2015-03-12 15:14:19 -07:00
quillford
c9f84dc22d Changed Step to Step increment 2015-03-12 15:06:09 -07:00
527ecae540 Merge pull request #4 from quillford/master
Changed the Open button to Open File
2015-03-13 00:23:19 +03:00
quillford
0d1cd46bc9 Changed the Open button to Open File 2015-03-12 14:17:00 -07:00
5f8d344cc4 Merge pull request #3 from quillford/master
Fixed typos in about page
2015-03-13 00:06:12 +03:00
quillford
936e316e48 Fixed typos in about page 2015-03-12 14:03:08 -07:00
5331f73cc0 Renamed Release button to motors off
Added flow control
2015-03-12 21:44:49 +03:00
cb32e983ac Merge pull request #2 from quillford/master
Added .gco file extension support
2015-03-12 21:12:40 +03:00
quillford
003d5a6bab Added .gco file extension support 2015-03-12 11:11:34 -07:00
e17e6d2087 Be more tolerant to no heated bed 2015-03-12 21:02:19 +03:00
6017309bd9 Merge branch 'master' of https://github.com/NeoTheFox/RepRaptor 2015-03-12 21:01:27 +03:00
367cbb1c0d Merge pull request #1 from quillford/master
Fixed updating temp in UI for smoothieware
2015-03-12 21:00:31 +03:00
quillford
de87588d62 Fixed updating temp in UI for smoothieware
Smoothie outputs "ok T:" instead of just "T:"
2015-03-12 10:59:02 -07:00
a8e8bbd333 rolled back 2015-03-12 20:33:29 +03:00
f10324ac81 Fix for marlin - do not expect Ok after every line 2015-03-12 20:18:17 +03:00
da63af5709 Reverted 2015-03-11 21:04:22 +03:00
ba4d605aae Second attempt to fix windows crash 2015-03-11 21:01:52 +03:00
b19ee6d8fb Attempt to fix Win32 bug 2015-03-11 20:46:23 +03:00
da4d7aaf06 Multiplatform separator 2015-03-11 18:35:46 +03:00
5caf1db1fa Added some missing packages to instructions 2015-03-11 03:04:24 +03:00
d95b278a62 Removed link to old dev builds (no longer supported) 2015-03-11 03:02:14 +03:00
3149332c82 Updated README.md 2015-03-11 03:01:26 +03:00
28 changed files with 1449 additions and 685 deletions

9
.gitignore vendored
View File

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

26
.travis.yml Normal file
View File

@ -0,0 +1,26 @@
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
# RepRaptor [![Build Status](https://travis-ci.org/NeoTheFox/RepRaptor.svg?branch=master)](https://travis-ci.org/NeoTheFox/RepRaptor)
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.
@ -18,7 +18,7 @@ sudo apt-get install repraptor
## Building on Ubuntu 14.04
```
sudo apt-get install libqt5serialport5-dev git build-essential
sudo apt-get install qt5-default libqt5serialport libqt5serialport5-dev git build-essential libudev-dev
git clone https://github.com/NeoTheFox/RepRaptor && cd RepRaptor
@ -26,10 +26,15 @@ qmake RepRaptor.pro
make
```
And if you want to install system-wide
```
sudo make install
```
## Links
- [Binary release downloads](https://github.com/NeoTheFox/RepRaptor/releases)
- [Binary release downloads (Windows, Linux)](https://github.com/NeoTheFox/RepRaptor/releases)
- [RepRap wiki](http://reprap.org/wiki/RepRaptor)
- [Windows dev builds](http://reprap.org/wiki/File:RepRaptor-000-windows.zip)
- [AUR](https://aur.archlinux.org/packages/repraptor-git/)
[![Support via Gratipay](https://cdn.rawgit.com/gratipay/gratipay-badge/2.3.0/dist/gratipay.svg)](https://gratipay.com/NeoTheFox/)

View File

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

View File

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

View File

@ -6,6 +6,11 @@ AboutWindow::AboutWindow(QWidget *parent) :
ui(new Ui::AboutWindow)
{
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()

View File

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

View File

@ -6,10 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
<width>424</width>
<height>308</height>
<width>359</width>
<height>363</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>About RepRaptor</string>
</property>
@ -18,7 +24,7 @@
<normaloff>:/icons/about.png</normaloff>:/icons/about.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<item row="3" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -28,7 +34,7 @@
</property>
</widget>
</item>
<item row="0" column="0">
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser">
<property name="acceptDrops">
<bool>false</bool>
@ -39,8 +45,8 @@
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;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 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 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;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; 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;&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; 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;
@ -56,6 +62,13 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="versionLabel">
<property name="text">
<string>Build info</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources>

View File

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

View File

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

View File

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

View File

@ -1,11 +1,29 @@
#include "errorwindow.h"
#include "ui_errorwindow.h"
ErrorWindow::ErrorWindow(QWidget *parent, QString errorText) :
using namespace RepRaptor;
ErrorWindow::ErrorWindow(QWidget *parent, QString errorText, int errType):
QDialog(parent),
ui(new Ui::ErrorWindow)
{
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);
}

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

224
sender.cpp Normal file
View File

@ -0,0 +1,224 @@
#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);
}
}

71
sender.h Normal file
View File

@ -0,0 +1,71 @@
#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,17 +6,27 @@ SettingsWindow::SettingsWindow(QWidget *parent) :
ui(new Ui::SettingsWindow)
{
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!
ui->senderbox->setValue(settings.value("core/senderinterval", 2).toFloat());
ui->echobox->setChecked(settings.value("core/echo", 0).toBool());
settings.setParent(this);
ui->flowcontrolbox->setCurrentIndex(settings.value("core/flowcontrol", 0).toInt());
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->bedxbox->setValue(settings.value("printer/bedx", 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->checksumbox->setChecked(settings.value("core/checksums", 0).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("Repetier"); //1
@ -39,13 +49,21 @@ SettingsWindow::~SettingsWindow()
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/statusinterval", ui->statusbox->value());
settings.setValue("printer/bedy", ui->bedybox->value());
settings.setValue("printer/bedx", ui->bedxbox->value());
settings.setValue("core/echo", ui->echobox->isChecked());
settings.setValue("printer/feedrate", ui->feedrateBox->value());
settings.setValue("printer/extruderfeedrate", ui->extruderFeedrateBox->value());
settings.setValue("core/lockcontrols", ui->lockbox->isChecked());
settings.setValue("core/checksums", ui->checksumbox->isChecked());
settings.setValue("core/checksdstatus", ui->sdbox->isChecked());
settings.setValue("core/dtr", ui->dtrbox->isChecked());
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,6 +27,10 @@ private slots:
private:
Ui::SettingsWindow *ui;
signals:
void updatesettings();
};
#endif // SETTINGSWINDOW_H

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>253</width>
<height>386</height>
<width>603</width>
<height>491</height>
</rect>
</property>
<property name="windowTitle">
@ -18,66 +18,322 @@
<normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<item row="0" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="minimumSize">
<size>
<width>200</width>
<height>400</height>
</size>
</property>
<property name="title">
<string>Printer</string>
<property name="currentIndex">
<number>0</number>
</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>
</layout>
<widget class="QWidget" name="tab_general">
<attribute name="title">
<string>General</string>
</attribute>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QGroupBox" name="internalGroup">
<property name="title">
<string>Internal</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<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>1.000000000000000</double>
</property>
<property name="value">
<double>2.000000000000000</double>
</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="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>
</item>
<item row="2" column="0">
<item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -90,140 +346,6 @@
</property>
</widget>
</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>
</widget>
<resources>