diff --git a/DCPlugin.pro b/DCPlugin.pro index 38da3bc..0e7cb1d 100644 --- a/DCPlugin.pro +++ b/DCPlugin.pro @@ -71,8 +71,16 @@ DEFINES += QT_DEPRECATED_WARNINGS #else: unix:!android: target.path = /opt/$${TARGET}/bin #!isEmpty(target.path): INSTALLS += target +# ATBAPP interface +HEADERS += \ + src/ATBAPP/ATBAPPplugin.h \ + src/ATBAPP/DeviceControllerInterface.h \ + src/ATBAPP/ATBHealthEvent.h \ + src/ATBAPP/ATBDeviceControllerPlugin.h - +SOURCES += \ + src/ATBAPP/ATBHealthEvent.cpp \ + src/ATBAPP/ATBDeviceControllerPlugin.cpp DISTFILES += \ generate-version.sh diff --git a/include/hwapi.h b/include/hwapi.h index 03b6135..058e0da 100644 --- a/include/hwapi.h +++ b/include/hwapi.h @@ -99,7 +99,6 @@ class hwapi : public QObject, public hwinf { Q_OBJECT - Q_PLUGIN_METADATA(IID "Atb.Psa2020.software.HWapi/1.0" ) //FILE "HWapi.json") Q_INTERFACES(hwinf) DownloadResult sendNextAddress(int bNum) const; diff --git a/src/ATBAPP/ATBAPPplugin.h b/src/ATBAPP/ATBAPPplugin.h new file mode 100644 index 0000000..ec017f5 --- /dev/null +++ b/src/ATBAPP/ATBAPPplugin.h @@ -0,0 +1,22 @@ +#ifndef ATBAPPPLUGIN_H +#define ATBAPPPLUGIN_H + +/*********************************************************** + * a simple class with only one method for plugin info + */ +#include +#include + +class ATBAPPplugin +{ + +public: + virtual const QString & getPluginInfo() = 0; +}; + +Q_DECLARE_INTERFACE(ATBAPPplugin, + "eu.atb.ptu.plugin.ATBAPPplugin/0.9") + + + +#endif // ATBAPPPLUGIN_H diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.cpp b/src/ATBAPP/ATBDeviceControllerPlugin.cpp new file mode 100644 index 0000000..00d6d04 --- /dev/null +++ b/src/ATBAPP/ATBDeviceControllerPlugin.cpp @@ -0,0 +1,129 @@ +#include "src/ATBAPP/ATBDeviceControllerPlugin.h" +#include "src/ATBAPP/ATBHealthEvent.h" + + +ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent) : QObject(parent), + pluginState(PLUGIN_STATE::NOT_INITIALIZED) +{ + this->pluginInfo = QString::fromUtf8(pluginInfoString.c_str()); + + this->hw = new hwapi(); +} + +ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {} + +PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *healthEventReceiver, const QSettings & settings) +{ + this->healthEventReceiver = healthEventReceiver; + + // Read a sample variable from setting + QString sampleSetting = settings.value("DEVICE_CONTROLLER/sampleVariable", "defaultValue").toString(); + + this->pluginState = PLUGIN_STATE::INITIALIZED; + + return pluginState; +} + + +// TASKS: Cash handling ------------------------------------------------------- +void ATBDeviceControllerPlugin::requestStartCashInput(const QString & amount) +{ + +} + +void ATBDeviceControllerPlugin::requestStopCashInput() +{ + +} + +void ATBDeviceControllerPlugin::cashCollect() +{ + +} + +void ATBDeviceControllerPlugin::cashAbort() +{ + +} + + +// TASKS: printing ------------------------------------------------------------ +void ATBDeviceControllerPlugin::requestPrintTicket(const QHash & printingData) +{ + struct T_dynDat *dynTicketData = new T_dynDat; + + strncpy((char*)dynTicketData->licensePlate, printingData["licenseplate"].toByteArray().data(), 7); + strncpy((char*)dynTicketData->vendingPrice, printingData["amount"].toByteArray().data(), 7); + strncpy((char*)dynTicketData->parkingEnd, printingData["parkingend"].toByteArray().data(), 7); + strncpy((char*)dynTicketData->currentTime, printingData["currentTime"].toByteArray().data(), 7); + strncpy((char*)dynTicketData->currentDate, printingData["currentDate"].toByteArray().data(), 7); + + this->hw->prn_printDocument(1, dynTicketData); +} + + + + +/************************************************************************************************ + * Mandatory plugin methods + * + */ + +PLUGIN_STATE ATBDeviceControllerPlugin::getState() +{ + return this->pluginState; +} + +quint32 ATBDeviceControllerPlugin::getLastError() +{ + return this->errorCode; +} + +const QString & ATBDeviceControllerPlugin::getLastErrorDescription() +{ + return this->errorDescription; +} + +const QString & ATBDeviceControllerPlugin::getPluginInfo() +{ + return this->pluginInfo; +} + + +const QString ATBDeviceControllerPlugin::getString(nsDeviceControllerInterface::RESULT_STATE resultState) +{ + QString str; + + switch (resultState) { + case nsDeviceControllerInterface::RESULT_STATE::SUCCESS: + str = QString("RESULT_STATE::SUCCESS"); + break; + case nsDeviceControllerInterface::RESULT_STATE::ERROR_BACKEND: + str = QString("RESULT_STATE::ERROR_BACKEND"); + break; + case nsDeviceControllerInterface::RESULT_STATE::ERROR_TIMEOUT: + str = QString("RESULT_STATE::ERROR_TIMEOUT"); + break; + case nsDeviceControllerInterface::RESULT_STATE::ERROR_PROCESS: + str = QString("RESULT_STATE::ERROR_PROCESS"); + break; + case nsDeviceControllerInterface::RESULT_STATE::ERROR_RETRY: + str = QString("RESULT_STATE::ERROR_RETRY"); + break; + case nsDeviceControllerInterface::RESULT_STATE::INFO: + str = QString("RESULT_STATE::INFO"); + break; + } + return str; + +} + + + +/************************************************************************************************ + * ... end + */ + +#if QT_VERSION < 0x050000 +Q_EXPORT_PLUGIN2( ATBDeviceControllerPlugin, ATBDeviceControllerPlugin ) +#endif diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.h b/src/ATBAPP/ATBDeviceControllerPlugin.h new file mode 100644 index 0000000..d5fae21 --- /dev/null +++ b/src/ATBAPP/ATBDeviceControllerPlugin.h @@ -0,0 +1,108 @@ +#ifndef ATBDEVICECONTROLLERPLUGIN_H +#define ATBDEVICECONTROLLERPLUGIN_H + +#include + +#include "src/ATBAPP/DeviceControllerInterface.h" +#include "src/ATBAPP/ATBAPPplugin.h" +#include "version.h" + + + +#include "interfaces.h" +#include "hwapi.h" + +#include +#include +#include +#include + + + +using namespace nsDeviceControllerInterface; + +class QSettings; + +class ATBDeviceControllerPlugin : public QObject, + public DeviceControllerInterface +{ + Q_OBJECT + Q_INTERFACES(ATBAPPplugin) + Q_INTERFACES(DeviceControllerInterface) + #if QT_VERSION >= 0x050000 + Q_PLUGIN_METADATA( IID "ATBDeviceControllerPlugin" ) + #endif + +public: + explicit ATBDeviceControllerPlugin(QObject *parent = nullptr); + ~ATBDeviceControllerPlugin(); + + // ---------------------------------------------------------------------------- + // interface: + PLUGIN_STATE initDCPlugin(QObject *healthEventReceiver, const QSettings & settings); + + // TASKS: Cash handling ------------------------------------------------------- + void requestStartCashInput(const QString & amount); + void requestStopCashInput(); + void cashCollect(); + void cashAbort(); + + // TASKS: printing ------------------------------------------------------------ + void requestPrintTicket(const QHash & printingData); + + // mandantory ATBAPP plugin methods: ------------------------------------------ + nsDeviceControllerInterface::PLUGIN_STATE getState(); + quint32 getLastError(); + const QString & getLastErrorDescription(); + + const QString & getPluginInfo(); + + // helpers e.g. for debug / log + const QString getString(nsDeviceControllerInterface::RESULT_STATE resultState); + + + + + +signals: + void printTicketFinished(nsDeviceControllerInterface::RESULT_STATE resultState, + const QString & errorCode, + const QString & errorDescription); + + void cashInputEvent(nsDeviceControllerInterface::RESULT_STATE resultState, + nsDeviceControllerInterface::CASH_STATE cashState, + const QString & newCashValue, + const QString & errorCode, + const QString & errorDescription); + + void cashInputFinished(nsDeviceControllerInterface::RESULT_STATE resultState, + const QString & newCashValue, + const QString & errorCode, + const QString & errorDescription); + + void requestServiceMode(); + + void Error( + const QString & errorCode, + const QString & errorDescription); + + + + +private: + quint32 errorCode; + QString errorCodeString; + QString errorDescription; + QString pluginInfo; + + bool useDebug; + + PLUGIN_STATE pluginState; + + QObject* healthEventReceiver; + + hwinf* hw; + +}; + +#endif // ATBDEVICECONTROLLERPLUGIN_H diff --git a/src/ATBAPP/ATBHealthEvent.cpp b/src/ATBAPP/ATBHealthEvent.cpp new file mode 100644 index 0000000..3805a2a --- /dev/null +++ b/src/ATBAPP/ATBHealthEvent.cpp @@ -0,0 +1,25 @@ +#include "src/ATBAPP/ATBHealthEvent.h" + +ATBHealthEvent::ATBHealthEvent(ATB_HEALTH_MODE mode, const QString & errorNumber, const QString & errorDescription) : + QEvent(ATB_HEALTH_EVENT), + healthMode(mode), + errorNumber(errorNumber), + errorDescription(errorDescription) +{ + +} + +QString ATBHealthEvent::getErrorNumber() +{ + return this->errorNumber; +} + +QString ATBHealthEvent::getErrorDescription() +{ + return this->errorDescription; +} + +ATB_HEALTH_MODE ATBHealthEvent::getMode() +{ + return this->healthMode; +} diff --git a/src/ATBAPP/ATBHealthEvent.h b/src/ATBAPP/ATBHealthEvent.h new file mode 100644 index 0000000..b0874d7 --- /dev/null +++ b/src/ATBAPP/ATBHealthEvent.h @@ -0,0 +1,44 @@ +#ifndef ATBHEALTHEVENT_H +#define ATBHEALTHEVENT_H + +#include +#include + +enum class ATB_HEALTH_MODE : quint8; + +const QEvent::Type ATB_HEALTH_EVENT = static_cast(QEvent::User + 1); + + +class ATBHealthEvent : public QEvent +{ + +public: + ATBHealthEvent(ATB_HEALTH_MODE mode, const QString & errorNumber, const QString & errorDescription); + + QString getErrorNumber(); + QString getErrorDescription(); + ATB_HEALTH_MODE getMode(); + +signals: + +public slots: + + +private: + ATB_HEALTH_MODE healthMode; + QString errorNumber; + QString errorDescription; +}; + + +enum class ATB_HEALTH_MODE : quint8 { + WARNING, + ERROR, + WARNING_CORRECTION, + ERROR_CORRECTION, + DEBUG, + STATE, + UNSPECIFIED +}; + +#endif // ATBHEALTHEVENT_H diff --git a/src/ATBAPP/DeviceControllerInterface.h b/src/ATBAPP/DeviceControllerInterface.h new file mode 100644 index 0000000..2f4641a --- /dev/null +++ b/src/ATBAPP/DeviceControllerInterface.h @@ -0,0 +1,142 @@ +#ifndef DEVICECONTROLLERINTERFACE_H +#define DEVICECONTROLLERINTERFACE_H + +#include + +#include +#include + +#include "ATBAPPplugin.h" + +namespace nsDeviceControllerInterface { + enum class PLUGIN_STATE : quint8; + enum class RESULT_STATE : quint8; + enum class CASH_STATE : quint8; +} + + +class DeviceControllerInterface : public ATBAPPplugin +{ + Q_INTERFACES(ATBAPPplugin) + +public: + virtual ~DeviceControllerInterface() {} + + virtual nsDeviceControllerInterface::PLUGIN_STATE initDCPlugin(QObject *healthEventReceiver, + const QSettings & settings) = 0; + + // TASKS: Cash handling ------------------------------------------------------- + /** + * enables coin input + * amount = "0": pay-up + * amount > "0": pay-down + */ + virtual void requestStartCashInput(const QString & amount) = 0; + + /** + * called e.g. on Button "NEXT" in pay-up (direct coin input) + */ + virtual void requestStopCashInput() = 0; + + /** + * called e.g. on Button "NEXT" in pay-up (direct coin input) + */ + virtual void cashCollect() = 0; + virtual void cashAbort() = 0; + + + + // TASKS: printing ------------------------------------------------------------ + virtual void requestPrintTicket(const QHash & printingData) = 0; + + + // mandantory ATBAPP plugin methods: + virtual nsDeviceControllerInterface::PLUGIN_STATE getState() = 0; + virtual quint32 getLastError() = 0; + virtual const QString & getLastErrorDescription() = 0; + + // return a plugin description in JSON or XML + // -> ATBAPPplugin::getPluginInfo() + + // helpers e.g. for debug / log + virtual const QString getString(nsDeviceControllerInterface::RESULT_STATE resultState) = 0; + + +signals: + virtual void printTicketFinished(nsDeviceControllerInterface::RESULT_STATE resultState, + const QString & errorCode, + const QString & errorDescription) = 0; + + /** + * emitted on e.g. a coin input + */ + virtual void cashInputEvent(nsDeviceControllerInterface::RESULT_STATE resultState, + nsDeviceControllerInterface::CASH_STATE cashState, + const QString & newCashValue, + /* additional variables? */ + const QString & errorCode, + const QString & errorDescription) = 0; + + /** + * emitted if cashInput has been stopped, e.g. in result to task requestStopCashInput(): + * -> shutter is blocked + * -> no cash input is possible + * -> coins are in cache + */ + virtual void cashInputFinished(nsDeviceControllerInterface::RESULT_STATE resultState, + const QString & newCashValue, + /* additional variables? */ + const QString & errorCode, + const QString & errorDescription) = 0; + + + /** + * emitted e.g. if service door is opened + */ + virtual void requestServiceMode() = 0; + + /** + * emitted on error + * depending on errorCode: + * -> interrupt selling process + * -> machine can go to state OOO + * -> send error event to ISMAS + * -> ... + */ + virtual void Error( + /* additional variables? */ + const QString & errorCode, + const QString & errorDescription) = 0; + +}; + + +Q_DECLARE_INTERFACE(DeviceControllerInterface, + "eu.atb.ptu.plugin.DeviceControllerInterface/1.0") + + +namespace nsDeviceControllerInterface { + + enum class PLUGIN_STATE : quint8 { + NOT_INITIALIZED = 0, + INITIALIZED = 1 + }; + + enum class RESULT_STATE : quint8 { + SUCCESS = 1, // operation was successfull + ERROR_BACKEND, // error from backend (e.g. backend replies with error) + ERROR_TIMEOUT, // the operation timed out + ERROR_PROCESS, // internal plugin error, should not occur (this is a bug in implementation) + ERROR_RETRY, // retry operation + INFO // informational (e.g. display a message, log something etc.) + }; + + enum class CASH_STATE : quint8 { + CACHE_EMPTY, // Cache still empty, default state + CACHE_INPUT, // Coins are in Cache + OVERPAYED, + /* t.b.d. */ + }; +} + +#endif // DEVICECONTROLLERINTERFACE_H