APservice/win15_bna.cpp

488 lines
17 KiB
C++
Raw Permalink Normal View History

2023-11-14 09:32:56 +01:00
#include "win15_bna.h"
2024-07-08 10:34:47 +02:00
static uint8_t lastNoteCount;
2023-11-14 09:32:56 +01:00
T_win15::T_win15(hwinf *HWaccess, QWidget *parent) : QWidget(parent)
{
this->HWaccess = HWaccess;
myLayout = new QGridLayout;
myH0layer = new QHBoxLayout;
myVlayer_left = new QVBoxLayout;
myVlayer_midd = new QVBoxLayout;
myVlayer_right = new QVBoxLayout;
myH0layer->addLayout(myVlayer_left);
myH0layer->addLayout(myVlayer_midd);
myH0layer->addLayout(myVlayer_right);
QFont myTabFont;
myTabFont.setPixelSize(22);
myTabFont.setPixelSize(PIXELSIZE_LABEL);
lab1 =new QLabel(tr("Bank note reader"));
lab1->setFont(myTabFont);
//myLayout->addWidget(lab1,1,1);
myVlayer_left->addWidget(lab1);
myTabFont.setPixelSize(PIXELSIZE_DATA);
showDynamics = new QTextEdit("dynamic values:");
showDynamics->setFont(myTabFont);
2024-07-08 10:34:47 +02:00
showDynamics->setStyleSheet("background-color: yellow");
2023-11-14 09:32:56 +01:00
showDynamics->append(" ");
//myLayout->addWidget(showDynamics,3,1);
myVlayer_left->addWidget(showDynamics);
lab4 =new QLabel(tr("Stacker / Billbox:"));
lab4->setFont(myTabFont);
//myLayout->addWidget(lab4,4,1);
myVlayer_left->addWidget(lab4);
showStacker = new QTextEdit("stacker content:");
showStacker->setFont(myTabFont);
showStacker->setStyleSheet("background-color: white");
showStacker->append(" ");
showStacker->setMinimumHeight(250);
//myLayout->addWidget(showStacker,5,1);
myVlayer_left->addWidget(showStacker);
lab5 =new QLabel(tr("Reader Data:"));
lab5->setFont(myTabFont);
//myLayout->addWidget(lab5,6,1);
myVlayer_midd->addWidget(lab5);
showStatics = new QTextEdit("static values:");
showStatics->setFont(myTabFont);
showStatics->setStyleSheet("background-color: white");
showStatics->append(" ");
//myLayout->addWidget(showStatics,7,1);
myVlayer_midd->addWidget(showStatics);
myTabFont.setPixelSize(PIXELSIZE_BUTTONS);
pb_powerOn = new QPushButton(" Power ON");
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()));
//myLayout->addWidget(pb_powerOn,2,2);
myVlayer_right->addWidget(pb_powerOn);
pb_sendDefault = new QPushButton("All Bills on");
pb_sendDefault->setFont(myTabFont);
pb_sendDefault->setStyleSheet(COLORWHITE);
connect(pb_sendDefault, SIGNAL(clicked()), this, SLOT(slot_sendDef()));
//myLayout->addWidget(pb_sendDefault,3,2);
myVlayer_right->addWidget(pb_sendDefault);
pb_startPay = new QPushButton("Start Payment");
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(slot_start()));
//myLayout->addWidget(pb_startPay, 4,2);
myVlayer_right->addWidget(pb_startPay);
pb_only10_5 = new QPushButton(" only 10€ & 5€");
pb_only10_5->setFont(myTabFont);
pb_only10_5->setStyleSheet(COLORWHITE);
connect(pb_only10_5, SIGNAL(clicked()), this, SLOT(slot_send10_5()));
//myLayout->addWidget(pb_only10_5,5,2);
myVlayer_right->addWidget(pb_only10_5);
pb_only5 = new QPushButton(" only 5€");
pb_only5->setFont(myTabFont);
pb_only5->setStyleSheet(COLORWHITE);
connect(pb_only5, SIGNAL(clicked()), this, SLOT(slot_send5()));
//myLayout->addWidget(pb_only5,6,2);
myVlayer_right->addWidget(pb_only5);
pb_stopPay = new QPushButton("Stop Payment");
pb_stopPay->setFont(myTabFont);
pb_stopPay->setStyleSheet(COLORWHITE);
connect(pb_stopPay, SIGNAL(clicked()), this, SLOT(slot_stop()));
//myLayout->addWidget(pb_stopPay, 7,2);
myVlayer_right->addWidget(pb_stopPay);
//setLayout(myLayout);
setLayout(myH0layer);
myNextStep=0;
myStep=0;
myTO = new QTimer();
myTO->setSingleShot(true);
myTO->start(2000);
paymentStarted=false;
}
T_win15::~T_win15()
{
close();
}
void T_win15::Nav_back(void)
{
myNextStep=WCS_WIN15BAK;
}
void T_win15::Nav_home(void)
{
myNextStep=WCS_WIN15MID;
}
void T_win15::Nav_next(void)
{
myNextStep=WCS_WIN15FWD;
}
void T_win15::slot_powerOn(void)
{
if (pb_powerOn->isChecked())
{
HWaccess->mdb_switchPower(true);
} else
{
HWaccess->mdb_switchPower(false);
}
}
void T_win15::slot_sendDef(void)
{
uint16_t bilVals[16];
memset(bilVals,0,32);
2024-07-08 10:34:47 +02:00
// bilVals[0]=500;
// bilVals[1]=1000;
// bilVals[2]=2000;
// bilVals[3]=5000;
2023-11-14 09:32:56 +01:00
2024-07-08 10:34:47 +02:00
HWaccess->bna_sendSettings(0xFFFF, 0, bilVals, 35000);
2023-11-14 09:32:56 +01:00
}
void T_win15::slot_start(void)
{
HWaccess->cash_startPayment(0);
2024-07-08 10:34:47 +02:00
//showDynamics->clear();
showDynamics->setStyleSheet("background-color: yellow");
lastNoteCount=255; // to display value once on startup
2023-11-14 09:32:56 +01:00
paymentStarted=true;
}
void T_win15::slot_send10_5(void)
{
HWaccess->bna_setCurrentAcceptance(0b0000000000000011);
}
void T_win15::slot_send5(void)
{
HWaccess->bna_setCurrentAcceptance(0b0000000000000001);
}
void T_win15::slot_stop(void)
{
//HWaccess->cash_stopPayment();
HWaccess->vend_success();
paymentStarted=false;
}
bool T_win15::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;
2024-07-08 10:34:47 +02:00
pb_startPay->setChecked(false);
lastNoteCount=255; // to display value once on startup
2023-11-14 09:32:56 +01:00
myNextStep=0;
return false;
}
bool T_win15::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"
struct T_dynamicCondition myDynMachCond;
*nextScreen=0; // 0=no change
*useNavi=0;
if (HWaccess->mdb_isMdbPowerOn())
pb_powerOn->setStyleSheet(COLORGREEN);
else
pb_powerOn->setStyleSheet(COLORWHITE);
HWaccess->sys_getDynMachineConditions(&myDynMachCond);
if (myDynMachCond.paymentInProgress==2)
{
pb_startPay->setStyleSheet(COLORGREEN);
2024-07-08 10:34:47 +02:00
pb_startPay->setChecked(true);
} else
{
pb_startPay->setStyleSheet(COLORWHITE);
pb_startPay->setChecked(false);
2023-11-14 09:32:56 +01:00
}
2024-07-08 10:34:47 +02:00
displayDynamics();
2023-11-14 09:32:56 +01:00
displayStacker();
displayStatics();
if (myStep==0)
{
myStep++;
} else
if (myStep==1)
{
if (!myTO->isActive())
{
myStep++;
myTO->start(200);
2024-07-08 10:34:47 +02:00
//HWaccess->bna_requestParameters();
2023-11-14 09:32:56 +01:00
//qDebug()<<"win15 requesting bna parameters";
}
} else
if (myStep==2)
{
if (!myTO->isActive())
{
myStep++;
myTO->start(200);
2024-07-08 10:34:47 +02:00
//HWaccess->bna_requestCurrentNotes();
2023-11-14 09:32:56 +01:00
//qDebug()<<"win15 requesting bna new bills";
}
} else
if (myStep==3)
{
if (!myTO->isActive())
{
myStep=1;
myTO->start(200);
2024-07-08 10:34:47 +02:00
//HWaccess->bna_requestStackerLevel();
2023-11-14 09:32:56 +01:00
}
} else
if (myStep==4)
{
} else
if (myStep==5)
{
} else
if (myStep==6)
{
} else
if (myStep==7)
{
} else
{
}
if (myNextStep)
{
*nextScreen=myNextStep;
myNextStep=0;
}
return false;
}
void T_win15::displayDynamics(void)
{
uint8_t ret;
uint16_t currentNotes[8];
uint32_t amount;
ret= HWaccess->bna_getCurrentNotes(0, currentNotes);
// returns number of collected bank notes since start-command (current transaction)
// latestBill: not used
2024-07-08 10:34:47 +02:00
// currentNotes[0] = last bill value
// currentNotes[1] = 0/1 1 if bill in escrow 0 if bill in cash box (stacker)
// currentNotes[2,3] = total sum of collected bills within this transaction
2023-11-14 09:32:56 +01:00
2024-07-08 10:34:47 +02:00
// if (paymentStarted==false)
// {
2023-11-14 09:32:56 +01:00
2024-07-08 10:34:47 +02:00
// } else
2023-11-14 09:32:56 +01:00
if (ret==99 )
{
showDynamics->clear();
showDynamics->append("BNA ERROR");
//qDebug() << "BNA ERROR "<< currentNotes[0] <<" "<< currentNotes[1] <<" "
// << currentNotes[2] <<" "<< currentNotes[3];
if (currentNotes[0]>0)
showDynamics->append(swl_int2str(currentNotes[0]));
if (currentNotes[1]>0)
showDynamics->append(swl_int2str(currentNotes[1]));
if (currentNotes[2]>0)
showDynamics->append(swl_int2str(currentNotes[2]));
if (currentNotes[3]>0)
showDynamics->append(swl_int2str(currentNotes[3]));
showDynamics->setStyleSheet("background-color: red");
} else
if (ret != lastNoteCount)
{
lastNoteCount=ret;
showDynamics->setStyleSheet("background-color: white");
showDynamics->clear();
showDynamics->append(swl_labelAndValToStr("count : ", ret));
showDynamics->append(swl_labelAndValToStr("Last bill: ", currentNotes[0]));
//showDynamics->append(swl_labelAndValToStr("stacked : ", currentNotes[1]));
if (currentNotes[1]==1)
showDynamics->append("in escrow");
else
showDynamics->append("stacked");
amount=currentNotes[3];
amount<<=16;
amount |=currentNotes[2];
showDynamics->append(swl_labelAndValToStr("total : ", amount));
2024-07-08 10:34:47 +02:00
2023-11-14 09:32:56 +01:00
}
}
void T_win15::displayStacker(void)
{
uint16_t ret;
uint32_t amountInStacker;
uint16_t countOfBills[16];
static uint16_t stacker_lastCount;
ret= HWaccess->bna_getStackerLevel(&amountInStacker, countOfBills);
// return val: nr of bills in stacker
// countOfBills[0..7] = count of bills of bill-type 0..7 (e.g. countOfBills[0]=nr of 5€-bills in stacker)
// countOfBills[8..15] = value of bill-type 0...7
if (ret>0 && ret != stacker_lastCount)
{
qDebug()<<"win15 displ stacker "<< ret << " " << stacker_lastCount;
stacker_lastCount=ret;
showStacker->clear();
showStacker->append(swl_labelAndValToStr("count of bills : ", ret));
showStacker->append(swl_labelAndValToStr("total amount : ", amountInStacker));
showStacker->append(swl_labelAndValToStr("count of bill 0: ", countOfBills[0]));
showStacker->append(swl_labelAndValToStr("count of bill 1: ", countOfBills[1]));
showStacker->append(swl_labelAndValToStr("count of bill 2: ", countOfBills[2]));
showStacker->append(swl_labelAndValToStr("count of bill 3: ", countOfBills[3]));
showStacker->append(swl_labelAndValToStr("count of bill 4: ", countOfBills[4]));
showStacker->append(swl_labelAndValToStr("count of bill 5: ", countOfBills[5]));
showStacker->append(swl_labelAndValToStr("count of bill 6: ", countOfBills[6]));
showStacker->append(swl_labelAndValToStr("count of bill 7: ", countOfBills[7]));
showStacker->append(swl_labelAndValToStr("value of bill 0: ", countOfBills[8]));
showStacker->append(swl_labelAndValToStr("value of bill 1: ", countOfBills[9]));
showStacker->append(swl_labelAndValToStr("value of bill 2: ", countOfBills[10]));
showStacker->append(swl_labelAndValToStr("value of bill 3: ", countOfBills[11]));
showStacker->append(swl_labelAndValToStr("value of bill 4: ", countOfBills[12]));
showStacker->append(swl_labelAndValToStr("value of bill 5: ", countOfBills[13]));
showStacker->append(swl_labelAndValToStr("value of bill 6: ", countOfBills[14]));
showStacker->append(swl_labelAndValToStr("value of bill 7: ", countOfBills[15]));
showStacker->moveCursor(QTextCursor::Start);
}
}
void T_win15::displayStatics(void)
{
struct T_bna bna;
static uint16_t lastCountryCode, lastStackLev;
HWaccess->bna_getAllParameters(&bna);
/* struct T_bna
uint8_t setup; // 0: not 1: got valid parameters from device
uint8_t FeatureLevel;
uint16_t countryCode; // programmed in EMP
uint16_t scalingFactor; // z.B. 5
uint8_t decimalPlace;
uint8_t pad1;
uint16_t stackerCap;
uint16_t billSecureLevel;
uint8_t hasEscrow;
uint8_t accBillTypes[16]; // programmed in EMP z.B. (bit 0..7): 1 2 4 10 20 40 0 0
uint16_t currentStackerLevel; // requested number of notes in billbox
// settings from Master
uint16_t intendedAccept; // bit 0 =5€
uint16_t pad2;
uint16_t billDenomination[16];
}; */
//if (bna.countryCode>0)
// qDebug()<<"win15 got CountryCode" << bna.countryCode;
if (bna.countryCode>0 && (lastCountryCode!=bna.intendedAccept || lastStackLev != bna.currentStackerLevel))
{
lastCountryCode = bna.intendedAccept;
lastStackLev = bna.currentStackerLevel;
showStatics->clear();
showStatics->append(swl_labelAndValToStr("Parameter valid:", bna.setup));
showStatics->append(swl_labelAndValToStr("countryCode: ", bna.countryCode ));
showStatics->append(swl_labelAndValToStr("scalingFactor: ", bna.scalingFactor));
showStatics->append(swl_labelAndValToStr("decimals: ", bna.decimalPlace ));
showStatics->append(swl_labelAndValToStr("stackerCap: ", bna.stackerCap ));
showStatics->append(swl_labelAndValToStr("curr. st.Level: ", bna.currentStackerLevel ));
showStatics->append(swl_labelAndValToStr("intend accept : ", bna.intendedAccept ));
showStatics->append(" ");
showStatics->append(swl_labelAndValToStr("accBillTypes 1: ", bna.accBillTypes[0] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 2: ", bna.accBillTypes[1] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 3: ", bna.accBillTypes[2] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 4: ", bna.accBillTypes[3] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 5: ", bna.accBillTypes[4] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 6: ", bna.accBillTypes[5] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 7: ", bna.accBillTypes[6] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 8: ", bna.accBillTypes[7] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes 9: ", bna.accBillTypes[8] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes10: ", bna.accBillTypes[9] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes11: ", bna.accBillTypes[10] *bna.scalingFactor ));
showStatics->append(swl_labelAndValToStr("accBillTypes12: ", bna.accBillTypes[11] *bna.scalingFactor ));
//showStatics->append(swl_labelAndValToStr("curr. st.Level: ", bna.currentStackerLevel ));
//showStatics->append(swl_labelAndValToStr("intend accept : ", bna.intendedAccept ));
showStatics->append(swl_labelAndValToStr("intend denom 1: ", bna.billDenomination[0] ));
showStatics->append(swl_labelAndValToStr("intend denom 2: ", bna.billDenomination[1] ));
showStatics->append(swl_labelAndValToStr("intend denom 3: ", bna.billDenomination[2] ));
showStatics->append(swl_labelAndValToStr("intend denom 4: ", bna.billDenomination[3] ));
showStatics->append(swl_labelAndValToStr("intend denom 5: ", bna.billDenomination[4] ));
showStatics->append(swl_labelAndValToStr("intend denom 16 ", bna.billDenomination[5] ));
showStatics->append(swl_labelAndValToStr("intend denom 7: ", bna.billDenomination[6] ));
showStatics->append(swl_labelAndValToStr("intend denom 8: ", bna.billDenomination[7] ));
showStatics->append(swl_labelAndValToStr("intend denom 9: ", bna.billDenomination[8] ));
showStatics->append(swl_labelAndValToStr("intend denom10: ", bna.billDenomination[9] ));
showStatics->append(swl_labelAndValToStr("intend denom11: ", bna.billDenomination[10] ));
showStatics->append(swl_labelAndValToStr("intend denom12: ", bna.billDenomination[11] ));
showStatics->moveCursor(QTextCursor::Start);
}
}