Compare commits

...

12 Commits
2.2.3 ... 2.2.9

Author SHA1 Message Date
ac93e9e631 Send W255 on restart CArun 2024-07-15 11:09:37 +02:00
c1dd20ec4f Restart carun on consecutive E255 2024-07-15 11:09:28 +02:00
6c2717c56b Diag: check doors in sub_componentAssessment ...
... this prevents sending Operate "O000" in case of an opend door and
enables sending Operate "O000" after closing all doors because
'lastResult' has not changed.
2024-06-11 09:27:07 +02:00
816182c87b Diag: restart on E255 2024-06-03 12:49:33 +02:00
492d3a107a Diag: set timeout for diagRequest from config ...
Option: "ATBDeviceControllerPlugin/diagTimeout"
 Description: Timeout for diagRequest in seconds.
 Default value: 45s
2024-06-03 12:09:34 +02:00
962cd01eac Re-enable sending DC-State after closing doors 2024-06-03 11:53:58 +02:00
d66363da46 Diag: Temperatur warning: E004 (Error) -> W004 (Warning) 2024-05-27 13:16:28 +02:00
7b25f86d6b CoinEscrow error is considered a warning (W010) 2024-05-17 14:08:07 +02:00
5a999a0494 Comment: proposal: MachineEvents with JSON-Parameter 2024-05-16 17:38:03 +02:00
ec18ac45e4 Send diagEvent E255 as ERROR 2024-05-16 17:37:29 +02:00
560b6d3221 Print: count undefined print result values and retry 2024-05-16 15:21:25 +02:00
b946dc5a92 T_dynData: do not dynamically create struct 2024-05-16 15:18:30 +02:00
5 changed files with 134 additions and 29 deletions

View File

@@ -82,6 +82,8 @@ PLUGIN_STATE ATBDeviceControllerPlugin::initDCPlugin(QObject *eventReceiver, con
this->diag = new DeviceControllerDiag(this->persistentData, this);
connect(this->diag, &DeviceControllerDiag::newVoltage, this, &ATBDeviceControllerPlugin::onNewVoltage);
int diagTimeout = settings.value("ATBDeviceControllerPlugin/diagTimeout", "45").toInt();
this->diag->setTimeout(diagTimeout);
// currentSelectedTicketType - number of used "Kombiticket" (deprecated) use TICKET_VARIANT in future
this->currentSelectedTicketType = 0;
@@ -540,6 +542,8 @@ void ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed()
{
qCritical() << "ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed()";
this->diag->diagReInit();
QTimer::singleShot(2000, this, SIGNAL(requestModeIDLE()));
this->dbus->finishedBackgroundTask("DOOR_OPEN");
@@ -654,6 +658,7 @@ void ATBDeviceControllerPlugin::requestPrintReceipt(const QString & printingStri
hw->prn_switchPower(true);
hw->prn_setFonts(8,12,0,0);
hw->prn_sendText(&ba);
this->printResultCheckCounter = 0;
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingReceipt()));
//QTimer::singleShot(2000, this, [this](){ hw->prn_cut(3); } );
@@ -702,7 +707,8 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingReceipt()
void ATBDeviceControllerPlugin::requestPrintTicket(const QHash<QString, QVariant> & printingData)
{
struct T_dynDat *dynTicketData = new T_dynDat;
struct T_dynDat dynamicTicketData;
struct T_dynDat *dynTicketData = &dynamicTicketData;
memset(dynTicketData, 0, sizeof(*dynTicketData));
qCritical() << "ATBDeviceControllerPlugin::requestPrintTicket( " << endl
@@ -843,6 +849,7 @@ void ATBDeviceControllerPlugin::onPrinterDataPrepared()
// note: calling prn_getPrintResult() immediately may result in wrong answer!
// We have to wait "about some seconds" until calling this function!
this->printResultCheckCounter = 0;
QTimer::singleShot(4000, this, SLOT(onPrinterWaitForPrintingTicket()));
// old: use printer templates:
@@ -866,8 +873,17 @@ void ATBDeviceControllerPlugin::onPrinterWaitForPrintingTicket()
this->onPrintFinishedERR();
break;
default:
qCritical() << "DC Error: wait for printing";
this->onPrintFinishedERR();
// result value is not defined (-> workaround for DC misbehaviour)
if (this->printResultCheckCounter < 10) {
this->printResultCheckCounter++;
qCritical() << "DC print result undefined: " << printerResult;
QTimer::singleShot(1000, this, SLOT(onPrinterWaitForPrintingTicket()));
}
else {
qCritical() << "DC Error: wait for printing";
this->onPrintFinishedERR();
}
break;
}
@@ -895,6 +911,7 @@ void ATBDeviceControllerPlugin::onPrinterPrintNextTemplate()
if (this->currentTicket->templateList()->isEmpty()) {
// all templates are printed
this->printResultCheckCounter = 0;
QTimer::singleShot(2000, this, SLOT(onPrinterWaitForPrintingTicket()));
}
else {
@@ -946,7 +963,8 @@ void ATBDeviceControllerPlugin::onPrinterPrepareDynTemplateData()
}
void ATBDeviceControllerPlugin::prepareDynTemplateData()
{
struct T_dynDat *dynTicketData = new T_dynDat;
struct T_dynDat dynamicTicketData;
struct T_dynDat *dynTicketData = &dynamicTicketData;
memset(dynTicketData, 0, sizeof(*dynTicketData));
// setup dynTicketData dependent on currentTicket

View File

@@ -129,6 +129,9 @@ private:
// counts failed hw->log_chkIfVaultRecordAvailable()
int accountCheckCounter;
// counts faild hw->prn-getPrintResult()
int printResultCheckCounter;
// dbus
int init_sc_dbus();

View File

@@ -15,7 +15,7 @@ class ATBMachineEvent : public QEvent
public:
explicit ATBMachineEvent(const QString & id,
const QString & deviceName, // PTU/PRINTER/DC/...
EVENT_CLASS eventClass, // reason of event: Error/Warning/Alarm
EVENT_CLASS eventClass, // reason of event: Error/Warning/Alarm
const QString & name, // 'Event': "E001", "W003"
const int state,
const QString & parameter,

View File

@@ -5,6 +5,11 @@
#include <QUuid>
#include <QDebug>
#include <QProcess>
#include "support/JSON.h"
DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *parent)
: QObject(parent)
, coinProcessorType(nsDeviceControllerInterface::COIN_PROCESSOR::ESCROW)
@@ -15,9 +20,10 @@ DeviceControllerDiag::DeviceControllerDiag(PersistentData *pData, QObject *paren
, lastState(DeviceController::State::INITIAL_STATE)
, _isErrorState(false)
, pData(pData)
, E255counter(0)
{
diagRequestTimeoutTimer = new QTimer(this);
diagRequestTimeoutTimer->setInterval(1000*20); // 20s
diagRequestTimeoutTimer->setInterval(1000*45);
diagRequestTimeoutTimer->setSingleShot(true);
connect(diagRequestTimeoutTimer, &QTimer::timeout, this, &DeviceControllerDiag::onDiagRequestTimeoutTimerTimeout);
}
@@ -33,6 +39,17 @@ void DeviceControllerDiag::init(hwinf *hw, QObject* eventReceiver)
}
void DeviceControllerDiag::diagReInit()
{
this->machineEventSet.clear();
this->_isErrorState = false;
}
void DeviceControllerDiag::setTimeout(int timeout)
{
this->diagRequestTimeoutTimer->setInterval(1000 * timeout);
}
void DeviceControllerDiag::diagRequest()
{
qCritical() << "DeviceControllerDiag::diagRequest()";
@@ -90,6 +107,20 @@ void DeviceControllerDiag::private_startDiag()
this->private_sendDiagEvent(DeviceController::State::E255);
this->isRequestRunning = false;
this->flagInterruptDiag = false;
if (this->E255counter > 5) {
this->restartCArun();
}
else {
this->E255counter++;
// try it again, until success:
QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest);
/**
* But please note:
* - diag does currently not stop suspend (start a background task)
* - diag is called again in ModeOOO wokeup()
*/
}
return;
}
@@ -124,6 +155,8 @@ void DeviceControllerDiag::sys_superviseSystem()
this->private_sendDiagEvent(DeviceController::State::E255);
this->flagInterruptDiag = false;
this->isRequestRunning = false;
if (this->E255counter > 5) { this->restartCArun(); }
else { this->E255counter++; }
return;
}
@@ -134,6 +167,8 @@ void DeviceControllerDiag::sys_superviseSystem()
this->private_sendDiagEvent(DeviceController::State::E254);
this->diagRequestTimeoutTimer->stop();
this->isRequestRunning = false;
if (this->E255counter > 5) { this->restartCArun(); }
else { this->E255counter++; }
return;
}
@@ -146,7 +181,7 @@ void DeviceControllerDiag::sys_superviseSystem()
{
// noch keine Testergebnisse
if (dynMaCond.startupTestIsRunning) {
// TODO?
qCritical() << " startupTestIsRunning --> call again";
}
@@ -156,18 +191,6 @@ void DeviceControllerDiag::sys_superviseSystem()
return;
}
// all doors: 99: undefined 0:closed 1:open
if (dynMaCond.lowerDoor || dynMaCond.upperDoor) {
// Service or battery door is open, goto INTRUSION MODE
qCritical() << "DeviceControllerDiag::sys_superviseSystem() Service or battery door is open, goto INTRUSION MODE";
this->private_sendDiagEvent(DeviceController::State::E253);
}
if (dynMaCond.middleDoor) {
// vault door is open, goto INTRUSION MODE
qCritical() << "DeviceControllerDiag::sys_superviseSystem() vault door is open, goto INTRUSION MODE";
this->private_sendDiagEvent(DeviceController::State::E252);
}
qCritical() << " --> call sub_componentAssessment()";
sub_componentAssessment();
@@ -201,6 +224,21 @@ void DeviceControllerDiag::sub_componentAssessment()
this->private_sendDiagEvent(DeviceController::State::A000);
}
// check for open doors
// all doors: 99: undefined 0:closed 1:open
if (dynMaCond.lowerDoor || dynMaCond.upperDoor) {
// Service or battery door is open
flag_sendOperate = false;
qCritical() << "DeviceControllerDiag::sys_superviseSystem() Service or battery door is open, goto INTRUSION MODE";
this->private_sendDiagEvent(DeviceController::State::E253);
}
if (dynMaCond.middleDoor) {
// vault door is open
flag_sendOperate = false;
qCritical() << "DeviceControllerDiag::sys_superviseSystem() vault door is open, goto INTRUSION MODE";
this->private_sendDiagEvent(DeviceController::State::E252);
}
// check for invalid states:
if (modCond.rtc>=200) {
@@ -244,7 +282,8 @@ void DeviceControllerDiag::sub_componentAssessment()
}
if (modCond.coinEscrow>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E010);
// coinEscrow>200 is considered a warning:
this->private_sendDiagEvent(DeviceController::State::W010);
}
}
// -----------------------------------------------------------------------------------------------
@@ -266,7 +305,8 @@ void DeviceControllerDiag::sub_componentAssessment()
{
if (modCond.coinEscrow>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E010);
// coinEscrow>200 is considered a warning:
this->private_sendDiagEvent(DeviceController::State::W010);
}
if (modCond.coinSafe==201) { // full
flag_sendOperate = false;
@@ -338,7 +378,7 @@ void DeviceControllerDiag::sub_componentAssessment()
}
if (modCond.temper>=200) {
flag_sendOperate = false;
this->private_sendDiagEvent(DeviceController::State::E004);
this->private_sendDiagEvent(DeviceController::State::W004);
}
// check for warnings
@@ -449,6 +489,10 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
parameter = "coin escrow";
this->_isErrorState = true;
break;
case DeviceController::State::W010: // coin escrow
eventClass = EVENT_CLASS::WARNING;
parameter = "coin escrow";
break;
case DeviceController::State::E011: // mem error int.ee.
eventClass = EVENT_CLASS::ERROR;
parameter = "mem error int.ee.";
@@ -506,10 +550,8 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
parameter = "no valid data from DeviceController";
break;
case DeviceController::State::E255: // no valid data from DeviceController
eventClass = EVENT_CLASS::STATE;
parameter = "";
qCritical() << " ... ignore " << QMetaEnum::fromType<DeviceController::State>().valueToKey(result);
return;
eventClass = EVENT_CLASS::ERROR;
parameter = "no valid data from DeviceController";
break;
case DeviceController::State::O000: // everything is fine
this->machineEventSet.clear();
@@ -541,10 +583,24 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
eventClass = EVENT_CLASS::WARNING;
parameter = "temperatur warning";
break;
case DeviceController::State::W255: // restart carun
eventClass = EVENT_CLASS::WARNING;
parameter = "restart carun";
break;
}
this->lastState = result;
/**
* Variant: send 'parameter' as JSON:
*
JSON::setPrettySerialize(false);
JSON::JsonObject json = JSON::objectBuilder()
->set("description", parameter)
->create();
QString parameterJsonString = JSON::serialize(json);
*/
ATBMachineEvent *machineEvent = new ATBMachineEvent(
eventId,
"DC",
@@ -555,10 +611,18 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result)
"" // second level info
);
//emit diagResponse(machineEvent);
QCoreApplication::postEvent(eventReceiver, machineEvent);
}
/**
* reset / restart / reinit deviceController
*/
void DeviceControllerDiag::restartCArun()
{
this->E255counter = 0;
this->private_sendDiagEvent(DeviceController::State::W255);
QProcess::startDetached("/bin/systemctl", {"restart", "carun"});
}

View File

@@ -29,6 +29,7 @@ namespace DeviceController {
E008,
E009,
E010,
W010, // Coin Escrow
E011,
E018,
@@ -54,6 +55,8 @@ namespace DeviceController {
W003,
W004,
W255,
INITIAL_STATE
};
Q_ENUM_NS(State)
@@ -79,9 +82,25 @@ public:
bool isOperatingState();
QSet<DeviceController::State> getCurrentMachineState();
void setTimeout(int timeout);
public slots:
/**
* start diag request
*/
void diagRequest();
/**
* reset / re-init diag request.
* Called e.g. when doors are closed.
*/
void diagReInit();
/**
* reset / restart / reinit deviceController
*/
void restartCArun();
signals:
void diagResponse(ATBMachineEvent* machineEvent);
@@ -106,6 +125,8 @@ private:
PersistentData* pData;
int E255counter;
private slots:
void onDiagRequestTimeoutTimerTimeout();
@@ -114,7 +135,6 @@ private slots:
void sys_superviseSystem();
};
#endif // DEVICECONTROLLERDIAG_H