Add persistentData to store dc-fw-version

Reading dc-fw-version is somehow complicated ...
Id does not work reliable on startup, so we do read it also on every
diagRequest().
Version string is then stored in persistent data.
This data can be used e.g. by other tools to show the
device-controller-firmware-version.
This commit is contained in:
Siegfried Siegert 2024-01-31 11:34:00 +01:00
parent b058b6aee0
commit d2efe566c5
Signed by: SiegfriedSiegert
GPG Key ID: 68371E015E8F0B03
7 changed files with 217 additions and 8 deletions

View File

@ -80,7 +80,8 @@ HEADERS += \
src/ATBAPP/support/CashUtils.h \
src/ATBAPP/support/DBusControllerInterface.h \
src/ATBAPP/support/JSON.h \
src/ATBAPP/support/PTUSystem.h
src/ATBAPP/support/PTUSystem.h \
src/ATBAPP/support/PersistentData.h
SOURCES += \
src/ATBAPP/ATBHealthEvent.cpp \
@ -91,7 +92,8 @@ SOURCES += \
src/ATBAPP/support/CashUtils.cpp \
src/ATBAPP/support/DBusControllerInterface.cpp \
src/ATBAPP/support/JSON.cpp \
src/ATBAPP/support/PTUSystem.cpp
src/ATBAPP/support/PTUSystem.cpp \
src/ATBAPP/support/PersistentData.cpp
DISTFILES += \
generate-version.sh

View File

@ -60,11 +60,12 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
dynamic_cast<QObject*>(hw)->moveToThread(hwThread);
hwThread->start();
QString persistentDataFile = "/mnt/system_data/dc_persistentData.dat";
this->persistentData = new PersistentData(persistentDataFile);
this->diag = new DeviceControllerDiag(this);
this->diag = new DeviceControllerDiag(this->persistentData, this);
connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage);
this->currentSelectedTicketType = 0;
this->currentCashState = CASH_STATE::CACHE_EMPTY;
@ -101,6 +102,11 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con
// this is necessary to init the CashAgentLib (!)
hw->vend_failed();
// read sw-version and store it in persistentData, if changed
QString dc_fw_version = hw->dc_getSWversion();
qCritical() << "ATBDeviceControllerPlugin: DC firmware version: " << dc_fw_version;
this->persistentData->setDCFirmwareVersion(dc_fw_version);
this->persistentData->serializeToFile();
// text encoding for printer
this->codec = QTextCodec::codecForName(printerEncoding);
@ -141,6 +147,10 @@ void ATBDeviceControllerPlugin::startPhysicalLayer()
void ATBDeviceControllerPlugin::stopPhysicalLayer()
{
// store persistent data
this->persistentData->serializeToFile();
// skip, if we use slave lib
if (!this->isMaster) return;
if (this->pluginState == PLUGIN_STATE::NOT_INITIALIZED)

View File

@ -10,7 +10,7 @@
#include "version.h"
#include "support/PersistentData.h"
#include "interfaces.h"
@ -112,6 +112,8 @@ private:
DeviceControllerDiag* diag;
PersistentData *persistentData;
uint32_t cashStartAmountInt;

View File

@ -5,13 +5,14 @@
#include <QUuid>
#include <QDebug>
DeviceControllerDiag::DeviceControllerDiag(QObject *parent)
DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *parent)
: QObject(parent)
, coinProcessorType(nsDeviceControllerInterface::COIN_PROCESSOR::ESCROW)
, billAcceptor(nsDeviceControllerInterface::BILL_ACCEPTOR::NO)
, eventReceiver(nullptr)
, isRequestRunning(false)
, flagInterruptDiag(false)
, pData(pData)
{
diagRequestTimeoutTimer = new QTimer(this);
diagRequestTimeoutTimer->setInterval(1000*20); // 20s
@ -42,6 +43,12 @@ void DeviceControllerDiag::diagRequest()
this->diagRequestTimeoutTimer->start();
this->private_startDiag();
// read dc-fw-version:
QString dc_fw_version = hw->dc_getSWversion();
qCritical() << "ATBDeviceControllerPlugin: DC firmware version: " << dc_fw_version;
this->pData->setDCFirmwareVersion(dc_fw_version);
this->pData->serializeToFile();
}

View File

@ -9,6 +9,8 @@
#include "interfaces.h"
#include "DeviceControllerInterface.h"
#include "support/PersistentData.h"
namespace DeviceController {
Q_NAMESPACE
@ -60,7 +62,7 @@ class DeviceControllerDiag : public QObject
Q_OBJECT
public:
DeviceControllerDiag(QObject *parent = nullptr);
DeviceControllerDiag(PersistentData *pData, QObject *parent = nullptr);
void init(hwinf* hw, QObject* eventReceiver);
@ -90,7 +92,7 @@ private:
QSet<DeviceController::State> machineEventSet;
PersistentData* pData;
private slots:
void onDiagRequestTimeoutTimerTimeout();

View File

@ -0,0 +1,137 @@
#include "PersistentData.h"
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include <QDateTime>
#include <QDataStream>
#include <QDebug>
PersistentData::PersistentData(const QString &datafileName, QObject *parent)
: QObject(parent)
, isChangedFlag(false)
{
// load persistant data, if available
this->filename = datafileName;
QFileInfo dataFileInfo(this->filename);
QString dataFilePath = dataFileInfo.path();
QDir dir;
if ( ! dir.exists(dataFilePath)) {
qCritical() << "Persistent data file does not exist!";
qCritical() << " --> create new: " << this->filename;
dir.mkpath(dataFilePath);
}
this->read();
}
void PersistentData::serializeToFile()
{
this->save();
}
void PersistentData::save()
{
QFile fileOut(this->filename);
if (fileOut.open(QIODevice::WriteOnly))
{
QDataStream out(&fileOut);
out.setVersion(QDataStream::Qt_4_6);
out << this->hash;
fileOut.flush();
fileOut.close();
}
}
void PersistentData::read()
{
QFile fileIn(this->filename);
if (fileIn.open(QIODevice::ReadOnly))
{
QDataStream in(&fileIn);
in.setVersion(QDataStream::Qt_4_6);
in >> hash;
fileIn.close();
}
}
QVariant PersistentData::getParameter(const QString & key) const {
#if defined (ARCH_DesktopLinux)
// note: QVariant.toString() returns empty string for custom types
qDebug() << "VendingData::getParameter() key = " << key << " value = " << hash.value(key).toString();
#endif
return hash.value(key);
}
QVariant PersistentData::getParameter(const QString & key)
{
#if defined (ARCH_DesktopLinux)
// note: QVariant.toString() returns empty string for custom types
qDebug() << "VendingData::getParameter() key = " << key << " value = " << hash.value(key).toString();
#endif
return hash.value(key);
}
void PersistentData::setParameter(const QString & key, QVariant value)
{
this->isChangedFlag = true;
#if defined (ARCH_DesktopLinux)
// note: QVariant.toString() returns empty string for custom types
qDebug() << "VendingData::setParameter() key = " << key << " value = " << value.toString();
#endif
this->hash.insert(key, value);
}
void PersistentData::clearParameter(const QString & key)
{
this->isChangedFlag = true;
this->hash.remove(key);
}
bool PersistentData::hasParameter(const QString & key) const
{
return hash.contains(key);
}
uint PersistentData::getUintParameter(const QString & key) const
{
qDebug() << "PersistentData::getUintParameter() key = " << key << " value = " << hash.value(key).toString();
uint returnValue = 0;
bool ok;
returnValue = hash.value(key).toString().toUInt(&ok);
if (!ok) returnValue = 0;
return returnValue;
}
QList<QString> PersistentData::uniqueKeys() const {
return hash.uniqueKeys();
}
void PersistentData::setDCFirmwareVersion(const QString & fw_version)
{
if (this->hash["dc_fw_version"].toString() != fw_version) {
this->isChangedFlag = true;
this->hash.insert("dc_fw_version", fw_version);
}
}
QString PersistentData::getDCFirmwareVersion()
{
return this->hash["dc_fw_version"].toString();
}

View File

@ -0,0 +1,49 @@
#ifndef PERSISTENTDATA_H
#define PERSISTENTDATA_H
#include <QObject>
#include <QHash>
#include <QVariant>
#include <QList>
#include <QString>
class PersistentData : public QObject
{
Q_OBJECT
public:
explicit PersistentData(const QString &datafileName, QObject *parent = nullptr);
void setDCFirmwareVersion(const QString & fw_version);
QString getDCFirmwareVersion();
QVariant getParameter(const QString & key);
QVariant getParameter(const QString & key) const;
void setParameter(const QString & key, QVariant value);
void clearParameter(const QString & key);
bool hasParameter(const QString & key) const;
uint getUintParameter(const QString & key) const;
QList<QString> uniqueKeys() const;
public slots:
void serializeToFile();
signals:
private:
QHash<QString, QVariant> hash;
QString dc_fw_version;
QString filename;
void save();
void read();
bool isChangedFlag;
};
#endif // PERSISTENTDATA_H