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 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. 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 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 git clone https://github.com/NeoTheFox/RepRaptor && cd RepRaptor
@ -26,10 +26,15 @@ qmake RepRaptor.pro
make make
``` ```
And if you want to install system-wide
```
sudo make install
```
## Links ## 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) - [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/) [![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] [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=/usr/bin/RepRaptor Exec=RepRaptor
Icon=/usr/share/icons/repraptor.png Icon=repraptor
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Utility;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 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
@ -44,7 +44,8 @@ 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 \
@ -54,7 +55,8 @@ 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 \
@ -69,4 +71,5 @@ RESOURCES += \
DISTFILES += \ DISTFILES += \
LICENCE \ LICENCE \
README.md \ README.md \
RepRaptor.desktop RepRaptor.desktop \
.travis.yml

View File

@ -6,6 +6,11 @@ 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,6 +3,8 @@
#include <QDialog> #include <QDialog>
#include "repraptor.h"
namespace Ui { namespace Ui {
class AboutWindow; class AboutWindow;
} }

View File

@ -6,10 +6,16 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>424</width> <width>359</width>
<height>308</height> <height>363</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>
@ -18,7 +24,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="1" column="0"> <item row="3" 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>
@ -28,7 +34,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="0"> <item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser"> <widget class="QTextBrowser" name="textBrowser">
<property name="acceptDrops"> <property name="acceptDrops">
<bool>false</bool> <bool>false</bool>
@ -39,8 +45,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 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;&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 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; 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 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;
@ -56,6 +62,13 @@ 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, SIGNAL(textChanged(QString)), this, SLOT(lineChanged(QString))); connect(edit, &QLineEdit::textChanged, this, &EEPROMWindow::lineChanged);
line->addWidget(label); line->addWidget(label);
line->addWidget(edit); line->addWidget(edit);

View File

@ -4,16 +4,18 @@ ErrorIcon::ErrorIcon(QWidget *parent) : QWidget(parent)
{ {
framenum = 0; framenum = 0;
frame = ":icons/error_a.png"; frame = ":icons/error_a.png";
animation.setInterval(300); animation = new QTimer(this);
animation.start(); 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); 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() void ErrorIcon::changeFrame()
@ -33,6 +35,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 *pe); virtual void paintEvent(QPaintEvent *);
signals: signals:

View File

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

View File

@ -1,15 +1,16 @@
#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 <QFuture> #include <QThread>
#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,6 +21,7 @@
#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;
@ -36,45 +37,52 @@ public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
~MainWindow(); ~MainWindow();
Parser *parser; Parser *parserWorker;
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 sendTimer; QTimer *progressSDTimer;
QTimer progressSDTimer; QTimer *statusTimer;
QTimer statusTimer; QSystemTrayIcon *trayIcon;
QElapsedTimer sinceLastTemp; QMenu *recentMenu;
QElapsedTimer sinceLastSDStatus; QMenu *trayIconMenu;
QElapsedTimer *sinceLastTemp;
QElapsedTimer *sinceLastSDStatus;
QSettings settings; QSettings settings;
QStringList recentFiles; QStringList recentFiles;
QStringList EEPROMSettings; QStringList EEPROMSettings;
QStringList userHistory; QStringList userHistory;
QMenu *recentMenu; QSerialPortInfo printerinfo;
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;
QSerialPort printer; QString lastDir;
QSerialPortInfo printerinfo; bool opened;
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;
long int currentLine; int feedrate;
unsigned long int lastRecieved; int extruderFeedrate;
int readyRecieve;
int userHistoryPos; int userHistoryPos;
unsigned long int sdBytes; unsigned long int sdBytes;
@ -82,14 +90,11 @@ private slots:
void open(); void open();
void serialconnect(); void serialconnect();
void serialupdate(); void serialupdate();
bool sendLine(QString line); void updatesettings();
void readSerial(); void readSerial(QByteArray data);
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();
@ -98,14 +103,15 @@ private slots:
void openEEPROMeditor(); void openEEPROMeditor();
void sendEEPROMsettings(QStringList changes); void sendEEPROMsettings(QStringList changes);
void updateTemperature(TemperatureReadings r); void updateTemperature(TemperatureReadings r);
void EEPROMSettingRecieved(QString esetting); void EEPROMSettingReceived(QString esetting);
void recievedOkNum(int num); void receivedError();
void recievedWait(); void receivedSDDone();
void recievedError(); void receivedNotSDPrinting();
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();
@ -153,9 +159,17 @@ 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>761</width> <width>791</width>
<height>456</height> <height>514</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -43,13 +43,6 @@
<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">
@ -58,6 +51,23 @@
<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">
@ -67,9 +77,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QComboBox" name="baudbox"/>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -143,6 +150,15 @@
</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>
@ -164,6 +180,9 @@
</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>
@ -193,7 +212,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>Release</string> <string>Motors off</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -206,6 +225,9 @@
</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>
@ -214,19 +236,22 @@
<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>
@ -235,14 +260,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>
@ -251,6 +276,12 @@
<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>
@ -275,15 +306,26 @@
<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>
@ -308,35 +350,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>
@ -376,19 +418,6 @@
</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">
@ -415,7 +444,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>B tmp</string> <string>Bed tmp</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -868,6 +897,19 @@ 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>
@ -889,6 +931,13 @@ 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">
@ -909,13 +958,6 @@ 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>
@ -1014,7 +1056,7 @@ STOP</string>
</size> </size>
</property> </property>
<property name="title"> <property name="title">
<string>Status</string> <string>Temperature</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">
@ -1050,7 +1092,7 @@ STOP</string>
<property name="minimumSize"> <property name="minimumSize">
<size> <size>
<width>0</width> <width>0</width>
<height>14</height> <height>15</height>
</size> </size>
</property> </property>
<property name="maximumSize"> <property name="maximumSize">
@ -1087,7 +1129,7 @@ STOP</string>
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>761</width> <width>791</width>
<height>20</height> <height>20</height>
</rect> </rect>
</property> </property>
@ -1178,6 +1220,9 @@ 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,15 +3,17 @@
Parser::Parser(QObject *parent): Parser::Parser(QObject *parent):
QObject(parent) QObject(parent)
{ {
this->setParent(parent); //Init regexp
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();
} }
@ -23,26 +25,26 @@ Parser::~Parser()
void Parser::parse(QByteArray data) 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 else
{ {
readingFiles = false; readingFiles = false;
emit recievedSDFilesList(SDFilesList); emit receivedSDFilesList(SDFilesList);
} }
return; return;
} }
if(readingEEPROM) if(readingEEPROM) // EEPROM reading mode
{ {
if(firmware == Repetier) if(firmware == Repetier)
{ {
if(data.startsWith("EPR")) if(data.startsWith("EPR"))
{ {
emit recievedEEPROMLine(QString(data)); emit receivedEEPROMLine(QString(data));
EEPROMReadingStarted = true; EEPROMReadingStarted = true;
} }
else if(EEPROMReadingStarted) else if(EEPROMReadingStarted)
@ -55,48 +57,38 @@ 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 recievedOkNum(tmp.at(1).toInt()); emit receivedOkNum(tmp.at(1).toInt());
else emit recievedOkNum(0); else emit receivedOkNum(0);
} }
*/ */
else if(data.startsWith("T:")) else if(data.contains("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 return; else r.e = 0;
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 return; else r.b = 0;
r.raw = QString(data); r.raw = QString(data);
emit recievedTemperature(r); emit receivedTemperature(r);
} }
//else if(data.startsWith("wait")) emit recievedOkWait(); //else if(data.startsWith("wait")) emit receivedOkWait();
else if(data.startsWith("rs") || data.startsWith("Resend")) else if(data.startsWith("rs") || data.toLower().startsWith("resend"))
emit recievedResend(data.split(' ').at(0).toInt()); emit receivedResend(data.split(':').at(1).toInt());
else if(data.startsWith("!!")) emit recievedError(); else if(data.startsWith("!!")) emit receivedError();
else if(data.startsWith("Done")) emit recievedSDDone(); else if(data.startsWith("Done")) emit receivedSDDone();
else if(data.startsWith("start")) emit recievedStart(); else if(data.startsWith("start")) emit receivedStart();
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;
@ -110,17 +102,17 @@ void Parser::parse(QByteArray data)
} }
else return; 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")) 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 recievedFirmware(Repetier); //else if(data.contains("REPETIER")) emit receivedFirmware(Repetier);
//else if(data.contains("MARLIN")) emit recievedFirmware(Marlin); //else if(data.contains("MARLIN")) emit receivedFirmware(Marlin);
} }
} }

View File

@ -19,25 +19,26 @@ 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 recievedTemperature(TemperatureReadings); void receivedTemperature(TemperatureReadings);
void recievedSDUpdate(SDProgress); void receivedSDUpdate(SDProgress);
void recievedEEPROMLine(QString); void receivedNotSDPrinting();
void receivedEEPROMLine(QString);
void recievingEEPROMDone(); void recievingEEPROMDone();
void recievedSDFilesList(QStringList); void receivedSDFilesList(QStringList);
void recievedOkWait(); void receivedOkWait();
void recievedOkNum(int); void receivedOkNum(int);
void recievedStart(); void receivedStart();
void recievedResend(int); void receivedResend(int);
void recievedError(); void receivedError();
void recievedFirmware(int); void receivedFirmware(int);
void recievedSDDone(); void receivedSDDone();
public slots: public slots:
void parse(QByteArray data); void parse(QByteArray data);

View File

@ -1,7 +1,13 @@
/////////////////////////////////////////////////
//This file contains RepRaptor - specific stuff//
/////////////////////////////////////////////////
#ifndef REPRAPTOR_H #ifndef REPRAPTOR_H
#define REPRAPTOR_H #define REPRAPTOR_H
#include <QString> #ifndef REPRAPTOR_VERSION
#define REPRAPTOR_VERSION "0.3.9"
#endif
namespace RepRaptor namespace RepRaptor
{ {
@ -18,6 +24,13 @@ namespace RepRaptor
OtherFirmware OtherFirmware
}; };
enum ErrorType
{
SerialPortError,
OpenFileError,
HardwareFailure
};
typedef struct typedef struct
{ {
int T, P; int T, P;
@ -28,6 +41,11 @@ 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,7 +7,13 @@ SDWindow::SDWindow(QStringList files, QWidget *parent) :
{ {
ui->setupUi(this); 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() SDWindow::~SDWindow()
@ -17,11 +23,11 @@ SDWindow::~SDWindow()
void SDWindow::on_buttonBox_accepted() 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(); 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 &index); void on_fileslist_doubleClicked(const QModelIndex &);
private: private:
Ui::SDWindow *ui; Ui::SDWindow *ui;

View File

@ -6,10 +6,16 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>249</width> <width>274</width>
<height>246</height> <height>302</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>
@ -21,7 +27,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>Print file:</string> <string>Select file:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -40,8 +46,14 @@
</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>false</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </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(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!
ui->senderbox->setValue(settings.value("core/senderinterval", 2).toFloat()); settings.setParent(this);
ui->echobox->setChecked(settings.value("core/echo", 0).toBool()); 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->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
@ -39,13 +49,21 @@ 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("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/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,6 +27,10 @@ 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>253</width> <width>603</width>
<height>386</height> <height>491</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -18,66 +18,322 @@
<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="1" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox"> <widget class="QTabWidget" name="tabWidget">
<property name="sizePolicy"> <property name="minimumSize">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum"> <size>
<horstretch>0</horstretch> <width>200</width>
<verstretch>0</verstretch> <height>400</height>
</sizepolicy> </size>
</property> </property>
<property name="title"> <property name="currentIndex">
<string>Printer</string> <number>0</number>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2"> <widget class="QWidget" name="tab_general">
<item row="1" column="1"> <attribute name="title">
<widget class="QSpinBox" name="bedxbox"> <string>General</string>
<property name="minimum"> </attribute>
<number>1</number> <layout class="QFormLayout" name="formLayout">
</property> <item row="0" column="0">
<property name="maximum"> <widget class="QGroupBox" name="internalGroup">
<number>9999</number> <property name="title">
</property> <string>Internal</string>
</widget> </property>
</item> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="2"> <item row="1" column="1">
<widget class="QLabel" name="label_6"> <widget class="QDoubleSpinBox" name="senderbox">
<property name="text"> <property name="toolTip">
<string>X</string> <string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string>
</property> </property>
</widget> <property name="toolTipDuration">
</item> <number>-1</number>
<item row="1" column="3"> </property>
<widget class="QSpinBox" name="bedybox"> <property name="locale">
<property name="minimum"> <locale language="English" country="UnitedStates"/>
<number>1</number> </property>
</property> <property name="minimum">
<property name="maximum"> <double>0.000000000000000</double>
<number>9999</number> </property>
</property> <property name="maximum">
</widget> <double>999.990000000000009</double>
</item> </property>
<item row="1" column="0"> <property name="singleStep">
<widget class="QLabel" name="label_5"> <double>1.000000000000000</double>
<property name="text"> </property>
<string>Bed size</string> <property name="value">
</property> <double>2.000000000000000</double>
</widget> </property>
</item> </widget>
<item row="0" column="0"> </item>
<widget class="QLabel" name="label_8"> <item row="2" column="1">
<property name="text"> <widget class="QSpinBox" name="statusbox">
<string>Firmware</string> <property name="toolTip">
</property> <string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string>
</widget> </property>
</item> <property name="toolTipDuration">
<item row="0" column="1" colspan="3"> <number>-1</number>
<widget class="QComboBox" name="firmwarecombo"/> </property>
</item> <property name="minimum">
</layout> <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> </widget>
</item> </item>
<item row="2" 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>
@ -90,140 +346,6 @@
</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>