From 838c02d9e245031feec900be1cfe78586d36b906 Mon Sep 17 00:00:00 2001 From: Gerhard Hoffmann Date: Mon, 13 Nov 2023 12:50:57 +0100 Subject: [PATCH] delete obsolete files --- ATBHMIconfig.cpp | 858 --------------- ATBHMIconfig.h | 285 ----- AppControl.cpp | 2745 ---------------------------------------------- AppControl.h | 242 ---- atb_system.cpp | 652 ----------- atb_system.h | 117 -- 6 files changed, 4899 deletions(-) delete mode 100644 ATBHMIconfig.cpp delete mode 100644 ATBHMIconfig.h delete mode 100644 AppControl.cpp delete mode 100644 AppControl.h delete mode 100644 atb_system.cpp delete mode 100644 atb_system.h diff --git a/ATBHMIconfig.cpp b/ATBHMIconfig.cpp deleted file mode 100644 index 881b7a1..0000000 --- a/ATBHMIconfig.cpp +++ /dev/null @@ -1,858 +0,0 @@ -#include "ATBHMIconfig.h" -#include "atb_system.h" -#include -#include -#include - - - -ATBHMIconfig::ATBHMIconfig(QObject *parent) : QObject(parent) { - this->initEarly(); - this->initDefered(); -} - -ATBHMIconfig::~ATBHMIconfig() { - delete settings; -} - -void ATBHMIconfig::initEarly() { - QString settings_file = QCoreApplication::applicationDirPath() + "/ATBQT.ini"; - settings = new QSettings(settings_file, QSettings::IniFormat); - settings->setIniCodec("UTF-8"); - configGroups = settings->childGroups(); - - // [COMMON] - - settings->beginGroup("COMMON"); - -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - ComPortName = settings->value("com_port_name", "/dev/ttyS0").toString(); -#else - ComPortName = settings->value("com_port_name", "/dev/pts/20").toString(); -#endif - ComBaudRate = settings->value("com_baud_rate", "115200").toInt(); - - if ((ComBaudRate != 115200) && - (ComBaudRate != 57600) && - (ComBaudRate != 9600)) { ComBaudRate = 115200; } - - - lang1 = settings->value("lang1", "de_DE").toString(); - lang2 = settings->value("lang2", "en_US").toString(); - lang3 = settings->value("lang3", "fr_FR").toString(); - lang4 = settings->value("lang4", "ja_JP").toString(); - lang5 = settings->value("lang5", "nl-NL").toString(); - - useLanguage = static_cast(settings->value("useLanguage", "255").toInt()); - - this->defaultLanguage = settings->value("defaultLanguage", "1").toInt(); - if ((this->defaultLanguage < 1) || (this->defaultLanguage > 5)) { - this->defaultLanguage = 1; - } - - usePayment = static_cast(settings->value("usePayment", "255").toInt()); - - useVehicle = static_cast(settings->value("useVehicle", "255").toInt()); - - useProduct = static_cast(settings->value("useProduct", "255").toInt()); - - - textfilename = settings->value("textfile", "HMI_Texte.xml").toString(); -#if defined (ARCH_DesktopLinux) - QString filename = textfilename.split("/").last(); - textfilename = qApp->applicationDirPath() + "/text/" + filename; -#endif - -#if defined (ARCH_DesktopLinux) - logfilename = QDir::homePath() + "/ATBAPP_VMC.log"; -#else - logfilename = settings->value("logfile", "/var/log/atbqt.log").toString(); -#endif - - oooServiceNumber = settings->value("ooo_serviceNumber", "").toString(); - - oooServiceEmail = settings->value("ooo_serviceEmail", "").toString(); - - oooAlternativeLocation = settings->value("ooo_alternativeLocation", "").toString(); - - alternativeLogoFilename = settings->value("alternativeLogoFile").toString(); - - this->features = 0; - - // deprecated: - qmPath = qApp->applicationDirPath() + "/translations"; - - settings->endGroup(); - - /* - * note: PSA configuration settings are not stored in ini-file - */ - cust_nr = "0"; - group_nr = "0"; - zone_nr = "0"; - machine_nr = "0"; - validPSAconfig = false; -} - - -void ATBHMIconfig::initDefered() { - bool ok = false; - - // [COMMON] - - settings->beginGroup("COMMON"); - - SuspendMethode = settings->value("suspend_methode", "sysfs").toString(); - SuspendProgram = settings->value("suspend_program", "").toString(); - SuspendTime = settings->value("suspend_time", "10").toString(); - - if (settings->value("feature_Log", "on").toString() == "on" || - settings->value("feature_Log", "on").toString() == "yes" ) - { this->setFeatureLog(); } - else { this->unsetFeatureLog(); } - - if (settings->value("feature_TouchFeedback", "on").toString() == "on" || - settings->value("feature_TouchFeedback", "on").toString() == "yes" ) - { this->setFeatureTF(); } - else { this->unsetFeatureTF(); } - - if (settings->value("feature_DisplayControl", "off").toString() == "on" || - settings->value("feature_DisplayControl", "off").toString() == "yes" ) - { this->setFeatureDC(); } - else { this->unsetFeatureDC(); } - - if (settings->value("feature_StartButton", "on").toString() == "on" || - settings->value("feature_StartButton", "on").toString() == "yes" ) - { this->setFeatureStartButton(); } - else { this->unsetFeatureStartButton(); } - - if (settings->value("feature_selfOOO", "on").toString() == "on" || - settings->value("feature_selfOOO", "on").toString() == "yes" ) - { this->setFeatureSelfOOO(); } - else { this->unsetFeatureSelfOOO(); } - - if (settings->value("feature_DBusDisplayControl", "on").toString() == "on" || - settings->value("feature_DBusDisplayControl", "on").toString() == "yes" ) - { this->setFeatureDBusDisplayControl(); } - else { this->unsetFeatureDBusDisplayControl(); } - - if (settings->value("feature_DBusSuspendControl", "on").toString() == "on" || - settings->value("feature_DBusSuspendControl", "on").toString() == "yes" ) - { this->setFeatureDBusSuspendControl(); } - else { this->unsetFeatureDBusSuspendControl(); } - - if (settings->value("feature_ShowParkingTime", "on").toString() == "on" || - settings->value("feature_ShowParkingTime", "on").toString() == "yes" ) - { this->setFeatureShowParkingTime(); } - else { this->unsetFeatureShowParkingTime(); } - - - touch_feedback_gpio = settings->value("touch_feedback_gpio", "121").toString(); - - touch_feedback_on_value = settings->value("touch_feedback_on_value", "0").toString(); - touch_feedback_off_value = settings->value("touch_feedback_off_value", "1").toString(); - - QString ooo_mode = settings->value("ooo_mode", "useDisk").toString(); - if (ooo_mode == "useDisk") - this->oooMode = OOO_MODE::USE_PARKDISK; - else if (ooo_mode == "otherMachine") - this->oooMode = OOO_MODE::USE_OTHER_MACHINE; - else - this->oooMode = OOO_MODE::DEFAULT; - - characterSet = settings->value("CharacterSet", "ISO 8859-15").toByteArray(); - - qrCodeLink = settings->value("QRCodeLink", "").toString(); - - SellTimeoutTime = settings->value("sellTimeout_time", "60").toString(); - - this->privateReadInputDevices(); - - this->lpLocalExample = settings->value("LicencePlateExampleString", "HOAB123").toString(); - - -#if defined (USE_BARCODESCANNER) - if (settings->value("useBarcode", "on").toString() == "on" || - settings->value("useBarcode", "on").toString() == "yes" ) - { this->useBarcode = true; } - else { this->useBarcode = false; } -#endif // USE_BARCODESCANNER - -#ifdef USE_RFIDREADER - if (settings->value("useRFID", "on").toString() == "on" || - settings->value("useRFID", "on").toString() == "yes" ) - { this->useRFID = true; } - else { this->useRFID = false; } -#endif - - // DEBUG - qDebug() << "ATBHMIconfig::initDefered() com_port_name = " << ComPortName; - qDebug() << "ATBHMIconfig::initDefered() touch_feedback_gpio = " << touch_feedback_gpio; - - // DEBUG: write settings to file: - /* - settings->setValue("com_port_name", this->ComPortName); - settings->setValue("lang1", "de_DE"); - settings->setValue("lang2", "en_US"); - settings->setValue("lang3", "fr_FR"); - settings->setValue("lang4", "ja_JP"); - settings->setValue("textfile", "HMI_Texte.xml"); - settings->setValue("logfile", "/var/log/atbqt.log"); - settings->setValue("feature_Log", false); - settings->setValue("feature_TouchFeedback", true); - settings->setValue("feature_DisplayControl", true); - settings->setValue("feature_SystemSuspend", true); - settings->setValue("suspend_methode", "sysfs"); - settings->setValue("suspend_program", ""); - settings->setValue("suspend_time", 10); - settings->setValue("touch_feedback_gpio", 121); - settings->setValue("touch_feedback_on_value", 0); - settings->setValue("touch_feedback_off_value", 1); - */ - - this->HelpButtonUsed = settings->value("showHelpButton", "0").toBool(); - this->InfoButtonUsed = settings->value("showInfoButton", "0").toBool(); - - settings->endGroup(); - - // [PAYMENT] - - settings->beginGroup("PAYMENT"); - - QString cashVariantString = settings->value("cashVariant", "CoinsOnly").toString(); - if (cashVariantString == "CoinsOnly") { - this->cashVariant = PAYMENT_VARIANTS::CASH_VARIANT::CoinsOnly; - } - else - if (cashVariantString == "CoinsAndNotes") { - this->cashVariant = PAYMENT_VARIANTS::CASH_VARIANT::CoinsAndNotes; - } - else { - // Default - this->cashVariant = PAYMENT_VARIANTS::CASH_VARIANT::CoinsOnly; - } - - this->currencySymbol = settings->value("currencySymbol", "€").toString(); - - - QString paymentPointInTimeString = settings->value("paymentPointInTime", "poe").toString(); - if (paymentPointInTimeString == "poe") { - this->paymentPointInTime = PAYMENT_POINTINTIME::PAY_ON_EXIT; - } - else - if (paymentPointInTimeString == "poa") { - this->paymentPointInTime = PAYMENT_POINTINTIME::PAY_ON_ARRIVAL; - } - else - if (paymentPointInTimeString == "ign") { - this->paymentPointInTime = PAYMENT_POINTINTIME::IGNORE; - } - else { - // Default - this->paymentPointInTime = PAYMENT_POINTINTIME::PAY_ON_EXIT; - } - - - if (settings->value("useHonestPayment", "on").toString() == "on" || - settings->value("useHonestPayment", "on").toString() == "yes" ) - { this->honestPayment = true; } - else { this->honestPayment = false; } - - - settings->endGroup(); - - // [CUSTOMER] - - settings->beginGroup("CUSTOMER"); - - this->DiscountUsed = settings->value("DiscountUsed", "1").toBool(); - this->QRCodeReceiptUsed = settings->value("QRCodeReceiptUsed", "1").toBool(); - - settings->endGroup(); - -#ifdef USE_EXTERNAL_TICKETMANAGER - // [BARCODE_VERIFICATION] - - settings->beginGroup("BARCODE_VERIFICATION"); - - this->endOfSellingTime = settings->value("EndOfSellingTime", "06:00").toString(); - this->blockingTimeMin = settings->value("BlockingTime_Min", "15").toInt(&ok); - if (!ok) this->blockingTimeMin = 15; - - settings->endGroup(); -#endif - - -#ifdef USE_ISMAS - // [ISMAS] - - settings->beginGroup("ISMAS"); - - this->ismasHost = settings->value("ISMAS_HOST", "87.139.50.222").toString(); - this->ismasPort = settings->value("ISMAS_PORT", "10000").toInt(&ok); - this->ismasID = settings->value("ISMAS_ID", "").toString(); - - if (settings->value("ISMAS_DEBUG", "on").toString() == "on" || - settings->value("ISMAS_DEBUG", "on").toString() == "yes") - { this->ismasDebug = true; } - else { this->ismasDebug = false; } - - if (settings->value("ISMAS_CheckEntries", "on").toString() == "on" || - settings->value("ISMAS_CheckEntries", "on").toString() == "yes") - { this->ismasCheckEntries = true; } - else { this->ismasCheckEntries = false; } - - this->ismasConnectionTimeout = settings->value("ISMAS_ConnectionTimeout", "2").toInt(&ok); - if (!ok) this->ismasConnectionTimeout = 2; - - if (settings->value("usePinGenerator", "off").toString() == "on" || - settings->value("usePinGenerator", "off").toString() == "yes" ) - { this->usePINgenerator = true; } - else { this->usePINgenerator = false; } - - settings->endGroup(); -#endif - - // [ERRORCODE_MAPPING] - - if (settings->childGroups().contains("ERRORCODE_MAPPING")) { - settings->beginGroup("ERRORCODE_MAPPING"); - - QStringList ErrorCodes = settings->childKeys(); - - for (int i = 0; i < ErrorCodes.size(); ++i) { - errorTextHash.insert(ErrorCodes.at(i), settings->value(ErrorCodes.at(i),"").toString()); - } - - settings->endGroup(); - } - - - qDebug() << ok; -} - - -QSettings * ATBHMIconfig::getSettingsPtr() { return this->settings; } - -const QSettings & ATBHMIconfig::getSettings() { return *(this->settings); } - -QString ATBHMIconfig::getComPortName() { return this->ComPortName; } - -QString ATBHMIconfig::getSuspendMethode() { return this->SuspendMethode; } - -QString ATBHMIconfig::getSuspendProgram() { return this->SuspendProgram; } - - -/*********************************************************************************************** - * get suspend time (-> time, after system goes to suspend) in seconds - */ -QString ATBHMIconfig::getSuspendTime() { return this->SuspendTime; } - - -/*********************************************************************************************** - * get sell timout time (-> time, after system switched back to mode idle, if we do not have - * any user inputs or vmc messages during sell mode) in seconds - */ -QString ATBHMIconfig::getSellTimeoutTime() { return this->SellTimeoutTime; } - -QString ATBHMIconfig::getQmPath() { return this->qmPath; } - -bool ATBHMIconfig::hasFeatureTF() { return ((this->features & this->featureMaskTF) != 0); } -bool ATBHMIconfig::hasFeatureLog() { return ((this->features & this->featureMaskLog) != 0); } -bool ATBHMIconfig::hasFeatureDC() { return ((this->features & this->featureMaskDC) != 0); } -bool ATBHMIconfig::hasFeatureStartButton() { return ((this->features & this->featureMaskStartButton) != 0); } -bool ATBHMIconfig::hasFeatureSelfOOO() { return ((this->features & this->featureMaskSelfOOO) != 0); } -bool ATBHMIconfig::hasFeatureDBusDisplayControl() { return ((this->features & this->featureMaskDBusDisplayControl) != 0); } -bool ATBHMIconfig::hasFeatureDBusSuspendControl() { return ((this->features & this->featureMaskDBusSuspendControl) != 0); } -bool ATBHMIconfig::hasFeatureShowParkingTime() { return ((this->features & this->featureMaskShowParkingTime) != 0); } - -void ATBHMIconfig::setFeatureTF() { this->features |= this->featureMaskTF; } -void ATBHMIconfig::unsetFeatureTF() { this->features &= ~(this->featureMaskTF); } -void ATBHMIconfig::setFeatureLog() { this->features |= this->featureMaskLog; } -void ATBHMIconfig::unsetFeatureLog() { this->features &= ~(this->featureMaskLog); } -void ATBHMIconfig::setFeatureStartButton() { this->features |= this->featureMaskStartButton; } -void ATBHMIconfig::unsetFeatureStartButton() { this->features &= ~(this->featureMaskStartButton); } -void ATBHMIconfig::setFeatureSelfOOO() { this->features |= this->featureMaskSelfOOO; } -void ATBHMIconfig::unsetFeatureSelfOOO() { this->features &= ~(this->featureMaskSelfOOO); } - - -void ATBHMIconfig::setFeatureDC() -{ - // this features are mutually exclusive - if (this->hasFeatureDBusDisplayControl()) { - this->unsetFeatureDBusDisplayControl(); - } - this->features |= this->featureMaskDC; -} - -void ATBHMIconfig::unsetFeatureDC() { this->features &= ~(this->featureMaskDC); } - - -void ATBHMIconfig::setFeatureDBusDisplayControl() -{ - // this features are mutually exclusive - if (this->hasFeatureDC()) { - this->unsetFeatureDC(); - } - this->features |= this->featureMaskDBusDisplayControl; -} - -void ATBHMIconfig::setFeatureDBusSuspendControl() -{ - this->features |= this->featureMaskDBusSuspendControl; -} - -void ATBHMIconfig::unsetFeatureDBusDisplayControl() { this->features &= ~(this->featureMaskDBusDisplayControl); } -void ATBHMIconfig::unsetFeatureDBusSuspendControl() { this->features &= ~(this->featureMaskDBusSuspendControl); } - -void ATBHMIconfig::setFeatureShowParkingTime() { this->features |= this->featureMaskShowParkingTime; } -void ATBHMIconfig::unsetFeatureShowParkingTime() { this->features &= ~(this->featureMaskShowParkingTime); } - - -QString ATBHMIconfig::getTouchFeedbackGPIO() { return this->touch_feedback_gpio; } -QString ATBHMIconfig::getTouchFeedbackOnValue() { return this->touch_feedback_on_value; } -QString ATBHMIconfig::getTouchFeedbackOffValue() { return this->touch_feedback_off_value; } - -QString ATBHMIconfig::getTextfileName() { return this->textfilename; } - -QString ATBHMIconfig::getAlternativeLogoFilename() { return this->alternativeLogoFilename; } - -#ifdef USE_BARCODESCANNER -bool ATBHMIconfig::getUseBarcodeScanner() { return this->useBarcode; } -QString & ATBHMIconfig::getBarcodeScannerInputDevice() { return this->barcodeScannerInputDeviceName; } -#endif - -#ifdef USE_RFIDREADER -bool ATBHMIconfig::getUseRFIDReader() { return this->useRFID; } -QString & ATBHMIconfig::getRFIDReaderInputDevice() { return this->rfidReaderInputDeviceName; } -#endif - -PAYMENT_VARIANTS::CASH_VARIANT ATBHMIconfig::getCashVariant() { return this->cashVariant; } - -bool ATBHMIconfig::discountIsUsed() { return this->DiscountUsed; } -bool ATBHMIconfig::qrCodeReceiptIsUsed() { return this->QRCodeReceiptUsed; } - -#ifdef USE_EXTERNAL_TICKETMANAGER -/********************************************************************** - * for barcode verification: - * - * EndOfSellingTime: time, when all daily data (e.g. blocking list) is reset - * BlockingTime: time, in minutes, how long a verified ticket is blocked for reentry - */ -QString ATBHMIconfig::getEndOfSellingTime() { return this->endOfSellingTime; } -int ATBHMIconfig::getBlockingTime() { return this->blockingTimeMin; } -#endif - -QString ATBHMIconfig::getLang(int lang) -{ - switch (lang) { - case 1: return this->lang1; - break; - case 2: return this->lang2; - break; - case 3: return this->lang3; - break; - case 4: return this->lang4; - break; - case 5: return this->lang5; - break; - default: return ""; - } -} - - -/** - * Returns the ordered list of configured languages. - * { , , ... , } - * This languages should be available in text file. - */ -QStringList ATBHMIconfig::getConfiguredLanguages() -{ - QStringList langs; - langs << lang1 << lang2 << lang3 << lang4 << lang5; - return langs; -} - - -QString ATBHMIconfig::getCountry(int country) -{ - switch (country) { - case 1: return this->country1; - break; - case 2: return this->country2; - break; - case 3: return this->country3; - break; - case 4: return this->country4; - break; - case 5: return this->country5; - break; - default: return ""; - } -} - -bool ATBHMIconfig::isLanguageUsed(int lang) -{ - switch (lang) { - case 1: return (this->useLanguage & 0x80) ? (true) : (false); - break; - case 2: return (this->useLanguage & 0x40) ? (true) : (false); - break; - case 3: return (this->useLanguage & 0x20) ? (true) : (false); - break; - case 4: return (this->useLanguage & 0x10) ? (true) : (false); - break; - case 5: return (this->useLanguage & 0x08) ? (true) : (false); - break; - default: return false; - } -} - -bool ATBHMIconfig::isInfoButtonUsed() { return this->InfoButtonUsed; } -bool ATBHMIconfig::isHelpButtonUsed() { return this->HelpButtonUsed; } - - -bool ATBHMIconfig::isPaymentUsed(int payment) -{ - switch (payment) { - case 1: return (this->usePayment & 0x80) ? (true) : (false); - break; - case 2: return (this->usePayment & 0x40) ? (true) : (false); - break; - case 3: return (this->usePayment & 0x20) ? (true) : (false); - break; - case 4: return (this->usePayment & 0x10) ? (true) : (false); - break; - default: return false; - } -} - - -bool ATBHMIconfig::isVehicleUsed(int vehicle) -{ - switch (vehicle) { - case 1: return (this->useVehicle & 0x80) ? (true) : (false); - break; - case 2: return (this->useVehicle & 0x40) ? (true) : (false); - break; - case 3: return (this->useVehicle & 0x20) ? (true) : (false); - break; - case 4: return (this->useVehicle & 0x10) ? (true) : (false); - break; - case 5: return (this->useVehicle & 0x08) ? (true) : (false); - break; - case 6: return (this->useVehicle & 0x04) ? (true) : (false); - break; - case 7: return (this->useVehicle & 0x02) ? (true) : (false); - break; - case 8: return (this->useVehicle & 0x01) ? (true) : (false); - break; - default: return false; - } -} - - -bool ATBHMIconfig::isProductUsed(int product) -{ - switch (product) { - case 1: return (this->useProduct & 0x80) ? (true) : (false); - break; - case 2: return (this->useProduct & 0x40) ? (true) : (false); - break; - case 3: return (this->useProduct & 0x20) ? (true) : (false); - break; - case 4: return (this->useProduct & 0x10) ? (true) : (false); - break; - case 5: return (this->useProduct & 0x08) ? (true) : (false); - break; - case 6: return (this->useProduct & 0x04) ? (true) : (false); - break; - case 7: return (this->useProduct & 0x02) ? (true) : (false); - break; - case 8: return (this->useProduct & 0x01) ? (true) : (false); - break; - default: return false; - } -} - - -QString ATBHMIconfig::getLogFileName() -{ - return this->logfilename; -} - -int ATBHMIconfig::getDefaultLanguage() -{ - return this->defaultLanguage; -} - -void ATBHMIconfig::setDefaultLanguage(quint8 lang) -{ - this->defaultLanguage = lang; -} - - -int ATBHMIconfig::getComBaudRate() -{ - return this->ComBaudRate; -} - - -/******************************************************************************** - * Funktions for storing some machine specific configuration data in filesystem. - * - * Note: this functions must reduce write operations to flash memory. - * Therefore, first the data values are read from memory and compared to the new ones. - * Only changed values should be written. - * Additionally, open files, read their values and compare this values is time consuming. - * So we store this values also in our config-object and do only a comparisson if values - * have changed. - * - * - */ -QString & ATBHMIconfig::getCustNr() -{ - if (!this->validPSAconfig) { this->readPSAConfig(); } - return this->cust_nr; -} - -QString & ATBHMIconfig::getGroupNr() -{ - if (!this->validPSAconfig) { this->readPSAConfig(); } - return this->group_nr; -} - -QString & ATBHMIconfig::getZoneNr() -{ - if (!this->validPSAconfig) { this->readPSAConfig(); } - return this->zone_nr; -} - -QString & ATBHMIconfig::getMachineNr() -{ - if (!this->validPSAconfig) { this->readPSAConfig(); } - return this->machine_nr; -} - -quint8 ATBHMIconfig::readPSAConfig() -{ - this->cust_nr = ATB_system::readPSAConfigString("/etc/cust_nr"); - this->group_nr = ATB_system::readPSAConfigString("/etc/group_nr"); - this->zone_nr = ATB_system::readPSAConfigString("/etc/zone_nr"); - this->machine_nr = ATB_system::readPSAConfigString("/etc/machine_nr"); - this->validPSAconfig = true; - return 1; -} - -void ATBHMIconfig::setCustNr(const QString& cust_nr) -{ - if (! validPSAconfig) { this->readPSAConfig(); } - - // compare to cached value: - - if (cust_nr != this->cust_nr) { // Customer number has changed - ATB_system::setPSAConfigString("/etc/cust_nr", cust_nr); - this->cust_nr = cust_nr; - } -} - - -void ATBHMIconfig::setGroupNr(const QString& group_nr) -{ - if (! validPSAconfig) { this->readPSAConfig(); } - - // compare to cached value: - - if (group_nr != this->group_nr) { - ATB_system::setPSAConfigString("/etc/group_nr", group_nr); - this->group_nr = group_nr; - } -} - - -void ATBHMIconfig::setZoneNr(const QString& zone_nr) -{ - if (! validPSAconfig) { this->readPSAConfig(); } - - // compare to cached value: - - if (zone_nr != this->zone_nr) { - ATB_system::setPSAConfigString("/etc/zone_nr", zone_nr); - this->zone_nr = zone_nr; - } -} - - -void ATBHMIconfig::setMachineNr(const QString &machine_nr) -{ - if (! validPSAconfig) { this->readPSAConfig(); } - - // compare to cached value: - - if (machine_nr != this->machine_nr) { - ATB_system::setPSAConfigString("/etc/machine_nr", machine_nr); - this->machine_nr = machine_nr; - } -} - - -OOO_MODE ATBHMIconfig::getOOOMode() -{ - return this->oooMode; -} - -QString ATBHMIconfig::getOOOModeString() -{ - switch (this->oooMode) { - case OOO_MODE::USE_OTHER_MACHINE: - return QString("otherMachine"); - break; - case OOO_MODE::USE_PARKDISK: - return QString("useDisk"); - break; - default: - return ""; - } - - return ""; -} - -QString ATBHMIconfig::getOOOServiceNumber() -{ - return this->oooServiceNumber; -} - -QString ATBHMIconfig::getOOOServiceEmail() -{ - return this->oooServiceEmail; -} - -QString ATBHMIconfig::getOOOAlternativeLocation() -{ - return this->oooAlternativeLocation; -} - -QString ATBHMIconfig::getLicensePlateExampleString() -{ - return this->lpLocalExample; -} - -QString ATBHMIconfig::getQrCodeLink() -{ - return this->qrCodeLink; -} - -const QByteArray & ATBHMIconfig::getDefaultCharacterSet() const -{ - return this->characterSet; -} - - -const QString & ATBHMIconfig::getPaymentCurrencySymbol() -{ - return this->currencySymbol; -} - -PAYMENT_POINTINTIME ATBHMIconfig::getPaymentPointInTime() -{ - return this->paymentPointInTime; -} - -bool ATBHMIconfig::useHonestPayment() -{ - return this->honestPayment; -} - -/*************************************************************************** - * public slot to re-read config - * - * This slot could be called e.g. on a mode switch from 'service' to 'sell' or vv. - */ -void ATBHMIconfig::reReadSettings() -{ - this->privateReadInputDevices(); -} - -/* private common function to set/read input device names. - */ -void ATBHMIconfig::privateReadInputDevices() -{ -#if defined (USE_BARCODESCANNER) - barcodeScannerInputDeviceName = ATB_system::getEventDeviceName(ATB_system::EVENT_DEVICE_BARCODEREADER); -#endif // USE_BARCODESCANNER - -#if defined (USE_RFIDREADER) - rfidReaderInputDeviceName = ATB_system::getEventDeviceName(ATB_system::EVENT_DEVICE_RFIDREADER); -#endif // USE_RFIDREADER -} - - -/*************************************************************************** - * ISMAS - */ -#ifdef USE_ISMAS -QString ATBHMIconfig::getISMASHost() { return this->ismasHost; } -quint16 ATBHMIconfig::getISMASPort() { return this->ismasPort; } -bool ATBHMIconfig::isIsmasDebug() { return this->ismasDebug; } -bool ATBHMIconfig::IsmasCheckEntries() { return this->ismasCheckEntries; } -quint16 ATBHMIconfig::getIsmasConnectionTimeout() { return this->ismasConnectionTimeout; } -bool ATBHMIconfig::UsePINgenerator() { return this->usePINgenerator; } -QString ATBHMIconfig::getISMASId() -{ - // if no ismasID is defined, we use customer Number (-> "ATB device Id" in Multipass) - if (this->ismasID == "") { - return this->getCustNr(); - } - return this->ismasID; -} -#endif - - -/*************************************************************************** - * public methods for ErrorCode - */ -QString ATBHMIconfig::getErrorText(const QString & errorCode) -{ - return errorTextHash.value(errorCode); -} - - -/*************************************************************************** - * get tools name/path - */ - -/***************************************************************************** - * check availability of network diag tool - * - * possible install path for networkDiag: - * 1) /usr/bin/atb_networkDiag - * 2) /opt/app/tools/networkDiag - * 3) /opt/app/atb_networkDiag/networkDiag - * - * Check, if file exists and if it is executable, - * Return path/name for binary. - */ -QString & ATBHMIconfig::getNetworkDiagTool() -{ - // search list for config file: - QStringList binFileList; - - // check, if file exists and if it is executable -#if defined (ARCH_PTU4) - binFileList << "/usr/bin/atbNetworkDiag" - << "/opt/app/tools/networkDiag" - << "/opt/app/atbNetworkDiag/networkDiag"; -#else - binFileList << QDir::homePath().append("/atbNetworkDiag"); -#endif - - // using C++11 range based loop: -> take first file, which is readable - for (const auto& filename : binFileList) { - if (QFileInfo(filename).isExecutable()) { - this->networkDiagToolName = filename; - break; - } - } - - return this->networkDiagToolName; -} diff --git a/ATBHMIconfig.h b/ATBHMIconfig.h deleted file mode 100644 index fa6e45a..0000000 --- a/ATBHMIconfig.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef ATBHMICONFIG_H -#define ATBHMICONFIG_H - -#include -#include -#include -#include "version.h" - - -/*************************************** - * Sample configuration: - * - * [General] - * com_port_name=/dev/pts/16 - * machine_nr=99 - * - * suspend_methode=sysfs - * suspend_program= - * suspend_time=10 - * - * touch_feedback=on - * touch_feedback_gpio=115 // 115 = beep; 121 = vibration motor - * touch_feedback_on_value=0 // 0 (buzzer) 1 (vibration) - * touch_feedback_off_value=1 // 1 (buzzer) 0 (vibration) - * - * log=on // loggin is on - * - * lang1=de_DE - * lang2=en_US - * lang3=fr_FR - * lang4=ja_JP - * - * textfile=HMI_Texte.xml - * - */ - - -enum class OOO_MODE : quint8; - - -class ATBHMIconfig : public QObject -{ - Q_OBJECT - - QString ComPortName; - - QString SuspendMethode; - QString SuspendProgram; - QString SuspendTime; - - QString SellTimeoutTime; - - QString qmPath; - - QString touch_feedback_gpio; - QString touch_feedback_on_value; - QString touch_feedback_off_value; - - - QString lang1; - QString lang2; - QString lang3; - QString lang4; - QString lang5; - - quint8 useLanguage; - quint8 useVehicle; - quint8 useProduct; - quint8 usePayment; - - QString country1; - QString country2; - QString country3; - QString country4; - QString country5; - - QSettings *settings; - - quint16 features; - static const quint16 featureMaskTF = 0x0001; - static const quint16 featureMaskLog = 0x0002; - static const quint16 featureMaskDC = 0x0004; // manuell display control, (in future deprecated) - static const quint16 featureMaskSusp = 0x0008; // manuell suspend control, (in future deprecated) - static const quint16 featureMaskStartButton = 0x0010; - static const quint16 featureMaskSelfOOO = 0x0020; - static const quint16 featureMaskDBusDisplayControl = 0x0040; - static const quint16 featureMaskDBusSuspendControl = 0x0080; - static const quint16 featureMaskShowParkingTime = 0x0100; - - - - QString logfilename; - - QString textfilename; - - QString alternativeLogoFilename; - - QString oooServiceNumber; - - QString oooServiceEmail; - - QString oooAlternativeLocation; - - QString qrCodeLink; - - QString lpLocalExample; - - QString currencySymbol; - - quint8 defaultLanguage; - - - bool HelpButtonUsed; - bool InfoButtonUsed; - bool DiscountUsed; - bool QRCodeReceiptUsed; - - int ComBaudRate; - - QString cust_nr; - QString group_nr; - QString zone_nr; - QString machine_nr; - bool validPSAconfig; - - QByteArray characterSet; - - PAYMENT_VARIANTS::CASH_VARIANT cashVariant; - - // ErrorCode-mapping - QHash errorTextHash; - -public: - explicit ATBHMIconfig(QObject *parent = nullptr); - ~ATBHMIconfig(); - - QSettings *getSettingsPtr(); - const QSettings & getSettings(); - - void initEarly(); - void initDefered(); - - QString getComPortName(); - - QString getSuspendMethode(); - QString getSuspendProgram(); - QString getSuspendTime(); - - QString getSellTimeoutTime(); - - quint32 getHMIScreenChangeTimeoutTime(); - - QString getQmPath(); - - QString getLang(int lang); - QString getCountry(int country); - bool isLanguageUsed(int lang); - - bool isInfoButtonUsed(); - bool isHelpButtonUsed(); - - bool isPaymentUsed(int payment); - bool isVehicleUsed(int vehicle); - bool isProductUsed(int product); - bool isProcductUsed(int product); - - QString getTouchFeedbackGPIO(); - QString getTouchFeedbackOnValue(); - QString getTouchFeedbackOffValue(); - - bool hasFeatureTF(); // touch feedback - bool hasFeatureLog(); // log serial communication - bool hasFeatureDC(); // display control - bool hasFeatureStartButton(); // StartButton - bool hasFeatureSelfOOO(); // self ooo capability - bool hasFeatureDBusDisplayControl(); - bool hasFeatureDBusSuspendControl(); - bool hasFeatureShowParkingTime(); // show parking time in addition to parking end time - - - QString getTextfileName(); - QString getAlternativeLogoFilename(); - - const QByteArray & getDefaultCharacterSet() const; - - QString getOOOServiceNumber(); - QString getOOOServiceEmail(); - QString getOOOAlternativeLocation(); - QString getLicensePlateExampleString(); - QString getQrCodeLink(); - - const QString & getPaymentCurrencySymbol(); - - void setFeatureTF(); - void unsetFeatureTF(); - - void setFeatureLog(); - void unsetFeatureLog(); - - void setFeatureDC(); - void unsetFeatureDC(); - - void setFeatureStartButton(); - void unsetFeatureStartButton(); - - void setFeatureSelfOOO(); - void unsetFeatureSelfOOO(); - - void setFeatureDBusDisplayControl(); - void unsetFeatureDBusDisplayControl(); - - void setFeatureDBusSuspendControl(); - void unsetFeatureDBusSuspendControl(); - - void setFeatureShowParkingTime(); - void unsetFeatureShowParkingTime(); - - QString getLogFileName(); - - int getDefaultLanguage(); - QStringList getConfiguredLanguages(); - - int getComBaudRate(); - - QString getErrorText(const QString & errorCode); - - // machine configuration - QString & getCustNr(); - QString & getGroupNr(); - QString & getZoneNr(); - QString & getMachineNr(); - quint8 readPSAConfig(); - - PAYMENT_VARIANTS::CASH_VARIANT getCashVariant(); - - bool discountIsUsed(); - bool qrCodeReceiptIsUsed(); - - // service programs - QString & getNetworkDiagTool(); - //QString & getPTUConfig(); - //QString & getPTUUpdate(); - - OOO_MODE getOOOMode(); - - QString getOOOModeString(); - - PAYMENT_POINTINTIME getPaymentPointInTime(); - bool useHonestPayment(); - - QStringList configGroups; - -private: - OOO_MODE oooMode; - - PAYMENT_POINTINTIME paymentPointInTime; - bool honestPayment; - - void privateReadInputDevices(); - - QString networkDiagToolName; - -signals: - -public slots: - void setDefaultLanguage(quint8 lang); - - void setCustNr(const QString& cust_nr); - void setGroupNr(const QString& group_nr); - void setZoneNr(const QString& zone_nr); - void setMachineNr(const QString& machine_nr); - - void reReadSettings(); -}; - - - - -enum class OOO_MODE : quint8 { - DEFAULT = 0, - USE_PARKDISK = 1, - USE_OTHER_MACHINE = 2 -}; - -#endif // ATBHMICONFIG_H diff --git a/AppControl.cpp b/AppControl.cpp deleted file mode 100644 index 62dc26b..0000000 --- a/AppControl.cpp +++ /dev/null @@ -1,2745 +0,0 @@ -#include "AppControl.h" -#include "ATBHMIconfig.h" -#include "VMC/vmc.h" -#include "atb_system.h" - -#include "support/VendingData.h" - -#include -#include -#include -#include -#include -#include - -AppControl::AppControl(QObject *parent) : - QObject(parent), - programmode(PROGRAM_MODE::IDLE) -{ - this->config = new ATBHMIconfig(); - this->system = new ATB_system(config, this); - this->vmc = new VMC(this, config, this); - - this->prepareInternalOOO = 0; - - // ------------------- ----------------------------------------------- - this->vendingData = new VendingData(this); - - // ------------------- connect HMI --------------------------------------------- - - // -------------------- connect vmc -------------------------------------------- - connect(vmc, SIGNAL(VMCFormatedString(FormatedStringList)), this, SLOT(onVMCFormatedString(FormatedStringList)), Qt::QueuedConnection); - - connect(vmc, SIGNAL(sysCommand(quint16, QByteArray)), system, SLOT(executeSystemCommand(quint16, QByteArray)), Qt::QueuedConnection); - connect(vmc, SIGNAL(newDateTime(QString)), system, SLOT(setDateTime(QString)), Qt::QueuedConnection); - - connect(vmc, SIGNAL(setCustNr(QString)), config, SLOT(setCustNr(QString)), Qt::QueuedConnection); - connect(vmc, SIGNAL(setGroupNr(QString)), config, SLOT(setGroupNr(QString)), Qt::QueuedConnection); - connect(vmc, SIGNAL(setZoneNr(QString)), config, SLOT(setZoneNr(QString)), Qt::QueuedConnection); - connect(vmc, SIGNAL(setMachineNr(QString)), config, SLOT(setMachineNr(QString)), Qt::QueuedConnection); - - connect(vmc, SIGNAL(setDefaultLanguage(quint8)), config, SLOT(setDefaultLanguage(quint8)), Qt::QueuedConnection); - - connect(vmc, SIGNAL(displayData(quint8,QString)), this, SLOT(onVMCSellData(quint8,QString)), Qt::QueuedConnection); - - connect(vmc, SIGNAL(retriggerModeSell()), this, SLOT(restartSellModeTimeoutTimer()), Qt::QueuedConnection); - - connect(vmc, SIGNAL(wakeVMC()), system, SLOT(onWakeVMC())); - - connect(vmc, SIGNAL(setVendingData(QString,QByteArray)), this, SLOT(onSetVendingData(QString,QByteArray)), Qt::QueuedConnection); - - - - // -------------------- connect system errors --------------------------------------- - /* - connect(, SIGNAL(signalStateError(QString, QString)), - this, - SLOT(onSignalSystemErrors(QString, QString))); - */ - - /* ----------------------------- load style -------------------------------------- */ - // Note: style should be loaded after all Widgets are created. This is partialy - // done in 'initDefered()'; so loading and applying StyleSheet is done here. - //QString styleSheet = "style.qss"; - //styleSheet.prepend('/').prepend(QApplication::applicationDirPath()); - QString styleSheet = ":/style/resources/style/style.qss"; - - QFile File(styleSheet); - - File.open(QFile::ReadOnly); - QString StyleSheet = QLatin1String(File.readAll()); - - // ------------------- TIMERS ----------------------------------------------- - // this timer resets to mode idle, if in sell mode. - sellModeTimeoutTimer = new QTimer(this); - sellModeTimeoutTimer->setInterval(1000*(config->getSellTimeoutTime().toInt())); - sellModeTimeoutTimer->setSingleShot(false); - connect(sellModeTimeoutTimer, SIGNAL(timeout()), this, SLOT(onSellModeTimerTimeout())); - - - /* ----------------------------- load plugins ------------------------------------ */ - #ifdef USE_PLUGINS - //QString ApplicationPluginPath = QCoreApplication::applicationDirPath() + "/plugins"; - //QCoreApplication::addLibraryPath(ApplicationPluginPath); - // -> 20190728: path is set (see debug output below)... - // but plugin is not loaded with QPluginLoader!!! - - this->pluginManager = new PluginManager(config, this); - - #ifdef USE_CC_PLUGIN - /* ----------------------------- CC plugin -------------------------------------- */ - this->private_initCCPlugin(); - #endif - - #ifdef USE_CALCULATEPRICE_PLUGIN - /* ----------------------------- Calculate Price -------------------------------- */ - this->private_initCalculatePricePlugin(); - #endif - - #ifdef USE_SIMULATION_PLUGIN - /* ----------------------------- Simulation Plugin ------------------------------- */ - this->private_initSimulationPlugin(); - #endif - - - #endif // USE_PLUGINS - - /* ----------------------------- setup hardware --------------------------------- */ - - #ifdef USE_BARCODESCANNER - // create and init barcode scanner - if (config->getUseBarcodeScanner()) { - this->barcodeScanner = new BarcodeScanner(this->config->getBarcodeScannerInputDevice(), this); - connect(this->barcodeScanner, SIGNAL(readHID(QString&)), this, SLOT(onReadBarcode(QString&))); - } - else { this->barcodeScanner = nullptr; } - #endif - - /* ----------------------------- ISMAS ------------------------------------------ */ - // used for PIN-generation and transaction - - #ifdef USE_ISMAS - this->ismas = new ATB_ISMAS(this->config, this); - connect(ismas, SIGNAL(received_ATBQRCODE_RESULT_response(QHash)), this, SLOT(onProcessed_QRCode(QHash))); - - connect(ismas, SIGNAL(requestOfflineProcessing()), this, SLOT(onRequestOfflineProcessing()), Qt::QueuedConnection); - connect(this, SIGNAL(doOfflineProcessing()), ismas, SLOT(onDoOfflineProcessing()), Qt::QueuedConnection); - connect(this, SIGNAL(changedModeToSELL()), ismas, SLOT(onChangedModeToSELL())); - #endif - - - /* ----------------------------- dim high on program start ---------------------- */ - if (config->hasFeatureDBusDisplayControl()) { - system->dbus_DimControlStart(); - } - - /* -------------------- install event filter for global error handling ---------- */ - QCoreApplication *app = QCoreApplication::instance(); - app->installEventFilter(this); - - connect(system, SIGNAL(wakeUp()), this, SLOT(onWakeUp())); - - system->switchBlinkButtonOff(); - - /* ----------------------------- start first run -------------------------------- */ - QTimer::singleShot(500, this, SLOT(firstRun())); - - - /* ----------------------------- TESTS ------------------------------------------ */ -#if defined (ARCH_DesktopLinux) - /************************************************************************ - * test utils: - * - QString amount = "122"; - QString amountTax = "144"; - QString amountNet = "56"; - QString amount1 = "2"; - QString amount2 = "99"; - QString amount3 = "899"; - QString amount4 = "7809"; - qDebug() << "utils::getPriceString(" << amount << ") = " << utils::getPriceString(amount); - qDebug() << "utils::getPriceString(" << amountTax << "," << amountNet << ") = " << utils::getPriceString(amountTax, amountNet); - qDebug() << "utils::getPriceString(" << amountNet << ") = " << utils::getPriceString(amountNet); - - qDebug() << "utils::getPriceString(" << amountNet << ") = " << utils::getPriceString(amount1); - qDebug() << "utils::getPriceString(" << amountNet << ") = " << utils::getPriceString(amount2); - qDebug() << "utils::getPriceString(" << amountNet << ") = " << utils::getPriceString(amount3); - qDebug() << "utils::getPriceString(" << amountNet << ") = " << utils::getPriceString(amount4); - qDebug() << " "; - */ - - /************************************************************************ - * test QR-Code receipt: - */ - /* - #if defined (USE_QRCODE_RECEIPT) - - // Test: Beleg als QR-Code - QString tmpReceipt; - tmpReceipt.append(" ** Kundenbeleg ** \n"); - tmpReceipt.append(" Bezahlung Mastercard \n"); - tmpReceipt.append("Karte: xxxxxxxxxxxx9404 0\n"); - tmpReceipt.append("01.12.2021 09:57:12\n"); - tmpReceipt.append("Term.-ID:60213845 TA-Nr.:000069\n"); - tmpReceipt.append("Vorgangs- \n"); - tmpReceipt.append("Nr.:0064 Beleg:0009\n"); - tmpReceipt.append("App-ID: A0000000041010\n"); - tmpReceipt.append("Erfassungsart: Kontaktlos\n"); - tmpReceipt.append("Autor.:555058 -\n"); - tmpReceipt.append("VU-Nummer: 455600764906\n"); - tmpReceipt.append("Betrag: EUR 1,00\n"); - tmpReceipt.append(" Zahlung erfolgt \n"); - tmpReceipt.append(" \n"); - - // Test: Link als QR-Code - tmpReceipt.clear(); - tmpReceipt.append("https://www.betterpark.de/receipt?licencePlate=ABCD123&ticketNumber=123456"); - - this->vendingData->setParameter("RECEIPT", QVariant(tmpReceipt)); - - QRCodeGenerator::generateQRCode(this->vendingData->getParameter("RECEIPT").toString()); - #endif - */ - - -#endif -} - - - - - -/************************************************************************** - * program mode management - * - */ -bool AppControl::requestProgramMode(PROGRAM_MODE newProgramMode) -{ - bool result = false; - - if (this->programmode == newProgramMode) { - return result; - } - - switch (newProgramMode) { - case PROGRAM_MODE::IDLE: - if (this->prepareInternalOOO) { - vmc->blockScreenSwitch(1); - this->requestProgramMode(PROGRAM_MODE::OOO); - return false; - } - else { - this->private_setupProgramModeIDLE(); - this->programmode = PROGRAM_MODE::IDLE; - result = true; - } - break; - case PROGRAM_MODE::SELL_ENABLE: - this->private_setupProgramModeSELL_ENABLE(); - this->programmode = PROGRAM_MODE::SELL_ENABLE; - result = true; - break; - case PROGRAM_MODE::SELL: - this->private_setupProgramModeSELL(); - this->programmode = PROGRAM_MODE::SELL; - result = true; - break; - case PROGRAM_MODE::SERVICE: - this->private_setupProgramModeSERVICE(); - this->programmode = PROGRAM_MODE::SERVICE; - result = true; - break; - case PROGRAM_MODE::OOO: - this->private_setupProgramModeOOO(); - this->programmode = PROGRAM_MODE::OOO; - result = true; - break; - } - - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "changed programmode to " << this->programmode; - - switch (this->programmode) { - case PROGRAM_MODE::IDLE: - emit this->changedModeToIDLE(); - break; - case PROGRAM_MODE::SELL_ENABLE: - - break; - case PROGRAM_MODE::SELL: - emit this->changedModeToSELL(); - break; - case PROGRAM_MODE::SERVICE: - emit this->changedModeToSERVICE(); - break; - case PROGRAM_MODE::OOO: - emit this->changedModeToOOO(); - break; - } - - emit this->changedProgramMode(this->programmode); - return result; -} - -PROGRAM_MODE AppControl::getCurrentProgramMode() -{ - return this->programmode; -} - -bool AppControl::isProgramModeSELL() -{ - return this->programmode == PROGRAM_MODE::SELL ? true : false; -} - -bool AppControl::isProgramModeSELL_ENABLE() -{ - return this->programmode == PROGRAM_MODE::SELL_ENABLE ? true : false; -} -bool AppControl::isProgramModeSERVICE() -{ - return this->programmode == PROGRAM_MODE::SERVICE ? true : false; -} -bool AppControl::isProgramModeIDLE() -{ - return this->programmode == PROGRAM_MODE::IDLE ? true : false; -} -bool AppControl::isProgramModeOOO() -{ - return this->programmode == PROGRAM_MODE::OOO ? true : false; -} - - -/* private mode setup routines */ - -void AppControl::private_setupProgramModeSELL() -{ - if (config->hasFeatureDBusSuspendControl()) { - system->dbus_preventSuspend(); - } - if (config->hasFeatureDBusDisplayControl()) { - system->dbus_DimHighPermanent(); - } - - // start SellModeTimeoutTimer - this->sellModeTimeoutTimer->start(); - - bool changed = false; - if (this->programmode != PROGRAM_MODE::SELL) { - changed = true; - } - - // do the following only once (only on mode change) - if (changed) { - // clear (old) vending data - vendingData->clear(); - } -} - -void AppControl::private_setupProgramModeSELL_ENABLE() -{ - -} - -void AppControl::private_setupProgramModeSERVICE() -{ - this->sellModeTimeoutTimer->stop(); - - if (config->hasFeatureDBusSuspendControl()) { - system->dbus_preventSuspend(); - } - if (config->hasFeatureDBusDisplayControl()) { - system->dbus_DimHighPermanent(); - } - -#ifdef USE_BARCODESCANNER - // reinit barcode scanner - if (config->getUseBarcodeScanner()) { - this->barcodeScanner->reopen(this->config->getBarcodeScannerInputDevice()); - } -#endif -#ifdef USE_RFIDREADER - // reinit rfid reader - if (config->getUseRFIDReader()) { - this->rfidReader->reopen(this->config->getRFIDReaderInputDevice()); - } -#endif -} - -void AppControl::private_setupProgramModeIDLE() -{ - // DEBUG Transactions: - if (vendingData->hasParameter("MISSINGTRANSACTION")) { - qCritical() << "setProgramModeIDLE: unsubmitted transaction: "; - qCritical() << " ACCESSINFORMATION = " << vendingData->getParameter("ACCESSINFORMATION").toString(); - } - - this->sellModeTimeoutTimer->stop(); - - if (this->programmode == PROGRAM_MODE::SERVICE) { - this->private_unsetProgramModeSERVICE(); - } - - if (this->programmode == PROGRAM_MODE::OOO) { - this->private_unsetProgramModeOOO(); - } - - if (config->hasFeatureDBusSuspendControl()) { - system->dbus_permitSuspend(); - } - if (config->hasFeatureDBusDisplayControl()) { - // do the following only if there is a mode transition from SELL,OOO,SERVICE - // If we are already in idle, this would cause the backlight to be switched on. - if (!this->isProgramModeIDLE()) { - system->dbus_DimControlStart(); - } - } -} - -void AppControl::private_setupProgramModeOOO() -{ - this->sellModeTimeoutTimer->stop(); - - this->prepareInternalOOO = 0; - - if (this->programmode == PROGRAM_MODE::SERVICE) { - this->private_unsetProgramModeSERVICE(); - } - - this->LEDs_ooo(); - - if (config->hasFeatureDBusSuspendControl()) { - system->dbus_permitSuspend(); - } - if (config->hasFeatureDBusDisplayControl()) { - system->dbus_DimControlStart(); - } -} - - -/***************************************************************************** - * for cleanup from SERVICE-Mode: - * close service menu, show stackedWidget, ... - */ -void AppControl::private_unsetProgramModeSERVICE() -{ - this->LEDs_default(); - - -#ifdef USE_BARCODESCANNER - // reinit barcode scanner - if (config->getUseBarcodeScanner()) { - this->barcodeScanner->reopen(this->config->getBarcodeScannerInputDevice()); - } -#endif -#ifdef USE_RFIDREADER - // reinit rfid reader - if (config->getUseRFIDReader()) { - this->rfidReader->reopen(this->config->getRFIDReaderInputDevice()); - } -#endif - -} - - -/***************************************************************************** - * for cleanup from OOO-Mode: - */ -void AppControl::private_unsetProgramModeOOO() -{ - this->LEDs_default(); -} - - - -void AppControl::onRequestOfflineProcessing() -{ - if (this->programmode == PROGRAM_MODE::IDLE) - emit this->doOfflineProcessing(); -} - - -void AppControl::restartSellModeTimeoutTimer() -{ - if (this->isProgramModeSELL()) { this->sellModeTimeoutTimer->start(); } -} - - - -/************************************************************************** - * process VMC commands - * - */ - -/***************************************************************************** - * VMC: received formated string - * - * Precondition: - * VMC sends this message only in case of a successful and finished selling process - * (i.e. a ticket was printed). - * In case of e.g. a printing error, VMC must not send this message. - * - */ -void AppControl::onVMCFormatedString(FormatedStringList data) -{ - // DEBUG - qCritical() << "AppControl::onVMCFormatedString(): received " << data.size() << " list elements"; - foreach ( const QByteArray &dataElement, data) - { - qCritical() << " " << dataElement; - } - -#ifdef USE_CALCULATEPRICE_PLUGIN - /* for ProcessTransaction: - * - 7 Parameters: - * - 1 - "TRANS" - * - 2 - licenseplate (accessInformation) - * - 3 - accessInformationType - * - 4 - timestamp - * - 5 - amount - * - 6 - TransactionNumber - * - 7 - ReceiptNumber - * - */ - - if ( (data.size() >= 7) && (data.at(0).at(0) == 'T') ) { - - QStringList tmpList; - for (int i = 0; i < data.size(); i++) { - tmpList << QString(data.at(i)); - } - - this->calcPriceBackend->requestProcessTransaction(tmpList.at(1), - "LICENSEPLATE", - tmpList.at(4), - false, - "", // receipt data - tmpList.at(5), // TransactionId - this->vendingData->getParameter("PermitType").toString(), - this->vendingData->getParameter("PaymentType").toString()); - - // clear vending data parameter to indicate, that transaction is done: - vendingData->clearParameter("TRANS"); - vendingData->clearParameter("MISSINGTRANSACTION"); - } -#else - qCritical() << "AppControl::onVMCFormatedString(): calculate price backend is not in this part of this program"; -#endif -} - - -/************************************************************************** - * private initializer - * - * note: init is done in constructor - */ -void AppControl::private_initCCPlugin() -{ -#ifdef USE_CC_PLUGIN - - // load CCPlugin: - this->cc = qobject_cast(this->pluginManager->getInstance("CCPlugin")); - - if (this->cc == nullptr) { - qCritical() << "ERROR on loading Plugin CCInterface!"; - return; - } - - if ( ! static_cast(cc->initCCInterfacePlugin(this, config->getSettings()))) { - qCritical() << "ERROR on init Plugin CCInterface:"; - qCritical() << " " << cc->getLastErrorDescription(); - return; - } - - qCritical() << "pluginInfo: " << cc->getPluginInfo(); - - // control cc by VMC (deprecated): - connect(vmc, SIGNAL(ccStartTransaction()), this, SLOT(onVMC_ccStartTransaction())); - connect(vmc, SIGNAL(ccCancelTransaction()), this, SLOT(onVMC_ccCancelTransaction())); - connect(vmc, SIGNAL(ccConfirmTransaction()), this, SLOT(onVMC_ccConfirmTransaction())); - - connect(dynamic_cast(cc), SIGNAL(sendStartTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCStartTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - connect(dynamic_cast(cc), SIGNAL(sendConfirmTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCConfirmTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - connect(dynamic_cast(cc), SIGNAL(sendCancelTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCCancelTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - connect(dynamic_cast(cc), SIGNAL(sendRevertTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCRevertTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - //connect(dynamic_cast(cc), SIGNAL(sendRevertTransactionResult(nsCCInterface::RESULT_STATE, QString&)), vmc, SLOT())); - //connect(dynamic_cast(cc), SIGNAL(sendDayCloseResult(nsCCInterface::RESULT_STATE, QString&)), vmc, SLOT(QString))); - - #ifdef USE_CC_PREAUTHORISATION - // control cc by VMC (deprecated): - connect(vmc, SIGNAL(ccStartPreauthorisation()), this, SLOT(onVMC_ccStartPreauthorisation())); - connect(vmc, SIGNAL(ccCancelPreauthorisation()), this, SLOT(onVMC_ccCancelPreauthorisation())); - connect(vmc, SIGNAL(ccConfirmPreauthorisation()), this, SLOT(onVMC_ccConfirmPreauthorisation())); - - connect(dynamic_cast(cc), SIGNAL(sendPreAuthTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCPreAuthTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - connect(dynamic_cast(cc), SIGNAL(sendBookTotalTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCBookTotalTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - connect(dynamic_cast(cc), SIGNAL(sendCancelPreAuthTransactionResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCCancelPreAuthTransactionResult(nsCCInterface::RESULT_STATE, QString&))); - #endif - - #ifdef USE_CC_READCARD - connect(vmc, SIGNAL(ccStartReadCard()), this, SLOT(onVMC_ccStartReadCard())); - connect(dynamic_cast(cc), SIGNAL(sendCardInfoResult(nsCCInterface::RESULT_STATE, QString&)), - this, SLOT(onCCRequestCardInfoResult(nsCCInterface::RESULT_STATE, QString&))); - - #endif - - // this is customer dependent - #if defined (CUST00308) - // Altmuehlsee - connect(vmc, SIGNAL(ccWakup()), dynamic_cast(cc), SLOT(wakeupCC())); - connect(vmc, SIGNAL(ccSleep()), dynamic_cast(cc), SLOT(sleepCC())); - #else - connect(this, SIGNAL(changedModeToSELL()), dynamic_cast(cc), SLOT(wakeupCC())); - connect(this, SIGNAL(changedModeToIDLE()), dynamic_cast(cc), SLOT(sleepCC())); - #endif - connect(this, SIGNAL(changedModeToSERVICE()), dynamic_cast(cc), SLOT(wakeupCC())); - - // extract plugin name form pluginInfo: - bool ok; - QVariantMap jsonCommand = JSON::parse(cc->getPluginInfo(), ok).toMap(); - QString ccPluginName = jsonCommand["PluginName"].toString(); - - - // configure HMI according to CC plugin: - // note: there could be also or addtional a customer specific config in the defined screen. - // also, there could be a specific text variant for a certain used terminal variant - if (ccPluginName == "TCP_ZVT_CCPlugin") { - hmi->setCCVariant(CC_VARIANT::TERMINAL::FEIG_CCTOPP); - } - else - if (ccPluginName == "IngenicoZVT_CCPlugin") { - hmi->setCCVariant(CC_VARIANT::TERMINAL::INGENICO_CCTOPP); - } - else - if (ccPluginName == "IngenicoISelf_CCPlugin") { - hmi->setCCVariant(CC_VARIANT::TERMINAL::INGENICO_CHIP_AND_PIN); - } - else { - hmi->setCCVariant(CC_VARIANT::TERMINAL::INGENICO_CCTOPP); - } - -#endif // USE_CC_PLUGIN -} - - -void AppControl::private_initCalculatePricePlugin() -{ -#ifdef USE_CALCULATEPRICE_PLUGIN - - // load CalculatePricePlugin: - this->calcPriceBackend = qobject_cast(this->pluginManager->getInstance("CalculatePricePlugin")); - - if (this->calcPriceBackend == nullptr) { - qCritical() << "plugin CalculatePrice ist not used, instantiate default..."; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, "", "Can not instantiate CalculatePricePlugin!"); - this->calcPriceBackend = new CalculatePriceDefault(this); - return; - } - - if ( ! static_cast(calcPriceBackend->initCalculatePricePlugin(this, config->getSettings()))) { - qCritical() << "ERROR init Plugin Calculate Price:"; - qCritical() << " " << calcPriceBackend->getLastErrorDescription(); - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, "", "Can not init CalculatePricePlugin!"); - return; - } - - qCritical() << "pluginInfo: " << calcPriceBackend->getPluginInfo(); - - connect(dynamic_cast(calcPriceBackend), - SIGNAL(requestCalculatePriceResult(nsCalculatePriceInterface::RESULT_STATE,QString,QString,QString,QString,PriceInfo,QString,QString)), - this, - SLOT(onCalculatedPrice(nsCalculatePriceInterface::RESULT_STATE,QString,QString,QString,QString,PriceInfo,QString,QString))); - - connect(dynamic_cast(calcPriceBackend), - SIGNAL(requestProcessTransactionResult(nsCalculatePriceInterface::RESULT_STATE,QString,QString)), - this, - SLOT(onProcessTransaction(nsCalculatePriceInterface::RESULT_STATE,QString,QString))); - -#endif // USE_CALCULATEPRICE_PLUGIN -} - -void AppControl::private_initSimulationPlugin() -{ -#ifdef USE_SIMULATION_PLUGIN - - // load SimulationPlugin: - this->simulation = qobject_cast(this->pluginManager->getInstance("SimulationPlugin")); - - if (this->simulation == nullptr) { - qCritical() << "plugin Simulation ist not available..."; - } - else { - if ( ! static_cast(simulation->initSimulationInterfacePlugin(this, config->getSettings()))) { - qCritical() << "ERROR io init Plugin SimulationInterface:"; - qCritical() << " " << simulation->getLastErrorDescription(); - } - - qCritical() << "pluginInfo: " << simulation->getPluginInfo(); - - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, "", "Touch Simulation!"); - } - -#endif // USE_SIMULATION_PLUGIN -} - - - - -/************************************************************************** - * first run initialisation - * - * This methode is called, by a timer, 500ms after program start. - */ -void AppControl::firstRun() -{ - this->LEDs_default(); -} - - - - - -/************************************************************************** - * set a value in vending data - */ -void AppControl::onSetVendingData(QString key, QByteArray value) -{ - this->vendingData->setParameter(key, QVariant(value)); -} - - -/************************************************************************** - * CC slots - * - */ - -// public interface for vmc (deprecated) -void AppControl::onVMC_ccStartTransaction() -{ - this->onCCStartTransaction(); -} -void AppControl::onVMC_ccCancelTransaction() -{ - this->onCCCancelTransaction(); -} -void AppControl::onVMC_ccConfirmTransaction() -{ - this->onCCStartConfirmTransaction(); -} -void AppControl::onVMC_ccStartPreauthorisation() -{ - this->onCCStartPreauthorisation(); -} -void AppControl::onVMC_ccCancelPreauthorisation() -{ - this->onCCCancelPreauthorisationRequest(); -} -void AppControl::onVMC_ccConfirmPreauthorisation() -{ - this->onCCConfirmPreauthorisation(); -} -void AppControl::onVMC_ccStartReadCard() -{ - this->onCCStartReadCard(); -} - - - -void AppControl::onCCStartTransaction() -{ - -#ifdef USE_CC_PLUGIN - - cc->requestStartTransaction(this->vendingData->getUintParameter("AMOUNT")); - - -#endif -} - - - -void AppControl::onCCStartTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ -#ifdef USE_CC_PLUGIN - - qCritical() << "AppControl::onCCStartTransactionResult() result = " << result; - - // restart sell mode timeout timer on every message from CC. - if (this->isProgramModeSELL()) { this->sellModeTimeoutTimer->start(); } - - QString vmcResult; // 'String', sent to vmc - - switch (resultState) { - case nsCCInterface::RESULT_STATE::INFO: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is INFO: " << result; - if (result.contains("PAYMENT PREPARED")) { - hmi->setCCBusy(false); - hmi->enableCCAbort(true); - } - else - if (result.contains("PAYMENT DISABLE ABORT")) { - hmi->enableCCAbort(false); - } - else - if (result.startsWith("04FF#")) { - hmi->displayCCMessage(result); - } - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is ERROR_BUSY"; - if (this->isProgramModeSELL()) { - // set mode busy - hmi->setCCBusy(true); - QTimer::singleShot(2000, this, SLOT(onCCStartTransaction())); - } - break; - case nsCCInterface::RESULT_STATE::SUCCESS: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is SUCCESS"; - qCritical() << " result is: " << result; - vendingData->setParameter("PaymentType", QVariant(1)); // '1' - CardPayment - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x00; - vmc->SendLongFormatedStringReference(vmcResult); - break; - case nsCCInterface::RESULT_STATE::ERROR_STATE: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is ERROR_STATE"; - qCritical() << " result is: " << result; - if (result.contains("DAYCLOSE RUNNING")) { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - else - if (result.contains("INIT RUNNING")) { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - else - if (result.contains("AMOUNT ZERO")) { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - else { - qCritical() << "ASSERT: unhandled RESULT_STATE::ERROR_STATE"; - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - // ignore this result message - } - break; - case nsCCInterface::RESULT_STATE::ERROR_BACKEND: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is ERROR_BACKEND"; - this->onCCErrorBackend(result); - break; - case nsCCInterface::RESULT_STATE::ERROR_TIMEOUT: - qCritical() << "AppControl::onCCStartTransactionResult() resultState is ERROR_TIMEOUT"; - vmcResult[0] = result.at(0); - vmcResult[1] = result.at(1); - if (result.at(0) == 0x45 && result.at(1) == 0x00) { - qCritical() << "ASSERT: RESULT_STATE::ERROR_TIMEOUT: sending 0x45 00 to VMC"; - } - else { - vmc->SendLongFormatedStringReference(vmcResult); - } - break; - default: - if(result.size()>0) { - qCritical() << "ASSERT: unhandled RESULT_STATE"; - qCritical() << " result is: " << result; - if (result.at(0) == 0x45 && result.at(1) == 0x00) { - qCritical() << "ASSERT: 'default' sending 0x45 00 to VMC"; - } - else { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - } - break; - } -#else - Q_UNUSED(resultState); - Q_UNUSED(result); -#endif -} - - -void AppControl::onCCCancelTransaction() -{ -#ifdef USE_CC_PLUGIN - cc->requestCancelTransaction(); -#endif -} - -/** - * check, if we do have already a receipt in this selling process... - * this is to prevent for multiple screen calls. - * It has to be ensured, that 'RECEIPT' is cleared/removed from vending data after selling process. - */ -void AppControl::onCCStartConfirmTransaction() -{ -#ifdef USE_CC_PLUGIN - if (this->vendingData->hasParameter("RECEIPT")) { - qCritical() << "AppControl::onCCStartConfirmTransaction() hasParameter(\"RECEIPT\") => omit repeated transaction"; - } - else { - qCritical() << "AppControl::onCCStartConfirmTransaction(): start confirm transaction"; - cc->requestConfirmTransaction(); - } -#endif -} - -void AppControl::onCCConfirmTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ - qCritical() << "AppControl::onCCConfirmTransactionResult() result = " << result; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::SUCCESS: - this->vendingData->setParameter("RECEIPT", QVariant(result)); - QTimer::singleShot(1000, this, SLOT(onCCPrintReceipt())); - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCConfirmTransactionResult() resultState is ERROR_BUSY"; - break; - default: - break; - } -} - - -void AppControl::onCCCancelTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ - qCritical() << "AppControl::onCCCancelTransactionResult() result = " << result; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::SUCCESS: - vmc->SendLongFormatedStringReference(result); - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCCancelTransactionResult() resultState is ERROR_BUSY"; - break; - default: - break; - } -} - - - - -// send receipt for printing -void AppControl::onCCPrintReceipt() -{ - if (this->vendingData->hasParameter("RECEIPT")) { - qCritical() << "DEBUG: onCCPrintReceipt() hasParameter(\"RECEIPT\")"; - vmc->ccPrintReceipt(this->vendingData->getParameter("RECEIPT").toString()); - - #if defined (USE_QRCODE_RECEIPT) - if (config->qrCodeReceiptIsUsed()) { - QRCodeGenerator::generateQRCode(this->vendingData->getParameter("RECEIPT").toString()); - } - #endif - } - else { - qCritical() << "onCCPrintReceipt() vendingData Parameter(\"RECEIPT\") not available"; - } - -} - - - - -void AppControl::onCCStartPreauthorisation() -{ -#ifdef USE_CC_PLUGIN - -#ifdef USE_CC_PREAUTHORISATION - cc->requestPreAuthTransaction(this->vendingData->getUintParameter("AMOUNT")); -#endif - -#endif - -} - - - -void AppControl::onCCPreAuthTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ -#ifdef USE_CC_PLUGIN - -#ifdef USE_CC_PREAUTHORISATION - - qCritical() << "AppControl::onCCPreAuthTransactionResult() result = " << result; - - QString vmcResult; // 'String', sent to vmc - - - bool ok; - QVariantMap jsonCardInfo; - QString cardInfo; - QString cardTransactionInfo; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::INFO: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is INFO: " << result; - if (result.contains("PAYMENT PREPARED")) { - hmi->setCCBusy(false); - hmi->enableCCAbort(true); - } - else - if (result.contains("PAYMENT DISABLE ABORT")) { - hmi->enableCCAbort(false); - } - else - if (result.startsWith("04FF#")) { - hmi->displayCCMessage(result); - } - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is ERROR_BUSY"; - if (this->isProgramModeSELL()) { - // set mode busy - hmi->setCCBusy(true); - QTimer::singleShot(2000, this, SLOT(onCCStartPreauthorisation())); - } - break; - case nsCCInterface::RESULT_STATE::SUCCESS: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is SUCCESS"; - - jsonCardInfo = JSON::parse(result, ok).toMap(); - - if (ok) { - // TODO: set correct parameter names... - cardInfo = jsonCardInfo["INSTITUTSNUMMER"].toString(); // Institutsnummer - cardTransactionInfo = jsonCardInfo["BELEGNUMMER"].toString(); // ZVT-Belegnummer - - this->vendingData->setParameter("INSTITUTSNUMMER", QVariant(cardInfo)); - this->vendingData->setParameter("ZVT_BELEGNUMMER", QVariant(cardTransactionInfo)); - - this->onCalculatePrice(cardInfo, cardTransactionInfo); - } - else { - // result is no json: abort - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - - break; - case nsCCInterface::RESULT_STATE::ERROR_STATE: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is ERROR_STATE"; - qCritical() << " result is: " << result; - if (result.contains("DAYCLOSE RUNNING")) { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - else - if (result.contains("INIT RUNNING")) { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - else { - qCritical() << "ASSERT: unhandled RESULT_STATE::ERROR_STATE"; - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - // ignore this result message - } - break; - case nsCCInterface::RESULT_STATE::ERROR_BACKEND: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is ERROR_BACKEND"; - this->onCCErrorBackend(result); - break; - case nsCCInterface::RESULT_STATE::ERROR_TIMEOUT: - qCritical() << "AppControl::onCCPreAuthTransactionResult() resultState is ERROR_TIMEOUT"; - vmcResult[0] = result.at(0); - vmcResult[1] = result.at(1); - if (result.at(0) == 0x45 && result.at(1) == 0x00) { - qCritical() << "ASSERT: RESULT_STATE::ERROR_TIMEOUT: sending 0x45 00 to VMC"; - } - else { - vmc->SendLongFormatedStringReference(vmcResult); - } - break; - default: - if(result.size()>0) { - qCritical() << "ASSERT: unhandled RESULT_STATE"; - qCritical() << " result is: " << result; - if (result.at(0) == 0x45 && result.at(1) == 0x00) { - qCritical() << "ASSERT: 'default' sending 0x45 00 to VMC"; - } - else { - vmcResult[0] = 0x45; // 'E' - vmcResult[1] = 0x65; // 'e' - vmc->SendLongFormatedStringReference(vmcResult); - } - } - break; - } -#endif - -#else - Q_UNUSED(resultState); - Q_UNUSED(result); -#endif - -} - - -void AppControl::onCCConfirmPreauthorisation() -{ -#ifdef USE_CC_PLUGIN - -#ifdef USE_CC_PREAUTHORISATION - if (!this->vendingData->hasParameter("ZVT_BELEGNUMMER")) { - qCritical() << "onCCConfirmPreauthorisation(): ERROR: missing vendingData \"ZVT_BELEGNUMMER\""; - return; - } - - QString zvt_belegnummer = this->vendingData->getParameter("ZVT_BELEGNUMMER").toString(); - - cc->requestBookTotalTransaction(this->vendingData->getUintParameter("AMOUNT"), - zvt_belegnummer); - -#else -qCritical() << "CC Preauthorisation is not supported, please define USE_CC_PREAUTHORISATION"; -#endif - -#endif - -} - - - -void AppControl::onCCCancelPreauthorisationRequest() -{ -#ifdef USE_CC_PLUGIN - -#ifdef USE_CC_PREAUTHORISATION - QString zvt_belegnummer; - - if (this->vendingData->hasParameter("ZVT_BELEGNUMMER")) { - zvt_belegnummer = this->vendingData->getParameter("ZVT_BELEGNUMMER").toString(); - - qCritical() << "onCCCancelPreauthorisationRequest() with receipt number: " << zvt_belegnummer; - - cc->requestCancelPreAuthTransaction(zvt_belegnummer); - } - else { - qCritical() << "onCCCancelPreauthorisationRequest(): ERROR: missing vendingData \"ZVT_BELEGNUMMER\""; - } - -#else -qCritical() << "CC Preauthorisation is not supported, please define USE_CC_PREAUTHORISATION"; -#endif - -#endif - -} - - -void AppControl::onCCCancelPreAuthTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ -#ifdef USE_CC_PLUGIN - -#ifdef USE_CC_PREAUTHORISATION - qCritical() << "AppControl::onCCCancelPreAuthTransactionResult() result = " << result; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::SUCCESS: - vmc->SendLongFormatedStringReference(result); - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCCancelPreAuthTransactionResult() resultState is ERROR_BUSY"; - break; - default: - break; - } -#endif -#else - Q_UNUSED(resultState); - Q_UNUSED(result); -#endif // USE_CC_PLUGIN -} - - - -void AppControl::onCCBookTotalTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ - qCritical() << "AppControl::onCCBookTotalTransactionResult() result = " << result; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::SUCCESS: - this->vendingData->setParameter("RECEIPT", QVariant(result)); - QTimer::singleShot(1000, this, SLOT(ccSendReceipt())); - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCBookTotalTransactionResult() resultState is ERROR_BUSY"; - break; - default: - qCritical() << "AppControl::onCCBookTotalTransactionResult() ERROR:"; - qCritical() << " errorDescription = " << cc->getLastErrorDescription(); - break; - } -} - - - -void AppControl::onCCRevertTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ -#ifdef USE_CC_PLUGIN - qCritical() << "AppControl::onCRevertTransactionResult() result = " << result; - - if (resultState == nsCCInterface::RESULT_STATE::ERROR_BUSY) { - qCritical() << "AppControl::onCCRevertTransactionResult() resultState is ERROR_BUSY"; - } - - vmc->SendLongFormatedStringReference(result); -#else - Q_UNUSED(resultState); - Q_UNUSED(result); -#endif -} - -/** -"{ - "06": { - "1F0b": "000000010000", - "1F14": "ee910b469d5f40bcba9a4c71c062769e", <-- TOKEN - "1F45": "0c788074038031c073d631c0", - "1F4c": "01", - "1F4d": "fe04", - "1F4f": "0400", - "1F50": "20", - "4c": "0000000000000880afaa", <-- UID - "62": { - "60[0]": { - "41": "0005", - "43": "a0000003591010028001" - } - } - }, - "23": "6725904400002036478d22122012845018450f", - "27": "00" -}" -*/ -void AppControl::onCCRequestCardInfoResult(nsCCInterface::RESULT_STATE resultState, QString & result) -{ -#ifdef USE_CC_PLUGIN -#ifdef USE_CC_READCARD - qDebug() << "AppControl::onCCRequestCardInfoResult(): "; - - bool ok; - QVariantMap jsonCardInfo; - QVariantMap TLVContrainer; - QByteArray tokenBA; - QString cardInfo; - QString cardTransactionInfo; - - JSON::setPrettySerialize(true); - JSON::JsonObject json; - - switch (resultState) { - case nsCCInterface::RESULT_STATE::SUCCESS: - qDebug() << " resultState = SUCCESS"; - - jsonCardInfo = JSON::parse(result, ok).toMap(); - - if (ok) { - JSON::JsonObject - TLVContrainer = jsonCardInfo["06"].toMap(); - - tokenBA = TLVContrainer["1F14"].toString().toLatin1(); - - cardInfo = jsonCardInfo["23"].toString().mid(3,5); - - this->vendingData->setParameter("INSTITUTSNUMMER", QVariant(cardInfo)); - } - else { - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is SUCCESS but no valid JSON"; - } - - // note: cardTransactionInfo = "" -> empty sting - this->onCalculatePrice(cardInfo, cardTransactionInfo); - - break; - case nsCCInterface::RESULT_STATE::ERROR_BUSY: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_BUSY"; - if (this->isProgramModeSELL()) { - // set mode busy - hmi->setCCBusy(true); - QTimer::singleShot(2000, this, SLOT(onCCStartReadCard())); - } - break; - case nsCCInterface::RESULT_STATE::INFO: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is INFO: " << result; - if (result.contains("STARTING CARD INFO READ ON CC")) { - hmi->setCCBusy(false); - hmi->enableCCAbort(true); - } - else - if (result.startsWith("04FF#")) { - hmi->displayCCMessage(result); - } - break; - case nsCCInterface::RESULT_STATE::ERROR_TIMEOUT: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_TIMEOUT: " << result; - /* FALLTHRU */ - case nsCCInterface::RESULT_STATE::ERROR_BACKEND: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_BACKEND: " << result; - /* FALLTHRU */ - case nsCCInterface::RESULT_STATE::ERROR_NETWORK: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_NETWORK: " << result; - /* FALLTHRU */ - case nsCCInterface::RESULT_STATE::ERROR_PROCESS: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_PROCESS: " << result; - /* FALLTHRU */ - case nsCCInterface::RESULT_STATE::ERROR_STATE: - qCritical() << "AppControl::onCCRequestCardInfoResult() resultState is ERROR_STATE: " << result; - qCritical() << " -> send ButtonCancel to vmc"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // "System error" - break; - } - - qDebug() << " JSON-String = " << result; - -#else - Q_UNUSED(resultState) - Q_UNUSED(result) - -#endif // USE_CC_READCARD -#else - Q_UNUSED(resultState); - Q_UNUSED(result); -#endif // USE_CC_PLUGIN -} - - -void AppControl::onCCStartReadCard() -{ -#ifdef USE_CC_PLUGIN -#ifdef USE_CC_READCARD - cc->requestCardInfo(); -#endif -#endif -} - - -void AppControl::onCCErrorBackend(QString & result) -{ -#ifdef USE_CC_PLUGIN - QString vmcResult; // 'String', sent to vmc - QString errorcode; - QString errortext; - QString protocol; - - bool ok; - QVariantMap jsonResult = JSON::parse(result, ok).toMap(); - - if (ok) { - // new, JSON - errorcode = jsonResult["errorcode"].toString(); - errortext = jsonResult["errortext"].toString(); - protocol = jsonResult["protocol"].toString(); - - vmcResult[0] = 0x45; - vmcResult[1] = errorcode.toUInt(&ok, 16); - } - else { - // legacy - vmcResult[0] = result.at(0); - vmcResult[1] = result.at(1); - } - - if (result.at(0) == 0x45 && result.at(1) == 0x00) { - qCritical() << "ASSERT: RESULT_STATE::ERROR_BACKEND: prevent sending 0x45 00 to VMC"; - vmcResult[1] = 0xFF; - } - -#if defined (CUST00318) - // hack for 00318/Nexobility - if (result.at(1) == 0x13) - this->private_CUST00318_handle_CC_ERROR_0x13(); - else { - vmc->SendLongFormatedStringReference(vmcResult); - } -#else - vmc->SendLongFormatedStringReference(vmcResult); -#endif - -#else - Q_UNUSED(result); -#endif -} - - - - - -#ifdef USE_CALCULATEPRICE_PLUGIN -/***************************************************************************** - * CalculatePricePlugin - */ -void AppControl::onCalculatePrice(QString & licensePlate) -{ - Q_UNUSED(licensePlate); - - this->onCalculatePrice(); -} - -void AppControl::onCalculatePrice() -{ - -#if defined (CUST00300) || defined (CUST00324) - // PRM license plate validation: - QString licensePlateString = this->vendingData->getParameter("LICENSEPLATE").toString(); - - // cr20201118/2: switch off lp validation - /* - if (!LicencePlateValidator::validateLicensePlate(licensePlateString)) { - this->onShowMessageBox(MessageBoxType::NOBUTTON, 0x34, QStringList() << licensePlateString); - this->onCloseBusy(); - return; - } - */ - - - - // cr20201118/3: switch off lp re-entry - /* - int lpcount = vendingData->getParameter("LPCOUNT").toInt(); - - if (lpcount == 0) { // -> the first try to insert licenseplate - this->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35, QStringList() << licensePlateString); - this->onCloseBusy(); - vendingData->setParameter("LP1", QVariant(licensePlateString)); - vendingData->setParameter("LPCOUNT", QVariant(1)); - screenLicPlate->onClearUserInputData(); - return; - } - else - if (lpcount == 1) { // -> the second try to insert licenseplate - vendingData->setParameter("LP2", QVariant(licensePlateString)); - vendingData->setParameter("LPCOUNT", QVariant(2)); - - // compare to LPs: - if (vendingData->getParameter("LP1").toString() != vendingData->getParameter("LP2").toString()) { - // TODO: -> Headline Text, Screen 0x31: "Bitte Kennzeichen erneut eingeben" - - this->onShowMessageBox(MessageBoxType::NOBUTTON, 0x36, - QStringList() << vendingData->getParameter("LP1").toString() - << vendingData->getParameter("LP2").toString() ); - this->onCloseBusy(); - vendingData->setParameter("LPCOUNT", QVariant(0)); - screenLicPlate->onClearUserInputData(); - return; - } - // ... jetzt passts, jetzt wird die Preisabfrage gestellt. - } - else - if (lpcount == 2) { - qCritical() << "HMI::onCalculatePrice() PRM: invalid 'lpcount'"; - vendingData->setParameter("LPCOUNT", QVariant(0)); - this->onCloseBusy(); - return; - } - else { - // ASSERT / LOG: - qCritical() << "HMI::onCalculatePrice() PRM: invalid state'"; - vendingData->setParameter("LPCOUNT", QVariant(0)); - this->onCloseBusy(); - return; - } - */ - - // cr20201118/4: re-entry if calculate price failed - int lpcount = vendingData->getParameter("LPCOUNT").toInt(); - - if (lpcount == 0) { // -> the first try to insert licenseplate - vendingData->setParameter("LPCOUNT", QVariant(1)); - hmi->onClearUserInputFields(); - } - else - if (lpcount == 1) { // -> the second try to insert licenseplate - vendingData->setParameter("LPCOUNT", QVariant(2)); - } - else { - // ASSERT / LOG: - qCritical() << "HMI::onCalculatePrice() PRM: invalid state'"; - vendingData->setParameter("LPCOUNT", QVariant(0)); - hmi->onCloseBusy(); - return; - } -#endif - -#if defined (CUST00318) - // Nexobility - - // CalculatePrice State is licenseplate only: - this->vendingData->setParameter("CP_STATE", QVariant().fromValue(CP_STATE::LICENSEPLATE_INPUT)); -#endif - -#if defined (CUST00328) - // ParkAndControl - - QString licensePlateString = this->vendingData->getParameter("LICENSEPLATE").toString(); - - if (licensePlateString.length() == 0) return; - - // re-entry if calculate price failed - int lpcount = vendingData->getParameter("LPCOUNT").toInt(); - - if (lpcount == 0) { // -> the first try to insert licenseplate - vendingData->setParameter("LPCOUNT", QVariant(1)); - hmi->onClearUserInputFields(); - } - else - if (lpcount == 1) { // -> the second try to insert licenseplate - vendingData->setParameter("LPCOUNT", QVariant(2)); - } - else { - // ASSERT / LOG: - qCritical() << "HMI::onCalculatePrice() ParkAndControl: invalid state'"; - vendingData->setParameter("LPCOUNT", QVariant(0)); - hmi->onCloseBusy(); - return; - } -#endif - -#if defined (USE_CALCULATEPRICE_PLUGIN) - this->calcPriceBackend->requestCalculatePrice( - this->vendingData->getParameter("LICENSEPLATE").toString(), - "LICENSEPLATE", - this->vendingData->getParameter("PermitType").toString()); -#endif -} - -void AppControl::onCalculatePrice(uint parktime) -{ - this->vendingData->setParameter("PARKTIME", QVariant(parktime)); - - // CalculatePrice State is licenseplate and parking time: - this->vendingData->setParameter("CP_STATE", QVariant().fromValue(CP_STATE::PARKINGTIME_INPUT)); - - -#if defined (USE_CALCULATEPRICE_PLUGIN) - this->calcPriceBackend->requestCalculatePrice( - this->vendingData->getParameter("LICENSEPLATE").toString(), - "LICENSEPLATE", - this->vendingData->getParameter("PermitType").toString(), - this->vendingData->getParameter("PARKTIME").toString()); -#endif -} - - - -void AppControl::onCalculatePrice(QString & cardInfo, QString & cardTransactionInfo) -{ - this->vendingData->setParameter("CARDINFO", QVariant(cardInfo)); - this->vendingData->setParameter("CARDTRANSACTIONINFO", QVariant(cardTransactionInfo)); - this->vendingData->setParameter("CP_STATE", QVariant().fromValue(CP_STATE::CARDINFO_INPUT)); - -#if defined (USE_CALCULATEPRICE_PLUGIN) - this->calcPriceBackend->requestCalculatePrice( - this->vendingData->getParameter("LICENSEPLATE").toString(), - "LICENSEPLATE", - this->vendingData->getParameter("PermitType").toString(), - this->vendingData->getParameter("PARKTIME").toString(), - this->vendingData->getParameter("CARDINFO").toString(), - this->vendingData->getParameter("CARDTRANSACTIONINFO").toString()); -#endif - -} - - -/* - * handle CalculatePrice response data - * - */ -void AppControl::onCalculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - - - // DEBUG ------------------------------------------------------------------------------------ - qCritical() << "onCalculatedPrice() resultState = " << this->calcPriceBackend->getString(resultState) << "\n" - << " accessInformation = " << accessInformation << "\n" - << " accessInformationType = " << accessInformationType << "\n" - << " amountDuePeriodStart = " << amountDuePeriodStart << "\n" - << " amountDuePeriodEnd = " << amountDuePeriodEnd << "\n" - << " priceInfo.priceNet = " << QString::number(priceInfo.priceNet) << "\n" - << " priceInfo.priceTax = " << QString::number(priceInfo.priceTax) << "\n" - << " priceInfo.priceGross = " << QString::number(priceInfo.priceGross) << "\n" - << " priceInfo.taxRate = " << QString::number(priceInfo.taxRate) << "\n" - << " errorCode = " << errorCode << "\n" - << " errorDescription = " << errorDescription; - - - nsCalculatePriceInterface::RESULT_STATE resultState_priv = resultState; - -#if defined (ARCH_DesktopLinux) - // TEST / SIMULATION - // To call parktime input screen - /* - int simulation_run = vendingData->getParameter("SIMULATION_RUN").toInt(); - if (simulation_run == 0) { - qDebug() << "HMI::onCalculatedPrice() Simulation run 1: ERROR_BACKEND"; - resultState_priv = nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND; - vendingData->setParameter("SIMULATION_RUN", QVariant(1)); - } - else { - qDebug() << "HMI::onCalculatedPrice() Simulation run 2"; - } - */ -#endif - - QString resultMessage; - switch(resultState_priv) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - resultMessage = "CalculatePrice success"; - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - // in this case we print only the message from backend - resultMessage = errorDescription; - //resultMessage = "CalculatePrice error: BACKEND\n"; - //resultMessage.append(" errorCode: ").append(errorCode); - //resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - resultMessage = "CalculatePrice error: NETWORK\n"; - resultMessage.append(" errorCode: ").append(errorCode).append("\n"); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - resultMessage = "CalculatePrice error: TIMEOUT\n"; - resultMessage.append(" errorCode: ").append(errorCode).append("\n"); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - resultMessage = "CalculatePrice error: PROCESS\n"; - resultMessage.append(" errorCode: ").append(errorCode).append("\n"); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - resultMessage = "CalculatePrice error: RETRY\n"; - resultMessage.append(" errorCode: ").append(errorCode).append("\n"); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - default: - resultMessage = "CalculatePrice error: Unknown Error\n"; - resultMessage.append(" errorCode: ").append(errorCode).append("\n"); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - } - qCritical() << resultMessage; - - // call project specific handler - QString VMCCalcString; - VMCCalcString = private_calculatedPrice(resultState, - accessInformation, - accessInformationType, - amountDuePeriodStart, - amountDuePeriodEnd, - priceInfo, - errorCode, - errorDescription); - - - if (VMCCalcString.size() > 0) { - // Send D0-CALC to VMC ---------------------------------------------- - // -> expect a screen change / response from VMC - - // DEBUG - qCritical() << "onCalculatedPrice() VMCCalcString: " << VMCCalcString; - - hmi->onShowBusy(1); - vmc->SendFormatedString(VMCCalcString); - } - else { - // do not send something to VMC ------------------------------------- - // -> no response / action from VMC is expected - // -> this is e.g. in case of a new tariff step - hmi->onCloseBusy(); - } - - /* - vcl->SendAmountDueNet(QString::number(priceInfo.priceNet)); - vcl->SendAmountDueTax(QString::number(priceInfo.priceTax); - vcl->SendAmountDuePeriodStart(amountDuePeriodStart); - vcl->SendAmountDuePeriodEnd(amountDuePeriodEnd); - */ - - // store values in vendingData: to detect a possible missing transaction - vendingData->setParameter("TRANS", QVariant(1)); // marker, that transaction is pending - vendingData->setParameter("ACCESSINFORMATION", QVariant(accessInformation)); -} - -/** - * @brief AppControl::private_getAccessInformationField - * @param accessInformationType - * @return QChar - * - * Transform accessInformationType-String to a QChar for usage in VMC formated String - */ -QChar AppControl::private_getAccessInformationField(const QString & accessInformationType) -{ - QChar accessInformationTypeField; - if (accessInformationType == "LICENSEPLATE") { - accessInformationTypeField = '1'; - } else - if (accessInformationType == "BARCODE") { - accessInformationTypeField = '2'; - } else - if (accessInformationType == "RFID") { - accessInformationTypeField = '3'; - } else - if (accessInformationType == "QRCODE") { - accessInformationTypeField = '4'; - } else - if (accessInformationType == "PIN") { - accessInformationTypeField = '5'; - } else - if (accessInformationType == "UID") { - accessInformationTypeField = '6'; - } else { - accessInformationTypeField = '\0'; - qCritical() << "onCalculatedPrice() accessInformationType " << accessInformationType - << " is currently not processed!"; - } - - return accessInformationTypeField; -} - - -#if defined (CUST00297) || defined (CUST00271) || defined (CUST00218) - // Lithunia (Kaunas, KaunasMuseum, Panevezys): -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(errorCode) - - QString formatedString; - - QChar accessInformationTypeField = this->private_getAccessInformationField(accessInformationType); - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - // on SUCCESS: send SUCCESS-formatedString - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append(QString::number(priceInfo.priceNet)).append('#'); - formatedString.append(QString::number(priceInfo.priceTax)).append('#'); - formatedString.append("").append('#'); // <- grace period, - deprecated - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - // show message box - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, "", errorDescription); - - // send abort to vmc ... is sent by message box - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - break; - } - - return formatedString; -} -// END: Lithunia (Kaunas, KaunasMuseum, Panevezys) - - -#elif defined (CUST02100) - // Goldbeck -> for fallback tariff -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(errorCode) - Q_UNUSED(errorDescription) - - QString formatedString; - - QChar accessInformationTypeField = this->private_getAccessInformationField(accessInformationType); - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - // on SUCCESS: send SUCCESS-formatedString - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append(QString::number(priceInfo.priceNet)).append('#'); - formatedString.append(QString::number(priceInfo.priceTax)).append('#'); - formatedString.append("").append('#'); // <- grace period, - deprecated - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append("0").append('#'); - formatedString.append("ERROR").append('#'); - // VMC can not handle ISO8859 encoded error texts!!!! - // -> formatedString.append(errorText).append('#'); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - break; - } - - return formatedString; -} -// END: Goldbeck - - -#elif defined (CUST00300) || defined (CUST00324) - // PRM / ARIVO: "honest parking" -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(errorCode) - Q_UNUSED(errorDescription) - - QString formatedString; - int lpcount; - - QChar accessInformationTypeField = this->private_getAccessInformationField(accessInformationType); - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - // on SUCCESS: send SUCCESS-formatedString - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append(QString::number(priceInfo.priceNet)).append('#'); - formatedString.append(QString::number(priceInfo.priceTax)).append('#'); - formatedString.append("").append('#'); // <- grace period, - deprecated - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - lpcount = vendingData->getParameter("LPCOUNT").toInt(); - if (lpcount == 1) { // -> re-enter lp - // -> Msg-Box: "Kennzeichen erneut eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - } - else - if (lpcount == 2) { // -> Input Parking time (honest payment) - - if (config->useHonestPayment()) { - - // note: in case of an error, 'accessInformation' is possibly empty so we use vendingData: - hmi->onDisplayData(0x48, this->vendingData->getParameter("LICENSEPLATE").toString()); - hmi->showScreen(Ui::SCREEN_PARKTIME1); - - // -> Msg-Box: "Parkdauer eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x37, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - - } - else { - - // -> Msg-Box: "Kennzeichen wurde nicht gefunden": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_SEND_CANCEL, 0x40); - - } - - vendingData->setParameter("LPCOUNT", QVariant(0)); - } - else { - // note: this could happen, e.g. if calculatePrice returns an error on an request with parking time parameter. - qCritical() << "onCalculatedPrice(): invalid lpcount!"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x38); // Network Error - vendingData->setParameter("LPCOUNT", QVariant(0)); - } - - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - // Network Error - qCritical() << "onCalculatedPrice(): Network error!"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x38); // Network Error - vendingData->setParameter("LPCOUNT", QVariant(0)); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - qCritical() << "onCalculatedPrice(): System error!"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // System Error - vendingData->setParameter("LPCOUNT", QVariant(0)); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - break; - } - - return formatedString; -} -// END: PRM / ARIVO - - - -#elif defined (CUST00318) - // Nexobility: "honest parking" -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(errorCode) - Q_UNUSED(errorDescription) - - QString formatedString; - - CP_STATE cp_state = vendingData->getParameter("CP_STATE").value(); - - QChar accessInformationTypeField = this->private_getAccessInformationField(accessInformationType); - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - // on SUCCESS: send SUCCESS-formatedString - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append(QString::number(priceInfo.priceNet)).append('#'); - formatedString.append(QString::number(priceInfo.priceTax)).append('#'); - formatedString.append("").append('#'); // <- grace period, - deprecated - - // Nexobility: Discount - if (vendingData->getParameter("CP_STATE").value() == CP_STATE::CARDINFO_INPUT) { - // DISCOUNT: - int oldAmountNet = this->vendingData->getParameter("PRICE").toString().toInt(); - int newAmountNet = priceInfo.priceNet; - if (newAmountNet < oldAmountNet) { - // discount is valid - show a message box with new price: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_SUCCESS, 0x34, - QStringList() << utils::getPriceString(priceInfo.priceNet, priceInfo.priceTax)); - } - else { - // discount is not valid - show a message box with error: - hmi->onShowMessageBox(MessageBoxType::OK_FAILURE, 0x3a, - QStringList() << utils::getPriceString(priceInfo.priceNet, priceInfo.priceTax)); - } - - // Trigger VMC on CloseButton sent from message box - vendingData->setParameter("CloseAction", QVariant::fromValue(APP_ACTION::SEND_D0_CALC)); - vendingData->setParameter("D0_CALC", QVariant(formatedString)); - - formatedString.clear(); - } - else { - this->vendingData->setParameter("PRICE", QVariant(utils::getPriceString(priceInfo.priceNet))); - } - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - // action depends on CP_STATE: - switch (cp_state) { - case CP_STATE::LICENSEPLATE_INPUT: - // 1st request: only with license plate - // Ask if licence plate is correct - hmi->onShowMessageBox(MessageBoxType::YESNO, 0x35, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - vendingData->setParameter("YesAction", QVariant::fromValue(APP_ACTION::PARKINGTIME_INPUT)); - vendingData->setParameter("NoAction", QVariant::fromValue(APP_ACTION::LICENSEPLATE_INPUT)); - qCritical() << "-> CP: ERROR_BACKEND - CP_STATE = LICENSEPLATE_INPUT"; - break; - case CP_STATE::PARKINGTIME_INPUT: - // - possibly additional request: with parking time - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // "System error" - qCritical() << "-> CP: ERROR_BACKEND - CP_STATE = PARKINGTIME_INPUT"; - break; - case CP_STATE::CARDINFO_INPUT: - // - 2nd request: with license plate and cardInfo - // Note: this should be a very rare case (2nd request fails!) - // It is easier to cancel vending process here. Normally we should resend the - // formated string again to vmc. - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x36); // "Keine Rabattierung möglich" - qCritical() << "-> CP: ERROR_BACKEND - CP_STATE = CARDINFO_INPUT"; - break; - case CP_STATE::NO_STATE: - qCritical() << "onCalculatedPrice(): CP_STATE::NO_STATE"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // System Error - break; - } - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - // Network Error - qCritical() << "onCalculatedPrice(): Network error!"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x38); // Network Error - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - // System Error - qCritical() << "onCalculatedPrice(): System error!"; - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // System Error - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - break; - } - - return formatedString; -} -// END: Nexobility - -#elif defined (CUST00328) - // ParkAndControl -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(errorCode) - Q_UNUSED(errorDescription) - - // this is sent to VMC: - QString formatedString; - int lpcount = vendingData->getParameter("LPCOUNT").toInt(); - - // reference time to setup dateTime input: - QDateTime referenceDateTime = QDateTime::currentDateTime(); - - QChar accessInformationTypeField = this->private_getAccessInformationField(accessInformationType); - - // currently tarif calculation depends on certain screens - Ui::SCREEN currentScreen = this->hmi->getCurrentScreen(); - - // Note for APCOA: this plugin does always provide valid sales data. Even e.g. if lookup - // fails for some reason (e.g. no network is available). - // So we have TODO: - // - set HMI-Data (onDisplayData) in any case / or even on certain Errors (ERROR_NETWORK) - // - send formated string to VMC if necessary if we need a screen change (e.g. switch to - // parking-time input. - - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - - // on SUCCESS: send SUCCESS-formatedString - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append(QString::number(priceInfo.priceNet)).append('#'); - formatedString.append(QString::number(priceInfo.priceTax)).append('#'); - formatedString.append("").append('#'); // <- grace period, - deprecated - - // set HMI-Data - this->hmi->onDisplayData(0x48, accessInformation); - this->hmi->onDisplayData(0x51, utils::getPriceStringFormated(priceInfo.priceGross,this->config->getPaymentCurrencySymbol())); - switch (config->getPaymentPointInTime()) { - case PAYMENT_POINTINTIME::PAY_ON_ARRIVAL: - this->hmi->onDisplayData(0x50, utils::getTimeStringFormated(amountDuePeriodEnd)); // Displayed ParktimeEnd - this->hmi->onDisplayData(0x54, utils::getTimeStringFormated(amountDuePeriodStart)); // Displayed EntryTime - break; - case PAYMENT_POINTINTIME::PAY_ON_EXIT: - this->hmi->onDisplayData(0x50, utils::getTimeStringFormated(amountDuePeriodStart)); // Displayed EntryTime, EndTime is currentTime - this->hmi->onDisplayData(0x54, utils::getTimeStringFormated(amountDuePeriodStart)); // Displayed EntryTime, EndTime is currentTime - break; - case PAYMENT_POINTINTIME::IGNORE: - this->hmi->onDisplayData(0x50, utils::getTimeStringFormated(amountDuePeriodStart)); // Displayed EntryTime, EndTime is not relevant - this->hmi->onDisplayData(0x54, utils::getTimeStringFormated(amountDuePeriodStart)); // Displayed EntryTime, EndTime is not relevant - break; - } - - // set vendingData - this->vendingData->setParameter("AMOUNT", utils::getPriceByteArray(priceInfo.priceGross)); - this->vendingData->setParameter("DATETIME_PARKEND", amountDuePeriodEnd); - - // ensure, that "D0_CALC"-string is always initialized and prepared to send to VMC - vendingData->setParameter("D0_CALC", QVariant(formatedString)); - - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - case Ui::SCREEN_DATETIME1: // honest payment: with entry date/time - case Ui::SCREEN_PARKTIME1: // honest payment: with parkingtime in minutes - // Trigger VMC immediately - break; - case Ui::SCREEN_PARKEND: // on selecting parking endtime - // Trigger VMC on NextButton, do not send formatedString immediately - formatedString.clear(); - break; - default: - qCritical() << "AppControl::private_calculatedPrice() called with invalid screen."; - formatedString.clear(); // do not send formatedString - break; - } - - break; - - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "onCalculatedPrice(): ERROR_TIMEOUT || ERROR_NETWORK || ERROR_BACKEND:" << endl - << " honest payment = " << config->useHonestPayment() << endl - << " current screen = " << "0x" + QString(static_cast(currentScreen)).toLatin1().toHex() << endl - << " paymentTime = " << config->getPaymentPointInTime(); - - if (config->useHonestPayment()) { - // ------------------------------ honest payment ------------------------------------ - - - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - - // cause honest payment - // => #CALC empty price - - if (lpcount == 1) { // -> re-enter lp - // -> Msg-Box: "Kennzeichen erneut eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - } - else { - - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append("").append('#'); // empty price - formatedString.append("").append('#'); // empty price - formatedString.append("").append('#'); // <- grace period, - deprecated - - // ... and set HMI-Data (price is still not valid) - this->hmi->onDisplayData(0x48, accessInformation); - - // setup HMI screen DateTime -------------------------- - hmi->setupDateTimeInput(referenceDateTime, - Ui::DateTimeInputMode::Down, - referenceDateTime, - referenceDateTime.addDays(-10)); - - // prepare "D0_CALC"-string to send to VMC - vendingData->setParameter("D0_CALC", QVariant(formatedString)); - - // Trigger VMC on CloseButton sent from message box - vendingData->setParameter("CloseAction", QVariant::fromValue(APP_ACTION::SEND_D0_CALC)); - formatedString.clear(); - - // -> Msg-Box: "Parkdauer eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x37, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - - vendingData->setParameter("LPCOUNT", QVariant(0)); - } - - break; // Ui::SCREEN_LICPLT - default: - // should not occur! - // => log and ignore: - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "AppControl::private_calculatedPrice() ERROR_TIMEOUT || ERROR_NETWORK || ERROR_BACKEND: invalid screen."; - qCritical() << " currentScreen = " << "0x" + QString(static_cast(currentScreen)).toLatin1().toHex(); - formatedString.clear(); // do not send formatedString - - break; - } - - - } - else { - // ------------------------------ *no* honest payment ------------------------------------ - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - // repeat endlessly - // until „Abort“ or match - - // -> Msg-Box: "Kennzeichen XY wurde nicht gefunden, Bitte erneut eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x3A, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - formatedString.clear(); // do not send formatedString - hmi->onClearUserInputFields(); // clear input fields in hmi - - break; - default: - // should not occur! - // => log and ignore: - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "AppControl::private_calculatedPrice() ERROR_TIMEOUT || ERROR_NETWORK || ERROR_BACKEND: invalid screen."; - qCritical() << " currentScreen = " << QString(static_cast(currentScreen)).toLatin1().toHex(); - formatedString.clear(); // do not send formatedString - - break; - } - - } - - break; // ERROR_TIMEOUT || ERROR_NETWORK || ERROR_BACKEND - - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - // System Error - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "onCalculatedPrice(): ERROR_PROCESS: System error!"; - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - hmi->onShowMessageBox(MessageBoxType::NOBUTTON_FAILURE, 0x39); // System Error - break; - default: - break; - } - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_RETRY: - - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "onCalculatedPrice(): ERROR_RETRY:" << endl - << " honest payment = " << config->useHonestPayment() << endl - << " current screen = " << "0x" + QString(static_cast(currentScreen)).toLatin1().toHex() << endl - << " paymentTime = " << config->getPaymentPointInTime(); - - if (config->useHonestPayment()) { - // ------------------------------ honest payment ------------------------------------ - - - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - - if (lpcount == 1) { // -> re-enter lp - // -> Msg-Box: "Kennzeichen erneut eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x35); - } - else { - - switch (config->getPaymentPointInTime()) { - case PAYMENT_POINTINTIME::PAY_ON_ARRIVAL: - case PAYMENT_POINTINTIME::PAY_ON_EXIT: - // cause honest payment - // => #CALC empty price - formatedString.append("#CALC#"); - formatedString.append(accessInformation).append('#'); - formatedString.append(accessInformationTypeField).append('#'); - formatedString.append(amountDuePeriodStart).append('#'); - formatedString.append(amountDuePeriodEnd).append('#'); - formatedString.append("").append('#'); // empty price - formatedString.append("").append('#'); // empty price - formatedString.append("").append('#'); // <- grace period, - deprecated - - // ... and set HMI-Data (price is still not valid) - this->hmi->onDisplayData(0x48, accessInformation); - - // setup HMI screen DateTime -------------------------- - hmi->setupDateTimeInput(referenceDateTime, - Ui::DateTimeInputMode::Down, - referenceDateTime, - referenceDateTime.addDays(-10)); - - // prepare "D0_CALC"-string to send to VMC - vendingData->setParameter("D0_CALC", QVariant(formatedString)); - - // Trigger VMC on CloseButton sent from message box - vendingData->setParameter("CloseAction", QVariant::fromValue(APP_ACTION::SEND_D0_CALC)); - - // -> Msg-Box: "Parkdauer eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x37, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - - break; - - case PAYMENT_POINTINTIME::IGNORE: - // Calculate price without match - // => #CALC with price to VMC - #if defined (USE_CALCULATEPRICE_PLUGIN) - this->calcPriceBackend->requestCalculatePrice( - this->vendingData->getParameter("LICENSEPLATE").toString(), - "LICENSEPLATE", - this->vendingData->getParameter("PermitType").toString(), - "60"); // default parking time: 60min - #endif - break; - } - - formatedString.clear(); // do not send formatedString - vendingData->setParameter("LPCOUNT", QVariant(0)); - - } - - break; // Ui::SCREEN_LICPLT - default: - // should not occur! - // => log and ignore: - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "AppControl::private_calculatedPrice() ERROR_RETRY: invalid screen."; - qCritical() << " currentScreen = " << "0x" + QString(static_cast(currentScreen)).toLatin1().toHex(); - formatedString.clear(); // do not send formatedString - - break; - } - - - } - else { - // ------------------------------ *no* honest payment ------------------------------------ - switch (currentScreen) { - case Ui::SCREEN_LICPLT: - // repeat endlessly - // until „Abort“ or match - - // -> Msg-Box: "Kennzeichen XY wurde nicht gefunden, Bitte erneut eingeben": - hmi->onShowMessageBox(MessageBoxType::NOBUTTON, 0x3A, QStringList() << this->vendingData->getParameter("LICENSEPLATE").toString()); - formatedString.clear(); // do not send formatedString - hmi->onClearUserInputFields(); // clear input fields in hmi - - break; - default: - // should not occur! - // => log and ignore: - qCritical() << QDateTime::currentDateTime().toString(Qt::ISODate) - << "AppControl::private_calculatedPrice() ERROR_RETRY: invalid screen."; - qCritical() << " currentScreen = " << QString(static_cast(currentScreen)).toLatin1().toHex(); - formatedString.clear(); // do not send formatedString - - break; - } - - } - - break; - case nsCalculatePriceInterface::RESULT_STATE::INFO: - break; - } - - // send formatedString (aka "#CALC#.." to VMC only if size > 0; - return formatedString; -} -// END: ParkAndControl - -#else - -// dummy for all other projects -QString AppControl::private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription) -{ - Q_UNUSED(resultState) - Q_UNUSED(accessInformation) - Q_UNUSED(accessInformationType) - Q_UNUSED(amountDuePeriodStart) - Q_UNUSED(amountDuePeriodEnd) - Q_UNUSED(priceInfo) - Q_UNUSED(errorCode) - Q_UNUSED(errorDescription) - qCritical() << "AppControl::private_calculatedPrice() dummy method called"; - - return ""; -} - -#endif - -void AppControl::onProcessTransaction(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & errorCode, - const QString & errorDescription) -{ - QString resultMessage; - - switch(resultState) { - case nsCalculatePriceInterface::RESULT_STATE::SUCCESS: - resultMessage = "Transaction success"; - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_BACKEND: - resultMessage = "Transaction error: BACKEND\n"; - resultMessage.append(" errorCode: ").append(errorCode); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_NETWORK: - resultMessage = "Transaction error: NETWORK\n"; - resultMessage.append(" errorCode: ").append(errorCode); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_TIMEOUT: - resultMessage = "Transaction error: TIMEOUT\n"; - resultMessage.append(" errorCode: ").append(errorCode); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - case nsCalculatePriceInterface::RESULT_STATE::ERROR_PROCESS: - resultMessage = "Transaction error: PROCESS\n"; - resultMessage.append(" errorCode: ").append(errorCode); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - default: - resultMessage = "Transaction error: Unknown Error\n"; - resultMessage.append(" errorCode: ").append(errorCode); - resultMessage.append(" errorDescription: ").append(errorDescription); - break; - } - - qCritical() << resultMessage; -} - -#endif // USE_CALCULATEPRICE_PLUGIN - - -void AppControl::onWakeUp() -{ - -} - - - -/******************************************************************************** - * LED configurations - * - * default: one LED, green, slow flash - * ooo: one LED, red, slow flash - */ -void AppControl::LEDs_default() -{ - system->onConfigLED(ATB_system::ATB_LED1, ATB_system::LED_TRIGGER_TIMER, 200, 2000); - system->onConfigLED(ATB_system::ATB_LED2, ATB_system::LED_TRIGGER_NONE); - system->onConfigLED(ATB_system::ATB_LED3, ATB_system::LED_TRIGGER_NONE); - system->onConfigLED(ATB_system::ATB_LED4, ATB_system::LED_TRIGGER_NONE); -} -void AppControl::LEDs_ooo() -{ - system->onConfigLED(ATB_system::ATB_LED1, ATB_system::LED_TRIGGER_NONE); - system->onConfigLED(ATB_system::ATB_LED2, ATB_system::LED_TRIGGER_NONE); - system->onConfigLED(ATB_system::ATB_LED3, ATB_system::LED_TRIGGER_NONE); - system->onConfigLED(ATB_system::ATB_LED4, ATB_system::LED_TRIGGER_TIMER, 500, 1000); -} - - - - - -/******************************************************************************* - * timer timeout slots - * - */ -void AppControl::onSellModeTimerTimeout() -{ - this->vmc->SendSystemMessageTimeout(); - this->requestProgramMode(PROGRAM_MODE::IDLE); -} - - - - - -/******************************************************************************* - * Signal System Errors - * - * System errors are errors that do not allow further execution of the program. - */ -void AppControl::onSignalSystemErrors(const QString & errorCode, const QString & errorDescription) -{ - // TODO: - // -> send monitoring message - // -> go to ModeOOO - // ... - Q_UNUSED(errorCode); - Q_UNUSED(errorDescription); -} - - -/******************************************************************************* - * action handling - */ -quint8 AppControl::startAction(APP_ACTION action) -{ - switch (action) { - case APP_ACTION::DEFAULT_ACTION: - qDebug() << "----> startAction: APP_ACTION::DEFAULT_ACTION"; - break; - case APP_ACTION::LICENSEPLATE_INPUT: - qDebug() << "----> startAction: APP_ACTION::LICENSEPLATE_INPUT"; - break; - case APP_ACTION::PARKINGTIME_INPUT: - qDebug() << "----> startAction: APP_ACTION::PARKINGTIME_INPUT"; - break; - case APP_ACTION::CARD_PAYMENT: - qDebug() << "----> startAction: APP_ACTION::CARD_PAYMENT"; - break; - case APP_ACTION::CHOOSE_PAYEMENT: - qDebug() << "----> startAction: APP_ACTION::CHOOSE_PAYEMENT"; - break; - case APP_ACTION::COIN_PAYMENT_PAYUP: - qDebug() << "----> startAction: APP_ACTION::COIN_PAYMENT_PAYUP"; - break; - case APP_ACTION::COIN_PAYMENT_PAYDOWN: - qDebug() << "----> startAction: APP_ACTION::COIN_PAYMENT_PAYDOWN"; - break; - case APP_ACTION::SEND_D0_CALC: - qDebug() << "----> startAction: APP_ACTION::SEND_D0_CALC"; - - if (vendingData->hasParameter("D0_CALC")) { - - // DEBUG - qCritical() << "startAction() APP_ACTION::SEND_D0_CALC: formatedString: " << vendingData->getParameter("D0_CALC").toString(); - - this->vmc->SendFormatedString(vendingData->getParameter("D0_CALC").toString()); - } - - break; - } - return 0; -} - - - - - -/***************************************************************************** - * MOUSE handling - */ - -#if defined (ARCH_PTU4) -/***************************************************************************** - * private USB Input Device handling methods - * - * This slot is called if something in the directory '/dev/input/' has changed (e.g. - * if a USB-mouse is plugged in/out or if a - * "hub 1-0:1.0: port 2 disabled by hub (EMI?), re-enabling..." occurs and re-inits - * the linux input devices. - */ -// Slot to receive a removed or added input device -void AppControl::onInputDeviceWatcher_directoryChanged(const QString& path) -{ - Q_UNUSED(path) - - QString mouseDeviceFile = system->getEventDeviceName(ATB_system::EVENT_DEVICE_USBMOUSE); - QString touchDeviceFile = system->getEventDeviceName(ATB_system::EVENT_DEVICE_TOUCHSCREEN); - - qCritical() << "AppControl::onInputDeviceWatcher_directoryChanged() mouseDeviceFile: " << mouseDeviceFile; - - if (!mousePresent && mouseDeviceFile.contains("mouse")) { - // mouse is now present: - setMouse(mouseDeviceFile, touchDeviceFile); - } else if (mousePresent && !mouseDeviceFile.contains("mouse")) { - // mouse is not present anymore: - closeMouse(mouseDeviceFile, touchDeviceFile); - } else if (!mousePresent) { - // mouse is not present (e.g. on startup, without mouse) - QWSServer::setCursorVisible( false ); - } - - // reinit USB-HID (qrcode scanner / RFID-reader) -#ifdef USE_BARCODESCANNER - // reinit barcode scanner - if (config->getUseBarcodeScanner()) { - this->barcodeScanner->reopen(this->config->getBarcodeScannerInputDevice()); - } -#endif -#ifdef USE_RFIDREADER - // reinit rfid reader - if (config->getUseRFIDReader()) { - this->rfidReader->reopen(this->config->getRFIDReaderInputDevice()); - } -#endif -} - -void AppControl::setMouse(const QString & mouseDeviceFile, const QString &touchDeviceFile) -{ - Q_UNUSED(touchDeviceFile) - - QWSMouseHandler *pMouseHandler = QMouseDriverFactory::create("IntelliMouse", mouseDeviceFile); - QWSServer* pQwsServer = QWSServer::instance(); - pQwsServer->setMouseHandler(pMouseHandler); - QWSServer::setCursorVisible( true ); - mousePresent = true; - - // DEBUG - qCritical() << "setMouse(): using device: " << mouseDeviceFile; -} - -void AppControl::closeMouse(const QString & mouseDeviceFile, const QString &touchDeviceFile) -{ - // TODO: only openMouse(), if a touchscreen is available; hide mouse pointer in this case - - // test: setDefaultMouse() - // - - - QWSServer* pQwsServer = QWSServer::instance(); - - // DEBUG - qCritical() << "closeMouse(): touch device: " << touchDeviceFile; - - if (touchDeviceFile.contains("event")) { - // touch device is available: - - // open mouse device specified by QWS_MOUSE_PROTO -> this is normally the touchscreen... - pQwsServer->openMouse(); - } - else { - // touch device is not available: - - pQwsServer->closeMouse(); - // -> close all pointer devices (defined by QWS_MOUSE_PROTO) - } - - - - //pQwsServer->closeMouse(); -> close all pointer devices (also defined by QWS_MOUSE_PROTO => also the touch screen!!!) - QWSServer::setCursorVisible( false ); - mousePresent = false; - - - // DEBUG - qCritical() << "closeMouse(): device: " << mouseDeviceFile; - -} -#endif - - - - - - - - - - -#if defined (ARCH_DesktopLinux) -/******************************************************************************* - * Screenshot - */ -void AppControl::private_screenshot() -{ - QString filename = QDir::homePath() + "/tmp/ATBQT_screenshot_0x" - + QString(static_cast(this->hmi->getCurrentScreen())).toLatin1().toHex() - + ".png"; - - qDebug() << "HMI::private_screenshot(): save screenshot to: " << filename; - - QWidget *w = QApplication::activeWindow(); - if(w) { - QPixmap p = QPixmap::grabWidget(w); - p.save(QString(filename)); - } -} -#endif - - -/************************************************************************** - * helpers: - * - operators - * - ... - */ -QDebug operator<<(QDebug debug, PROGRAM_MODE mode) { - switch (mode) { - case PROGRAM_MODE::IDLE: - debug << "PROGRAM_MODE::IDLE"; - break; - case PROGRAM_MODE::SELL_ENABLE: - debug << "PROGRAM_MODE::SELL_ENABLE"; - break; - case PROGRAM_MODE::SELL: - debug << "PROGRAM_MODE::SELL"; - break; - case PROGRAM_MODE::SERVICE: - debug << "PROGRAM_MODE::SERVICE"; - break; - case PROGRAM_MODE::OOO: - debug << "PROGRAM_MODE::OOO"; - break; - } - return debug; -} - -QDebug operator<<(QDebug debug, APP_ACTION action) { - switch (action) { - case APP_ACTION::DEFAULT_ACTION: - debug << "APP_ACTION::DEFAULT_ACTION"; - break; - case APP_ACTION::LICENSEPLATE_INPUT: - debug << "APP_ACTION::LICENSEPLATE_INPUT"; - break; - case APP_ACTION::PARKINGTIME_INPUT: - debug << "APP_ACTION::PARKINGTIME_INPUT"; - break; - case APP_ACTION::CARD_PAYMENT: - debug << "APP_ACTION::CARD_PAYMENT"; - break; - case APP_ACTION::CHOOSE_PAYEMENT: - debug << "APP_ACTION::CHOOSE_PAYEMENT"; - break; - case APP_ACTION::COIN_PAYMENT_PAYUP: - debug << "APP_ACTION::COIN_PAYMENT_PAYUP"; - break; - case APP_ACTION::COIN_PAYMENT_PAYDOWN: - debug << "APP_ACTION::COIN_PAYMENT_PAYDOWN"; - break; - case APP_ACTION::SEND_D0_CALC: - debug << "APP_ACTION::SEND_D0_CALC"; - break; - } - return debug; -} - - -/************************************************************************** - * customer specific things - */ -#if defined (CUST00318) -/***************************************************************************** - * hack for 00318/Nexobility - */ -void AppControl::private_CUST00318_handle_CC_ERROR_0x13() -{ - qCritical() << "CUST00318_handle_CC_ERROR_0x13"; - - - QString formatedString; - - vendingData->setParameter("CC_ERROR_0x13", QVariant(1)); - - formatedString.append("#CALC#"); - formatedString.append(this->vendingData->getParameter("LICENSEPLATE").toString()).append('#'); - formatedString.append("1").append('#'); - formatedString.append("2021-08-17T16:00:00").append('#'); - formatedString.append("2021-08-17T17:00:00").append('#'); - formatedString.append("0").append('#'); - formatedString.append("0").append('#'); - formatedString.append("0").append('#'); - - vmc->SendFormatedString(formatedString); -} - -#endif - diff --git a/AppControl.h b/AppControl.h deleted file mode 100644 index 3f45781..0000000 --- a/AppControl.h +++ /dev/null @@ -1,242 +0,0 @@ -#ifndef APPCONTROL_H -#define APPCONTROL_H - -#include - -#include "version.h" -#include "atb_system.h" -#include "ATBAPP.h" -#include "plugins/PluginManager.h" -#include "plugins/CC/CCInterface.h" -#include "plugins/CalculatePrice/CalculatePriceInterface.h" - -#include "support/VendingData.h" -#include "CalculatePrice/CalculatePriceDefault.h" - -class VMC; -class ATBHMIconfig; -class VendingData; -class QTimer; - -class AppControl : public QObject { - Q_OBJECT -public: - explicit AppControl(QObject *parent = nullptr); - - PROGRAM_MODE getCurrentProgramMode(); - bool requestProgramMode(PROGRAM_MODE newProgramMode); - - bool isProgramModeSELL(); - bool isProgramModeSELL_ENABLE(); - bool isProgramModeSERVICE(); - bool isProgramModeIDLE(); - bool isProgramModeOOO(); - -public slots: - void onRequestOfflineProcessing(); - - // e.g. by button event, - // by vmc screen command, - // by vmc data display command - // ... - void restartSellModeTimeoutTimer(); - - // slots for LED configuration: - void LEDs_default(); - void LEDs_ooo(); - - // CC-Plugin - void onCCStartTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCConfirmTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCCancelTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCRevertTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCPreAuthTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCBookTotalTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCCancelPreAuthTransactionResult(nsCCInterface::RESULT_STATE resultState, QString & result); - void onCCRequestCardInfoResult(nsCCInterface::RESULT_STATE resultState, QString & result); - - // CalculatePricePlugin - #ifdef USE_CALCULATEPRICE_PLUGIN - void onCalculatePrice(QString & licensePlate); - void onCalculatePrice(uint parktime); - void onCalculatePrice(QString & cardInfo, QString & cardTransactionInfo); - void onCalculatePrice(); - void onCalculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription); - void onProcessTransaction(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & errorCode, - const QString & errorDescription); - - QChar private_getAccessInformationField(const QString & accessInformationType); - QString private_calculatedPrice(nsCalculatePriceInterface::RESULT_STATE resultState, - const QString & accessInformation, - const QString & accessInformationType, - const QString & amountDuePeriodStart, - const QString & amountDuePeriodEnd, - const PriceInfo & priceInfo, - const QString & errorCode, - const QString & errorDescription); - #endif // USE_CALCULATEPRICE_PLUGIN - - - - // vmc control - void onVMCFormatedString(FormatedStringList data); - void onVMCSellData(quint8 nr,QString data); - - // deprecated vmc control for cc - // this allows cc control by screens - void onVMC_ccStartTransaction(); - void onVMC_ccCancelTransaction(); - void onVMC_ccConfirmTransaction(); - void onVMC_ccStartPreauthorisation(); - void onVMC_ccCancelPreauthorisation(); - void onVMC_ccConfirmPreauthorisation(); - void onVMC_ccStartReadCard(); - - // new control interface - void onControl_switchMode(quint16 mode); - void onControl_switchScreen(quint16 screen); - void onControl_setText(quint16 screenNr, quint16 textNr, quint16 lang, QString text); - void onShowCurrentIdle(); - void onShowCurrentOOO(); - - // vendingData - void onSetVendingData(QString key, QByteArray value); - - -signals: - // signals for signaling a mode change to sub-modules: - void changedProgramMode(PROGRAM_MODE newProgramMode); - void changedModeToSELL(); - void changedModeToSERVICE(); - void changedModeToIDLE(); - void changedModeToOOO(); - - void doOfflineProcessing(); - - // cc - - -protected: - bool eventFilter(QObject *obj, QEvent *ev); - -private: - PROGRAM_MODE programmode; - ATBHMIconfig *config; - ATB_system *system; - VMC *vmc; - VendingData *vendingData; - - PluginManager *pluginManager; - - void private_setupProgramModeSELL(); - void private_setupProgramModeSELL_ENABLE(); - void private_setupProgramModeSERVICE(); - void private_setupProgramModeIDLE(); - void private_setupProgramModeOOO(); - void private_unsetProgramModeSERVICE(); - void private_unsetProgramModeOOO(); - - // plugins - CCInterface *cc; - CalculatePriceInterface *calcPriceBackend; - - // init methods called from constructor - void private_initCCPlugin(); - void private_initCalculatePricePlugin(); - void private_initSimulationPlugin(); - - // timers - QTimer *sellModeTimeoutTimer; - - // flag to prepare for OOO in next idle - quint8 prepareInternalOOO; - - // action processing - quint8 startAction(APP_ACTION action); - -#if defined (ARCH_DesktopLinux) - void private_screenshot(); -#endif - -#if defined (CUST00318) - // hack for 00318/Nexobility - void private_CUST00318_handle_CC_ERROR_0x13(); -#endif - - // mouse detection -#if defined (ARCH_PTU4) - QFileSystemWatcher *pInputDeviceWatcher; - void setMouse(const QString & mouseDeviceFile, const QString & touchDeviceFile); - void closeMouse(const QString & mouseDeviceFile, const QString & touchDeviceFile); - bool mousePresent; -#endif - - -private slots: - - // firstRun -> things done with running event loop - void firstRun(); - - // timers - void onSellModeTimerTimeout(); - - - /******************************************** - * CC - Slots - */ - void onCCStartTransaction(); - void onCCStartConfirmTransaction(); - void onCCCancelTransaction(); - - void onCCStartPreauthorisation(); - void onCCConfirmPreauthorisation(); - void onCCCancelPreauthorisationRequest(); - - void onCCPrintReceipt(); - - void onCCErrorBackend(QString & result); - - void onCCStartReadCard(); - /*******************************************/ - - - // called, if system was woken up - void onWakeUp(); - - - /******************************************** - * Barcode / QR-Code - Slots - */ - #ifdef USE_BARCODESCANNER - // called, if a barcode was read from scanner - void onReadBarcode(QString & barcode); - - // called, if a new barcode should be created and sent to vmc - void onRequestNewBarcode(); - #endif - /*******************************************/ - -#if defined (Q_WS_QWS) - void onInputDeviceWatcher_directoryChanged(const QString& path); -#endif - - /******************************************** - * ISMAS - */ - void onProcessed_QRCode(QHash data); - - /******************************************** - * Signal System Errors - */ - void onSignalSystemErrors(const QString & errorCode, const QString & errorDescription); -}; - -#endif // APPCONTROL_H diff --git a/atb_system.cpp b/atb_system.cpp deleted file mode 100644 index 7a6a855..0000000 --- a/atb_system.cpp +++ /dev/null @@ -1,652 +0,0 @@ -#include "atb_system.h" -#include "ATBHMIconfig.h" -#include -#include -#include -#include -#include -#include -#include -#include - - -ATB_system::ATB_system(ATBHMIconfig *config, QObject *parent) : - QObject(parent) -{ - - this->config = config; - - this->tf_gpio = nullptr; - -#if defined (ARCH_PTU2) - if (config->hasFeatureTF()) init_touch_feedback(); -#elif defined (ARCH_PTU4) - if (config->hasFeatureTF()) init_touch_feedback(); -#endif - -} - - -ATB_system::~ATB_system() -{ - if (config->hasFeatureTF()) { - delete(this->tf_gpio_outstream); - delete(this->tf_gpio); - } -} - - - -void ATB_system::executeSystemCommand(quint16 cmd, QByteArray data) -{ - Q_UNUSED(data); - - switch (cmd) { - case SYS_COMMAND_SLEEP: - qDebug() << "ATB_system::executeSystemCommand(): " << cmd; - dbus_permitSuspend(); - break; - case SYS_COMMAND_DIMLOW: - if (config->hasFeatureDBusDisplayControl()) { - dbus_DimControlStart(); - } else { - this->DimLow(); - } - break; - case SYS_COMMAND_DIMHIGH: - if (config->hasFeatureDBusDisplayControl()) { - dbus_DimHighPermanent(); - } else { - this->DimHigh(); - } - break; - case SYS_COMMAND_BEEP: - if (config->hasFeatureTF()) this->Beep(); - break; - case SYS_COMMAND_MACHINE_NUMBER: // deprecated and not used - // setMachineNumber(data); - break; - case SYS_COMMAND_LED_CONTROL: - this->privateConfigLED(data); - break; - case SYS_COMMAND_HALT: - this->halt(); - break; - case SYS_COMMAND_REBOOT: - this->reboot(); - break; - default: - qDebug() << "ATB_system::executeSystemCommand(): unknown command: " << cmd; - break; - } - -} - - - -/***************************************************************************** - * stubs for display control - * - * this methodes should later be scriptable an call corresponding methodes - * in DisplayControl via DBus. - */ - -void ATB_system::DimLow() { return; } - -void ATB_system::DimHigh() -{ - //if (config->hasFeatureDC()) - // this->dc->DimHigh(); -} - -//void ATB_system::Dim(quint8 value) { if (config->hasFeatureDC()) this->dc->Dim((uchar)value); } - -void ATB_system::DimStart() { return; } -void ATB_system::DimStop() { return; } - - -/***************************************************************************** - */ - -void ATB_system::Beep() { - qDebug() << "ATB_system::Beep(): now i should make a beep!"; -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QTimer::singleShot (BEEPTIMEOUT, this, SLOT(BeepStop()) ); - *(this->tf_gpio_outstream) << config->getTouchFeedbackOnValue(); - this->tf_gpio_outstream->flush(); -#endif -} - -void ATB_system::BeepStop() { -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - *(this->tf_gpio_outstream) << config->getTouchFeedbackOffValue(); - this->tf_gpio_outstream->flush(); -#endif -} - - -/******************************************************************************** - * set date/time - * - * Datestring format: YYYY-MM-DD hh:mm[:ss] - * This is a format that is accepted both by busybox-date (e.g. PTU2) and by - * coreutils-date. - * - * example: - * /bin/date -s "2015-08-05 17:55:00" - * - */ -void ATB_system::setDateTime(const QString & dateTimeString) -{ - QString datetimeCMD = "/bin/date -s " + dateTimeString; - -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QProcess::startDetached(datetimeCMD); - - // the following does not work on PTU2: - //QProcess::startDetached ("/sbin/hwclock -w"); -#endif - - -} - - - -/******************************************************************************** - * static functions to write single values to files. - * - * Used e.g. to store some machine specific settings like customer number or machine - * number in filesystem. - * - * This data should be updated rarely and the calling function must keep this in mind! - * - * Note: QFile::open() creates a file, if it is not existing. - */ - -quint8 ATB_system::setPSAConfigInt(const QString &filename, quint16 iValue) -{ - return setPSAConfigString(filename, QString::number(iValue)); -} - - -quint8 ATB_system::setPSAConfigString(const QString & filename, const QString & sValue) -{ -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFile file(filename); -#else - QFile file(QDir::homePath() + filename); -#endif - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "ATB_system::setPSAConfigString() cannot open file: " << filename; - qDebug() << " file.errorString() = " << file.errorString(); - return 0; - } - - qDebug() << "ATB_system::setPSAConfigString() write file: " << filename; - - QTextStream out(&file); - out << sValue; - out.flush(); - - file.close(); - - return 1; -} - - -quint16 ATB_system::readPSAConfigInt(const QString & filename) -{ - bool ok; - quint16 result = (quint16)readPSAConfigString(filename).toInt(&ok); - - if (!ok) { - result = 0; - } - - return result; -} - - - -QString ATB_system::readPSAConfigString(const QString & filename) -{ -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFileInfo fileinfo(filename); -#else - QFileInfo fileinfo(QDir::homePath() + filename); -#endif - if (! fileinfo.isReadable() ) { - qDebug() << "ATB_system::readPSAConfigString(): \"" << filename << "\" is not readable"; - return 0; - } - -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFile file(filename); -#else - QFile file(QDir::homePath() + filename); -#endif - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "ATB_system::readPSAConfigString() cannot open file: " << filename; - return 0; - } - - QTextStream in(&file); - - QString stringValue = in.readLine(100); - qDebug() << "ATB_system::readPSAConfigString() stringValue = " << stringValue; - - file.close(); - - return stringValue; -} - - -/******************************************************************************** - * LED control interface - * - */ -void ATB_system::onConfigLED(LED_NAME LED, LED_TRIGGER trigger, quint16 delayOn, quint16 delayOff) -{ - QString LEDPath = "/sys/class/leds/"; - QString LEDName = ""; - QString LEDtrigger = ""; - - // DEBUG - - - - // //////// - - - switch (LED) { -#if defined (ARCH_PTU2) - case ATB_LED1: LEDName.append("atb_led1"); break; - case ATB_LED2: LEDName.append("atb_led2"); break; - case ATB_LED3: LEDName.append("atb_led3"); break; - case ATB_LED4: LEDName.append("atb_led4"); break; -#elif defined (ARCH_PTU4) - case ATB_LED1: LEDName.append("D504"); break; - case ATB_LED2: LEDName.append("D503"); break; - case ATB_LED3: LEDName.append("D502"); break; - case ATB_LED4: LEDName.append("D501"); break; -#endif - default: return; - } - - switch (trigger) { - case LED_TRIGGER_NONE: LEDtrigger.append("none"); break; - case LED_TRIGGER_TIMER: LEDtrigger.append("timer"); break; -#if defined (ARCH_PTU2) - case LED_TRIGGER_DEFAULT_ON: LEDtrigger.append("default-on"); break; -#elif defined (ARCH_PTU4) - /* note: ptu4 leds currently do not support 'default-on' trigger - * workaround is to set delay_off to '0' - */ - case LED_TRIGGER_DEFAULT_ON: LEDtrigger.append("timer"); - trigger = LED_TRIGGER_TIMER; - delayOn = 1; - delayOff = 0; - break; -#endif - default: return; - } - - QString filename = LEDPath + LEDName + "/trigger"; - - // set trigger - this->privateSetLEDTrigger(filename, LEDtrigger); - - - // set delays for trigger 'timer' - if (trigger == LED_TRIGGER_TIMER) { - - // set delay on - if (delayOn != 0) { - filename = LEDPath + LEDName + "/delay_on"; - this->privateSetLEDDelayOn(filename, QString::number(delayOn)); - } - - // set delay off - if (delayOff != 0) { - filename = LEDPath + LEDName + "/delay_off"; - this->privateSetLEDDelayOn(filename, QString::number(delayOff)); - } - - } - - return; -} - -/***************************************************************************** - * wrapper function for LED control. - * - * TODO: Test, check: plausibillity, cmd.lenght(), type casts to LED_NAME, LED_TRIGGER - */ -void ATB_system::privateConfigLED(const QByteArray & cmd) -{ - quint16 delayOn = (quint8)cmd.at(3) + ((quint16)(cmd.at(2) << 8)); - quint16 delayOff = (quint8)cmd.at(5) + ((quint16)(cmd.at(4) << 8)); - - this->onConfigLED((LED_NAME)cmd.at(0), (LED_TRIGGER)cmd.at(1), delayOn, delayOff); -} - -void ATB_system::privateSetLEDTrigger(const QString & led, const QString & trigger) -{ -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFile file(led); -#else - QFile file(QDir::homePath() + led); -#endif - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "ATB_system::onConfigLED() cannot open file: " << led; - qDebug() << " file.errorString() = " << file.errorString(); - return; - } - - qDebug() << "ATB_system::onConfigLED() write file: " << led; - - QTextStream out(&file); - out << trigger; - out.flush(); - - file.close(); -} - - -void ATB_system::privateSetLEDDelayOn(const QString & led, const QString & delayOn) -{ -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFile file(led); -#else - QFile file(QDir::homePath() + led); -#endif - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "ATB_system::onConfigLED() cannot open file: " << led; - qDebug() << " file.errorString() = " << file.errorString(); - return; - } - - qDebug() << "ATB_system::onConfigLED() write file: " << led; - - QTextStream out(&file); - out << delayOn; - out.flush(); - - file.close(); -} - - -void ATB_system::privateSetLEDDelayOff(const QString & led, const QString & delayOff) -{ -#if defined (ARCH_PTU2) || defined (ARCH_PTU4) - QFile file(led); -#else - QFile file(QDir::homePath() + led); -#endif - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "ATB_system::onConfigLED() cannot open file: " << led; - qDebug() << " file.errorString() = " << file.errorString(); - return; - } - - qDebug() << "ATB_system::onConfigLED() write file: " << led; - - QTextStream out(&file); - out << delayOff; - out.flush(); - - file.close(); -} - - -/***************************************************************************** - * functions for switching blink button on/off - * This is only available on PTU4 - */ -void ATB_system::switchBlinkButtonOn() -{ - this->privateSwitchBlinkButton(true); -} - -void ATB_system::switchBlinkButtonOff() -{ - this->privateSwitchBlinkButton(false); -} - -void ATB_system::privateSwitchBlinkButton(bool on) -{ -#if defined (ARCH_PTU2) - -#elif defined (ARCH_PTU4) - QString BlinkLED("/sys/class/leds/TIMER_RESET/brightness"); - - QFile file(BlinkLED); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - qDebug() << "ATB_system::privateSwitchBlinkButton() cannot open file: " << BlinkLED; - qDebug() << " file.errorString() = " << file.errorString(); - return; - } - - QTextStream out(&file); - - if (on) { out << "0"; } - else { out << "1"; } - - out.flush(); - - file.close(); - - -#else - Q_UNUSED(on) -#endif -} - - -/***************************************************************************** - * halt system. - * - */ -void ATB_system::halt() -{ - QProcess::startDetached("/sbin/halt"); -} - -/***************************************************************************** - * reboot system. - * - */ -void ATB_system::reboot() -{ - QProcess::startDetached("/sbin/reboot"); -} - - -/***************************************************************************** - * functions for wake vmc - * This is only available on PTU4 - */ -void ATB_system::onWakeVMC() -{ -#if defined (ARCH_PTU2) - -#elif defined (ARCH_PTU4) - if (config->hasFeatureDBusSuspendControl()) { - this->dbus_wakeSystem(); - } -#endif -} - - - -/***************************************************************************** - * get event device name by a type: - * - * e.g. type is TOUCHSCREEN: - * getEventDeviceName(TOUCHSCREEN) returns "/dev/input/event0" - * - */ -QString ATB_system::getEventDeviceName(DEVICE_TYPE type) -{ - QString procDevices = "/proc/bus/input/devices"; - - QFile inFile(procDevices); - if (!inFile.open(QFile::ReadOnly)) { - qCritical() << "ATB_system::getEventDeviceName() ERROR open()" << procDevices; - return ""; - } - - QTextStream textInStream(&inFile); - QString line; - QString N_RegExp; - QString DeviceTypeName; - int lineCounter = 0; - bool typeFound = false; - QString H_RegExp = "^H: Handlers"; // H: Handlers=kbd event2 - QString eventDeviceName = ""; - QString eventPart; - QStringList devNames; - QString DeviceNamePattern; - - //PTU4 Touchscreen N: Name="atmel_mxt_ts T100 touchscreen" - //PTU4 GPIO kys N: Name="gpio_keys.6" - //RFID Reader, Stronglink SL040 N: Name="StrongLink USB CardReader" - //2D Scanner, Datalogig DSE0420 N: Name="Datalogic ADC Inc. Handheld Barcode Scanner" VID: 05f9, PID:4005 - //2D Scanner, Datalogig DSM0400 N: Name="Datalogic Handheld Barcode Scanner" VID: 05f9, PID:4005 - //2D Scanner, Honeywell N56000 N: Name="Honeywell Imaging & Mobility N5600" - //2D Scanner, Newland FM3080 N: Name="Newland Auto-ID NLS-FM3080V2-20 USB POS KBW" VID: 1eab, PID:0022 - //2D Scanner, Opticon MDI-4000 N: Name="Opticon Opticon USB Barcode Reader" - //USB Mouse N: Name="Logitech USB-PS/2 Optical Mouse" - - /* Datalogic DSE0420 - I: Bus=0003 Vendor=05f9 Product=4005 Version=0110 - N: Name="Datalogic ADC Inc. Handheld Barcode Scanner" - P: Phys=usb-700000.ehci-2.3/input2 - S: Sysfs=/devices/ahb.0/700000.ehci/usb1/1-2/1-2.3/1-2.3:1.2/input/input14 - U: Uniq=S/N G16C15795 - H: Handlers=kbd event3 - B: PROP=0 - B: EV=120013 - B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe - B: MSC=10 - B: LED=1f - */ - /* Datalogic DSM04XX - I: Bus=0003 Vendor=05f9 Product=4005 Version=0110 - N: Name="Datalogic Handheld Barcode Scanner" - P: Phys=usb-700000.ehci-2.3/input0 - S: Sysfs=/devices/ahb.0/700000.ehci/usb1/1-2/1-2.3/1-2.3:1.0/input/input15 - U: Uniq=S/N G21FA0180 - H: Handlers=kbd event3 - B: PROP=0 - B: EV=120013 - B: KEY=e080ffdf 1cfffff ffffffff fffffffe - B: MSC=10 - B: LED=1f - */ - /* - I: Bus=0003 Vendor=1eab Product=0022 Version=0110 - N: Name="Newland Auto-ID NLS-FM3080V2-20 USB POS KBW" - P: Phys=usb-700000.ehci-2.2/input0 - S: Sysfs=/devices/ahb.0/700000.ehci/usb1/1-2/1-2.2/1-2.2:1.0/input/input6 - U: Uniq=FM3080V2-20-BH00017 - H: Handlers=kbd event2 - B: PROP=0 - B: EV=120013 - B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe - B: MSC=10 - B: LED=1f - */ - - - switch (type) { - case EVENT_DEVICE_BARCODEREADER: - N_RegExp = "^N: Name=.+(Barcode|Honeywell Imaging|Newland Auto).+"; - DeviceTypeName = "1D/2D-Scanner"; - DeviceNamePattern = "event"; - break; - case EVENT_DEVICE_TOUCHSCREEN: - N_RegExp = "^N: Name=.+touch.+"; - DeviceTypeName = "Touchscreen"; - DeviceNamePattern = "event"; - break; - case EVENT_DEVICE_GPIO_KEYBOARD: - N_RegExp = "^N: Name=.+gpio.+"; - DeviceTypeName = "gpio-keys"; - DeviceNamePattern = "event"; - break; - case EVENT_DEVICE_KEYBOARD: - N_RegExp = "^N: Name=.+touch.+"; - DeviceTypeName = "keyboard"; - DeviceNamePattern = "event"; - break; - case EVENT_DEVICE_RFIDREADER: - N_RegExp = "^N: Name=.+Card.+"; - DeviceTypeName = "card reader"; - DeviceNamePattern = "event"; - break; - case EVENT_DEVICE_USBMOUSE: - N_RegExp = "^N: Name=.+USB.+Mouse.+"; - DeviceTypeName = "USB Mouse"; - DeviceNamePattern = "mouse"; - break; - } - - qDebug() << "ATB_system::getEventDeviceName() N_RegExp = " << N_RegExp; - - do { - line = textInStream.readLine(); - - // DEBUG - //qDebug() << " " << line; - - // find "N:"-line: - if (line.contains(QRegExp(N_RegExp))) { - typeFound = true; - lineCounter = 0; - - qDebug() << "ATB_system::getEventDeviceName() found N_RegExp = " << N_RegExp; - - } - - if (typeFound) { - // found "N:"-line, now search for "H:"-line; - // the corresponding "H:"-line should be within the next 7 following text lines. - - // example lines: - // - "H: Handlers=event0 mouse0" -> for touchscreen on PTU4 - // - "H: Handlers=event3 mouse1" -> for USB mouse on PTU4 - - lineCounter++; - if ( (lineCounter<=7) && (line.contains(QRegExp(H_RegExp))) ) { - eventPart = line.split("=", QString::SkipEmptyParts).takeLast(); - devNames = eventPart.split(" ", QString::SkipEmptyParts); - - for (int i=0; i -#include -#include -#include "version.h" - - -#define SYS_COMMAND_SLEEP 0x0001 -#define SYS_COMMAND_DIMLOW 0x0002 -#define SYS_COMMAND_DIMHIGH 0x0003 -#define SYS_COMMAND_BEEP 0x0004 -#define SYS_COMMAND_MACHINE_NUMBER 0x0005 -#define SYS_COMMAND_HALT 0x0006 -#define SYS_COMMAND_REBOOT 0x0007 -#define SYS_COMMAND_LED_CONTROL 0x3600 - - -#if defined (ARCH_PTU2) - #define BEEPTIMEOUT 200 -#elif defined (ARCH_PTU4) - #define BEEPTIMEOUT 100 -#else - #define BEEPTIMEOUT 100 -#endif - -class ATBHMIconfig; - -class ATB_system : public QObject { - Q_OBJECT - -private: - ATBHMIconfig *config; - QFile *tf_gpio; - QTextStream *tf_gpio_outstream; - - quint8 current_dim_value; - - void privateConfigLED(const QByteArray & cmd); - void privateSetLEDTrigger(const QString & led, const QString & trigger); - void privateSetLEDDelayOn(const QString & led, const QString & delayOn); - void privateSetLEDDelayOff(const QString & led, const QString & delayOff); - void privateSwitchBlinkButton(bool on); - -public: - explicit ATB_system(ATBHMIconfig *config, QObject *parent = nullptr); - ~ATB_system(); - - - static quint8 setPSAConfigInt(const QString & filename, quint16 iValue); - static quint16 readPSAConfigInt(const QString &filename); - - static quint8 setPSAConfigString(const QString & filename, const QString & sValue); - static QString readPSAConfigString(const QString & filename); - - enum LED_NAME { - ATB_LED1 = 1, - ATB_LED2, - ATB_LED3, - ATB_LED4 - }; - - enum LED_TRIGGER { - LED_TRIGGER_NONE = 1, - LED_TRIGGER_TIMER, - LED_TRIGGER_DEFAULT_ON - }; - - enum DEVICE_TYPE { - EVENT_DEVICE_BARCODEREADER, - EVENT_DEVICE_TOUCHSCREEN, - EVENT_DEVICE_GPIO_KEYBOARD, - EVENT_DEVICE_KEYBOARD, - EVENT_DEVICE_RFIDREADER, - EVENT_DEVICE_USBMOUSE - }; - - static QString getEventDeviceName(DEVICE_TYPE type); - static quint8 setupInductionLoops(); - - - void dbus_permitSuspend(); - void dbus_preventSuspend(); - - void dbus_DimHighPermanent(); - void dbus_DimControlStart(); - - void dbus_wakeSystem(); - -signals: - /* emitted, after waking up from suspend... - */ - void wakeUp(); - -public slots: - void executeSystemCommand(quint16 cmd, QByteArray data); - void DimHigh(); - void DimLow(); - void Dim(quint8 value); - void DimStart(); - void DimStop(); - void Beep(); - void BeepStop(); - void setDateTime(const QString &dateTimeString); - - void onConfigLED(LED_NAME LED, LED_TRIGGER trigger, quint16 delayOn = 0, quint16 delayOff = 0); - - void switchBlinkButtonOn(); - void switchBlinkButtonOff(); - - void onWakeVMC(); - void halt(); - void reboot(); -}; - -#endif // ATB_SYSTEM_H