Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
3eaf98fb09
|
|||
bab7423965
|
|||
a76e3cd10e
|
|||
eb1eab690b
|
|||
7ae4ddd851
|
|||
0cc89cefab
|
|||
14755cd5b4
|
|||
d2efe566c5
|
|||
b058b6aee0
|
|||
bdb0f9911b
|
|||
c679b489ba
|
|||
1c643c6caf
|
18
DCPlugin.pro
18
DCPlugin.pro
@@ -30,7 +30,14 @@ contains( CONFIG, PTU5 ) {
|
||||
QMAKE_CXXFLAGS += -std=c++11
|
||||
linux-clang { QMAKE_CXXFLAGS += -Qunused-arguments }
|
||||
CONFIG += link_pkgconfig
|
||||
PTU5BASEPATH = /opt/devel/ptu5
|
||||
ARCH = PTU5
|
||||
|
||||
INCLUDEPATH += $$PTU5BASEPATH/qt/libs/deviceController/include/
|
||||
LIBS += -L$$PTU5BASEPATH/qt/libs/deviceController/library
|
||||
|
||||
LIBS += -lCAslave
|
||||
LIBS += -lCAmaster
|
||||
}
|
||||
|
||||
contains( CONFIG, PTU5_YOCTO ) {
|
||||
@@ -38,8 +45,8 @@ contains( CONFIG, PTU5_YOCTO ) {
|
||||
PTU5BASEPATH = /opt/devel/ptu5
|
||||
ARCH = PTU5
|
||||
|
||||
# add qmqtt lib
|
||||
#LIBS += -lQt5Qmqtt
|
||||
LIBS += -lCAslave
|
||||
LIBS += -lCAmaster
|
||||
}
|
||||
|
||||
TARGET = ATBDeviceControllerPlugin
|
||||
@@ -69,7 +76,6 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# ATBAPP interface
|
||||
HEADERS += \
|
||||
include/interfaces.h \
|
||||
src/ATBAPP/ATBAPPplugin.h \
|
||||
src/ATBAPP/DeviceControllerDiag.h \
|
||||
src/ATBAPP/DeviceControllerInterface.h \
|
||||
@@ -80,7 +86,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 +98,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
|
||||
|
@@ -24,7 +24,8 @@ struct T_emp
|
||||
|
||||
// dynamic:
|
||||
uint8_t state; // step counter of EMP (electronic coin checker) FSM (finite state machine):
|
||||
// 0=start command
|
||||
/*
|
||||
// 0=start command
|
||||
// 1=powered, do emp ini, send reset
|
||||
// 2=delay
|
||||
// 3=wait for response, requesting status after response
|
||||
@@ -39,7 +40,7 @@ struct T_emp
|
||||
// 90: stop all, 1s delay
|
||||
// 99: off, all stopped
|
||||
|
||||
|
||||
*/
|
||||
uint8_t pollingRunning;
|
||||
uint8_t paymentRunning;
|
||||
|
||||
@@ -238,6 +239,7 @@ struct T_dynamicCondition
|
||||
uint8_t lastVDoorState;
|
||||
uint8_t lastCBstate;
|
||||
char paymentInProgress;
|
||||
// Version Szeged: aug2023
|
||||
// 0: stopped by timeout
|
||||
// 1: running 2: wait4lastCoin
|
||||
// 3: payment stopped manually, coins in Escrow
|
||||
@@ -246,6 +248,21 @@ struct T_dynamicCondition
|
||||
// 6: coins encashed 7:coins returned
|
||||
// 8: CoinChecker or MDB on Error
|
||||
|
||||
// since Schoenau with bill and changer, nov2023
|
||||
//0 = no payment
|
||||
//will be set to 1 by cash_startCollection()
|
||||
//neu 1: wait for devices getting ready for payment
|
||||
//2 = payment,
|
||||
//3 = wait for last coin/bill
|
||||
//4 = Bezahlvorgang manuell beendet
|
||||
//5 = payment stopped autom, amount collected, coins in Escrow
|
||||
//6 = Bezahlvorgang beendet weil ZK voll
|
||||
//4,5,6: payment done, keep on polling, wait for cash or return command
|
||||
//7 = encash collected money from coin escrow into cash box
|
||||
//8 = return "amountToReturn", can be complete inserted amount or only overpayment
|
||||
//9 = wait for changer result
|
||||
//10= print refund receipt with "amountToReturn"
|
||||
|
||||
|
||||
char res1;
|
||||
uint16_t U_Batt;
|
||||
@@ -397,6 +414,7 @@ struct T_bna
|
||||
|
||||
};
|
||||
|
||||
class DownloadThread;
|
||||
class hwinf
|
||||
{
|
||||
|
||||
@@ -2252,14 +2270,23 @@ public:
|
||||
virtual void bna_requestCurrentNotes() const {}
|
||||
// send command to DC in order to get transaction data
|
||||
|
||||
virtual uint8_t bna_getCurrentNotes(uint16_t latestBill, uint16_t *currentNotes) const {
|
||||
virtual uint8_t bna_getCurrentNotes(uint16_t latestBill, uint16_t *currentNotes) const
|
||||
{
|
||||
Q_UNUSED(latestBill);
|
||||
Q_UNUSED(currentNotes);
|
||||
return 0;
|
||||
}
|
||||
// returns number of collected bank notes since start-command (current transaction)
|
||||
// latestBill: last accepted bank note, value in cent
|
||||
// currentNotes an array with up to 16 (further) notes collected
|
||||
// return value: numbers of bills or 99 in case of error
|
||||
// latestBill: not used
|
||||
// in case of error: currentNotes[0,1,2,3] = 1..4 error number(s)
|
||||
// in normal case:
|
||||
// currentNotes[0]: last bill in cent (e.g. 1000 = 10€)
|
||||
// currentNotes[1]: bin 1 = bill is still in escrow else bill is stacked
|
||||
// note: by now (dec2023) escrow is not used, bills always go to stacker (box)
|
||||
// currentNotes[2]: total sum of bills in cent, low word (16bit)
|
||||
// currentNotes[3]: total sum of bills in cent, high word (16bit)
|
||||
|
||||
|
||||
virtual void bna_requestStackerLevel() const {}
|
||||
|
||||
@@ -2273,9 +2300,73 @@ public:
|
||||
// countOfBills[1] for 10€ and so on
|
||||
|
||||
|
||||
// download device controller
|
||||
virtual bool dcDownloadRequest(QString const &fileToDownload) const {
|
||||
Q_UNUSED(fileToDownload);
|
||||
return false;
|
||||
}
|
||||
virtual bool dcDownloadRequested() const { return false; }
|
||||
virtual bool dcDownloadResetRequest() const { return false; }
|
||||
virtual bool dcDownloadRequestAck() const { return false; }
|
||||
virtual bool dcDownloadRunning() const { return false; }
|
||||
virtual bool dcDownloadFinished() { return false; }
|
||||
|
||||
virtual bool dcDownloadReportStart() const { return false; }
|
||||
virtual bool dcDownloadReportRunning() const { return true; }
|
||||
virtual bool dcDownloadReportFinished() { return true; }
|
||||
|
||||
virtual bool dcDownloadThreadStart() { return false; }
|
||||
virtual bool dcDownloadThreadRunning() const { return true; }
|
||||
virtual void dcDownloadThreadFinalize(DownloadThread *) {}
|
||||
virtual bool dcDownloadThreadFinished() const { return true; }
|
||||
virtual bool dcDownloadReportThreadStart() { return false; }
|
||||
virtual bool dcDownloadReportThreadRunning() const { return true; }
|
||||
virtual void dcDownloadReportThreadFinalize() {}
|
||||
virtual void dcDownloadReportThreadQuit() {}
|
||||
virtual bool dcDownloadReportThreadFinished() const { return true; }
|
||||
|
||||
|
||||
virtual QString dcDownloadFileName() const { return ""; }
|
||||
virtual bool dcDownloadSetRequested(bool requested) {
|
||||
Q_UNUSED(requested); return false;
|
||||
}
|
||||
virtual bool dcDownloadSetRunning(bool running) {
|
||||
Q_UNUSED(running); return false;
|
||||
}
|
||||
virtual bool dcDownloadSetFinished(bool finished) {
|
||||
Q_UNUSED(finished); return false;
|
||||
}
|
||||
virtual void dcDownloadSetTotalBlockNumber(uint16_t totalBlockNumber) {
|
||||
Q_UNUSED(totalBlockNumber);
|
||||
}
|
||||
virtual void dcDownloadSetCurrentBlockNumber(uint16_t currentBlockNumber) {
|
||||
Q_UNUSED(currentBlockNumber);
|
||||
}
|
||||
virtual bool dcDownloadGetRequested() const { return false; }
|
||||
virtual bool dcDownloadGetRunning() const { return false; }
|
||||
virtual bool dcDownloadGetFinished() const { return false; }
|
||||
virtual uint16_t dcDownloadGetTotalBlockNumber() const { return 0; }
|
||||
virtual uint16_t dcDownloadGetCurrentBlockNumber() const { return 0; }
|
||||
|
||||
virtual QObject const *getAPI() { return nullptr; }
|
||||
|
||||
|
||||
signals:
|
||||
/*
|
||||
NOTE: the difference between a virtual Qt signal and a normal Qt signal:
|
||||
A Qt virtual signal is a connection that is established using a pointer
|
||||
or reference and is not connected to an object or data. It is therefore
|
||||
not bound to a particular object, but to a specific class (object type).
|
||||
Qt virtual signals are useful because they allow you to create
|
||||
connections without worrying about whether an object or a specific data
|
||||
element has been destroyed.
|
||||
https://www.youtube.com/watch?v=HTH3VFfqsXw
|
||||
|
||||
*/
|
||||
virtual void hwapi_reportDCDownloadStatus(QString const&) const {}
|
||||
virtual void hwapi_reportDCDownloadSuccess(QString const&) const {}
|
||||
virtual void hwapi_reportDCDownloadFailure(QString const&) const {}
|
||||
|
||||
virtual void hwapi_templatePrintFinished_OK(void) const=0;
|
||||
virtual void hwapi_templatePrintFinished_Err(void) const=0;
|
||||
|
||||
@@ -2299,6 +2390,7 @@ signals:
|
||||
virtual void hwapi_doorCBinAndAllDoorsClosed(void) const=0;
|
||||
virtual void hwapi_doorAllDoorsClosed(void) const=0;
|
||||
|
||||
virtual void hwapi_coinAttached() const = 0;
|
||||
|
||||
// NOTE: declaring a "pure virtual" "signal" should be an error and thus not valid.
|
||||
/* GH Version, bringt Fehler
|
||||
|
@@ -47,6 +47,7 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_payStopByEscrow()), this, SLOT(onCashPayStopByEscrow()), Qt::QueuedConnection);
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_payStopByError()), this, SLOT(onCashPayStopByError()), Qt::QueuedConnection);
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_payStopByTimeout()), this, SLOT(onCashPayStopByTimeout()), Qt::QueuedConnection);
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_coinAttached()), this, SIGNAL(coinAttached()), Qt::QueuedConnection); // check for errors, switch to mode IDLE
|
||||
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_doorServiceDoorOpened()), this, SLOT(onServiceDoorOpened()), Qt::QueuedConnection); // switch to ModeSERVICE
|
||||
connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_doorVaultDoorOpened()), this, SLOT(onVaultDoorOpened()), Qt::QueuedConnection); // Screen?? with message
|
||||
@@ -60,11 +61,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 +103,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().remove(QChar('\0'));
|
||||
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);
|
||||
@@ -133,6 +140,11 @@ void ATBDeviceControllerPlugin::startPhysicalLayer()
|
||||
return;
|
||||
}
|
||||
|
||||
qCritical() << "ATBDeviceControllerPlugin::startPhysicalLayer() " << endl
|
||||
<< " -> use master lib " << endl
|
||||
<< " -> start physical layer";
|
||||
|
||||
|
||||
// open serial port
|
||||
hw->dc_openSerial(5, "115200", this->serialPortName, 1);
|
||||
|
||||
@@ -141,6 +153,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)
|
||||
@@ -450,6 +466,12 @@ void ATBDeviceControllerPlugin::onVaultDoorOpened()
|
||||
this->dbus->startBackgroundTask("DOOR_OPEN");
|
||||
|
||||
emit this->requestModeACCOUNT();
|
||||
|
||||
// send service message, delayed:
|
||||
QTimer::singleShot(1000, this, [this](){
|
||||
emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::VAULT_DOOR_OPENED, "Please remove coinbox");
|
||||
hw->prn_cut(3);
|
||||
} );
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::onCoinBoxRemoved()
|
||||
@@ -459,12 +481,17 @@ void ATBDeviceControllerPlugin::onCoinBoxRemoved()
|
||||
// BackgroundTask("ACCOUNT") is finished, if account message is sent to ISMAS!
|
||||
this->dbus->startBackgroundTask("ACCOUNT");
|
||||
|
||||
emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::COIN_BOX_REMOVED, "Please insert coinbox");
|
||||
|
||||
QTimer::singleShot(4000, this, SLOT(private_startAccount()));
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::onCoinBoxInserted()
|
||||
{
|
||||
qCritical() << "ATBDeviceControllerPlugin::onCoinBoxInserted()";
|
||||
|
||||
emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::COIN_BOX_INSERTED, "Please close vault door");
|
||||
// emit this->showServiceText(0x1234);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -648,6 +675,7 @@ void ATBDeviceControllerPlugin::requestPrintReceipt(const QString & printingStri
|
||||
{
|
||||
QByteArray ba = printingString.toUtf8();
|
||||
hw->prn_switchPower(true);
|
||||
hw->prn_setFonts(8,12,0,0);
|
||||
hw->prn_sendText(&ba);
|
||||
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingReceipt()));
|
||||
|
||||
@@ -785,19 +813,19 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant
|
||||
QString paymentType = printingData["paymentType"].toString(); // must be "CASH" | "CARD"
|
||||
QString productName = printingData["product"].toString(); // must be "ShortTimeParking" | "DayTicket"
|
||||
|
||||
if ( (paymentType == "CASH") && (productName == "ShortTimeParking") ) {
|
||||
if ( (paymentType == "CASH") && (productName == "SHORT_TERM_PARKING") ) {
|
||||
this->currentSelectedTicketType = 1;
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CARD") && (productName == "ShortTimeParking") ) {
|
||||
if ( (paymentType == "CARD") && (productName == "SHORT_TERM_PARKING") ) {
|
||||
this->currentSelectedTicketType = 2;
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CASH") && (productName == "DayTicket") ) {
|
||||
if ( (paymentType == "CASH") && (productName == "DAY_TICKET") ) {
|
||||
this->currentSelectedTicketType = 3;
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CARD") && (productName == "DayTicket") ) {
|
||||
if ( (paymentType == "CARD") && (productName == "DAY_TICKET") ) {
|
||||
this->currentSelectedTicketType = 4;
|
||||
}
|
||||
else {
|
||||
@@ -1093,10 +1121,24 @@ void ATBDeviceControllerPlugin::onCashChangerState()
|
||||
amountCoinsChangedInt = amountInt - this->cashStartAmountInt;
|
||||
}
|
||||
else {
|
||||
amountCoinsChangedInt = 0;
|
||||
amountCoinsChangedInt = 0;
|
||||
}
|
||||
QString amountCoinsChangedString = QString::number(amountCoinsChangedInt);
|
||||
|
||||
// if we do not need to give change:
|
||||
if (amountCoinsChangedInt == 0) {
|
||||
emit this->cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
|
||||
amountString,
|
||||
amountCoinsString, // coins
|
||||
amountNotesString, // notes
|
||||
amountCoinsChangedString, // change
|
||||
"",
|
||||
"");
|
||||
changerStateRequestCounter = 0;
|
||||
lastChangerResult = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// get changer state ------------------------------------------------
|
||||
// Note: 'returnedAmount'-parameter is missleading here!
|
||||
@@ -1282,6 +1324,10 @@ bool ATBDeviceControllerPlugin::private_loadCashAgentLib(QString pluginName)
|
||||
|
||||
qCritical() << "ATBDeviceControllerPlugin: loaded CashAgentLib";
|
||||
|
||||
if (this->isMaster) {
|
||||
QTimer::singleShot(500, this, &ATBDeviceControllerPlugin::startPhysicalLayer);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@@ -10,9 +10,9 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include "support/PersistentData.h"
|
||||
|
||||
|
||||
#include "interfaces.h"
|
||||
#include <DeviceController/interfaces.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
@@ -112,6 +112,8 @@ private:
|
||||
|
||||
DeviceControllerDiag* diag;
|
||||
|
||||
PersistentData *persistentData;
|
||||
|
||||
uint32_t cashStartAmountInt;
|
||||
|
||||
|
||||
|
@@ -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,16 @@ void DeviceControllerDiag::diagRequest()
|
||||
this->diagRequestTimeoutTimer->start();
|
||||
|
||||
this->private_startDiag();
|
||||
|
||||
// read dc-fw-version:
|
||||
/* note: dc_getSWVersion() returns always 32 characters (QString)...
|
||||
* if no version string could be read it will contain 32 null-characters:
|
||||
* "\u0000\u0000..."
|
||||
*/
|
||||
QString dc_fw_version = hw->dc_getSWversion().remove(QChar('\0'));
|
||||
qCritical() << "ATBDeviceControllerPlugin: DC firmware version: " << dc_fw_version;
|
||||
this->pData->setDCFirmwareVersion(dc_fw_version);
|
||||
this->pData->serializeToFile();
|
||||
}
|
||||
|
||||
|
||||
|
@@ -5,9 +5,12 @@
|
||||
#include <QSet>
|
||||
#include <QTimer>
|
||||
|
||||
#include "ATBMachineEvent.h"
|
||||
#include "interfaces.h"
|
||||
#include <DeviceController/interfaces.h>
|
||||
|
||||
#include "DeviceControllerInterface.h"
|
||||
#include "ATBMachineEvent.h"
|
||||
|
||||
#include "support/PersistentData.h"
|
||||
|
||||
|
||||
namespace DeviceController {
|
||||
@@ -60,7 +63,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 +93,7 @@ private:
|
||||
|
||||
QSet<DeviceController::State> machineEventSet;
|
||||
|
||||
|
||||
PersistentData* pData;
|
||||
|
||||
private slots:
|
||||
void onDiagRequestTimeoutTimerTimeout();
|
||||
|
@@ -15,6 +15,9 @@ namespace nsDeviceControllerInterface {
|
||||
enum class TICKET_VARIANT : quint8;
|
||||
enum class COIN_PROCESSOR : quint8;
|
||||
enum class BILL_ACCEPTOR : quint8;
|
||||
|
||||
|
||||
enum class SERVICE_TEXT : quint16;
|
||||
}
|
||||
|
||||
|
||||
@@ -101,6 +104,9 @@ signals:
|
||||
const QString & errorCode,
|
||||
const QString & errorDescription);
|
||||
|
||||
|
||||
void coinAttached();
|
||||
|
||||
/**
|
||||
* emitted on e.g. a coin input
|
||||
*/
|
||||
@@ -170,8 +176,7 @@ signals:
|
||||
/**
|
||||
* show text messages in service mode
|
||||
*/
|
||||
void showServiceText(const QString & text);
|
||||
void showServiceText(quint16 textNumber);
|
||||
void showServiceText(nsDeviceControllerInterface::SERVICE_TEXT serviceText, const QString & text);
|
||||
|
||||
|
||||
/**
|
||||
@@ -191,7 +196,7 @@ signals:
|
||||
|
||||
|
||||
Q_DECLARE_INTERFACE(DeviceControllerInterface,
|
||||
"eu.atb.ptu.plugin.DeviceControllerInterface/1.1.0")
|
||||
"eu.atb.ptu.plugin.DeviceControllerInterface/1.1.2")
|
||||
|
||||
|
||||
namespace nsDeviceControllerInterface {
|
||||
@@ -235,6 +240,14 @@ namespace nsDeviceControllerInterface {
|
||||
YES,
|
||||
NO
|
||||
};
|
||||
|
||||
enum class SERVICE_TEXT : quint16 {
|
||||
SERVICE_DOOR_OPENED,
|
||||
VAULT_DOOR_OPENED,
|
||||
COIN_BOX_REMOVED,
|
||||
COIN_BOX_INSERTED
|
||||
/* t.b.d. */
|
||||
};
|
||||
}
|
||||
|
||||
#endif // DEVICECONTROLLERINTERFACE_H
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#define CASHUTILS_H
|
||||
|
||||
#include <QObject>
|
||||
#include "interfaces.h"
|
||||
#include <DeviceController/interfaces.h>
|
||||
|
||||
namespace CashUtils {
|
||||
|
||||
|
140
src/ATBAPP/support/PersistentData.cpp
Normal file
140
src/ATBAPP/support/PersistentData.cpp
Normal file
@@ -0,0 +1,140 @@
|
||||
#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)
|
||||
{
|
||||
// there must be a version string!
|
||||
if (fw_version.size() < 1) return;
|
||||
|
||||
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();
|
||||
}
|
49
src/ATBAPP/support/PersistentData.h
Normal file
49
src/ATBAPP/support/PersistentData.h
Normal 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
|
Reference in New Issue
Block a user