diff --git a/DCPlugin.pro b/DCPlugin.pro index 4379416..412637f 100644 --- a/DCPlugin.pro +++ b/DCPlugin.pro @@ -77,6 +77,7 @@ HEADERS += \ src/ATBAPP/ATBMachineEvent.h \ src/ATBAPP/ATBDeviceControllerPlugin.h \ src/ATBAPP/Utils.h \ + src/ATBAPP/support/CashUtils.h \ src/ATBAPP/support/DBusControllerInterface.h \ src/ATBAPP/support/JSON.h \ src/ATBAPP/support/PTUSystem.h @@ -87,6 +88,7 @@ SOURCES += \ src/ATBAPP/ATBDeviceControllerPlugin.cpp \ src/ATBAPP/DeviceControllerDiag.cpp \ src/ATBAPP/Utils.cpp \ + src/ATBAPP/support/CashUtils.cpp \ src/ATBAPP/support/DBusControllerInterface.cpp \ src/ATBAPP/support/JSON.cpp \ src/ATBAPP/support/PTUSystem.cpp diff --git a/include/interfaces.h b/include/interfaces.h index 65a0f67..7234315 100755 --- a/include/interfaces.h +++ b/include/interfaces.h @@ -1834,6 +1834,9 @@ public: virtual uint8_t prn_getPrintResult() const { return 0; } + // return: 0: just printing, wait + // 1: OK - last print was succesful + // 2: error - not printed @@ -2273,7 +2276,32 @@ public: signals: + virtual void hwapi_templatePrintFinished_OK(void) const=0; + virtual void hwapi_templatePrintFinished_Err(void) const=0; + + virtual void hwapi_coinCollectionJustStarted(void) const=0; + virtual void hwapi_coinCollectionAborted(void) const=0; + + virtual void hwapi_gotNewCoin(void) const=0; + virtual void hwapi_payStopByMax(void) const=0; + virtual void hwapi_payStopByPushbutton(void) const=0; + + virtual void hwapi_payStopByEscrow(void) const=0; + virtual void hwapi_payStopByError(void) const=0; + virtual void hwapi_payStopByTimeout(void) const=0; + virtual void hwapi_payCancelled(void) const=0; + virtual void hwapi_coinProcessJustStopped(void) const=0; + + virtual void hwapi_doorServiceDoorOpened(void) const=0; + virtual void hwapi_doorVaultDoorOpened(void) const=0; + virtual void hwapi_doorCoinBoxRemoved(void) const=0; + virtual void hwapi_doorCoinBoxInserted(void) const=0; + virtual void hwapi_doorCBinAndAllDoorsClosed(void) const=0; + virtual void hwapi_doorAllDoorsClosed(void) const=0; + + // NOTE: declaring a "pure virtual" "signal" should be an error and thus not valid. + /* GH Version, bringt Fehler void hwapi_templatePrintFinished_OK() const; void hwapi_templatePrintFinished_Err() const; @@ -2296,6 +2324,7 @@ signals: void hwapi_doorCoinBoxInserted() const; void hwapi_doorCBinAndAllDoorsClosed() const; void hwapi_doorAllDoorsClosed() const; + */ }; diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.cpp b/src/ATBAPP/ATBDeviceControllerPlugin.cpp index c81d3a8..c2f90fb 100644 --- a/src/ATBAPP/ATBDeviceControllerPlugin.cpp +++ b/src/ATBAPP/ATBDeviceControllerPlugin.cpp @@ -5,6 +5,7 @@ #include "src/ATBAPP/support/JSON.h" #include "src/ATBAPP/support/DBusControllerInterface.h" #include "src/ATBAPP/support/PTUSystem.h" +#include "src/ATBAPP/support/CashUtils.h" #include #include @@ -66,6 +67,8 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent) this->currentSelectedTicketType = 0; this->currentCashState = CASH_STATE::CACHE_EMPTY; + + this->cashStartAmountInt = 0; } ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {} @@ -77,13 +80,17 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con // 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) { // open serial port hw->dc_openSerial(5, "115200", this->serialPortName, 1); - hw->dc_autoRequest(true); } + hw->dc_autoRequest(true); + hw->dc_setNewCustomerNumber(PTUSystem::readCustomerNumber()); hw->dc_setNewMachineNumber(PTUSystem::readMachineNumber()); hw->dc_setNewZone(PTUSystem::readZoneNumber()); @@ -170,20 +177,20 @@ void ATBDeviceControllerPlugin::reset() 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->dc_autoRequest(true); hw->mdb_switchWake(0); // wakeup MDB components } void ATBDeviceControllerPlugin::onChangedProgramModeToIDLE() { - //hw->dc_autoRequest(false); // <-- TODO: ??? - + hw->dc_autoRequest(true); this->diag->diagRequest(); hw->mdb_switchWake(1); @@ -200,11 +207,11 @@ void ATBDeviceControllerPlugin::requestStartCashInput(const QString & amount) { qCritical() << "Start Cash vending with amount = " << amount; - uint32_t amountInt = static_cast(amount.toUInt()); + this->cashStartAmountInt = static_cast(amount.toUInt()); - if (amountInt == 0) amountInt = UINT_MAX; + if (this->cashStartAmountInt == 0) this->cashStartAmountInt = UINT_MAX; - hw->cash_startPayment(amountInt); + hw->cash_startPayment(this->cashStartAmountInt); } void ATBDeviceControllerPlugin::requestStopCashInput() @@ -218,7 +225,33 @@ void ATBDeviceControllerPlugin::requestStopCashInput() void ATBDeviceControllerPlugin::cashCollect() { hw->vend_success(); - this->currentCashState = CASH_STATE::CACHE_EMPTY; + + // inserted amount + uint32_t amountInt = this->hw->getInsertedAmount(); + QString amountString = QString::number(amountInt); + + // 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); + + + if (this->coinProcessor() == nsDeviceControllerInterface::COIN_PROCESSOR::CHANGER) { + QTimer::singleShot(1000, this, &ATBDeviceControllerPlugin::onCashChangerState); + } + else { + emit this->cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS, + amountString, + amountCoinsString, // coins + amountNotesString, // notes + 0, // proposed change + "", + ""); + this->currentCashState = CASH_STATE::CACHE_EMPTY; + } } void ATBDeviceControllerPlugin::cashAbort() @@ -406,9 +439,6 @@ void ATBDeviceControllerPlugin::onServiceDoorOpened() void ATBDeviceControllerPlugin::onVaultDoorOpened() { - // TODO: - // - show special screen / message on screen - // - create an HealthEvent (-> ISMAS-Event) qCritical() << "ATBDeviceControllerPlugin::onVaultDoorOpened()"; // ... to detect alarm etc. @@ -419,7 +449,13 @@ void ATBDeviceControllerPlugin::onVaultDoorOpened() // BackgroundTask("ACCOUNT") is finished, if account message is sent to ISMAS! this->dbus->startBackgroundTask("DOOR_OPEN"); - // do not: emit this->requestModeSERVICE(); + emit this->requestModeACCOUNT(); + + // send service message, delayed: + QTimer::singleShot(1000, this, [this](){ + emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::VAULT_DOOR_OPENED, "Please remove coinbox"); + hw->prn_cut(3); + } ); } void ATBDeviceControllerPlugin::onCoinBoxRemoved() @@ -429,12 +465,17 @@ void ATBDeviceControllerPlugin::onCoinBoxRemoved() // BackgroundTask("ACCOUNT") is finished, if account message is sent to ISMAS! this->dbus->startBackgroundTask("ACCOUNT"); + emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::COIN_BOX_REMOVED, "Please insert coinbox"); + QTimer::singleShot(4000, this, SLOT(private_startAccount())); } void ATBDeviceControllerPlugin::onCoinBoxInserted() { qCritical() << "ATBDeviceControllerPlugin::onCoinBoxInserted()"; + + emit this->showServiceText(nsDeviceControllerInterface::SERVICE_TEXT::COIN_BOX_INSERTED, "Please close vault door"); + // emit this->showServiceText(0x1234); } /** @@ -506,6 +547,10 @@ void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface:: 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); + + // 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)); @@ -517,11 +562,11 @@ void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface:: 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(parkingEndDateTime.toString("yy.MM.dd")); + 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(currentDateTime.toString("yy.MM.dd")); + 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 @@ -573,11 +618,13 @@ void ATBDeviceControllerPlugin::requestPrintTicket(nsDeviceControllerInterface:: } + /* if (!this->hw->dc_isPortOpen()) { qCritical() << " ... serial port is not open!"; this->onPrintFinishedERR(); return; } + */ // TODO: wird hier nur 'licensePlate' gedruckt? if (!this->hw->prn_sendDynamicPrnValues(dynTicketData->licensePlate)) { @@ -673,6 +720,9 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHashprinterLocale.toString(parkingEndDateTime.date(), QLocale::ShortFormat); + QString currentDateString = this->printerLocale.toString(currentDateTime.date(), QLocale::ShortFormat); + /* ----------------------------------------------------------------------------------------- * note: the following highly depends on printer template files! * ----------------------------------------------------------------------------------------- @@ -690,11 +740,11 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHashfromUnicode(parkingEndDateTime.toString("hh:mm")); memcpy((char*)dynTicketData->parkingEnd, ba_parkingEndTime.data(), std::min(ba_parkingEndTime.size(),8)); - QByteArray ba_parkingEndDate = codec->fromUnicode(parkingEndDateTime.toString("yy.MM.dd")); + 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(currentDateTime.toString("yy.MM.dd")); + QByteArray ba_currentDate = codec->fromUnicode(currentDateString); memcpy((char*)dynTicketData->currentDate, ba_currentDate.data(), std::min(ba_currentDate.size(),8)); @@ -711,12 +761,13 @@ void ATBDeviceControllerPlugin::requestPrintTicket(const QHashhw->dc_isPortOpen()) { qCritical() << " ... serial port is not open!"; this->onPrintFinishedERR(); return; } - + */ // TODO: wird hier nur 'licensePlate' gedruckt? if (!this->hw->prn_sendDynamicPrnValues(dynTicketData->licensePlate)) { @@ -929,6 +980,9 @@ void ATBDeviceControllerPlugin::onCashPayStopByEscrow() emit this->cashInputFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND, amountString, "", + "", + "", + "", ""); } @@ -944,6 +998,9 @@ void ATBDeviceControllerPlugin::onCashPayStopByError() emit this->cashInputFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND, amountString, "", + "", + "", + "", ""); } @@ -959,6 +1016,9 @@ void ATBDeviceControllerPlugin::onCashPayStopByTimeout() emit this->cashInputFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND, amountString, "", + "", + "", + "", ""); } @@ -967,19 +1027,192 @@ void ATBDeviceControllerPlugin::onCashPayStopedSuccess() // DEBUG qCritical() << "ATBDeviceControllerPlugin::onCashPayStopedSuccess()"; + // inserted amount uint32_t amountInt = this->hw->getInsertedAmount(); - QString amountString = QString::number(amountInt); - qCritical() << " insertedAmount (int) = " << amountInt; - qCritical() << " insertedAmount = " << amountString; + // 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); + + // amount due to change + uint32_t amountDueToChangeInt; + if (amountInt > this->cashStartAmountInt) { + amountDueToChangeInt = amountInt - this->cashStartAmountInt; + } + else { + amountDueToChangeInt = 0; + } + QString amountDueToChangeString = QString::number(amountDueToChangeInt); + + + // DEBUG + qCritical() << "---------------------------------------------------------"; + qCritical() << "ATBDeviceControllerPlugin::onCashPayStopedSuccess()"; + qCritical() << ""; + qCritical() << " amountInt: " << amountInt; + qCritical() << " amountString: " << amountString; + qCritical() << ""; + qCritical() << " amountNotesInt: " << amountNotesInt; + qCritical() << " amountNotesString: " << amountNotesString; + qCritical() << ""; + qCritical() << " amountCoinsInt: " << amountCoinsInt; + qCritical() << " amountCoinsString: " << amountCoinsString; + qCritical() << ""; + qCritical() << " this->cashStartAmountInt: " << this->cashStartAmountInt; + qCritical() << " amountDueToChangeInt: " << amountDueToChangeInt; + qCritical() << " amountDueToChangeString: " << amountDueToChangeString; + qCritical() << "---------------------------------------------------------"; + emit this->cashInputFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS, amountString, + amountCoinsString, // coins + amountNotesString, // notes + amountDueToChangeString, // proposed change "", ""); } +void ATBDeviceControllerPlugin::onCashChangerState() +{ + uint32_t amountThatCouldNotBeChangedInt; + + static int changerStateRequestCounter = 0; + static uint8_t lastChangerResult = 0; + + + // inserted amount + uint32_t amountInt = this->hw->getInsertedAmount(); + QString amountString = QString::number(amountInt); + + // 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); + + // amount due to change + uint32_t amountCoinsChangedInt; + if (amountInt > this->cashStartAmountInt) { + amountCoinsChangedInt = amountInt - this->cashStartAmountInt; + } + else { + amountCoinsChangedInt = 0; + } + QString amountCoinsChangedString = QString::number(amountCoinsChangedInt); + + + // get changer state ------------------------------------------------ + // Note: 'returnedAmount'-parameter is missleading here! + // 'returnedAmount' is the amount which could not be changed! + + lastChangerResult = hw->changer_getChangeResult(&amountThatCouldNotBeChangedInt); + + // DEBUG + qCritical() << "---------------------------------------------------------"; + qCritical() << "ATBDeviceControllerPlugin::onCashChangerState()"; + qCritical() << " changerStateRequestCounter: " << changerStateRequestCounter; + qCritical() << " lastChangerResult: " << lastChangerResult; + qCritical() << " amountThatCouldNotBeChangedInt: " << amountThatCouldNotBeChangedInt; + qCritical() << ""; + qCritical() << " amountInt: " << amountInt; + qCritical() << " amountString: " << amountString; + qCritical() << ""; + qCritical() << " amountCoinsInt: " << amountCoinsInt; + qCritical() << " amountCoinsString: " << amountCoinsString; + qCritical() << ""; + qCritical() << " amountNotesInt: " << amountNotesInt; + qCritical() << " amountNotesString: " << amountNotesString; + qCritical() << ""; + qCritical() << " this->cashStartAmountInt: " << this->cashStartAmountInt; + qCritical() << " amountCoinsChangedInt: " << amountCoinsChangedInt; + qCritical() << " amountCoinsChangedString: " << amountCoinsChangedString; + qCritical() << "---------------------------------------------------------"; + + if (lastChangerResult == 1) { // change is returned + + + QString amountCoinsChangedString = QString::number(amountCoinsChangedInt); + + emit this->cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE::SUCCESS, + amountString, + amountCoinsString, // coins + amountNotesString, // notes + amountCoinsChangedString, // change + "", + ""); + changerStateRequestCounter = 0; + lastChangerResult = 0; + return; + } + else + if (lastChangerResult == 0) { // not yet started + qCritical() << "ATBDeviceControllerPlugin::onCashChangerState(): ERROR: change not yet started: amount due to return: " << amountCoinsChangedString; + } + else + if (lastChangerResult == 2) { // only partial return + qCritical() << "ATBDeviceControllerPlugin::onCashChangerState(): ERROR: only partial return: amount due to return: " << amountCoinsChangedString; + } + else + if (lastChangerResult == 3) { // no return possible + qCritical() << "ATBDeviceControllerPlugin::onCashChangerState(): ERROR: no return possible: amount due to return: " << amountCoinsChangedString; + } + else { + qCritical() << "ATBDeviceControllerPlugin::onCashChangerState(): ERROR: invalid changerState (" << lastChangerResult << ")"; + } + + + // handle timeout ------------------------------------------------ + if (changerStateRequestCounter > 15) { + QString errorCode; + QString errorDescription; + switch (lastChangerResult) { + case 0: // not yet started + errorCode = "DC::CHANGER::START"; + errorDescription = "Changer does not start"; + break; + case 1: // amount returned + // This error should not occur! + errorCode = "DC::CHANGER::INVALID"; + errorDescription = "Changer returned amount"; + break; + case 2: // only partial return + errorCode = "DC::CHANGER::CHANGE"; + errorDescription = "Changer does only partial return"; + break; + case 3: // no return possible + errorCode = "DC::CHANGER::CHANGE_NOT_POSSIBLE"; + errorDescription = "Changing not possible"; + break; + default: + + break; + } + emit this->cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND, + amountString, + amountCoinsString, + amountNotesString, + 0, + errorCode, + errorDescription); + changerStateRequestCounter = 0; + lastChangerResult = 0; + return; + } + + // restart changer check: + changerStateRequestCounter++; + QTimer::singleShot(1000, this, &ATBDeviceControllerPlugin::onCashChangerState); +} + + /** diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.h b/src/ATBAPP/ATBDeviceControllerPlugin.h index b07e209..e3f39f6 100644 --- a/src/ATBAPP/ATBDeviceControllerPlugin.h +++ b/src/ATBAPP/ATBDeviceControllerPlugin.h @@ -2,6 +2,7 @@ #define ATBDEVICECONTROLLERPLUGIN_H #include +#include #include "src/ATBAPP/DeviceControllerInterface.h" #include "src/ATBAPP/ATBAPPplugin.h" @@ -111,6 +112,8 @@ private: DeviceControllerDiag* diag; + uint32_t cashStartAmountInt; + QTextCodec *codec; @@ -126,6 +129,8 @@ private: // dbus int init_sc_dbus(); + QLocale printerLocale; + private slots: // printer @@ -146,6 +151,7 @@ private slots: void onCashPayStopByEscrow(); void onCashPayStopByError(); void onCashPayStopByTimeout(); + void onCashChangerState(); // doors and hardware contacts void onServiceDoorOpened(); diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index e74775d..3d801db 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -57,6 +57,8 @@ void DeviceControllerDiag::private_startDiag() if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!"; this->private_sendDiagEvent(DeviceController::State::E255); + this->isRequestRunning = false; + this->flagInterruptDiag = false; return; } @@ -89,6 +91,8 @@ void DeviceControllerDiag::sys_superviseSystem() if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::sys_superviseSystem() interrupted!"; this->private_sendDiagEvent(DeviceController::State::E255); + this->flagInterruptDiag = false; + this->isRequestRunning = false; return; } @@ -97,6 +101,8 @@ void DeviceControllerDiag::sys_superviseSystem() // es gibt keinerlei gültige Daten vom DC qCritical() << "DeviceControllerDiag::sys_superviseSystem() no valid data!"; this->private_sendDiagEvent(DeviceController::State::E254); + this->diagRequestTimeoutTimer->stop(); + this->isRequestRunning = false; return; } diff --git a/src/ATBAPP/DeviceControllerInterface.h b/src/ATBAPP/DeviceControllerInterface.h index 61e1318..4026051 100644 --- a/src/ATBAPP/DeviceControllerInterface.h +++ b/src/ATBAPP/DeviceControllerInterface.h @@ -15,6 +15,9 @@ namespace nsDeviceControllerInterface { enum class TICKET_VARIANT : quint8; enum class COIN_PROCESSOR : quint8; enum class BILL_ACCEPTOR : quint8; + + + enum class SERVICE_TEXT : quint16; } @@ -119,16 +122,38 @@ signals: */ void cashInputFinished(nsDeviceControllerInterface::RESULT_STATE resultState, const QString & newCashValue, - /* additional variables? */ + const QString & coinValue, + const QString & noteValue, + const QString & changeValue, const QString & errorCode, const QString & errorDescription); + /** + * emitted if cashPayment has been finished, e.g. in result to task cashCollect(): + * -> ticket should be printed sucessfully + * -> coins in excrow or changer are given back to user + * Provides data for logging, especially changed value + */ + void cashPaymentFinished(nsDeviceControllerInterface::RESULT_STATE resultState, + const QString & newCashValue, // total inserted amount 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 + const QString & errorCode, + const QString & errorDescription); + + /** * emitted e.g. if service door is opened */ void requestModeSERVICE(); + /** + * emitted e.g. if vault door is opened + */ + void requestModeACCOUNT(); + /** * emitted e.g. if doors are closed */ @@ -145,7 +170,10 @@ signals: void requestAccountResponse(const QHash & accountData); - + /** + * show text messages in service mode + */ + void showServiceText(nsDeviceControllerInterface::SERVICE_TEXT serviceText, const QString & text); /** @@ -165,7 +193,7 @@ signals: Q_DECLARE_INTERFACE(DeviceControllerInterface, - "eu.atb.ptu.plugin.DeviceControllerInterface/1.0.1") + "eu.atb.ptu.plugin.DeviceControllerInterface/1.1.1") namespace nsDeviceControllerInterface { @@ -209,6 +237,14 @@ namespace nsDeviceControllerInterface { YES, NO }; + + enum class SERVICE_TEXT : quint16 { + SERVICE_DOOR_OPENED, + VAULT_DOOR_OPENED, + COIN_BOX_REMOVED, + COIN_BOX_INSERTED + /* t.b.d. */ + }; } #endif // DEVICECONTROLLERINTERFACE_H diff --git a/src/ATBAPP/support/CashUtils.cpp b/src/ATBAPP/support/CashUtils.cpp new file mode 100644 index 0000000..6e09aae --- /dev/null +++ b/src/ATBAPP/support/CashUtils.cpp @@ -0,0 +1,74 @@ +#include "CashUtils.h" + +#include + +#define MAX_COINS 64 +#define MAX_NOTES 16 + +/***************************************************************************** +* Get current inserted coins +* +* getAllInsertedCoins(uint16_t *types, uint16_t *values) +* all inserted coins of this past transaction are stored, max 64 +*/ +uint32_t CashUtils::getAmountOfInsertedCoins(hwinf* hw) +{ + uint32_t result = 0; + + uint16_t types[MAX_COINS]; + uint16_t values[MAX_COINS]; + hw->getAllInsertedCoins(types, values); + + for (int i = 0; i < MAX_COINS; i++) { + result += values[i]; + } + + return result; +} + + +/***************************************************************************** + * Get current inserted notes + * + * virtual uint8_t bna_getCurrentNotes(uint16_t latestBill, uint16_t *currentNotes) const =0; + * returns number of collected bank notes since start-command (current transaction) + * latestBill: last accepted bank note, value in cent + * currentNotes an array with up to 16 (further) notes collected + * + */ +uint32_t CashUtils::getAmountOfInsertedNotes(hwinf* hw) +{ + uint32_t result = 0; + uint8_t numberOfInsertedNotes; + + uint16_t beforeArray = 0; + uint16_t currentNotes[4]; + uint16_t afterArray = 0; + numberOfInsertedNotes = hw->bna_getCurrentNotes(0, currentNotes); + + if ( (beforeArray != 0) || (afterArray != 0) ) { + qCritical() << "CashUtils::getAmountOfInsertedNotes() ERROR: Array"; + } + + if (numberOfInsertedNotes == 99) { + // Error + qCritical() << "CashUtils::getAmountOfInsertedNotes() ERROR: "; + for (int i = 0; i < 4; i++) { + qCritical() << " currentNotes[" << i << "] = " << currentNotes[i]; + } + } + else { + // no error + result = currentNotes[3]; + result = ( result << 16 ) | currentNotes[2]; + } + + // DEBUG + qCritical() << "--------------------------------------------------"; + qCritical() << "CashUtils::getAmountOfInsertedNotes()"; + qCritical() << " numberOfInsertedNotes = " << numberOfInsertedNotes; + qCritical() << " result = " << result; + qCritical() << "--------------------------------------------------"; + + return result; +} diff --git a/src/ATBAPP/support/CashUtils.h b/src/ATBAPP/support/CashUtils.h new file mode 100644 index 0000000..1bfc654 --- /dev/null +++ b/src/ATBAPP/support/CashUtils.h @@ -0,0 +1,14 @@ +#ifndef CASHUTILS_H +#define CASHUTILS_H + +#include +#include "interfaces.h" + +namespace CashUtils { + +uint32_t getAmountOfInsertedCoins(hwinf* hw); +uint32_t getAmountOfInsertedNotes(hwinf* hw); + +} + +#endif // CASHUTILS_H