440 lines
14 KiB
C++
Executable File
440 lines
14 KiB
C++
Executable File
#include "mainwindow.h"
|
|
|
|
char MainWindow::loadPlugIn(char lade1_entlade2)
|
|
{
|
|
plugInDir.cd("plugins");
|
|
QPluginLoader *pluginLoader = new QPluginLoader();
|
|
|
|
// select system:
|
|
//pluginLoader->setFileName("../MasterPlug/libCAmaster.so"); // for suse
|
|
//pluginLoader->setFileName("../SlavePlug/libCAslave.so"); // for ptu5
|
|
//pluginLoader->setFileName("../../MasterPlug/CAmaster.dll"); // for windows
|
|
//pluginLoader->setFileName("CAmaster.dll"); // for windows
|
|
pluginLoader->setFileName("/usr/lib/libCAmaster.so"); // for ptu5
|
|
|
|
if (lade1_entlade2==2)
|
|
{
|
|
pluginLoader->unload();
|
|
return 0;
|
|
}
|
|
|
|
if (!pluginLoader->load())
|
|
{
|
|
qDebug()<<"cannot load plugin";
|
|
} else
|
|
qDebug() <<"loaded plugin: " << pluginLoader->fileName();
|
|
|
|
if (!pluginLoader->isLoaded())
|
|
{
|
|
qDebug()<<pluginLoader->errorString();
|
|
return 0;
|
|
}
|
|
|
|
QObject *plugin = pluginLoader->instance();
|
|
if ( plugin == nullptr)
|
|
{
|
|
// make instance of the root component (which can hold more then one clases)
|
|
// also loads the lib if not yet done
|
|
qDebug()<<"cannot start instance";
|
|
return 0;
|
|
}
|
|
|
|
//int rr=hwapi->giveVal(2); funktioniert :))
|
|
//qDebug()<<"got value from plugin"<<rr; funktioniert :))
|
|
// aber besser globaler pointer:
|
|
// im h-file
|
|
// hwinf *hwapi=nullptr; // pointer to plugin-class
|
|
|
|
HWaccess= qobject_cast<hwinf *>(plugin);
|
|
// make instance to class "hwinf" in dll_HWapi.h over "interfaces.h"
|
|
|
|
qDebug()<<"loadPlugIn, HWAccess: " << HWaccess;
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define WINCTRMIN 0
|
|
// 0 is always the home screen
|
|
|
|
#define WINCTRMAX 30
|
|
// number of needed application screens, up to 255
|
|
// All screens must be defined below in mainwindow-class first before increasing the nr
|
|
// numbers must be consecutively from 0 always, 0 is the home screen always
|
|
|
|
#define FORMWIDTH 725
|
|
//#define FORMWIDTH 690
|
|
// this width is the same for ALL windows
|
|
|
|
#define FORMHEIGHT 440
|
|
// this height is the same for ALL windows
|
|
|
|
#define NAVIBUTTONHEIGHT 70
|
|
#define NAVIBUTTONWIDHT 50
|
|
|
|
#define HOMEPAGE_BACKGROUND_COLOR "background-color: lightgrey"
|
|
|
|
#define BUTTON_COLOR "background-color: rgb(160,250,190)"
|
|
|
|
#define ACTIVE_NAVI_COLOR "background-color: rgb(160,250,190)"
|
|
#define DISABL_NAVI_COLOR "background-color: grey"
|
|
|
|
#define APPPAGE_BACKGROUND_COLOR "background-color: lightgrey"
|
|
|
|
#define UPDATE_PERIOD_MS 100
|
|
// period to call chain steps
|
|
|
|
#define VENDINGTIMEOUT_MS 30000
|
|
// after this time without any operation the program returns to idle state
|
|
// time in ms, that means 30.000 gives 30seconds
|
|
|
|
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|
{
|
|
loadPlugIn(1);
|
|
|
|
// define all working moduls (besides gui) here, call ini and working in chainControl() (~Line 1000)
|
|
//mifCard = new T_Mifare(HWaccess); // ganz wichtig: HWaccess an sub-Konstruktor übergeben
|
|
// sonst crash bei HW-Zugriff!!!!
|
|
//diary = new T_lib_diary(); absturz!!!!!!
|
|
//conf = new T_lib_config(HWaccess);
|
|
|
|
timerChainCtrl = new QTimer(this);
|
|
connect(timerChainCtrl, SIGNAL(timeout()), this, SLOT(chainControl()));
|
|
timerChainCtrl->setSingleShot(0);
|
|
timerChainCtrl->start(UPDATE_PERIOD_MS); // 1000: call every 1000ms
|
|
|
|
timerVendingTimeout = new QTimer(this);
|
|
connect(timerVendingTimeout, SIGNAL(timeout()), this, SLOT(vendingTimeout()));
|
|
timerVendingTimeout->setSingleShot(true);
|
|
timerVendingTimeout->start(VENDINGTIMEOUT_MS); // in ms
|
|
|
|
// ##########################################################################################
|
|
// für jedes anzuzeigende Fenster eine eigene Groupbox mit eigenem Grid anlegen:
|
|
|
|
frame01 = new QGroupBox;
|
|
frame01->setStyleSheet(APPPAGE_BACKGROUND_COLOR);
|
|
frame01->setMinimumSize(FORMWIDTH,FORMHEIGHT);
|
|
QVBoxLayout *smallLay01 = new QVBoxLayout;
|
|
frame01->setLayout(smallLay01);
|
|
// Fensterinhalt aus externer Klasse einfügen:
|
|
myFenster01 = new T_winComPort(HWaccess); // HWaccess damit auf das HW-Plugin zugegriffen werden kann, sonst crash
|
|
smallLay01->addWidget(myFenster01);
|
|
|
|
// ##########################################################################################
|
|
// draw Mainwindow:
|
|
bigGroupbox = new QGroupBox;
|
|
bigGroupbox->setStyleSheet("background-color: grey");
|
|
bigGroupbox->setMinimumSize(800,480);
|
|
// bigLayout = new QVBoxLayout; // navi buttons on bottom side
|
|
bigLayout = new QHBoxLayout; // navi buttons right hand
|
|
|
|
// ##########################################################################################
|
|
// add all windows (but display only one)
|
|
// display only one: then all windows are shown at the same place
|
|
// display more then one: the windows are listed in vertical order
|
|
|
|
bigLayout->addWidget(frame01);
|
|
|
|
bigGroupbox->setLayout(bigLayout);
|
|
switchScreen(1);
|
|
//HideAllWindows();
|
|
|
|
// ##########################################################################################
|
|
// Steuer Leiste
|
|
|
|
//QHBoxLayout *ButtonLayout = new QHBoxLayout();
|
|
QVBoxLayout *ButtonLayout = new QVBoxLayout();
|
|
QFont myTabFont;
|
|
myTabFont.setPixelSize(26);
|
|
|
|
pBback = new QPushButton("<"); //b\na\nc\nk");
|
|
pBback->setFont(myTabFont);
|
|
pBback->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
pBback->setMinimumHeight(NAVIBUTTONHEIGHT);
|
|
pBback->setMaximumWidth(NAVIBUTTONWIDHT);
|
|
connect(pBback, SIGNAL( clicked() ), myFenster01, SLOT( Nav_back()));
|
|
|
|
myTabFont.setPixelSize(22);
|
|
pBhome = new QPushButton("<<"); //h\no\nm\ne");
|
|
pBhome->setFont(myTabFont);
|
|
pBhome->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
pBhome->setMinimumHeight(NAVIBUTTONHEIGHT);
|
|
pBhome->setMaximumWidth(NAVIBUTTONWIDHT);
|
|
connect(pBhome, SIGNAL( clicked() ), myFenster01, SLOT( Nav_home()));
|
|
|
|
myTabFont.setPixelSize(26);
|
|
pBforward = new QPushButton(">"); //n\ne\nx\nt");
|
|
pBforward->setFont(myTabFont);
|
|
pBforward->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
pBforward->setMinimumHeight(NAVIBUTTONHEIGHT);
|
|
pBforward->setMaximumWidth(NAVIBUTTONWIDHT);
|
|
connect(pBforward, SIGNAL( clicked() ), myFenster01, SLOT( Nav_next()));
|
|
|
|
QLabel *buttonSpace = new QLabel(" ");
|
|
ButtonLayout->addWidget(pBback);
|
|
ButtonLayout->addWidget(buttonSpace);
|
|
//ButtonLayout->addWidget(buttonSpace);
|
|
ButtonLayout->addWidget(pBhome);
|
|
ButtonLayout->addWidget(buttonSpace);
|
|
//ButtonLayout->addWidget(buttonSpace);
|
|
ButtonLayout->addWidget(pBforward);
|
|
QLabel *bottomSpace = new QLabel(" ");
|
|
ButtonLayout->addWidget(bottomSpace);
|
|
|
|
bigLayout->addLayout(ButtonLayout);
|
|
|
|
setCentralWidget(bigGroupbox);
|
|
|
|
// AUTOSTART serial transmission
|
|
//HWaccess->dc_openSerial(5,"115200","ttyS0",1); // my suse computer
|
|
//HWaccess->dc_openSerial(1,"9600","COM5",1); // my suse computer
|
|
//HWaccess->dc_openSerial(5,"115200","ttymxc2",1); // ptu5
|
|
//HWaccess->dc_autoRequest(true);
|
|
//myFenster01->setButtons4autoStart();
|
|
//HWaccess->alarm_switchSiren(0); // test
|
|
|
|
enableNaviButtons(BACKBUTTON,true);
|
|
enableNaviButtons(HOMEBUTTON,true);
|
|
enableNaviButtons(FORWBUTTON,true);
|
|
this->chainIni();
|
|
|
|
//connect(myFenster02, SIGNAL(quitMyApp()), this, SLOT(close()));
|
|
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
loadPlugIn(2);
|
|
}
|
|
|
|
|
|
void MainWindow::HideAllWindows()
|
|
{
|
|
// vorsicht: Fenster muss oben definiert sein sonst Programmabsturz ohne Kommentar
|
|
|
|
frame01->setEnabled(false);
|
|
frame01->setVisible(false);
|
|
}
|
|
|
|
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
// Call Windows
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
void MainWindow::switchScreen(uint16_t winNr) // 0...30
|
|
{
|
|
|
|
HideAllWindows();
|
|
//qDebug()<<"switch screen to " << winNr;
|
|
|
|
switch (winNr)
|
|
{
|
|
case 1:
|
|
frame01->setEnabled(true);
|
|
frame01->setVisible(true);
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
// Navigation buttons
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
void MainWindow::enableNaviButtons(uint8_t switchBitwise)
|
|
{
|
|
// switchBitwise=0: no change
|
|
// bit0,1: enable/disable button "next"
|
|
// bit2,3: enable/disable button "home"
|
|
// bit4,5: enable/disable button "back"
|
|
|
|
if (switchBitwise &1)
|
|
{
|
|
pBforward->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBforward->setText("next");
|
|
pBforward->setEnabled(true);
|
|
} else
|
|
if (switchBitwise &2)
|
|
{
|
|
pBforward->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBforward->setText(" ");
|
|
pBforward->setEnabled(false);
|
|
}
|
|
|
|
if (switchBitwise &4)
|
|
{
|
|
pBhome->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBhome->setText("home");
|
|
pBhome->setEnabled(true);
|
|
} else
|
|
if (switchBitwise &8)
|
|
{
|
|
pBhome->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBhome->setText(" ");
|
|
pBhome->setEnabled(false);
|
|
}
|
|
|
|
if (switchBitwise &16)
|
|
{
|
|
pBback->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBback->setText("back");
|
|
pBback->setEnabled(true);
|
|
} else
|
|
if (switchBitwise &32)
|
|
{
|
|
pBback->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBback->setText(" ");
|
|
pBback->setEnabled(false);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
void MainWindow::enableNaviButtons(uint8_t buttonNr, bool enabled)
|
|
{
|
|
if (buttonNr==1)
|
|
{
|
|
if (enabled)
|
|
{
|
|
pBback->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBback->setText("back");
|
|
pBback->setEnabled(true);
|
|
} else
|
|
{
|
|
pBback->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBback->setText(" ");
|
|
pBback->setEnabled(false);
|
|
}
|
|
} else
|
|
if (buttonNr==2)
|
|
{
|
|
if (enabled)
|
|
{
|
|
pBhome->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBhome->setText("home");
|
|
pBhome->setEnabled(true);
|
|
} else
|
|
{
|
|
pBhome->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBhome->setText(" ");
|
|
pBhome->setEnabled(false);
|
|
}
|
|
} else
|
|
if (buttonNr==3)
|
|
{
|
|
if (enabled)
|
|
{
|
|
pBforward->setStyleSheet(ACTIVE_NAVI_COLOR);
|
|
//pBforward->setText("next");
|
|
pBforward->setEnabled(true);
|
|
} else
|
|
{
|
|
pBforward->setStyleSheet(DISABL_NAVI_COLOR);
|
|
//pBforward->setText(" ");
|
|
pBforward->setEnabled(false);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
// control work flow by Finite state machine
|
|
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
static uint16_t chainCurrentStep, chainNextStep;
|
|
static bool chain_stepIni;
|
|
|
|
void MainWindow::chainIni(void)
|
|
{
|
|
// called once after power-up by constructor
|
|
chainCurrentStep=WCS_STARTSCREEN; // start screen
|
|
chainNextStep=chainCurrentStep;
|
|
switchScreen(chainCurrentStep);
|
|
chain_stepIni=true;
|
|
//qDebug()<<"chain ini, call step "<<WCS_STARTUP << " " << chainCurrentStep;
|
|
}
|
|
|
|
void MainWindow::chainControl(void)
|
|
{
|
|
|
|
uint16_t nextScreen=0;
|
|
uint8_t useNavi=0;
|
|
bool busy=false;
|
|
// working step chain:
|
|
if (chainCurrentStep != chainNextStep)
|
|
{
|
|
if (chainNextStep!=WCS_STARTSCREEN)
|
|
{
|
|
timerVendingTimeout->stop();
|
|
timerVendingTimeout->start(VENDINGTIMEOUT_MS);
|
|
}
|
|
//qDebug()<<"found new sreen";
|
|
chainCurrentStep=chainNextStep;
|
|
switchScreen(chainCurrentStep);
|
|
chain_stepIni=true;
|
|
|
|
}
|
|
|
|
if (chainCurrentStep==1)
|
|
{
|
|
if (chain_stepIni)
|
|
busy=myFenster01->work_ini(&nextScreen, &useNavi);
|
|
else
|
|
busy=myFenster01->working(&nextScreen, &useNavi);
|
|
} else
|
|
|
|
{
|
|
// error undefined step
|
|
qDebug()<<"error main chain control, wrong step ("<<chainCurrentStep<<") selected";
|
|
|
|
}
|
|
|
|
if (chain_stepIni)
|
|
{
|
|
chain_stepIni=false;
|
|
switchScreen(chainCurrentStep); // the mainWindow frame has always the same number as the working step
|
|
}
|
|
|
|
if (nextScreen>0)
|
|
{
|
|
// call next chain step
|
|
//qDebug()<<"chain control: new step selected: "<< nextScreen;
|
|
|
|
chainNextStep=nextScreen;
|
|
}
|
|
if (useNavi>0)
|
|
{
|
|
//qDebug()<<"chain control: navi buttons "<< useNavi;
|
|
enableNaviButtons(useNavi);
|
|
}
|
|
|
|
if (busy>0)
|
|
{
|
|
// reset time-out
|
|
timerVendingTimeout->start();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void MainWindow::vendingTimeout(void)
|
|
{
|
|
// there was no user operation for 30s so return to start screen
|
|
// uint16_t nextScreen=WCS_STARTSCREEN;
|
|
// chainNextStep=nextScreen; erstmal stilllegen, stört bei IBN
|
|
//qDebug()<<"chain control: vending TO";
|
|
timerVendingTimeout->stop();
|
|
}
|
|
|
|
|
|
|