From 263a88ce24291b7b1812a37dc5a7f3fced02086d Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Fri, 8 Dec 2023 13:09:19 +0100 Subject: [PATCH] Update current devl-status. --- interfaces.h | 53 +++++++++++++++------ mainwindow.cpp | 9 ++++ plugins/interfaces.h | 53 +++++++++++++++------ update.cpp | 108 ++++++++++++++++++++++++++++--------------- worker.cpp | 30 ++++++++---- 5 files changed, 180 insertions(+), 73 deletions(-) diff --git a/interfaces.h b/interfaces.h index 11cd32c..b072f18 100755 --- a/interfaces.h +++ b/interfaces.h @@ -399,6 +399,7 @@ struct T_bna }; class hwapi; +class DownloadThread; class hwinf { @@ -2276,33 +2277,59 @@ public: // download device controller - virtual void dcDownloadStart() {} - virtual void dcDownloadRequest(QString const &fileToDownload) { - Q_UNUSED(fileToDownload); + virtual bool dcDownloadRequest(QString const &fileToDownload) const { + Q_UNUSED(fileToDownload); + return false; } virtual bool dcDownloadRequested() const { return false; } - virtual void dcDownloadResetRequest() {} + virtual bool dcDownloadResetRequest() const { return false; } + virtual bool dcDownloadRequestAck() const { return false; } + virtual bool dcDownloadRunning() const { return false; } + virtual bool dcDownloadFinished() { return false; } + + virtual bool dcDownloadReportStart() const { return false; } + virtual bool dcDownloadReportRunning() const { return true; } + virtual bool dcDownloadReportFinished() { return true; } + + virtual bool dcDownloadThreadStart() { return false; } + virtual bool dcDownloadThreadRunning() const { return true; } + virtual void dcDownloadThreadFinalize(DownloadThread *) {} + virtual bool dcDownloadThreadFinished() const { return true; } + virtual bool dcDownloadReportThreadStart() { return false; } + virtual bool dcDownloadReportThreadRunning() const { return true; } + virtual void dcDownloadReportThreadFinalize() {} + virtual void dcDownloadReportThreadQuit() {} + virtual bool dcDownloadReportThreadFinished() const { return true; } + + virtual QString dcDownloadFileName() const { return ""; } - virtual void dcDownloadReportStart() {} + virtual bool dcDownloadSetRequested(bool requested) { + Q_UNUSED(requested); return false; + } + virtual bool dcDownloadSetRunning(bool running) { + Q_UNUSED(running); return false; + } + virtual bool dcDownloadSetFinished(bool finished) { + Q_UNUSED(finished); return false; + } virtual void dcDownloadSetTotalBlockNumber(uint16_t totalBlockNumber) { Q_UNUSED(totalBlockNumber); } virtual void dcDownloadSetCurrentBlockNumber(uint16_t currentBlockNumber) { Q_UNUSED(currentBlockNumber); } + virtual bool dcDownloadGetRequested() const { return false; } + virtual bool dcDownloadGetRunning() const { return false; } + virtual bool dcDownloadGetFinished() const { return false; } virtual uint16_t dcDownloadGetTotalBlockNumber() const { return 0; } virtual uint16_t dcDownloadGetCurrentBlockNumber() const { return 0; } - virtual bool dcDownloadStarted() const { return false; } - virtual bool dcDownloadRunning() const { return false; } - virtual bool dcDownloadFinished() const { return false; } - - virtual hwapi *getAPI() { return nullptr; } + virtual QObject const *getAPI() { return nullptr; } signals: // for download - void hwapi_reportDCDownloadStatus(QString const &) const; - void hwapi_reportDCDownloadSuccess(QString const &) const; - void hwapi_reportDCDownloadFailure(QString const &) const; + void hwapi_reportDCDownloadStatus(QString const&) const; + void hwapi_reportDCDownloadSuccess(QString const&) const; + void hwapi_reportDCDownloadFailure(QString const&) const; // NOTE: declaring a "pure virtual" "signal" should be an error and thus not valid. void hwapi_templatePrintFinished_OK() const; diff --git a/mainwindow.cpp b/mainwindow.cpp index 89f1e09..32d65fe 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -156,6 +156,15 @@ void MainWindow::onQuit() { m_exitTimer->stop(); int errorCode = 0; + Update *update = m_worker->update(); + if (update) { + hwinf *hw = update->hw(); + if (hw) { + hw->dcDownloadReportFinished(); + hw->dcDownloadFinished(); + } + } + qCritical() << QString("ON QUIT: CURRENT STEP %1") .arg(m_worker->getSmap()[m_worker->currentStep()]); diff --git a/plugins/interfaces.h b/plugins/interfaces.h index 11cd32c..b072f18 100755 --- a/plugins/interfaces.h +++ b/plugins/interfaces.h @@ -399,6 +399,7 @@ struct T_bna }; class hwapi; +class DownloadThread; class hwinf { @@ -2276,33 +2277,59 @@ public: // download device controller - virtual void dcDownloadStart() {} - virtual void dcDownloadRequest(QString const &fileToDownload) { - Q_UNUSED(fileToDownload); + virtual bool dcDownloadRequest(QString const &fileToDownload) const { + Q_UNUSED(fileToDownload); + return false; } virtual bool dcDownloadRequested() const { return false; } - virtual void dcDownloadResetRequest() {} + virtual bool dcDownloadResetRequest() const { return false; } + virtual bool dcDownloadRequestAck() const { return false; } + virtual bool dcDownloadRunning() const { return false; } + virtual bool dcDownloadFinished() { return false; } + + virtual bool dcDownloadReportStart() const { return false; } + virtual bool dcDownloadReportRunning() const { return true; } + virtual bool dcDownloadReportFinished() { return true; } + + virtual bool dcDownloadThreadStart() { return false; } + virtual bool dcDownloadThreadRunning() const { return true; } + virtual void dcDownloadThreadFinalize(DownloadThread *) {} + virtual bool dcDownloadThreadFinished() const { return true; } + virtual bool dcDownloadReportThreadStart() { return false; } + virtual bool dcDownloadReportThreadRunning() const { return true; } + virtual void dcDownloadReportThreadFinalize() {} + virtual void dcDownloadReportThreadQuit() {} + virtual bool dcDownloadReportThreadFinished() const { return true; } + + virtual QString dcDownloadFileName() const { return ""; } - virtual void dcDownloadReportStart() {} + virtual bool dcDownloadSetRequested(bool requested) { + Q_UNUSED(requested); return false; + } + virtual bool dcDownloadSetRunning(bool running) { + Q_UNUSED(running); return false; + } + virtual bool dcDownloadSetFinished(bool finished) { + Q_UNUSED(finished); return false; + } virtual void dcDownloadSetTotalBlockNumber(uint16_t totalBlockNumber) { Q_UNUSED(totalBlockNumber); } virtual void dcDownloadSetCurrentBlockNumber(uint16_t currentBlockNumber) { Q_UNUSED(currentBlockNumber); } + virtual bool dcDownloadGetRequested() const { return false; } + virtual bool dcDownloadGetRunning() const { return false; } + virtual bool dcDownloadGetFinished() const { return false; } virtual uint16_t dcDownloadGetTotalBlockNumber() const { return 0; } virtual uint16_t dcDownloadGetCurrentBlockNumber() const { return 0; } - virtual bool dcDownloadStarted() const { return false; } - virtual bool dcDownloadRunning() const { return false; } - virtual bool dcDownloadFinished() const { return false; } - - virtual hwapi *getAPI() { return nullptr; } + virtual QObject const *getAPI() { return nullptr; } signals: // for download - void hwapi_reportDCDownloadStatus(QString const &) const; - void hwapi_reportDCDownloadSuccess(QString const &) const; - void hwapi_reportDCDownloadFailure(QString const &) const; + void hwapi_reportDCDownloadStatus(QString const&) const; + void hwapi_reportDCDownloadSuccess(QString const&) const; + void hwapi_reportDCDownloadFailure(QString const&) const; // NOTE: declaring a "pure virtual" "signal" should be an error and thus not valid. void hwapi_templatePrintFinished_OK() const; diff --git a/update.cpp b/update.cpp index c426835..5af45f2 100644 --- a/update.cpp +++ b/update.cpp @@ -3,7 +3,6 @@ #include "utils.h" #include "update_dc_event.h" #include "mainwindow.h" -#include "plugins/interfaces.h" #include #include @@ -19,6 +18,8 @@ #include "unistd.h" #endif +#include "plugins/interfaces.h" + #include #include #include @@ -118,7 +119,6 @@ Update::Update(Worker *worker, , m_dryRun(dryRun) , m_sys_areDCdataValid(false) { -#if 0 int tries = 20; while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) { // must deliver 'true', only then are all data from hwapi valid @@ -128,39 +128,35 @@ Update::Update(Worker *worker, m_hw->dc_autoRequest(true); QThread::msleep(500); } -#endif - - QObject const *obj = (QObject const *)(m_hw->getAPI()); - - if (connect(obj, - SIGNAL(hwapi_reportDCDownloadStatus(QString const&)), this, - SLOT(onReportDCDownloadStatus(QString const &)))) { - qCritical() << "connect ok"; - } - connect(obj, - SIGNAL(hwapi_reportDCDownloadSuccess(QString const&)), this, - SLOT(onReportDCDownloadSuccess(QString const &))); - connect(obj, - SIGNAL(hwapi_reportDCDownloadFailure(QString const &)), this, - SLOT(onReportDCDownloadFailure(QString const &))); qCritical() << "UPDATE: m_sys_areDCDataValid ..." << m_sys_areDCdataValid; - //qInfo() << "UPDATE: m_serialInterface ..." << m_serialInterface; - //qInfo() << "UPDATE: m_baudrate ..." << m_baudrate; - //qInfo() << "UPDATE: m_customerRepository ..." << m_customerRepository; - //qInfo() << "UPDATE: m_customerNr ..........." << m_customerNrStr; - //qInfo() << "UPDATE: m_branchName ..........." << m_branchName; - //qInfo() << "UPDATE: m_pluginName ..........." << m_pluginName; - //qInfo() << "UPDATE: m_workingDirectory ....." << m_workingDir; + QObject const *obj = m_hw->getAPI(); + // QObject const *obj = (QObject const *)(hw); + + if (!connect(obj, + SIGNAL(hwapi_reportDCDownloadStatus(QString const&)), this, + SLOT(onReportDCDownloadStatus(QString const &)))) { + qCritical() << "ERROR connect() to onReportDCDownloadStatus() failed"; + } + if (!connect(obj, + SIGNAL(hwapi_reportDCDownloadSuccess(QString const&)), this, + SLOT(onReportDCDownloadSuccess(QString const &)))) { + qCritical() << "ERROR connect() to onReportDCDownloadSuccess() failed"; + } + if (!connect(obj, + SIGNAL(hwapi_reportDCDownloadFailure(QString const &)), this, + SLOT(onReportDCDownloadFailure(QString const &)))) { + qCritical() << "ERROR connect() to onReportDCDownloadFailure() failed"; + } } Update::~Update() { } + void Update::onReportDCDownloadStatus(QString const &status) { - qCritical() << "status" << status; - //emit m_worker->showStatusMessage("", status); + emit m_worker->showStatusMessage("DL", status); } void Update::onReportDCDownloadSuccess(QString const &msg) { @@ -171,6 +167,8 @@ void Update::onReportDCDownloadFailure(QString const &errorMsg) { qCritical() << "msg" << errorMsg; } + + // br is a index into a table, used for historical reasons. bool Update::openSerial(int br, QString baudrate, QString comPort) const { qDebug() << "opening serial" << br << baudrate << comPort << "..."; @@ -524,27 +522,63 @@ QStringList Update::getDcSoftAndHardWareVersion() { } bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) { - //if (m_sys_areDCdataValid == false) { - // qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED"; - // return false; - //} + if (m_sys_areDCdataValid == false) { + qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED"; + return false; + } bool res = false; + bool dcDownloadPossible = true; + QList::const_iterator it; for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) { m_worker->startProgressLoop(); - QString const &fToWorkOn = QDir::cleanPath(QString("/tmp") + QDir::separator() + it->trimmed()); - //QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed()); + QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed()); static const QRegularExpression version("^.*dc2c[.][0-9]{1,2}[.][0-9]{1,2}[.]bin.*$"); - if (fToWorkOn.contains(version)) { - m_hw->dcDownloadRequest(fToWorkOn); - m_hw->dcDownloadReportStart(); // start reporting thread + qCritical() << "ABOUT TO START REPORTING THREAD (1)" << fToWorkOn; + if (fToWorkOn.contains(version) && dcDownloadPossible) { + // download for dc possible only once + dcDownloadPossible = false; + m_hw->dcDownloadRequest(fToWorkOn); // initiate download process + + // test + m_hw->dcDownloadThreadStart(); + + if (!m_hw->dcDownloadRunning()) { // may take some time + qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ + << QString("line=%1 DOWNLOAD NOT RUNNING").arg(__LINE__); + continue; // wait for reporting thread to start + } + + if (!m_hw->dcDownloadReportThreadStart()) { // may take some time + qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ + << QString("line=%1 REPORT THREAD NOT RUNNING").arg(__LINE__); + continue; // wait for reporting thread to start + } + + if (!m_hw->dcDownloadReportRunning()) { // may take some time + qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ + << QString("line=%1 DOWNLOAD REPORT NOT RUNNING").arg(__LINE__); + continue; // reporting events from download thread + } + + if (!m_hw->dcDownloadReportFinished()) { // may take some time + qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ + << QString("line=%1 DOWNLOAD REPORT THREAD DID NOT FINISH").arg(__LINE__); + m_hw->dcDownloadReportThreadQuit(); + continue; // wait for download thread to finish + } + + qCritical() << QDateTime::currentDateTime() << __PRETTY_FUNCTION__ + << QString("line=%1 DOWNLOAD SUCCESS").arg(__LINE__); bool updateBinaryRes = true; - // CONSOLE() + + // CONSOLE() +#if 0 m_hw->dc_autoRequest(false);// default: turn auto-request setting off QThread::sleep(1); // wait to be sure that there are no more // commands sent to dc-hardware @@ -573,7 +607,7 @@ bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) { qInfo() << "dc-firmware-version (NOT UPDATED)" << versions[1]; } } - +#endif res = updateBinaryRes; } else if (fToWorkOn.contains("DC2C_print", Qt::CaseInsensitive) diff --git a/worker.cpp b/worker.cpp index c8dd4ce..d12afa0 100644 --- a/worker.cpp +++ b/worker.cpp @@ -157,7 +157,14 @@ Worker::Worker(int customerNr, , m_updateProcessRunning(true) , m_mainWindow(nullptr) /* contains plugin */ //, m_withoutIsmasDirectPort(true) /* useful for testing */ { - , m_withoutIsmasDirectPort(false) /* useful for testing */ { + , m_withoutIsmasDirectPort(false) /* useful for testing */ + // IMPORTANT: allocate m_update here, otherwise the connects() inside of + // Update might not work: keep in mind that worker (this) is a thread without + // an own event-loop. + , m_update(new Update(this, + QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr), + m_customerNrStr, m_branchName, m_pluginDir, + m_pluginName, m_workingDirectory)) { // TODO: turn object into singleton instance = this; @@ -166,9 +173,15 @@ Worker::Worker(int customerNr, QDir::setCurrent(m_workingDirectory); m_apismVersion = getAPISMYoctoVersion(); + } Worker::~Worker() { + if (m_update) { + qCritical() << "DELETE UPDATE"; + delete m_update; + m_update = nullptr; + } } void Worker::displayProgressInMainWindow(int progress) { @@ -819,15 +832,12 @@ bool Worker::downloadFilesToPSAHardware() { if (computeFilesToDownload()) { CONSOLE(m_filesToDownload) << UPDATE_STEP::FILES_TO_DOWNLOAD; - Update update(this, - QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr), - m_customerNrStr, - m_branchName, - m_pluginDir, - m_pluginName, - m_workingDirectory); + //m_update = new Update(this, + // QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr), + // m_customerNrStr, m_branchName, m_pluginDir, + // m_pluginName, m_workingDirectory); - return update.doUpdate(m_displayIndex, m_filesToDownload); + return m_update->doUpdate(m_displayIndex, m_filesToDownload); } else { CONSOLE(QStringList("NO FILES TO DOWNLOAD TO PSA-HW")) << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE; setProgress(_DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE); @@ -847,7 +857,7 @@ bool Worker::syncCustomerRepositoryAndFS() { QStringList() << "-c" << "mkdir -p /etc/psa_config /etc/dc /etc/psa_tariff")) { qCritical() << "COULD NOT EXECUTE '" << md.command() << "' exitCode=(" << md.exitCode() << ")"; } - QString const params("-vvv " + QString const params("-v " "--recursive " "--progress " "--checksum "