APservice/win14_mw.cpp
2024-06-19 11:46:48 +02:00

691 lines
21 KiB
C++
Executable File

#include "win14_mw.h"
T_win14::T_win14(hwinf *HWaccess, QWidget *parent) : QWidget(parent)
{
this->HWaccess = HWaccess;
myHmainlayer= new QHBoxLayout;
// myV1mainlayer= new QVBoxLayout;
// myV2mainlayer= new QVBoxLayout;
myH0layer = new QHBoxLayout;
myH1layer = new QHBoxLayout;
myH2layer = new QHBoxLayout;
myH3layer = new QHBoxLayout;
myH4layer = new QHBoxLayout;
myH5layer = new QHBoxLayout;
myH6layer = new QHBoxLayout;
myH7layer = new QHBoxLayout;
myVlayer_left = new QVBoxLayout;
//myVlayer_midd = new QVBoxLayout;
myVlayer_right = new QVBoxLayout;
myHmainlayer->addLayout(myVlayer_left);
myHmainlayer->addLayout(myVlayer_right);
myVlayer_left->addLayout(myH0layer);
myVlayer_left->addLayout(myH1layer);
myVlayer_left->addLayout(myH2layer);
myVlayer_left->addLayout(myH3layer);
myVlayer_left->addLayout(myH4layer);
myVlayer_left->addLayout(myH5layer);
myVlayer_left->addLayout(myH6layer);
myVlayer_left->addLayout(myH7layer);
QFont myTabFont;
myTabFont.setPixelSize(PIXELSIZE_LABEL);
lab1 =new QLabel(tr("Coin Changer"));
lab1->setFont(myTabFont);
myH0layer->addWidget(lab1);
lab2 =new QLabel(tr(" "));
lab2->setFont(myTabFont);
myH0layer->addWidget(lab2);
QLabel *lab40 =new QLabel(tr("Inserted Coin Value: "));
myH1layer->addWidget(lab40);
lab40->setFont(myTabFont);
// Wert:
//myTabFont.setPixelSize(PIXELSIZE_DATA);
myTabFont.setPixelSize(PIXELSIZE_LABEL);
insertedCoin =new QLabel();
insertedCoin->setText(" 0 ");
insertedCoin->setFont(myTabFont);
insertedCoin->setStyleSheet(COLORWHITE);
insertedCoin->setAlignment(Qt::AlignCenter);
insertedCoin->setMinimumHeight(50);
myH1layer->addWidget(insertedCoin);
//QLabel *lab3 =new QLabel(tr(" "));
QLabel *lab3 =new QLabel(tr(" "));
myH1layer->addWidget(lab3);
lab3->setFont(myTabFont);
myTabFont.setPixelSize(PIXELSIZE_BUTTONS);
pb_powerOn = new QPushButton("Power ON");
myH1layer->addWidget(pb_powerOn);
pb_powerOn->setFont(myTabFont);
pb_powerOn->setCheckable(true); // true = toggle button
pb_powerOn->setAutoDefault(true); // beim start ein
pb_powerOn->setStyleSheet(COLORWHITE);
connect(pb_powerOn, SIGNAL(clicked()), this, SLOT(slot_powerOn()));
QLabel *lab53 =new QLabel(tr(" "));
myH1layer->addWidget(lab53);
lab53->setFont(myTabFont);
// 6 Fenster nebeneinander (Roehren)
myTabFont.setPixelSize(PIXELSIZE_LABEL);
QLabel *lab52 =new QLabel(tr("Tubes: 1 2 3 4 5 6"));
myH3layer->addWidget(lab52);
lab52->setFont(myTabFont);
QLabel *lab50 =new QLabel(tr("Value [cent]: "));
myH4layer->addWidget(lab50);
lab50->setFont(myTabFont);
QLabel *lab51 =new QLabel(tr("Nr.of Coins: "));
myH5layer->addWidget(lab51);
lab51->setFont(myTabFont);
// Wert:
myTabFont.setPixelSize(PIXELSIZE_DATA);
lab20 =new QLabel();
lab20->setText(" - ");
lab20->setFont(myTabFont);
lab20->setStyleSheet(COLORYELLOW);
lab20->setAlignment(Qt::AlignCenter);
myH4layer->addWidget(lab20);
// Inhalt:
lab30 =new QLabel();
myH5layer->addWidget(lab30);
lab30->setText(" 0 ");
lab30->setFont(myTabFont);
lab30->setStyleSheet(COLORWHITE);
lab30->setAlignment(Qt::AlignCenter);
// Wert:
lab21 =new QLabel();
myH4layer->addWidget(lab21);
lab21->setText(" - ");
lab21->setFont(myTabFont);
lab21->setStyleSheet(COLORYELLOW);
lab21->setAlignment(Qt::AlignCenter);
// Inhalt:
lab31 =new QLabel();
myH5layer->addWidget(lab31);
lab31->setText(" 0 ");
lab31->setFont(myTabFont);
lab31->setStyleSheet(COLORWHITE);
lab31->setAlignment(Qt::AlignCenter);
lab22 =new QLabel();
myH4layer->addWidget(lab22);
lab22->setText(" - ");
lab22->setFont(myTabFont);
lab22->setStyleSheet(COLORYELLOW);
lab22->setAlignment(Qt::AlignCenter);
// Inhalt:
lab32 =new QLabel();
myH5layer->addWidget(lab32);
lab32->setText(" 0 ");
lab32->setFont(myTabFont);
lab32->setStyleSheet(COLORWHITE);
lab32->setAlignment(Qt::AlignCenter);
lab23 =new QLabel();
myH4layer->addWidget(lab23);
lab23->setText(" - ");
lab23->setFont(myTabFont);
lab23->setStyleSheet(COLORYELLOW);
lab23->setAlignment(Qt::AlignCenter);
// Inhalt:
lab33 =new QLabel();
myH5layer->addWidget(lab33);
lab33->setText(" 0 ");
lab33->setFont(myTabFont);
lab33->setStyleSheet(COLORWHITE);
lab33->setAlignment(Qt::AlignCenter);
lab24 =new QLabel();
myH4layer->addWidget(lab24);
lab24->setText(" - ");
lab24->setFont(myTabFont);
lab24->setStyleSheet(COLORYELLOW);
lab24->setAlignment(Qt::AlignCenter);
// Inhalt:
lab34 =new QLabel();
myH5layer->addWidget(lab34);
lab34->setText(" 0 ");
lab34->setFont(myTabFont);
lab34->setStyleSheet(COLORWHITE);
lab34->setAlignment(Qt::AlignCenter);
lab25 =new QLabel();
myH4layer->addWidget(lab25);
lab25->setText(" - ");
lab25->setStyleSheet(COLORYELLOW);
lab25->setFont(myTabFont);
lab25->setAlignment(Qt::AlignCenter);
// Inhalt:
lab35 =new QLabel();
myH5layer->addWidget(lab35);
lab35->setText(" 0 ");
lab35->setFont(myTabFont);
lab35->setStyleSheet(COLORWHITE);
lab35->setAlignment(Qt::AlignCenter);
myTabFont.setPixelSize(PIXELSIZE_LABEL);
QLabel *lab5 =new QLabel(tr("Total content: "));
myH6layer->addWidget(lab5);
lab5->setFont(myTabFont);
myTabFont.setPixelSize(PIXELSIZE_DATA);
labTotalContent =new QLabel();
myH6layer->addWidget(labTotalContent);
labTotalContent->setFont(myTabFont);
showDynamics = new QTextEdit("dynamic values:");
myH7layer->addWidget(showDynamics);
showDynamics->setFont(myTabFont);
showDynamics->setStyleSheet("background-color: white");
showDynamics->append(" ");
/*
myTabFont.setPixelSize(PIXELSIZE_BUTTONS);
pb_powerOn = new QPushButton(" Power ON ");
myVlayer_right->addWidget(pb_powerOn);
pb_powerOn->setFont(myTabFont);
pb_powerOn->setCheckable(true); // true = toggle button
pb_powerOn->setAutoDefault(false); // beim start aus
pb_powerOn->setStyleSheet(COLORWHITE);
connect(pb_powerOn, SIGNAL(clicked()), this, SLOT(slot_powerOn()));
*/
pb_startPay = new QPushButton("Start filling");
myVlayer_right->addWidget(pb_startPay);
pb_startPay->setFont(myTabFont);
pb_startPay->setCheckable(false); // true = toggle button
pb_startPay->setAutoDefault(false); // beim start aus
pb_startPay->setStyleSheet(COLORWHITE);
connect(pb_startPay, SIGNAL(clicked()), this, SLOT(ButtonStartClicked()));
pb_stopPay = new QPushButton("Stop filling");
pb_stopPay->setFont(myTabFont);
myVlayer_right->addWidget(pb_stopPay);
connect(pb_stopPay, SIGNAL(clicked()), this, SLOT(ButtonStopClicked()));
pb_vendSucc = new QPushButton("Finish, or:");
pb_vendSucc->setFont(myTabFont);
myVlayer_right->addWidget(pb_vendSucc);
connect(pb_vendSucc, SIGNAL(clicked()), this, SLOT(ButtonSuccClicked()));
pb_giveChange = new QPushButton("Payout 185cent");
myVlayer_right->addWidget(pb_giveChange);
pb_giveChange->setFont(myTabFont);
pb_giveChange->setCheckable(false); // true = toggle button
pb_giveChange->setStyleSheet(COLORWHITE);
connect(pb_giveChange, SIGNAL(clicked()), this, SLOT(slot_giveChange()));
pb_giveAll = new QPushButton("Empty completely");
myVlayer_right->addWidget(pb_giveAll);
pb_giveAll->setFont(myTabFont);
pb_giveAll->setCheckable(false); // true = toggle button
pb_giveAll->setStyleSheet(COLORWHITE);
connect(pb_giveAll, SIGNAL(clicked()), this, SLOT(slot_giveAll()));
showChangeRes =new QLabel(" ");
myVlayer_right->addWidget(showChangeRes);
//showChangeRes->setText(" ");
showChangeRes->setFont(myTabFont);
showChangeRes->setStyleSheet(COLORWHITE);
showChangeRes->setAlignment(Qt::AlignCenter);
showChangeRes->setMaximumHeight(80);
// Eingangssignal auf QObject casten, weil hwinf kein QObject ist
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_gotNewCoin()), this, SLOT(signalGotNewCoin()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_coinCollectionJustStarted()), this, SLOT(signalJustStarted()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_coinCollectionAborted()), this, SLOT(signalCollectAbort()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payStopByMax()), this, SLOT(signalStopByMax()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payStopByPushbutton()), this, SLOT(signalStopByUser()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payStopByEscrow()), this, SLOT(signalStopByEscrow()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payStopByError()), this, SLOT(signalStopByError()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payStopByTimeout()), this, SLOT(signalStopTO()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_payCancelled()), this, SLOT(signalCancelled()));
connect( dynamic_cast<QObject*>(HWaccess), SIGNAL(hwapi_coinProcessJustStopped()), this, SLOT(signalProcessStop()));
setLayout(myHmainlayer);
myNextStep=0;
myStep=0;
fl_payStarted=false;
fl_storeStartVal=true;
fl_displayLevel=false;
for (int ii=0; ii<8; ii++)
{
diffLevel[ii]=0;
mw_BeginLevel[ii]=0;
}
diffAmount=0; totalContent=0;
myTO = new QTimer();
myTO->setSingleShot(true);
myTO->start(200);
}
T_win14::~T_win14()
{
close();
}
void T_win14::Nav_back(void)
{
myNextStep=WCS_WIN14BAK;
}
void T_win14::Nav_home(void)
{
myNextStep=WCS_WIN14MID;
}
void T_win14::Nav_next(void)
{
myNextStep=WCS_WIN14FWD;
}
void T_win14::slot_powerOn(void)
{
if (pb_powerOn->isChecked())
{
HWaccess->mdb_switchPower(true);
} else
{
HWaccess->mdb_switchPower(false);
}
}
void T_win14::ButtonStartClicked(void)
{
HWaccess->cash_startPayment(0);
insertedCoin->clear();
fl_payStarted=true;
fl_storeStartVal=true;
for (int ii=0; ii<8; ii++)
{
diffLevel[ii]=0;
}
diffAmount=0;
showDynamics->clear();
}
void T_win14::ButtonStopClicked(void)
{
HWaccess->cash_stopPayment();
pb_startPay->setStyleSheet(COLORYELLOW);
}
void T_win14::ButtonSuccClicked(void)
{
HWaccess->vend_success();
pb_startPay->setStyleSheet(COLORWHITE);
}
void T_win14::slot_giveChange(void)
{
HWaccess->changer_returnCoins(185);
pb_startPay->setStyleSheet(COLORWHITE);
showChangeRes->setText(" busy... ");
}
void T_win14::slot_giveAll(void)
{
HWaccess->changer_returnCoins(totalContent);
pb_startPay->setStyleSheet(COLORWHITE);
showChangeRes->setText(" busy... ");
}
void T_win14::signalGotNewCoin()
{
uint32_t ultmp;
QString myStr;
//uint16_t types[66], values[66];
//int nn;
myStr.clear();
ultmp=HWaccess->getLastInsertedCoin();
{
myStr.append(QString::number(ultmp));
insertedCoin->setText(myStr);
}
}
void T_win14::signalJustStarted()
{
pb_startPay->setStyleSheet("background-color: green");
}
void T_win14::signalCollectAbort()
{
pb_startPay->setStyleSheet("background-color: white");
}
void T_win14::signalStopByMax()
{
pb_startPay->setStyleSheet("background-color: yellow");
}
void T_win14::signalStopByUser()
{
pb_startPay->setStyleSheet("background-color: yellow");
}
void T_win14::signalStopByEscrow()
{
pb_startPay->setStyleSheet("background-color: yellow");
}
void T_win14::signalStopByError()
{
pb_startPay->setStyleSheet("background-color: white");
}
void T_win14::signalStopTO()
{
pb_startPay->setStyleSheet("background-color: white");
}
void T_win14::signalCancelled()
{
pb_startPay->setStyleSheet("background-color: white");
}
void T_win14::signalProcessStop()
{
pb_startPay->setStyleSheet("background-color: white");
}
bool T_win14::work_ini(uint16_t *nextScreen, uint8_t *useNavi)
{
// one state of the vending/operating FSM
// called ONE time after selecting this state (initialization)
// useNavi=0: no change
// bit0,1: enable/disable button "next"
// bit2,3: enable/disable button "home"
// bit4,5: enable/disable button "back"
*nextScreen=0; // needed 0=no change
*useNavi=SWITCH_BACK_ON | SWITCH_HOME_ON | SWITCH_NEXT_ON;
myNextStep=0;
this->ButtonSuccClicked();
return false;
}
bool T_win14::working(uint16_t *nextScreen, uint8_t *useNavi)
{
// one state of the vending/operating FSM
// called cyclic until this state changes intentionally to another state
// display informations for human operator, react on operators inputs or wait for payment media
// useNavi=0: no change
// bit0,1: enable/disable button "next"
// bit2,3: enable/disable button "home"
// bit4,5: enable/disable button "back"
uint8_t buf8t[8], res;
char ctmp;
int pp, ii;
uint32_t oneSum;
QString myStr;
bool found;
myStr.clear();
*nextScreen=0; // 0=no change
*useNavi=0;
struct T_chg_Tub tubLevel;
struct T_changer mw;
uint32_t returnedAmount;
if (HWaccess->mdb_isMdbPowerOn())
pb_powerOn->setStyleSheet(COLORGREEN);
else
pb_powerOn->setStyleSheet(COLORWHITE);
HWaccess->changer_getAllParameters(&mw);
if (mw.paymentRunning && fl_payStarted)
{
pb_startPay->setStyleSheet(COLORGREEN);
fl_payStarted=false;
}
HWaccess->changer_getTubelevel(&tubLevel);
if (fl_storeStartVal)
{
// call only at program start
found=false;
// wait until levels are known (at least one >0)
for (ii=0; ii<6; ii++)
{
if (tubLevel.tubeLevel[ii]>0)
found=true;
}
if (found)
{
// store current levels
for (ii=0; ii<8; ii++)
mw_BeginLevel[ii] = tubLevel.tubeLevel[ii];
fl_storeStartVal=false;
fl_displayLevel=true;
}
}
showDynamics->clear();
showDynamics->append(swl_labelAndValToStr("Country Code (6520=EURO): ", mw.countryCode));
showDynamics->append(swl_labelAndValToStr("Scale multiplier: ", mw.scale));
showDynamics->append(swl_labelAndValToStr("Currency decimals: ", mw.decimals));
for (ii=0; ii<8; ii++)
{
res=mw.coinSetup[ii];
if (res !=3)
res *= mw.scale; // Tokenwert 3 nicht veraendern
buf8t[ii]=res;
}
showDynamics->append(swl_8valInaRowToStr("accepted coin 1-8 : ", buf8t));
/*
//showDynamics->append(swl_8valInaRowToStr("accepted coin9-16: ", &mw.coinSetup[8])); // nur 0er
int pp=1;
for (ii=0; ii<6; ii++)
{
if (mw.availableTubes & pp)
buf8t[ii]=mw.coinSetup[ii] * mw.scale;
else
buf8t[ii]=0;
pp<<=1;
}
showDynamics->append(swl_8valInaRowToStr("available tubes : ", buf8t));
*/
showDynamics->append(swl_8valInaRowToStr("level of tubes : ", tubLevel.tubeLevel));
lab30->setText(swl_ulong2str(tubLevel.tubeLevel[0]));
lab31->setText(swl_ulong2str(tubLevel.tubeLevel[1]));
lab32->setText(swl_ulong2str(tubLevel.tubeLevel[2]));
lab33->setText(swl_ulong2str(tubLevel.tubeLevel[3]));
lab34->setText(swl_ulong2str(tubLevel.tubeLevel[4]));
lab35->setText(swl_ulong2str(tubLevel.tubeLevel[5]));
/*
pp=1;
for (ii=0; ii<6; ii++)
{
if (mw.availableTubes & pp)
buf8t[ii]=mw.coinSetup[ii] * mw.scale;
else
buf8t[ii]=0;
pp<<=1;
}
buf8t[6]=0; buf8t[7]=0;
showDynamics->append(swl_8valInaRowToStr("value of tubes : ", buf8t));
*/
// Feld rot wenn Roehre voll:
if (tubLevel.tubeFull[0] && tubLevel.tubeValues[0]>0) lab30->setStyleSheet(COLOR_LIGHTRED); else lab30->setStyleSheet(COLORWHITE);
if (tubLevel.tubeFull[1] && tubLevel.tubeValues[1]>0) lab31->setStyleSheet(COLOR_LIGHTRED); else lab31->setStyleSheet(COLORWHITE);
if (tubLevel.tubeFull[2] && tubLevel.tubeValues[2]>0) lab32->setStyleSheet(COLOR_LIGHTRED); else lab32->setStyleSheet(COLORWHITE);
if (tubLevel.tubeFull[3] && tubLevel.tubeValues[3]>0) lab33->setStyleSheet(COLOR_LIGHTRED); else lab33->setStyleSheet(COLORWHITE);
if (tubLevel.tubeFull[4] && tubLevel.tubeValues[4]>0) lab34->setStyleSheet(COLOR_LIGHTRED); else lab34->setStyleSheet(COLORWHITE);
if (tubLevel.tubeFull[5] && tubLevel.tubeValues[5]>0) lab35->setStyleSheet(COLOR_LIGHTRED); else lab35->setStyleSheet(COLORWHITE);
for (int ii=0; ii<8; ii++)
{
ctmp=char(tubLevel.tubeFull[ii]);
buf8t[ii]=ctmp;
}
showDynamics->append(swl_8valInaRowToStr("full tubes : ", buf8t));
showDynamics->append(swl_8valInaRowToStr("tube values : ", tubLevel.tubeValues));
// Roehren-Wertigkeiten oben in gelben Feldern anzeigen:
lab20->setText(swl_ulong2str(tubLevel.tubeValues[0]));
lab21->setText(swl_ulong2str(tubLevel.tubeValues[1]));
lab22->setText(swl_ulong2str(tubLevel.tubeValues[2]));
lab23->setText(swl_ulong2str(tubLevel.tubeValues[3]));
lab24->setText(swl_ulong2str(tubLevel.tubeValues[4]));
lab25->setText(swl_ulong2str(tubLevel.tubeValues[5]));
//showDynamics->append(swl_8valInaRowToStr("filled tubes : ", tubLevel.tubeFilled));
//showDynamics->append(swl_8valInaRowToStr("dispensed tubes : ", tubLevel.tubeDispens)); // stimmt nicht ist aber auch nicht nötig
// Anzeige Wechsler Gesamtinhalt:
totalContent=0;
for (ii=0; ii<6; ii++)
{
oneSum = tubLevel.tubeLevel[ii] * tubLevel.tubeValues[ii];
totalContent += oneSum;
}
labTotalContent->setText(swl_centToEuroString(totalContent));
if (fl_displayLevel)
{
// display filled/dispensed coins and their value, start first when tubelevel is known
// int diffLevel[6];
// long diffAmount;
diffLevel[6]=0; diffLevel[7]=0;
for (ii=0; ii<6; ii++)
{
diffLevel[ii]= tubLevel.tubeLevel[ii] - mw_BeginLevel[ii];
}
// Testwerte:
//diffLevel[1]=-6; diffLevel[2]=2; diffLevel[3]=-10; diffLevel[4]=3;
//showDynamics->append(swl_8valInaRowToStr("start level : ", mw_BeginLevel));
diffAmount=0;
for (ii=0; ii<6; ii++)
{
pp = diffLevel[ii] * tubLevel.tubeValues[ii];
diffAmount += pp;
}
showDynamics->append( swl_8intsInaRowToStr(" tubes changes: ", diffLevel));
myStr="Inserted in total: ";
if (diffAmount>=0)
{
myStr.append(swl_centToEuroString(diffAmount));
} else
{
myStr.append(swl_long2str(diffAmount));
myStr.append(" cents");
}
showDynamics->append(myStr);
}
res=HWaccess->changer_getChangeResult(&returnedAmount);
// get result of coin dispensing
// receivedData[0]: 0: not yet started 1:amount returned
// 2:only partial return 3: no return possible
// receivedData[2,3,4,5]: returned amount
myStr.clear();
//if (res==0)
// showChangeRes->setText(" --- \n");
//else
if (res==1)
{
myStr.append("amount \nreturned");
//myStr.append(swl_ulong2str(returnedAmount)); // ist hier immer 0
//myStr.append(" cent remain");
showChangeRes->setText(myStr);
} else
if (res==2)
{
myStr.append("partial returned\n");
myStr.append(swl_ulong2str(returnedAmount));
myStr.append("cent \nremain");
showChangeRes->setText(myStr);
} else
if (res==3)
showChangeRes->setText("not possible");
if (myStep<=1)
{
if (!myTO->isActive())
{
myStep++;
myTO->start(200);
//uint16_t acc=0x7E; // accept 10c-2€ & Token
uint16_t coinVal[16];
memset(coinVal,0,32);
//coinVal[0]=5;
//coinVal[3]=50;
//coinVal[10]=0;
// 17.11.23 raus.
//HWaccess->emp_sendSettings(acc, 12, coinVal); // getestet 19.10.23TS
}
} else
if (myStep==2)
{
if (!myTO->isActive())
{
myStep++;
myTO->start(200);
HWaccess->changer_requestChangeResult();
}
} else
if (myStep==3)
{
if (!myTO->isActive())
{
myStep=2;
myTO->start(200);
HWaccess->changer_requestTubelevel();
}
}
if (myNextStep)
{
*nextScreen=myNextStep;
myNextStep=0;
}
return false;
}