Compare commits

..

9 Commits

Author SHA1 Message Date
2b934f6baf Added signals
void sendCmdSendVersionToIsmas(QString);
    void sendCmdEventToIsmas(QString);
and associated slots:
    void onSendCmdSendVersionToIsmas(QString);
    void onSendCmdEventToIsmas(QString);
Implemented slots.
2023-07-19 16:53:45 +02:00
1bdae56342 Added debug messages.
Fixed gitBlob(): do not check for existing customer repository.
2023-07-19 16:50:54 +02:00
6caaae6d50 Add struct PSAInstalled.
Changed interface of updateOfPSASendVersion into
    QString updateOfPSASendVersion(PSAInstalled const &psa);

Re-implemented updateOfPSASendVersion().
2023-07-19 16:48:42 +02:00
4dc0c71d3f Add -g flag even for release build 2023-07-19 16:46:29 +02:00
a54f4f94c9 Minor change: remove not needed customerNrStr-variable 2023-07-19 16:45:43 +02:00
b8d6c909eb Minor change: reset output buffer-length to 1024 2023-07-19 16:44:26 +02:00
e35fb9dc19 Commented out debug-messages 2023-07-19 16:43:24 +02:00
0e0363f131 Additinal UPDATE_STATE constants.
Added struct UpdateStatus for printing debug messages.
Added member variables used for sending SENDCMD to ISMAS.A
Added helper functions
    getATBQTVersion(),
    getCPUSerial(),
    getRaucVersion(),
    getOpkgVersion(),
    getPluginVersion(),
    getDCVersion(),
    getFileSize().

Removed automatic restart of Apism.
Added emergency timer to end application after 10 mintes.
onHandleChangedFilenames():
    handling of opkg_commands
    handling of json/dc -> deactivated for the moment.
Re-implemented onSendCmdSendVersionToIsmas(): use only one parameter of type PSAInstalled.
Implemented operators<<() to print debug messages.
2023-07-19 16:42:18 +02:00
088d7c8aa0 Additinal UPDATE_STATE constants.
Added struct UpdateStatus for printing debug messages.
Added member variables used for sending SENDCMD to ISMAS.A
Added helper functions
    getATBQTVersion(),
    getCPUSerial(),
    getRaucVersion(),
    getOpkgVersion(),
    getPluginVersion(),
    getDCVersion(),
    getFileSize().
2023-07-19 16:35:48 +02:00
11 changed files with 863 additions and 219 deletions

View File

@ -14,6 +14,7 @@ CONFIG += c++17 console
DEFINES+=APP_VERSION=\\\"$$VERSION\\\"
QMAKE_CXXFLAGS += -g
QMAKE_CXXFLAGS += -Wno-deprecated-copy
# custom target for 'git subtree'

View File

@ -36,6 +36,8 @@ ApismClient::ApismClient(QObject *eventReceiver, ATBHMIconfig *config, Persisten
this, &ApismClient::onRequestResponseClientResponseTimeout);
connect(apismTcpSendClient, &ApismTcpClient::responseTimeout,
this, &ApismClient::onSendClientResponseTimeout);
connect(this, SIGNAL(sendCmdSendVersionToIsmas(QString)),
this, SLOT(onSendCmdSendVersionToIsmas(QString)));
// not needed as APISM closes the socket after we send data, so readyRead()
// might not even fire
@ -395,31 +397,7 @@ void ApismClient::requestAvailableIsmasUpdates() {
this->apismTcpRequestResponseClient->sendData(data);
}
void ApismClient::sendCmdSendVersionToIsmas(QString const &msg) {
QJsonParseError parseError;
QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError));
if (parseError.error != QJsonParseError::NoError) {
qCritical() << "INVALID JSON MSG: PARSING FAILED:"
<< parseError.error << parseError.errorString();
return;
}
if (!document.isObject()) {
qCritical() << "FILE IS NOT A JSON OBJECT!";
return;
}
QByteArray data = "#M=APISM#C=CMD_SENDVERSION#J=";
data += document.toJson(QJsonDocument::Compact);
// printf("data=%s\n", QString(data).toStdString().c_str());
this->currentRequest = ISMAS::REQUEST::NO_REQUEST;
this->apismTcpSendClient->sendData(data);
}
void ApismClient::emulateUpdatesAvailable(QString const &msg) {
void ApismClient::onSendCmdEventToIsmas(QString msg) {
QJsonParseError parseError;
QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError));
if (parseError.error != QJsonParseError::NoError) {
@ -436,12 +414,36 @@ void ApismClient::emulateUpdatesAvailable(QString const &msg) {
QByteArray data = "#M=APISM#C=CMD_EVENT#J=";
data += document.toJson(QJsonDocument::Compact);
qDebug() << "EMULATE UPDATES AVAILABLE" << QString(data).toStdString().c_str();
this->currentRequest = ISMAS::REQUEST::NO_REQUEST;
this->apismTcpSendClient->sendData(data);
}
void ApismClient::onSendCmdSendVersionToIsmas(QString msg) {
QJsonParseError parseError;
QJsonDocument document(QJsonDocument::fromJson(msg.toUtf8(), &parseError));
if (parseError.error != QJsonParseError::NoError) {
qCritical() << "INVALID JSON MSG: PARSING FAILED:"
<< parseError.error << parseError.errorString();
return;
}
if (!document.isObject()) {
qCritical() << "FILE IS NOT A JSON OBJECT!";
return;
}
QByteArray data = "#M=APISM#C=CMD_SENDVERSION#J=";
data += document.toJson(QJsonDocument::Compact);
this->currentRequest = ISMAS::REQUEST::NO_REQUEST;
this->apismTcpSendClient->sendData(data);
}
void ApismClient::emulateUpdatesAvailable(QString const &msg) {
qDebug() << "EMULATE UPDATES AVAILABLE. MSG=" << msg;
onSendCmdEventToIsmas(msg);
}
void ApismClient::sendState(const QString & state, const QString & msg)
{
qCritical() << "ApismClient::sendState(): ";
@ -607,6 +609,9 @@ void ApismClient::sendMininformPingRequest()
void ApismClient::onReceivedResponse(QByteArray response) {
qCritical() << "RECEIVED ------> " << response;
if (this->currentRequest == ISMAS::REQUEST::NO_REQUEST &&
response == "RECORD SAVED") { // sent by APISM to indicate that record
return; // has been saved in DB

View File

@ -50,6 +50,9 @@ public:
quint32 getLastError();
const QString & getLastErrorDescription();
ApismTcpClient* getApismTcpSendClient() { return apismTcpSendClient; }
public slots:
void sendSelfTest();
void sendTransaction(const VendingData* vendingData);
@ -58,7 +61,8 @@ public slots:
void sendState(const QString & state, const QString & msg);
void emulateUpdatesAvailable(QString const &msg);
void sendCmdSendVersionToIsmas(QString const &msg);
void onSendCmdSendVersionToIsmas(QString);
void onSendCmdEventToIsmas(QString);
void requestAvailableIsmasUpdates();
@ -80,7 +84,8 @@ signals:
void sendReqSelfResponse(nsApismInterface::RESULT_STATE result, QJsonObject response);
void ismasResponseAvailable(QJsonObject ismasResponse);
void sendCmdSendVersionToIsmas(QString);
void sendCmdEventToIsmas(QString);
private slots:
// void onSocketError(QAbstractSocket::SocketError socketError);

View File

@ -29,22 +29,36 @@ GitClient::GitClient(QString const &customerNrStr,
void GitClient::onIsmasUpdatesAvailable() {
if (QDir(m_customerRepository).exists()) {
qInfo() << "FETCHING OF" << m_repositoryPath
<< "INTO" << m_customerRepository;
qInfo() << UpdateStatus(UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST,
QString("FETCHING OF ") + m_repositoryPath +
QString(" INTO ") + m_customerRepository);
std::optional<QString> changes = gitFetch();
if (changes) {
std::optional<QStringList> changedFileNames = gitDiff(changes.value());
if (changedFileNames) {
for (int i=0;i<changedFileNames.value().size();++i) {
QString fname = changedFileNames.value().at(i);
QString lastCommit = gitLastCommit(fname);
qDebug() << "CCCC" << changedFileNames.value().at(i) << lastCommit;
}
qInfo() << UpdateStatus(UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_SUCCESS,
QString("FETCHED NEW FILES ") +
changedFileNames.value().join(",") +
QString(" INTO ") + m_customerRepository);
if (gitPull()) {
qInfo() << UpdateStatus(UPDATE_STATUS::GIT_PULL_UPDATES_SUCCESS,
QString("PULL NEW FILES ") +
changedFileNames.value().join(",") +
QString(" INTO ") + m_customerRepository);
emit m_worker->handleChangedFiles(changedFileNames.value());
} else {
qCritical() << "PULL FAILED FOR" << m_repositoryPath
<< "IN " << m_customerRepository;
qCritical() << UpdateStatus(UPDATE_STATUS::GIT_PULL_UPDATES_FAILURE,
QString("PULLING NEW FILES ") +
changedFileNames.value().join(",") +
QString(" INTO ") + m_customerRepository + " FAILED");
emit m_worker->terminateUpdateProcess();
}
} else {
@ -53,8 +67,10 @@ void GitClient::onIsmasUpdatesAvailable() {
emit m_worker->finishUpdateProcess(false);
}
} else {
qCritical() << "NO CHANGES IN" << m_repositoryPath
<< "(" << m_customerRepository << ")";
qCritical() << UpdateStatus(UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE,
QString("NO CHANGES IN ") + m_repositoryPath +
QString(" (%1)").arg(m_customerRepository));
emit m_worker->finishUpdateProcess(false);
}
} else {
@ -78,7 +94,7 @@ bool GitClient::gitCloneCustomerRepository() {
<< "CLONE" << m_repositoryPath << "...";
if (c.execute(m_workingDirectory)) { // execute the command in wd
QString result = c.getCommandResult();
QString const result = c.getCommandResult();
if (!result.isEmpty()) {
// Cloning into 'customer_281'...\n
static QRegularExpression re("(^\\s*Cloning\\s+into\\s+[']\\s*)(.*)(\\s*['].*$)");
@ -91,8 +107,9 @@ bool GitClient::gitCloneCustomerRepository() {
}
}
}
qCritical() << "ERROR CLONE RESULT HAS WRONG FORMAT";
}
qCritical() << "ERROR CLONE RESULT HAS WRONG FORMAT. CLONE_RESULT="
<< result;
}
return false;
}
@ -126,8 +143,14 @@ bool GitClient::gitCloneAndCheckoutBranch() {
qInfo() << "CLONE" << m_repositoryPath << "AND CHECKOUT" << m_branchName;
if (gitCloneCustomerRepository()) {
//if (copyGitConfigFromMaster()) {
return gitCheckoutBranch();
if (gitCheckoutBranch()) {
return true;
} else {
m_worker->terminateUpdateProcess();
}
//}
} else {
m_worker->terminateUpdateProcess();
}
return false;
}
@ -181,6 +204,9 @@ std::optional<QString> GitClient::gitFetch() {
Command c("git fetch");
if (c.execute(m_customerRepository)) {
QString const s = c.getCommandResult().trimmed();
qCritical() << "GIT RESULT" << s;
if (!s.isEmpty()) {
QStringList lines = Update::split(s, '\n');
if (!lines.empty()) {
@ -257,19 +283,17 @@ QString GitClient::gitLastCommit(QString fileName) {
return "";
}
// get the blob of the file(name) passed as $1
// note: this can be used for any file in the filesystem
// fileName has to an absolute path
QString GitClient::gitBlob(QString fileName) {
if (QDir(m_customerRepository).exists()) {
QString const filePath
= QDir::cleanPath(m_customerRepository + QDir::separator() + fileName);
QFileInfo fi(fileName);
if (fi.exists()) {
QString const gitCommand = QString("git hash-object %1").arg(fileName);
Command c(gitCommand);
if (c.execute(m_customerRepository)) {
return c.getCommandResult();
if (c.execute(m_workingDirectory)) {
return c.getCommandResult().trimmed();
}
}
return "";
return "N/A";
}
QString GitClient::gitCommitForBlob(QString blob) {

View File

@ -53,32 +53,13 @@ QString IsmasClient::updateNewsToIsmas(char const *event,
return buf;
}
QString IsmasClient::updateOfPSASendVersion(QString const &tariffVersion,
QString const &tariffProject,
int tariffZone,
QString const &tariffInfo,
QString const &tariffLoadTime,
QString const &linuxVersion,
QString const &cpuSerial,
QString const &deviceControllerVersion,
QString const &deviceControllerGitBlob,
QString const &deviceControllerGitLastCommit,
QString const &raucVersion,
QString const &opkgVersion,
QString const &atbQTVersion,
QString const &atbQTGitDescribe,
QString const &deviceControllerPluginVersion,
QString const &ingenicoISelfCCPluginVersion,
QString const &mobilisisCalculatePricePluginVersion,
QString const &mobilisisCalculatePriceConfigUiVersion,
QString const &prmCalculatePricePluginVersion,
QString const &prmCalculatePriceConfigUiPluginVersion,
QString const &tcpZVTPluginVersion) {
char buf[4096];
QString IsmasClient::updateOfPSASendVersion(PSAInstalled const &psa) {
//static int const constexpr SIZE = 4096*8;
static char buf[4096*2];
memset(buf, 0, sizeof(buf));
QString const ts = QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
QString sendVersionHash;
QString sendVersionHash = "N/A";
// local data="#M=APISM#C=CMD_SENDVERSION#J=
snprintf(buf, sizeof(buf)-1,
@ -92,8 +73,152 @@ QString IsmasClient::updateOfPSASendVersion(QString const &tariffVersion,
"\"PROJECT\" : \"%s\","
"\"ZONE\" : %d,"
"\"INFO\" : \"%s\","
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d,"
"\"LOADED\" : \"%s\""
"},"
"\"JSON\" : {"
"\"DC2C_CASH\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_CONF\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_DEVICE\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_01\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_02\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_03\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_04\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_05\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_06\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_07\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_08\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_09\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_10\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_11\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_12\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_13\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_14\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_15\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_16\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_17\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_18\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_19\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_20\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_21\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_22\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_23\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_24\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_25\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_26\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_27\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_28\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_29\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_30\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_31\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"},"
"\"DC2C_PRINT_32\" : {"
"\"BLOB\" : \"%s\","
"\"SIZE\" : %d"
"}"
"},"
"\"HARDWARE\" : {"
"\"DEVICES\" : [\"PTU5\", \"DC\", \"PRINTER\", \"BNA\"]"
"},"
@ -105,7 +230,9 @@ QString IsmasClient::updateOfPSASendVersion(QString const &tariffVersion,
"\"CPU_SERIAL\" : \"%s\""
"},"
"\"DC\" : {"
"\"VERSION\" : \"%s\","
"\"HW-VERSION\" : \"%s\","
"\"SW-VERSION\" : \"%s\","
"\"SIZE\" : %d,"
"\"GITBLOB\" : \"%s\","
"\"GITLASTCOMMIT\" : \"%s\""
"},"
@ -118,8 +245,7 @@ QString IsmasClient::updateOfPSASendVersion(QString const &tariffVersion,
"\"RAUC\" : \"%s\","
"\"OPKG\" : \"%s\","
"\"ATBQT\" : {"
"\"VERSION\" : \"%s\","
"\"GIT_DESCRIBE\" : \"%s\""
"\"VERSION\" : \"%s\""
"}"
"},"
"\"PLUGINS\" : {"
@ -149,32 +275,108 @@ QString IsmasClient::updateOfPSASendVersion(QString const &tariffVersion,
ts.toStdString().c_str(),
sendVersionHash.toStdString().c_str(),
tariffVersion.toStdString().c_str(),
tariffProject.toStdString().c_str(),
tariffZone,
tariffInfo.toStdString().c_str(),
tariffLoadTime.toStdString().c_str(),
psa.tariff.version.toStdString().c_str(),
psa.tariff.project.toStdString().c_str(),
psa.tariff.zone,
psa.tariff.info.toStdString().c_str(),
psa.tariff.blob.toStdString().c_str(),
psa.tariff.size,
psa.tariff.loadTime.toStdString().c_str(),
linuxVersion.toStdString().c_str(),
psa.cash.blob.toStdString().c_str(),
psa.cash.size,
psa.conf.blob.toStdString().c_str(),
psa.conf.size,
psa.device.blob.toStdString().c_str(),
psa.device.size,
cpuSerial.toStdString().c_str(),
psa.print[0].blob.toStdString().c_str(),
psa.print[0].size,
psa.print[1].blob.toStdString().c_str(),
psa.print[1].size,
psa.print[2].blob.toStdString().c_str(),
psa.print[2].size,
psa.print[3].blob.toStdString().c_str(),
psa.print[3].size,
psa.print[4].blob.toStdString().c_str(),
psa.print[4].size,
psa.print[5].blob.toStdString().c_str(),
psa.print[5].size,
psa.print[6].blob.toStdString().c_str(),
psa.print[6].size,
psa.print[7].blob.toStdString().c_str(),
psa.print[7].size,
psa.print[8].blob.toStdString().c_str(),
psa.print[8].size,
psa.print[9].blob.toStdString().c_str(),
psa.print[9].size,
psa.print[10].blob.toStdString().c_str(),
psa.print[10].size,
psa.print[11].blob.toStdString().c_str(),
psa.print[11].size,
psa.print[12].blob.toStdString().c_str(),
psa.print[12].size,
psa.print[13].blob.toStdString().c_str(),
psa.print[13].size,
psa.print[14].blob.toStdString().c_str(),
psa.print[14].size,
psa.print[15].blob.toStdString().c_str(),
psa.print[15].size,
psa.print[16].blob.toStdString().c_str(),
psa.print[16].size,
psa.print[17].blob.toStdString().c_str(),
psa.print[17].size,
psa.print[18].blob.toStdString().c_str(),
psa.print[18].size,
psa.print[19].blob.toStdString().c_str(),
psa.print[19].size,
psa.print[20].blob.toStdString().c_str(),
psa.print[20].size,
psa.print[21].blob.toStdString().c_str(),
psa.print[21].size,
psa.print[22].blob.toStdString().c_str(),
psa.print[22].size,
psa.print[23].blob.toStdString().c_str(),
psa.print[23].size,
psa.print[24].blob.toStdString().c_str(),
psa.print[24].size,
psa.print[25].blob.toStdString().c_str(),
psa.print[25].size,
psa.print[26].blob.toStdString().c_str(),
psa.print[26].size,
psa.print[27].blob.toStdString().c_str(),
psa.print[27].size,
psa.print[28].blob.toStdString().c_str(),
psa.print[28].size,
psa.print[29].blob.toStdString().c_str(),
psa.print[29].size,
psa.print[30].blob.toStdString().c_str(),
psa.print[30].size,
psa.print[31].blob.toStdString().c_str(),
psa.print[31].size,
deviceControllerVersion.toStdString().c_str(),
deviceControllerGitBlob.toStdString().c_str(),
deviceControllerGitLastCommit.toStdString().c_str(),
psa.hw.linuxVersion.toStdString().c_str(),
psa.hw.cpuSerial.toStdString().c_str(),
raucVersion.toStdString().c_str(),
opkgVersion.toStdString().c_str(),
atbQTVersion.toStdString().c_str(),
atbQTGitDescribe.toStdString().c_str(),
psa.dc.versionHW.toStdString().c_str(),
psa.dc.versionSW.toStdString().c_str(),
psa.dc.size,
psa.dc.gitBlob.toStdString().c_str(),
psa.dc.gitLastCommit.toStdString().c_str(),
deviceControllerPluginVersion.toStdString().c_str(),
ingenicoISelfCCPluginVersion.toStdString().c_str(),
mobilisisCalculatePricePluginVersion.toStdString().c_str(),
mobilisisCalculatePriceConfigUiVersion.toStdString().c_str(),
prmCalculatePricePluginVersion.toStdString().c_str(),
prmCalculatePriceConfigUiPluginVersion.toStdString().c_str(),
tcpZVTPluginVersion.toStdString().c_str());
psa.sw.raucVersion.toStdString().c_str(),
psa.sw.opkgVersion.toStdString().c_str(),
psa.sw.atbQTVersion.toStdString().c_str(),
psa.pluginVersion.deviceController.toStdString().c_str(),
psa.pluginVersion.ingenicoISelfCC.toStdString().c_str(),
psa.pluginVersion.mobilisisCalculatePrice.toStdString().c_str(),
psa.pluginVersion.mobilisisCalculatePriceConfigUi.toStdString().c_str(),
psa.pluginVersion.prmCalculatePrice.toStdString().c_str(),
psa.pluginVersion.prmCalculatePriceConfigUi.toStdString().c_str(),
psa.pluginVersion.tcpZVT.toStdString().c_str());
printf("buf=%s\n", buf);
return buf;
}

View File

@ -4,6 +4,110 @@
#include <QObject>
#include <QString>
struct PSAInstalled {
struct Tariff {
QString name;
QString version;
QString project;
int zone;
int size;
QString blob;
QString info;
QString loadTime;
} tariff;
struct HardWare {
QString linuxVersion;
QString cpuSerial;
} hw;
struct DC {
QString versionHW;
QString versionSW;
QString gitBlob;
QString gitLastCommit;
int size;
} dc;
struct SoftWare {
QString raucVersion;
QString opkgVersion;
QString atbQTVersion;
} sw;
struct PluginVersion {
QString deviceController;
QString ingenicoISelfCC;
QString mobilisisCalculatePrice;
QString mobilisisCalculatePriceConfigUi;
QString prmCalculatePrice;
QString prmCalculatePriceConfigUi;
QString tcpZVT;
} pluginVersion;
struct DC2C {
QString name;
QString blob;
int size;
};
DC2C cash;
DC2C conf;
DC2C device;
DC2C print[32];
explicit PSAInstalled() {
tariff.name = "N/A";
tariff.version = "N/A";
tariff.project = "N/A";
tariff.zone = -1;
tariff.size = -1;
tariff.blob = "N/A";
tariff.info = "N/A";
tariff.loadTime = "N/A";
hw.linuxVersion = "N/A";
hw.cpuSerial = "N/A";
dc.versionHW = "N/A";
dc.versionSW = "N/A";
dc.gitBlob = "N/A";
dc.gitLastCommit = "N/A";
dc.size = -1;
sw.raucVersion = "N/A";
sw.opkgVersion = "N/A";
sw.atbQTVersion = "N/A";
pluginVersion.deviceController = "N/A";
pluginVersion.ingenicoISelfCC = "N/A";
pluginVersion.mobilisisCalculatePrice = "N/A";
pluginVersion.mobilisisCalculatePriceConfigUi = "N/A";
pluginVersion.prmCalculatePrice = "N/A";
pluginVersion.prmCalculatePriceConfigUi = "N/A";
pluginVersion.tcpZVT = "N/A";
cash.name = "N/A";
cash.blob = "N/A";
cash.size = -1;
conf.name = "N/A";
conf.blob = "N/A";
conf.size = -1;
device.size = -1;
device.blob = "N/A";
device.size = -1;
for (int i=0; i < 32; ++i) {
print[i].size = -1;
print[i].blob = "N/A";
print[i].size = -1;
}
}
};
class IsmasClient : public QObject {
Q_OBJECT
@ -17,27 +121,7 @@ public:
QString updateOfPSAActivated();
QString updateOfPSASucceeded();
QString updateOfPSASendVersion(QString const &tariffVersion,
QString const &tariffProject,
int tariffZone,
QString const &tariffInfo,
QString const &tariffLoadTime,
QString const &linuxVersion,
QString const &cpuSerial,
QString const &deviceControllerVersion,
QString const &deviceControllerGitBlob,
QString const &deviceControllerGitLastCommit,
QString const &raucVersion,
QString const &opkgVersion,
QString const &atbQTVersion,
QString const &atbQTGitDescribe,
QString const &deviceControllerPluginVersion,
QString const &ingenicoISelfCCPluginVersion,
QString const &mobilisisCalculatePricePluginVersion,
QString const &mobilisisCalculatePriceConfigUiVersion,
QString const &prmCalculatePricePluginVersion,
QString const &prmCalculatePriceConfigUiPluginVersion,
QString const &tcpZVTPluginVersion);
QString updateOfPSASendVersion(PSAInstalled const &psa);
QString setUpdatesAvailable();
bool checkForAvailableUpdates();

View File

@ -135,9 +135,12 @@ int main(int argc, char *argv[]) {
int machineNr = Worker::read1stLineOfFile("/etc/machine_nr");
int customerNr = Worker::read1stLineOfFile("/etc/cust_nr");
QString customerNrStr = QString("customer_") + QString::number(customerNr).rightJustified(3, '0');
int zoneNr = Worker::read1stLineOfFile("/etc/zone_nr");
QString branchName = QString("zg1/zone%1").arg(zoneNr);
QString const branchName = (zoneNr != 0)
? QString("zg1/zone%1").arg(zoneNr) : "master";
QThread::currentThread()->setObjectName("main thread");
qInfo() << "Main thread" << QThread::currentThreadId();
Worker worker(hw,
customerNr,
@ -146,8 +149,7 @@ int main(int argc, char *argv[]) {
branchName,
workingDir,
maintenanceMode,
dryRun
);
dryRun);
return a.exec();
}

View File

@ -6,7 +6,7 @@
#include <QFileInfo>
#include <QMessageLogContext>
#define OUTPUT_LEN (512)
#define OUTPUT_LEN (1024)
static bool installedMsgHandler = false;
static QtMsgType debugLevel = QtInfoMsg;

View File

@ -45,8 +45,8 @@ bool Command::execute(QString workingDirectory, QStringList args) {
connect(&(*p), SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()));
connect(&(*p), SIGNAL(readyReadStandardError()), this, SLOT(readyReadStandardError()));
qCritical() << "START COMMAND" << m_command << "WITH ARGS" << args
<< "IN" << workingDirectory;
//qCritical() << "START COMMAND" << m_command << "WITH ARGS" << args
// << "IN" << workingDirectory;
p->setWorkingDirectory(workingDirectory);
if (!args.isEmpty()) {
@ -56,14 +56,14 @@ bool Command::execute(QString workingDirectory, QStringList args) {
}
if (p->waitForStarted(m_waitForStartTimeout)) {
qDebug() << "PROCESS" << m_command << "STARTED";
//qDebug() << "PROCESS" << m_command << "STARTED";
if (p->state() == QProcess::ProcessState::Running) {
qDebug() << "PROCESS" << m_command << "RUNNING";
//qDebug() << "PROCESS" << m_command << "RUNNING";
if (p->waitForFinished(m_waitForFinishTimeout)) {
qDebug() << "PROCESS" << m_command << "FINISHED";
//qDebug() << "PROCESS" << m_command << "FINISHED";
if (p->exitStatus() == QProcess::NormalExit) {
qInfo() << "EXECUTED" << m_command
<< "with code" << p->exitCode();
//qInfo() << "EXECUTED" << m_command
// << "with code" << p->exitCode();
// qInfo() << "RESULT" << m_commandResult;
return true;
} else {

View File

@ -43,7 +43,8 @@ Worker::Worker(hwinf *hw,
QObject *parent,
char const *serialInterface,
char const *baudrate)
: m_workerThread("workerThread")
: m_hw(hw)
, m_workerThread("workerThread")
, m_apismClient(0, 0, 0, this) // TODO
, m_customerNr(customerNr)
, m_customerNrStr(QString("customer_") + QString::number(m_customerNr).rightJustified(3, '0'))
@ -51,10 +52,22 @@ Worker::Worker(hwinf *hw,
, m_zoneNr(zoneNr)
, m_workingDirectory(workingDirectory)
, m_branchName(branchName)
, m_customerRepositoryPath(QString("https://git.mimbach49.de/GerhardHoffmann/%1.git").arg(m_customerNrStr))
, m_customerRepository(QDir::cleanPath(m_workingDirectory + QDir::separator() + m_customerNrStr))
, m_gc(m_customerNrStr, m_customerRepository, m_workingDirectory, m_branchName, this)
, m_maintenanceMode(maintenanceMode)
, m_osVersion(getOsVersion())
, m_atbqtVersion(getATBQTVersion())
, m_cpuSerial(getCPUSerial())
, m_raucVersion(getRaucVersion())
, m_opkgVersion(getOpkgVersion())
, m_pluginVersionATBDeciceController(getPluginVersion("/opt/app/ATBAPP/plugins/libATBDeviceControllerPlugin.so"))
, m_pluginVersionIngenicoISelf(getPluginVersion("/opt/app/ATBAPP/plugins/libIngenicoISelf_CCPlugin.so"))
, m_pluginVersionMobilisisCalc(getPluginVersion("/opt/app/ATBAPP/plugins/libMOBILISIS_CalculatePricePlugin.so"))
, m_pluginVersionMobilisisCalcConfig(getPluginVersion("/opt/app/ATBAPP/plugins/libMOBILISIS_CalculatePricePlugin_ConfigUi.so"))
, m_pluginVersionPrmCalc(getPluginVersion("/opt/app/ATBAPP/plugins/libPRM_CalculatePricePlugin.so"))
, m_pluginVersionPrmCalcConfig(getPluginVersion("/opt/app/ATBAPP/plugins/libPRM_CalculatePricePlugin_ConfigUi.so"))
, m_pluginVersionTcpZvt(getPluginVersion("/opt/app/ATBAPP/plugins/libTCP_ZVT_CCPlugin.so"))
, m_ismasUpdateRequests(ISMAS_UPDATE_REQUESTS)
, m_waitForNewUpdates(this) {
@ -62,21 +75,23 @@ Worker::Worker(hwinf *hw,
qInfo() << "CURRENT TIME ..............." << QDateTime::currentDateTime().toString(Qt::ISODate);
qInfo() << "OS VERSION ................." << m_osVersion;
qInfo() << "ATBQT VERSION .............." << m_atbqtVersion;
qInfo() << "CPU SERIAL ................." << m_cpuSerial;
qInfo() << "CUSTOMER_NR ................" << m_customerNr;
qInfo() << "CUSTOMER_NR_STR ............" << m_customerNrStr;
qInfo() << "CUSTOMER_REPOSITORY_PATH ..." << QString("https://git.mimbach49.de/GerhardHoffmann/%1.git").arg(m_customerNrStr);
qInfo() << "CUSTOMER_REPOSITORY_PATH ..." << m_customerRepositoryPath;
qInfo() << "CUSTOMER_REPOSITORY ........" << m_customerRepository;
qInfo() << "MACHINE_NR ................." << m_machineNr;
qInfo() << "ZONE_NR ...................." << m_zoneNr;
qInfo() << "BRANCH_NAME ................" << m_branchName;
qInfo() << "WORKING_DIRECTORY .........." << m_workingDirectory;
QProcess p;
p.start("/bin/systemctl", {"restart", "apism"});
if (!p.waitForStarted(5000) || !p.waitForFinished(5000)) {
qCritical() << "APISM-RESTART-FAILURE";
return;
}
//QProcess p;
//p.start("/bin/systemctl", {"restart", "apism"});
//if (!p.waitForStarted(5000) || !p.waitForFinished(5000)) {
// qCritical() << "APISM-RESTART-FAILURE";
// return;
//}
this->moveToThread(&m_workerThread);
m_workerThread.start();
@ -105,15 +120,22 @@ Worker::Worker(hwinf *hw,
connect(this, SIGNAL(terminateUpdateProcess()), this,
SLOT(onTerminateUpdateProcess()), Qt::QueuedConnection);
connect(&m_emergencyTimer, SIGNAL(timeout()), this, SLOT(onTerminateUpdateProcess()), Qt::QueuedConnection);
m_emergencyTimer.setSingleShot(true);
m_emergencyTimer.start(1000 * 60 * 10);
QDir customerRepository(m_customerRepository);
if (!customerRepository.exists()) {
if (m_gc.gitCloneAndCheckoutBranch()) {
// do nothing else, not even executing opkg-commands
onFinishUpdateProcess(false);
emit this->finishUpdateProcess(false);
}
} else {
m_update = new Update(hw, m_customerRepository, m_customerNrStr,
m_branchName, m_workingDirectory,
m_update = new Update(m_hw,
m_customerRepository,
m_customerNrStr,
m_branchName,
m_workingDirectory,
dryRun, parent, serialInterface, baudrate);
connect(&m_startUpdateProcess, SIGNAL(timeout()), this, SLOT(askIsmasForNewData()), Qt::QueuedConnection);
@ -150,20 +172,94 @@ QString Worker::getOsVersion() const {
return "N/A";
}
QString Worker::getATBQTVersion() const {
QString const cmd = QString("echo -n $(/opt/app/ATBAPP/ATBQT -v | head -n 2 | cut -d':' -f2)");
Command c("bash");
if (c.execute(m_workingDirectory, QStringList() << "-c" << cmd)) {
return c.getCommandResult();
}
return "N/A";
}
QString Worker::getCPUSerial() const {
QString const cmd = QString("echo -n $(cat /proc/cpuinfo | grep -i Serial | cut -d':' -f2)");
Command c("bash");
if (c.execute(m_workingDirectory, QStringList() << "-c" << cmd)) {
return c.getCommandResult();
}
return "N/A";
}
QString Worker::getRaucVersion() const {
QString const cmd = QString("echo -n $(rauc --version)");
Command c("bash");
if (c.execute(m_workingDirectory, QStringList() << "-c" << cmd)) {
return c.getCommandResult();
}
return "N/A";
}
QString Worker::getOpkgVersion() const {
QString const cmd = QString("echo -n $(opkg --version)");
Command c("bash");
if (c.execute(m_workingDirectory, QStringList() << "-c" << cmd)) {
return c.getCommandResult();
}
return "N/A";
}
QString Worker::getPluginVersion(QString const &pluginFileName) const {
QString const cmd = QString("echo -n $(strings %1 | grep \\\"Version\\\" | cut -d':' -f2 | tr -d '\"' | tr -d ',')").arg(pluginFileName);
Command c("bash");
if (c.execute(m_workingDirectory, QStringList() << "-c" << cmd)) {
return c.getCommandResult();
}
return "N/A";
}
QStringList Worker::getDCVersion() const {
QStringList lst = (QStringList() << "N/A" << "N/A");
if (m_hw) {
m_hw->dc_autoRequest(true); // turn auto-request setting on
QByteArray const cmp(8, char(0));
QByteArray hw(""), sw("");
for (int i=0; i<5; ++i) {
hw = m_hw->dc_getHWversion().toUtf8();
sw = m_hw->dc_getSWversion().toUtf8();
if (!hw.startsWith(cmp)) {
lst.clear();
qInfo() << hw << sw;
lst << hw << sw;
break;
}
QThread::sleep(1);
}
}
return lst;
}
qint64 Worker::getFileSize(QString const &fileName) const {
// fileName has to be an absolute path
QFileInfo fInfo(fileName);
return fInfo.exists() ? fInfo.size() : -1;
}
void Worker::onHandleChangedFiles(QStringList changedFiles) {
qCritical() << QDir::currentPath() << "ON HANDLE CHANGED FILES" << changedFiles;
QString opkg_commands;
static const QRegularExpression re("^.*opkg_commands\\s*$");
static const QRegularExpression comment("^\\s*#.*$");
int idx = changedFiles.indexOf(re);
if (idx != -1) {
m_updateStatus = UPDATE_STATUS::EXEC_OPKG_COMMANDS_REQUEST;
m_statusDescription = "EXECUTE OPKG COMMANDS";
opkg_commands = changedFiles.takeAt(idx);
qInfo() << UpdateStatus(UPDATE_STATUS::EXEC_OPKG_COMMANDS,
QString("EXEC OPKG-COMMANDS FOR ") + opkg_commands);
if (QDir::setCurrent(m_customerRepository)) {
QFile f(opkg_commands);
if (f.exists()) {
if (f.open(QIODevice::ReadOnly)) {
QTextStream in(&f);
while (!in.atEnd()) {
@ -174,12 +270,13 @@ void Worker::onHandleChangedFiles(QStringList changedFiles) {
executeOpkgCommand(opkgCommand);
}
}
}
// m_updateStatus = UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS;
// m_statusDescription = QString("EXECUTE OPKG COMMANDS %1 OK").arg(opkgCommands.join('\n'));
f.close();
qInfo() << UpdateStatus(UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS,
QString("EXECUTING OPKG-COMMANDS OK"));
}
}
}
}
if (m_update->doUpdate(changedFiles)) { // first update the hardware
@ -213,7 +310,7 @@ void Worker::onHandleChangedFiles(QStringList changedFiles) {
}
}
if (!error) {
onFinishUpdateProcess(true);
emit this->finishUpdateProcess(true);
return;
}
}
@ -277,11 +374,14 @@ void Worker::executeOpkgCommand(QString opkgCommand) {
Command c(opkgCommand);
if (c.execute(m_workingDirectory)) {
QString const r = c.getCommandResult();
m_updateStatus = UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS;
m_statusDescription = QString("EXECUTE OPKG COMMAND %1 OK").arg(opkgCommand);
qInfo() << UpdateStatus(UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS,
QString("EXECUTE OPKG COMMAND %1 OK: %2")
.arg(opkgCommand)
.arg(c.getCommandResult()));
} else {
m_updateStatus = UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE;
m_statusDescription = QString("EXECUTE OPKG COMMAND %1 FAILED").arg(opkgCommand);
qCritical() << UpdateStatus(UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE,
QString("EXECUTE OPKG COMMAND %1 FAILED")
.arg(opkgCommand));
onTerminateUpdateProcess();
return;
}
@ -289,8 +389,14 @@ void Worker::executeOpkgCommand(QString opkgCommand) {
// sollte ParameterResponse heissen
void Worker::onIsmasResponseReceived(QJsonObject ismasResponse) {
qInfo() << "IN ON_ISMAS_RESPONSE_RECEIVED" << QThread::currentThread()->objectName();
if (!ismasResponse.isEmpty()) {
QStringList const keys = ismasResponse.keys();
qInfo() << UpdateStatus(UPDATE_STATUS::ISMAS_RESPONSE_RECEIVED,
QString("RECEIVED JSON WITH KEYS: ") + keys.join(","));
static QRegularExpression re("^REQ_ISMASPARAMETER.*");
if(keys.indexOf(re) >= 0) {
m_waitForNewUpdates.stop(); // stop asking ISMAS for updates
@ -328,10 +434,19 @@ void Worker::onIsmasResponseReceived(QJsonObject ismasResponse) {
if (!v.isNull() && !v.isUndefined()) {
QString const s = v.toString("");
if (s == "WAIT") {
m_updateStatus = UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS;
m_ismasUpdateRequests = ISMAS_UPDATE_REQUESTS;
m_statusDescription = "ISMAS UPDATES AVAILABLE";
qInfo() << UpdateStatus(UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS,
"DETECTED AVAILABLE ISMAS-DOWNLOAD");
QString const &data = m_ismasClient.updateOfPSAActivated();
m_apismClient.onSendCmdEventToIsmas(data);
emit m_gc.ismasUpdatesAvailable();
} else {
// TODO: enorm wichtig
qCritical() << "DID NOT RECEIVE 'WAIT' BUT" << s;
onTerminateUpdateProcess();
}
}
} else {
@ -339,6 +454,7 @@ void Worker::onIsmasResponseReceived(QJsonObject ismasResponse) {
m_statusDescription = "NO FILEUPLOAD KEY AVAILABLE";
return;
}
}
} else {
m_updateStatus = UPDATE_STATUS::ISMAS_UPDATE_REQUEST_FAILURE;
@ -347,64 +463,108 @@ void Worker::onIsmasResponseReceived(QJsonObject ismasResponse) {
}
void Worker::onFinishUpdateProcess(bool changes) {
qCritical() << "ON FINISH UPDATE PROCESS. CHANGES=" << changes;
Q_UNUSED(changes);
qInfo() << "ON FINISH UPDATE PROCESS" << QThread::currentThread()->objectName();
// m_emergencyTimer.stop();
onSendCmdSendVersionToIsmas(); // final message to ISMAS
m_workerThread.quit();
QApplication::quit();
exit(0);
}
void Worker::onTerminateUpdateProcess() {
qCritical() << "ON TERMINATE UPDATE PROCESS";
onSendCmdSendVersionToIsmas(); // final message to ISMAS
m_workerThread.quit();
QApplication::quit();
exit(-1);
}
void Worker::onSendCmdSendVersionToIsmas() {
QString const tariffVersion = "0.0.1";
QString const tariffProject = "test_project";
int tariffZone = 1;
QString const tariffInfo = "test_tariff_info";
QString const tariffLoadTime = QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
// QString const linuxVersion = "test_linux_version";
QString const cpuSerial = "test_cpu_serial";
QString const deviceControllerVersion = "test_dc_version";
QString const deviceControllerGitBlob = "test_dc_blob_2a3b4f50";
QString const deviceControllerGitLastCommit = "test_dc_commit_12345abc";
QString const raucVersion = "test_rauc_version";
QString const opkgVersion = "test_opkg_version";
QString const atbQTVersion = "test_qtbqt_version";
QString const atbQTGitDescribe = "test_atbqt_git_describe";
QString const deviceControllerPluginVersion = "test_CAmaster_version";
QString const ingenicoISelfCCPluginVersion = "test_ingenico_plugin_version";
QString const mobilisisCalculatePricePluginVersion = "test_mobilisis_plugin_version";
QString const mobilisisCalculatePriceConfigUiVersion = "test_mobilisis_config_ui_plugin";
QString const prmCalculatePricePluginVersion = "test_prm_calculate_price_plugin";
QString const prmCalculatePriceConfigUiPluginVersion = "test_prm_calculate_price_config_ui_plugin";
QString const tcpZVTPluginVersion = "test_tcp_zvt_plugin";
QStringList const dcVersion = getDCVersion();
QString const deviceControllerVersionHW = dcVersion.first();
QString const deviceControllerVersionSW = dcVersion.last();
QString data = m_ismasClient.updateOfPSASendVersion(tariffVersion,
tariffProject,
tariffZone,
tariffInfo,
tariffLoadTime,
m_osVersion,
cpuSerial,
deviceControllerVersion,
deviceControllerGitBlob,
deviceControllerGitLastCommit,
raucVersion,
opkgVersion,
atbQTVersion,
atbQTGitDescribe,
deviceControllerPluginVersion,
ingenicoISelfCCPluginVersion,
mobilisisCalculatePricePluginVersion,
mobilisisCalculatePriceConfigUiVersion,
prmCalculatePricePluginVersion,
prmCalculatePriceConfigUiPluginVersion,
tcpZVTPluginVersion);
m_apismClient.sendCmdSendVersionToIsmas(data);
qInfo() << "CURRENT DC-HW-VERSION: " << deviceControllerVersionHW;
qInfo() << "CURRENT DC-SW-VERSION: " << deviceControllerVersionSW;
QString const deviceControllerGitBlob = "N/A";
QString const deviceControllerGitLastCommit = "N/A";
PSAInstalled psaInstalled;
QString printSysDir("/etc/psa_config");
QString tariffSysDir("/etc/psa_tariff");
QString absPathName;
if (m_zoneNr != 0) {
QString const &n = QString("%1").arg(m_zoneNr).rightJustified(2, '0');
psaInstalled.tariff.name = QString("tariff%1.json").arg(n);
absPathName = QDir::cleanPath(tariffSysDir + QDir::separator() + psaInstalled.tariff.name);
psaInstalled.tariff.blob = m_gc.gitBlob(absPathName);
psaInstalled.tariff.size = getFileSize(absPathName);
psaInstalled.tariff.zone = m_zoneNr;
}
psaInstalled.tariff.project = "Szeged";
psaInstalled.tariff.info = "N/A";
psaInstalled.tariff.loadTime = "N/A"; // QDateTime::currentDateTime().toString(Qt::ISODateWithMs);
psaInstalled.tariff.version = "N/A";
psaInstalled.hw.linuxVersion = m_osVersion;
psaInstalled.hw.cpuSerial = m_cpuSerial;
psaInstalled.dc.versionHW = deviceControllerVersionHW;
psaInstalled.dc.versionSW = deviceControllerVersionSW;
psaInstalled.dc.gitBlob = "N/A";
psaInstalled.dc.gitLastCommit = "N/A";
psaInstalled.dc.size = -1;
psaInstalled.sw.raucVersion = m_raucVersion;
psaInstalled.sw.opkgVersion = m_opkgVersion;
psaInstalled.sw.atbQTVersion = m_atbqtVersion;
psaInstalled.pluginVersion.deviceController = m_pluginVersionATBDeciceController;
psaInstalled.pluginVersion.ingenicoISelfCC = m_pluginVersionIngenicoISelf;
psaInstalled.pluginVersion.mobilisisCalculatePrice = m_pluginVersionMobilisisCalc;
psaInstalled.pluginVersion.mobilisisCalculatePriceConfigUi = m_pluginVersionMobilisisCalcConfig;
psaInstalled.pluginVersion.prmCalculatePrice = m_pluginVersionPrmCalc;
psaInstalled.pluginVersion.prmCalculatePriceConfigUi = m_pluginVersionPrmCalcConfig;
psaInstalled.pluginVersion.tcpZVT = m_pluginVersionTcpZvt;
psaInstalled.cash.name = "DC2C_cash.json";
absPathName = QDir::cleanPath(printSysDir + QDir::separator() + psaInstalled.cash.name);
psaInstalled.cash.blob = m_gc.gitBlob(absPathName);
psaInstalled.cash.size = getFileSize(absPathName);
psaInstalled.conf.name = "DC2C_conf.json";
absPathName = QDir::cleanPath(printSysDir + QDir::separator() + psaInstalled.conf.name);
psaInstalled.conf.blob = m_gc.gitBlob(absPathName);
psaInstalled.conf.size = getFileSize(absPathName);
psaInstalled.device.name = "DC2C_device.json";
absPathName = QDir::cleanPath(printSysDir + QDir::separator() + psaInstalled.device.name);
psaInstalled.device.blob = m_gc.gitBlob(absPathName);
psaInstalled.device.size = getFileSize(absPathName);
for (int i=0; i < 32; ++i) {
QString const &n = QString("%1").arg(i+1).rightJustified(2, '0');
psaInstalled.print[i].name = QString("DC2C_print%1.json").arg(n);
absPathName = QDir::cleanPath(printSysDir + QDir::separator() + psaInstalled.print[i].name);
psaInstalled.print[i].blob = m_gc.gitBlob(absPathName);
psaInstalled.print[i].size = getFileSize(absPathName);
}
QString data = m_ismasClient.updateOfPSASendVersion(psaInstalled);
// printf("data=%s\n", data.toStdString().c_str());
m_apismClient.onSendCmdSendVersionToIsmas(data);
}
void Worker::askIsmasForNewData() {
@ -413,7 +573,14 @@ void Worker::askIsmasForNewData() {
QString data = m_ismasClient.setUpdatesAvailable();
m_apismClient.emulateUpdatesAvailable(data);
}
m_updateStatus = UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING;
//m_updateStatus = UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING;
//m_statusDescription = "Ask ISMAS IF NEW DATA AVAILABLE";
qInfo() << UpdateStatus(UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING,
QString("ASK ISMAS IF NEW DATA AVAILABLE") +
QString(" (%1)").arg(m_ismasUpdateRequests));
m_apismClient.requestAvailableIsmasUpdates();
if (--m_ismasUpdateRequests > 0) {
@ -425,3 +592,116 @@ void Worker::askIsmasForNewData() {
onTerminateUpdateProcess();
}
}
/************************************************************************************************
* operators
*/
QDebug operator<< (QDebug debug, UpdateStatus status) {
switch(status.m_updateStatus) {
case UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING:
debug << QString("UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS:
debug << QString("UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST:
debug << QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE:
debug << QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_SUCCESS:
debug << QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_SUCCESS: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::ISMAS_RESPONSE_RECEIVED:
debug << QString("UPDATE_STATUS::ISMAS_RESPONSE_RECEIVED: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_PULL_UPDATES_SUCCESS:
debug << QString("UPDATE_STATUS::GIT_PULL_UPDATES_REQUEST: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_PULL_UPDATES_FAILURE:
debug << QString("UPDATE_STATUS::GIT_PULL_UPDATES_FAILURE: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMANDS:
debug << QString("UPDATE_STATUS::EXEC_OPKG_COMMANDS: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS:
debug << QString("UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS:
debug << QString("UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS: ")
<< status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE:
debug << QString("UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE: ")
<< status.m_statusDescription;
break;
default:;
}
return debug;
}
QString& operator<< (QString& str, UpdateStatus status) {
switch(status.m_updateStatus) {
case UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING:
str = QString("UPDATE_STATUS::ISMAS_UPDATE_REQUEST_PENDING: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS:
str = QString("UPDATE_STATUS::ISMAS_UPDATE_REQUEST_SUCCESS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST:
str = QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE:
str = QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_FAILURE: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_SUCCESS:
str = QString("UPDATE_STATUS::GIT_FETCH_UPDATES_REQUEST_SUCCESS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_PULL_UPDATES_SUCCESS:
str = QString("UPDATE_STATUS::GIT_PULL_UPDATES_SUCCESS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::GIT_PULL_UPDATES_FAILURE:
str = QString("UPDATE_STATUS::GIT_PULL_UPDATES_FAILURE: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::ISMAS_RESPONSE_RECEIVED:
str = QString("UPDATE_STATUS::ISMAS_RESPONSE_RECEIVED: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMANDS:
str = QString("UPDATE_STATUS::EXEC_OPKG_COMMANDS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS:
str = QString("UPDATE_STATUS::EXEC_OPKG_COMMANDS_SUCCESS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS:
str = QString("UPDATE_STATUS::EXEC_OPKG_COMMAND_SUCCESS: ");
str += status.m_statusDescription;
break;
case UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE:
str = QString("UPDATE_STATUS::EXEC_OPKG_COMMAND_FAILURE: ");
str += status.m_statusDescription;
break;
default:;
}
return str;
}

View File

@ -28,15 +28,17 @@ enum class UPDATE_STATUS : quint8 {
ISMAS_UPDATE_REQUEST_FAILURE,
ISMAS_UPDATE_REQUEST_TIMEOUT,
ISMAS_UPDATE_REQUEST_SUCCESS,
ISMAS_RESPONSE_RECEIVED,
GIT_CHECKOUT_BRANCH_REQUEST,
GIT_CHECKOUT_BRANCH_REQUEST_FAILURE,
GIT_CHECKOUT_BRANCH_NOT_EXISTS,
GIT_CHECKOUT_BRANCH_CHECKOUT_ERROR,
GIT_FETCH_UPDATES_REQUEST,
GIT_FETCH_UPDATES_REQUEST_FAILURE,
GIT_FETCH_UPDATES_REQUEST_SSUCCESS,
EXEC_OPKG_COMMANDS_REQUEST,
EXEC_OPKG_COMMANDS_FAILURE,
GIT_FETCH_UPDATES_REQUEST_SUCCESS,
GIT_PULL_UPDATES_SUCCESS,
GIT_PULL_UPDATES_FAILURE,
EXEC_OPKG_COMMANDS,
EXEC_OPKG_COMMAND_FAILURE,
EXEC_OPKG_COMMAND_SUCCESS,
EXEC_OPKG_COMMANDS_SUCCESS,
@ -57,14 +59,27 @@ enum class UPDATE_STATUS : quint8 {
ISMAS_CURRENT_PSA_STATUS_CONFIRM_SUCCESS
};
#define ISMAS_UPDATE_REQUESTS (6)
struct UpdateStatus {
UPDATE_STATUS m_updateStatus;
QString m_statusDescription;
explicit UpdateStatus(UPDATE_STATUS s, QString const &d)
: m_updateStatus(s), m_statusDescription(d) {}
};
QDebug operator<<(QDebug debug, UpdateStatus status);
QString& operator<<(QString &str, UpdateStatus status);
#define ISMAS_UPDATE_REQUESTS (10)
class hwinf;
class Worker : public QObject {
Q_OBJECT
hwinf *m_hw;
WorkerThread m_workerThread;
QTimer m_startUpdateProcess;
QTimer m_emergencyTimer;
Update *m_update;
ApismClient m_apismClient;
int const m_customerNr;
@ -73,10 +88,23 @@ class Worker : public QObject {
int const m_zoneNr;
QString const m_workingDirectory;
QString const m_branchName;
QString const m_customerRepositoryPath;
QString const m_customerRepository;
GitClient m_gc;
bool m_maintenanceMode;
QString const m_osVersion;
QString const m_atbqtVersion;
QString const m_cpuSerial;
QString const m_raucVersion;
QString const m_opkgVersion;
QString const m_pluginVersionATBDeciceController;
QString const m_pluginVersionIngenicoISelf;
QString const m_pluginVersionMobilisisCalc;
QString const m_pluginVersionMobilisisCalcConfig;
QString const m_pluginVersionPrmCalc;
QString const m_pluginVersionPrmCalcConfig;
QString const m_pluginVersionTcpZvt;
int m_ismasUpdateRequests;
QTimer m_waitForNewUpdates;
IsmasClient m_ismasClient;
@ -84,9 +112,16 @@ class Worker : public QObject {
UPDATE_STATUS m_updateStatus;
QString m_statusDescription;
void executeOpkgCommand(QString opkgCommand);
QString getOsVersion() const;
QString getATBQTVersion() const;
QString getCPUSerial() const;
QString getRaucVersion() const;
QString getOpkgVersion() const;
QString getPluginVersion(QString const &pluginFileName) const;
QStringList getDCVersion() const;
qint64 getFileSize(QString const &fileName) const;
public:
explicit Worker(hwinf *hw,
@ -105,6 +140,15 @@ public:
static int read1stLineOfFile(QString fileName);
//friend QDebug operator<<(QDebug debug, Worker const &w) {
// Q_UNUSED(w);
// return debug;
//}
//friend QString& operator<<(QString &str, Worker const &w) {
// Q_UNUSED(w);
// return str;
//}
signals:
void handleChangedFiles(QStringList);
void summarizeUpload(QStringList);
@ -126,7 +170,4 @@ private slots:
void onHandleChangedFiles(QStringList);
};
//Q_DECLARE_METATYPE((QHash<QString, QString>))
//Q_DECLARE_ASSOCIATIVE_CONTAINER_METATYPE(QHash)
#endif // WORKER_H_INCLUDED