Merge branch 'PrintProducts' into pu/integration
This commit is contained in:
		@@ -87,7 +87,8 @@ HEADERS += \
 | 
			
		||||
    src/ATBAPP/support/DBusControllerInterface.h \
 | 
			
		||||
    src/ATBAPP/support/JSON.h \
 | 
			
		||||
    src/ATBAPP/support/PTUSystem.h \
 | 
			
		||||
    src/ATBAPP/support/PersistentData.h
 | 
			
		||||
    src/ATBAPP/support/PersistentData.h \
 | 
			
		||||
    src/ATBAPP/support/Ticket.h
 | 
			
		||||
 | 
			
		||||
SOURCES += \
 | 
			
		||||
    src/ATBAPP/ATBHealthEvent.cpp \
 | 
			
		||||
@@ -99,7 +100,8 @@ SOURCES += \
 | 
			
		||||
    src/ATBAPP/support/DBusControllerInterface.cpp \
 | 
			
		||||
    src/ATBAPP/support/JSON.cpp \
 | 
			
		||||
    src/ATBAPP/support/PTUSystem.cpp \
 | 
			
		||||
    src/ATBAPP/support/PersistentData.cpp
 | 
			
		||||
    src/ATBAPP/support/PersistentData.cpp \
 | 
			
		||||
    src/ATBAPP/support/Ticket.cpp
 | 
			
		||||
 | 
			
		||||
DISTFILES += \
 | 
			
		||||
    generate-version.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -67,7 +67,11 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
 | 
			
		||||
    this->diag = new DeviceControllerDiag(this->persistentData, this);
 | 
			
		||||
    connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // currentSelectedTicketType - number of used "Kombiticket" (deprecated) use TICKET_VARIANT in future
 | 
			
		||||
    this->currentSelectedTicketType = 0;
 | 
			
		||||
    this->currentTicket = new Ticket(TICKET_VARIANT::PARKING_TICKET, this);
 | 
			
		||||
 | 
			
		||||
    this->currentCashState = CASH_STATE::CACHE_EMPTY;
 | 
			
		||||
 | 
			
		||||
    this->cashStartAmountInt = 0;
 | 
			
		||||
@@ -554,86 +558,40 @@ void ATBDeviceControllerPlugin::onNewVoltage(uint32_t voltage)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief ATBDeviceControllerPlugin::requestPrintTicket
 | 
			
		||||
 * @param ticketVariant
 | 
			
		||||
 * @param printingData
 | 
			
		||||
 *
 | 
			
		||||
 * Setup (initNew()) Ticket-Object
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface::TICKET_VARIANT ticketVariant, const QHash<QString, QVariant> & printingData)
 | 
			
		||||
{
 | 
			
		||||
    struct T_dynDat *dynTicketData = new T_dynDat;
 | 
			
		||||
    memset(dynTicketData, 0, sizeof(*dynTicketData));
 | 
			
		||||
    QList<quint8> templateList;
 | 
			
		||||
 | 
			
		||||
    QDateTime parkingEndDateTime = QDateTime::fromString(printingData["parkingEnd"].toString(),  Qt::ISODate);
 | 
			
		||||
    QDateTime currentDateTime    = QDateTime::fromString(printingData["currentDateTime"].toString(), Qt::ISODate);
 | 
			
		||||
    // TODO: read template list from .ini
 | 
			
		||||
 | 
			
		||||
    QString parkingEndDateString = this->printerLocale.toString(parkingEndDateTime.date(), QLocale::ShortFormat);
 | 
			
		||||
    QString currentDateString    = this->printerLocale.toString(currentDateTime.date(),    QLocale::ShortFormat);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // set dynamic printer data:
 | 
			
		||||
    QByteArray ba_licenseplate = codec->fromUnicode(printingData["licenseplate"].toString());
 | 
			
		||||
    memcpy((char*)dynTicketData->licensePlate, ba_licenseplate.data(), std::min(ba_licenseplate.size(),8));
 | 
			
		||||
 | 
			
		||||
    QByteArray ba_amount = codec->fromUnicode(printingData["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));
 | 
			
		||||
 | 
			
		||||
    // STAN for Szeged Start/Stop: must be 9 digits
 | 
			
		||||
    // --------------------------------------------------------------------------------------
 | 
			
		||||
    QString stan = codec->fromUnicode(printingData["STAN"].toString());
 | 
			
		||||
    qCritical() << "   requestPrintTicket() STAN = " << stan;
 | 
			
		||||
    QString stan1;
 | 
			
		||||
    QString stan2;
 | 
			
		||||
    if (stan.length() == 9) {
 | 
			
		||||
        stan1 = "     " + stan.mid(0,3);
 | 
			
		||||
        stan2 = stan.mid(3,3) + " " + stan.mid(6,3);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        qCritical() << "ASSERT: ATBDeviceControllerPlugin::requestPrintTicket() invalid STAN: " << stan;
 | 
			
		||||
        stan1 = "     000";
 | 
			
		||||
        stan2 = "000 000";
 | 
			
		||||
    }
 | 
			
		||||
    QByteArray ba_stan1 = codec->fromUnicode(stan1);
 | 
			
		||||
    QByteArray ba_stan2 = codec->fromUnicode(stan2);
 | 
			
		||||
    // --------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    this->templateList.clear();
 | 
			
		||||
 | 
			
		||||
    switch (ticketVariant) {
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::START_RECEIPT:
 | 
			
		||||
        qCritical() << "      -> TICKET_VARIANT::START_RECEIPT";
 | 
			
		||||
        memcpy((char*)dynTicketData->dynDat6, ba_stan1.data(), std::min(ba_stan1.size(),8));
 | 
			
		||||
        memcpy((char*)dynTicketData->dynDat7, ba_stan2.data(), std::min(ba_stan2.size(),8));
 | 
			
		||||
        this->templateList << 21 << 22 << 23;
 | 
			
		||||
        break;
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::STOP_RECEIPT:
 | 
			
		||||
        qCritical() << "      -> TICKET_VARIANT::STOP_RECEIPT";
 | 
			
		||||
        memcpy((char*)dynTicketData->dynDat6, ba_stan1.data(), std::min(ba_stan1.size(),8));
 | 
			
		||||
        memcpy((char*)dynTicketData->dynDat7, ba_stan2.data(), std::min(ba_stan2.size(),8));
 | 
			
		||||
        this->templateList << 24 << 25 << 26;
 | 
			
		||||
        break;
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::RECEIPT:
 | 
			
		||||
        break;
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::ERROR_RECEIPT:
 | 
			
		||||
        break;
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::PARKING_TICKET:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // DEBUG
 | 
			
		||||
    qCritical() << "------------------------------------------------------------------------";
 | 
			
		||||
    qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket()";
 | 
			
		||||
    for (int i =0; i < this->templateList.size(); ++i) {
 | 
			
		||||
        qCritical() << "     template: " << this->templateList.at(i);
 | 
			
		||||
    }
 | 
			
		||||
    qCritical() << "     TICKET_VARIANT: " << ticketVariant;
 | 
			
		||||
    qCritical() << "          dyn1_list: " << printingData["dyn1_list"].toStringList();
 | 
			
		||||
    qCritical() << "          dyn2_list: " << printingData["dyn2_list"].toStringList();
 | 
			
		||||
    qCritical() << "------------------------------------------------------------------------";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (!this->currentTicket->initNew(ticketVariant, templateList, printingData)) {
 | 
			
		||||
        this->errorCode = this->currentTicket->getErrorCode();
 | 
			
		||||
        this->errorDescription = this->currentTicket->getErrorCode();
 | 
			
		||||
 | 
			
		||||
        qCritical() << "ERROR: ticket->initNew: " << ticketVariant;
 | 
			
		||||
 | 
			
		||||
        this->onPrintFinishedERR();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    if (!this->hw->dc_isPortOpen()) {
 | 
			
		||||
        qCritical() << "    ... serial port is not open!";
 | 
			
		||||
@@ -642,26 +600,7 @@ void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface::
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    // TODO: wird hier nur 'licensePlate' gedruckt?
 | 
			
		||||
    if (!this->hw->prn_sendDynamicPrnValues(dynTicketData->licensePlate)) {
 | 
			
		||||
        this->errorCode = "hwapi::prn_sendDynamicPrnValues";
 | 
			
		||||
        this->errorDescription = "hwapi method 'hwapi::prn_sendDynamicPrnValues' result is false";
 | 
			
		||||
 | 
			
		||||
        qCritical() << "ERROR:";
 | 
			
		||||
        qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( "        << endl
 | 
			
		||||
                    << "     licenseplate = " << printingData["licenseplate"]   << endl
 | 
			
		||||
                    << "           amount = " << printingData["amount"]         << endl
 | 
			
		||||
                    << "       parkingEnd = " << printingData["parkingEnd"]     << endl
 | 
			
		||||
                    << "      currentTime = " << printingData["currentTime"]    << endl
 | 
			
		||||
                    << "      currentDate = " << printingData["currentDate"]    << endl
 | 
			
		||||
                    << "             stan = " << printingData["STAN"]           << endl;
 | 
			
		||||
 | 
			
		||||
        this->onPrintFinishedERR();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QTimer::singleShot(1000, this, SLOT(onPrinterDataPreparedForTemplates()));
 | 
			
		||||
 | 
			
		||||
    this->prepareDynTemplateData();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::requestPrintReceipt(const QHash<QString, QVariant> & printingData)
 | 
			
		||||
@@ -855,7 +794,7 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::onPrinterDataPreparedForTemplates()
 | 
			
		||||
{
 | 
			
		||||
    if (this->templateList.isEmpty()) return;
 | 
			
		||||
    if (this->currentTicket->templateList()->isEmpty()) return;
 | 
			
		||||
 | 
			
		||||
    this->onPrinterPrintNextTemplate();
 | 
			
		||||
}
 | 
			
		||||
@@ -900,30 +839,37 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingTicket()
 | 
			
		||||
void ATBDeviceControllerPlugin::onPrinterPrintNextTemplate()
 | 
			
		||||
{
 | 
			
		||||
    // template list must not be empty
 | 
			
		||||
    if (this->templateList.isEmpty()) {
 | 
			
		||||
    if (this->currentTicket->templateList()->isEmpty()) {
 | 
			
		||||
        this->onPrintFinishedERR();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qCritical() << "     ... print template " << this->templateList.first();
 | 
			
		||||
    qCritical() << "     ... print template " << this->currentTicket->templateList()->first();
 | 
			
		||||
 | 
			
		||||
    if (!this->hw->prn_printTemplate(this->templateList.first())) {
 | 
			
		||||
    if (!this->hw->prn_printTemplate(this->currentTicket->templateList()->first())) {
 | 
			
		||||
        this->errorCode = "hwapi::prn_printTemplate";
 | 
			
		||||
        this->errorDescription = QString("hwapi method 'hwapi::onPrinterPrintNextTemplate(%1)' result is false").arg(this->templateList.first());
 | 
			
		||||
        this->errorDescription = QString("hwapi method 'hwapi::onPrinterPrintNextTemplate(%1)' result is false").arg(this->currentTicket->templateList()->first());
 | 
			
		||||
        this->onPrintFinishedERR();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    this->templateList.removeFirst();
 | 
			
		||||
    this->currentTicket->templateList()->removeFirst();
 | 
			
		||||
    this->currentTicket->setCurrentTemplateProcessed();
 | 
			
		||||
 | 
			
		||||
    if (templateList.isEmpty()) {
 | 
			
		||||
    if (this->currentTicket->templateList()->isEmpty()) {
 | 
			
		||||
        // all templates are printed
 | 
			
		||||
        QTimer::singleShot(2000, this, SLOT(onPrinterWaitForPrintingTicket()));
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        // print next template
 | 
			
		||||
        QTimer::singleShot(2000, this, SLOT(onPrinterPrintNextTemplate()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        if (this->currentTicket->hasTemplateDynData()) {
 | 
			
		||||
            // set new dyn data:
 | 
			
		||||
            QTimer::singleShot(2000, this, SLOT(onPrinterPrepareDynTemplateData()));
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // print next template
 | 
			
		||||
            QTimer::singleShot(2000, this, SLOT(onPrinterPrintNextTemplate()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************
 | 
			
		||||
@@ -956,6 +902,141 @@ void ATBDeviceControllerPlugin::onPrintFinishedERR()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::onPrinterPrepareDynTemplateData()
 | 
			
		||||
{
 | 
			
		||||
    this->prepareDynTemplateData();
 | 
			
		||||
}
 | 
			
		||||
void ATBDeviceControllerPlugin::prepareDynTemplateData()
 | 
			
		||||
{
 | 
			
		||||
    struct T_dynDat *dynTicketData = new T_dynDat;
 | 
			
		||||
    memset(dynTicketData, 0, sizeof(*dynTicketData));
 | 
			
		||||
 | 
			
		||||
    // setup dynTicketData dependent on currentTicket
 | 
			
		||||
 | 
			
		||||
    // DEBUG:
 | 
			
		||||
    qCritical() << "---------------------------------------------------";
 | 
			
		||||
    qCritical() << "ATBDeviceControllerPlugin::prepareDynTemplateData():";
 | 
			
		||||
    qCritical() << "    -> currentProcessedTemplateNumber: " << this->currentTicket->getCurrentProcessedTemplateNumber();
 | 
			
		||||
    qCritical() << "    -> this->currentTicket->variant(): " << this->currentTicket->variant();
 | 
			
		||||
    qCritical() << "---------------------------------------------------";
 | 
			
		||||
 | 
			
		||||
    switch (this->currentTicket->variant()) {
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::START_RECEIPT:
 | 
			
		||||
        private_setupDynTemplateData_START_RECEIPT(dynTicketData, this->currentTicket);
 | 
			
		||||
        break;
 | 
			
		||||
    case nsDeviceControllerInterface::TICKET_VARIANT::STOP_RECEIPT:
 | 
			
		||||
        private_setupDynTemplatData_STOP_RECEIPT(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::FOOD_STAMP:
 | 
			
		||||
        private_setupDynTemplatData_FOOD_STAMP(dynTicketData, this->currentTicket);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // C-Programmierung: wird hier nur 'licensePlate' gedruckt?
 | 
			
		||||
    if (!this->hw->prn_sendDynamicPrnValues(dynTicketData->licensePlate)) {
 | 
			
		||||
        this->errorCode = "hwapi::prn_sendDynamicPrnValues";
 | 
			
		||||
        this->errorDescription = "hwapi method 'hwapi::prn_sendDynamicPrnValues' result is false";
 | 
			
		||||
 | 
			
		||||
        qCritical() << "ERROR: hw->prn_sendDynamicPrnValues";
 | 
			
		||||
 | 
			
		||||
        this->onPrintFinishedERR();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QTimer::singleShot(1000, this, SLOT(onPrinterDataPreparedForTemplates()));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::private_setupDynTemplateData_START_RECEIPT(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 = this->printerLocale.toString(parkingEndDateTime.date(), QLocale::ShortFormat);
 | 
			
		||||
    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_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));
 | 
			
		||||
    // STAN for Szeged Start/Stop: must be 9 digits
 | 
			
		||||
    // --------------------------------------------------------------------------------------
 | 
			
		||||
    QString stan = codec->fromUnicode(ticket->getPrintingData()["STAN"].toString());
 | 
			
		||||
    qCritical() << "   requestPrintTicket() STAN = " << stan;
 | 
			
		||||
    QString stan1;
 | 
			
		||||
    QString stan2;
 | 
			
		||||
    if (stan.length() == 9) {
 | 
			
		||||
        stan1 = "     " + stan.mid(0,3);
 | 
			
		||||
        stan2 = stan.mid(3,3) + " " + stan.mid(6,3);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        qCritical() << "ASSERT: ATBDeviceControllerPlugin::requestPrintTicket() invalid STAN: " << stan;
 | 
			
		||||
        stan1 = "     000";
 | 
			
		||||
        stan2 = "000 000";
 | 
			
		||||
    }
 | 
			
		||||
    QByteArray ba_stan1 = codec->fromUnicode(stan1);
 | 
			
		||||
    QByteArray ba_stan2 = codec->fromUnicode(stan2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // --------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    memcpy((char*)dynTicketData->dynDat6, ba_stan1.data(), std::min(ba_stan1.size(),8));
 | 
			
		||||
    memcpy((char*)dynTicketData->dynDat7, ba_stan2.data(), std::min(ba_stan2.size(),8));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::private_setupDynTemplatData_STOP_RECEIPT(struct T_dynDat *dynTicketData,  Ticket *ticket)
 | 
			
		||||
{
 | 
			
		||||
    // same as START_RECEIPT
 | 
			
		||||
    this->private_setupDynTemplateData_START_RECEIPT(dynTicketData, ticket);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ATBDeviceControllerPlugin::private_setupDynTemplatData_FOOD_STAMP(struct T_dynDat *dynTicketData, Ticket *ticket)
 | 
			
		||||
{
 | 
			
		||||
    quint8 currentProcessedTemplateNumber = ticket->getCurrentProcessedTemplateNumber();
 | 
			
		||||
 | 
			
		||||
    // TODO: check DynXList size / or ensure that DynXList has value
 | 
			
		||||
 | 
			
		||||
    // "Mitarbeiter-Nummer": dynPr1 -> licenceplate
 | 
			
		||||
    QString currentEMP_Nr = ticket->getDyn1List().at(currentProcessedTemplateNumber);
 | 
			
		||||
    QByteArray ba_licenseplate = codec->fromUnicode(currentEMP_Nr);
 | 
			
		||||
    memcpy((char*)dynTicketData->licensePlate, ba_licenseplate.data(), std::min(ba_licenseplate.size(),8));
 | 
			
		||||
 | 
			
		||||
    // "Lauf.Nr": dynPr2 -> vendingPrice
 | 
			
		||||
    QString currentStampNumber = ticket->getDyn2List().at(currentProcessedTemplateNumber);
 | 
			
		||||
    QByteArray ba_amount = codec->fromUnicode(currentStampNumber);
 | 
			
		||||
    memcpy((char*)dynTicketData->vendingPrice, ba_amount.data(), std::min(ba_amount.size(),8));
 | 
			
		||||
 | 
			
		||||
    // DEBUG
 | 
			
		||||
    qCritical() << "-------------------------------------------------------";
 | 
			
		||||
    qCritical() << "private_setupDynTemplatData_FOOD_STAMP()";
 | 
			
		||||
    qCritical() << "       currentProcessedTemplateNumber: " << currentProcessedTemplateNumber;
 | 
			
		||||
    qCritical() << "                        currentEMP_Nr: " << currentEMP_Nr;
 | 
			
		||||
    qCritical() << "                   currentStampNumber: " << currentStampNumber;
 | 
			
		||||
    qCritical() << "-------------------------------------------------------";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************
 | 
			
		||||
 * cash payment
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
#include "src/ATBAPP/DeviceControllerInterface.h"
 | 
			
		||||
#include "src/ATBAPP/ATBAPPplugin.h"
 | 
			
		||||
#include "src/ATBAPP/DeviceControllerDiag.h"
 | 
			
		||||
#include "src/ATBAPP/support/Ticket.h"
 | 
			
		||||
 | 
			
		||||
#include "version.h"
 | 
			
		||||
 | 
			
		||||
@@ -20,11 +21,11 @@
 | 
			
		||||
class DBusControllerInterface;
 | 
			
		||||
class QTextCodec;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
using namespace nsDeviceControllerInterface;
 | 
			
		||||
 | 
			
		||||
class QSettings;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ATBDeviceControllerPlugin :
 | 
			
		||||
        public DeviceControllerInterface
 | 
			
		||||
{
 | 
			
		||||
@@ -94,8 +95,6 @@ private:
 | 
			
		||||
   QString errorDescription;
 | 
			
		||||
   QString pluginInfo;
 | 
			
		||||
 | 
			
		||||
   QList<int> templateList;
 | 
			
		||||
 | 
			
		||||
   QString serialPortName;
 | 
			
		||||
 | 
			
		||||
   bool useDebug;
 | 
			
		||||
@@ -131,8 +130,17 @@ private:
 | 
			
		||||
   // dbus
 | 
			
		||||
   int init_sc_dbus();
 | 
			
		||||
 | 
			
		||||
   // printer privates ----------------------------------------------------------------------------
 | 
			
		||||
   Ticket * currentTicket;
 | 
			
		||||
   QLocale printerLocale;
 | 
			
		||||
 | 
			
		||||
   void prepareDynTemplateData();
 | 
			
		||||
 | 
			
		||||
   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);
 | 
			
		||||
   // ---------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
   // printer
 | 
			
		||||
 | 
			
		||||
@@ -142,6 +150,8 @@ private slots:
 | 
			
		||||
   void onPrinterWaitForPrintingTicket();
 | 
			
		||||
   void onPrinterWaitForPrintingReceipt();
 | 
			
		||||
 | 
			
		||||
   void onPrinterPrepareDynTemplateData();
 | 
			
		||||
 | 
			
		||||
   void onPrintFinishedOK();
 | 
			
		||||
   void onPrintFinishedERR();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -230,6 +230,9 @@ void DeviceControllerDiag::sub_componentAssessment()
 | 
			
		||||
    // -----------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
    switch (devPara.kindOfCoinChecker) {
 | 
			
		||||
        case 0:
 | 
			
		||||
            this->coinProcessorType = nsDeviceControllerInterface::COIN_PROCESSOR::NONE;
 | 
			
		||||
            break;
 | 
			
		||||
        case 1:
 | 
			
		||||
        case 2:
 | 
			
		||||
            this->coinProcessorType = nsDeviceControllerInterface::COIN_PROCESSOR::ESCROW;
 | 
			
		||||
 
 | 
			
		||||
@@ -196,7 +196,7 @@ signals:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Q_DECLARE_INTERFACE(DeviceControllerInterface,
 | 
			
		||||
                    "eu.atb.ptu.plugin.DeviceControllerInterface/1.1.2")
 | 
			
		||||
                    "eu.atb.ptu.plugin.DeviceControllerInterface/1.1.3")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
namespace nsDeviceControllerInterface {
 | 
			
		||||
@@ -229,11 +229,13 @@ namespace nsDeviceControllerInterface {
 | 
			
		||||
        ERROR_RECEIPT,
 | 
			
		||||
        START_RECEIPT,   // e.g. Szeged Start
 | 
			
		||||
        STOP_RECEIPT,    // e.g. Szeged Stop
 | 
			
		||||
        FOOD_STAMP
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum class COIN_PROCESSOR : quint8 {
 | 
			
		||||
        CHANGER,
 | 
			
		||||
        ESCROW
 | 
			
		||||
        ESCROW,
 | 
			
		||||
        NONE
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    enum class BILL_ACCEPTOR  : quint8 {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										166
									
								
								src/ATBAPP/support/Ticket.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								src/ATBAPP/support/Ticket.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,166 @@
 | 
			
		||||
#include "Ticket.h"
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
 | 
			
		||||
Ticket::Ticket(TICKET_VARIANT ticketVariant, QObject *parent )
 | 
			
		||||
    : QObject(parent)
 | 
			
		||||
    , ticketVariant(ticketVariant)
 | 
			
		||||
    , _hasTemplateDynData(false)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TICKET_VARIANT Ticket::variant()
 | 
			
		||||
{
 | 
			
		||||
    return this->ticketVariant;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QList<quint8> * Ticket::templateList()
 | 
			
		||||
{
 | 
			
		||||
    return &(this->_templateList);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Ticket::hasTemplateDynData()
 | 
			
		||||
{
 | 
			
		||||
    return this->_hasTemplateDynData;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
quint8 Ticket::getCurrentProcessedTemplateNumber()
 | 
			
		||||
{
 | 
			
		||||
    return this->currentProcessedTemplateNumber;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Ticket::setCurrentTemplateProcessed()
 | 
			
		||||
{
 | 
			
		||||
    this->currentProcessedTemplateNumber++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool Ticket::initNew(TICKET_VARIANT ticketVariant, const QList<quint8> & templateList, const QHash<QString, QVariant> & printingData)
 | 
			
		||||
{
 | 
			
		||||
    this->clear();
 | 
			
		||||
 | 
			
		||||
    this->ticketVariant = ticketVariant;
 | 
			
		||||
    this->printingData = printingData;
 | 
			
		||||
    this->_templateList = templateList;
 | 
			
		||||
    this->currentProcessedTemplateNumber = 0;
 | 
			
		||||
 | 
			
		||||
    // DEBUG
 | 
			
		||||
    qCritical() << "Ticket::initNew():";
 | 
			
		||||
    qCritical() << "      -> " << ticketVariant;
 | 
			
		||||
 | 
			
		||||
    int multiplicatorInt;
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
        break;
 | 
			
		||||
    case TICKET_VARIANT::STOP_RECEIPT:
 | 
			
		||||
        this->_templateList << 24 << 25 << 26;
 | 
			
		||||
        break;
 | 
			
		||||
    case TICKET_VARIANT::FOOD_STAMP:
 | 
			
		||||
         if (printingData.contains("dyn1_list")) {
 | 
			
		||||
            this->_hasTemplateDynData = true;
 | 
			
		||||
 | 
			
		||||
            this->dyn1List = printingData["dyn1_list"].toStringList();
 | 
			
		||||
            this->dyn2List = printingData["dyn2_list"].toStringList();
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         if (printingData.contains("multiplicator")) {
 | 
			
		||||
             multiplicatorInt = printingData["multiplicator"].toInt();
 | 
			
		||||
             for (int i = 1; i < multiplicatorInt; i++) {
 | 
			
		||||
                 this->_templateList << 1;
 | 
			
		||||
             }
 | 
			
		||||
             // last template:
 | 
			
		||||
             this->_templateList << 2;
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
         // DEBUG FOOD_STAMP:
 | 
			
		||||
         qCritical() << "     --> printingData[\"multiplicator\"]" << multiplicatorInt;
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // DEBUG
 | 
			
		||||
    QString templateListString;
 | 
			
		||||
    for (int i =0; i < this->_templateList.size(); ++i) {
 | 
			
		||||
        templateListString.append(QString(" %1").arg(this->_templateList.at(i)));
 | 
			
		||||
    }
 | 
			
		||||
    qCritical() << "     -> templates: " << templateListString;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Ticket::clear()
 | 
			
		||||
{
 | 
			
		||||
    this->ticketVariant = TICKET_VARIANT::PARKING_TICKET;
 | 
			
		||||
    this->printingData.clear();
 | 
			
		||||
    this->_templateList.clear();
 | 
			
		||||
    this->errorCode.clear();
 | 
			
		||||
    this->errorDescription.clear();
 | 
			
		||||
 | 
			
		||||
    this->_hasTemplateDynData = false;
 | 
			
		||||
    this->dyn1List.clear();
 | 
			
		||||
    this->dyn1List.clear();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QString Ticket::getErrorCode()         {  return this->errorCode;        }
 | 
			
		||||
QString Ticket::getErrorDescription()  {  return this->errorDescription; }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 */
 | 
			
		||||
QStringList Ticket::getDyn1List()
 | 
			
		||||
{
 | 
			
		||||
    return this->dyn1List;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QStringList Ticket::getDyn2List()
 | 
			
		||||
{
 | 
			
		||||
    return this->dyn2List;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************
 | 
			
		||||
 * operator
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
QDebug operator<<(QDebug debug, TICKET_VARIANT ticketVariant)
 | 
			
		||||
{
 | 
			
		||||
    switch (ticketVariant) {
 | 
			
		||||
        case TICKET_VARIANT::PARKING_TICKET:
 | 
			
		||||
            debug << "TICKET_VARIANT::PARKING_TICKET";
 | 
			
		||||
            break;
 | 
			
		||||
        case TICKET_VARIANT::RECEIPT:
 | 
			
		||||
            debug << "TICKET_VARIANT::RECEIPT";
 | 
			
		||||
            break;
 | 
			
		||||
        case TICKET_VARIANT::ERROR_RECEIPT:
 | 
			
		||||
            debug << "TICKET_VARIANT::ERROR_RECEIPT";
 | 
			
		||||
            break;
 | 
			
		||||
        case TICKET_VARIANT::START_RECEIPT:
 | 
			
		||||
            debug << "TICKET_VARIANT::START_RECEIPT";
 | 
			
		||||
            break;
 | 
			
		||||
        case TICKET_VARIANT::STOP_RECEIPT:
 | 
			
		||||
            debug << "TICKET_VARIANT::STOP_RECEIPT";
 | 
			
		||||
            break;
 | 
			
		||||
        case TICKET_VARIANT::FOOD_STAMP:
 | 
			
		||||
            debug << "TICKET_VARIANT::FOOD_STAMP";
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return debug;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								src/ATBAPP/support/Ticket.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/ATBAPP/support/Ticket.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
			
		||||
#ifndef TICKET_H
 | 
			
		||||
#define TICKET_H
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QHash>
 | 
			
		||||
 | 
			
		||||
#include "../DeviceControllerInterface.h"
 | 
			
		||||
 | 
			
		||||
using namespace nsDeviceControllerInterface;
 | 
			
		||||
 | 
			
		||||
QDebug operator<<(QDebug debug, TICKET_VARIANT ticketVariant);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Ticket : public QObject
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    Ticket(TICKET_VARIANT ticketVariant, QObject *parent = nullptr);
 | 
			
		||||
 | 
			
		||||
    bool initNew(TICKET_VARIANT ticketVariant, const QList<quint8> & templateList, const QHash<QString, QVariant> & printingData);
 | 
			
		||||
    void clear();
 | 
			
		||||
 | 
			
		||||
    TICKET_VARIANT variant();
 | 
			
		||||
 | 
			
		||||
    QList<quint8> * templateList();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @brief getPrintingData - generic getter for printingData
 | 
			
		||||
     * Used mainly for simple tickets (single tickets e.g. ParkingTicket)
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    QHash<QString, QVariant> & getPrintingData();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @brief hasTemplateDynData
 | 
			
		||||
     * @return true, if ticket has dynamic data for each template.
 | 
			
		||||
     *
 | 
			
		||||
     * This depends on TICKET_VARIANT and printingData
 | 
			
		||||
     */
 | 
			
		||||
    bool hasTemplateDynData();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @brief getDyn1List
 | 
			
		||||
     * contains dynamic template data
 | 
			
		||||
     * The size of the lists must be exactly the same as the number of templates.
 | 
			
		||||
     */
 | 
			
		||||
    QStringList getDyn1List();
 | 
			
		||||
    QStringList getDyn2List();
 | 
			
		||||
 | 
			
		||||
    quint8 getCurrentProcessedTemplateNumber();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Mark current template as processed
 | 
			
		||||
     */
 | 
			
		||||
    void setCurrentTemplateProcessed();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // error handling
 | 
			
		||||
    QString getErrorCode();
 | 
			
		||||
    QString getErrorDescription();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    TICKET_VARIANT ticketVariant;
 | 
			
		||||
 | 
			
		||||
    // printingData from application
 | 
			
		||||
    QHash<QString, QVariant> printingData;
 | 
			
		||||
 | 
			
		||||
    // templateList, from .ini or created by ticketVariant...
 | 
			
		||||
    QList<quint8> _templateList;
 | 
			
		||||
 | 
			
		||||
    bool _hasTemplateDynData;
 | 
			
		||||
 | 
			
		||||
    quint8 currentProcessedTemplateNumber;
 | 
			
		||||
 | 
			
		||||
    QStringList dyn1List;
 | 
			
		||||
    QStringList dyn2List;
 | 
			
		||||
 | 
			
		||||
    // error handling
 | 
			
		||||
    QString errorCode;
 | 
			
		||||
    QString errorDescription;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // TICKET_H
 | 
			
		||||
		Reference in New Issue
	
	Block a user