Compare commits

..

13 Commits
2.6.0 ... 2.7.0

Author SHA1 Message Date
70e6ec293d Merge branch 'improveDeviceControllerDiag' into pu/integration 2025-05-08 10:12:54 +02:00
3601f2d868 Merge branch 'improveTICKET_VARIANTS' into pu/integration 2025-05-08 10:12:46 +02:00
0876fa229e Diag: do not send reset errors/warnings ...
... this is a proposal for future.
2025-05-08 10:11:19 +02:00
1c13d92171 New proposal for DeviceControllerDiag:
Manage two sets of errors and compare to previous run.
2025-04-14 08:18:11 +02:00
10b0e494b2 requestPrintTicket: switch to legacy, if no template list is configured 2025-04-08 08:58:29 +02:00
24a1390a11 Interface: add TICKET_VARIANTS for FIXED_PRICE_TICKETS 2025-04-07 14:30:27 +02:00
c8508a0c62 Read config TICKET_TEMPLATES: read list- or string-value 2025-03-25 12:26:18 +01:00
fbfbe3d243 prepareDynTemplateData: setup for all TICKET_VARIANTs 2025-03-12 16:12:44 +01:00
cbc0dd0ad6 Ticket: Use printer templates from config 2025-03-12 15:56:51 +01:00
1abd6bfa90 default templateList is empty 2025-03-12 14:25:33 +01:00
a03dfe87a5 requestPrintTicket: improve debug output: print template list 2025-03-12 14:07:23 +01:00
03b192fb60 Read ticket templates from config:
- config group is [TICKET_TEMPLATES]
 - reads list of printer templates for each TICKET_VARIANT
2025-03-12 13:57:36 +01:00
e8b3bb1aa0 Interface: 1.2.1 (add additional TICKET_VARIANTs) 2025-03-12 13:55:14 +01:00
6 changed files with 287 additions and 61 deletions

View File

@@ -45,6 +45,7 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con
QString printerLocaleString = settings.value("ATBDeviceControllerPlugin/printerLocale", "de_DE").toString().toLatin1();
this->printerLocale = QLocale(printerLocaleString);
this->initTicketTemplateList(&settings);
this->init_sc_dbus();
@@ -140,6 +141,58 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con
}
void ATBDeviceControllerPlugin::initTicketTemplateList(const QSettings * settings)
{
QList<quint8> templateList;
QString templateListString;
QMetaEnum metaTicketVariants = QMetaEnum::fromType<nsDeviceControllerInterface::TICKET_VARIANT>();
for (int i = 0; i < metaTicketVariants.keyCount(); i++) {
const char* ticketVariant_char = metaTicketVariants.key(i);
quint8 intValue = metaTicketVariants.value(i);
// DEBUG
//qCritical() << " processing TICKET_VARIANT::" << ticketVariant_char;
QString configKey = QString("TICKET_TEMPLATES/") + ticketVariant_char;
QVariant raw_templateList = settings->value(configKey, "");
if (raw_templateList.type() == QVariant::StringList) {
templateListString = raw_templateList.toStringList().join(",");
} else {
templateListString = raw_templateList.toString();
}
// DEBUG
//qCritical() << " configKey: " << configKey;
//qCritical() << " templateListString: " << templateListString;
QStringList templateListStringList = templateListString.split(",", QString::SplitBehavior::SkipEmptyParts);
quint8 templateEntry;
bool ok;
for (const auto & ListEntry : templateListStringList) {
templateEntry = ListEntry.toInt(&ok);
if (ok) {
templateList.append(templateEntry);
}
}
// DEBUG
/*
QStringList elements;
for (const auto &item : templateList) {
elements << QString::number(item);
}
qCritical() << " template list: " << elements.join(',');
*/
this->ticketTemplateList.insert(static_cast<nsDeviceControllerInterface::TICKET_VARIANT>(intValue), templateList);
templateList.clear();
}
}
void ATBDeviceControllerPlugin::sendDeviceParameter(const QJsonObject &jsonObject)
{
@@ -678,17 +731,32 @@ void ATBDeviceControllerPlugin::onNewVoltage(uint32_t voltage)
*/
void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface::TICKET_VARIANT ticketVariant, const QHash<QString, QVariant> & printingData)
{
QList<quint8> templateList;
// TODO: read template list from .ini
QList<quint8> templateList = this->ticketTemplateList[ticketVariant];
if (templateList.isEmpty()) {
qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket()";
qCritical() << " TICKET_VARIANT: " << ticketVariant;
qCritical() << " -> templateList is empty!";
qCritical() << " -> switching to legacy interface";
this->requestPrintTicket(printingData);
return;
}
// DEBUG
qCritical() << "------------------------------------------------------------------------";
qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket()";
qCritical() << " TICKET_VARIANT: " << ticketVariant;
if (ticketVariant == nsDeviceControllerInterface::TICKET_VARIANT::FOOD_STAMP) {
qCritical() << " dyn1_list: " << printingData["dyn1_list"].toStringList();
qCritical() << " dyn2_list: " << printingData["dyn2_list"].toStringList();
}
QStringList listElements;
for (const auto &item : templateList) {
listElements << QString::number(item);
}
qCritical() << " template list: " << listElements.join(',');
qCritical() << "------------------------------------------------------------------------";
@@ -1110,10 +1178,13 @@ void ATBDeviceControllerPlugin::prepareDynTemplateData()
private_setupDynTemplatData_FINE_PAYMENT(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::RECEIPT:
private_setupDynTemplateData_DEFAULT(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::ERROR_RECEIPT:
private_setupDynTemplateData_DEFAULT(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::PARKING_TICKET:
private_setupDynTemplateData_DEFAULT(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FREE_TICKET:
private_setupDynTemplatData_FREE_TICKET(dynTicketData, this->currentTicket);
@@ -1121,6 +1192,9 @@ void ATBDeviceControllerPlugin::prepareDynTemplateData()
case nsDeviceControllerInterface::TICKET_VARIANT::FOOD_STAMP:
private_setupDynTemplatData_FOOD_STAMP(dynTicketData, this->currentTicket);
break;
default:
private_setupDynTemplateData_DEFAULT(dynTicketData, this->currentTicket);
break;
}
// C-Programmierung: wird hier nur 'licensePlate' gedruckt?
@@ -1276,6 +1350,41 @@ void ATBDeviceControllerPlugin::private_setupDynTemplatData_FREE_TICKET(struct T
// ! and yes... 'ParkingEndDate' is 'currentTime'
}
void ATBDeviceControllerPlugin::private_setupDynTemplateData_DEFAULT(struct T_dynDat *dynTicketData, Ticket *ticket)
{
QDateTime parkingEndDateTime = QDateTime::fromString(ticket->getPrintingData()["parkingEnd"].toString(), Qt::ISODate);
QDateTime currentDateTime = QDateTime::fromString(ticket->getPrintingData()["currentDateTime"].toString(), Qt::ISODate);
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());
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_parkingEndTime = codec->fromUnicode(parkingEndDateTime.toString("hh:mm"));
memcpy((char*)dynTicketData->parkingEnd, ba_parkingEndTime.data(), std::min(ba_parkingEndTime.size(),8));
QByteArray ba_parkingEndDate = codec->fromUnicode(parkingEndDateString);
memcpy((char*)dynTicketData->currentTime, ba_parkingEndDate.data(), std::min(ba_parkingEndDate.size(),8));
// ! and yes... 'ParkingEndDate' is 'currentTime'
QByteArray ba_currentDate = codec->fromUnicode(currentDateString);
memcpy((char*)dynTicketData->currentDate, ba_currentDate.data(), std::min(ba_currentDate.size(),8));
// Product-Text
QByteArray ba_productText = codec->fromUnicode(ticket->getPrintingData()["productText"].toString());
memcpy((char*)dynTicketData->dynDat5, ba_productText.data(), std::min(ba_productText.size(),8));
// Ticket-Number
QByteArray ba_ticketNumber = codec->fromUnicode(ticket->getPrintingData()["ticketNumber"].toString());
memcpy((char*)dynTicketData->dynDat7, ba_ticketNumber.data(), std::min(ba_ticketNumber.size(),8));
}
/************************************************************************************************
* cash payment

View File

@@ -140,8 +140,12 @@ private:
Ticket * currentTicket;
QLocale printerLocale;
QHash<TICKET_VARIANT, QList<quint8>> ticketTemplateList;
void initTicketTemplateList(const QSettings * settings);
void prepareDynTemplateData();
void private_setupDynTemplateData_DEFAULT(struct T_dynDat *dynTicketData, Ticket *ticket);
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);

View File

@@ -104,7 +104,7 @@ void DeviceControllerDiag::private_startDiag()
// check for DiagRequestTimeoutTimerTimeout:
if (this->flagInterruptDiag) {
qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!";
this->private_sendDiagEvent(DeviceController::State::E255);
this->private_setDiagEvent(DeviceController::State::E255);
this->isRequestRunning = false;
this->flagInterruptDiag = false;
if (this->E255counter > 5) {
@@ -153,7 +153,7 @@ void DeviceControllerDiag::sys_superviseSystem()
// check for DiagRequestTimeoutTimerTimeout:
if (this->flagInterruptDiag) {
qCritical() << "DeviceControllerDiag::sys_superviseSystem() interrupted!";
this->private_sendDiagEvent(DeviceController::State::E255);
this->private_setDiagEvent(DeviceController::State::E255);
this->flagInterruptDiag = false;
this->isRequestRunning = false;
if (this->E255counter > 5) { this->restartCArun(); }
@@ -166,7 +166,7 @@ void DeviceControllerDiag::sys_superviseSystem()
// es gibt keinerlei gültige Daten vom DC
qCritical() << "DeviceControllerDiag::sys_superviseSystem() no valid data!";
hw->dc_autoRequest(true);
this->private_sendDiagEvent(DeviceController::State::M0254);
this->private_setDiagEvent(DeviceController::State::M0254);
this->diagRequestTimeoutTimer->stop();
this->isRequestRunning = false;
if (this->E255counter > 5) { this->restartCArun(); }
@@ -223,7 +223,7 @@ void DeviceControllerDiag::sub_componentAssessment()
if (dynMaCond.onAlarm>0) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::A000);
this->private_setDiagEvent(DeviceController::State::A000);
}
// check for open doors
@@ -232,41 +232,41 @@ void DeviceControllerDiag::sub_componentAssessment()
// 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::M0253);
this->private_setDiagEvent(DeviceController::State::M0253);
}
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::M0252);
this->private_setDiagEvent(DeviceController::State::M0252);
}
// check for invalid states:
if (modCond.rtc>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E002);
this->private_setDiagEvent(DeviceController::State::E002);
}
if (modCond.printer==200 || modCond.printer==201) { // 200: not connected 201: printer-HW-error 202: no paper
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E020);
this->private_setDiagEvent(DeviceController::State::E020);
}
if (modCond.printer==202) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E018);
this->private_setDiagEvent(DeviceController::State::E018);
}
if (modCond.coinBlocker>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E025);
this->private_setDiagEvent(DeviceController::State::E025);
}
if (modCond.mdbBus>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E034);
this->private_setDiagEvent(DeviceController::State::E034);
}
if (modCond.intEe>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E011);
this->private_setDiagEvent(DeviceController::State::E011);
}
// 2023-07-26: workaround for 00281/Szeged --------------------------------------------------------------
@@ -276,16 +276,16 @@ void DeviceControllerDiag::sub_componentAssessment()
if (devPara.kindOfCoinChecker > 0) {
if (modCond.coinSafe==201) { // full
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E007);
this->private_setDiagEvent(DeviceController::State::E007);
}
if (modCond.coinSafe==200) { // 200: kasse fehlt 201: voll 100:fast voll 1:ok
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E009);
this->private_setDiagEvent(DeviceController::State::E009);
}
if (modCond.coinEscrow>=200) {
flag_sendOperate = false;
// coinEscrow>200 is considered a warning:
this->private_sendDiagEvent(DeviceController::State::W010);
this->private_setDiagEvent(DeviceController::State::W010);
}
}
// -----------------------------------------------------------------------------------------------
@@ -308,15 +308,15 @@ void DeviceControllerDiag::sub_componentAssessment()
if (modCond.coinEscrow>=200) {
flag_sendOperate = false;
// coinEscrow>200 is considered a warning:
this->private_sendDiagEvent(DeviceController::State::W010);
this->private_setDiagEvent(DeviceController::State::W010);
}
if (modCond.coinSafe==201) { // full
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E007);
this->private_setDiagEvent(DeviceController::State::E007);
}
if (modCond.coinSafe==200) { // 200: kasse fehlt 201: voll 100:fast voll 1:ok
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E009);
this->private_setDiagEvent(DeviceController::State::E009);
}
} else
if (devPara.kindOfCoinChecker==3)
@@ -324,15 +324,15 @@ void DeviceControllerDiag::sub_componentAssessment()
if (modCond.changer>=200) {
// Fehler Münzver.
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E026);
this->private_setDiagEvent(DeviceController::State::E026);
}
if (modCond.coinSafe==201) { // full
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E007);
this->private_setDiagEvent(DeviceController::State::E007);
}
if (modCond.coinSafe == 200) { // 200: kasse fehlt 201: voll 100:fast voll 1:ok
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E009);
this->private_setDiagEvent(DeviceController::State::E009);
}
}
@@ -361,61 +361,86 @@ void DeviceControllerDiag::sub_componentAssessment()
if (dynMaCond.modeAbrech>0) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E011);
this->private_setDiagEvent(DeviceController::State::E011);
}
if (dynMaCond.nowCardTest>0) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::M0072);
this->private_setDiagEvent(DeviceController::State::M0072);
}
if (dynMaCond.startupTestIsRunning>0) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::M0073);
this->private_setDiagEvent(DeviceController::State::M0073);
}
if (modCond.voltage>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E003);
this->private_setDiagEvent(DeviceController::State::E003);
}
if (modCond.temper>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::W004);
this->private_setDiagEvent(DeviceController::State::W004);
}
// check for warnings
if (modCond.printer>=100 && modCond.printer<200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::W001);
this->private_setDiagEvent(DeviceController::State::W001);
}
if (modCond.coinSafe>=100 && modCond.coinSafe<200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::W002);
this->private_setDiagEvent(DeviceController::State::W002);
}
if (modCond.voltage>=100 && modCond.voltage<200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::W003);
this->private_setDiagEvent(DeviceController::State::W003);
}
if (modCond.temper>=100 && modCond.temper<200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::W004);
this->private_setDiagEvent(DeviceController::State::W004);
}
if (flag_sendOperate) {
this->private_sendDiagEvent(DeviceController::State::O000);
this->private_setDiagEvent(DeviceController::State::O000);
}
// compare machineEventSets
// New events: present in current but not previous
QSet<DeviceController::State> newEvents = this->machineEventSet - this->previousMachineEventSet;
// Reset events: present in previous but not current
QSet<DeviceController::State> resetEvents = this->previousMachineEventSet - this->machineEventSet;
// Triggering Actions
// Iterate through the results
for (const DeviceController::State& event : newEvents) {
private_sendDiagEvent(event, DeviceController::Action::SET); // New event detected
}
// Proposal: send reset
/*
for (const DeviceController::State& event : resetEvents) {
private_sendDiagEvent(event, DeviceController::Action::RESET); // Event no longer present
}
*/
// finish diag
this->diagRequestTimeoutTimer->stop();
this->isRequestRunning = false;
this->flagInterruptDiag = false;
this->previousMachineEventSet = machineEventSet;
this->machineEventSet.clear();
}
/**
* @brief DeviceControllerDiag::private_sendDiagEvent
* @brief DeviceControllerDiag::private_setDiagEvent
* @param result - result value from 'sub_componentAssessment()',
* - 0x00 everything is fine
* - 0xFF on timer interrupt
@@ -423,25 +448,21 @@ void DeviceControllerDiag::sub_componentAssessment()
* - 0xFD Service or battery door is open
* - 0xFE vault door is open
*/
void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
void DeviceControllerDiag::private_setDiagEvent(DeviceController::State result)
{
qCritical() << "DeviceControllerDiag::private_sendDiagEvent() result: " << result;
qCritical() << "DeviceControllerDiag::private_setDiagEvent() result: " << result;
if (this->eventReceiver == nullptr) {
qCritical() << "DeviceControllerDiag: no eventReceiver";
return;
}
if (machineEventSet.contains(result)) {
// do not send already sent events
qCritical() << " ... is in machineEventList";
return;
}
else {
machineEventSet.insert(result);
}
machineEventSet.insert(result);
}
void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result, DeviceController::Action action)
{
QString eventId = QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8);
QString eventName = QMetaEnum::fromType<DeviceController::State>().valueToKey(result);;
@@ -608,7 +629,7 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
"DC",
eventClass,
eventName,
1, // eventState
action, // eventState
parameter,
"" // second level info
);
@@ -625,6 +646,6 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
void DeviceControllerDiag::restartCArun()
{
this->E255counter = 0;
this->private_sendDiagEvent(DeviceController::State::W255);
this->private_setDiagEvent(DeviceController::State::W255);
QProcess::startDetached("/bin/systemctl", {"restart", "carun"});
}

View File

@@ -61,6 +61,14 @@ namespace DeviceController {
INITIAL_STATE
};
Q_ENUM_NS(State)
enum Action {
SET = 1,
RESET = 0
};
Q_ENUM_NS(Action)
}
@@ -122,6 +130,7 @@ private:
DeviceController::State lastState;
QSet<DeviceController::State> machineEventSet;
QSet<DeviceController::State> previousMachineEventSet;
bool _isErrorState;
PersistentData* pData;
@@ -132,7 +141,8 @@ private slots:
void onDiagRequestTimeoutTimerTimeout();
void private_startDiag(); // diag entry method
void private_sendDiagEvent(DeviceController::State result);
void private_setDiagEvent(DeviceController::State result);
void private_sendDiagEvent(DeviceController::State result, DeviceController::Action action);
void sys_superviseSystem();

View File

@@ -6,6 +6,7 @@
#include <QSettings>
#include <QString>
#include <QJsonObject>
#include <QtCore/QHash>
#include "ATBAPPplugin.h"
@@ -212,10 +213,11 @@ signals:
Q_DECLARE_INTERFACE(DeviceControllerInterface,
"eu.atb.ptu.plugin.DeviceControllerInterface/1.2.0")
"eu.atb.ptu.plugin.DeviceControllerInterface/1.2.1")
namespace nsDeviceControllerInterface {
Q_NAMESPACE
enum class PLUGIN_STATE : quint8 {
NOT_INITIALIZED = 0,
@@ -240,15 +242,43 @@ namespace nsDeviceControllerInterface {
enum class TICKET_VARIANT : quint8 {
INVALID,
NO_TICKET,
PARKING_TICKET,
PARKING_TICKET_CAR,
PARKING_TICKET_VAN,
PARKING_TICKET_CAMPER,
DAY_TICKET,
DAY_TICKET_ADULT,
DAY_TICKET_TEEN,
DAY_TICKET_CHILD,
DAY_TICKET_CAR,
DAY_TICKET_VAN,
DAY_TICKET_CAMPER,
RECEIPT,
ERROR_RECEIPT,
START_RECEIPT, // e.g. Szeged Start
STOP_RECEIPT, // e.g. Szeged Stop
FINE_PAYMENT, // e.g. Klaipeda
FOOD_STAMP,
FIXED_PRICE_1,
FIXED_PRICE_2,
FIXED_PRICE_3,
FIXED_PRICE_4,
FIXED_PRICE_5,
FIXED_PRICE_6,
FIXED_PRICE_7,
FIXED_PRICE_8,
FIXED_PRICE_9,
FIXED_PRICE_10,
FREE_TICKET
};
Q_ENUM_NS(TICKET_VARIANT)
inline uint qHash(const nsDeviceControllerInterface::TICKET_VARIANT &key, uint seed = 0)
{
return ::qHash(static_cast<quint8>(key), seed);
}
enum class COIN_PROCESSOR : quint8 {
CHANGER,
@@ -270,4 +300,6 @@ namespace nsDeviceControllerInterface {
};
}
#endif // DEVICECONTROLLERINTERFACE_H

View File

@@ -50,25 +50,42 @@ bool Ticket::initNew(TICKET_VARIANT ticketVariant, const QList<quint8> & templat
qCritical() << " -> " << ticketVariant;
int multiplicatorInt = 1; // default
quint8 headerTemplate;
quint8 multiTemplate;
quint8 footerTemplate;
switch (this->ticketVariant) {
case TICKET_VARIANT::PARKING_TICKET:
break;
case TICKET_VARIANT::RECEIPT:
break;
case TICKET_VARIANT::ERROR_RECEIPT:
break;
case TICKET_VARIANT::START_RECEIPT:
this->_templateList << 21 << 22 << 23;
if (templateList.isEmpty()) {
this->_templateList << 21 << 22 << 23;
}
else {
this->_templateList = templateList;
}
break;
case TICKET_VARIANT::STOP_RECEIPT:
this->_templateList << 24 << 25 << 26;
if (templateList.isEmpty()) {
this->_templateList << 24 << 25 << 26;
}
else {
this->_templateList = templateList;
}
break;
case TICKET_VARIANT::FINE_PAYMENT:
this->_templateList << 24 << 25 << 26;
if (templateList.isEmpty()) {
this->_templateList << 24 << 25 << 26;
}
else {
this->_templateList = templateList;
}
break;
case TICKET_VARIANT::FREE_TICKET:
this->_templateList << 24 << 25 << 26;
if (templateList.isEmpty()) {
this->_templateList << 24 << 25 << 26;
}
else {
this->_templateList = templateList;
}
break;
case TICKET_VARIANT::FOOD_STAMP:
if (printingData.contains("dyn1_list")) {
@@ -78,19 +95,52 @@ bool Ticket::initNew(TICKET_VARIANT ticketVariant, const QList<quint8> & templat
this->dyn2List = printingData["dyn2_list"].toStringList();
}
if (templateList.isEmpty()) {
headerTemplate = 0;
multiTemplate = 1;
footerTemplate = 2;
}
else
if (templateList.size() == 2) {
headerTemplate = 0;
multiTemplate = templateList.at(0);
footerTemplate = templateList.at(1);
}
else
if (templateList.size() == 3) {
headerTemplate = templateList.at(0);
multiTemplate = templateList.at(1);
footerTemplate = templateList.at(2);
}
else {
headerTemplate = 0;
multiTemplate = 1;
footerTemplate = 2;
}
// header is optional:
if (headerTemplate != 0) {
this->_templateList << headerTemplate;
}
if (printingData.contains("multiplicator")) {
multiplicatorInt = printingData["multiplicator"].toInt();
for (int i = 1; i < multiplicatorInt; i++) {
this->_templateList << 1;
this->_templateList << multiTemplate;
}
// last template:
this->_templateList << 2;
this->_templateList << footerTemplate;
}
else {
this->_templateList = templateList;
}
// DEBUG FOOD_STAMP:
qCritical() << " --> printingData[\"multiplicator\"]" << multiplicatorInt;
break;
default:
this->_templateList = templateList;
}