Compare commits
37 Commits
Author | SHA1 | Date | |
---|---|---|---|
d720c7190f
|
|||
3fff6a0ebe
|
|||
bacee366b8
|
|||
acf3e143c1
|
|||
c84050091b
|
|||
9be2841187
|
|||
3e4db6cfcc
|
|||
5898be8807
|
|||
f20957c14a
|
|||
1bcdb5ba21
|
|||
a43af8ab86
|
|||
d7443974e2
|
|||
346c953175
|
|||
8cf6897a21
|
|||
69eb87e358
|
|||
8eab11479c
|
|||
ac93e9e631
|
|||
c1dd20ec4f
|
|||
2d60a7bd5c
|
|||
6d7d9ade70
|
|||
72dbc8b858
|
|||
32d70abf44
|
|||
c076090e03
|
|||
6c2717c56b
|
|||
816182c87b
|
|||
492d3a107a
|
|||
962cd01eac
|
|||
d66363da46
|
|||
7b25f86d6b
|
|||
5a999a0494
|
|||
ec18ac45e4
|
|||
560b6d3221
|
|||
b946dc5a92
|
|||
ea7542a248
|
|||
4541699ec3
|
|||
87d50a05dd
|
|||
379a5d4e3e
|
@@ -88,7 +88,8 @@ HEADERS += \
|
||||
src/ATBAPP/support/JSON.h \
|
||||
src/ATBAPP/support/PTUSystem.h \
|
||||
src/ATBAPP/support/PersistentData.h \
|
||||
src/ATBAPP/support/Ticket.h
|
||||
src/ATBAPP/support/Ticket.h \
|
||||
src/ATBAPP/support/TicketUtils.h
|
||||
|
||||
SOURCES += \
|
||||
src/ATBAPP/ATBHealthEvent.cpp \
|
||||
@@ -101,7 +102,8 @@ SOURCES += \
|
||||
src/ATBAPP/support/JSON.cpp \
|
||||
src/ATBAPP/support/PTUSystem.cpp \
|
||||
src/ATBAPP/support/PersistentData.cpp \
|
||||
src/ATBAPP/support/Ticket.cpp
|
||||
src/ATBAPP/support/Ticket.cpp \
|
||||
src/ATBAPP/support/TicketUtils.cpp
|
||||
|
||||
DISTFILES += \
|
||||
generate-version.sh
|
||||
|
@@ -6,6 +6,7 @@
|
||||
#include "src/ATBAPP/support/DBusControllerInterface.h"
|
||||
#include "src/ATBAPP/support/PTUSystem.h"
|
||||
#include "src/ATBAPP/support/CashUtils.h"
|
||||
#include "src/ATBAPP/support/TicketUtils.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QThread>
|
||||
@@ -30,13 +31,31 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
|
||||
this->setParent(parent);
|
||||
|
||||
this->pluginInfo = QString::fromUtf8(pluginInfoString.c_str());
|
||||
}
|
||||
|
||||
ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {}
|
||||
|
||||
PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, const QSettings & settings)
|
||||
{
|
||||
this->eventReceiver = eventReceiver;
|
||||
|
||||
// read variables from setting
|
||||
this->serialPortName = settings.value("ATBDeviceControllerPlugin/serialPort", "ttymxc2").toString();
|
||||
QByteArray printerEncoding = settings.value("ATBDeviceControllerPlugin/printerEncoding", "ISO 8859-2").toString().toLatin1();
|
||||
QString printerLocaleString = settings.value("ATBDeviceControllerPlugin/printerLocale", "de_DE").toString().toLatin1();
|
||||
this->printerLocale = QLocale(printerLocaleString);
|
||||
|
||||
if (!this->private_loadCashAgentLib("")) {
|
||||
return;
|
||||
}
|
||||
|
||||
this->init_sc_dbus();
|
||||
|
||||
QString persistentDataFile = "/mnt/system_data/dc_persistentData.dat";
|
||||
this->persistentData = new PersistentData(persistentDataFile);
|
||||
|
||||
|
||||
// setup libCA:
|
||||
if (!this->private_loadCashAgentLib("")) {
|
||||
return PLUGIN_STATE::NOT_INITIALIZED;
|
||||
}
|
||||
|
||||
//connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_OK()), this, SLOT(onPrintFinishedOK()), Qt::QueuedConnection);
|
||||
//connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_Err()), this, SLOT(onPrintFinishedERR()), Qt::QueuedConnection);
|
||||
@@ -61,12 +80,11 @@ 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->persistentData, this);
|
||||
connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage);
|
||||
|
||||
int diagTimeout = settings.value("ATBDeviceControllerPlugin/diagTimeout", "45").toInt();
|
||||
this->diag->setTimeout(diagTimeout);
|
||||
|
||||
// currentSelectedTicketType - number of used "Kombiticket" (deprecated) use TICKET_VARIANT in future
|
||||
this->currentSelectedTicketType = 0;
|
||||
@@ -75,19 +93,7 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
|
||||
this->currentCashState = CASH_STATE::CACHE_EMPTY;
|
||||
|
||||
this->cashStartAmountInt = 0;
|
||||
}
|
||||
|
||||
ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {}
|
||||
|
||||
PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, const QSettings & settings)
|
||||
{
|
||||
this->eventReceiver = eventReceiver;
|
||||
|
||||
// read variables from setting
|
||||
this->serialPortName = settings.value("ATBDeviceControllerPlugin/serialPort", "ttymxc2").toString();
|
||||
QByteArray printerEncoding = settings.value("ATBDeviceControllerPlugin/printerEncoding", "ISO 8859-2").toString().toLatin1();
|
||||
QString printerLocaleString = settings.value("ATBDeviceControllerPlugin/printerLocale", "de_DE").toString().toLatin1();
|
||||
this->printerLocale = QLocale(printerLocaleString);
|
||||
|
||||
|
||||
if (this->isMaster) {
|
||||
@@ -227,20 +233,20 @@ void ATBDeviceControllerPlugin::reset()
|
||||
// Handle Mode-Changes --------------------------------------------------------
|
||||
|
||||
void ATBDeviceControllerPlugin::onChangedProgramModeToSELL()
|
||||
{
|
||||
{
|
||||
hw->dc_autoRequest(true);
|
||||
hw->rtc_setDateTime();
|
||||
hw->mdb_switchWake(0); // wakeup MDB components
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::onChangedProgramModeToSERVICE()
|
||||
{
|
||||
{
|
||||
hw->dc_autoRequest(true);
|
||||
hw->mdb_switchWake(0); // wakeup MDB components
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::onChangedProgramModeToIDLE()
|
||||
{
|
||||
{
|
||||
hw->dc_autoRequest(true);
|
||||
this->diag->diagRequest();
|
||||
hw->mdb_switchWake(1);
|
||||
@@ -305,6 +311,73 @@ void ATBDeviceControllerPlugin::cashCollect()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ATBDeviceControllerPlugin::cashCollect(const QString & amount)
|
||||
{
|
||||
if (this->coinProcessor() != nsDeviceControllerInterface::COIN_PROCESSOR::CHANGER) {
|
||||
this->cashCollect();
|
||||
return;
|
||||
}
|
||||
|
||||
// check if we must change coins:
|
||||
|
||||
// inserted amount
|
||||
uint32_t amountInsertedInt = this->hw->getInsertedAmount();
|
||||
|
||||
bool ok;
|
||||
uint32_t amountToPayInt = amount.toInt(&ok);
|
||||
|
||||
// check if we must change coins:
|
||||
if (amountInsertedInt > amountToPayInt) {
|
||||
|
||||
uint32_t amountToChangeInt = amountInsertedInt - amountToPayInt;
|
||||
|
||||
qCritical() << "cashCollect(" << amount << ")";
|
||||
qCritical() << " amount to change: " << QString::number(amountToChangeInt);
|
||||
|
||||
|
||||
// trigger changer:
|
||||
emit this->cashPaymentChanging(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
|
||||
QString::number(amountToChangeInt),
|
||||
"", // ErrorCode
|
||||
""); // ErrorDescription
|
||||
|
||||
// change
|
||||
hw->changer_returnCoins(amountToChangeInt);
|
||||
|
||||
QTimer::singleShot(1000, this, &ATBDeviceControllerPlugin::onCashChangerState);
|
||||
|
||||
}
|
||||
else {
|
||||
// nothing to change:
|
||||
|
||||
qCritical() << "cashCollect(" << amount << ")";
|
||||
qCritical() << " nothing to change. ";
|
||||
|
||||
|
||||
hw->vend_success();
|
||||
|
||||
QString amountString = QString::number(amountInsertedInt);
|
||||
|
||||
// inserted coins
|
||||
uint32_t amountCoinsInt = CashUtils::getAmountOfInsertedCoins(this->hw);
|
||||
QString amountCoinsString = QString::number(amountCoinsInt);
|
||||
|
||||
// inserted notes
|
||||
uint32_t amountNotesInt = CashUtils::getAmountOfInsertedNotes(this->hw);
|
||||
QString amountNotesString = QString::number(amountNotesInt);
|
||||
|
||||
emit this->cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS,
|
||||
amountString,
|
||||
amountCoinsString, // coins
|
||||
amountNotesString, // notes
|
||||
0, // proposed change
|
||||
"",
|
||||
"");
|
||||
this->currentCashState = CASH_STATE::CACHE_EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::cashAbort()
|
||||
{
|
||||
hw->vend_failed();
|
||||
@@ -537,6 +610,8 @@ void ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed()
|
||||
{
|
||||
qCritical() << "ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed()";
|
||||
|
||||
this->diag->diagReInit();
|
||||
|
||||
QTimer::singleShot(2000, this, SIGNAL(requestModeIDLE()));
|
||||
|
||||
this->dbus->finishedBackgroundTask("DOOR_OPEN");
|
||||
@@ -550,10 +625,14 @@ void ATBDeviceControllerPlugin::onAllDoorsClosed()
|
||||
{
|
||||
qCritical() << "ATBDeviceControllerPlugin::onAllDoorsClosed()";
|
||||
|
||||
emit this->requestModeIDLE();
|
||||
this->dbus->finishedBackgroundTask("DOOR_OPEN");
|
||||
if (this->diag->isErrorState()) {
|
||||
emit this->requestModeOOO();
|
||||
}
|
||||
else {
|
||||
emit this->requestModeIDLE();
|
||||
}
|
||||
|
||||
// TODO: check for errors and create a machine event
|
||||
this->dbus->finishedBackgroundTask("DOOR_OPEN");
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::onNewVoltage(uint32_t voltage)
|
||||
@@ -643,10 +722,22 @@ void ATBDeviceControllerPlugin::requestPrintReceipt(const QHash<QString, QVarian
|
||||
|
||||
void ATBDeviceControllerPlugin::requestPrintReceipt(const QString & printingString)
|
||||
{
|
||||
QByteArray ba = printingString.toUtf8();
|
||||
QByteArray ba_receipt = this->codec->fromUnicode(printingString);
|
||||
|
||||
//QByteArray ba = printingString.toUtf8();
|
||||
hw->prn_switchPower(true);
|
||||
hw->prn_setFonts(8,12,0,0);
|
||||
hw->prn_sendText(&ba);
|
||||
hw->prn_sendText(&ba_receipt);
|
||||
|
||||
// DEBUG
|
||||
//qCritical() << "---------------------------------------------------------------";
|
||||
//qCritical() << "ATBDeviceControllerPlugin::requestPrintReceipt()";
|
||||
//qCritical() << " receipt data:";
|
||||
//qCritical() << QString(ba_receipt);
|
||||
//qCritical() << "---------------------------------------------------------------";
|
||||
|
||||
|
||||
this->printResultCheckCounter = 0;
|
||||
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingReceipt()));
|
||||
|
||||
//QTimer::singleShot(2000, this, [this](){ hw->prn_cut(3); } );
|
||||
@@ -695,20 +786,36 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingReceipt()
|
||||
|
||||
void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant> & printingData)
|
||||
{
|
||||
struct T_dynDat *dynTicketData = new T_dynDat;
|
||||
struct T_dynDat dynamicTicketData;
|
||||
struct T_dynDat *dynTicketData = &dynamicTicketData;
|
||||
memset(dynTicketData, 0, sizeof(*dynTicketData));
|
||||
|
||||
qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( " << endl
|
||||
<< " licenseplate = " << printingData["licenseplate"] << endl
|
||||
<< " amount = " << printingData["amount"] << endl
|
||||
<< " parkingEnd = " << printingData["parkingEnd"] << endl
|
||||
<< " currentDateTime = " << printingData["currentDateTime"] << endl;
|
||||
<< " currentDateTime = " << printingData["currentDateTime"] << endl
|
||||
<< " ticketNumber = " << printingData["ticketNumber"] << endl;
|
||||
|
||||
QDateTime parkingEndDateTime = QDateTime::fromString(printingData["parkingEnd"].toString(), Qt::ISODate);
|
||||
QDateTime parkingEndDateTime = QDateTime::fromString(printingData["parkingEnd"].toString(), Qt::ISODate);
|
||||
QDateTime currentDateTime = QDateTime::fromString(printingData["currentDateTime"].toString(), Qt::ISODate);
|
||||
|
||||
QString parkingEndDateString = this->printerLocale.toString(parkingEndDateTime.date(), QLocale::ShortFormat);
|
||||
QString currentDateString = this->printerLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
QString parkingEndDateString = TicketUtils::getLocaleDateString(this->printerLocale, parkingEndDateTime.date());
|
||||
QString currentDateString = TicketUtils::getLocaleDateString(this->printerLocale, currentDateTime.date());
|
||||
|
||||
/*******************************************************************************************
|
||||
* TEST date formate strings:
|
||||
QLocale ltLocale("lt_LT");
|
||||
QLocale deLocale("de_DE");
|
||||
|
||||
QString ltShortDate = ltLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
QString deShortDate = deLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
|
||||
qCritical() << "*********************************************************************";
|
||||
qCritical() << " ltShortDate = " << ltShortDate;
|
||||
qCritical() << " deShortDate = " << deShortDate;
|
||||
qCritical() << "*********************************************************************";
|
||||
*/
|
||||
|
||||
/* -----------------------------------------------------------------------------------------
|
||||
* note: the following highly depends on printer template files!
|
||||
@@ -734,6 +841,10 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant
|
||||
QByteArray ba_currentDate = codec->fromUnicode(currentDateString);
|
||||
memcpy((char*)dynTicketData->currentDate, ba_currentDate.data(), std::min(ba_currentDate.size(),8));
|
||||
|
||||
// Ticket-Number
|
||||
QByteArray ba_ticketNumber = codec->fromUnicode(printingData["ticketNumber"].toString());
|
||||
memcpy((char*)dynTicketData->dynDat7, ba_ticketNumber.data(), std::min(ba_ticketNumber.size(),8));
|
||||
|
||||
|
||||
// DEBUG
|
||||
/*
|
||||
@@ -767,7 +878,8 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant
|
||||
<< " amount = " << printingData["amount"] << endl
|
||||
<< " parkingEnd = " << printingData["parkingEnd"] << endl
|
||||
<< " currentTime = " << printingData["currentTime"] << endl
|
||||
<< " currentDate = " << printingData["currentDate"] << endl;
|
||||
<< " currentDate = " << printingData["currentDate"] << endl
|
||||
<< " ticketNumber = " << printingData["ticketNumber"] << endl;
|
||||
|
||||
|
||||
this->onPrintFinishedERR();
|
||||
@@ -788,19 +900,39 @@ 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 == "SHORT_TERM_PARKING") ) {
|
||||
if ( (paymentType == "CASH") && ( (productName == "SHORT_TERM_PARKING") ||
|
||||
(productName == "SHORT_TERM_PARKING_CAR") ||
|
||||
(productName == "SHORT_TERM_PARKING_VAN") ||
|
||||
(productName == "SHORT_TERM_PARKING_CAMPER")
|
||||
))
|
||||
{
|
||||
this->currentSelectedTicketType = 1; // "Kombiticket #1"
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CARD") && (productName == "SHORT_TERM_PARKING") ) {
|
||||
if ( (paymentType == "CARD") && ( (productName == "SHORT_TERM_PARKING") ||
|
||||
(productName == "SHORT_TERM_PARKING_CAR") ||
|
||||
(productName == "SHORT_TERM_PARKING_VAN") ||
|
||||
(productName == "SHORT_TERM_PARKING_CAMPER")
|
||||
))
|
||||
{
|
||||
this->currentSelectedTicketType = 2; // "Kombiticket #2"
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CASH") && (productName == "DAY_TICKET") ) {
|
||||
if ( (paymentType == "CASH") && ( (productName == "DAY_TICKET") ||
|
||||
(productName == "DAY_TICKET_CAR") ||
|
||||
(productName == "DAY_TICKET_VAN") ||
|
||||
(productName == "DAY_TICKET_CAMPER")
|
||||
))
|
||||
{
|
||||
this->currentSelectedTicketType = 3; // "Kombiticket #3"
|
||||
}
|
||||
else
|
||||
if ( (paymentType == "CARD") && (productName == "DAY_TICKET") ) {
|
||||
if ( (paymentType == "CARD") && ( (productName == "DAY_TICKET") ||
|
||||
(productName == "DAY_TICKET_CAR") ||
|
||||
(productName == "DAY_TICKET_VAN") ||
|
||||
(productName == "DAY_TICKET_CAMPER")
|
||||
))
|
||||
{
|
||||
this->currentSelectedTicketType = 4; // "Kombiticket #4"
|
||||
}
|
||||
else
|
||||
@@ -836,6 +968,7 @@ void ATBDeviceControllerPlugin::onPrinterDataPrepared()
|
||||
|
||||
// note: calling prn_getPrintResult() immediately may result in wrong answer!
|
||||
// We have to wait "about some seconds" until calling this function!
|
||||
this->printResultCheckCounter = 0;
|
||||
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingTicket()));
|
||||
|
||||
// old: use printer templates:
|
||||
@@ -859,8 +992,17 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingTicket()
|
||||
this->onPrintFinishedERR();
|
||||
break;
|
||||
default:
|
||||
qCritical() << "DC Error: wait for printing";
|
||||
this->onPrintFinishedERR();
|
||||
// result value is not defined (-> workaround for DC misbehaviour)
|
||||
if (this->printResultCheckCounter < 10) {
|
||||
this->printResultCheckCounter++;
|
||||
qCritical() << "DC print result undefined: " << printerResult;
|
||||
QTimer::singleShot(1000, this, SLOT(onPrinterWaitForPrintingTicket()));
|
||||
}
|
||||
else {
|
||||
qCritical() << "DC Error: wait for printing";
|
||||
this->onPrintFinishedERR();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -888,6 +1030,7 @@ void ATBDeviceControllerPlugin::onPrinterPrintNextTemplate()
|
||||
|
||||
if (this->currentTicket->templateList()->isEmpty()) {
|
||||
// all templates are printed
|
||||
this->printResultCheckCounter = 0;
|
||||
QTimer::singleShot(2000, this, SLOT(onPrinterWaitForPrintingTicket()));
|
||||
}
|
||||
else {
|
||||
@@ -939,7 +1082,8 @@ void ATBDeviceControllerPlugin::onPrinterPrepareDynTemplateData()
|
||||
}
|
||||
void ATBDeviceControllerPlugin::prepareDynTemplateData()
|
||||
{
|
||||
struct T_dynDat *dynTicketData = new T_dynDat;
|
||||
struct T_dynDat dynamicTicketData;
|
||||
struct T_dynDat *dynTicketData = &dynamicTicketData;
|
||||
memset(dynTicketData, 0, sizeof(*dynTicketData));
|
||||
|
||||
// setup dynTicketData dependent on currentTicket
|
||||
@@ -958,12 +1102,18 @@ void ATBDeviceControllerPlugin::prepareDynTemplateData()
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::STOP_RECEIPT:
|
||||
private_setupDynTemplatData_STOP_RECEIPT(dynTicketData, this->currentTicket);
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::FINE_PAYMENT:
|
||||
private_setupDynTemplatData_FINE_PAYMENT(dynTicketData, this->currentTicket);
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::RECEIPT:
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::ERROR_RECEIPT:
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::PARKING_TICKET:
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::FREE_TICKET:
|
||||
private_setupDynTemplatData_FREE_TICKET(dynTicketData, this->currentTicket);
|
||||
break;
|
||||
case nsDeviceControllerInterface::TICKET_VARIANT::FOOD_STAMP:
|
||||
private_setupDynTemplatData_FOOD_STAMP(dynTicketData, this->currentTicket);
|
||||
break;
|
||||
@@ -989,9 +1139,8 @@ void ATBDeviceControllerPlugin::private_setupDynTemplateData_START_RECEIPT(struc
|
||||
QDateTime parkingEndDateTime = QDateTime::fromString(ticket->getPrintingData()["parkingEnd"].toString(), Qt::ISODate);
|
||||
QDateTime currentDateTime = QDateTime::fromString(ticket->getPrintingData()["currentDateTime"].toString(), Qt::ISODate);
|
||||
|
||||
QString parkingEndDateString = this->printerLocale.toString(parkingEndDateTime.date(), QLocale::ShortFormat);
|
||||
QString currentDateString = this->printerLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
|
||||
QString parkingEndDateString = TicketUtils::getLocaleDateString(this->printerLocale, parkingEndDateTime.date());
|
||||
QString currentDateString = TicketUtils::getLocaleDateString(this->printerLocale, currentDateTime.date());
|
||||
|
||||
// set dynamic printer data:
|
||||
QByteArray ba_licenseplate = codec->fromUnicode(ticket->getPrintingData()["licenseplate"].toString());
|
||||
@@ -1066,6 +1215,62 @@ void ATBDeviceControllerPlugin::private_setupDynTemplatData_FOOD_STAMP(struct T_
|
||||
qCritical() << "-------------------------------------------------------";
|
||||
}
|
||||
|
||||
void ATBDeviceControllerPlugin::private_setupDynTemplatData_FINE_PAYMENT(struct T_dynDat *dynTicketData, Ticket *ticket)
|
||||
{
|
||||
QDateTime currentDateTime = QDateTime::fromString(ticket->getPrintingData()["currentDateTime"].toString(), Qt::ISODate);
|
||||
|
||||
QString currentDateString = this->printerLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
|
||||
|
||||
// set dynamic printer data:
|
||||
QByteArray ba_licenseplate = codec->fromUnicode(ticket->getPrintingData()["licenseplate"].toString());
|
||||
memcpy((char*)dynTicketData->licensePlate, ba_licenseplate.data(), std::min(ba_licenseplate.size(),8));
|
||||
|
||||
QByteArray ba_amount = codec->fromUnicode(ticket->getPrintingData()["amount"].toString());
|
||||
memcpy((char*)dynTicketData->vendingPrice, ba_amount.data(), std::min(ba_amount.size(),8)); // Szeged
|
||||
memcpy((char*)dynTicketData->dynDat6, ba_amount.data(), std::min(ba_amount.size(),8)); // Schoenau
|
||||
|
||||
QByteArray ba_currentDate = codec->fromUnicode(currentDateString);
|
||||
memcpy((char*)dynTicketData->currentDate, ba_currentDate.data(), std::min(ba_currentDate.size(),8));
|
||||
|
||||
QByteArray ba_ticketId = codec->fromUnicode(ticket->getPrintingData()["ticketId"].toString());
|
||||
memcpy((char*)dynTicketData->dynDat7, ba_ticketId.data(), std::min(ba_ticketId.size(),8));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void ATBDeviceControllerPlugin::private_setupDynTemplatData_FREE_TICKET(struct T_dynDat *dynTicketData, Ticket *ticket)
|
||||
{
|
||||
QDateTime currentDateTime = QDateTime::fromString(ticket->getPrintingData()["currentDateTime"].toString(), Qt::ISODate);
|
||||
|
||||
QString currentDateString = this->printerLocale.toString(currentDateTime.date(), QLocale::ShortFormat);
|
||||
|
||||
|
||||
// set dynamic printer data:
|
||||
QByteArray ba_licenseplate = codec->fromUnicode(ticket->getPrintingData()["licenseplate"].toString());
|
||||
memcpy((char*)dynTicketData->licensePlate, ba_licenseplate.data(), std::min(ba_licenseplate.size(),8));
|
||||
|
||||
QByteArray ba_amount = codec->fromUnicode(ticket->getPrintingData()["amount"].toString());
|
||||
memcpy((char*)dynTicketData->vendingPrice, ba_amount.data(), std::min(ba_amount.size(),8)); // Szeged
|
||||
memcpy((char*)dynTicketData->dynDat6, ba_amount.data(), std::min(ba_amount.size(),8)); // Schoenau
|
||||
|
||||
QByteArray ba_currentDate = codec->fromUnicode(currentDateString);
|
||||
memcpy((char*)dynTicketData->currentDate, ba_currentDate.data(), std::min(ba_currentDate.size(),8));
|
||||
|
||||
|
||||
// FREE_TICKET needs parking endtime:
|
||||
|
||||
QDateTime parkingEndDateTime = QDateTime::fromString(ticket->getPrintingData()["parkingEnd"].toString(), Qt::ISODate);
|
||||
|
||||
QByteArray ba_parkingEndTime = codec->fromUnicode(parkingEndDateTime.toString("hh:mm"));
|
||||
memcpy((char*)dynTicketData->parkingEnd, ba_parkingEndTime.data(), std::min(ba_parkingEndTime.size(),8));
|
||||
|
||||
QString parkingEndDateString = TicketUtils::getLocaleDateString(this->printerLocale, parkingEndDateTime.date());
|
||||
|
||||
QByteArray ba_parkingEndDate = codec->fromUnicode(parkingEndDateString);
|
||||
memcpy((char*)dynTicketData->currentTime, ba_parkingEndDate.data(), std::min(ba_parkingEndDate.size(),8));
|
||||
// ! and yes... 'ParkingEndDate' is 'currentTime'
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************************************
|
||||
@@ -1306,6 +1511,10 @@ void ATBDeviceControllerPlugin::onCashChangerState()
|
||||
"");
|
||||
changerStateRequestCounter = 0;
|
||||
lastChangerResult = 0;
|
||||
|
||||
// finalize vending:
|
||||
hw->vend_success();
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
@@ -1360,6 +1569,10 @@ void ATBDeviceControllerPlugin::onCashChangerState()
|
||||
errorDescription);
|
||||
changerStateRequestCounter = 0;
|
||||
lastChangerResult = 0;
|
||||
|
||||
// finalize vending:
|
||||
hw->vend_success();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1497,7 +1710,7 @@ int ATBDeviceControllerPlugin::init_sc_dbus()
|
||||
|
||||
void ATBDeviceControllerPlugin::onWokeUp(uchar source)
|
||||
{
|
||||
if (source == 0x01) {
|
||||
if (source == 0x01 || source == 0xFE) {
|
||||
// woke up from device controller
|
||||
this->diag->diagRequest();
|
||||
}
|
||||
|
@@ -50,6 +50,7 @@ public:
|
||||
void requestStartCashInput(const QString & amount);
|
||||
void requestStopCashInput();
|
||||
void cashCollect();
|
||||
void cashCollect(const QString & amount);
|
||||
void cashAbort();
|
||||
|
||||
// read coin/cash processing variants -----------------------------------------
|
||||
@@ -129,6 +130,9 @@ private:
|
||||
// counts failed hw->log_chkIfVaultRecordAvailable()
|
||||
int accountCheckCounter;
|
||||
|
||||
// counts faild hw->prn-getPrintResult()
|
||||
int printResultCheckCounter;
|
||||
|
||||
// dbus
|
||||
int init_sc_dbus();
|
||||
|
||||
@@ -141,6 +145,8 @@ private:
|
||||
void private_setupDynTemplateData_START_RECEIPT(struct T_dynDat *dynTicketData, Ticket *ticket);
|
||||
void private_setupDynTemplatData_STOP_RECEIPT(struct T_dynDat *dynTicketData, Ticket *ticket);
|
||||
void private_setupDynTemplatData_FOOD_STAMP(struct T_dynDat *dynTicketData, Ticket *ticket);
|
||||
void private_setupDynTemplatData_FINE_PAYMENT(struct T_dynDat *dynTicketData, Ticket *ticket);
|
||||
void private_setupDynTemplatData_FREE_TICKET(struct T_dynDat *dynTicketData, Ticket *ticket);
|
||||
// ---------------------------------------------------------------------------------------------
|
||||
|
||||
private slots:
|
||||
|
@@ -15,7 +15,7 @@ class ATBMachineEvent : public QEvent
|
||||
public:
|
||||
explicit ATBMachineEvent(const QString & id,
|
||||
const QString & deviceName, // PTU/PRINTER/DC/...
|
||||
EVENT_CLASS eventClass, // reason of event: Error/Warning/Alarm
|
||||
EVENT_CLASS eventClass, // reason of event: Error/Warning/Alarm
|
||||
const QString & name, // 'Event': "E001", "W003"
|
||||
const int state,
|
||||
const QString & parameter,
|
||||
|
@@ -5,6 +5,11 @@
|
||||
#include <QUuid>
|
||||
#include <QDebug>
|
||||
|
||||
#include <QProcess>
|
||||
|
||||
#include "support/JSON.h"
|
||||
|
||||
|
||||
DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *parent)
|
||||
: QObject(parent)
|
||||
, coinProcessorType(nsDeviceControllerInterface::COIN_PROCESSOR::ESCROW)
|
||||
@@ -13,10 +18,12 @@ DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *paren
|
||||
, isRequestRunning(false)
|
||||
, flagInterruptDiag(false)
|
||||
, lastState(DeviceController::State::INITIAL_STATE)
|
||||
, _isErrorState(false)
|
||||
, pData(pData)
|
||||
, E255counter(0)
|
||||
{
|
||||
diagRequestTimeoutTimer = new QTimer(this);
|
||||
diagRequestTimeoutTimer->setInterval(1000*20); // 20s
|
||||
diagRequestTimeoutTimer->setInterval(1000*45);
|
||||
diagRequestTimeoutTimer->setSingleShot(true);
|
||||
connect(diagRequestTimeoutTimer, &QTimer::timeout, this, &DeviceControllerDiag::onDiagRequestTimeoutTimerTimeout);
|
||||
}
|
||||
@@ -32,6 +39,17 @@ void DeviceControllerDiag::init(hwinf *hw, QObject* eventReceiver)
|
||||
}
|
||||
|
||||
|
||||
void DeviceControllerDiag::diagReInit()
|
||||
{
|
||||
this->machineEventSet.clear();
|
||||
this->_isErrorState = false;
|
||||
}
|
||||
|
||||
void DeviceControllerDiag::setTimeout(int timeout)
|
||||
{
|
||||
this->diagRequestTimeoutTimer->setInterval(1000 * timeout);
|
||||
}
|
||||
|
||||
void DeviceControllerDiag::diagRequest()
|
||||
{
|
||||
qCritical() << "DeviceControllerDiag::diagRequest()";
|
||||
@@ -63,6 +81,24 @@ void DeviceControllerDiag::onDiagRequestTimeoutTimerTimeout()
|
||||
this->flagInterruptDiag = true;
|
||||
}
|
||||
|
||||
|
||||
bool DeviceControllerDiag::isErrorState()
|
||||
{
|
||||
return this->_isErrorState;
|
||||
}
|
||||
|
||||
bool DeviceControllerDiag::isOperatingState()
|
||||
{
|
||||
return !this->_isErrorState;
|
||||
}
|
||||
|
||||
QSet<DeviceController::State> DeviceControllerDiag::getCurrentMachineState()
|
||||
{
|
||||
return this->machineEventSet;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DeviceControllerDiag::private_startDiag()
|
||||
{
|
||||
// check for DiagRequestTimeoutTimerTimeout:
|
||||
@@ -71,6 +107,20 @@ void DeviceControllerDiag::private_startDiag()
|
||||
this->private_sendDiagEvent(DeviceController::State::E255);
|
||||
this->isRequestRunning = false;
|
||||
this->flagInterruptDiag = false;
|
||||
if (this->E255counter > 5) {
|
||||
this->restartCArun();
|
||||
}
|
||||
else {
|
||||
this->E255counter++;
|
||||
|
||||
// try it again, until success:
|
||||
QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest);
|
||||
/**
|
||||
* But please note:
|
||||
* - diag does currently not stop suspend (start a background task)
|
||||
* - diag is called again in ModeOOO wokeup()
|
||||
*/
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -92,8 +142,8 @@ void DeviceControllerDiag::private_startDiag()
|
||||
void DeviceControllerDiag::sys_superviseSystem()
|
||||
{ // this function proofs if vending is possible depending of doors state
|
||||
|
||||
struct T_dynamicCondition dynMaCond;
|
||||
struct T_moduleCondition modCond;
|
||||
struct T_dynamicCondition dynMaCond = {};
|
||||
struct T_moduleCondition modCond = {};
|
||||
|
||||
|
||||
qCritical() << " sys_superviseSystem()";
|
||||
@@ -105,6 +155,8 @@ void DeviceControllerDiag::sys_superviseSystem()
|
||||
this->private_sendDiagEvent(DeviceController::State::E255);
|
||||
this->flagInterruptDiag = false;
|
||||
this->isRequestRunning = false;
|
||||
if (this->E255counter > 5) { this->restartCArun(); }
|
||||
else { this->E255counter++; }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -115,6 +167,8 @@ void DeviceControllerDiag::sys_superviseSystem()
|
||||
this->private_sendDiagEvent(DeviceController::State::E254);
|
||||
this->diagRequestTimeoutTimer->stop();
|
||||
this->isRequestRunning = false;
|
||||
if (this->E255counter > 5) { this->restartCArun(); }
|
||||
else { this->E255counter++; }
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -127,7 +181,7 @@ void DeviceControllerDiag::sys_superviseSystem()
|
||||
{
|
||||
// noch keine Testergebnisse
|
||||
if (dynMaCond.startupTestIsRunning) {
|
||||
// TODO?
|
||||
qCritical() << " startupTestIsRunning --> call again";
|
||||
}
|
||||
|
||||
|
||||
@@ -137,18 +191,6 @@ void DeviceControllerDiag::sys_superviseSystem()
|
||||
return;
|
||||
}
|
||||
|
||||
// all doors: 99: undefined 0:closed 1:open
|
||||
if (dynMaCond.lowerDoor || dynMaCond.upperDoor) {
|
||||
// Service or battery door is open, goto INTRUSION MODE
|
||||
qCritical() << "DeviceControllerDiag::sys_superviseSystem() Service or battery door is open, goto INTRUSION MODE";
|
||||
this->private_sendDiagEvent(DeviceController::State::E253);
|
||||
}
|
||||
if (dynMaCond.middleDoor) {
|
||||
// vault door is open, goto INTRUSION MODE
|
||||
qCritical() << "DeviceControllerDiag::sys_superviseSystem() vault door is open, goto INTRUSION MODE";
|
||||
this->private_sendDiagEvent(DeviceController::State::E252);
|
||||
}
|
||||
|
||||
qCritical() << " --> call sub_componentAssessment()";
|
||||
|
||||
sub_componentAssessment();
|
||||
@@ -160,13 +202,13 @@ void DeviceControllerDiag::sub_componentAssessment()
|
||||
{
|
||||
bool flag_sendOperate = true;
|
||||
|
||||
struct T_moduleCondition modCond;
|
||||
struct T_moduleCondition modCond = {};
|
||||
hw->sys_getDeviceConditions(&modCond);
|
||||
|
||||
struct T_dynamicCondition dynMaCond;
|
||||
struct T_dynamicCondition dynMaCond = {};
|
||||
hw->sys_getDynMachineConditions(&dynMaCond);
|
||||
|
||||
struct T_devices devPara;
|
||||
struct T_devices devPara = {};
|
||||
hw->sys_restoreDeviceParameter(&devPara);
|
||||
|
||||
// store some interesting results:
|
||||
@@ -182,6 +224,21 @@ void DeviceControllerDiag::sub_componentAssessment()
|
||||
this->private_sendDiagEvent(DeviceController::State::A000);
|
||||
}
|
||||
|
||||
// check for open doors
|
||||
// all doors: 99: undefined 0:closed 1:open
|
||||
if (dynMaCond.lowerDoor || dynMaCond.upperDoor) {
|
||||
// Service or battery door is open
|
||||
flag_sendOperate = false;
|
||||
qCritical() << "DeviceControllerDiag::sys_superviseSystem() Service or battery door is open, goto INTRUSION MODE";
|
||||
this->private_sendDiagEvent(DeviceController::State::E253);
|
||||
}
|
||||
if (dynMaCond.middleDoor) {
|
||||
// vault door is open
|
||||
flag_sendOperate = false;
|
||||
qCritical() << "DeviceControllerDiag::sys_superviseSystem() vault door is open, goto INTRUSION MODE";
|
||||
this->private_sendDiagEvent(DeviceController::State::E252);
|
||||
}
|
||||
|
||||
// check for invalid states:
|
||||
|
||||
if (modCond.rtc>=200) {
|
||||
@@ -225,7 +282,8 @@ void DeviceControllerDiag::sub_componentAssessment()
|
||||
}
|
||||
if (modCond.coinEscrow>=200) {
|
||||
flag_sendOperate = false;
|
||||
this->private_sendDiagEvent(DeviceController::State::E010);
|
||||
// coinEscrow>200 is considered a warning:
|
||||
this->private_sendDiagEvent(DeviceController::State::W010);
|
||||
}
|
||||
}
|
||||
// -----------------------------------------------------------------------------------------------
|
||||
@@ -247,7 +305,8 @@ void DeviceControllerDiag::sub_componentAssessment()
|
||||
{
|
||||
if (modCond.coinEscrow>=200) {
|
||||
flag_sendOperate = false;
|
||||
this->private_sendDiagEvent(DeviceController::State::E010);
|
||||
// coinEscrow>200 is considered a warning:
|
||||
this->private_sendDiagEvent(DeviceController::State::W010);
|
||||
}
|
||||
if (modCond.coinSafe==201) { // full
|
||||
flag_sendOperate = false;
|
||||
@@ -319,7 +378,7 @@ void DeviceControllerDiag::sub_componentAssessment()
|
||||
}
|
||||
if (modCond.temper>=200) {
|
||||
flag_sendOperate = false;
|
||||
this->private_sendDiagEvent(DeviceController::State::E004);
|
||||
this->private_sendDiagEvent(DeviceController::State::W004);
|
||||
}
|
||||
|
||||
// check for warnings
|
||||
@@ -393,58 +452,76 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
|
||||
case DeviceController::State::A000: // alarm / intrusion
|
||||
eventClass = EVENT_CLASS::ALARM;
|
||||
parameter = "alarm / intrusion";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E002: // real time clock error
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "real time clock error";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E003: // voltage error
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "voltage error";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E004: // temperature error
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "temperature error";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E007: // coin safe full
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "coin safe full";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E008: // bill acceptor full
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "bill acceptor full";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E009: // no cash box
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "no cash box";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E010: // coin escrow
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "coin escrow";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::W010: // coin escrow
|
||||
eventClass = EVENT_CLASS::WARNING;
|
||||
parameter = "coin escrow";
|
||||
break;
|
||||
case DeviceController::State::E011: // mem error int.ee.
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "mem error int.ee.";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E018: // no paper
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "no paper";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E020: // printer error
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "printer error";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E025: // coin blocker
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "coin blocker";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E026: // error coin validator
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "error coin validator";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
case DeviceController::State::E034: // mdb error
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "mdb error";
|
||||
this->_isErrorState = true;
|
||||
break;
|
||||
|
||||
case DeviceController::State::E071: // cash box change is ongoing
|
||||
@@ -473,13 +550,12 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
|
||||
parameter = "no valid data from DeviceController";
|
||||
break;
|
||||
case DeviceController::State::E255: // no valid data from DeviceController
|
||||
eventClass = EVENT_CLASS::STATE;
|
||||
parameter = "";
|
||||
qCritical() << " ... ignore " << QMetaEnum::fromType<DeviceController::State>().valueToKey(result);
|
||||
return;
|
||||
eventClass = EVENT_CLASS::ERROR;
|
||||
parameter = "no valid data from DeviceController";
|
||||
break;
|
||||
case DeviceController::State::O000: // everything is fine
|
||||
this->machineEventSet.clear();
|
||||
this->_isErrorState = false;
|
||||
eventClass = EVENT_CLASS::OPERATE;
|
||||
parameter = "";
|
||||
if (this->lastState == DeviceController::State::O000) {
|
||||
@@ -507,24 +583,46 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
|
||||
eventClass = EVENT_CLASS::WARNING;
|
||||
parameter = "temperatur warning";
|
||||
break;
|
||||
case DeviceController::State::W255: // restart carun
|
||||
eventClass = EVENT_CLASS::WARNING;
|
||||
parameter = "restart carun";
|
||||
break;
|
||||
}
|
||||
|
||||
this->lastState = result;
|
||||
|
||||
/**
|
||||
* Variant: send 'parameter' as JSON:
|
||||
*
|
||||
JSON::setPrettySerialize(false);
|
||||
JSON::JsonObject json = JSON::objectBuilder()
|
||||
->set("description", parameter)
|
||||
->create();
|
||||
QString parameterJsonString = JSON::serialize(json);
|
||||
*/
|
||||
|
||||
ATBMachineEvent *machineEvent = new ATBMachineEvent(
|
||||
eventId,
|
||||
"DC",
|
||||
eventClass,
|
||||
eventName,
|
||||
1,
|
||||
1, // eventState
|
||||
parameter,
|
||||
"" // second level info
|
||||
);
|
||||
|
||||
//emit diagResponse(machineEvent);
|
||||
|
||||
QCoreApplication::postEvent(eventReceiver, machineEvent);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* reset / restart / reinit deviceController
|
||||
*/
|
||||
void DeviceControllerDiag::restartCArun()
|
||||
{
|
||||
this->E255counter = 0;
|
||||
this->private_sendDiagEvent(DeviceController::State::W255);
|
||||
QProcess::startDetached("/bin/systemctl", {"restart", "carun"});
|
||||
}
|
||||
|
@@ -29,6 +29,7 @@ namespace DeviceController {
|
||||
E008,
|
||||
E009,
|
||||
E010,
|
||||
W010, // Coin Escrow
|
||||
E011,
|
||||
|
||||
E018,
|
||||
@@ -54,6 +55,8 @@ namespace DeviceController {
|
||||
W003,
|
||||
W004,
|
||||
|
||||
W255,
|
||||
|
||||
INITIAL_STATE
|
||||
};
|
||||
Q_ENUM_NS(State)
|
||||
@@ -72,9 +75,32 @@ public:
|
||||
nsDeviceControllerInterface::COIN_PROCESSOR coinProcessorType;
|
||||
nsDeviceControllerInterface::BILL_ACCEPTOR billAcceptor;
|
||||
|
||||
/**
|
||||
* return true, if machineEventSet contains an error
|
||||
*/
|
||||
bool isErrorState();
|
||||
bool isOperatingState();
|
||||
QSet<DeviceController::State> getCurrentMachineState();
|
||||
|
||||
void setTimeout(int timeout);
|
||||
|
||||
public slots:
|
||||
/**
|
||||
* start diag request
|
||||
*/
|
||||
void diagRequest();
|
||||
|
||||
/**
|
||||
* reset / re-init diag request.
|
||||
* Called e.g. when doors are closed.
|
||||
*/
|
||||
void diagReInit();
|
||||
|
||||
/**
|
||||
* reset / restart / reinit deviceController
|
||||
*/
|
||||
void restartCArun();
|
||||
|
||||
signals:
|
||||
void diagResponse(ATBMachineEvent* machineEvent);
|
||||
|
||||
@@ -95,9 +121,12 @@ private:
|
||||
|
||||
DeviceController::State lastState;
|
||||
QSet<DeviceController::State> machineEventSet;
|
||||
bool _isErrorState;
|
||||
|
||||
PersistentData* pData;
|
||||
|
||||
int E255counter;
|
||||
|
||||
private slots:
|
||||
void onDiagRequestTimeoutTimerTimeout();
|
||||
|
||||
@@ -106,7 +135,6 @@ private slots:
|
||||
|
||||
void sys_superviseSystem();
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // DEVICECONTROLLERDIAG_H
|
||||
|
@@ -60,9 +60,10 @@ public:
|
||||
virtual void requestStopCashInput() = 0;
|
||||
|
||||
/**
|
||||
* called e.g. on Button "NEXT" in pay-up (direct coin input)
|
||||
* called e.g. after printing
|
||||
*/
|
||||
virtual void cashCollect() = 0;
|
||||
virtual void cashCollect(const QString & amount) = 0;
|
||||
virtual void cashAbort() = 0;
|
||||
|
||||
// TASKS: Account -------------------------------------------------------------
|
||||
@@ -138,6 +139,14 @@ signals:
|
||||
const QString & errorCode,
|
||||
const QString & errorDescription);
|
||||
|
||||
/**
|
||||
* emitted if cashPayment has been finished, e.g. in result to task cashCollect():
|
||||
* if coins in changer must be given back to user.
|
||||
*/
|
||||
void cashPaymentChanging(nsDeviceControllerInterface::RESULT_STATE resultState,
|
||||
const QString & changeValue, // amount changed by changer/escrow
|
||||
const QString & errorCode,
|
||||
const QString & errorDescription);
|
||||
/**
|
||||
* emitted if cashPayment has been finished, e.g. in result to task cashCollect():
|
||||
* -> ticket should be printed sucessfully
|
||||
@@ -145,7 +154,7 @@ signals:
|
||||
* Provides data for logging, especially changed value
|
||||
*/
|
||||
void cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE resultState,
|
||||
const QString & newCashValue, // total inserted amount amount
|
||||
const QString & newCashValue, // total inserted amount
|
||||
const QString & coinValue, // inserted amount, paid with coins
|
||||
const QString & noteValue, // inserted amount, paid with notes
|
||||
const QString & changeValue, // amount changed by changer/escrow
|
||||
@@ -203,7 +212,7 @@ signals:
|
||||
|
||||
|
||||
Q_DECLARE_INTERFACE(DeviceControllerInterface,
|
||||
"eu.atb.ptu.plugin.DeviceControllerInterface/1.1.4")
|
||||
"eu.atb.ptu.plugin.DeviceControllerInterface/1.2.0")
|
||||
|
||||
|
||||
namespace nsDeviceControllerInterface {
|
||||
@@ -236,7 +245,9 @@ namespace nsDeviceControllerInterface {
|
||||
ERROR_RECEIPT,
|
||||
START_RECEIPT, // e.g. Szeged Start
|
||||
STOP_RECEIPT, // e.g. Szeged Stop
|
||||
FOOD_STAMP
|
||||
FINE_PAYMENT, // e.g. Klaipeda
|
||||
FOOD_STAMP,
|
||||
FREE_TICKET
|
||||
};
|
||||
|
||||
enum class COIN_PROCESSOR : quint8 {
|
||||
|
@@ -64,6 +64,12 @@ bool Ticket::initNew(TICKET_VARIANT ticketVariant, const QList<quint8> & templat
|
||||
case TICKET_VARIANT::STOP_RECEIPT:
|
||||
this->_templateList << 24 << 25 << 26;
|
||||
break;
|
||||
case TICKET_VARIANT::FINE_PAYMENT:
|
||||
this->_templateList << 24 << 25 << 26;
|
||||
break;
|
||||
case TICKET_VARIANT::FREE_TICKET:
|
||||
this->_templateList << 24 << 25 << 26;
|
||||
break;
|
||||
case TICKET_VARIANT::FOOD_STAMP:
|
||||
if (printingData.contains("dyn1_list")) {
|
||||
this->_hasTemplateDynData = true;
|
||||
@@ -160,9 +166,15 @@ QDebug operator<<(QDebug debug, TICKET_VARIANT ticketVariant)
|
||||
case TICKET_VARIANT::STOP_RECEIPT:
|
||||
debug << "TICKET_VARIANT::STOP_RECEIPT";
|
||||
break;
|
||||
case TICKET_VARIANT::FINE_PAYMENT:
|
||||
debug << "TICKET_VARIANT::FINE_PAYMENT";
|
||||
break;
|
||||
case TICKET_VARIANT::FOOD_STAMP:
|
||||
debug << "TICKET_VARIANT::FOOD_STAMP";
|
||||
break;
|
||||
case TICKET_VARIANT::FREE_TICKET:
|
||||
debug << "TICKET_VARIANT::FREE_TICKET";
|
||||
break;
|
||||
}
|
||||
|
||||
return debug;
|
||||
|
26
src/ATBAPP/support/TicketUtils.cpp
Normal file
26
src/ATBAPP/support/TicketUtils.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#include "TicketUtils.h"
|
||||
|
||||
#include <QLocale>
|
||||
#include <QDate>
|
||||
|
||||
TicketUtils::TicketUtils(QObject *parent) : QObject(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
QString TicketUtils::getLocaleDateString(const QLocale & qLocale, const QDate & qDate)
|
||||
{
|
||||
QString dateString;
|
||||
|
||||
if (qLocale.language() == QLocale::Lithuanian) {
|
||||
// QLocale::ShortFormat produces date string: "yyyy-mm-dd" ...
|
||||
// this is to long for the printer.
|
||||
dateString = qDate.toString("yy-MM-dd");
|
||||
}
|
||||
else {
|
||||
dateString = qLocale.toString(qDate, QLocale::ShortFormat);
|
||||
}
|
||||
|
||||
return dateString;
|
||||
}
|
34
src/ATBAPP/support/TicketUtils.h
Normal file
34
src/ATBAPP/support/TicketUtils.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef TICKETUTILS_H
|
||||
#define TICKETUTILS_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class TicketUtils : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TicketUtils(QObject *parent = nullptr);
|
||||
|
||||
/**
|
||||
* @brief getLocaleDateString
|
||||
* @param qLocale
|
||||
* @param qDate
|
||||
* @return a localized date string short format
|
||||
*
|
||||
* Note QLocale::ShortFormat does not result to the
|
||||
* string we need for ticket printing therefore this
|
||||
* helper method was created.
|
||||
*
|
||||
* e.g. using Lithuanian (lt_LT) we get a date in short format:
|
||||
* "2024-08-08" unfortunately this is to long, we need
|
||||
* the year with only two digits.
|
||||
* e.g. in German (de_DE) it is enought: "08.08.24"
|
||||
*
|
||||
*/
|
||||
static QString getLocaleDateString(const QLocale &qLocale, const QDate &qDate);
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
#endif // TICKETUTILS_H
|
Reference in New Issue
Block a user