Compare commits
33 Commits
Author | SHA1 | Date | |
---|---|---|---|
a3aef7594e | |||
afbcccf785 | |||
90e4e21391 | |||
4536284f34 | |||
a3a4c09c7f | |||
a5dd9af29a | |||
5124e1cca6 | |||
fc75585de3 | |||
1964b08349 | |||
c0d014644c | |||
b24c50c572 | |||
bbdadc9063 | |||
dc7f839d3f | |||
0a33d078be | |||
1d64769094 | |||
2e3af64c02 | |||
f8472a3b87 | |||
24addad11e | |||
5a8298a078 | |||
52af7894db | |||
a6592ffd3e | |||
696db7de39 | |||
b31588bfab | |||
6651920f4a | |||
ef800366e1
|
|||
1acec4d876 | |||
46c481b862 | |||
8945ead5d6 | |||
bc064c38c6 | |||
f741fb96f9 | |||
8d1c719626 | |||
b5389a599e | |||
ea2f42beed |
@@ -4,6 +4,9 @@ repository-url="https://git.mimbach49.de/GerhardHoffmann"
|
||||
[DIRECTORIES]
|
||||
plugin-directory="/usr/lib/"
|
||||
working-directory="/opt/app/tools/atbupdate/"
|
||||
psa-config-directory="etc/psa_config/"
|
||||
psa-tariff-directory="etc/psa_tariff/"
|
||||
|
||||
|
||||
[PLUGINS]
|
||||
plugin-name="libCAslave.so"
|
||||
|
@@ -1,5 +1,5 @@
|
||||
QT += core
|
||||
QT += serialport network
|
||||
QT += core gui
|
||||
QT += widgets serialport network
|
||||
|
||||
TARGET = ATBDownloadDCFirmware
|
||||
|
||||
@@ -66,14 +66,27 @@ contains( CONFIG, DesktopLinux ) {
|
||||
}
|
||||
|
||||
SOURCES += \
|
||||
main.cpp
|
||||
main.cpp \
|
||||
mainwindow.cpp \
|
||||
sender_thread.cpp \
|
||||
receiver_thread.cpp \
|
||||
worker_thread.cpp \
|
||||
../common/src/message_handler.cpp
|
||||
|
||||
# HEADERS +=
|
||||
HEADERS += \
|
||||
mainwindow.h \
|
||||
sender_thread.h \
|
||||
receiver_thread.h \
|
||||
worker_thread.h \
|
||||
../common/include/message_handler.h
|
||||
|
||||
OTHER_FILES += \
|
||||
ATBDownloadDCFirmware.ini
|
||||
|
||||
|
||||
FORMS += \
|
||||
mainwindow.ui
|
||||
|
||||
##########################################################################################
|
||||
# for running program on target through QtCreator
|
||||
contains( CONFIG, PTU5 ) {
|
||||
|
@@ -1,8 +1,53 @@
|
||||
#include <QtGlobal>
|
||||
#include <QCoreApplication>
|
||||
#include <QApplication>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QFileInfo>
|
||||
#include <QThread>
|
||||
|
||||
#include "../common/include/message_handler.h"
|
||||
#include "mainwindow.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <sys/sysinfo.h>
|
||||
#endif
|
||||
|
||||
#ifdef PTU5
|
||||
#define SERIAL_PORT "ttymxc2"
|
||||
#else
|
||||
#define SERIAL_PORT "ttyUSB0"
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
Q_UNUSED(argc);
|
||||
Q_UNUSED(argv);
|
||||
QByteArray const value = qgetenv("LC_ALL");
|
||||
if (value != "C") {
|
||||
qputenv("LC_ALL", "C");
|
||||
}
|
||||
// qputenv("XDG_RUNTIME_DIR", "/var/run/user/0");
|
||||
|
||||
return 0;
|
||||
openlog("ATB-UPDATE-DC-FIRMWARE", LOG_PERROR | LOG_PID | LOG_CONS, LOG_USER);
|
||||
|
||||
QApplication a(argc, argv);
|
||||
QApplication::setApplicationName("ATBUpdateTool");
|
||||
QApplication::setApplicationVersion(APP_VERSION);
|
||||
|
||||
if (!messageHandlerInstalled()) { // change internal qt-QDebug-handling
|
||||
atbInstallMessageHandler(atbDebugOutput);
|
||||
setDebugLevel(LOG_NOTICE);
|
||||
}
|
||||
|
||||
QThread::currentThread()->setObjectName("main thread");
|
||||
qInfo() << "Main thread" << QThread::currentThreadId();
|
||||
|
||||
MainWindow mw;
|
||||
|
||||
mw.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
|
||||
//mw.showFullScreen();
|
||||
|
||||
qCritical() << "SHOW";
|
||||
|
||||
mw.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
|
347
DownloadDCFirmware/mainwindow.cpp
Normal file
347
DownloadDCFirmware/mainwindow.cpp
Normal file
@@ -0,0 +1,347 @@
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include <QScrollBar>
|
||||
#include <QEvent>
|
||||
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow)
|
||||
, m_serial(new QSerialPort(this))
|
||||
, m_width(70) {
|
||||
|
||||
this->setStatusBar(new QStatusBar(this));
|
||||
QFont f;
|
||||
f.setStyleHint(QFont::Monospace);
|
||||
f.setWeight(QFont::Bold);
|
||||
f.setFamily("Misc Fixed");
|
||||
f.setPixelSize(12);
|
||||
this->statusBar()->setFont(f);
|
||||
|
||||
ui->setupUi(this);
|
||||
|
||||
openSerialPort();
|
||||
|
||||
//ui->updateProgress->setRange(0, 100);
|
||||
//ui->updateProgress->reset();
|
||||
|
||||
#if 0
|
||||
QStringList lst;
|
||||
QString start = QDateTime::currentDateTime().toString(Qt::ISODate);
|
||||
lst << QString("Start: ") + start.leftJustified(m_width-10);
|
||||
lst << QString("").leftJustified(m_width-3, '=');
|
||||
lst << QString("Update tool version: %1 - %2 %3").arg(APP_VERSION).arg(APP_BUILD_DATE).arg(APP_BUILD_TIME).leftJustified(m_width-3);
|
||||
lst << QString("Machine number : %1 ").arg(m_worker->machineNr()).leftJustified(m_width-3);
|
||||
lst << QString("Customer number : %1 ").arg(m_worker->customerNr()).leftJustified(m_width-3);
|
||||
lst << QString("Zone number : %1 (%2)").arg(m_worker->zoneNr()).arg(Utils::zoneName(m_worker->zoneNr())).leftJustified(m_width-3);
|
||||
lst << QString("APISM version : %1").arg(m_worker->apismVersion()).leftJustified(m_width-3);
|
||||
lst << QString("").leftJustified(m_width-3, '=');
|
||||
|
||||
ui->updateStatus->setText(lst.join('\n'));
|
||||
ui->updateStatus->setEnabled(true);
|
||||
// ui->updateStatus->installEventFilter(this);
|
||||
|
||||
m_startTimer = new QTimer(this);
|
||||
connect(m_startTimer, SIGNAL(timeout()), m_worker, SLOT(start()));
|
||||
m_startTimer->setSingleShot(true);
|
||||
m_startTimer->start(1000);
|
||||
|
||||
m_exitTimer = new QTimer(this);
|
||||
connect(m_exitTimer, SIGNAL(timeout()), ui->exit, SLOT(click()));
|
||||
m_exitTimer->setSingleShot(true);
|
||||
m_exitTimer->start(1800 * 1000);
|
||||
|
||||
connect(ui->exit, SIGNAL(clicked()),this,SLOT(onQuit()));
|
||||
connect(m_worker, SIGNAL(disableExit()),this,SLOT(onDisableExit()));
|
||||
connect(m_worker, SIGNAL(enableExit()),this,SLOT(onEnableExit()));
|
||||
connect(m_worker, SIGNAL(stopStartTimer()),this,SLOT(onStopStartTimer()));
|
||||
connect(m_worker, SIGNAL(restartExitTimer()),this,SLOT(onRestartExitTimer()));
|
||||
connect(m_worker, SIGNAL(appendText(QString,QString)),this,SLOT(onAppendText(QString,QString)));
|
||||
connect(m_worker, SIGNAL(showErrorMessage(QString,QString)),this, SLOT(onShowErrorMessage(QString,QString)));
|
||||
connect(m_worker, SIGNAL(showStatusMessage(QString,QString)),this, SLOT(onShowStatusMessage(QString,QString)));
|
||||
connect(m_worker, SIGNAL(showErrorMessage(QStringList)),this, SLOT(onShowErrorMessage(QStringList)));
|
||||
connect(m_worker, SIGNAL(showStatusMessage(QString,QString)),this, SLOT(onShowStatusMessage(QString,QString)));
|
||||
connect(m_worker, SIGNAL(replaceLast(QString,QString)),this,SLOT(onReplaceLast(QString,QString)));
|
||||
connect(m_worker, SIGNAL(replaceLast(QStringList,QString)),this, SLOT(onReplaceLast(QStringList,QString)));
|
||||
#endif
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow() {
|
||||
//delete m_startTimer;
|
||||
//delete m_exitTimer;
|
||||
closeSerialPort();
|
||||
delete ui;
|
||||
}
|
||||
|
||||
bool MainWindow::openSerialPort() {
|
||||
// const SettingsDialog::Settings p = m_settings->settings();
|
||||
m_serial->setPortName("");
|
||||
m_serial->setBaudRate(QSerialPort::Baud115200);
|
||||
m_serial->setDataBits(QSerialPort::DataBits::Data8);
|
||||
m_serial->setParity(QSerialPort::Parity::NoParity);
|
||||
m_serial->setStopBits(QSerialPort::StopBits::OneStop);
|
||||
m_serial->setFlowControl(QSerialPort::FlowControl::NoFlowControl);
|
||||
if (m_serial->open(QIODevice::ReadWrite)) {
|
||||
//m_console->setEnabled(true);
|
||||
//m_console->setLocalEchoEnabled(p.localEchoEnabled);
|
||||
//m_ui->actionConnect->setEnabled(false);
|
||||
//m_ui->actionDisconnect->setEnabled(true);
|
||||
//m_ui->actionConfigure->setEnabled(false);
|
||||
//showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
|
||||
// .arg(p.name, p.stringBaudRate, p.stringDataBits,
|
||||
// p.stringParity, p.stringStopBits, p.stringFlowControl));
|
||||
return true;
|
||||
} else {
|
||||
//QMessageBox::critical(this, tr("Error"), m_serial->errorString());
|
||||
|
||||
//showStatusMessage(tr("Open error"));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MainWindow::closeSerialPort() {
|
||||
if (m_serial->isOpen()) {
|
||||
m_serial->close();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
//m_console->setEnabled(false);
|
||||
//m_ui->actionConnect->setEnabled(true);
|
||||
//m_ui->actionDisconnect->setEnabled(false);
|
||||
//m_ui->actionConfigure->setEnabled(true);
|
||||
//showStatusMessage(tr("Disconnected"));
|
||||
}
|
||||
|
||||
#if 0
|
||||
void MainWindow::customEvent(QEvent *event) {
|
||||
if (event->type() == ProgressEvent::type()) {
|
||||
ProgressEvent *pevent = (ProgressEvent *)event;
|
||||
int const progress = pevent->progressPercent();
|
||||
QObject const *sender = pevent->sender();
|
||||
if (sender == this) {
|
||||
switch(progress) {
|
||||
case 0: {
|
||||
ui->updateProgress->reset();
|
||||
} break;
|
||||
case START_PROGRESS_LOOP: {
|
||||
m_progressRunning = true;
|
||||
ui->updateProgress->reset();
|
||||
// m_progressValue = 10;
|
||||
QApplication::postEvent(this, new ProgressEvent(this, 1));
|
||||
} break;
|
||||
case STOP_PROGRESS_LOOP: {
|
||||
m_progressRunning = false;
|
||||
// m_progressValue -= 10;
|
||||
// m_worker->setProgress(m_progressValue/10);
|
||||
} break;
|
||||
default: {
|
||||
if (m_progressRunning) {
|
||||
// m_progressValue = progress;
|
||||
ui->updateProgress->setValue(progress);
|
||||
// ueberpruefen: hauptfenster schickt sich selber ein event
|
||||
// QApplication::postEvent(this, new ProgressEvent(this, progress));
|
||||
// QThread::msleep(500);
|
||||
}}
|
||||
}
|
||||
} else
|
||||
if (sender == m_worker) {
|
||||
switch(progress) {
|
||||
case 0: {
|
||||
ui->updateProgress->reset();
|
||||
} break;
|
||||
case START_PROGRESS_LOOP: {
|
||||
QApplication::postEvent(this, new ProgressEvent(this, START_PROGRESS_LOOP));
|
||||
} break;
|
||||
case STOP_PROGRESS_LOOP: {
|
||||
QApplication::postEvent(this, new ProgressEvent(this, STOP_PROGRESS_LOOP));
|
||||
} break;
|
||||
default:{
|
||||
ui->updateProgress->setValue(progress);
|
||||
}}
|
||||
} else {
|
||||
qCritical() << "!!! UNKNOWN SENDER !!!";
|
||||
}
|
||||
}
|
||||
|
||||
QThread::yieldCurrentThread();
|
||||
}
|
||||
|
||||
void MainWindow::onStopStartTimer() {
|
||||
m_startTimer->stop();
|
||||
}
|
||||
|
||||
void MainWindow::onDisableExit() {
|
||||
ui->exit->setEnabled(false);
|
||||
}
|
||||
|
||||
void MainWindow::onEnableExit() {
|
||||
ui->exit->setEnabled(true);
|
||||
}
|
||||
|
||||
void MainWindow::onRestartExitTimer() {
|
||||
m_exitTimer->stop();
|
||||
m_exitTimer->start(5 * 1000);
|
||||
|
||||
scrollDownTextEdit();
|
||||
ui->updateStatus->setEnabled(false);
|
||||
}
|
||||
|
||||
void MainWindow::onQuit() {
|
||||
m_exitTimer->stop();
|
||||
int errorCode = 0;
|
||||
|
||||
qCritical()
|
||||
<< QString("ON QUIT: CURRENT STEP %1")
|
||||
.arg(m_worker->getSmap()[m_worker->currentStep()]);
|
||||
|
||||
// TODO: replace SEND_LAST_VERSION with UPDATE_SUCCEEDED
|
||||
if (m_worker->currentStep() != Worker::UPDATE_STEP::SEND_LAST_VERSION) {
|
||||
errorCode = -1;
|
||||
}
|
||||
qCritical() << QString("ON QUIT: EXIT CODE %1").arg(errorCode);
|
||||
qApp->exit(errorCode);
|
||||
}
|
||||
|
||||
void MainWindow::scrollDownTextEdit() {
|
||||
// Utils::printInfoMsg(QString("SCROLL-DOWN-TEXT_EDIT CALLED AT ")
|
||||
// + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
|
||||
|
||||
ui->updateStatus->setEnabled(true);
|
||||
|
||||
QTextCursor tmpCursor = ui->updateStatus->textCursor();
|
||||
tmpCursor.movePosition(QTextCursor::End);
|
||||
ui->updateStatus->setTextCursor(tmpCursor);
|
||||
ui->updateStatus->ensureCursorVisible();
|
||||
}
|
||||
|
||||
void MainWindow::onAppendText(QString text, QString suffix) {
|
||||
// Utils::printInfoMsg(QString("ON APPEND CALLED AT ")
|
||||
// + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
|
||||
|
||||
QString editText = ui->updateStatus->toPlainText();
|
||||
scrollDownTextEdit();
|
||||
|
||||
if (!suffix.isNull() && suffix.size() > 0) {
|
||||
//qInfo() << "TEXT" << text << "SUFFIX" << suffix;
|
||||
if (suffix == Worker::UPDATE_STEP_SUCCESS || suffix == Worker::UPDATE_STEP_FAIL) {
|
||||
ui->updateStatus->insertPlainText(QString("\n").leftJustified(m_width-3, '=') + " ");
|
||||
// editText += QString("\n").leftJustified(m_width-3, '=');
|
||||
// editText += " ";
|
||||
}
|
||||
QString const &add = (QString("\n") + text).leftJustified(m_width - (2 + suffix.size())) + suffix;
|
||||
ui->updateStatus->insertPlainText(add);
|
||||
// editText += add;
|
||||
} else {
|
||||
QString const &add = text.leftJustified(m_width-9);
|
||||
ui->updateStatus->insertPlainText(add);
|
||||
//editText += add;
|
||||
}
|
||||
|
||||
// debug
|
||||
// QString editText = ui->updateStatus->toPlainText();
|
||||
// Utils::printLineEditInfo(editText.split('\n', QString::SplitBehavior::SkipEmptyParts));
|
||||
// ui->updateStatus->setText(editText.trimmed());
|
||||
|
||||
scrollDownTextEdit();
|
||||
}
|
||||
|
||||
void MainWindow::onReplaceLast(QStringList newTextLines, QString suffix) {
|
||||
// Utils::printInfoMsg(QString("ON REPLACE LAST (LIST) CALLED AT ")
|
||||
// + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
|
||||
int const s = newTextLines.size();
|
||||
if (s > 0) {
|
||||
QString editText = ui->updateStatus->toPlainText();
|
||||
QStringList lines = editText.split('\n', QString::SplitBehavior::SkipEmptyParts);
|
||||
QString newText;
|
||||
if (lines.size() >= s) {
|
||||
for (int i = 0; i < s; ++i) {
|
||||
lines.removeLast();
|
||||
}
|
||||
if (lines.size() > 0) {
|
||||
newText = lines.join('\n');
|
||||
newText += '\n';
|
||||
}
|
||||
QStringList newLines;
|
||||
for (int i = 0; i < s; ++i) {
|
||||
if (i == 0 && !suffix.isNull() && suffix.size() > 0 && suffix != "\n") {
|
||||
newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10) + suffix);
|
||||
} else {
|
||||
newLines += Utils::rstrip(newTextLines.at(i).leftJustified(m_width-10));
|
||||
}
|
||||
}
|
||||
lines += newLines;
|
||||
newText += newLines.join(' ');
|
||||
}
|
||||
|
||||
ui->updateStatus->setText(newText);
|
||||
Utils::printLineEditInfo(lines);
|
||||
scrollDownTextEdit();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onReplaceLast(QString text, QString suffix) {
|
||||
// Utils::printInfoMsg(QString("ON REPLACE LAST (TEXT) CALLED AT ")
|
||||
// + QDateTime::currentDateTime().toString(Qt::ISODateWithMs));
|
||||
QString editText = ui->updateStatus->toPlainText();
|
||||
QStringList lines = editText.split('\n', QString::SplitBehavior::SkipEmptyParts);
|
||||
if (lines.size() > 0) {
|
||||
// removing the last line is really meant for refreshing the last line
|
||||
// with a string very similar than the original one, typically only
|
||||
// followed by a suffix.
|
||||
if (lines.last().contains(text)) {
|
||||
lines.removeLast();
|
||||
}
|
||||
if (!suffix.isNull() && suffix.size() > 0 && suffix != "\n") {
|
||||
QString const add = text.leftJustified(m_width-10) + suffix;
|
||||
if (!add.isEmpty()) {
|
||||
lines += text.leftJustified(m_width-10) + suffix;
|
||||
}
|
||||
} else {
|
||||
QString const add = text.leftJustified(m_width-10);
|
||||
if (!add.isEmpty()) {
|
||||
lines += text.leftJustified(m_width-10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Utils::printLineEditInfo(lines);
|
||||
ui->updateStatus->setText(lines.join('\n').trimmed());
|
||||
scrollDownTextEdit();
|
||||
}
|
||||
|
||||
void MainWindow::onShowMessage(QString title, QString text) {
|
||||
this->statusBar()->clearMessage();
|
||||
this->statusBar()->showMessage( // timeout: 10000
|
||||
QString(title + " " + text).leftJustified(80, ' '), 10000);
|
||||
}
|
||||
|
||||
void MainWindow::onShowErrorMessage(QString title, QString text) {
|
||||
onShowMessage(title, text);
|
||||
}
|
||||
|
||||
void MainWindow::onShowStatusMessage(QString title, QString text) {
|
||||
onShowMessage(title, text);
|
||||
}
|
||||
|
||||
void MainWindow::onShowErrorMessage(QStringList lst) {
|
||||
if (lst.size() >= 2) {
|
||||
onShowMessage(lst.at(0), lst.at(1));
|
||||
}
|
||||
if (lst.size() == 1) {
|
||||
onShowMessage(lst.at(0), "");
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onShowStatusMessage(QStringList lst) {
|
||||
if (lst.size() >= 2) {
|
||||
onShowMessage(lst.at(0), lst.at(1));
|
||||
}
|
||||
if (lst.size() == 1) {
|
||||
onShowMessage(lst.at(0), "");
|
||||
}
|
||||
}
|
||||
#endif
|
58
DownloadDCFirmware/mainwindow.h
Normal file
58
DownloadDCFirmware/mainwindow.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QTimer>
|
||||
#include <QStatusBar>
|
||||
#include <QWidget>
|
||||
#include <QSerialPort>
|
||||
#include <QSerialPortInfo>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class MainWindow; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
||||
class MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow();
|
||||
|
||||
public slots:
|
||||
//void onAppendText(QString, QString suffix = "");
|
||||
//void onReplaceLast(QStringList, QString suffix = "");
|
||||
//void onReplaceLast(QString, QString suffix = "");
|
||||
//void onShowErrorMessage(QString, QString);
|
||||
//void onShowStatusMessage(QString, QString);
|
||||
//void onShowErrorMessage(QStringList);
|
||||
//void onShowStatusMessage(QStringList);
|
||||
//void onStopStartTimer();
|
||||
//void onRestartExitTimer();
|
||||
//void onEnableExit();
|
||||
//void onDisableExit();
|
||||
|
||||
signals:
|
||||
|
||||
private slots:
|
||||
// void onQuit();
|
||||
|
||||
private:
|
||||
// void scrollDownTextEdit();
|
||||
// void onShowMessage(QString, QString);
|
||||
|
||||
bool openSerialPort();
|
||||
bool closeSerialPort();
|
||||
|
||||
Ui::MainWindow *ui;
|
||||
QSerialPort *m_serial;
|
||||
// Worker *m_worker;
|
||||
int const m_width;
|
||||
// QTimer *m_startTimer;
|
||||
// QTimer *m_exitTimer;
|
||||
// bool m_progressRunning;
|
||||
//int m_progressValue;
|
||||
// UpdateDcEvent::UpdateStep m_updateStep;
|
||||
};
|
||||
#endif // MAINWINDOW_H
|
62
DownloadDCFirmware/mainwindow.ui
Normal file
62
DownloadDCFirmware/mainwindow.ui
Normal file
@@ -0,0 +1,62 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>800</width>
|
||||
<height>480</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Source Code Pro</family>
|
||||
</font>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>MainWindow</string>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<widget class="QWidget" name="layoutWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
<width>781</width>
|
||||
<height>441</height>
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" rowspan="3" colspan="2">
|
||||
<widget class="QTextEdit" name="updateStatus">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Misc Fixed</family>
|
||||
<pointsize>11</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="verticalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||
</property>
|
||||
<property name="horizontalScrollBarPolicy">
|
||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||
</property>
|
||||
<property name="sizeAdjustPolicy">
|
||||
<enum>QAbstractScrollArea::AdjustToContents</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
0
DownloadDCFirmware/receiver_thread.cpp
Normal file
0
DownloadDCFirmware/receiver_thread.cpp
Normal file
0
DownloadDCFirmware/receiver_thread.h
Normal file
0
DownloadDCFirmware/receiver_thread.h
Normal file
0
DownloadDCFirmware/sender_thread.cpp
Normal file
0
DownloadDCFirmware/sender_thread.cpp
Normal file
0
DownloadDCFirmware/sender_thread.h
Normal file
0
DownloadDCFirmware/sender_thread.h
Normal file
13
DownloadDCFirmware/worker_thread.cpp
Normal file
13
DownloadDCFirmware/worker_thread.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "worker_thread.h"
|
||||
|
||||
WorkerThread::WorkerThread(QObject *parent)
|
||||
: QThread(parent) {
|
||||
}
|
||||
|
||||
WorkerThread::~WorkerThread() {
|
||||
|
||||
}
|
||||
|
||||
void WorkerThread::run() {
|
||||
|
||||
}
|
20
DownloadDCFirmware/worker_thread.h
Normal file
20
DownloadDCFirmware/worker_thread.h
Normal file
@@ -0,0 +1,20 @@
|
||||
#ifndef WORKER_THREAD_H_INCLUDED
|
||||
#define WORKER_THREAD_H_INCLUDED
|
||||
|
||||
#include <QThread>
|
||||
|
||||
class WorkerThread : public QThread {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit WorkerThread(QObject *parent = nullptr);
|
||||
~WorkerThread();
|
||||
|
||||
|
||||
private:
|
||||
void run() override;
|
||||
|
||||
bool m_quit = false;
|
||||
};
|
||||
|
||||
#endif // WORKER_THREAD_H_INCLUDED
|
@@ -24,7 +24,7 @@ INCLUDEPATH += \
|
||||
plugins \
|
||||
$${INCLUDEINTERFACES} \
|
||||
$${_PRO_FILE_PWD_}/../UpdatePTUDevCtrl \
|
||||
$${_PRO_FILE_PWD_}/../../ATBUpdateTool/common/include
|
||||
$${_PRO_FILE_PWD_}/../common/include
|
||||
|
||||
CONFIG += c++17
|
||||
|
||||
@@ -81,16 +81,17 @@ SOURCES += \
|
||||
../UpdatePTUDevCtrl/message_handler.cpp \
|
||||
../UpdatePTUDevCtrl/commandline_parser.cpp \
|
||||
update.cpp \
|
||||
../../ATBUpdateTool/common/src/System.cpp
|
||||
../common/src/System.cpp
|
||||
|
||||
HEADERS += \
|
||||
../UpdatePTUDevCtrl/message_handler.h \
|
||||
../UpdatePTUDevCtrl/commandline_parser.h \
|
||||
update.h \
|
||||
../../ATBUpdateTool/common/include/System.h
|
||||
../common/include/System.h
|
||||
|
||||
OTHER_FILES += \
|
||||
ATBDownloadDCJsonFiles.ini
|
||||
ATBDownloadDCJsonFiles.ini \
|
||||
../ATBUpdateTool.ini
|
||||
|
||||
|
||||
##########################################################################################
|
||||
|
@@ -15,6 +15,7 @@
|
||||
#include "commandline_parser.h"
|
||||
#include "utils.h"
|
||||
#include "update.h"
|
||||
#include "System.h"
|
||||
|
||||
#include <DeviceController/interfaces.h>
|
||||
|
||||
@@ -68,6 +69,8 @@ int main(int argc, char **argv) {
|
||||
QString plugInDir = parser.plugInDir();
|
||||
QString plugInName = parser.plugInName();
|
||||
QString workingDir = parser.workingDir();
|
||||
QString psaConfigDir = parser.psaConfigDir();
|
||||
QString psaTariffDir = parser.psaTariffDir();
|
||||
QString iniFileName = parser.iniFileName();
|
||||
bool const dryRun = parser.dryRun();
|
||||
bool const noUpdatePsaHardware = parser.noUpdatePsaHardware();
|
||||
@@ -90,6 +93,8 @@ int main(int argc, char **argv) {
|
||||
qInfo() << "plugInDir ................" << plugInDir;
|
||||
qInfo() << "plugInName ..............." << plugInName;
|
||||
qInfo() << "workingDir ..............." << workingDir;
|
||||
qInfo() << "psaConfigDir ............." << psaConfigDir;
|
||||
qInfo() << "psaTariffDir ............." << psaTariffDir;
|
||||
qInfo() << "dryRun ..................." << dryRun;
|
||||
qInfo() << "noUpdatePsaHardware ......" << noUpdatePsaHardware;
|
||||
qInfo() << "alwaysDownloadConfig ....." << alwaysDownloadConfig;
|
||||
@@ -108,28 +113,31 @@ int main(int argc, char **argv) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
QString const customerRepo = QDir::cleanPath(workingDir + QDir::separator() + QString("customer_%1").arg(customerNr));
|
||||
|
||||
qCritical() << "Using customer repository" << customerRepo;
|
||||
|
||||
// always execute contents of opkg_commands-file
|
||||
QString const &customerRepo = QDir::cleanPath(workingDir + QDir::separator() + QString("customer_%1").arg(customerNr));
|
||||
QStringList filesToUpdate;
|
||||
|
||||
QDir dir(QDir::cleanPath(customerRepo + QDir::separator() + "etc/psa_config"));
|
||||
|
||||
if (dir.exists()) {
|
||||
QStringList jsons = dir.entryList(QStringList() << "DC2C*.json", QDir::Files);
|
||||
if (!jsons.isEmpty()) {
|
||||
for (QStringList::size_type i=0; i<jsons.size(); ++i) {
|
||||
filesToUpdate << QDir::cleanPath(QString("etc/psa_config/") + jsons.at(i));
|
||||
}
|
||||
}
|
||||
// etc/psa_config: located under mount-path
|
||||
std::optional<QString> mountPath = System::checkForUSBStick(psaConfigDir);
|
||||
if (mountPath.has_value()) {
|
||||
filesToUpdate = System::getJsonFilesOnUsbStick(mountPath.value());
|
||||
} else {
|
||||
qCritical() << "DIRECTORY" << dir << "DOES NOT EXIST";
|
||||
return -1;
|
||||
qCritical() << "Using customer repository" << customerRepo;
|
||||
|
||||
QDir dir(QDir::cleanPath(customerRepo + QDir::separator() + "etc/psa_config"));
|
||||
if (dir.exists()) {
|
||||
QStringList jsons = dir.entryList(QStringList() << "DC2C*.json", QDir::Files);
|
||||
if (!jsons.isEmpty()) {
|
||||
for (QStringList::size_type i=0; i<jsons.size(); ++i) {
|
||||
filesToUpdate << QDir::cleanPath(QString("etc/psa_config/") + jsons.at(i));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
qCritical() << "DIRECTORY" << dir << "DOES NOT EXIST";
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
qCritical() << "JSON FILES TO UPDATE" << filesToUpdate;
|
||||
// qCritical() << "JSON FILES TO UPDATE" << filesToUpdate;
|
||||
|
||||
Update update(customerRepo,
|
||||
QString::number(customerNr),
|
||||
@@ -138,8 +146,13 @@ int main(int argc, char **argv) {
|
||||
plugInName,
|
||||
workingDir);
|
||||
|
||||
update.doUpdate(filesToUpdate);
|
||||
update.doUpdate(filesToUpdate, mountPath.has_value());
|
||||
update.checkJsonVersions();
|
||||
//update.checkJsonVersions(filesToUpdate);
|
||||
|
||||
if (mountPath.has_value()) {
|
||||
System::umountUSBStick();
|
||||
}
|
||||
|
||||
//return a.exec();
|
||||
return 0;
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@ hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
|
||||
qCritical() << "in directory" << plugInDir.absolutePath();
|
||||
qCritical() << "cannot load plugin" << pluginLoader.fileName();
|
||||
qCritical() << pluginLoader.errorString();
|
||||
exit(-1);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
qCritical() << "loadDCPlugin() plugin directory:" << plugInDir.absolutePath();
|
||||
@@ -54,25 +54,25 @@ hwinf *Update::loadDCPlugin(QDir const &plugInDir, QString const &fname) {
|
||||
|
||||
if (!pluginLoader.isLoaded()) {
|
||||
qCritical() << pluginLoader.errorString();
|
||||
exit(-2);
|
||||
return nullptr;
|
||||
}
|
||||
QObject *plugin = pluginLoader.instance();
|
||||
if (!plugin) {
|
||||
qCritical() << "cannot start instance";
|
||||
exit(-3);
|
||||
return nullptr;
|
||||
}
|
||||
if (! (hw = qobject_cast<hwinf *>(plugin))) {
|
||||
qCritical() << "cannot cast plugin" << plugin << "to hwinf";
|
||||
exit(-4);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
qCritical() << pluginLibName << "does not exist";
|
||||
exit(-5);
|
||||
return nullptr;
|
||||
}
|
||||
} else {
|
||||
qCritical() << "plugins directory" << plugInDir.absolutePath()
|
||||
<< "does not exist";
|
||||
exit(-6);
|
||||
return nullptr;
|
||||
}
|
||||
return hw;
|
||||
}
|
||||
@@ -131,53 +131,31 @@ Update::Update(QString customerRepository,
|
||||
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << ") m_sys_areDCDataValid ..."
|
||||
<< m_sys_areDCdataValid;
|
||||
|
||||
#if 0
|
||||
QObject const *obj = m_hw->getAPI();
|
||||
Q_ASSERT(obj != nullptr);
|
||||
|
||||
QDebug critical = qCritical();
|
||||
critical << "connect() to onReportDCDownloadStatus() ...";
|
||||
if (!connect(obj,
|
||||
SIGNAL(hwapi_reportDCDownloadStatus(QString const&)),
|
||||
this,
|
||||
SLOT(onReportDCDownloadStatus(QString const &)))) {
|
||||
critical << "FAILED";
|
||||
} else critical << "DONE";
|
||||
|
||||
critical = qCritical();
|
||||
critical << "connect() to onReportDCDownloadSuccess() ...";
|
||||
if (!connect(obj,
|
||||
SIGNAL(hwapi_reportDCDownloadSuccess(QString const&)), this,
|
||||
SLOT(onReportDCDownloadSuccess(QString const &)))) {
|
||||
critical << "FAILED";
|
||||
} else critical << "DONE";
|
||||
|
||||
critical = qCritical();
|
||||
critical << "connect() to onReportDCDownloadFailure() ...";
|
||||
if (!connect(obj,
|
||||
SIGNAL(hwapi_reportDCDownloadFailure(QString const &)), this,
|
||||
SLOT(onReportDCDownloadFailure(QString const &)))) {
|
||||
critical << "FAILED";
|
||||
} else critical << "DONE";
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
Update::~Update() {
|
||||
// unloadDCPlugin();
|
||||
unloadDCPlugin();
|
||||
}
|
||||
|
||||
bool Update::doUpdate(QStringList const &filesToWorkOn) {
|
||||
bool Update::doUpdate(QStringList const &filesToWorkOn, bool usbStickDetected) {
|
||||
|
||||
if (!m_hw) {
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! m_hw == nullptr";
|
||||
return false;
|
||||
}
|
||||
|
||||
int tries = 20;
|
||||
while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
|
||||
// must deliver 'true', only then are all data from hwapi valid
|
||||
if (--tries < 0) {
|
||||
qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED";
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED";
|
||||
return false;
|
||||
}
|
||||
qCritical() << "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED (" << tries << ")";
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED (" << tries << ")";
|
||||
m_hw->dc_autoRequest(true);
|
||||
QThread::msleep(500);
|
||||
}
|
||||
@@ -186,7 +164,8 @@ bool Update::doUpdate(QStringList const &filesToWorkOn) {
|
||||
|
||||
QList<QString>::const_iterator it;
|
||||
for (it = filesToWorkOn.cbegin(); it != filesToWorkOn.cend(); ++it) {
|
||||
QString const &fToWorkOn = QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
|
||||
QString const &fToWorkOn = usbStickDetected ? QDir::cleanPath(it->trimmed())
|
||||
: QDir::cleanPath(m_customerRepository + QDir::separator() + it->trimmed());
|
||||
if (fToWorkOn.contains("DC2C_print", Qt::CaseInsensitive)
|
||||
&& fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
|
||||
res = true;
|
||||
@@ -205,19 +184,16 @@ bool Update::doUpdate(QStringList const &filesToWorkOn) {
|
||||
}
|
||||
} else if (fToWorkOn.contains("DC2C_cash", Qt::CaseInsensitive)
|
||||
&& fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
|
||||
res = true;
|
||||
if ((res = updateCashConf(fToWorkOn))) {
|
||||
qCritical() << QString("DOWNLOADED CASH TEMPLATE %1").arg(fToWorkOn);
|
||||
}
|
||||
} else if (fToWorkOn.contains("DC2C_conf", Qt::CaseInsensitive)
|
||||
&& fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
|
||||
res = true;
|
||||
if ((res= updateConfig(fToWorkOn))) {
|
||||
if ((res = updateConfig(fToWorkOn))) {
|
||||
qCritical() << QString("DOWNLOADED CONFIG TEMPLATE %1").arg(fToWorkOn);
|
||||
}
|
||||
} else if (fToWorkOn.contains("DC2C_device", Qt::CaseInsensitive)
|
||||
&& fToWorkOn.endsWith(".json", Qt::CaseInsensitive)) {
|
||||
res = true;
|
||||
if ((res = updateDeviceConf(fToWorkOn))) {
|
||||
qCritical() << QString("DOWNLOADED DEVICE TEMPLATE %1").arg(fToWorkOn);
|
||||
}
|
||||
@@ -230,13 +206,37 @@ bool Update::doUpdate(QStringList const &filesToWorkOn) {
|
||||
return res;
|
||||
}
|
||||
|
||||
bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
|
||||
bool Update::checkJsonVersions(QStringList const& jsonFileNames) {
|
||||
if (!m_hw) {
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! m_hw == nullptr";
|
||||
return false;
|
||||
}
|
||||
|
||||
int tries = 20;
|
||||
while ((m_sys_areDCdataValid = m_hw->sys_areDCdataValid()) == false) {
|
||||
// must deliver 'true', only then are all data from hwapi valid
|
||||
if (--tries < 0) {
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED";
|
||||
return false;
|
||||
}
|
||||
qCritical() << "(" << __func__ << ":" << __LINE__ << "):"
|
||||
<< "ERROR!!! DC DATA NOT VALID -> CA-SLAVE-PLUGIN NOT CONNECTED (" << tries << ")";
|
||||
m_hw->dc_autoRequest(true);
|
||||
QThread::msleep(500);
|
||||
}
|
||||
|
||||
for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) {
|
||||
|
||||
uint8_t jsonNr = 0;
|
||||
|
||||
QString const &fName = jsonFileNames[i];
|
||||
|
||||
// send one request for every single version
|
||||
// jsonNr=1...36, 1=config file (cust.Nr) 2=devices 3=cash 4=res.
|
||||
// 6=printer template 1 ..... 36= template 32
|
||||
|
||||
if (fName.endsWith("conf.json")) {
|
||||
jsonNr = 1;
|
||||
} else
|
||||
@@ -254,31 +254,46 @@ bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
|
||||
bool ok = false;
|
||||
int n = captured.toInt(&ok);
|
||||
if (ok) {
|
||||
jsonNr = n + 4;
|
||||
// note: use 5 (instead of 4 -> index has been shifted)
|
||||
jsonNr = n + 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (jsonNr != 0) {
|
||||
#if 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
|
||||
|
||||
m_hw->sys_requestJsonVersions(jsonNr);
|
||||
QThread::msleep(500);
|
||||
|
||||
char buf[64];
|
||||
memset(buf, 0x00, sizeof(buf));
|
||||
m_hw->sys_getJsonVersions(jsonNr, buf);
|
||||
buf[sizeof(buf)-1] = '\0';
|
||||
buf[16] = '\0'; // the DC only handles 16 bytes
|
||||
|
||||
QString const installedVersion(buf);
|
||||
static const QByteArray cb(16, (char)0xff);
|
||||
|
||||
QString const installedVersion(QString::fromStdString(buf));
|
||||
QString const fileVersion = getFileVersion(jsonFileNames[i]);
|
||||
|
||||
qCritical() << "installed version:" << installedVersion;
|
||||
qCritical() << " file version:" << fileVersion;
|
||||
QFileInfo fi(jsonFileNames[i]);
|
||||
|
||||
qCritical() << endl;
|
||||
qCritical() << " json request nr:" << jsonNr;
|
||||
|
||||
if (installedVersion == fileVersion) {
|
||||
|
||||
qCritical() << " json file:" << fi.fileName();
|
||||
qCritical() << " installed version in DC:" << installedVersion;
|
||||
} else
|
||||
if (cb == QByteArray(buf) && fileVersion == "") {
|
||||
qCritical() << "unknown json file (repo and DC):" << fi.fileName();
|
||||
} else {
|
||||
qCritical() << " json file:" << fi.fileName();
|
||||
qCritical() << " installed version in DC:" << installedVersion;
|
||||
qCritical() << " file version in repository:" << fileVersion;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
qCritical() << "CANNOT FIND JSON-NR FOR" << fName;
|
||||
@@ -288,6 +303,39 @@ bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
QString Update::getFileVersion(QString const& jsonFileName) {
|
||||
// "version":"15.10.2023 14:55 02.00.06",
|
||||
static const QRegularExpression re("^.*(\\\"[Vv]ersion\\\":)([\\s\\\"]{0,})([^,\\\"]{0,}).*$");
|
||||
|
||||
QString fileVersion("");
|
||||
QFile inputFile(QDir::cleanPath(m_customerRepository + QDir::separator() + jsonFileName));
|
||||
|
||||
if (inputFile.exists()) {
|
||||
if (inputFile.open(QIODevice::ReadOnly)) {
|
||||
QTextStream in(&inputFile);
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
|
||||
QRegularExpressionMatch match;
|
||||
int idx = line.indexOf(re, 0, &match);
|
||||
if (idx != -1) {
|
||||
int const lastCaptured = match.lastCapturedIndex();
|
||||
// the dc only sends 16 Byte
|
||||
fileVersion = match.captured(lastCaptured);
|
||||
fileVersion.truncate(16);
|
||||
break;
|
||||
}
|
||||
}
|
||||
inputFile.close();
|
||||
}
|
||||
} else {
|
||||
// qCritical() << "ERROR" << inputFile.fileName() << "does not exist";
|
||||
}
|
||||
|
||||
return fileVersion;
|
||||
}
|
||||
|
||||
bool Update::downloadJson(enum FileTypeJson type,
|
||||
int templateIdx,
|
||||
QString jsFileToSendToDC) const {
|
||||
|
@@ -9,6 +9,8 @@
|
||||
#include <QProcess>
|
||||
#include <QPluginLoader>
|
||||
|
||||
#include <initializer_list>
|
||||
|
||||
#include <DeviceController/interfaces.h>
|
||||
|
||||
#ifdef PTU5
|
||||
@@ -56,7 +58,7 @@ public:
|
||||
|
||||
virtual ~Update() override;
|
||||
|
||||
bool doUpdate(QStringList const &jsonFilesToDownload);
|
||||
bool doUpdate(QStringList const &jsonFilesToDownload, bool usbStickDetected = false);
|
||||
|
||||
bool updatePrinterTemplate(int templateIdx, QString fname) const;
|
||||
bool updateConfig(QString jsFileToSendToDC);
|
||||
@@ -67,7 +69,46 @@ public:
|
||||
QString jsFileToSendToDC) const;
|
||||
|
||||
|
||||
bool checkDownloadedJsonVersions(QStringList const& jsonFileNames);
|
||||
QString getFileVersion(QString const& jsonFileName);
|
||||
bool checkJsonVersions(QStringList const& jsonFileNames =
|
||||
QStringList(
|
||||
QList(
|
||||
std::initializer_list<QString>{
|
||||
QString("etc/psa_config/DC2C_conf.json"),
|
||||
QString("etc/psa_config/DC2C_cash.json"),
|
||||
QString("etc/psa_config/DC2C_device.json"),
|
||||
QString("etc/psa_config/DC2C_print01.json"),
|
||||
QString("etc/psa_config/DC2C_print02.json"),
|
||||
QString("etc/psa_config/DC2C_print03.json"),
|
||||
QString("etc/psa_config/DC2C_print04.json"),
|
||||
QString("etc/psa_config/DC2C_print05.json"),
|
||||
QString("etc/psa_config/DC2C_print06.json"),
|
||||
QString("etc/psa_config/DC2C_print07.json"),
|
||||
QString("etc/psa_config/DC2C_print08.json"),
|
||||
QString("etc/psa_config/DC2C_print09.json"),
|
||||
QString("etc/psa_config/DC2C_print10.json"),
|
||||
QString("etc/psa_config/DC2C_print11.json"),
|
||||
QString("etc/psa_config/DC2C_print12.json"),
|
||||
QString("etc/psa_config/DC2C_print13.json"),
|
||||
QString("etc/psa_config/DC2C_print14.json"),
|
||||
QString("etc/psa_config/DC2C_print15.json"),
|
||||
QString("etc/psa_config/DC2C_print16.json"),
|
||||
QString("etc/psa_config/DC2C_print17.json"),
|
||||
QString("etc/psa_config/DC2C_print18.json"),
|
||||
QString("etc/psa_config/DC2C_print19.json"),
|
||||
QString("etc/psa_config/DC2C_print20.json"),
|
||||
QString("etc/psa_config/DC2C_print21.json"),
|
||||
QString("etc/psa_config/DC2C_print22.json"),
|
||||
QString("etc/psa_config/DC2C_print23.json"),
|
||||
QString("etc/psa_config/DC2C_print24.json"),
|
||||
QString("etc/psa_config/DC2C_print25.json"),
|
||||
QString("etc/psa_config/DC2C_print26.json"),
|
||||
QString("etc/psa_config/DC2C_print27.json"),
|
||||
QString("etc/psa_config/DC2C_print28.json"),
|
||||
QString("etc/psa_config/DC2C_print29.json"),
|
||||
QString("etc/psa_config/DC2C_print30.json"),
|
||||
QString("etc/psa_config/DC2C_print31.json"),
|
||||
QString("etc/psa_config/DC2C_print32.json")})));
|
||||
/*
|
||||
bool checkDownloadedJsonVersions(QStringList const& jsonFileNames);
|
||||
|
||||
|
@@ -123,7 +123,8 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
# Check m_hw (pointer to CA-(Slave)Plugin) before its use.
|
||||
# Only exit() if firmware is configured to be possibly updated, but
|
||||
# loading the CA-plugin failed.
|
||||
VERSION="1.4.7"
|
||||
# 1.4.7 : Read Json-file versions of Json-files actually loaded into DC.
|
||||
VERSION="1.4.8"
|
||||
# PLANNED TODOS:
|
||||
# 1: Das Repository wird repariert bwz. neu geklont. Unabhaengig vom WAIT.
|
||||
# 2: Wenn der WAIT-Button aktiv ist, dann wird ein Repository repariert (neu
|
||||
|
@@ -60,6 +60,16 @@ CommandLineParser::CommandLineParser()
|
||||
QStringList() << "working-directory" << "working-directory",
|
||||
QCoreApplication::translate("main", "working directory of update-script."),
|
||||
QCoreApplication::translate("main", "directory")))
|
||||
, m_psaConfigDirectoryOption(
|
||||
QCommandLineOption(
|
||||
QStringList() << "psa-config-directory" << "psa-config-directory",
|
||||
QCoreApplication::translate("main", "config directory of json-files sent to dc."),
|
||||
QCoreApplication::translate("main", "directory")))
|
||||
, m_psaTariffDirectoryOption(
|
||||
QCommandLineOption(
|
||||
QStringList() << "psa-tariff-directory" << "psa-tariff-directory",
|
||||
QCoreApplication::translate("main", "tariff directory of tariff-json-files."),
|
||||
QCoreApplication::translate("main", "directory")))
|
||||
, m_dryRunOption(
|
||||
QCommandLineOption(
|
||||
QStringList() << "d" << "dry-run",
|
||||
@@ -111,6 +121,12 @@ void CommandLineParser::configure() {
|
||||
m_workingDirectoryOption.setDefaultValue("/opt/app/tools/atbupdate/");
|
||||
m_parser.addOption(m_workingDirectoryOption);
|
||||
|
||||
m_psaConfigDirectoryOption.setDefaultValue("etc/psa_config/");
|
||||
m_parser.addOption(m_psaConfigDirectoryOption);
|
||||
|
||||
m_psaTariffDirectoryOption.setDefaultValue("etc/psa_tariff/");
|
||||
m_parser.addOption(m_psaTariffDirectoryOption);
|
||||
|
||||
m_dryRunOption.setDefaultValue("false");
|
||||
m_parser.addOption(m_dryRunOption);
|
||||
|
||||
@@ -151,6 +167,12 @@ void CommandLineParser::readSettings() {
|
||||
if (key.contains("working-directory")) {
|
||||
m_workingDir = v.toString();
|
||||
} else
|
||||
if (key.contains("psa-config-directory")) {
|
||||
m_psaConfigDir = v.toString();
|
||||
} else
|
||||
if (key.contains("psa-tariff-directory")) {
|
||||
m_psaTariffDir = v.toString();
|
||||
} else
|
||||
if (key.contains("dry-run")) {
|
||||
m_dryRun = (v.toBool() ? "true" : "false");
|
||||
} else
|
||||
@@ -207,6 +229,20 @@ QString CommandLineParser::plugInName() {
|
||||
return m_plugInName;
|
||||
}
|
||||
|
||||
QString CommandLineParser::psaConfigDir() {
|
||||
if (m_parser.isSet(m_psaConfigDirectoryOption)) {
|
||||
m_psaConfigDir = m_parser.value(m_psaConfigDirectoryOption);
|
||||
}
|
||||
return m_psaConfigDir;
|
||||
}
|
||||
|
||||
QString CommandLineParser::psaTariffDir() {
|
||||
if (m_parser.isSet(m_psaTariffDirectoryOption)) {
|
||||
m_psaTariffDir = m_parser.value(m_psaTariffDirectoryOption);
|
||||
}
|
||||
return m_psaTariffDir;
|
||||
}
|
||||
|
||||
QString CommandLineParser::workingDir() {
|
||||
if (m_parser.isSet(m_workingDirectoryOption)) {
|
||||
m_workingDir = m_parser.value(m_workingDirectoryOption);
|
||||
|
@@ -11,6 +11,8 @@ class CommandLineParser : public QCommandLineParser {
|
||||
QString m_plugInDir;
|
||||
QString m_plugInName;
|
||||
QString m_workingDir;
|
||||
QString m_psaConfigDir;
|
||||
QString m_psaTariffDir;
|
||||
QString m_dryRun;
|
||||
QString m_noUpdatePsaHardware;
|
||||
QString m_showYoctoVersion;
|
||||
@@ -29,6 +31,8 @@ class CommandLineParser : public QCommandLineParser {
|
||||
QCommandLineOption m_alwaysDownloadConfigOption;
|
||||
QCommandLineOption m_alwaysDownloadDCOption;
|
||||
QCommandLineOption m_workingDirectoryOption;
|
||||
QCommandLineOption m_psaConfigDirectoryOption;
|
||||
QCommandLineOption m_psaTariffDirectoryOption;
|
||||
QCommandLineOption m_dryRunOption;
|
||||
QCommandLineOption m_extendedVersionOption;
|
||||
QCommandLineOption m_yoctoVersionOption;
|
||||
@@ -52,6 +56,8 @@ public:
|
||||
QString plugInDir();
|
||||
QString plugInName();
|
||||
QString workingDir();
|
||||
QString psaConfigDir();
|
||||
QString psaTariffDir();
|
||||
bool dryRun();
|
||||
bool noUpdatePsaHardware();
|
||||
bool yoctoVersion();
|
||||
|
@@ -592,23 +592,31 @@ QStringList Update::getDcSoftAndHardWareVersion() {
|
||||
|
||||
QString Update::getFileVersion(QString const& jsonFileName) {
|
||||
// "version":"15.10.2023 14:55 02.00.06",
|
||||
static const QRegularExpression re("^.*(\\\"version\\\":)(.*)$");
|
||||
static const QRegularExpression re("^.*(\\\"[Vv]ersion\\\":)([\\s\\\"]{0,})([^,\\\"]{0,}).*$");
|
||||
|
||||
QString fileVersion;
|
||||
QFile inputFile(jsonFileName);
|
||||
if (inputFile.open(QIODevice::ReadOnly)) {
|
||||
QTextStream in(&inputFile);
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
QString fileVersion("");
|
||||
QFile inputFile(QDir::cleanPath(m_customerRepository + QDir::separator() + jsonFileName));
|
||||
|
||||
QRegularExpressionMatch match;
|
||||
int idx = line.indexOf(re, 0, &match);
|
||||
if (idx != -1) {
|
||||
fileVersion = match.captured(match.lastCapturedIndex());
|
||||
break;
|
||||
}
|
||||
}
|
||||
inputFile.close();
|
||||
if (inputFile.exists()) {
|
||||
if (inputFile.open(QIODevice::ReadOnly)) {
|
||||
QTextStream in(&inputFile);
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
|
||||
QRegularExpressionMatch match;
|
||||
int idx = line.indexOf(re, 0, &match);
|
||||
if (idx != -1) {
|
||||
int const lastCaptured = match.lastCapturedIndex();
|
||||
// the dc only sends 16 Byte
|
||||
fileVersion = match.captured(lastCaptured);
|
||||
fileVersion.truncate(16);
|
||||
break;
|
||||
}
|
||||
}
|
||||
inputFile.close();
|
||||
}
|
||||
} else {
|
||||
// qCritical() << "ERROR" << inputFile.fileName() << "does not exist";
|
||||
}
|
||||
|
||||
return fileVersion;
|
||||
@@ -619,58 +627,79 @@ bool Update::checkDownloadedJsonVersions(QStringList const& jsonFileNames) {
|
||||
for (QStringList::size_type i=0; i < jsonFileNames.size(); ++i) {
|
||||
|
||||
uint8_t jsonNr = 0;
|
||||
QFileInfo fInfo(jsonFileNames[i]);
|
||||
|
||||
if (fInfo.fileName().endsWith("conf.json")) {
|
||||
QString const &fName = jsonFileNames[i];
|
||||
|
||||
// send one request for every single version
|
||||
// jsonNr=1...36, 1=config file (cust.Nr) 2=devices 3=cash 4=res.
|
||||
// 6=printer template 1 ..... 36= template 32
|
||||
|
||||
if (fName.endsWith("conf.json")) {
|
||||
jsonNr = 1;
|
||||
} else
|
||||
if (fInfo.fileName().endsWith("device.json")) {
|
||||
if (fName.endsWith("device.json")) {
|
||||
jsonNr = 2;
|
||||
} else
|
||||
if (fInfo.fileName().endsWith("cash.json")) {
|
||||
if (fName.endsWith("cash.json")) {
|
||||
jsonNr = 3;
|
||||
} else {
|
||||
QRegularExpressionMatch match;
|
||||
static const QRegularExpression re("^(.*print)([0-3][0-9])\\.json\\s*$");
|
||||
int idx = fInfo.fileName().indexOf(re, 0, &match);
|
||||
int idx = fName.indexOf(re, 0, &match);
|
||||
if (idx != -1) {
|
||||
QString captured = match.captured(match.lastCapturedIndex());
|
||||
bool ok = false;
|
||||
int n = captured.toInt(&ok);
|
||||
if (ok) {
|
||||
jsonNr = n + 4;
|
||||
// note: the '5' is correct
|
||||
jsonNr = n + 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (jsonNr != 0) {
|
||||
#if 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
|
||||
|
||||
m_hw->sys_requestJsonVersions(jsonNr);
|
||||
QThread::msleep(500);
|
||||
|
||||
char buf[64];
|
||||
memset(buf, 0x00, sizeof(buf));
|
||||
m_hw->sys_getJsonVersions(jsonNr, buf);
|
||||
buf[sizeof(buf)-1] = '\0';
|
||||
buf[16] = '\0'; // the DC only handles 16 bytes
|
||||
|
||||
QString const installedVersion(buf);
|
||||
static const QByteArray cb(16, (char)0xff);
|
||||
|
||||
QString const installedVersion(QString::fromStdString(buf));
|
||||
QString const fileVersion = getFileVersion(jsonFileNames[i]);
|
||||
|
||||
qCritical() << "installed version:" << installedVersion;
|
||||
qCritical() << " file version:" << fileVersion;
|
||||
QFileInfo fi(jsonFileNames[i]);
|
||||
|
||||
qCritical() << endl;
|
||||
qCritical() << " json request nr:" << jsonNr;
|
||||
|
||||
if (installedVersion == fileVersion) {
|
||||
|
||||
qCritical() << " json file:" << fi.fileName();
|
||||
qCritical() << " installed version in DC:" << installedVersion;
|
||||
} else
|
||||
if (cb == QByteArray(buf) && fileVersion == "") {
|
||||
qCritical() << "unknown json file (repo and DC):" << fi.fileName();
|
||||
} else {
|
||||
qCritical() << " json file:" << fi.fileName();
|
||||
qCritical() << " installed version in DC:" << installedVersion;
|
||||
qCritical() << " file version in repository:" << fileVersion;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else {
|
||||
qCritical() << "CANNOT FIND JSON-NR FOR" << jsonFileNames[i];
|
||||
qCritical() << "CANNOT FIND JSON-NR FOR" << fName;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Update::doUpdate(int &displayIndex, QStringList const &filesToWorkOn) {
|
||||
|
||||
if (!m_hw) {
|
||||
|
@@ -869,6 +869,7 @@ bool Worker::execOpkgCommands() {
|
||||
QStringList opkgErrorLst;
|
||||
while (!in.atEnd()) {
|
||||
QString line = in.readLine();
|
||||
// TODO: "^\\s*[#]{0,}$" : empty line or comment line starting with #
|
||||
static const QRegularExpression comment("^\\s*#.*$");
|
||||
if (line.indexOf(comment, 0) == -1) {
|
||||
// found opkg command
|
||||
|
@@ -3,6 +3,10 @@
|
||||
|
||||
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
|
||||
#include <optional>
|
||||
#include <initializer_list>
|
||||
|
||||
class System : public QObject
|
||||
{
|
||||
@@ -13,16 +17,17 @@ private:
|
||||
|
||||
static QString errorMsg;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
static const QStringList allowedJsonFiles;
|
||||
|
||||
static bool checkForSDCard();
|
||||
static bool umountSDCard();
|
||||
|
||||
static bool checkForUSBStick();
|
||||
static QString getUSBMountPath();
|
||||
static QString getUSBDeviceName();
|
||||
static std::optional<QString> checkForUSBStick(QString const &dirPathUnderMountPath = ".");
|
||||
static QString getUSBMountPath(QString const &dirPathUnderMountPath = ".");
|
||||
|
||||
//static QString getUSBDeviceName();
|
||||
static bool umountUSBStick();
|
||||
|
||||
static bool test_mount(const QString& dev, const QString &mountpoint);
|
||||
@@ -48,7 +53,7 @@ public:
|
||||
static QString getPTU4SerialNumber();
|
||||
static QString getPTU4MACAddress();
|
||||
|
||||
|
||||
static QStringList getJsonFilesOnUsbStick(QString const &mountPath);
|
||||
|
||||
};
|
||||
|
||||
|
23
common/include/message_handler.h
Executable file
23
common/include/message_handler.h
Executable file
@@ -0,0 +1,23 @@
|
||||
#ifndef MESSAGE_HANDLER_H_INCLUDED
|
||||
#define MESSAGE_HANDLER_H_INCLUDED
|
||||
|
||||
#include <QtGlobal>
|
||||
#ifdef __linux__
|
||||
#include <syslog.h>
|
||||
#endif
|
||||
|
||||
int getDebugLevel();
|
||||
void setDebugLevel(int newDebugLevel);
|
||||
|
||||
bool messageHandlerInstalled();
|
||||
QtMessageHandler atbInstallMessageHandler(QtMessageHandler handler);
|
||||
|
||||
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
|
||||
// typedef void (*QtMessageHandler)(QtMsgType, const char *);
|
||||
void atbDebugOutput(QtMsgType type, const char *msg);
|
||||
#elif QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
// typedef void (*QtMessageHandler)(QtMsgType, const QMessageLogContext &, const QString &);
|
||||
void atbDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
|
||||
#endif
|
||||
|
||||
#endif // MESSAGE_HANDLER_H_INCLUDED
|
@@ -7,10 +7,52 @@
|
||||
#include <QRegExp>
|
||||
#include <QStringList>
|
||||
#include <QDebug>
|
||||
#include <QDirIterator>
|
||||
|
||||
//#include "version.h"
|
||||
|
||||
|
||||
|
||||
|
||||
const QStringList System::allowedJsonFiles =
|
||||
std::initializer_list<QString>{
|
||||
QString("DC2C_conf.json"),
|
||||
QString("DC2C_cash.json"),
|
||||
QString("DC2C_device.json"),
|
||||
QString("DC2C_print01.json"),
|
||||
QString("DC2C_print02.json"),
|
||||
QString("DC2C_print03.json"),
|
||||
QString("DC2C_print04.json"),
|
||||
QString("DC2C_print05.json"),
|
||||
QString("DC2C_print06.json"),
|
||||
QString("DC2C_print07.json"),
|
||||
QString("DC2C_print08.json"),
|
||||
QString("DC2C_print09.json"),
|
||||
QString("DC2C_print10.json"),
|
||||
QString("DC2C_print11.json"),
|
||||
QString("DC2C_print12.json"),
|
||||
QString("DC2C_print13.json"),
|
||||
QString("DC2C_print14.json"),
|
||||
QString("DC2C_print15.json"),
|
||||
QString("DC2C_print16.json"),
|
||||
QString("DC2C_print17.json"),
|
||||
QString("DC2C_print18.json"),
|
||||
QString("DC2C_print19.json"),
|
||||
QString("DC2C_print20.json"),
|
||||
QString("DC2C_print21.json"),
|
||||
QString("DC2C_print22.json"),
|
||||
QString("DC2C_print23.json"),
|
||||
QString("DC2C_print24.json"),
|
||||
QString("DC2C_print25.json"),
|
||||
QString("DC2C_print26.json"),
|
||||
QString("DC2C_print27.json"),
|
||||
QString("DC2C_print28.json"),
|
||||
QString("DC2C_print29.json"),
|
||||
QString("DC2C_print30.json"),
|
||||
QString("DC2C_print31.json"),
|
||||
QString("DC2C_print32.json")
|
||||
};
|
||||
|
||||
QString System::errorMsg = "";
|
||||
|
||||
System::System(QObject *parent) :
|
||||
@@ -209,8 +251,7 @@ bool System::test_dir(const QString& dir)
|
||||
|
||||
|
||||
|
||||
bool System::checkForUSBStick()
|
||||
{
|
||||
std::optional<QString> System::checkForUSBStick(QString const &dirPathUnderMountPath) {
|
||||
#if defined (ARCH_DesktopLinux)
|
||||
// DEBUG / TEST:
|
||||
if (QFileInfo(getUSBMountPath()).isDir())
|
||||
@@ -219,11 +260,9 @@ bool System::checkForUSBStick()
|
||||
return false;
|
||||
#endif
|
||||
|
||||
if (getUSBMountPath().isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
QString const &mountPath = getUSBMountPath(dirPathUnderMountPath);
|
||||
// qCritical() << "MOUNT-PATH" << mountPath;
|
||||
return mountPath.isEmpty() ? std::nullopt : std::optional<QString>(mountPath);
|
||||
}
|
||||
|
||||
|
||||
@@ -235,8 +274,7 @@ bool System::checkForUSBStick()
|
||||
* Note, do not return an empty string ("") here because a calling method (which could not be
|
||||
* identified till now) is relying on this!
|
||||
*/
|
||||
QString System::getUSBMountPath()
|
||||
{
|
||||
QString System::getUSBMountPath(QString const &dirPathUnderMountPath) {
|
||||
|
||||
#if defined (ARCH_DesktopLinux)
|
||||
// DEBUG / TEST:
|
||||
@@ -277,8 +315,13 @@ QString System::getUSBMountPath()
|
||||
|
||||
mountLine = line.split(' ');
|
||||
if (mountLine.size() > 3) {
|
||||
qDebug() << "System::getUSBMountPath(): " << mountLine.at(0) << " is mounted on " << mountLine.at(2);
|
||||
return mountLine.at(2);
|
||||
qCritical() << "System::getUSBMountPath(): " << mountLine.at(0) << " is mounted on " << mountLine.at(2);
|
||||
QDir d(QDir::cleanPath(mountLine.at(2) + QDir::separator() + dirPathUnderMountPath));
|
||||
if (d.exists()) {
|
||||
return mountLine.at(2);
|
||||
} else {
|
||||
qCritical() << "directory" << d.absolutePath() << "does not exist";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -289,6 +332,27 @@ QString System::getUSBMountPath()
|
||||
return "";
|
||||
}
|
||||
|
||||
QStringList System::getJsonFilesOnUsbStick(QString const &mountPath) {
|
||||
QStringList jsonFiles;
|
||||
|
||||
// /media/sda2/etc/psa_config
|
||||
QString const &dirPath = QDir::cleanPath(mountPath + QDir::separator() + "etc" + QDir::separator() + "psa_config");
|
||||
QDir d(dirPath);
|
||||
if (d.exists()) {
|
||||
QDirIterator it(dirPath, QStringList() << "*.json", QDir::Files, QDirIterator::NoIteratorFlags);
|
||||
while (it.hasNext()) {
|
||||
QString const &jsonFile = it.next();
|
||||
QFileInfo fi(jsonFile);
|
||||
if (System::allowedJsonFiles.contains(fi.fileName())) {
|
||||
jsonFiles << jsonFile;
|
||||
} else {
|
||||
qCritical() << "Warning:" << fi.fileName() << "unknown";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return jsonFiles;
|
||||
}
|
||||
|
||||
/********************************************************************************
|
||||
* static function to check if a mounted sd-card is writable.
|
||||
|
97
common/src/message_handler.cpp
Executable file
97
common/src/message_handler.cpp
Executable file
@@ -0,0 +1,97 @@
|
||||
#include "message_handler.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <cstring>
|
||||
#include <QString>
|
||||
#include <QFileInfo>
|
||||
#include <QMessageLogContext>
|
||||
|
||||
|
||||
static char const *DBG_NAME[] = { "DBG ", "WARN ", "CRIT ", "FATAL", "INFO " };
|
||||
static bool installedMsgHandler = false;
|
||||
static int debugLevel = LOG_NOTICE;
|
||||
|
||||
int getDebugLevel() { return debugLevel; }
|
||||
void setDebugLevel(int newDebugLevel) {
|
||||
debugLevel = newDebugLevel;
|
||||
}
|
||||
|
||||
bool messageHandlerInstalled() {
|
||||
return installedMsgHandler;
|
||||
}
|
||||
|
||||
QtMessageHandler atbInstallMessageHandler(QtMessageHandler handler) {
|
||||
installedMsgHandler = (handler != 0);
|
||||
static QtMessageHandler prevHandler = nullptr;
|
||||
if (handler) {
|
||||
prevHandler = qInstallMessageHandler(handler);
|
||||
return prevHandler;
|
||||
} else {
|
||||
return qInstallMessageHandler(prevHandler);
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief Print message according to given debug level.
|
||||
///
|
||||
/// \note Install this function using qInstallMsgHandler().
|
||||
///
|
||||
/// int main(int argc, char **argv) {
|
||||
/// installMsgHandler(atbDebugOutput);
|
||||
/// QApplication app(argc, argv);
|
||||
/// ...
|
||||
/// return app.exec();
|
||||
/// }
|
||||
///
|
||||
#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 0) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||
void atbDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
|
||||
Q_UNUSED(context);
|
||||
QString const localMsg = QString(DBG_NAME[type]) + msg.toLocal8Bit();
|
||||
|
||||
switch (debugLevel) {
|
||||
case LOG_DEBUG: { // debug-level message
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
} break;
|
||||
case LOG_INFO: { // informational message
|
||||
if (type != QtDebugMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_NOTICE: { // normal, but significant, condition
|
||||
if (type != QtDebugMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_WARNING: { // warning conditions
|
||||
if (type != QtInfoMsg && type != QtDebugMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_ERR: { // error conditions
|
||||
if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_CRIT: { // critical conditions
|
||||
if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_ALERT: { // action must be taken immediately
|
||||
if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
case LOG_EMERG: { // system is unusable
|
||||
if (type != QtInfoMsg && type != QtDebugMsg && type != QtWarningMsg) {
|
||||
syslog(LOG_DEBUG, "%s", localMsg.toStdString().c_str());
|
||||
}
|
||||
} break;
|
||||
default: {
|
||||
//fprintf(stderr, "%s No ErrorLevel defined! %s\n",
|
||||
// datetime.toStdString().c_str(), msg.toStdString().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user