From f611e07dcf81286035021a32ac60d91ca826cfbb Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 4 May 2023 13:21:14 +0200 Subject: [PATCH] Implement printing ticket --- src/ATBAPP/ATBDeviceControllerPlugin.cpp | 80 ++++++++++++++++++------ src/ATBAPP/ATBDeviceControllerPlugin.h | 12 ++++ 2 files changed, 74 insertions(+), 18 deletions(-) diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.cpp b/src/ATBAPP/ATBDeviceControllerPlugin.cpp index 653f93c..0a9784d 100644 --- a/src/ATBAPP/ATBDeviceControllerPlugin.cpp +++ b/src/ATBAPP/ATBDeviceControllerPlugin.cpp @@ -2,6 +2,7 @@ #include "src/ATBAPP/ATBHealthEvent.h" #include +#include ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent) : QObject(parent), @@ -24,9 +25,19 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *healthEventReceive // read variables from setting QString serialPort = settings.value("DEVICE_CONTROLLER/serialPort", "ttymxc2").toString(); + QByteArray printerEncoding = settings.value("DEVICE_CONTROLLER/printerEnconding", "ISO 8859-2").toString().toLatin1(); + + + // open serial port hw->dc_openSerial(5, "115200", serialPort, 1); + + // text encoding for printer + this->codec = QTextCodec::codecForName(printerEncoding); + + + this->pluginState = PLUGIN_STATE::INITIALIZED; return pluginState; @@ -59,6 +70,7 @@ void ATBDeviceControllerPlugin::cashAbort() void ATBDeviceControllerPlugin::requestPrintTicket(const QHash & printingData) { struct T_dynDat *dynTicketData = new T_dynDat; + memset(dynTicketData, 0, sizeof(*dynTicketData)); qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( " << endl << " licenseplate = " << printingData["licenseplate"] << endl @@ -68,17 +80,24 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHashlicensePlate, printingData["licenseplate"].toByteArray().data(), 7); - strncpy((char*)dynTicketData->vendingPrice, printingData["amount"].toByteArray().data(), 7); - strncpy((char*)dynTicketData->parkingEnd, printingData["parkingEnd"].toByteArray().data(), 7); - strncpy((char*)dynTicketData->currentTime, printingData["currentTime"].toByteArray().data(), 7); - strncpy((char*)dynTicketData->currentDate, printingData["currentDate"].toByteArray().data(), 7); + // set dynamic printer data: + memcpy((char*)dynTicketData->licensePlate, codec->fromUnicode(printingData["licenseplate"].toString()).data(), 8); + memcpy((char*)dynTicketData->vendingPrice, codec->fromUnicode(printingData["amount"].toString()).data(), 8); + + QDateTime parkingEndQDateTime = QDateTime::fromString(printingData["parkingEnd"].toString(), Qt::ISODate); + QDateTime currentDateTime = QDateTime::fromString(printingData["currentTime"].toString(), Qt::ISODate); + + memcpy((char*)dynTicketData->parkingEnd, codec->fromUnicode(parkingEndQDateTime.toString("hh:mm")).data(), 8); + memcpy((char*)dynTicketData->currentTime, codec->fromUnicode(currentDateTime.toString("hh:mm")).data(), 8); + memcpy((char*)dynTicketData->currentDate, codec->fromUnicode(currentDateTime.toString("dd.MM.yy")).data(), 8); // DEBUG qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket()"; + if (!this->hw->dc_isPortOpen()) { qCritical() << " ... serial port is not open!"; - emit this->onPrintFinishedERR(); + this->onPrintFinishedERR(); + return; } @@ -96,29 +115,47 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHashonPrintFinishedERR(); + this->onPrintFinishedERR(); return; } QTimer::singleShot(1000, this, SLOT(onPrinterDataPrepared())); } + + void ATBDeviceControllerPlugin::onPrinterDataPrepared() { - for (int i = 1; i <= 3; ++i) { - - qCritical() << " ... print template " << i; - - if (!this->hw->prn_printTemplate(i)) { - this->errorCode = "hwapi::prn_printTemplate"; - this->errorDescription = QString("hwapi method 'hwapi::prn_printTemplate(%1)' result is false").arg(i); - emit this->onPrintFinishedERR(); - return; - } - } + this->currentTemplate = 1; + this->onPrinterPrintNextTemplate(); } +void ATBDeviceControllerPlugin::onPrinterPrintNextTemplate() +{ + qCritical() << " ... print template " << this->currentTemplate; + + if (!this->hw->prn_printTemplate(this->currentTemplate)) { + this->errorCode = "hwapi::prn_printTemplate"; + this->errorDescription = QString("hwapi method 'hwapi::onPrinterPrintNextTemplate(%1)' result is false").arg(this->currentTemplate); + this->onPrintFinishedERR(); + return; + } + + if (this->currentTemplate >= 3) { + // all templates are printed + this->currentTemplate = 0; + + // FAKE SIGNAL: + QTimer::singleShot(1000, this, SLOT(onPrintFinishedOK())); + } + else { + // print next template + this->currentTemplate++; + QTimer::singleShot(3000, this, SLOT(onPrinterPrintNextTemplate())); + } + +} /************************************************************************************************ @@ -127,12 +164,19 @@ void ATBDeviceControllerPlugin::onPrinterDataPrepared() */ void ATBDeviceControllerPlugin::onPrintFinishedOK() { + // DEBUG + qCritical() << "ATBDeviceControllerPlugin::onPrintFinishedOK()"; + emit this->printTicketFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS, "", ""); } void ATBDeviceControllerPlugin::onPrintFinishedERR() { + // DEBUG + qCritical() << "ATBDeviceControllerPlugin::onPrintFinishedERR()"; + + this->errorCode = "PRINTER"; // TODO: get more detailed error code from low level API this->errorDescription = "Printer error"; // TODO: get more detailed error description from low level API diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.h b/src/ATBAPP/ATBDeviceControllerPlugin.h index 4d55089..3dc6e18 100644 --- a/src/ATBAPP/ATBDeviceControllerPlugin.h +++ b/src/ATBAPP/ATBDeviceControllerPlugin.h @@ -17,6 +17,8 @@ #include +class QTextCodec; + using namespace nsDeviceControllerInterface; @@ -93,6 +95,9 @@ private: QString errorDescription; QString pluginInfo; + int currentTemplate; + + bool useDebug; PLUGIN_STATE pluginState; @@ -101,11 +106,18 @@ private: hwinf* hw; + QTextCodec *codec; private slots: + // printer + void onPrinterDataPrepared(); + void onPrinterPrintNextTemplate(); + void onPrintFinishedOK(); void onPrintFinishedERR(); + + // cash payment void onGotCoin(); };