Compare commits

..

3 Commits
2.7.0 ... 2.7.2

Author SHA1 Message Date
58c99753a9 PrintTicket: Support FIXED_PRICE Tickets 2025-05-16 08:48:58 +02:00
e703befb2f Merge branch 'improveTicketPrint' into pu/integration 2025-05-13 13:46:48 +02:00
83bcdcb47e Print: improve printing receipt:
- call prn_cut() 200ms after prn_switchPower(true)
 - make an "emergency cut" on error
 - improve log output on error
2025-05-13 13:44:12 +02:00
3 changed files with 149 additions and 4 deletions

View File

@@ -806,7 +806,7 @@ void ATBDeviceControllerPlugin::requestPrintReceipt(const QString & printingStri
this->printResultCheckCounter = 0;
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingReceipt()));
QTimer::singleShot(2000, this, SLOT(onPrinterWaitForPrintingReceipt()));
//QTimer::singleShot(2000, this, [this](){ hw->prn_cut(3); } );
}
@@ -827,7 +827,7 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingReceipt()
"",
"");
hw->prn_switchPower(true);
hw->prn_cut(3);
QTimer::singleShot(200, this, [this](){ hw->prn_cut(3); } );
break;
case 2: // printing finished, Error
qCritical() << "DC Error: wait for printing receipt";
@@ -837,15 +837,21 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingReceipt()
emit this->printReceiptFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND,
this->errorCode,
this->errorDescription);
hw->prn_switchPower(true);
QTimer::singleShot(200, this, [this](){ hw->prn_cut(3); } );
break;
default:
qCritical() << "DC Error: wait for printing receipt";
qCritical() << "DC Error: wait for printing receipt: printerResult = " << printerResult;
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
this->errorDescription = "Printer error(" + QString(printerResult) + ")";
emit this->printReceiptFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND,
this->errorCode,
this->errorDescription);
// do an emergency cut
hw->prn_switchPower(true);
QTimer::singleShot(200, this, [this](){ hw->prn_cut(3); } );
break;
}
@@ -1192,6 +1198,36 @@ void ATBDeviceControllerPlugin::prepareDynTemplateData()
case nsDeviceControllerInterface::TICKET_VARIANT::FOOD_STAMP:
private_setupDynTemplatData_FOOD_STAMP(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_1:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_2:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_3:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_4:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_5:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_6:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_7:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_8:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_9:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
case nsDeviceControllerInterface::TICKET_VARIANT::FIXED_PRICE_10:
private_setupDynTemplateData_FIXED_PRICE(dynTicketData, this->currentTicket);
break;
default:
private_setupDynTemplateData_DEFAULT(dynTicketData, this->currentTicket);
break;
@@ -1386,6 +1422,48 @@ void ATBDeviceControllerPlugin::private_setupDynTemplateData_DEFAULT(struct T_dy
memcpy((char*)dynTicketData->dynDat7, ba_ticketNumber.data(), std::min(ba_ticketNumber.size(),8));
}
void ATBDeviceControllerPlugin::private_setupDynTemplateData_FIXED_PRICE(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));
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));
// Ticket-Number
QByteArray ba_ticketNumber = codec->fromUnicode(ticket->getPrintingData()["ticketNumber"].toString());
memcpy((char*)dynTicketData->dynDat5, ba_ticketNumber.data(), std::min(ba_ticketNumber.size(),8));
// Product-Text 1
QByteArray ba_productText1 = codec->fromUnicode(ticket->getPrintingData()["productText"].toString()).left(8);
memcpy((char*)dynTicketData->dynDat6, ba_productText1.data(), std::min(ba_productText1.size(),8));
// Product-Text 2
QByteArray ba_productText2 = codec->fromUnicode(ticket->getPrintingData()["productText"].toString()).mid(8,8);
memcpy((char*)dynTicketData->dynDat7, ba_productText2.data(), std::min(ba_productText2.size(),8));
}
/************************************************************************************************
* cash payment
*/

View File

@@ -146,6 +146,7 @@ private:
void prepareDynTemplateData();
void private_setupDynTemplateData_DEFAULT(struct T_dynDat *dynTicketData, Ticket *ticket);
void private_setupDynTemplateData_FIXED_PRICE(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

@@ -204,6 +204,66 @@ QDebug operator<<(QDebug debug, TICKET_VARIANT ticketVariant)
case TICKET_VARIANT::PARKING_TICKET:
debug << "TICKET_VARIANT::PARKING_TICKET";
break;
case TICKET_VARIANT::PARKING_TICKET_CAR:
debug << "TICKET_VARIANT::PARKING_TICKET_CAR";
break;
case TICKET_VARIANT::PARKING_TICKET_CAMPER:
debug << "TICKET_VARIANT::PARKING_TICKET_CAMPER";
break;
case TICKET_VARIANT::PARKING_TICKET_VAN:
debug << "TICKET_VARIANT::PARKING_TICKET_VAN";
break;
case TICKET_VARIANT::DAY_TICKET:
debug << "TICKET_VARIANT::DAY_TICKET";
break;
case TICKET_VARIANT::DAY_TICKET_CHILD:
debug << "TICKET_VARIANT::DAY_TICKET_CHILD";
break;
case TICKET_VARIANT::DAY_TICKET_TEEN:
debug << "TICKET_VARIANT::DAY_TICKET_TEEN";
break;
case TICKET_VARIANT::DAY_TICKET_ADULT:
debug << "TICKET_VARIANT::DAY_TICKET_ADULT";
break;
case TICKET_VARIANT::DAY_TICKET_CAR:
debug << "TICKET_VARIANT::DAY_TICKET_CAR";
break;
case TICKET_VARIANT::DAY_TICKET_CAMPER:
debug << "TICKET_VARIANT::DAY_TICKET_CAMPER";
break;
case TICKET_VARIANT::DAY_TICKET_VAN:
debug << "TICKET_VARIANT::DAY_TICKET_VAN";
break;
case TICKET_VARIANT::FIXED_PRICE_1:
debug << "TICKET_VARIANT::FIXED_PRICE_1";
break;
case TICKET_VARIANT::FIXED_PRICE_2:
debug << "TICKET_VARIANT::FIXED_PRICE_2";
break;
case TICKET_VARIANT::FIXED_PRICE_3:
debug << "TICKET_VARIANT::FIXED_PRICE_3";
break;
case TICKET_VARIANT::FIXED_PRICE_4:
debug << "TICKET_VARIANT::FIXED_PRICE_4";
break;
case TICKET_VARIANT::FIXED_PRICE_5:
debug << "TICKET_VARIANT::FIXED_PRICE_5";
break;
case TICKET_VARIANT::FIXED_PRICE_6:
debug << "TICKET_VARIANT::FIXED_PRICE_6";
break;
case TICKET_VARIANT::FIXED_PRICE_7:
debug << "TICKET_VARIANT::FIXED_PRICE_7";
break;
case TICKET_VARIANT::FIXED_PRICE_8:
debug << "TICKET_VARIANT::FIXED_PRICE_8";
break;
case TICKET_VARIANT::FIXED_PRICE_9:
debug << "TICKET_VARIANT::FIXED_PRICE_9";
break;
case TICKET_VARIANT::FIXED_PRICE_10:
debug << "TICKET_VARIANT::FIXED_PRICE_10";
break;
case TICKET_VARIANT::RECEIPT:
debug << "TICKET_VARIANT::RECEIPT";
break;
@@ -225,6 +285,12 @@ QDebug operator<<(QDebug debug, TICKET_VARIANT ticketVariant)
case TICKET_VARIANT::FREE_TICKET:
debug << "TICKET_VARIANT::FREE_TICKET";
break;
case TICKET_VARIANT::NO_TICKET:
debug << "TICKET_VARIANT::NO_TICKET";
break;
case TICKET_VARIANT::INVALID:
debug << "TICKET_VARIANT::INVALID";
break;
}
return debug;