Compare commits

..

28 Commits

Author SHA1 Message Date
990d257b09 Make sure the dc-data are vaild: set again the auto-request flag inside the CA-plugin.w 2023-11-07 09:33:42 +01:00
dfbad69ab1 Add some comments. Set version to 1.3.15. Removed worker_thread.h/.cpp. 2023-11-07 09:24:32 +01:00
5f0c86ba19 Minor: removed obsolete test-code. 2023-11-07 09:23:43 +01:00
3588b25e65 Removed any references to CA-plugin from MainWindow. 2023-11-07 09:18:04 +01:00
1f8b88b2b6 Update-object now proper memeber of worker-thread.w 2023-11-07 09:14:49 +01:00
0050ea35d0 Update to new interfaces.h 2023-11-07 09:13:15 +01:00
7e4c138d1b Fixed getDCVersion() as part of turning worker-object into its own
thread.
2023-11-07 09:12:17 +01:00
685568d4f6 Call execOpkgCommands(0 and downloadTpPSAHardware() helpers. 2023-11-07 09:11:42 +01:00
14b4c035da Add computeFilesToUpdate() and downloadFilesToPSA() helper functions. 2023-11-07 09:10:45 +01:00
90de2f415e Add new members to worker-class. 2023-11-07 09:10:01 +01:00
3cc71cb69b Minor: remove obsolete code. 2023-11-07 09:09:26 +01:00
fef7533d00 Minor: replace APPLY_... with DOWNLOAD... enum-variables. 2023-11-07 09:08:33 +01:00
e93058cc6b Turn worker-object into a thread. Don't do a moveToThread() anymore. 2023-11-07 09:07:08 +01:00
e65387aa60 Turned worker-object into a thread 2023-11-07 09:04:05 +01:00
904fa0374b Minor: removed empty line 2023-11-07 09:00:25 +01:00
4bf1bbe81f Removed references to update and ca-plugin.w 2023-11-06 16:23:43 +01:00
3ccdcbae51 Removed generation of upodate-object. This will be donw inside
worker(-thread), and only when it is really needed, i.e. when there
are json-files to be updated (or a deveice-controller).
2023-11-06 16:20:27 +01:00
8c50e6cf59 Added command-line option no-psa-hardware-update (future use for
multipass).
2023-11-06 16:19:36 +01:00
7e69846169 Minor: removed obsolete code (commented out). 2023-11-06 16:15:31 +01:00
34c55c576c Use new masterlib. NOTE: furture versions have to use the slave lib. 2023-11-03 13:50:22 +01:00
7c2c4d4b80 Use new interface file. 2023-11-03 13:49:56 +01:00
f9f698fd15 Save for the weekend: set version to 1.3.15. 2023-11-03 13:49:28 +01:00
b4457d8815 Fix debugging output. 2023-11-03 13:46:23 +01:00
3621777827 Do not disable the exit button. 2023-11-03 13:45:54 +01:00
003bd0bf77 Check if repository is corrupted: do not check for etc/ or
opt/-directories, as they may be not existent inside of the repository.
2023-11-03 13:44:15 +01:00
721c5dd7a5 MAke sure removeDuplicates() is called for list containing file to be
updated.
2023-10-31 09:16:24 +01:00
a24eb9fd8c Minor: removed unused, obsolete code (commented out). 2023-10-31 09:14:02 +01:00
24351b8342 Minor: add runtime information in debug output. 2023-10-31 09:12:43 +01:00
13 changed files with 446 additions and 526 deletions

View File

@@ -41,7 +41,6 @@ DEFINES += QT_DEPRECATED_WARNINGS
# up cloning of customer repository. # up cloning of customer repository.
# 1.3.13: Fix: if the customer repository is corrupted, remove it and re-clone # 1.3.13: Fix: if the customer repository is corrupted, remove it and re-clone
# the repository (without checking the ISMAS-trigger (WAIT-)button. # the repository (without checking the ISMAS-trigger (WAIT-)button.
VERSION="1.3.14"
# 1.3.14: Add additional check for sanity of customer repository using # 1.3.14: Add additional check for sanity of customer repository using
# "git fsck". # "git fsck".
# Stream-lined code of update process: massive refactoring. # Stream-lined code of update process: massive refactoring.
@@ -53,6 +52,14 @@ VERSION="1.3.14"
# repository will be worked on: tariff-files will be synced with the # repository will be worked on: tariff-files will be synced with the
# local filesystem, json-files will be downloaded to firmware. # local filesystem, json-files will be downloaded to firmware.
# The device-controller firmware will be handled in a later version. # The device-controller firmware will be handled in a later version.
VERSION="1.3.15"
# Bug fixes found during testing.
# Don't disable Exit-button during update-process.
# Removed worker-thread with an own event-loop: only the GUI thread
# has an event loop. Tested JSON-downloads several times successfully
# (using the slave lib where the CA helper tool was active as master).
# Turned previous worker-object into its own thread, but without any
# own event-loop (so it cannot block anything inside the CA-plugin).
# PLANNED TODOS: # PLANNED TODOS:
# 1: Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT. # 1: Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT.
@@ -69,8 +76,9 @@ VERSION="1.3.14"
# ausgefuehrt. # ausgefuehrt.
# 4: rsync: immer alle Dateien soiegeln (bis auf opkg-commands) # 4: rsync: immer alle Dateien soiegeln (bis auf opkg-commands)
# 5: Falls das Tool mal abstuerzt, dann einen Signal-Handler (fuer TERM) # 5: Falls das Tool mal abstuerzt, dann einen Signal-Handler (fuer TERM)
# installieren, sodass zumnidest SEND-LASt-VERSION mit rausgeht. # installieren, sodass zumnidest SEND-LAST-VERSION mit rausgeht.
# 6: rsync: explizites Binary, nicht das in busybox enthaltene. # 6: rsync: explizites Binary, nicht das in busybox enthaltene.
# 7: Ein ini-File oder sowas.
win32 { win32 {
BUILD_DATE=$$system("date /t") BUILD_DATE=$$system("date /t")
@@ -142,8 +150,7 @@ SOURCES += \
ismas/ismas_client.cpp \ ismas/ismas_client.cpp \
process/command.cpp \ process/command.cpp \
message_handler.cpp \ message_handler.cpp \
worker.cpp \ worker.cpp
worker_thread.cpp
HEADERS += \ HEADERS += \
update.h \ update.h \
@@ -157,7 +164,6 @@ HEADERS += \
process/command.h \ process/command.h \
message_handler.h \ message_handler.h \
worker.h \ worker.h \
worker_thread.h \
plugins/interfaces.h plugins/interfaces.h
FORMS += \ FORMS += \

View File

@@ -64,24 +64,6 @@ int main(int argc, char *argv[]) {
setDebugLevel(LOG_NOTICE); setDebugLevel(LOG_NOTICE);
} }
//#if defined (Q_OS_UNIX) || defined (Q_OS_LINUX)
//#ifdef _POSIX_THREAD_PROCESS_SHARED
// errno = 0;
// int res = 0;
// if ((res = sysconf(_SC_THREAD_PROCESS_SHARED)) < 0) {
// if (errno != 0) {
// qCritical() << "_POSIX_THREAD_PROCESS_SHARED NOT SUPPORTED"
// << strerror(errno);
// exit(-1);
// }
// } else {
// if (res == _POSIX_THREAD_PROCESS_SHARED) {
// Utils::printInfoMsg("_POSIX_THREAD_PROCESS_SHARED SUPPORTED");
// }
// }
//#endif
//#endif
QCommandLineParser parser; QCommandLineParser parser;
parser.setApplicationDescription("Download tool for downloading device controller firmware, printer json-files and executing opkg-commands."); parser.setApplicationDescription("Download tool for downloading device controller firmware, printer json-files and executing opkg-commands.");
parser.addHelpOption(); parser.addHelpOption();
@@ -101,6 +83,10 @@ int main(int argc, char *argv[]) {
pluginNameOption.setDefaultValue(pluginNameDefault); pluginNameOption.setDefaultValue(pluginNameDefault);
parser.addOption(pluginNameOption); parser.addOption(pluginNameOption);
QCommandLineOption noDownloadOption("no-psa-hardware-update",
QCoreApplication::translate("main", "Do not update the PSA firmware (json, device-controller)."));
parser.addOption(noDownloadOption);
QCommandLineOption workingDirectoryOption(QStringList() << "working-directory" << "working-directory", QCommandLineOption workingDirectoryOption(QStringList() << "working-directory" << "working-directory",
QCoreApplication::translate("main", "working directory of update-script."), QCoreApplication::translate("main", "working directory of update-script."),
QCoreApplication::translate("main", "directory")); QCoreApplication::translate("main", "directory"));
@@ -130,6 +116,7 @@ int main(int argc, char *argv[]) {
QString plugInName = parser.value(pluginNameOption); QString plugInName = parser.value(pluginNameOption);
QString workingDir = parser.value(workingDirectoryOption); QString workingDir = parser.value(workingDirectoryOption);
bool const dryRun = parser.isSet(dryRunOption); bool const dryRun = parser.isSet(dryRunOption);
bool const noUpdatePsaHardware = parser.isSet(noDownloadOption);
bool const showYoctoVersion = parser.isSet(yoctoVersionOption); bool const showYoctoVersion = parser.isSet(yoctoVersionOption);
bool const showYoctoInstallStatus = parser.isSet(yoctoInstallStatusOption); bool const showYoctoInstallStatus = parser.isSet(yoctoInstallStatusOption);
bool const showExtendedVersion = parser.isSet(extendedVersionOption); bool const showExtendedVersion = parser.isSet(extendedVersionOption);
@@ -170,6 +157,7 @@ int main(int argc, char *argv[]) {
qInfo() << "plugInName ..............." << plugInName; qInfo() << "plugInName ..............." << plugInName;
qInfo() << "workingDir ..............." << workingDir; qInfo() << "workingDir ..............." << workingDir;
qInfo() << "dryRun ..................." << dryRun; qInfo() << "dryRun ..................." << dryRun;
qInfo() << "noUpdatePsaHardware ......" << noUpdatePsaHardware;
qInfo() << "extended-version ........." << APP_EXTENDED_VERSION; qInfo() << "extended-version ........." << APP_EXTENDED_VERSION;
//qInfo() << "yocto-version ............" << Worker::getATBUpdateToolYoctoVersion(); //qInfo() << "yocto-version ............" << Worker::getATBUpdateToolYoctoVersion();
//qInfo() << "yocto-install-status ....." << Worker::getATBUpdateToolYoctoInstallationStatus(); //qInfo() << "yocto-install-status ....." << Worker::getATBUpdateToolYoctoInstallationStatus();
@@ -181,35 +169,17 @@ int main(int argc, char *argv[]) {
#error "Only tested under UNIX/LINUX" #error "Only tested under UNIX/LINUX"
#endif #endif
hwinf *hw = Update::loadDCPlugin(QDir(plugInDir), plugInName);
hw->dc_autoRequest(true);
// hw->dc_openSerial(5, "115200", "ttymxc2", 1);
Worker worker(customerNr, Worker worker(customerNr,
machineNr, machineNr,
zoneNr, zoneNr,
branchName, branchName,
plugInDir,
plugInName, plugInName,
workingDir, workingDir,
noUpdatePsaHardware,
dryRun); dryRun);
QString const customerNrStr( MainWindow mw(&worker);
QString("customer_") + QString::number(customerNr).rightJustified(3, '0'));
QScopedPointer<Update> update(
new Update(hw,
&worker,
QDir::cleanPath(workingDir + QDir::separator() + customerNrStr),
customerNrStr,
branchName,
plugInName,
workingDir,
dryRun,
nullptr,
SERIAL_PORT,
"115200"));
MainWindow mw(hw, &worker, update.get());
worker.setMainWindow(&mw); worker.setMainWindow(&mw);
mw.setWindowFlags(Qt::Window | Qt::FramelessWindowHint); mw.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);

View File

@@ -13,102 +13,14 @@
#include <QEvent> #include <QEvent>
MainWindow::MainWindow(Worker *worker, QWidget *parent)
#if EMERGENCY_LEAVE_BL==1
static int step = 0;
void MainWindow::emergencyLeaveBL() {
//
qCritical() << __func__ << step;
switch(step) {
case 0:
if (m_hw->dc_openSerial(5, "115200", "ttymxc2", 1)) {
qCritical() << __func__ << "open ok";
step++;
QThread::msleep(2000);
m_hw->dc_autoRequest(false);
emit leaveBL();
}
break;
case 1:
m_hw->bl_rebootDC();
QThread::msleep(1000);
qCritical() << __func__ << "reboot ok" << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
step++;
emit leaveBL();
break;
case 2:
case 3:
case 4:
case 5:
case 6:
m_hw->bl_startBL();
QThread::msleep(1000);
qCritical() << __func__ << "start" << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
step++;
emit leaveBL();
break;
case 7:
case 9:
case 11:
case 13:
case 15:
m_hw->bl_checkBL();
qCritical() << __func__ << "check" << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
QThread::msleep(1500);
++step;
emit leaveBL();
break;
case 8:
case 10:
case 12:
case 14:
case 16:
qCritical() << __func__ << "is Up..." << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
if (m_hw->bl_isUp()) {
qCritical() << __func__ << "is Up...OK" << step << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
QThread::msleep(5000);
step = 16;
} else {
qCritical() << __func__ << "is Up...NO" << step << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
}
++step;
emit leaveBL();
break;
case 17:
case 18:
case 19:
qCritical() << __func__ << "stop" << QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
m_hw->bl_stopBL();
QThread::msleep(1000);
//m_hw->dc_closeSerial();
++step;
emit leaveBL();
break;
}
}
#endif
MainWindow::MainWindow(hwinf *hw, Worker *worker, Update *update, QWidget *parent)
: QMainWindow(parent) : QMainWindow(parent)
, ui(new Ui::MainWindow) , ui(new Ui::MainWindow)
, m_hw(hw)
, m_worker(worker) , m_worker(worker)
, m_width(70) , m_width(70)
, m_progressRunning(false) , m_progressRunning(false)
// , m_progressValue(0)
, m_update(update)
, m_updateStep(UpdateDcEvent::UpdateStep::NONE) { , m_updateStep(UpdateDcEvent::UpdateStep::NONE) {
#if EMERGENCY_LEAVE_BL==1
QTimer *t = new QTimer(this);
connect(t, SIGNAL(timeout()), this, SLOT(emergencyLeaveBL()));
connect(this, SIGNAL(leaveBL()), this, SLOT(emergencyLeaveBL()), Qt::QueuedConnection);
t->setSingleShot(true);
t->start(1000);
return;
#endif
this->setStatusBar(new QStatusBar(this)); this->setStatusBar(new QStatusBar(this));
QFont f; QFont f;
f.setStyleHint(QFont::Monospace); f.setStyleHint(QFont::Monospace);
@@ -138,7 +50,7 @@ MainWindow::MainWindow(hwinf *hw, Worker *worker, Update *update, QWidget *paren
// ui->updateStatus->installEventFilter(this); // ui->updateStatus->installEventFilter(this);
m_startTimer = new QTimer(this); m_startTimer = new QTimer(this);
connect(m_startTimer, SIGNAL(timeout()), m_worker, SLOT(update())); connect(m_startTimer, SIGNAL(timeout()), m_worker, SLOT(start()));
m_startTimer->setSingleShot(true); m_startTimer->setSingleShot(true);
m_startTimer->start(1000); m_startTimer->start(1000);
@@ -215,86 +127,6 @@ void MainWindow::customEvent(QEvent *event) {
} else { } else {
qCritical() << "!!! UNKNOWN SENDER !!!"; qCritical() << "!!! UNKNOWN SENDER !!!";
} }
} else
if (event->type() == UpdateDcEvent::type()) {
UpdateDcEvent *pevent = (UpdateDcEvent *)event;
UpdateDcEvent::UpdateStep const updateStep = pevent->updateStep();
QObject const *sender = pevent->sender();
if (sender == m_worker) {
QDateTime const &recv = QDateTime::currentDateTime();
QDateTime const &send = pevent->sendDateTime();
qint64 const delay = recv.toMSecsSinceEpoch() - send.toMSecsSinceEpoch();
switch(updateStep) {
case UpdateDcEvent::UpdateStep::NONE:
break;
case UpdateDcEvent::UpdateStep::DC_REBOOT: {
m_hw->bl_rebootDC();
QString msg = QDateTime::currentDateTime().toString(Qt::ISODateWithMs)
+ QString(": reset device controller (delay=%1ms").arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
m_updateStep = UpdateDcEvent::UpdateStep::DC_REBOOT;
} break;
case UpdateDcEvent::UpdateStep::BL_START: {
QString const &msg = recv.toString(Qt::ISODateWithMs)
+ QString(": start bootloader (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
m_hw->bl_startBL();
if (pevent->count() == BL_START_COUNT) {
m_updateStep = UpdateDcEvent::UpdateStep::BL_START;
}
} break;
case UpdateDcEvent::UpdateStep::BL_CHECK: {
if (m_updateStep != UpdateDcEvent::UpdateStep::BL_IS_UP) {
QString const &msg = recv.toString(Qt::ISODateWithMs)
+ QString(": request bootloader version (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
m_hw->bl_checkBL();
//m_updateStep = UpdateDcEvent::UpdateStep::BL_CHECK;
}
} break;
case UpdateDcEvent::UpdateStep::BL_IS_UP: {
QString msg = recv.toString(Qt::ISODateWithMs)
+ QString(": check running bootloader (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
if (m_updateStep != UpdateDcEvent::UpdateStep::BL_IS_UP) {
if (m_hw->bl_isUp()) {
msg = recv.toString(Qt::ISODateWithMs)
+ QString(": bootloader running (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
m_updateStep = UpdateDcEvent::UpdateStep::BL_IS_UP;
} else {
msg = recv.toString(Qt::ISODateWithMs)
+ QString(": bootloader stop requested (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
if (m_updateStep == UpdateDcEvent::UpdateStep::BL_STOP) {
msg = QDateTime::currentDateTime().toString(Qt::ISODateWithMs)
+ QString(": bootloader down (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
m_updateStep = UpdateDcEvent::UpdateStep::BL_IS_DOWN;
}
}
}
} break;
case UpdateDcEvent::UpdateStep::BL_STOP: {
QString const &msg = QDateTime::currentDateTime().toString(Qt::ISODateWithMs)
+ QString(": stop bootloader (%1, delay=%2ms)").arg(pevent->count()).arg(delay);
emit m_worker->showStatusMessage("dc update", msg);
Utils::printInfoMsg(msg.toUpper());
//if (m_bootLoaderIsUp) {
m_hw->bl_stopBL();
m_updateStep = UpdateDcEvent::UpdateStep::BL_STOP;
//}
} break;
default: ;
}
}
} }
QThread::yieldCurrentThread(); QThread::yieldCurrentThread();
@@ -312,13 +144,6 @@ void MainWindow::onEnableExit() {
ui->exit->setEnabled(true); ui->exit->setEnabled(true);
} }
//bool MainWindow::eventFilter(QObject *obj, QEvent *ev) {
// if (obj == ui->updateStatus) {
// qCritical() << "REc. event for text edit" << ev->type();
// }
// return QMainWindow::eventFilter(obj, ev);
//}
void MainWindow::onRestartExitTimer() { void MainWindow::onRestartExitTimer() {
m_exitTimer->stop(); m_exitTimer->stop();
m_exitTimer->start(60 * 1000); m_exitTimer->start(60 * 1000);

View File

@@ -21,10 +21,9 @@ class MainWindow : public QMainWindow {
protected: protected:
void customEvent(QEvent *event) override; void customEvent(QEvent *event) override;
// bool eventFilter(QObject *obj, QEvent *ev) override;
public: public:
MainWindow(hwinf *hw, Worker *worker, Update *update, QWidget *parent = nullptr); MainWindow(Worker *worker, QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
static const int START_PROGRESS_LOOP = -1; static const int START_PROGRESS_LOOP = -1;
@@ -34,11 +33,6 @@ public:
static const int BL_IS_UP_COUNT = 5; static const int BL_IS_UP_COUNT = 5;
static const int BL_STOP_COUNT = 5; static const int BL_STOP_COUNT = 5;
// int progressValue() const { return m_progressValue; }
hwinf *getPlugin() { return m_hw; }
hwinf const *getPlugin() const { return m_hw; }
Update *getUpdate() { return m_update; }
Update const *getUpdate() const { return m_update; }
UpdateDcEvent::UpdateStep updateStep() const { return m_updateStep; } UpdateDcEvent::UpdateStep updateStep() const { return m_updateStep; }
void setUpdateStep(UpdateDcEvent::UpdateStep updateStep) { m_updateStep = updateStep; } void setUpdateStep(UpdateDcEvent::UpdateStep updateStep) { m_updateStep = updateStep; }
@@ -72,14 +66,12 @@ private:
void onShowMessage(QString, QString); void onShowMessage(QString, QString);
Ui::MainWindow *ui; Ui::MainWindow *ui;
hwinf *m_hw;
Worker *m_worker; Worker *m_worker;
int const m_width; int const m_width;
QTimer *m_startTimer; QTimer *m_startTimer;
QTimer *m_exitTimer; QTimer *m_exitTimer;
bool m_progressRunning; bool m_progressRunning;
//int m_progressValue; //int m_progressValue;
Update *m_update;
UpdateDcEvent::UpdateStep m_updateStep; UpdateDcEvent::UpdateStep m_updateStep;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@@ -344,7 +344,41 @@ struct T_devices
}; };
struct T_chg_Tub
{
uint8_t tubeLevel[8]; // [0]=nr coins of lowest value
uint8_t tubeFull[8]; // 1=full 0 else
uint16_t tubeValues[8]; // in cent [0]=lowest value 5c or 10cent
uint16_t tubeFilled[8]; // nr of every coin inserted
uint16_t tubeDispens[8]; // nr of every coin dispensed
// 64 byte
};
struct T_changer
{
// Fixdata from Coin Changer
uint8_t setup; // always 1
uint8_t state; // step of state machine
// 0..12 like EMP, 13...30 for coin dispense
uint8_t level; // mdb-level, always 3
uint16_t countryCode;
uint8_t scale;
uint8_t decimals;
uint8_t coinSetup[16]; // [0]=lowest coin, multiply with scale
uint16_t intendedAcceptance; //bitwise 0,1 1=accept coin, came from master
uint8_t tokenChannel;
uint8_t pollingRunning; // 1: emp is polled 0:not
uint8_t paymentRunning; // 1: coins are accepted
uint16_t denomination[16];
uint16_t availableTubes; //bitwise 0,1 1=av. bit0 = lowest coin value
};
struct T_bna
{
};
class hwinf class hwinf
{ {
@@ -1373,7 +1407,183 @@ public:
virtual void mif_getAtbCardExpire(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *minute) const =0; virtual void mif_getAtbCardExpire(uint8_t *year, uint8_t *month, uint8_t *day, uint8_t *hour, uint8_t *minute) const =0;
// ------------------------------------------------------------------------------------
// Device-Controller-Bootloader convenient version 21.09.2023
// ------------------------------------------------------------------------------------
// use this to jump to BL:
//void hwapi::bl_rebootDC(void) const
// use this to start BL:
// void hwapi::bl_startBL(void) const
// call this in order to get response from BL:
//void hwapi::bl_checkBL(void) const
// evaluate BL response:
//bool hwapi::bl_isUp(void) const
// 29.9.23: new: "completeStart" function, replaces bl_rebootDC(), bl_startBL() and bl_checkBL()
// result can be verified with bl_isUp() as before
virtual bool bl_completeStart(void) const =0;
// must be used in DC's normal operation
// select binfile-name in GUI
// send binfile-name to BL-processor:
virtual bool bl_storeFirmware(QString fileName) const =0;
// load binary file 3x and compare
// return true if loaded correctly
// return false: error, could not load correctly
// request the number of blocks for this file
virtual uint16_t bl_getNrOfFirmwareBlocks(void) const =0;
// size of the loaded bin file in 64byte blocks
// call after bl_storeFirmware()
// call the next two function's repetitive with "blockNumber"=0,1,2,3....."bl_getNrOfFirmwareBlocks()"
virtual bool bl_blockAutoLoad(uint16_t blockNumber) const =0;
// call in loop from block number 0 up to <= "dcBL_getNrOfBlocks()"
//the last block "bl_getNrOfFirmwareBlocks()" is sent as conclusion command (important!)
// but after every call WAIT (!) for response "bl_blockAutoResponse()" !!!!
// data will be sent to DC, if neccesary addr will be sent additionally
// if neccesary sending will automatically repeat up to 3times
// retval: false if blockNumber>4095, true else
// check out this response after every block-sending, wait until >0!!!
virtual int8_t bl_blockAutoResponse(void) const =0;
// after every "bl_blockAutoLoad()" call this until response
// retval 0: wait 1: OK, blk was sent 2: OK, transfer complete
// 3: error despite repeating, cancel. probably bin file corrupted
// Max duration: 3x no response from BL = 900ms
// finally call:
// void hwapi::bl_stopBL(void) const
// -------------- end of bootloader ---------------------------------------------------
// new from 28.9.23 and earliest from DC version 4.45
// get all versions of the DC-Jsons
virtual void sys_requestJsonVersions(uint8_t jsonNr) const =0;
// send one request for every single version
// jsonNr=1...36, 1=config file (cust.Nr) 2=devices 3=cash 4=res.
// 5=printer template 1 ..... 36= template 32
virtual void sys_getJsonVersions(uint8_t jsonNr, char *versionString) const =0;
// jsonNr=1...36, 1=config file (cust.Nr) 2=devices 3=cash 4=res.
// 5=printer template 1 ..... 36= template 32
// length of buffer is always 16 byte
// ------------------------------------------------------------------------------------
// Coin Changer
// ------------------------------------------------------------------------------------
// find above (same as for coin checker (EMP)):
// mdb_switchPower(true); // power on/off
// cash_startPayment(amount_cent); // start polling, enable coins, changer turns to green
// getInsertedAmount()
// getLastInsertedCoin()
// getAllInsertedCoins(uint16_t *types, uint16_t *values)
// all inserted coins of this past transaction are stored, max 64
// cash_stopPayment(); // and wait for further command (changer blinks yellow)
// cash_cancelPayment(); // and return complete paid amount
// after ticket/goods issue:
// vend_success()
// conclude payment process, keep all coins. Printing was successful
// return change (payment above start-amount), so it works only if
// Payment was started with real vending price (pre selection).
// if payment was started with maximum price (for direct coin insertion)
// then use "changer_returnCoins()", not vend_success()
// vend_failed()
// conclude payment process and return complete paid amount
// also valid for changer:
// emp_sendSettings(uint16_t coinAcceptance, uint8_t tokenChannel, uint16_t *coinDenomination ) const =0;
// coinAcceptance: bit0=coin1 (lowest donomination) bit15=coin16 bitH=accept bit L = deny coin (no validation)
// tokenChannel 0...31: if this signal comes from emp then a token was inserted
// coinDenomination = array of 16 coin values (e.g. 5, 10, 20...)
virtual void changer_returnCoins(uint32_t amountInCent) const =0;
virtual void changer_requestChangeResult(void) const =0;
virtual uint8_t changer_getChangeResult(uint32_t *returnedAmount) const =0;
// get result of coin dispensing
// receivedData[0]: 0: not yet started 1:amount returned
// 2:only partial return 3: no return possible
// receivedData[2,3,4,5]: returned amount
virtual void changer_getAllParameters(struct T_changer *mw) const =0;
// requested automatically with 23, same like EMP
virtual void changer_requestTubelevel(void) const =0;
virtual void changer_getTubelevel(struct T_chg_Tub *tubLevel) const =0;
// don't use tubeDispens[], it's not yet correct!
// ------------------------------------------------------------------------------------
// bank note acceptor
// ------------------------------------------------------------------------------------
// already defiened functions applying for BNA as well:
// mdb_switchPower(true); // power on/off
// bank notes are integrated in the normal transaction process, so use the usual functions to run a vending cycle:
// cash_startPayment(amount_cent); // start polling, enable bills, reader shows green
// getInsertedAmount()
// cash_stopPayment();
// cash_cancelPayment();
// vend_success()
// vend_failed()
virtual void bna_sendSettings(uint16_t notesToAccept, uint16_t parameters,
uint16_t *billDenomination,
uint32_t acceptanceLimit) const =0;
// notesToAccept: bit0=bill1 (lowest donomination) bitH=accept bit L = deny
// parameters: e.g. use escrow function for some notes
// billDenomination = array of 16 bill values (e.g. 5, 10, 20...)
// these can be set alternatively by Json-File DC2C_cash.json
// acceptanceLimit: device will stop acceptance once this amount is reached and
// optionally keep last bill in escrow until vend_success()
// is called (put bill to stacker) or vend_failed() is called (return bill)
virtual void bna_setCurrentAcceptance(uint16_t notesToAccept) const =0;
// can be used to block notes dynamically, example: from now only 5€ bills are allowed (if only 3€ are to be paid)
// only valid till next start-payment. Cannot add notes which are not activated in Json
virtual void bna_requestParameters(void) const =0;
// send command to DC in order to get static invariable device parameters like currency
// device must be powered and polled to get these
virtual bool bna_getAllParameters(struct T_bna *bna) const =0;
// get all constant data from reader (e.g. currency)
// and actual Host-Settings (sent with bna_sendSettings() or json)
// retval = true if data are valid
virtual void bna_requestCurrentNotes(void) const =0;
// send command to DC in order to get transaction data
virtual uint8_t bna_getCurrentNotes(uint16_t latestBill, uint16_t *currentNotes) const =0;
// returns number of collected bank notes since start-command (current transaction)
// latestBill: last accepted bank note, value in cent
// currentNotes an array with up to 16 (further) notes collected
virtual void bna_requestStackerLevel(void) const =0;
virtual uint16_t bna_getStackerLevel(uint32_t *amountInStacker, uint16_t *countOfBills) const =0;
// return val: nr of bills in stacker
// countOfBills: array of up to 16 sums, countOfBills[0]=nr of 5€-bills in stacker
// countOfBills[1] for 10€ and so on
@@ -1395,8 +1605,6 @@ signals:
virtual void hwapi_payCancelled(void) const=0; virtual void hwapi_payCancelled(void) const=0;
virtual void hwapi_coinProcessJustStopped(void) const=0; virtual void hwapi_coinProcessJustStopped(void) const=0;
// new from 2023.06.12
virtual void hwapi_doorServiceDoorOpened(void) const=0; virtual void hwapi_doorServiceDoorOpened(void) const=0;
virtual void hwapi_doorVaultDoorOpened(void) const=0; virtual void hwapi_doorVaultDoorOpened(void) const=0;
virtual void hwapi_doorCoinBoxRemoved(void) const=0; virtual void hwapi_doorCoinBoxRemoved(void) const=0;
@@ -1454,9 +1662,17 @@ signals:
// 18.9.2023 major improvements for DC data exchange // 18.9.2023 major improvements for DC data exchange
// verification of door and cash box signals // verification of door and cash box signals
// intensive verification of Json-Programming Master-Slave (PTU to DC), 100% ok // intensive verification of Json-Programming Master-Slave (PTU to DC), 100% ok
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/4.6"
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/4.6"
// 20.9.2023: speeding up door and cash box signals // 20.9.2023: speeding up door and cash box signals
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/4.7"
// 26.09.2023: added improved DC-bootloader files
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/4.8"
// 28.09.2023: added version request of DC-Json-Files
//#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.0"
// 10.10.2023: added coin changer
#define HWINF_iid "Atb.Psa1256ptu5.software.HWapi/5.1"
// 20.10.2023: added bill validator
Q_DECLARE_INTERFACE(hwinf, HWINF_iid) Q_DECLARE_INTERFACE(hwinf, HWINF_iid)

Binary file not shown.

View File

@@ -4,6 +4,7 @@
#include <QDebug> #include <QDebug>
#include <QDir> #include <QDir>
#include <QRegularExpression> #include <QRegularExpression>
#include <QDateTime>
Command::Command(QString const &command, int start_timeout, int finish_timeout) Command::Command(QString const &command, int start_timeout, int finish_timeout)
: m_command(command.trimmed()) : m_command(command.trimmed())
@@ -65,6 +66,8 @@ bool Command::execute(QString workingDirectory, QStringList args) {
p->start(m_command); p->start(m_command);
} }
qint64 const start = QDateTime::currentDateTime().toMSecsSinceEpoch();
if (p->waitForStarted(m_waitForStartTimeout)) { if (p->waitForStarted(m_waitForStartTimeout)) {
qDebug() << "PROCESS" << m_command << "STARTED IN" << p->workingDirectory(); qDebug() << "PROCESS" << m_command << "STARTED IN" << p->workingDirectory();
if (p->state() == QProcess::ProcessState::Running) { if (p->state() == QProcess::ProcessState::Running) {
@@ -80,31 +83,41 @@ bool Command::execute(QString workingDirectory, QStringList args) {
qDebug() << "PROCESS" << m_command << "FINISHED IN" << p->workingDirectory(); qDebug() << "PROCESS" << m_command << "FINISHED IN" << p->workingDirectory();
if (p->exitStatus() == QProcess::NormalExit) { if (p->exitStatus() == QProcess::NormalExit) {
if ((m_exitCode = p->exitCode()) == 0) { if ((m_exitCode = p->exitCode()) == 0) {
qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
qDebug() << "EXECUTED" << m_command qDebug() << "EXECUTED" << m_command
<< QString("(runtime %1ms)").arg(end-start)
<< "with code" << m_exitCode << "with code" << m_exitCode
<< "IN" << p->workingDirectory(); << "IN" << p->workingDirectory();
return true; return true;
} else { } else {
qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
qCritical() << "EXECUTED" << m_command qCritical() << "EXECUTED" << m_command
<< QString("(runtime %1ms)").arg(end-start)
<< "with code" << m_exitCode << "with code" << m_exitCode
<< "IN" << p->workingDirectory(); << "IN" << p->workingDirectory();
} }
} else { } else {
qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
qCritical() << "PROCESS" << m_command << "CRASHED with code" qCritical() << "PROCESS" << m_command << "CRASHED with code"
<< p->exitCode() << p->exitCode()
<< QString("(after %1ms)").arg(end-start)
<< "IN" << p->workingDirectory(); << "IN" << p->workingDirectory();
} }
} else { } else {
qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
qCritical() << "PROCESS" << m_command qCritical() << "PROCESS" << m_command
<< "DID NOT FINISH WITH" << wait << "DID NOT FINISH WITH" << wait
<< "MS IN" << p->workingDirectory(); << "MS IN" << p->workingDirectory()
<< QString("(runtime %1ms)").arg(end-start);
} }
} else { } else {
qCritical() << "WRONG PROCESS STATE" << p->state() qCritical() << "WRONG PROCESS STATE" << p->state()
<< "IN" << p->workingDirectory(); << "IN" << p->workingDirectory();
} }
} else { } else {
qint64 const end = QDateTime::currentDateTime().toMSecsSinceEpoch();
qCritical() << "PROCESS" << m_command << "TIMEOUT AT START" qCritical() << "PROCESS" << m_command << "TIMEOUT AT START"
<< QString("(runtime %1ms)").arg(end-start)
<< "IN" << p->workingDirectory(); << "IN" << p->workingDirectory();
} }
return false; return false;

View File

@@ -94,11 +94,11 @@ bool Update::unloadDCPlugin() {
return false; return false;
} }
Update::Update(hwinf *hw, Update::Update(Worker *worker,
Worker *worker,
QString customerRepository, QString customerRepository,
QString customerNrStr, QString customerNrStr,
QString branchName, QString branchName,
QString plugInDir,
QString pluginName, QString pluginName,
QString workingDir, QString workingDir,
bool dryRun, bool dryRun,
@@ -106,7 +106,7 @@ Update::Update(hwinf *hw,
char const *serialInterface, char const *serialInterface,
char const *baudrate) char const *baudrate)
: QObject(parent) : QObject(parent)
, m_hw(hw) , m_hw(loadDCPlugin(QDir(plugInDir), pluginName))
, m_worker(worker) , m_worker(worker)
, m_serialInterface(serialInterface) , m_serialInterface(serialInterface)
, m_baudrate(baudrate) , m_baudrate(baudrate)
@@ -742,7 +742,17 @@ QStringList Update::getDcSoftAndHardWareVersion() {
} }
bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) { bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
// always assume that serial line is open int tries = 20;
while (!m_hw->sys_areDCdataValid()) { // must deliver 'true', only then are all
// data from hwapi valid
if (--tries < 0) {
qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-MASTER-PLUGIN NOT CONNECTED";
return false;
}
m_hw->dc_autoRequest(true);
QThread::msleep(500);
}
bool res = false; bool res = false;
QList<QString>::const_iterator it; QList<QString>::const_iterator it;
for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) { for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) {

View File

@@ -21,8 +21,8 @@ class Worker;
class Update : public QObject { class Update : public QObject {
Q_OBJECT Q_OBJECT
hwinf *m_hw; hwinf *m_hw = nullptr;
Worker *m_worker; Worker *m_worker = nullptr;
char const *m_serialInterface; char const *m_serialInterface;
char const *m_baudrate; char const *m_baudrate;
QString m_customerRepository; QString m_customerRepository;
@@ -44,11 +44,11 @@ public:
static QStringList split(QString line, QChar sep = ','); static QStringList split(QString line, QChar sep = ',');
explicit Update(hwinf *hw, explicit Update(Worker *worker,
Worker *worker,
QString customerRepository, QString customerRepository,
QString customerNrStr, QString customerNrStr,
QString branchName, QString branchName,
QString plugInDir,
QString pluginName, QString pluginName,
QString workingDir, QString workingDir,
bool dryRun = false, bool dryRun = false,
@@ -58,6 +58,9 @@ public:
virtual ~Update() override; virtual ~Update() override;
bool doUpdate(int &displayIndex, QStringList const &linesToWorkOn); bool doUpdate(int &displayIndex, QStringList const &linesToWorkOn);
hwinf *hw() { return m_hw; }
hwinf const *hw() const { return m_hw; }
//QString customerId() { return m_customerId; } //QString customerId() { return m_customerId; }
//QString const customerId() const { return m_customerId; } //QString const customerId() const { return m_customerId; }

View File

@@ -62,20 +62,34 @@ void Utils::printCriticalErrorMsg(QStringList const &errorMsg) {
qCritical() << QString(80, 'E'); qCritical() << QString(80, 'E');
} }
void Utils::printUpdateStatusMsg(QDebug &debug, QStringList const &updateMsg) { void Utils::printUpdateStatusMsg(QDebug debug, QStringList const &updateMsg) {
debug << QString(80, 'U'); //if (updateMsg.size() > 1) {
// qCritical() << QString(80, 'U');
//}
Q_UNUSED(debug);
for (int i = 0; i < updateMsg.size(); ++i) { for (int i = 0; i < updateMsg.size(); ++i) {
debug << updateMsg.at(i); qInfo() << updateMsg.at(i);
} }
debug << QString(80, 'U');
//if (updateMsg.size() > 1) {
// qCritical() << QString(80, 'U');
//}
} }
void Utils::printUpdateStatusMsg(QStringList const &updateMsg) { void Utils::printUpdateStatusMsg(QStringList const &updateMsg) {
qCritical() << QString(80, 'U'); //if (updateMsg.size() > 1) {
// qCritical() << QString(80, 'U');
//}
for (int i = 0; i < updateMsg.size(); ++i) { for (int i = 0; i < updateMsg.size(); ++i) {
qCritical() << updateMsg.at(i); qCritical() << updateMsg.at(i);
} }
qCritical() << QString(80, 'U');
//if (updateMsg.size() > 1) {
// qCritical() << QString(80, 'U');
//}
} }
void Utils::printUpdateStatusMsg(QString const &updateMsg, bool upper, bool lower) { void Utils::printUpdateStatusMsg(QString const &updateMsg, bool upper, bool lower) {
@@ -86,11 +100,11 @@ void Utils::printUpdateStatusMsg(QString const &updateMsg, bool upper, bool lowe
if (lower) qCritical() << QString(80, 'U'); if (lower) qCritical() << QString(80, 'U');
} }
void Utils::printUpdateStatusMsg(QDebug &debug, QString const &updateMsg, void Utils::printUpdateStatusMsg(QDebug debug, QString const &updateMsg,
bool upper, bool lower) { bool upper, bool lower) {
if (upper) debug << QString(80, 'U'); if (upper) debug << QString(80, 'U');
debug << updateMsg; qInfo() << updateMsg;
if (lower) debug << QString(80, 'U'); if (lower) debug << QString(80, 'U');
@@ -105,11 +119,17 @@ void Utils::printInfoMsg(QString const &infoMsg, bool upper, bool lower) {
} }
void Utils::printInfoMsg(QStringList const &infoMsg) { void Utils::printInfoMsg(QStringList const &infoMsg) {
qCritical() << QString(80, 'I'); //if (infoMsg.size() > 1) {
// qCritical() << QString(80, 'I');
//}
for (int i = 0; i < infoMsg.size(); ++i) { for (int i = 0; i < infoMsg.size(); ++i) {
qCritical() << infoMsg.at(i); qCritical() << infoMsg.at(i);
} }
qCritical() << QString(80, 'I');
//if (infoMsg.size() > 1) {
// qCritical() << QString(80, 'I');
//}
} }
void Utils::printLineEditInfo(QStringList const &lines) { void Utils::printLineEditInfo(QStringList const &lines) {

View File

@@ -17,10 +17,10 @@ namespace Utils {
void printCriticalErrorMsg(QStringList const &errorMsg); void printCriticalErrorMsg(QStringList const &errorMsg);
void printInfoMsg(QString const &infoMsg, bool upper=false, bool lower=false); void printInfoMsg(QString const &infoMsg, bool upper=false, bool lower=false);
void printInfoMsg(QStringList const &infoMsg); void printInfoMsg(QStringList const &infoMsg);
void printUpdateStatusMsg(QDebug &debug, QStringList const &updateMsg); void printUpdateStatusMsg(QDebug debug, QStringList const &updateMsg);
void printUpdateStatusMsg(QStringList const &updateMsg); void printUpdateStatusMsg(QStringList const &updateMsg);
void printUpdateStatusMsg(QString const &updateMsg, bool upper=false, bool lower=false); void printUpdateStatusMsg(QString const &updateMsg, bool upper=false, bool lower=false);
void printUpdateStatusMsg(QDebug &debug, QString const &updateMsg, bool upper=false, bool lower=false); void printUpdateStatusMsg(QDebug debug, QString const &updateMsg, bool upper=false, bool lower=false);
void printLineEditInfo(QStringList const &lines); void printLineEditInfo(QStringList const &lines);
QString getTariffLoadTime(QString fileName); QString getTariffLoadTime(QString fileName);
QString rstrip(QString const &str); QString rstrip(QString const &str);

View File

@@ -66,7 +66,6 @@ const QMap<UPDATE_STEP, const char*> Worker::smap (
INSERT_ELEMENT(UPDATE_STEP::CHECK_FOR_REPOSITORY_CHANGES_SUCCESS), INSERT_ELEMENT(UPDATE_STEP::CHECK_FOR_REPOSITORY_CHANGES_SUCCESS),
INSERT_ELEMENT(UPDATE_STEP::CHECK_FOR_REPOSITORY_CHANGES_FAILURE), INSERT_ELEMENT(UPDATE_STEP::CHECK_FOR_REPOSITORY_CHANGES_FAILURE),
INSERT_ELEMENT(UPDATE_STEP::FILES_TO_UPDATE), INSERT_ELEMENT(UPDATE_STEP::FILES_TO_UPDATE),
INSERT_ELEMENT(UPDATE_STEP::APPLY_REPOSITORY_CHANGES),
INSERT_ELEMENT(UPDATE_STEP::FILES_TO_DOWNLOAD), INSERT_ELEMENT(UPDATE_STEP::FILES_TO_DOWNLOAD),
INSERT_ELEMENT(UPDATE_STEP::EXEC_OPKG_COMMANDS), INSERT_ELEMENT(UPDATE_STEP::EXEC_OPKG_COMMANDS),
INSERT_ELEMENT(UPDATE_STEP::EXEC_OPKG_COMMAND_1), INSERT_ELEMENT(UPDATE_STEP::EXEC_OPKG_COMMAND_1),
@@ -87,8 +86,9 @@ const QMap<UPDATE_STEP, const char*> Worker::smap (
INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER), INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER),
INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_SUCCESS), INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_SUCCESS),
INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE), INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE),
INSERT_ELEMENT(UPDATE_STEP::APPLY_REPOSITORY_CHANGES_SUCCESS), INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE),
INSERT_ELEMENT(UPDATE_STEP::APPLY_REPOSITORY_CHANGES_FAILURE), INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS),
INSERT_ELEMENT(UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE),
INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY), INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY),
INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS), INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_SUCCESS),
INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_FAILURE), INSERT_ELEMENT(UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY_FAILURE),
@@ -111,22 +111,25 @@ Worker::Worker(int customerNr,
int machineNr, int machineNr,
int zoneNr, int zoneNr,
QString branchName, QString branchName,
QString pluginDir,
QString pluginName, QString pluginName,
QString workingDirectory, QString workingDirectory,
bool noUpdatePsaHardware,
bool dryRun, bool dryRun,
QObject *parent, QObject *parent,
char const *serialInterface, char const *serialInterface,
char const *baudrate) char const *baudrate)
: m_workerThread("workerThread") : m_customerNr(customerNr)
, m_customerNr(customerNr)
, m_customerNrStr(QString("customer_") + QString::number(m_customerNr).rightJustified(3, '0')) , m_customerNrStr(QString("customer_") + QString::number(m_customerNr).rightJustified(3, '0'))
, m_machineNr(machineNr) , m_machineNr(machineNr)
, m_zoneNr(zoneNr) , m_zoneNr(zoneNr)
, m_pluginDir(pluginDir)
, m_pluginName(pluginName) , m_pluginName(pluginName)
, m_workingDirectory(workingDirectory) , m_workingDirectory(workingDirectory)
, m_branchName(branchName) , m_branchName(branchName)
, m_customerRepositoryPath(QString("https://git.mimbach49.de/GerhardHoffmann/%1.git").arg(m_customerNrStr)) , m_customerRepositoryPath(QString("https://git.mimbach49.de/GerhardHoffmann/%1.git").arg(m_customerNrStr))
, m_customerRepository(QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr)) , m_customerRepository(QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr))
, m_noUpdatePsaHardware(noUpdatePsaHardware)
, m_dryRun(dryRun) , m_dryRun(dryRun)
, m_parent(parent) , m_parent(parent)
, m_serialInterface(serialInterface) , m_serialInterface(serialInterface)
@@ -158,31 +161,9 @@ Worker::Worker(int customerNr,
QDir::setCurrent(m_workingDirectory); QDir::setCurrent(m_workingDirectory);
m_apismVersion = getAPISMYoctoVersion(); m_apismVersion = getAPISMYoctoVersion();
this->moveToThread(&m_workerThread);
m_workerThread.start();
int cnt = 0;
while (!m_workerThread.isRunning()) {
if (++cnt > 5) {
Utils::printCriticalErrorMsg("starting worker thread FAILED");
return;
}
QThread::sleep(1);
}
} }
Worker::~Worker() { Worker::~Worker() {
int cnt = 0;
m_workerThread.quit();
while (!m_workerThread.isFinished()) {
if (!m_workerThread.wait(1000)) {
if (++cnt > 5) {
Utils::printCriticalErrorMsg("stopping worker thread FAILED");
return;
}
}
}
} }
void Worker::displayProgressInMainWindow(int progress) { void Worker::displayProgressInMainWindow(int progress) {
@@ -207,7 +188,7 @@ void Worker::stopProgressLoop() {
} }
static std::once_flag once; static std::once_flag once;
void Worker::update() { void Worker::run() {
// user should not start the update process several times // user should not start the update process several times
std::call_once(once, &Worker::privateUpdate, this); std::call_once(once, &Worker::privateUpdate, this);
} }
@@ -215,17 +196,17 @@ void Worker::update() {
bool Worker::isRepositoryCorrupted() { bool Worker::isRepositoryCorrupted() {
QDir customerRepository(m_customerRepository); QDir customerRepository(m_customerRepository);
if (customerRepository.exists()) { if (customerRepository.exists()) {
QDir customerRepositoryEtc(QDir::cleanPath(m_customerRepository + QDir::separator() + "etc/"));
QDir customerRepositoryOpt(QDir::cleanPath(m_customerRepository + QDir::separator() + "opt/"));
QDir customerRepositoryGit(QDir::cleanPath(m_customerRepository + QDir::separator() + ".git/")); QDir customerRepositoryGit(QDir::cleanPath(m_customerRepository + QDir::separator() + ".git/"));
if (!m_gc.gitFsck() if (!m_gc.gitFsck()) {
// etc-directory inside git-repository does not exist, which means the
// git-repository is corrupted -> remove it and start from scratch
|| !customerRepositoryEtc.exists()
|| !customerRepositoryGit.exists()
|| !customerRepositoryOpt.exists()) {
// should never happen // should never happen
Utils::printCriticalErrorMsg("CORRUPTED CUSTOMER REPOSITORY"); Utils::printCriticalErrorMsg("CORRUPTED CUSTOMER REPOSITORY: GIT_FSCK FAILED");
return true;
}
// .git-directory inside git-repository does not exist, which means the
// git-repository is corrupted -> remove it and start from scratch
if (!customerRepositoryGit.exists()) {
// should never happen
Utils::printCriticalErrorMsg("CORRUPTED CUSTOMER REPOSITORY .GIT DOES NOT EXIST");
return true; return true;
} }
} }
@@ -251,149 +232,6 @@ bool Worker::repairCorruptedRepository() {
return true; return true;
} }
#if 0
int Worker::sendCloneAndCheckoutFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CLONE_AND_CHECKOUT_FAILURE,
QString("CLONE OR CHECKOUT FAILED: ") + m_customerRepository);
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.errorGitClone(m_updateStatus.m_statusDescription));
return CLONE_AND_CHECKOUT_FAILURE;
}
int Worker::sendCloneAndCheckoutSuccess() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CLONE_AND_CHECKOUT_SUCCESS,
QString("CLONED REPOSITORY %1 AND CHECKED OUT BRANCH %2")
.arg(m_customerRepository)
.arg(m_gc.branchName()));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.cloneAndCheckoutCustomerRepository(
m_updateStatus.m_statusDescription));
return CLONE_AND_CHECKOUT_SUCCESS;
}
int Worker::sendIsmasTriggerFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::ISMAS_UPDATE_TRIGGER_SET_FAILURE,
QString("ISMAS update trigger wrong"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"CHECK-UPDATE-TRIGGER",
m_updateStatus.m_statusDescription));
return ISMAS_TRIGGER_FAILURE;
}
int Worker::sendCustomerEnvironmentConfigurationFailed() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CHECKOUT_BRANCH_FAILURE,
QString("Configuring customer environment failed"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"GIT-CHECKOUT-BRANCH",
m_updateStatus.m_statusDescription));
return ENVIRONMENT_CONFIG_FAILURE;
}
int Worker::sendPullFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE,
QString("No files to update"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"FETCH-FILES-TO-UPDATE",
m_updateStatus.m_statusDescription));
return GIT_PULL_FAILURE;
}
int Worker::sendFileUpdateFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::PSA_UPDATE_FILES_FAILED,
QString("Updating files failed"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"UPDATE-FILES",
m_updateStatus.m_statusDescription));
return UPDATE_FILES_FAILURE;
}
int Worker::sendRsyncFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::RSYNC_UPDATES_FAILURE,
QString("Syncing files to update failed"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"RSYNC-UPDATE-FILES",
m_updateStatus.m_statusDescription));
return RSYNC_FAILURE;
}
int Worker::sendLastVersionFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::ISMAS_SEND_LAST_VERSION_FAILED,
QString("Sending ISMAS last version failed"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"ISMAS-SEND-LAST-VERSION",
m_updateStatus.m_statusDescription));
return SEND_LAST_VERSION_FAILURE;
}
int Worker::sendSaveLogFilesFailure() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::SAVE_LOG_FILES_FAILED,
QString("Saving log files failed"));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAFailed(IsmasClient::RESULT_CODE::INSTALL_ERROR,
"SAVE-LOG-FILES",
m_updateStatus.m_statusDescription));
return SAVE_LOG_FILES_FAILURE;
}
int Worker::sendFoundFilesToUpdateSuccess() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::GIT_CHECK_FILES_TO_UPDATE_SUCCESS,
QString("Files to update: ") + m_filesToUpdate.join(','));
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") +
m_ismasClient.updateOfPSAContinues("CHECK-FILES-TO-UPDATE",
m_updateStatus.m_statusDescription));
return 0;
}
int Worker::sendUpdateSucceededAndActivated() {
ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_SUCCEEDED));
ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_ACTIVATED));
//IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
// QString("#M=APISM#C=CMD_EVENT#J=") +
// m_ismasClient.updateOfPSASucceeded(""));
//m_ismasClient.setProgressInPercent(100);
// mark update as activated -> this resets the WAIT button
//IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
// QString("#M=APISM#C=CMD_EVENT#J=") +
// m_ismasClient.updateOfPSAActivated());
return UPDATE_SUCCESS_AND_ACTIVATED;
}
int Worker::sendFinalResult() {
m_updateStatus = UpdateStatus(UPDATE_STATUS::UPDATE_PROCESS_SUCCESS,
QString("Update process succeeded. Reset WAIT."));
if (std::optional<QString> s = m_ismasClient.finalResult(IsmasClient::RESULT_CODE::SUCCESS,
m_updateStatus.m_statusDescription)) {
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_EVENT#J=") + s.value());
}
return 0;
}
#endif
void Worker::privateUpdate() { void Worker::privateUpdate() {
if (!m_mainWindow) { if (!m_mainWindow) {
Utils::printCriticalErrorMsg("m_mainWindow NOT SET"); Utils::printCriticalErrorMsg("m_mainWindow NOT SET");
@@ -528,15 +366,26 @@ void Worker::privateUpdate() {
ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY_SUCCESS)); ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY_SUCCESS));
////////////////////////////////////////////////////////////////////////////
//
// EXECUTE OPKG COMMANDS
//
////////////////////////////////////////////////////////////////////////////
if ((continueUpdate = execOpkgCommands()) == false) {
return;
}
GUI() << (CONSOLE() << UPDATE_STEP::EXEC_OPKG_COMMAND_SUCCESS);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// //
// UPDATE THE PSA USING THE CHANGED FILES // UPDATE THE PSA USING THE CHANGED FILES
// //
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
if ((continueUpdate = updateFiles()) == false) { if ((continueUpdate = downloadFilesToPSAHardware()) == false) {
return; return;
} }
GUI() << (CONSOLE() << UPDATE_STEP::APPLY_REPOSITORY_CHANGES_SUCCESS); GUI() << (CONSOLE() << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@@ -779,23 +628,40 @@ bool Worker::filesToUpdate() {
if (!changes.value().contains("Already up to date")) { if (!changes.value().contains("Already up to date")) {
if (std::optional<QStringList> changedFileNames = m_gc.gitDiff(changes.value())) { if (std::optional<QStringList> changedFileNames = m_gc.gitDiff(changes.value())) {
m_filesToUpdate << changedFileNames.value(); m_filesToUpdate << changedFileNames.value();
m_filesToUpdate.removeDuplicates();
} }
} }
GUI() << (CONSOLE(m_filesToUpdate) << UPDATE_STEP::FILES_TO_UPDATE); m_filesToUpdate.removeDuplicates();
GUI(m_filesToUpdate) << (CONSOLE(m_filesToUpdate) << UPDATE_STEP::FILES_TO_UPDATE);
} else { } else {
ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY_FAILURE)); ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::UPDATE_REPOSITORY_FAILURE));
return false;
} }
return true; return true;
} }
bool Worker::updateFiles() { bool Worker::computeFilesToDownload() {
m_filesToDownload.clear(); m_filesToDownload.clear();
m_displayIndex = 0; for (int i = 0; i < m_filesToUpdate.size(); ++i) {
QString const fName = m_filesToUpdate.at(i);
if (fName.contains("DC2C_print", Qt::CaseInsensitive) ||
fName.contains("DC2C_device", Qt::CaseInsensitive) ||
fName.contains("DC2C_conf", Qt::CaseInsensitive) ||
fName.contains("DC2C_cash", Qt::CaseInsensitive)) {
m_filesToDownload << fName; // download printer-config-files
} else {
static const QRegularExpression version("^.*dc2c[.][0-9]{1,2}[.][0-9]{1,2}[.]bin.*$");
if (fName.contains(version)) {
m_filesToDownload << fName; // download device controller
}
}
}
GUI(m_filesToUpdate) << (CONSOLE(m_filesToUpdate) << UPDATE_STEP::APPLY_REPOSITORY_CHANGES); return (m_filesToDownload.size() > 0);
}
bool Worker::execOpkgCommands() {
for (int i = 0; i < m_filesToUpdate.size(); ++i) { for (int i = 0; i < m_filesToUpdate.size(); ++i) {
QString const fName = m_filesToUpdate.at(i); QString const fName = m_filesToUpdate.at(i);
if (fName.contains("opkg_commands", Qt::CaseInsensitive)) { if (fName.contains("opkg_commands", Qt::CaseInsensitive)) {
@@ -872,31 +738,32 @@ bool Worker::updateFiles() {
} }
} }
} }
} else
if (fName.contains("DC2C_print", Qt::CaseInsensitive) ||
fName.contains("DC2C_device", Qt::CaseInsensitive) ||
fName.contains("DC2C_conf", Qt::CaseInsensitive) ||
fName.contains("DC2C_cash", Qt::CaseInsensitive)) {
m_filesToDownload << fName; // download printer-config-files
} else {
static const QRegularExpression version("^.*dc2c[.][0-9]{1,2}[.][0-9]{1,2}[.]bin.*$");
if (fName.contains(version)) {
m_filesToDownload << fName; // download device controller
}
} }
} }
return true;
}
if (m_filesToDownload.size() > 0) { bool Worker::downloadFilesToPSAHardware() {
CONSOLE(m_filesToDownload) << UPDATE_STEP::FILES_TO_DOWNLOAD; m_displayIndex = 0;
Update *update = m_mainWindow->getUpdate(); GUI(m_filesToUpdate) << (CONSOLE(m_filesToUpdate) << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE);
if (update) {
return update->doUpdate(m_displayIndex, m_filesToDownload); if (m_noUpdatePsaHardware == false) {
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);
return update.doUpdate(m_displayIndex, m_filesToDownload);
} else { } else {
CONSOLE(QStringList("UPDATE NOT SET")) << UPDATE_STEP::ERROR; CONSOLE(QStringList("NO FILES TO DOWNLOAD TO PSA-HW")) << UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE;
} }
} else {
CONSOLE(QStringList("NO FILES TO DOENLOAD TO PSA-HW")) << UPDATE_STEP::ERROR;
} }
return true; return true;
@@ -985,17 +852,6 @@ bool Worker::syncCustomerRepositoryAndFS() {
return false; return false;
} }
#if 0
bool Worker::sendIsmasLastVersionNotification(int progress) {
m_ismasClient.setProgressInPercent(progress);
IsmasClient::sendRequestReceiveResponse(IsmasClient::APISM::DB_PORT,
QString("#M=APISM#C=CMD_SENDVERSION#J=") +
m_ismasClient.updateOfPSASendVersion(getPSAInstalled()));
emit appendText(QString("Send last version info "), UPDATE_STEP_DONE);
return true;
}
#endif
bool Worker::saveLogFile() { bool Worker::saveLogFile() {
// ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::SAVE_LOGS)); // ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::SAVE_LOGS));
// ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::SAVE_LOGS_FAILURE)); // ISMAS() << (GUI() << (CONSOLE() << UPDATE_STEP::SAVE_LOGS_FAILURE));
@@ -1107,22 +963,25 @@ QString Worker::getPluginVersion(QString const &pluginFileName) const {
QStringList Worker::getDCVersion() const { QStringList Worker::getDCVersion() const {
QStringList lst = (QStringList() << "N/A" << "N/A"); QStringList lst = (QStringList() << "N/A" << "N/A");
hwinf *hwi = m_mainWindow->getPlugin(); Update const *up = update();
if (hwi) { if (up) {
hwi->dc_autoRequest(true); // turn auto-request setting on hwinf const *caPlugin = up->hw();
if (caPlugin) {
caPlugin->dc_autoRequest(true); // turn auto-request setting on
QByteArray const cmp(8, char(0)); QByteArray const cmp(8, char(0));
QByteArray hw(""), sw(""); QByteArray hw(""), sw("");
for (int i=0; i<5; ++i) { for (int i=0; i<5; ++i) {
hw = hwi->dc_getHWversion().toUtf8(); hw = caPlugin->dc_getHWversion().toUtf8();
sw = hwi->dc_getSWversion().toUtf8(); sw = caPlugin->dc_getSWversion().toUtf8();
if (!hw.startsWith(cmp)) { if (!hw.startsWith(cmp)) {
lst.clear(); lst.clear();
qInfo() << hw << sw; qInfo() << hw << sw;
lst << hw << sw; lst << hw << sw;
break; break;
}
QThread::sleep(1);
} }
QThread::sleep(1);
} }
} }
return lst; return lst;
@@ -1246,11 +1105,3 @@ PSAInstalled Worker::getPSAInstalled() {
return psaInstalled; return psaInstalled;
} }
hwinf *Worker::getPlugin() {
return m_mainWindow ? m_mainWindow->getPlugin() : nullptr;
}
hwinf const *Worker::getPlugin() const {
return m_mainWindow ? m_mainWindow->getPlugin() : nullptr;
}

View File

@@ -10,11 +10,11 @@
#include <QHash> #include <QHash>
#include <QMap> #include <QMap>
#include <QDebug> #include <QDebug>
#include <QThread>
#include <optional> #include <optional>
#include <initializer_list> #include <initializer_list>
#include "worker_thread.h"
#include "update.h" #include "update.h"
#include "git/git_client.h" #include "git/git_client.h"
#include "ismas/ismas_client.h" #include "ismas/ismas_client.h"
@@ -64,7 +64,6 @@
#define _FILES_TO_UPDATE (37) #define _FILES_TO_UPDATE (37)
#define _CHECK_FOR_REPOSITORY_CHANGES_FAILURE (38) #define _CHECK_FOR_REPOSITORY_CHANGES_FAILURE (38)
#define _FILES_TO_DOWNLOAD (39) #define _FILES_TO_DOWNLOAD (39)
#define _APPLY_REPOSITORY_CHANGES (40)
#define _EXEC_OPKG_COMMANDS (41) #define _EXEC_OPKG_COMMANDS (41)
#define _EXEC_OPKG_COMMAND_1 (42) #define _EXEC_OPKG_COMMAND_1 (42)
#define _EXEC_OPKG_COMMAND_2 (43) #define _EXEC_OPKG_COMMAND_2 (43)
@@ -78,14 +77,15 @@
#define _EXEC_OPKG_COMMAND_LAST (51) #define _EXEC_OPKG_COMMAND_LAST (51)
#define _EXEC_OPKG_COMMAND_FAILURE (52) #define _EXEC_OPKG_COMMAND_FAILURE (52)
#define _EXEC_OPKG_COMMAND_SUCCESS (53) #define _EXEC_OPKG_COMMAND_SUCCESS (53)
#define _DOWNLOAD_CONFIG_FILE (54) #define _DOWNLOAD_FILES_TO_PSA_HARDWARE (54)
#define _DOWNLOAD_CONFIG_FILE_SUCCESS (63) #define _DOWNLOAD_CONFIG_FILE (55)
#define _DOWNLOAD_CONFIG_FILE_FAILURE (64) #define _DOWNLOAD_CONFIG_FILE_SUCCESS (56)
#define _DOWNLOAD_CONFIG_FILE_FAILURE (57)
#define _DOWNLOAD_DEVICE_CONTROLLER (65) #define _DOWNLOAD_DEVICE_CONTROLLER (65)
#define _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS (86) #define _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS (86)
#define _DOWNLOAD_DEVICE_CONTROLLER_FAILURE (87) #define _DOWNLOAD_DEVICE_CONTROLLER_FAILURE (87)
#define _APPLY_REPOSITORY_CHANGES_FAILURE (88) #define _DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE (88)
#define _APPLY_REPOSITORY_CHANGES_SUCCESS (89) #define _DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS (89)
#define _SYNC_CUSTOMER_REPOSITORY (90) #define _SYNC_CUSTOMER_REPOSITORY (90)
#define _SYNC_CUSTOMER_REPOSITORY_FAILURE (91) #define _SYNC_CUSTOMER_REPOSITORY_FAILURE (91)
#define _SYNC_CUSTOMER_REPOSITORY_SUCCESS (92) #define _SYNC_CUSTOMER_REPOSITORY_SUCCESS (92)
@@ -110,19 +110,20 @@
class MainWindow; class MainWindow;
class hwinf; class hwinf;
class Worker : public QObject { class Worker : public QThread{
Q_OBJECT Q_OBJECT
WorkerThread m_workerThread;
int const m_customerNr; int const m_customerNr;
QString const m_customerNrStr; QString const m_customerNrStr;
int const m_machineNr; int const m_machineNr;
int const m_zoneNr; int const m_zoneNr;
QString const m_pluginDir;
QString const m_pluginName; QString const m_pluginName;
QString const m_workingDirectory; QString const m_workingDirectory;
QString const m_branchName; QString const m_branchName;
QString const m_customerRepositoryPath; QString const m_customerRepositoryPath;
QString const m_customerRepository; QString const m_customerRepository;
bool const m_noUpdatePsaHardware;
bool const m_dryRun; bool const m_dryRun;
QObject *m_parent; QObject *m_parent;
QString const m_serialInterface; QString const m_serialInterface;
@@ -189,7 +190,8 @@ class Worker : public QObject {
explicit UpdateProcessRunning(Worker *worker) : m_worker(worker) { explicit UpdateProcessRunning(Worker *worker) : m_worker(worker) {
m_worker->m_updateProcessRunning = true; m_worker->m_updateProcessRunning = true;
emit m_worker->disableExit(); // emit m_worker->disableExit();
emit m_worker->enableExit();
m_worker->startProgressLoop(); m_worker->startProgressLoop();
} }
@@ -239,7 +241,7 @@ public:
CHECK_FOR_REPOSITORY_CHANGES_SUCCESS = _CHECK_FOR_REPOSITORY_CHANGES_SUCCESS, CHECK_FOR_REPOSITORY_CHANGES_SUCCESS = _CHECK_FOR_REPOSITORY_CHANGES_SUCCESS,
CHECK_FOR_REPOSITORY_CHANGES_FAILURE = _CHECK_FOR_REPOSITORY_CHANGES_FAILURE, CHECK_FOR_REPOSITORY_CHANGES_FAILURE = _CHECK_FOR_REPOSITORY_CHANGES_FAILURE,
FILES_TO_UPDATE = _FILES_TO_UPDATE, FILES_TO_UPDATE = _FILES_TO_UPDATE,
APPLY_REPOSITORY_CHANGES = _APPLY_REPOSITORY_CHANGES, DOWNLOAD_FILES_TO_PSA_HARDWARE = _DOWNLOAD_FILES_TO_PSA_HARDWARE,
FILES_TO_DOWNLOAD = _FILES_TO_DOWNLOAD, FILES_TO_DOWNLOAD = _FILES_TO_DOWNLOAD,
EXEC_OPKG_COMMANDS = _EXEC_OPKG_COMMANDS, EXEC_OPKG_COMMANDS = _EXEC_OPKG_COMMANDS,
EXEC_OPKG_COMMAND_1 = _EXEC_OPKG_COMMAND_1, EXEC_OPKG_COMMAND_1 = _EXEC_OPKG_COMMAND_1,
@@ -260,8 +262,8 @@ public:
DOWNLOAD_DEVICE_CONTROLLER = _DOWNLOAD_DEVICE_CONTROLLER, DOWNLOAD_DEVICE_CONTROLLER = _DOWNLOAD_DEVICE_CONTROLLER,
DOWNLOAD_DEVICE_CONTROLLER_SUCCESS = _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS, DOWNLOAD_DEVICE_CONTROLLER_SUCCESS = _DOWNLOAD_DEVICE_CONTROLLER_SUCCESS,
DOWNLOAD_DEVICE_CONTROLLER_FAILURE = _DOWNLOAD_DEVICE_CONTROLLER_FAILURE, DOWNLOAD_DEVICE_CONTROLLER_FAILURE = _DOWNLOAD_DEVICE_CONTROLLER_FAILURE,
APPLY_REPOSITORY_CHANGES_SUCCESS = _APPLY_REPOSITORY_CHANGES_SUCCESS, DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS = _DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS,
APPLY_REPOSITORY_CHANGES_FAILURE = _APPLY_REPOSITORY_CHANGES_FAILURE, DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE = _DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE,
SYNC_CUSTOMER_REPOSITORY = _SYNC_CUSTOMER_REPOSITORY, SYNC_CUSTOMER_REPOSITORY = _SYNC_CUSTOMER_REPOSITORY,
SYNC_CUSTOMER_REPOSITORY_SUCCESS = _SYNC_CUSTOMER_REPOSITORY_SUCCESS, SYNC_CUSTOMER_REPOSITORY_SUCCESS = _SYNC_CUSTOMER_REPOSITORY_SUCCESS,
SYNC_CUSTOMER_REPOSITORY_FAILURE = _SYNC_CUSTOMER_REPOSITORY_FAILURE, SYNC_CUSTOMER_REPOSITORY_FAILURE = _SYNC_CUSTOMER_REPOSITORY_FAILURE,
@@ -284,11 +286,15 @@ private:
UPDATE_STEP m_currentStep; UPDATE_STEP m_currentStep;
static Worker *instance; static Worker *instance;
QStringList m_opkgCommands; QStringList m_opkgCommands;
Update *m_update = nullptr;
protected:
virtual void run();
public: public:
QDebug CONSOLE(QStringList const &lst = QStringList()) { QDebug CONSOLE(QStringList const &lst = QStringList()) {
m_debugMsg = lst; m_debugMsg = lst;
return qDebug(); return QDebug(QtMsgType::QtInfoMsg);
} }
IsmasClient &ISMAS(QStringList const &lst = QStringList()) { IsmasClient &ISMAS(QStringList const &lst = QStringList()) {
@@ -320,8 +326,10 @@ public:
int machineNr, int machineNr,
int zoneNr, int zoneNr,
QString branchName, QString branchName,
QString pluginDir,
QString pluginName, QString pluginName,
QString workingDir = ".", QString workingDir = ".",
bool noUpdatePsaHardware = false,
bool dryRun = false, bool dryRun = false,
QObject *parent = nullptr, QObject *parent = nullptr,
char const *serialInterface = SERIAL_PORT, char const *serialInterface = SERIAL_PORT,
@@ -329,8 +337,6 @@ public:
~Worker(); ~Worker();
void setMainWindow(MainWindow *mainWindow) { m_mainWindow = mainWindow; } void setMainWindow(MainWindow *mainWindow) { m_mainWindow = mainWindow; }
hwinf *getPlugin();
hwinf const *getPlugin() const;
void setProgress(int progress); void setProgress(int progress);
void displayProgressInMainWindow(int progress); void displayProgressInMainWindow(int progress);
void startProgressLoop(); void startProgressLoop();
@@ -351,6 +357,9 @@ public:
MainWindow *mainWindow() { return m_mainWindow; } MainWindow *mainWindow() { return m_mainWindow; }
MainWindow const *mainWindow() const { return m_mainWindow; } MainWindow const *mainWindow() const { return m_mainWindow; }
Update *update() { return m_update; }
Update const *update() const { return m_update; }
signals: signals:
void appendText(QString, QString suffix = ""); void appendText(QString, QString suffix = "");
void replaceLast(QString, QString); void replaceLast(QString, QString);
@@ -364,14 +373,11 @@ signals:
void enableExit(); void enableExit();
void disableExit(); void disableExit();
public slots:
void update();
private slots: private slots:
bool updateTriggerSet(); bool updateTriggerSet();
bool customerEnvironment(); bool customerEnvironment();
bool filesToUpdate(); bool filesToUpdate();
bool updateFiles(); bool downloadFilesToPSAHardware();
bool syncCustomerRepositoryAndFS(); bool syncCustomerRepositoryAndFS();
// bool sendIsmasLastVersionNotification(int progress); // bool sendIsmasLastVersionNotification(int progress);
bool saveLogFile(); bool saveLogFile();
@@ -379,6 +385,8 @@ private slots:
private: private:
PSAInstalled getPSAInstalled(); PSAInstalled getPSAInstalled();
void privateUpdate(); void privateUpdate();
bool computeFilesToDownload();
bool execOpkgCommands();
static const QMap<UPDATE_STEP, const char*> smap; static const QMap<UPDATE_STEP, const char*> smap;
@@ -509,7 +517,7 @@ private:
break; break;
case UPDATE_STEP::FILES_TO_UPDATE: case UPDATE_STEP::FILES_TO_UPDATE:
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES: { case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE: {
lst << instance->m_debugMsg; lst << instance->m_debugMsg;
Utils::printUpdateStatusMsg(debug, lst); Utils::printUpdateStatusMsg(debug, lst);
} break; } break;
@@ -551,14 +559,20 @@ private:
case UPDATE_STEP::DOWNLOAD_CONFIG_FILE_FAILURE: case UPDATE_STEP::DOWNLOAD_CONFIG_FILE_FAILURE:
break; break;
case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER: case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER:
lst << instance->m_debugMsg;
Utils::printUpdateStatusMsg(debug, lst);
break; break;
case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_SUCCESS: case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_SUCCESS:
lst << instance->m_debugMsg;
Utils::printUpdateStatusMsg(debug, lst);
break; break;
case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE: case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE:
lst << instance->m_debugMsg;
Utils::printUpdateStatusMsg(debug, lst);
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_SUCCESS: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS:
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_FAILURE: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE:
break; break;
case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY: case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY:
break; break;
@@ -767,8 +781,8 @@ private:
case UPDATE_STEP::FILES_TO_UPDATE: case UPDATE_STEP::FILES_TO_UPDATE:
ismasClient.setProgressInPercent(_FILES_TO_UPDATE); ismasClient.setProgressInPercent(_FILES_TO_UPDATE);
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE:
ismasClient.setProgressInPercent(_APPLY_REPOSITORY_CHANGES); ismasClient.setProgressInPercent(_DOWNLOAD_FILES_TO_PSA_HARDWARE);
break; break;
case UPDATE_STEP::FILES_TO_DOWNLOAD: case UPDATE_STEP::FILES_TO_DOWNLOAD:
ismasClient.setProgressInPercent(_FILES_TO_DOWNLOAD); ismasClient.setProgressInPercent(_FILES_TO_DOWNLOAD);
@@ -915,11 +929,11 @@ private:
case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE: case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE:
ismasClient.setProgressInPercent(_DOWNLOAD_DEVICE_CONTROLLER_FAILURE); ismasClient.setProgressInPercent(_DOWNLOAD_DEVICE_CONTROLLER_FAILURE);
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_SUCCESS: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS:
ismasClient.setProgressInPercent(_APPLY_REPOSITORY_CHANGES_SUCCESS); ismasClient.setProgressInPercent(_DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS);
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_FAILURE: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE:
ismasClient.setProgressInPercent(_APPLY_REPOSITORY_CHANGES_FAILURE); ismasClient.setProgressInPercent(_DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE);
break; break;
case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY: case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY:
ismasClient.setProgressInPercent(_SYNC_CUSTOMER_REPOSITORY); ismasClient.setProgressInPercent(_SYNC_CUSTOMER_REPOSITORY);
@@ -1103,7 +1117,7 @@ private:
emit worker->appendText(QString("\n ") + worker->m_filesToUpdate.at(0)); emit worker->appendText(QString("\n ") + worker->m_filesToUpdate.at(0));
} }
} break; } break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE:
break; break;
case UPDATE_STEP::FILES_TO_DOWNLOAD: case UPDATE_STEP::FILES_TO_DOWNLOAD:
break; break;
@@ -1153,9 +1167,9 @@ private:
break; break;
case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE: case UPDATE_STEP::DOWNLOAD_DEVICE_CONTROLLER_FAILURE:
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_SUCCESS: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_SUCCESS:
break; break;
case UPDATE_STEP::APPLY_REPOSITORY_CHANGES_FAILURE: case UPDATE_STEP::DOWNLOAD_FILES_TO_PSA_HARDWARE_FAILURE:
break; break;
case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY: case UPDATE_STEP::SYNC_CUSTOMER_REPOSITORY:
emit worker->appendText("\nSync customer environment with filesystem ..."); emit worker->appendText("\nSync customer environment with filesystem ...");