diff --git a/src/core/atcore.cpp b/src/core/atcore.cpp --- a/src/core/atcore.cpp +++ b/src/core/atcore.cpp @@ -333,15 +333,18 @@ } //Start a print job. setState(AtCore::STARTPRINT); - if (sdPrint) { - //Printing from the sd card requires us to send some M commands. - pushCommand(GCode::toCommand(GCode::M23, fileName)); - d->sdCardFileName = fileName; - pushCommand(GCode::toCommand(GCode::M24)); - setState(AtCore::BUSY); - d->sdCardPrinting = true; - connect(d->tempTimer, &QTimer::timeout, this, &AtCore::sdCardPrintStatus); - return; + //Only try to print from Sd if the firmware has support for sd cards + if (firmwarePlugin()->isSdSupported()) { + if (sdPrint) { + //Printing from the sd card requires us to send some M commands. + pushCommand(GCode::toCommand(GCode::M23, fileName)); + d->sdCardFileName = fileName; + pushCommand(GCode::toCommand(GCode::M24)); + setState(AtCore::BUSY); + d->sdCardPrinting = true; + connect(d->tempTimer, &QTimer::timeout, this, &AtCore::sdCardPrintStatus); + return; + } } //Process the gcode with a printThread. //The Thread processes the gcode without freezing the libary. diff --git a/src/core/ifirmware.h b/src/core/ifirmware.h --- a/src/core/ifirmware.h +++ b/src/core/ifirmware.h @@ -41,11 +41,18 @@ { Q_OBJECT Q_PROPERTY(QString name READ name) + Q_PROPERTY(bool sdSupport READ isSdSupported) public: IFirmware(); void init(AtCore *parent); ~IFirmware() override; + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const = 0; + /** * @brief Virtual name to be reimplemnted by Firmware plugin * diff --git a/src/plugins/aprinterplugin.h b/src/plugins/aprinterplugin.h --- a/src/plugins/aprinterplugin.h +++ b/src/plugins/aprinterplugin.h @@ -43,6 +43,12 @@ */ AprinterPlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Aprinter diff --git a/src/plugins/aprinterplugin.cpp b/src/plugins/aprinterplugin.cpp --- a/src/plugins/aprinterplugin.cpp +++ b/src/plugins/aprinterplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Aprinter"); } +bool AprinterPlugin::isSdSupported() const +{ + return false; +} + AprinterPlugin::AprinterPlugin() { qCDebug(APRINTER_PLUGIN) << name() << " plugin loaded!"; diff --git a/src/plugins/grblplugin.h b/src/plugins/grblplugin.h --- a/src/plugins/grblplugin.h +++ b/src/plugins/grblplugin.h @@ -50,15 +50,21 @@ QString name() const override; /** - * @brief Grbl does not return anything on command execution - * @param lastMessage: last message from printer + * @brief sdSupport + * @return True if plugins supports sd cards */ - void validateCommand(const QString &lastMessage) override; + bool isSdSupported() const override; /** * @brief Translate common commands to firmware specific command. * @param command: command to translate * @return firmware specific translated command */ QByteArray translate(const QString &command) override; + + /** + * @brief Grbl does not return anything on command execution + * @param lastMessage: last message from printer + */ + void validateCommand(const QString &lastMessage) override; }; diff --git a/src/plugins/grblplugin.cpp b/src/plugins/grblplugin.cpp --- a/src/plugins/grblplugin.cpp +++ b/src/plugins/grblplugin.cpp @@ -39,6 +39,11 @@ qCDebug(GRBL_PLUGIN) << name() << " plugin loaded!"; } +bool GrblPlugin::isSdSupported() const +{ + return false; +} + void GrblPlugin::validateCommand(const QString &lastMessage) { if (lastMessage.contains(QStringLiteral("ok"))) { diff --git a/src/plugins/marlinplugin.h b/src/plugins/marlinplugin.h --- a/src/plugins/marlinplugin.h +++ b/src/plugins/marlinplugin.h @@ -43,6 +43,12 @@ */ MarlinPlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Marlin diff --git a/src/plugins/marlinplugin.cpp b/src/plugins/marlinplugin.cpp --- a/src/plugins/marlinplugin.cpp +++ b/src/plugins/marlinplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Marlin"); } +bool MarlinPlugin::isSdSupported() const +{ + return true; +} + MarlinPlugin::MarlinPlugin() { qCDebug(MARLIN_PLUGIN) << name() << " plugin loaded!"; @@ -61,6 +66,14 @@ core()->clearSdCardFileList(); core()->setReadingSdCardList(true); } else if (lastMessage.contains(QStringLiteral("SD printing byte"))) { + if (core()->state() != AtCore::BUSY) { + //This should only happen if Attached to an Sd printing machine. + //Just tell the client were starting a job like normal. + //For this to work the client should check if sdCardPrintStatus() + //Upon the Connection to a known firmware with sdSupport + core()->setState(AtCore::STARTPRINT); + core()->setState(AtCore::BUSY); + } QString temp = lastMessage; temp.replace(QStringLiteral("SD printing byte"), QString()); qlonglong total = temp.mid(temp.lastIndexOf(QChar::fromLatin1('/')) + 1, temp.length() - temp.lastIndexOf(QChar::fromLatin1('/'))).toLongLong(); diff --git a/src/plugins/repetierplugin.h b/src/plugins/repetierplugin.h --- a/src/plugins/repetierplugin.h +++ b/src/plugins/repetierplugin.h @@ -43,6 +43,12 @@ */ RepetierPlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Repetier diff --git a/src/plugins/repetierplugin.cpp b/src/plugins/repetierplugin.cpp --- a/src/plugins/repetierplugin.cpp +++ b/src/plugins/repetierplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Repetier"); } +bool RepetierPlugin::isSdSupported() const +{ + return true; +} + RepetierPlugin::RepetierPlugin() { qCDebug(REPETIER_PLUGIN) << name() << " plugin loaded!"; @@ -63,6 +68,18 @@ core()->setReadingSdCardList(true); core()->clearSdCardFileList(); } else if (lastMessage.contains(QStringLiteral("SD printing byte"))) { + if (lastMessage.contains(QStringLiteral("SD printing byte 0/0"))) { + //not printing a file + return; + } + if (core()->state() != AtCore::BUSY) { + //This should only happen if Attached to an Sd printing machine. + //Just tell the client were starting a job like normal. + //For this to work the client should check if sdCardPrintStatus() + //Upon the Connection to a known firmware with sdSupport + core()->setState(AtCore::STARTPRINT); + core()->setState(AtCore::BUSY); + } QString temp = lastMessage; temp.replace(QStringLiteral("SD printing byte"), QString()); qlonglong total = temp.mid(temp.lastIndexOf(QChar::fromLatin1('/')) + 1, temp.length() - temp.lastIndexOf(QChar::fromLatin1('/'))).toLongLong(); diff --git a/src/plugins/smoothieplugin.h b/src/plugins/smoothieplugin.h --- a/src/plugins/smoothieplugin.h +++ b/src/plugins/smoothieplugin.h @@ -43,6 +43,12 @@ */ SmoothiePlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Smoothie diff --git a/src/plugins/smoothieplugin.cpp b/src/plugins/smoothieplugin.cpp --- a/src/plugins/smoothieplugin.cpp +++ b/src/plugins/smoothieplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Smoothie"); } +bool SmoothiePlugin::isSdSupported() const +{ + return false; +} + SmoothiePlugin::SmoothiePlugin() { qCDebug(SMOOTHIE_PLUGIN) << name() << " plugin loaded!"; diff --git a/src/plugins/sprinterplugin.h b/src/plugins/sprinterplugin.h --- a/src/plugins/sprinterplugin.h +++ b/src/plugins/sprinterplugin.h @@ -43,9 +43,16 @@ */ SprinterPlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Sprinter */ QString name() const override; + }; diff --git a/src/plugins/sprinterplugin.cpp b/src/plugins/sprinterplugin.cpp --- a/src/plugins/sprinterplugin.cpp +++ b/src/plugins/sprinterplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Sprinter"); } +bool SprinterPlugin::isSdSupported() const +{ + return false; +} + SprinterPlugin::SprinterPlugin() { qCDebug(SPRINTER_PLUGIN) << name() << " plugin loaded!"; diff --git a/src/plugins/teacupplugin.h b/src/plugins/teacupplugin.h --- a/src/plugins/teacupplugin.h +++ b/src/plugins/teacupplugin.h @@ -43,6 +43,12 @@ */ TeacupPlugin(); + /** + * @brief Check for plugin support of sd cards. + * @return True if firmware plugin supports sd cards. + */ + virtual bool isSdSupported() const override; + /** * @brief Return Plugin name * @return Teacup diff --git a/src/plugins/teacupplugin.cpp b/src/plugins/teacupplugin.cpp --- a/src/plugins/teacupplugin.cpp +++ b/src/plugins/teacupplugin.cpp @@ -35,6 +35,11 @@ return QStringLiteral("Teacup"); } +bool TeacupPlugin::isSdSupported() const +{ + return false; +} + TeacupPlugin::TeacupPlugin() { qCDebug(TEACUP_PLUGIN) << name() << " plugin loaded!"; diff --git a/testclient/mainwindow.cpp b/testclient/mainwindow.cpp --- a/testclient/mainwindow.cpp +++ b/testclient/mainwindow.cpp @@ -474,6 +474,7 @@ if (core->state() != AtCore::DISCONNECTED) { if (!currentText.contains(tr("Autodetect"))) { core->loadFirmwarePlugin(currentText); + sdDock->setVisible(core->firmwarePlugin()->isSdSupported()); } } } @@ -485,6 +486,7 @@ case AtCore::IDLE: printWidget->setPrintText(tr("Print File")); stateString = tr("Connected to ") + core->connectedPort(); + sdDock->setVisible(core->firmwarePlugin()->isSdSupported()); break; case AtCore::STARTPRINT: