diff --git a/testclient/CMakeLists.txt b/testclient/CMakeLists.txt
index 0d66cd5..8002d12 100644
--- a/testclient/CMakeLists.txt
+++ b/testclient/CMakeLists.txt
@@ -1,41 +1,43 @@
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
include_directories(../src)
add_subdirectory(widgets)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(AtCoreTestClient_SRCS
main.cpp
mainwindow.cpp
)
ecm_create_qm_loader(AtCoreTestClient_SRCS atcore_qt)
find_package(Qt5 REQUIRED COMPONENTS
Core
Test
Widgets
SerialPort
)
if (NOT APPLE)
- add_executable(AtCoreTest ${AtCoreTestClient_SRCS})
+ add_executable(AtCoreTest ${AtCoreTestClient_SRCS} icons.qrc)
install(TARGETS AtCoreTest RUNTIME DESTINATION bin)
install(FILES
"${CMAKE_CURRENT_SOURCE_DIR}/AtCoreTest.png"
DESTINATION share/pixmaps)
install(FILES
"${CMAKE_CURRENT_SOURCE_DIR}/AtCoreTest.desktop"
DESTINATION share/applications)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++11")
- add_executable(AtCoreTest MACOSX_BUNDLE ${AtCoreTestClient_SRCS})
+ add_executable(AtCoreTest MACOSX_BUNDLE ${AtCoreTestClient_SRCS} icons.qrc)
install(TARGETS AtCoreTest BUNDLE DESTINATION bin)
endif()
target_link_libraries(AtCoreTest AtCoreTestWidgets AtCore::AtCore Qt5::Widgets Qt5::Charts)
diff --git a/testclient/icons.qrc b/testclient/icons.qrc
new file mode 100644
index 0000000..df6ef2e
--- /dev/null
+++ b/testclient/icons.qrc
@@ -0,0 +1,6 @@
+
+
+ ../doc/atcore.png
+
+
+
diff --git a/testclient/mainwindow.cpp b/testclient/mainwindow.cpp
index 0aab083..adec942 100644
--- a/testclient/mainwindow.cpp
+++ b/testclient/mainwindow.cpp
@@ -1,564 +1,573 @@
/* AtCore Test Client
Copyright (C) <2016>
Authors:
Patrick José Pereira
Lays Rodrigues
Chris Rizzitello
Tomaz Canabrava
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include "mainwindow.h"
#include "seriallayer.h"
#include "gcodecommands.h"
#include "widgets/axiscontrol.h"
+#include "widgets/about.h"
Q_LOGGING_CATEGORY(TESTCLIENT_MAINWINDOW, "org.kde.atelier.core")
int MainWindow::fanCount = 4;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
core(new AtCore(this)),
logFile(new QTemporaryFile(QDir::tempPath() + QStringLiteral("/AtCore_")))
{
ui->setupUi(this);
- setWindowTitle(QString::fromLatin1("AtCore (%1) - Test Gui").arg(core->version()));
+ QCoreApplication::setApplicationVersion(core->version());
ui->serialPortCB->setEditable(true);
QValidator *validator = new QIntValidator();
ui->baudRateLE->setValidator(validator);
ui->baudRateLE->addItems(core->portSpeeds());
ui->baudRateLE->setCurrentIndex(9);
ui->pluginCB->addItem(tr("Autodetect"));
ui->pluginCB->addItems(core->availableFirmwarePlugins());
AxisControl *axisControl = new AxisControl;
ui->moveDockContents->layout()->addWidget(axisControl);
addLog(tr("Attempting to locate Serial Ports"));
core->setSerialTimerInterval(1000);
populateCBs();
//Icon for actionQuit
#ifndef Q_OS_MAC
ui->actionQuit->setIcon(QIcon::fromTheme(QStringLiteral("application-exit")));
#endif
//hide the printing progress bar.
ui->printLayout->setVisible(false);
ui->statusBar->addWidget(ui->statusBarWidget);
printTime = new QTime();
printTimer = new QTimer();
printTimer->setInterval(1000);
printTimer->setSingleShot(false);
connect(printTimer, &QTimer::timeout, this, &MainWindow::updatePrintTime);
connect(ui->connectPB, &QPushButton::clicked, this, &MainWindow::connectPBClicked);
connect(ui->saveLogPB, &QPushButton::clicked, this, &MainWindow::saveLogPBClicked);
connect(ui->sendPB, &QPushButton::clicked, this, &MainWindow::sendPBClicked);
connect(ui->commandLE, &QLineEdit::returnPressed, this, &MainWindow::sendPBClicked);
connect(ui->homeAllPB, &QPushButton::clicked, this, &MainWindow::homeAllPBClicked);
connect(ui->homeXPB, &QPushButton::clicked, this, &MainWindow::homeXPBClicked);
connect(ui->homeYPB, &QPushButton::clicked, this, &MainWindow::homeYPBClicked);
connect(ui->homeZPB, &QPushButton::clicked, this, &MainWindow::homeZPBClicked);
connect(ui->bedTempPB, &QPushButton::clicked, this, &MainWindow::bedTempPBClicked);
connect(ui->extTempPB, &QPushButton::clicked, this, &MainWindow::extTempPBClicked);
connect(ui->mvAxisPB, &QPushButton::clicked, this, &MainWindow::mvAxisPBClicked);
connect(ui->fanSpeedPB, &QPushButton::clicked, this, &MainWindow::fanSpeedPBClicked);
connect(ui->printPB, &QPushButton::clicked, this, &MainWindow::printPBClicked);
connect(ui->printerSpeedPB, &QPushButton::clicked, this, &MainWindow::printerSpeedPBClicked);
connect(ui->flowRatePB, &QPushButton::clicked, this, &MainWindow::flowRatePBClicked);
connect(ui->showMessagePB, &QPushButton::clicked, this, &MainWindow::showMessage);
connect(ui->pluginCB, &QComboBox::currentTextChanged, this, &MainWindow::pluginCBChanged);
connect(core, &AtCore::stateChanged, this, &MainWindow::printerStateChanged);
connect(this, &MainWindow::printFile, core, &AtCore::print);
connect(ui->stopPB, &QPushButton::clicked, core, &AtCore::stop);
connect(ui->emergencyStopPB, &QPushButton::clicked, core, &AtCore::emergencyStop);
connect(axisControl, &AxisControl::clicked, this, &MainWindow::axisControlClicked);
connect(core, &AtCore::portsChanged, this, &MainWindow::locateSerialPort);
connect(core, &AtCore::printProgressChanged, this, &MainWindow::printProgressChanged);
connect(&core->temperature(), &Temperature::bedTemperatureChanged, [ = ](float temp) {
checkTemperature(0x00, 0, temp);
ui->plotWidget->appendPoint(tr("Actual Bed"), temp);
ui->plotWidget->update();
});
connect(&core->temperature(), &Temperature::bedTargetTemperatureChanged, [ = ](float temp) {
checkTemperature(0x01, 0, temp);
ui->plotWidget->appendPoint(tr("Target Bed"), temp);
ui->plotWidget->update();
});
connect(&core->temperature(), &Temperature::extruderTemperatureChanged, [ = ](float temp) {
checkTemperature(0x02, 0, temp);
ui->plotWidget->appendPoint(tr("Actual Ext.1"), temp);
ui->plotWidget->update();
});
connect(&core->temperature(), &Temperature::extruderTargetTemperatureChanged, [ = ](float temp) {
checkTemperature(0x03, 0, temp);
ui->plotWidget->appendPoint(tr("Target Ext.1"), temp);
ui->plotWidget->update();
});
connect(ui->actionQuit, &QAction::triggered, this, &MainWindow::close);
connect(ui->actionShowDockTitles, &QAction::toggled, this, &MainWindow::toggleDockTitles);
+ connect(ui->actionAbout, &QAction::triggered, this, &MainWindow::about);
ui->menuView->insertAction(nullptr, ui->connectDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->tempControlsDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->commandDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->printDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->moveDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->tempTimelineDock->toggleViewAction());
ui->menuView->insertAction(nullptr, ui->logDock->toggleViewAction());
//more dock stuff.
setTabPosition(Qt::LeftDockWidgetArea, QTabWidget::North);
setTabPosition(Qt::RightDockWidgetArea, QTabWidget::North);
tabifyDockWidget(ui->moveDock, ui->tempControlsDock);
ui->moveDock->raise();
tabifyDockWidget(ui->connectDock, ui->printDock);
tabifyDockWidget(ui->connectDock, ui->commandDock);
ui->connectDock->raise();
setCentralWidget(nullptr);
}
void MainWindow::closeEvent(QCloseEvent *event)
{
core->close();
event->accept();
}
MainWindow::~MainWindow()
{
delete logFile;
delete ui;
}
QString MainWindow::getTime()
{
return QTime::currentTime().toString(QStringLiteral("hh:mm:ss:zzz"));
}
QString MainWindow::logHeader()
{
return QStringLiteral("[%1] ").arg(getTime());
}
QString MainWindow::rLogHeader()
{
return QStringLiteral("[%1]< ").arg(getTime());
}
QString MainWindow::sLogHeader()
{
return QStringLiteral("[%1]> ").arg(getTime());
}
void MainWindow::writeTempFile(QString text)
{
/*
A QTemporaryFile will always be opened in QIODevice::ReadWrite mode,
this allows easy access to the data in the file. This function will
return true upon success and will set the fileName() to the unique
filename used.
*/
logFile->open();
logFile->seek(logFile->size());
logFile->write(text.toLatin1());
logFile->putChar('\n');
logFile->close();
}
void MainWindow::addLog(QString msg)
{
QString message(logHeader() + msg);
ui->logTE->appendPlainText(message);
writeTempFile(message);
}
void MainWindow::addRLog(QString msg)
{
QString message(rLogHeader() + msg);
ui->logTE->appendPlainText(message);
writeTempFile(message);
}
void MainWindow::addSLog(QString msg)
{
QString message(sLogHeader() + msg);
ui->logTE->appendPlainText(message);
writeTempFile(message);
}
void MainWindow::checkReceivedCommand(const QByteArray &message)
{
addRLog(QString::fromUtf8(message));
}
void MainWindow::checkPushedCommands(QByteArray bmsg)
{
QString msg = QString::fromUtf8(bmsg);
QRegExp _newLine(QChar::fromLatin1('\n'));
QRegExp _return(QChar::fromLatin1('\r'));
msg.replace(_newLine, QStringLiteral("\\n"));
msg.replace(_return, QStringLiteral("\\r"));
addSLog(msg);
}
void MainWindow::checkTemperature(uint sensorType, uint number, uint temp)
{
QString msg;
switch (sensorType) {
case 0x00: // bed
msg = QString::fromLatin1("Bed Temperature ");
break;
case 0x01: // bed target
msg = QString::fromLatin1("Bed Target Temperature ");
break;
case 0x02: // extruder
msg = QString::fromLatin1("Extruder Temperature ");
break;
case 0x03: // extruder target
msg = QString::fromLatin1("Extruder Target Temperature ");
break;
case 0x04: // enclosure
msg = QString::fromLatin1("Enclosure Temperature ");
break;
case 0x05: // enclosure target
msg = QString::fromLatin1("Enclosure Target Temperature ");
break;
}
msg.append(QString::fromLatin1("[%1] : %2"));
msg = msg.arg(QString::number(number))
.arg(QString::number(temp));
addRLog(msg);
}
/**
* @brief MainWindow::locateSerialPort
* Locate all active serial ports on the computer and add to the list
* of serial ports
*/
void MainWindow::locateSerialPort(const QStringList &ports)
{
ui->serialPortCB->clear();
if (!ports.isEmpty()) {
ui->serialPortCB->addItems(ports);
addLog(tr("Found %1 Ports").arg(QString::number(ports.count())));
} else {
QString portError(tr("No available ports! Please connect a serial device to continue!"));
if (! ui->logTE->toPlainText().endsWith(portError)) {
addLog(portError);
}
}
}
void MainWindow::connectPBClicked()
{
if (core->state() == AtCore::DISCONNECTED) {
core->initSerial(ui->serialPortCB->currentText(), ui->baudRateLE->currentText().toInt());
connect(core, &AtCore::receivedMessage, this, &MainWindow::checkReceivedCommand);
connect(core->serial(), &SerialLayer::pushedCommand, this, &MainWindow::checkPushedCommands);
addLog(tr("Serial connected"));
ui->connectPB->setText(tr("Disconnect"));
if (core->state() == AtCore::CONNECTING) {
if (ui->pluginCB->currentText().contains(tr("Autodetect"))) {
addLog(tr("No plugin loaded !"));
addLog(tr("Requesting Firmware..."));
core->detectFirmware();
} else {
core->loadFirmwarePlugin(ui->pluginCB->currentText());
}
}
} else {
core->closeConnection();
core->setState(AtCore::DISCONNECTED);
addLog(tr("Disconnected"));
ui->connectPB->setText(tr("Connect"));
}
}
void MainWindow::sendPBClicked()
{
QString comm = ui->commandLE->text().toUpper();
core->pushCommand(comm);
ui->commandLE->clear();
}
void MainWindow::homeAllPBClicked()
{
addSLog(tr("Home All"));
core->home();
}
void MainWindow::homeXPBClicked()
{
addSLog(tr("Home X"));
core->home(AtCore::X);
}
void MainWindow::homeYPBClicked()
{
addSLog(tr("Home Y"));
core->home(AtCore::Y);
}
void MainWindow::homeZPBClicked()
{
addSLog(tr("Home Z"));
core->home(AtCore::Z);
}
void MainWindow::bedTempPBClicked()
{
if (ui->cb_andWait->isChecked()) {
addSLog(GCode::toString(GCode::M190));
} else {
addSLog(GCode::toString(GCode::M140));
}
core->setBedTemp(ui->bedTempSB->value(), ui->cb_andWait->isChecked());
}
void MainWindow::extTempPBClicked()
{
if (ui->cb_andWait->isChecked()) {
addSLog(GCode::toString(GCode::M109));
} else {
addSLog(GCode::toString(GCode::M104));
}
core->setExtruderTemp(ui->extTempSB->value(), ui->extTempSelCB->currentIndex(), ui->cb_andWait->isChecked());
}
void MainWindow::mvAxisPBClicked()
{
addSLog(GCode::toString(GCode::G1));
if (ui->mvAxisCB->currentIndex() == 0) {
core->move(AtCore::X, ui->mvAxisSB->value());
} else if (ui->mvAxisCB->currentIndex() == 1) {
core->move(AtCore::Y, ui->mvAxisSB->value());
} else if (ui->mvAxisCB->currentIndex() == 2) {
core->move(AtCore::Z, ui->mvAxisSB->value());
}
}
void MainWindow::fanSpeedPBClicked()
{
addSLog(GCode::toString(GCode::M106));
core->setFanSpeed(ui->fanSpeedSB->value(), ui->fanSpeedSelCB->currentIndex());
}
void MainWindow::printPBClicked()
{
QString fileName;
switch (core->state()) {
case AtCore::DISCONNECTED:
QMessageBox::information(this, tr("Error"), tr("Not Connected To a Printer"));
break;
case AtCore::CONNECTING:
QMessageBox::information(this, tr("Error"), tr(" A Firmware Plugin was not loaded!\n Please send the command M115 and let us know what your firmware returns, so we can improve our firmware detection. We have loaded the most common plugin \"repetier\" for you. You may try to print again after this message"));
ui->pluginCB->setCurrentText(QStringLiteral("repetier"));
break;
case AtCore::IDLE:
fileName = QFileDialog::getOpenFileName(this, tr("Select a file to print"), QDir::homePath(), QStringLiteral("*.gcode"));
if (fileName.isNull()) {
addLog(tr("No File Selected"));
} else {
addLog(tr("Print: %1").arg(fileName));
emit(printFile(fileName));
}
break;
case AtCore::BUSY:
core->pause(ui->postPauseLE->text());
break;
case AtCore::PAUSE:
core->resume();
break;
default:
qCDebug(TESTCLIENT_MAINWINDOW) << "ERROR / STOP unhandled.";
}
}
void MainWindow::saveLogPBClicked()
{
// Note that if a file with the name newName already exists, copy() returns false (i.e. QFile will not overwrite it).
QString fileName = QDir::homePath() + QChar::fromLatin1('/') + QFileInfo(logFile->fileName()).fileName() + QStringLiteral(".txt");
QString saveFileName = QFileDialog::getSaveFileName(this, tr("Save Log to file"), fileName);
QFile::copy(logFile->fileName(), saveFileName);
logFile->close();
}
void MainWindow::pluginCBChanged(QString currentText)
{
if (core->state() != AtCore::DISCONNECTED) {
if (!currentText.contains(tr("Autodetect"))) {
core->loadFirmwarePlugin(currentText);
} else {
core->detectFirmware();
}
}
}
void MainWindow::flowRatePBClicked()
{
core->setFlowRate(ui->flowRateSB->value());
}
void MainWindow::printerSpeedPBClicked()
{
core->setPrinterSpeed(ui->printerSpeedSB->value());
}
void MainWindow::printerStateChanged(AtCore::STATES state)
{
QString stateString;
switch (state) {
case AtCore::IDLE:
ui->printPB->setText(tr("Print File"));
stateString = QStringLiteral("Connected to ") + core->connectedPort();
break;
case AtCore::STARTPRINT:
stateString = QStringLiteral("START PRINT");
ui->printPB->setText(tr("Pause Print"));
ui->printLayout->setVisible(true);
printTime->start();
printTimer->start();
break;
case AtCore::FINISHEDPRINT:
stateString = QStringLiteral("Finished Print");
ui->printPB->setText(tr("Print File"));
ui->printLayout->setVisible(false);
printTimer->stop();
break;
case AtCore::PAUSE:
stateString = QStringLiteral("Paused");
ui->printPB->setText(tr("Resume Print"));
break;
case AtCore::BUSY:
stateString = QStringLiteral("Printing");
ui->printPB->setText(tr("Pause Print"));
break;
case AtCore::DISCONNECTED:
stateString = QStringLiteral("Not Connected");
ui->commandDock->setDisabled(true);
ui->moveDock->setDisabled(true);
ui->tempControlsDock->setDisabled(true);
ui->printDock->setDisabled(true);
break;
case AtCore::CONNECTING:
stateString = QStringLiteral("Connecting");
ui->commandDock->setDisabled(false);
ui->moveDock->setDisabled(false);
ui->tempControlsDock->setDisabled(false);
ui->printDock->setDisabled(false);
break;
case AtCore::STOP:
stateString = QStringLiteral("Stoping Print");
break;
case AtCore::ERRORSTATE:
stateString = QStringLiteral("Command ERROR");
break;
}
ui->lblState->setText(stateString);
}
void MainWindow::populateCBs()
{
// Extruders
for (int count = 0; count < core->extruderCount(); count++) {
ui->extTempSelCB->insertItem(count, tr("Extruder %1").arg(count));
}
// Fan
for (int count = 0; count < fanCount; count++) {
ui->fanSpeedSelCB->insertItem(count, tr("Fan %1 speed").arg(count));
}
}
void MainWindow::showMessage()
{
core->showMessage(ui->messageLE->text());
}
void MainWindow::updatePrintTime()
{
QTime temp(0, 0, 0);
ui->time->setText(temp.addMSecs(printTime->elapsed()).toString(QStringLiteral("hh:mm:ss")));
}
void MainWindow::printProgressChanged(int progress)
{
ui->printingProgress->setValue(progress);
if (progress > 0) {
QTime temp(0, 0, 0);
ui->timeLeft->setText(temp.addMSecs((100 - progress) * (printTime->elapsed() / progress)).toString(QStringLiteral("hh:mm:ss")));
} else {
ui->timeLeft->setText(QStringLiteral("??:??:??"));
}
}
void MainWindow::toggleDockTitles()
{
if (ui->actionShowDockTitles->isChecked()) {
delete ui->connectDock->titleBarWidget();
delete ui->logDock->titleBarWidget();
delete ui->tempTimelineDock->titleBarWidget();
delete ui->commandDock->titleBarWidget();
delete ui->moveDock->titleBarWidget();
delete ui->tempControlsDock->titleBarWidget();
delete ui->printDock->titleBarWidget();
} else {
ui->connectDock->setTitleBarWidget(new QWidget());
ui->logDock->setTitleBarWidget(new QWidget());
ui->tempTimelineDock->setTitleBarWidget(new QWidget());
ui->commandDock->setTitleBarWidget(new QWidget());
ui->moveDock->setTitleBarWidget(new QWidget());
ui->tempControlsDock->setTitleBarWidget(new QWidget());
ui->printDock->setTitleBarWidget(new QWidget());
}
}
+
+void MainWindow::about()
+{
+ About *aboutDialog = new About(this);
+ aboutDialog->exec();
+}
+
void MainWindow::axisControlClicked(QChar axis, int value)
{
core->setRelativePosition();
core->pushCommand(GCode::toCommand(GCode::G1, QStringLiteral("%1%2").arg(axis, QString::number(value))));
core->setAbsolutePosition();
}
diff --git a/testclient/mainwindow.h b/testclient/mainwindow.h
index 5f62d7e..62e4f7d 100644
--- a/testclient/mainwindow.h
+++ b/testclient/mainwindow.h
@@ -1,262 +1,267 @@
/* AtCore Test Client
Copyright (C) <2016>
Authors:
Patrick José Pereira
Lays Rodrigues
Chris Rizzitello
Tomaz Canabrava
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#pragma once
#include
#include
#include
#include "ui_mainwindow.h"
#include "atcore.h"
class SerialLayer;
class MainWindow: public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow() override;
public slots:
/**
* @brief Check received messages
*
*/
void checkReceivedCommand(const QByteArray &message);
/**
* @brief Check pushed message
*
* @param bmsg : Message
*/
void checkPushedCommands(QByteArray);
/**
* @brief Check temperature
*
* @param sensorType : type of sensor
* @param number : index of sensor
* @param temp : temperature
*/
void checkTemperature(uint sensorType, uint number, uint temp);
private slots:
//ButtonEvents
/**
* @brief axisControlClicked Used to catch the axis control.
* @param axis The Axis clicked on (X |Y |Z)
* @param value Distance Value
*/
void axisControlClicked(QChar axis, int value);
/**
* @brief the printing progress has changed
* @param progress: the new progress
*/
void printProgressChanged(int progress);
/**
* @brief Connect Button Clicked will connect or disconnect based on printer state
*/
void connectPBClicked();
/**
* @brief Send Command Clicked
*/
void sendPBClicked();
/**
* @brief Home All Clicked
*/
void homeAllPBClicked();
/**
* @brief Home X Axis Clicked
*/
void homeXPBClicked();
/**
* @brief Home Y Axis Clicked
*/
void homeYPBClicked();
/**
* @brief Home Z Axis Clicked
*/
void homeZPBClicked();
/**
* @brief Set Bed Temp Clicked
*/
void bedTempPBClicked();
/**
* @brief Set Extruder Temp Clicked
*/
void extTempPBClicked();
/**
* @brief Move Axis Clicked
*/
void mvAxisPBClicked();
/**
* @brief Set Fan Speed Clicked
*/
void fanSpeedPBClicked();
/**
* @brief Print Button Clicked, can also pause /resue print based on printer state
*/
void printPBClicked();
/**
* @brief Save the log file.
*/
void saveLogPBClicked();
/**
* @brief set printer speed clicked
*/
void printerSpeedPBClicked();
/**
* @brief lowRatePB has been clicked
*/
void flowRatePBClicked();
/**
* @brief printerStateChanged Catch and proccess printer state commands
* @param state: new printer state
*/
void printerStateChanged(AtCore::STATES state);
/**
* @brief showMessage show a message on the printers LCD
*/
void showMessage();
/**
* @brief Update the print Time
*/
void updatePrintTime();
/**
* @brief show/hide dock titlebars
*/
void toggleDockTitles();
+
+ /**
+ * @brief Show the about dialog
+ */
+ void about();
signals:
/**
* @brief printFile emit ready to print a file to atcore
* @param fileName : the file to print
*/
void printFile(const QString &fileName);
private:
Ui::MainWindow *ui;
AtCore *core;
QTemporaryFile *logFile;
QTime *printTime;
QTimer *printTimer;
// Define max number of fans
static int fanCount;
void closeEvent(QCloseEvent *event) override;
/**
* @brief Locate serial port
*
*/
void locateSerialPort(const QStringList &ports);
/**
* @brief Return string with actual time
*
* @return QString
*/
QString getTime();
/**
* @brief Append text in temporary file
*
* @param text
*/
void writeTempFile(QString text);
/**
* @brief Normal header
*
* @return QString
*/
QString logHeader();
/**
* @brief Header of type received
*
* @return QString
*/
QString rLogHeader();
/**
* @brief Header of type send
*
* @return QString
*/
QString sLogHeader();
/**
* @brief Add in logger normal type message
*
* @param msg: Message
*/
void addLog(QString msg);
/**
* @brief Add in logger received type message
*
* @param msg: Message
*/
void addRLog(QString msg);
/**
* @brief Add in logger send type message
*
* @param msg: Message
*/
void addSLog(QString msg);
/**
* @brief pluginCB index changed
*/
void pluginCBChanged(QString currentText);
/**
* @brief setupActions for KXMLGui
*/
void setupActions();
/**
* @brief Populate comboboxes
*/
void populateCBs();
};
diff --git a/testclient/mainwindow.ui b/testclient/mainwindow.ui
index a918908..8219979 100644
--- a/testclient/mainwindow.ui
+++ b/testclient/mainwindow.ui
@@ -1,947 +1,962 @@
MainWindow
0
0
0
0
AtCore - Test Client
6
418
801
46
100
0
0
0
0
0
-
AtCoreState:
-
Not Connected
-
Qt::Horizontal
QSizePolicy::Expanding
40
20
-
0
0
QFrame::StyledPanel
QFrame::Raised
0
0
0
0
-
true
0
-
Stop Print Job
..
-
<html><head/><body><p>Elapsed Time</p></body></html>
00:00:00
Qt::AlignCenter
-
/
-
<html><head/><body><p>Remaining Time</p></body></html>
00:00:00
Qt::AlignCenter
false
10
0
473
243
0
0
&Print
-
-
Print File
-
0
0
Emergency Stop
-
-
On Pause:
-
G91,G0 Z1,G90,G1 X0 Y195
-
-
0
0
Printer Speed
-
%
300
100
-
0
0
Set
-
-
0
0
Flow Rate
-
%
300
100
-
0
0
Set
false
0
240
485
146
0
0
Comma&nds
-
-
Send Command
-
Send
-
-
Show Message
-
Send
0
0
Temperat&ure Timeline
2
-
0
0
0
0
0
0
&Connection Settings
1
-
0
0
0
0
0
0
-
-
0
0
Port:
-
-
-
0
0
Baud Rate:
-
true
-
-
Use Plugin
-
0
0
-
0
0
Connect
0
0
Session &Log
2
-
0
0
0
0
0
0
-
true
0
0
true
1000
-
Save Session Log
..
Qt::NoContextMenu
false
false
0
0
&Movement
1
-
-
Home All
-
Home X
-
Home Y
-
Home Z
-
-
0
0
0
0
-
Move X Axis to
-
Move Y Axis to
-
Move Z Axis to
-
0
0
0
0
Qt::AlignCenter
0
200.000000000000000
-
0
0
Go
false
0
0
&Temperatures
1
-
-
-
- Wait Untill Temperature Stablizes
-
-
+
+
+ Wait Untill Temperature Stablizes
+
+
-
-
0
0
Bed Temp
-
Qt::AlignCenter
°C
0
100.000000000000000
-
Set
-
-
0
0
-
Qt::AlignCenter
°C
0
275.000000000000000
-
Set
-
-
0
0
-
Qt::AlignCenter
%
100
-
0
0
Set
&Quit
true
true
&Show Dock Titles
+
+
+ About
+
+
+ F1
+
+
PlotWidget
QWidget
1
diff --git a/testclient/widgets/CMakeLists.txt b/testclient/widgets/CMakeLists.txt
index e45ac25..acec11b 100644
--- a/testclient/widgets/CMakeLists.txt
+++ b/testclient/widgets/CMakeLists.txt
@@ -1,10 +1,11 @@
set(widgets_SRCS
plotwidget.cpp
axiscontrol.cpp
+ about.cpp
)
add_library(AtCoreTestWidgets STATIC ${widgets_SRCS})
if (APPLE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++11")
endif()
target_link_libraries(AtCoreTestWidgets Qt5::Core Qt5::Widgets Qt5::Charts)
diff --git a/testclient/widgets/about.cpp b/testclient/widgets/about.cpp
new file mode 100644
index 0000000..020db1d
--- /dev/null
+++ b/testclient/widgets/about.cpp
@@ -0,0 +1,69 @@
+/* AtCore Test Client
+ Copyright (C) <2017>
+
+ Authors:
+ Chris Rizzitello
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "about.h"
+
+About::About(QWidget *parent) :
+ QDialog(parent)
+{
+ setWindowTitle(QStringLiteral("About Atcore"));
+ setWindowIcon(QIcon::fromTheme(QStringLiteral("help-about"), style()->standardIcon(QStyle::SP_MessageBoxInformation)));
+
+ QLabel *lbl_version = new QLabel(QString::fromLatin1("Version: %1").arg(QCoreApplication::applicationVersion()));
+ QLabel *lbl_git_version = new QLabel(QString::fromLatin1("GitID: %1").arg(QStringLiteral("GIDIDHERE")));
+ QLabel *lbl_qt_version = new QLabel(QString::fromLatin1("Using Qt: %1").arg(QString::fromLatin1(qVersion())));
+ QLabel *lbl_authors = new QLabel(QStringLiteral("Authors:\n Chris Rizzitello \n Patrick José Pereira \n Lays Rodrigues \n Tomaz Canabrava "));
+
+ QLabel *lbl_icon = new QLabel();
+ lbl_icon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ lbl_icon->setScaledContents(true);
+ lbl_icon->setPixmap(QPixmap(QStringLiteral(":/icon/atcore")));
+
+ QPushButton *btn_close = new QPushButton(QStringLiteral("&Close"));
+ connect(btn_close, &QPushButton::clicked, this, &QDialog::close);
+
+ QVBoxLayout *versionInfo = new QVBoxLayout;
+ versionInfo->addWidget(lbl_version);
+ versionInfo->addWidget(lbl_git_version);
+ versionInfo->addWidget(lbl_qt_version);
+
+ QVBoxLayout *topLayout = new QVBoxLayout;
+ topLayout->setContentsMargins(0, 0, 0, 0);
+ topLayout->addWidget(lbl_icon);
+ topLayout->addItem(versionInfo);
+
+ QVBoxLayout *mainLayout = new QVBoxLayout;
+ mainLayout->addItem(topLayout);
+ mainLayout->addWidget(lbl_authors);
+ mainLayout->addWidget(btn_close);
+
+ setLayout(mainLayout);
+}
+
+About::~About()
+{
+
+}
diff --git a/testclient/widgets/about.h b/testclient/widgets/about.h
new file mode 100644
index 0000000..f012406
--- /dev/null
+++ b/testclient/widgets/about.h
@@ -0,0 +1,33 @@
+/* AtCore Test Client
+ Copyright (C) <2017>
+
+ Authors:
+ Chris Rizzitello
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifndef ABOUT_H
+#define ABOUT_H
+
+#include
+
+class About : public QDialog
+{
+ Q_OBJECT
+public:
+ explicit About(QWidget *parent = 0);
+ ~About();
+};
+#endif // ABOUT_H