Compare commits

...

6 Commits
2.1.1 ... 2.2.3

5 changed files with 115 additions and 26 deletions

View File

@@ -30,13 +30,31 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
this->setParent(parent); this->setParent(parent);
this->pluginInfo = QString::fromUtf8(pluginInfoString.c_str()); this->pluginInfo = QString::fromUtf8(pluginInfoString.c_str());
}
ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {}
PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, const QSettings & settings)
{
this->eventReceiver = eventReceiver;
// read variables from setting
this->serialPortName = settings.value("ATBDeviceControllerPlugin/serialPort", "ttymxc2").toString();
QByteArray printerEncoding = settings.value("ATBDeviceControllerPlugin/printerEncoding", "ISO 8859-2").toString().toLatin1();
QString printerLocaleString = settings.value("ATBDeviceControllerPlugin/printerLocale", "de_DE").toString().toLatin1();
this->printerLocale = QLocale(printerLocaleString);
if (!this->private_loadCashAgentLib("")) {
return;
}
this->init_sc_dbus(); this->init_sc_dbus();
QString persistentDataFile = "/mnt/system_data/dc_persistentData.dat";
this->persistentData = new PersistentData(persistentDataFile);
// setup libCA:
if (!this->private_loadCashAgentLib("")) {
return PLUGIN_STATE::NOT_INITIALIZED;
}
//connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_OK()), this, SLOT(onPrintFinishedOK()), Qt::QueuedConnection); //connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_OK()), this, SLOT(onPrintFinishedOK()), Qt::QueuedConnection);
//connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_Err()), this, SLOT(onPrintFinishedERR()), Qt::QueuedConnection); //connect(dynamic_cast<QObject*>(hw), SIGNAL(hwapi_templatePrintFinished_Err()), this, SLOT(onPrintFinishedERR()), Qt::QueuedConnection);
@@ -61,9 +79,6 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
dynamic_cast<QObject*>(hw)->moveToThread(hwThread); dynamic_cast<QObject*>(hw)->moveToThread(hwThread);
hwThread->start(); hwThread->start();
QString persistentDataFile = "/mnt/system_data/dc_persistentData.dat";
this->persistentData = new PersistentData(persistentDataFile);
this->diag = new DeviceControllerDiag(this->persistentData, this); this->diag = new DeviceControllerDiag(this->persistentData, this);
connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage); connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage);
@@ -75,19 +90,7 @@ ATBDeviceControllerPlugin::ATBDeviceControllerPlugin(QObject *parent)
this->currentCashState = CASH_STATE::CACHE_EMPTY; this->currentCashState = CASH_STATE::CACHE_EMPTY;
this->cashStartAmountInt = 0; this->cashStartAmountInt = 0;
}
ATBDeviceControllerPlugin::~ATBDeviceControllerPlugin() {}
PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, const QSettings & settings)
{
this->eventReceiver = eventReceiver;
// read variables from setting
this->serialPortName = settings.value("ATBDeviceControllerPlugin/serialPort", "ttymxc2").toString();
QByteArray printerEncoding = settings.value("ATBDeviceControllerPlugin/printerEncoding", "ISO 8859-2").toString().toLatin1();
QString printerLocaleString = settings.value("ATBDeviceControllerPlugin/printerLocale", "de_DE").toString().toLatin1();
this->printerLocale = QLocale(printerLocaleString);
if (this->isMaster) { if (this->isMaster) {
@@ -134,6 +137,37 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con
} }
void ATBDeviceControllerPlugin::sendDeviceParameter(const QJsonObject &jsonObject)
{
qCritical() << "ATBDeviceControllerPlugin::sendDeviceParameter:";
// extract location info and store location info in persistent data:
QJsonValue jsonSubVal;
jsonSubVal = jsonObject["Location"];
QString locationString = jsonSubVal.toString("");
if (locationString == "") {
qCritical() << " --> locationString NULL";
return;
}
uint16_t customerNr = PTUSystem::readCustomerNumber();
uint16_t machineNr = PTUSystem::readMachineNumber();
uint16_t borough = PTUSystem::readZoneNumber();
uint16_t zone = PTUSystem::readGroupNumber();
uint16_t alias = 0;
QByteArray locationBa = locationString.toLocal8Bit();
this->hw->sendMachineID(customerNr, machineNr, borough, zone, alias, locationBa.data());
}
void ATBDeviceControllerPlugin::startPhysicalLayer() void ATBDeviceControllerPlugin::startPhysicalLayer()
{ {
if (!this->isMaster) return; if (!this->isMaster) return;
@@ -519,10 +553,14 @@ void ATBDeviceControllerPlugin::onAllDoorsClosed()
{ {
qCritical() << "ATBDeviceControllerPlugin::onAllDoorsClosed()"; qCritical() << "ATBDeviceControllerPlugin::onAllDoorsClosed()";
if (this->diag->isErrorState()) {
emit this->requestModeOOO();
}
else {
emit this->requestModeIDLE(); emit this->requestModeIDLE();
this->dbus->finishedBackgroundTask("DOOR_OPEN"); }
// TODO: check for errors and create a machine event this->dbus->finishedBackgroundTask("DOOR_OPEN");
} }
void ATBDeviceControllerPlugin::onNewVoltage(uint32_t voltage) void ATBDeviceControllerPlugin::onNewVoltage(uint32_t voltage)
@@ -1466,7 +1504,7 @@ int ATBDeviceControllerPlugin::init_sc_dbus()
void ATBDeviceControllerPlugin::onWokeUp(uchar source) void ATBDeviceControllerPlugin::onWokeUp(uchar source)
{ {
if (source == 0x01) { if (source == 0x01 || source == 0xFE) {
// woke up from device controller // woke up from device controller
this->diag->diagRequest(); this->diag->diagRequest();
} }

View File

@@ -44,6 +44,8 @@ public:
// interface: // interface:
PLUGIN_STATE initDCPlugin(QObject *eventReceiver, const QSettings & settings); PLUGIN_STATE initDCPlugin(QObject *eventReceiver, const QSettings & settings);
void sendDeviceParameter(const QJsonObject & jsonObject);
// TASKS: Cash handling ------------------------------------------------------- // TASKS: Cash handling -------------------------------------------------------
void requestStartCashInput(const QString & amount); void requestStartCashInput(const QString & amount);
void requestStopCashInput(); void requestStopCashInput();

View File

@@ -13,6 +13,7 @@ DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *paren
, isRequestRunning(false) , isRequestRunning(false)
, flagInterruptDiag(false) , flagInterruptDiag(false)
, lastState(DeviceController::State::INITIAL_STATE) , lastState(DeviceController::State::INITIAL_STATE)
, _isErrorState(false)
, pData(pData) , pData(pData)
{ {
diagRequestTimeoutTimer = new QTimer(this); diagRequestTimeoutTimer = new QTimer(this);
@@ -63,6 +64,24 @@ void DeviceControllerDiag::onDiagRequestTimeoutTimerTimeout()
this->flagInterruptDiag = true; this->flagInterruptDiag = true;
} }
bool DeviceControllerDiag::isErrorState()
{
return this->_isErrorState;
}
bool DeviceControllerDiag::isOperatingState()
{
return !this->_isErrorState;
}
QSet<DeviceController::State> DeviceControllerDiag::getCurrentMachineState()
{
return this->machineEventSet;
}
void DeviceControllerDiag::private_startDiag() void DeviceControllerDiag::private_startDiag()
{ {
// check for DiagRequestTimeoutTimerTimeout: // check for DiagRequestTimeoutTimerTimeout:
@@ -393,58 +412,72 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
case DeviceController::State::A000: // alarm / intrusion case DeviceController::State::A000: // alarm / intrusion
eventClass = EVENT_CLASS::ALARM; eventClass = EVENT_CLASS::ALARM;
parameter = "alarm / intrusion"; parameter = "alarm / intrusion";
this->_isErrorState = true;
break; break;
case DeviceController::State::E002: // real time clock error case DeviceController::State::E002: // real time clock error
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "real time clock error"; parameter = "real time clock error";
this->_isErrorState = true;
break; break;
case DeviceController::State::E003: // voltage error case DeviceController::State::E003: // voltage error
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "voltage error"; parameter = "voltage error";
this->_isErrorState = true;
break; break;
case DeviceController::State::E004: // temperature error case DeviceController::State::E004: // temperature error
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "temperature error"; parameter = "temperature error";
this->_isErrorState = true;
break; break;
case DeviceController::State::E007: // coin safe full case DeviceController::State::E007: // coin safe full
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "coin safe full"; parameter = "coin safe full";
this->_isErrorState = true;
break; break;
case DeviceController::State::E008: // bill acceptor full case DeviceController::State::E008: // bill acceptor full
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "bill acceptor full"; parameter = "bill acceptor full";
this->_isErrorState = true;
break; break;
case DeviceController::State::E009: // no cash box case DeviceController::State::E009: // no cash box
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "no cash box"; parameter = "no cash box";
this->_isErrorState = true;
break; break;
case DeviceController::State::E010: // coin escrow case DeviceController::State::E010: // coin escrow
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "coin escrow"; parameter = "coin escrow";
this->_isErrorState = true;
break; break;
case DeviceController::State::E011: // mem error int.ee. case DeviceController::State::E011: // mem error int.ee.
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "mem error int.ee."; parameter = "mem error int.ee.";
this->_isErrorState = true;
break; break;
case DeviceController::State::E018: // no paper case DeviceController::State::E018: // no paper
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "no paper"; parameter = "no paper";
this->_isErrorState = true;
break; break;
case DeviceController::State::E020: // printer error case DeviceController::State::E020: // printer error
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "printer error"; parameter = "printer error";
this->_isErrorState = true;
break; break;
case DeviceController::State::E025: // coin blocker case DeviceController::State::E025: // coin blocker
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "coin blocker"; parameter = "coin blocker";
this->_isErrorState = true;
break; break;
case DeviceController::State::E026: // error coin validator case DeviceController::State::E026: // error coin validator
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "error coin validator"; parameter = "error coin validator";
this->_isErrorState = true;
break; break;
case DeviceController::State::E034: // mdb error case DeviceController::State::E034: // mdb error
eventClass = EVENT_CLASS::ERROR; eventClass = EVENT_CLASS::ERROR;
parameter = "mdb error"; parameter = "mdb error";
this->_isErrorState = true;
break; break;
case DeviceController::State::E071: // cash box change is ongoing case DeviceController::State::E071: // cash box change is ongoing
@@ -480,6 +513,7 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
break; break;
case DeviceController::State::O000: // everything is fine case DeviceController::State::O000: // everything is fine
this->machineEventSet.clear(); this->machineEventSet.clear();
this->_isErrorState = false;
eventClass = EVENT_CLASS::OPERATE; eventClass = EVENT_CLASS::OPERATE;
parameter = ""; parameter = "";
if (this->lastState == DeviceController::State::O000) { if (this->lastState == DeviceController::State::O000) {

View File

@@ -72,6 +72,13 @@ public:
nsDeviceControllerInterface::COIN_PROCESSOR coinProcessorType; nsDeviceControllerInterface::COIN_PROCESSOR coinProcessorType;
nsDeviceControllerInterface::BILL_ACCEPTOR billAcceptor; nsDeviceControllerInterface::BILL_ACCEPTOR billAcceptor;
/**
* return true, if machineEventSet contains an error
*/
bool isErrorState();
bool isOperatingState();
QSet<DeviceController::State> getCurrentMachineState();
public slots: public slots:
void diagRequest(); void diagRequest();
@@ -95,6 +102,7 @@ private:
DeviceController::State lastState; DeviceController::State lastState;
QSet<DeviceController::State> machineEventSet; QSet<DeviceController::State> machineEventSet;
bool _isErrorState;
PersistentData* pData; PersistentData* pData;

View File

@@ -5,6 +5,7 @@
#include <QSettings> #include <QSettings>
#include <QString> #include <QString>
#include <QJsonObject>
#include "ATBAPPplugin.h" #include "ATBAPPplugin.h"
@@ -39,6 +40,12 @@ public:
virtual nsDeviceControllerInterface::PLUGIN_STATE initDCPlugin(QObject *eventReceiver, virtual nsDeviceControllerInterface::PLUGIN_STATE initDCPlugin(QObject *eventReceiver,
const QSettings & settings) = 0; const QSettings & settings) = 0;
/**
* e.g. send location
*/
virtual void sendDeviceParameter(const QJsonObject & jsonObject) = 0;
// TASKS: Cash handling ------------------------------------------------------- // TASKS: Cash handling -------------------------------------------------------
/** /**
* enables coin input * enables coin input
@@ -196,7 +203,7 @@ signals:
Q_DECLARE_INTERFACE(DeviceControllerInterface, Q_DECLARE_INTERFACE(DeviceControllerInterface,
"eu.atb.ptu.plugin.DeviceControllerInterface/1.1.3") "eu.atb.ptu.plugin.DeviceControllerInterface/1.1.4")
namespace nsDeviceControllerInterface { namespace nsDeviceControllerInterface {