Compare commits

..

No commits in common. "master" and "v0.11-alpha" have entirely different histories.

39 changed files with 887 additions and 3375 deletions

8
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,6 @@
#------------------------------------------------- #-------------------------------------------------
# #
# Project created by QtCreator 2015-02-26T16:14:20 # Project created by QtCreator 2015-02-26T16:14:20
# Licenced on terms of GNU GPL v2 licence
# #
#------------------------------------------------- #-------------------------------------------------
@ -13,63 +12,28 @@ TARGET = RepRaptor
TEMPLATE = app TEMPLATE = app
CONFIG += static CONFIG += static
unix {
#VARIABLES
isEmpty(PREFIX) {
PREFIX = /usr
}
BINDIR = $$PREFIX/bin
DATADIR =$$PREFIX/share
DEFINES += DATADIR=\\\"$$DATADIR\\\" PKGDATADIR=\\\"$$PKGDATADIR\\\"
#MAKE INSTALL
INSTALLS += target desktop icon
target.path =$$BINDIR
desktop.path = $$DATADIR/applications
desktop.files += $${TARGET}.desktop
icon.path = $$DATADIR/icons
icon.files += icons/repraptor.png
}
SOURCES += main.cpp\ SOURCES += main.cpp\
mainwindow.cpp \ mainwindow.cpp \
settingswindow.cpp \ settingswindow.cpp \
aboutwindow.cpp \ aboutwindow.cpp \
errorwindow.cpp \ errorwindow.cpp \
erroricon.cpp \ erroricon.cpp
sdwindow.cpp \
eepromwindow.cpp \
parser.cpp \
sender.cpp
HEADERS += mainwindow.h \ HEADERS += mainwindow.h \
settingswindow.h \ settingswindow.h \
aboutwindow.h \ aboutwindow.h \
errorwindow.h \ errorwindow.h \
erroricon.h \ erroricon.h
sdwindow.h \
repraptor.h \
eepromwindow.h \
parser.h \
sender.h
FORMS += mainwindow.ui \ FORMS += mainwindow.ui \
settingswindow.ui \ settingswindow.ui \
aboutwindow.ui \ aboutwindow.ui \
errorwindow.ui \ errorwindow.ui
sdwindow.ui \
eepromwindow.ui
RESOURCES += \ RESOURCES += \
graphics.qrc graphics.qrc
DISTFILES += \ DISTFILES += \
LICENCE \ LICENCE \
README.md \ README.md
RepRaptor.desktop \
.travis.yml

View File

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

View File

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

View File

@ -6,25 +6,56 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>359</width> <width>424</width>
<height>363</height> <height>308</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>About RepRaptor</string> <string>About</string>
</property>
<property name="windowIcon">
<iconset resource="graphics.qrc">
<normaloff>:/icons/about.png</normaloff>:/icons/about.png</iconset>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="3" column="0"> <item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>About RepRaptor</string>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QTextBrowser" name="textBrowser">
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
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 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;&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; text-decoration: underline; color:#0000ff;&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;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 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;
&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;http://www.reprap.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;RepRap&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; text-decoration: underline; color:#0000ff;&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; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="openLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -34,46 +65,9 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0">
<widget class="QTextBrowser" name="textBrowser">
<property name="acceptDrops">
<bool>false</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
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 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;
&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;http://www.reprap.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;RepRap wiki&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; text-decoration: underline; color:#0000ff;&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; text-decoration: underline; color:#0000ff;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="openLinks">
<bool>true</bool>
</property>
</widget>
</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/>
<include location="graphics.qrc"/>
</resources>
<connections> <connections>
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>

View File

@ -1,139 +0,0 @@
#include "eepromwindow.h"
#include "ui_eepromwindow.h"
EEPROMWindow::EEPROMWindow(QStringList eepromLines, QWidget *parent) :
QDialog(parent),
ui(new Ui::EEPROMWindow)
{
ui->setupUi(this);
QSettings settings;
firmware = settings.value("printer/firmware").toInt();
QLayout *layout = new QVBoxLayout();
if(firmware == Repetier)
{
int j = 0;
foreach (QString str, eepromLines)
{
str.remove("EPR:"); // Clear the unneeded part
repetierEEPROMline currentLine; //Storage for EEPROM values
QStringList tmp = str.split(' ');
currentLine.T = tmp.at(0).toInt();
currentLine.P = tmp.at(1).toInt();
currentLine.S = tmp.at(2);
lines.append(currentLine);
QString msg;
for(int i = 3; i < tmp.size(); i++) msg+=(tmp.at(i) + " "); //Rejoin the rest
QLayout *line = new QGridLayout();
QLabel *label = new QLabel(msg, this);
QLineEdit *edit = new QLineEdit(currentLine.S,this);
QFrame* hline = new QFrame();
hline->setFrameShape(QFrame::HLine);
hline->setFrameShadow(QFrame::Sunken);
line->addWidget(hline);
edit->setObjectName("e"+QString::number(j)); //Name the LineEdit, so when it emits signal we know where it came from
QRegExpValidator *doublevalidator = new QRegExpValidator(
QRegExp("^\\-?\\d+\\.?\\d+(e\\-?\\d+)?$",
Qt::CaseInsensitive), this);
doublevalidator->setLocale(QLocale::English);
switch(currentLine.T) // set right validator for the line
{
case 0:
edit->setValidator(new QIntValidator(-128, 255, this));
case 1:
case 2:
edit->setValidator(new QIntValidator(this));
break;
case 3:
edit->setValidator(doublevalidator);
break;
default:
break;
}
connect(edit, &QLineEdit::textChanged, this, &EEPROMWindow::lineChanged);
line->addWidget(label);
line->addWidget(edit);
line->setMargin(2);
layout->addItem(line);
j++; // increase counter
}
for(int i = 0; i < lines.size(); i++) changed.append(false);
ui->eepromWidgets->setLayout(layout);
}
else if(firmware == Marlin)
{
}
}
EEPROMWindow::~EEPROMWindow()
{
delete ui;
}
void EEPROMWindow::lineChanged(QString s)
{
if(firmware == Repetier)
{
int num = sender()->objectName().remove(0, 1).toInt();
lines[num].S = s;
changed[num] = true;
}
else if(firmware == Marlin)
{
}
}
void EEPROMWindow::on_buttonBox_accepted()
{
QStringList gcode;
if(firmware == Repetier)
{
for(int i=0; i < changed.size(); i++)
{
if(changed.at(i))
{
QString command;
command+=QString("M206");
command+=QString("T");
command+=QString::number(lines.at(i).T);
command+=QString("P");
command+=QString::number(lines.at(i).P);
if(lines.at(i).T == 3) command+=QString("X");
else command+=QString("S");
command+=lines.at(i).S;
gcode.append(command);
}
}
}
else if(firmware == Marlin)
{
}
emit changesComplete(gcode);
}

View File

@ -1,37 +0,0 @@
#ifndef EEPROMWINDOW_H
#define EEPROMWINDOW_H
#include <QDialog>
#include <QtWidgets>
#include "repraptor.h"
using namespace RepRaptor;
namespace Ui {
class EEPROMWindow;
}
class EEPROMWindow : public QDialog
{
Q_OBJECT
public:
explicit EEPROMWindow(QStringList eepromLines, QWidget *parent = 0);
~EEPROMWindow();
private:
Ui::EEPROMWindow *ui;
QVector <repetierEEPROMline> lines;
QVector <bool> changed;
int firmware;
signals:
void changesComplete(QStringList changed);
private slots:
void on_buttonBox_accepted();
void lineChanged(QString s);
};
#endif // EEPROMWINDOW_H

View File

@ -1,93 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>EEPROMWindow</class>
<widget class="QDialog" name="EEPROMWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>287</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>EEPROM Editor</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="locale">
<locale language="English" country="UnitedStates"/>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="eepromWidgets">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>267</width>
<height>251</height>
</rect>
</property>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>EEPROMWindow</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>227</x>
<y>282</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>EEPROMWindow</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>277</x>
<y>288</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

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

View File

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

View File

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

View File

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

View File

@ -1,14 +1,8 @@
<RCC> <RCC>
<qresource prefix="/"> <qresource prefix="/">
<file>icons/repraptor.png</file> <file>icons/icon.png</file>
<file>icons/logo.png</file> <file>icons/logo.png</file>
<file>icons/error_a.png</file> <file>icons/error_a.png</file>
<file>icons/error_b.png</file> <file>icons/error_b.png</file>
<file>icons/g.png</file>
<file>icons/sd.png</file>
<file>icons/settings.png</file>
<file>icons/about.png</file>
<file>icons/exit.png</file>
<file>icons/eeprom.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 B

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 B

View File

@ -1,16 +1,13 @@
#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);
MainWindow w; MainWindow w;
w.show(); w.show();

File diff suppressed because it is too large Load Diff

View File

@ -3,27 +3,20 @@
#include <QMainWindow> #include <QMainWindow>
#include <QFileDialog> #include <QFileDialog>
#include <QSystemTrayIcon>
#include <QtSerialPort/QtSerialPort> #include <QtSerialPort/QtSerialPort>
#include <QFile> #include <QFile>
#include <QThread> #include <QFuture>
#include <QVector> #include <QVector>
#include <QTextStream> #include <QTextStream>
#include <QTimer>
#include <QSettings> #include <QSettings>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <QRegExp> #include <QMessageBox>
#include <QMap>
#include "settingswindow.h" #include "settingswindow.h"
#include "aboutwindow.h" #include "aboutwindow.h"
#include "errorwindow.h" #include "errorwindow.h"
#include "sdwindow.h"
#include "repraptor.h"
#include "eepromwindow.h"
#include "parser.h"
#include "sender.h"
using namespace RepRaptor;
namespace Ui { namespace Ui {
class MainWindow; class MainWindow;
@ -37,81 +30,43 @@ public:
explicit MainWindow(QWidget *parent = 0); explicit MainWindow(QWidget *parent = 0);
~MainWindow(); ~MainWindow();
Parser *parserWorker;
Sender *senderWorker;
QThread *parserThread;
QThread *senderThread;
protected:
QMap <QString, QString> macros;
QFile gfile; QFile gfile;
QVector<QString> gcode; QVector<QString> gcode;
QQueue <QString> userCommands; QTimer sendTimer;
QTimer *progressSDTimer; QTimer statusTimer;
QTimer *statusTimer; QTimer tempWarning;
QSystemTrayIcon *trayIcon; QElapsedTimer sinceLastTemp;
QMenu *recentMenu;
QMenu *trayIconMenu;
QElapsedTimer *sinceLastTemp;
QElapsedTimer *sinceLastSDStatus;
QSettings settings; QSettings settings;
QStringList recentFiles; QStringList recentFiles;
QStringList EEPROMSettings;
QStringList userHistory;
QSerialPortInfo printerinfo;
QTextCursor terminalCursor;
void closeEvent(QCloseEvent *event);
bool eventFilter(QObject *target, QEvent *event);
private: private:
Ui::MainWindow *ui; Ui::MainWindow *ui;
QString lastDir; void parseFile(QFile &file);
bool opened; QSerialPort printer;
bool firstrun; QSerialPortInfo printerinfo;
bool autolock;
bool printing;
bool sending; bool sending;
bool paused; bool paused;
bool commandDone;
bool checkingTemperature; bool checkingTemperature;
bool sdprinting; bool injectingCommand;
bool echo; int currentLine;
bool chekingSDStatus; QString userCommand;
bool trayIconEnabled;
bool supressWait;
int firmware;
int feedrate;
int extruderFeedrate;
int userHistoryPos;
unsigned long int sdBytes;
private slots: private slots:
void open(); void open();
void serialconnect(); void serialconnect();
void serialupdate(); void serialupdate();
void updatesettings(); bool sendLine(QString line);
void readSerial(QByteArray data);
void readSerial();
void printMsg(QString text); void printMsg(QString text);
void printMsg(const char* text);
void sendNext();
void checkStatus(); void checkStatus();
void updateRecent(); void updateRecent();
void initSDprinting(QStringList sdFiles); void injectCommand(QString command);
void selectSDfile(QString file); void parseStatus(QByteArray data);
void checkSDStatus();
void updateSDStatus(SDProgress p);
void requestEEPROMSettings();
void openEEPROMeditor();
void sendEEPROMsettings(QStringList changes);
void updateTemperature(TemperatureReadings r);
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 xplus();
void yplus(); void yplus();
@ -138,38 +93,12 @@ private slots:
void on_btmpoff_clicked(); void on_btmpoff_clicked();
void on_sendBtn_clicked(); void on_sendBtn_clicked();
void on_pauseBtn_clicked(); void on_pauseBtn_clicked();
void on_haltbtn_clicked();
void on_actionAbout_Qt_triggered();
void on_speedslider_valueChanged(int value);
void on_speededit_textChanged(const QString &arg1);
void on_speedsetbtn_clicked();
void on_flowedit_textChanged(const QString &arg1);
void on_flowslider_valueChanged(int value);
void on_flowbutton_clicked();
void on_checktemp_stateChanged(int arg1); void on_checktemp_stateChanged(int arg1);
void on_actionSettings_triggered(); void on_actionSettings_triggered();
void on_stepspin_valueChanged(const QString &arg1);
void on_estepspin_valueChanged(const QString &arg1);
void on_releasebtn_clicked(); void on_releasebtn_clicked();
void on_actionAbout_triggered(); void on_actionAbout_triggered();
void serialError(QSerialPort::SerialPortError error); void serialError(QSerialPort::SerialPortError error);
void on_actionPrint_from_SD_triggered(); void on_actionPrint_from_SD_triggered();
void on_actionSet_SD_printing_mode_triggered();
void on_actionEEPROM_editor_triggered();
signals:
void sdReady();
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

File diff suppressed because it is too large Load Diff

View File

@ -1,123 +0,0 @@
#include "parser.h"
Parser::Parser(QObject *parent):
QObject(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();
}
Parser::~Parser()
{
}
void Parser::parse(QByteArray data)
{
if(!data.isEmpty()) //Dont need to process empty strings
{
if(readingFiles) //SD files list reading mode
{
if(!data.contains("End file list")) SDFilesList.append(data.remove(data.size()-2, 2));
else
{
readingFiles = false;
emit receivedSDFilesList(SDFilesList);
}
return;
}
if(readingEEPROM) // EEPROM reading mode
{
if(firmware == Repetier)
{
if(data.startsWith("EPR"))
{
emit receivedEEPROMLine(QString(data));
EEPROMReadingStarted = true;
}
else if(EEPROMReadingStarted)
{
readingEEPROM = false;
EEPROMReadingStarted = false;
emit recievingEEPROMDone();
}
return;
}
}
/*
if(data.startsWith("ok"))
{
QStringList tmp = QString(data).split(' ');
if(tmp.size() > 1)
emit receivedOkNum(tmp.at(1).toInt());
else emit receivedOkNum(0);
}
*/
else if(data.contains("T:"))
{
TemperatureReadings r;
if(temperatureRegxp.indexIn(QString(data)) != -1)
r.e = temperatureRegxp.cap(0).toDouble();
else r.e = 0;
if(temperatureRegxp.indexIn(QString(data), temperatureRegxp.matchedLength()) != -1)
r.b = temperatureRegxp.cap(0).toDouble();
else r.b = 0;
r.raw = QString(data);
emit receivedTemperature(r);
}
//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"))
{
SDProgress p;
QRegExp rxp("\\d+/\\d+");
QStringList tmp;
if(rxp.indexIn(data) != -1)
{
tmp = rxp.cap(0).split('/');
p.progress = tmp.at(0).toLong();
p.total = tmp.at(1).toLong();
}
else return;
emit receivedSDUpdate(p);
}
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 receivedFirmware(Repetier);
//else if(data.contains("MARLIN")) emit receivedFirmware(Marlin);
}
}
void Parser::setEEPROMReadingMode()
{
readingEEPROM = true;
}

View File

@ -1,48 +0,0 @@
#ifndef PARSETHREAD_H
#define PARSETHREAD_H
#include <QThread>
#include <QSettings>
#include "repraptor.h"
using namespace RepRaptor;
class Parser : public QObject
{
Q_OBJECT
public:
explicit Parser(QObject *parent = 0);
~Parser();
protected:
QByteArray data;
QStringList SDFilesList;
QRegExp temperatureRegxp;
int firmware;
bool readingFiles;
bool readingEEPROM;
bool EEPROMReadingStarted;
signals:
void receivedTemperature(TemperatureReadings);
void receivedSDUpdate(SDProgress);
void receivedNotSDPrinting();
void receivedEEPROMLine(QString);
void recievingEEPROMDone();
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);
void setEEPROMReadingMode();
};
#endif // PARSETHREAD_H

View File

@ -1,52 +0,0 @@
/////////////////////////////////////////////////
//This file contains RepRaptor - specific stuff//
/////////////////////////////////////////////////
#ifndef REPRAPTOR_H
#define REPRAPTOR_H
#ifndef REPRAPTOR_VERSION
#define REPRAPTOR_VERSION "0.3.9"
#endif
namespace RepRaptor
{
typedef struct
{
double e, b;
QString raw;
} TemperatureReadings;
enum Firmware
{
Marlin,
Repetier,
OtherFirmware
};
enum ErrorType
{
SerialPortError,
OpenFileError,
HardwareFailure
};
typedef struct
{
int T, P;
QString S;
} repetierEEPROMline;
typedef struct
{
unsigned long int progress, total;
} SDProgress;
typedef struct
{
unsigned int T, P;
} FileProgress;
}
#endif // REPRAPTOR_H

View File

@ -1,33 +0,0 @@
#include "sdwindow.h"
#include "ui_sdwindow.h"
SDWindow::SDWindow(QStringList files, QWidget *parent) :
QDialog(parent),
ui(new Ui::SDWindow)
{
ui->setupUi(this);
ui->fileslist->setSelectionMode(QListView::SingleSelection);
if(!files.isEmpty())
{
ui->fileslist->addItems(files);
ui->fileslist->setCurrentItem(ui->fileslist->itemAt(0,0));
}
}
SDWindow::~SDWindow()
{
delete ui;
}
void SDWindow::on_buttonBox_accepted()
{
if(ui->fileslist->count() > 0) emit fileSelected(ui->fileslist->currentItem()->text());
}
void SDWindow::on_fileslist_doubleClicked(const QModelIndex &)
{
if(ui->fileslist->count() > 0) emit fileSelected(ui->fileslist->currentItem()->text());
this->close();
}

View File

@ -1,30 +0,0 @@
#ifndef SDWINDOW_H
#define SDWINDOW_H
#include <QDialog>
namespace Ui {
class SDWindow;
}
class SDWindow : public QDialog
{
Q_OBJECT
public:
explicit SDWindow(QStringList files, QWidget *parent = 0);
~SDWindow();
signals:
void fileSelected(QString filename);
private slots:
void on_buttonBox_accepted();
void on_fileslist_doubleClicked(const QModelIndex &);
private:
Ui::SDWindow *ui;
};
#endif // SDWINDOW_H

View File

@ -1,99 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SDWindow</class>
<widget class="QDialog" name="SDWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<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>
<property name="windowIcon">
<iconset resource="graphics.qrc">
<normaloff>:/icons/sd.png</normaloff>:/icons/sd.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Select file:</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</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>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="graphics.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>SDWindow</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>SDWindow</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

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

View File

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

151
settings.ui Normal file
View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog</class>
<widget class="QDialog" name="Dialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QGroupBox" name="hardwaregroup">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>181</width>
<height>65</height>
</rect>
</property>
<property name="title">
<string>Hardware</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Bed Size</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="xsize">
<property name="text">
<string>200</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_2">
<property name="text">
<string>X</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLineEdit" name="ysize">
<property name="text">
<string>200</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QPushButton" name="savebtn">
<property name="geometry">
<rect>
<x>220</x>
<y>270</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
<widget class="QPushButton" name="cancelbtn">
<property name="geometry">
<rect>
<x>310</x>
<y>270</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
<widget class="QGroupBox" name="intervalgroup">
<property name="geometry">
<rect>
<x>10</x>
<y>90</y>
<width>181</width>
<height>96</height>
</rect>
</property>
<property name="title">
<string>Intervals</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Sender</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="sendinterval">
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>50</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_5">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Status</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="statusinterval">
<property name="maximum">
<number>9999</number>
</property>
<property name="value">
<number>3000</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -6,39 +6,17 @@ SettingsWindow::SettingsWindow(QWidget *parent) :
ui(new Ui::SettingsWindow) ui(new Ui::SettingsWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
ui->flowcontrolbox->addItem(tr("No control"));
ui->flowcontrolbox->addItem(tr("Hardware control"));
ui->flowcontrolbox->addItem(tr("Software control"));
//bool firstrun = !settings.value("core/firstrun").toBool(); //firstrun is inverted! ui->senderbox->setValue(settings.value("core/senderinterval").toFloat());
settings.setParent(this); if(settings.value("core/statusinterval").toInt()) ui->statusbox->setValue(settings.value("core/statusinterval").toInt());
ui->flowcontrolbox->setCurrentIndex(settings.value("core/flowcontrol", 0).toInt()); else ui->senderbox->setValue(3000);
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 if(settings.value("printer/bedx").toInt()) ui->bedxbox->setValue(settings.value("printer/bedx").toInt());
ui->firmwarecombo->addItem("Repetier"); //1 else ui->bedxbox->setValue(200);
ui->firmwarecombo->addItem("Other"); //2
ui->firmwarecombo->setCurrentIndex(settings.value("printer/firmware", OtherFirmware).toInt()); if(settings.value("printer/bedy").toInt()) ui->bedybox->setValue(settings.value("printer/bedy").toInt());
else ui->bedybox->setValue(200);
#ifdef QT_DEBUG
ui->checksumbox->setEnabled(true);
#else
ui->checksumbox->setDisabled(true);
#endif
} }
@ -49,21 +27,8 @@ SettingsWindow::~SettingsWindow()
void SettingsWindow::on_buttonBox_accepted() void SettingsWindow::on_buttonBox_accepted()
{ {
settings.setValue("core/flowcontrol", ui->flowcontrolbox->currentIndex());
settings.setValue("core/trayiconenabled", ui->traybox->isChecked());
settings.setValue("core/senderinterval", ui->senderbox->value()); settings.setValue("core/senderinterval", ui->senderbox->value());
settings.setValue("core/statusinterval", ui->statusbox->value()); settings.setValue("core/statusinterval", ui->statusbox->value());
settings.setValue("printer/bedy", ui->bedybox->value()); settings.setValue("printer/bedy", ui->bedybox->value());
settings.setValue("printer/bedx", ui->bedxbox->value()); settings.setValue("printer/bedx", ui->bedxbox->value());
settings.setValue("printer/feedrate", ui->feedrateBox->value());
settings.setValue("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

@ -3,9 +3,6 @@
#include <QDialog> #include <QDialog>
#include <QSettings> #include <QSettings>
#include "repraptor.h"
using namespace RepRaptor;
namespace Ui { namespace Ui {
class SettingsWindow; class SettingsWindow;
@ -27,10 +24,6 @@ private slots:
private: private:
Ui::SettingsWindow *ui; Ui::SettingsWindow *ui;
signals:
void updatesettings();
}; };
#endif // SETTINGSWINDOW_H #endif // SETTINGSWINDOW_H

View File

@ -6,351 +6,161 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>603</width> <width>400</width>
<height>491</height> <height>300</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Settings</string> <string>Settings</string>
</property> </property>
<property name="windowIcon"> <widget class="QDialogButtonBox" name="buttonBox">
<iconset resource="graphics.qrc"> <property name="geometry">
<normaloff>:/icons/settings.png</normaloff>:/icons/settings.png</iconset> <rect>
</property> <x>30</x>
<layout class="QGridLayout" name="gridLayout_3"> <y>260</y>
<item row="0" column="0"> <width>341</width>
<widget class="QTabWidget" name="tabWidget"> <height>32</height>
<property name="minimumSize"> </rect>
<size> </property>
<width>200</width> <property name="orientation">
<height>400</height> <enum>Qt::Horizontal</enum>
</size> </property>
</property> <property name="standardButtons">
<property name="currentIndex"> <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
<number>0</number> </property>
</property> </widget>
<widget class="QWidget" name="tab_general"> <widget class="QGroupBox" name="intervalsGroup">
<attribute name="title"> <property name="geometry">
<string>General</string> <rect>
</attribute> <x>10</x>
<layout class="QFormLayout" name="formLayout"> <y>10</y>
<item row="0" column="0"> <width>201</width>
<widget class="QGroupBox" name="internalGroup"> <height>96</height>
<property name="title"> </rect>
<string>Internal</string> </property>
</property> <property name="title">
<layout class="QGridLayout" name="gridLayout"> <string>Intervals</string>
<item row="1" column="1"> </property>
<widget class="QDoubleSpinBox" name="senderbox"> <layout class="QGridLayout" name="gridLayout">
<property name="toolTip"> <item row="0" column="0">
<string>A good default is 2, lower = fater, higher = less CPU load. 0 would execute as soon as possible.</string> <widget class="QLabel" name="label">
</property> <property name="text">
<property name="toolTipDuration"> <string>Sender</string>
<number>-1</number> </property>
</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>
<widget class="QWidget" name="tab_network"> </item>
<attribute name="title"> <item row="0" column="2">
<string>Network</string> <widget class="QLabel" name="label_3">
</attribute> <property name="text">
<string>ms</string>
</property>
</widget> </widget>
<widget class="QWidget" name="tab_hardware"> </item>
<attribute name="title"> <item row="1" column="0">
<string>Hardware</string> <widget class="QLabel" name="label_2">
</attribute> <property name="text">
<widget class="QGroupBox" name="groupBox"> <string>Status</string>
<property name="geometry"> </property>
<rect>
<x>10</x>
<y>20</y>
<width>249</width>
<height>171</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Printer</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="1">
<widget class="QSpinBox" name="bedxbox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>X</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSpinBox" name="bedybox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Bed size</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Firmware</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="3">
<widget class="QComboBox" name="firmwarecombo"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Feedrate</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QSpinBox" name="feedrateBox">
<property name="toolTip">
<string>Speed of axis movements (only affect buttons)</string>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Extruder
feedrate</string>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QSpinBox" name="extruderFeedrateBox">
<property name="toolTip">
<string>Extruder speed (only affect buttons)</string>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</widget> </item>
</item> <item row="1" column="1">
<item row="1" column="0"> <widget class="QSpinBox" name="statusbox">
<widget class="QDialogButtonBox" name="buttonBox"> <property name="toolTip">
<property name="orientation"> <string>A good default is 5000. More = less interruptions, less = better temperature monitoring</string>
<enum>Qt::Horizontal</enum> </property>
</property> <property name="toolTipDuration">
<property name="standardButtons"> <number>-1</number>
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> </property>
</property> <property name="minimum">
<property name="centerButtons"> <number>500</number>
<bool>true</bool> </property>
</property> <property name="maximum">
</widget> <number>99999</number>
</item> </property>
</layout> </widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>ms</string>
</property>
</widget>
</item>
<item row="0" 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>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>201</width>
<height>66</height>
</rect>
</property>
<property name="title">
<string>Printer</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>X</string>
</property>
</widget>
</item>
<item row="0" 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="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Bed size</string>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QSpinBox" name="bedybox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
<resources> <resources/>
<include location="graphics.qrc"/>
</resources>
<connections> <connections>
<connection> <connection>
<sender>buttonBox</sender> <sender>buttonBox</sender>
@ -359,8 +169,8 @@ feedrate</string>
<slot>accept()</slot> <slot>accept()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>243</x> <x>248</x>
<y>376</y> <y>254</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>157</x> <x>157</x>
@ -375,11 +185,11 @@ feedrate</string>
<slot>reject()</slot> <slot>reject()</slot>
<hints> <hints>
<hint type="sourcelabel"> <hint type="sourcelabel">
<x>243</x> <x>316</x>
<y>376</y> <y>260</y>
</hint> </hint>
<hint type="destinationlabel"> <hint type="destinationlabel">
<x>252</x> <x>286</x>
<y>274</y> <y>274</y>
</hint> </hint>
</hints> </hints>