fixed bc mode v2
This commit is contained in:
79
bcmil.cpp
79
bcmil.cpp
@@ -1,18 +1,17 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include "bcmil.h"
|
#include "bcmil.h"
|
||||||
#include "WDMTMKv2.cpp"
|
#include "WDMTMKv2.cpp"
|
||||||
//#include <windows.h>
|
|
||||||
|
|
||||||
//TTmkEventData tmkEvD;
|
TTmkEventData tmkEvD;
|
||||||
HANDLE hBcEvent;
|
HANDLE hEvent;
|
||||||
//HANDLE hRtEvent;
|
|
||||||
|
|
||||||
int nTmk;
|
int nTmk;
|
||||||
unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0;
|
unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0;
|
||||||
unsigned long dwStarts = 0L;
|
unsigned long dwStarts = 0L;
|
||||||
TMK_DATA wSubAddr, wState, wStatus;
|
TMK_DATA wSubAddr, wState, wStatus;
|
||||||
|
|
||||||
MIL::MIL(int dev_index) //open the driver, configuration, create event
|
//Open the driver, configuration, create event
|
||||||
|
MIL::MIL(int dev_index)
|
||||||
{
|
{
|
||||||
qDebug() << "MIL constructor";
|
qDebug() << "MIL constructor";
|
||||||
if (TmkOpen())
|
if (TmkOpen())
|
||||||
@@ -39,6 +38,15 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
|
if (!hEvent)
|
||||||
|
{
|
||||||
|
qDebug() << "CreateEvent() error";
|
||||||
|
closeAllrt();
|
||||||
|
}
|
||||||
|
ResetEvent(hEvent);
|
||||||
|
tmkdefevent(hEvent, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*int MIL::WaitInt(TMK_DATA wCtrlCode)
|
/*int MIL::WaitInt(TMK_DATA wCtrlCode)
|
||||||
@@ -96,7 +104,7 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event
|
|||||||
//printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts);
|
//printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts);
|
||||||
bcreset();
|
bcreset();
|
||||||
//Close all opened things
|
//Close all opened things
|
||||||
CloseHandle(hBcEvent);
|
CloseHandle(hEvent);
|
||||||
tmkdone(ALL_TMKS);
|
tmkdone(ALL_TMKS);
|
||||||
TmkClose();
|
TmkClose();
|
||||||
}*/
|
}*/
|
||||||
@@ -104,14 +112,41 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event
|
|||||||
void MIL::closeAllrt()
|
void MIL::closeAllrt()
|
||||||
{
|
{
|
||||||
qDebug() << "Close All";
|
qDebug() << "Close All";
|
||||||
//printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts);
|
|
||||||
rtreset();
|
rtreset();
|
||||||
//Close all opened things
|
CloseHandle(hEvent);
|
||||||
CloseHandle(hBcEvent);
|
|
||||||
tmkdone(ALL_TMKS);
|
tmkdone(ALL_TMKS);
|
||||||
TmkClose();
|
TmkClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MIL::GetEvent(unsigned short Timeout)
|
||||||
|
{
|
||||||
|
if (tmkselect(this->m_TmkIndex))
|
||||||
|
{
|
||||||
|
qDebug() << "tmkselect() error";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (WaitForSingleObject(hEvent, Timeout))
|
||||||
|
{
|
||||||
|
case WAIT_OBJECT_0:
|
||||||
|
qDebug() << "Interrupt";
|
||||||
|
ResetEvent(hEvent);
|
||||||
|
tmkgetevd(&tmkEvD);
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WAIT_TIMEOUT:
|
||||||
|
//qDebug() << "No new messages";
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
qDebug() << "Interrupt wait error";
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
MIL::~MIL()
|
MIL::~MIL()
|
||||||
{
|
{
|
||||||
qDebug() << "MIL destructor";
|
qDebug() << "MIL destructor";
|
||||||
@@ -147,44 +182,26 @@ RT_MIL::RT_MIL(int dev_index, unsigned short Addr): MIL(dev_index)
|
|||||||
qDebug() << "RT_MIL constructor";
|
qDebug() << "RT_MIL constructor";
|
||||||
this->m_Addr = Addr;
|
this->m_Addr = Addr;
|
||||||
|
|
||||||
//Find first configured device
|
|
||||||
for (nTmk = 0; nTmk <= MAX_TMK_NUMBER; ++nTmk)
|
|
||||||
if (!tmkselect(nTmk))
|
|
||||||
break;
|
|
||||||
if (nTmk > MAX_TMK_NUMBER)
|
|
||||||
{
|
|
||||||
qDebug() << "tmkselect error";
|
|
||||||
closeAllrt();
|
|
||||||
}
|
|
||||||
//Try to reset in RT mode
|
//Try to reset in RT mode
|
||||||
if (rtreset())
|
if (rtreset())
|
||||||
{
|
{
|
||||||
qDebug() << "rtreset error";
|
qDebug() << "rtreset() error";
|
||||||
closeAllrt();
|
closeAllrt();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Set RT address, set flag mode, enable data irqs
|
//Set RT address, set flag mode, enable data irqs
|
||||||
rtdefaddress(Addr);
|
rtdefaddress(Addr);
|
||||||
rtdefmode(rtgetmode()|RT_FLAG_MODE);
|
rtdefmode(0);
|
||||||
//rtdefmode(rtgetmode()&~RT_FLAG_MODE);
|
|
||||||
rtdefirqmode(rtgetirqmode()&~RT_DATA_BL);
|
rtdefirqmode(rtgetirqmode()&~RT_DATA_BL);
|
||||||
|
|
||||||
|
//Ready to receive, not ready to transmit
|
||||||
for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr)
|
for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr)
|
||||||
{
|
{
|
||||||
//Ready to receive, not ready to transmit
|
|
||||||
rtdefsubaddr(RT_RECEIVE, wSubAddr);
|
rtdefsubaddr(RT_RECEIVE, wSubAddr);
|
||||||
rtclrflag();
|
rtclrflag();
|
||||||
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
|
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
|
||||||
rtclrflag();
|
rtclrflag();
|
||||||
}
|
}
|
||||||
|
|
||||||
hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
|
||||||
if (!hBcEvent)
|
|
||||||
{
|
|
||||||
qDebug() << "create event error";
|
|
||||||
closeAllrt();
|
|
||||||
}
|
|
||||||
ResetEvent(hBcEvent);
|
|
||||||
tmkdefevent(hBcEvent, TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RT_MIL::~RT_MIL()
|
RT_MIL::~RT_MIL()
|
||||||
|
54
bcmil.h
54
bcmil.h
@@ -3,54 +3,6 @@
|
|||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
//*******************
|
|
||||||
//#include "WDMTMKv2.h"
|
|
||||||
//#include "windows.h"
|
|
||||||
//*******************
|
|
||||||
/*typedef struct
|
|
||||||
{
|
|
||||||
int nInt;
|
|
||||||
unsigned short wMode;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wResult;
|
|
||||||
unsigned short wAW1;
|
|
||||||
unsigned short wAW2;
|
|
||||||
} bc;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wBase;
|
|
||||||
unsigned short wResultX;
|
|
||||||
} bcx;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wStatus;
|
|
||||||
unsigned short wCmd;
|
|
||||||
} rt;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wBase;
|
|
||||||
unsigned short wResultX;
|
|
||||||
} mt;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wStatus;
|
|
||||||
} mrt;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wRequest;
|
|
||||||
// DWORD dwTimer;
|
|
||||||
} tmk;
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
unsigned short wData1;
|
|
||||||
unsigned short wData2;
|
|
||||||
} raw;
|
|
||||||
};
|
|
||||||
} TTmkEventData1;*/
|
|
||||||
|
|
||||||
#define TMK_DATA unsigned short
|
#define TMK_DATA unsigned short
|
||||||
typedef void *HANDLE;
|
typedef void *HANDLE;
|
||||||
|
|
||||||
@@ -67,12 +19,8 @@ public:
|
|||||||
//int WaitInt(TMK_DATA wCtrlCode);
|
//int WaitInt(TMK_DATA wCtrlCode);
|
||||||
//void closeAll();
|
//void closeAll();
|
||||||
void closeAllrt();
|
void closeAllrt();
|
||||||
//bool GetEvent(TTmkEventData1 *pEv, unsigned short Timeout);
|
bool GetEvent(unsigned short Timeout);
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
int m_TmkIndex;
|
int m_TmkIndex;
|
||||||
//HANDLE m_hEvent;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*class BC_MIL:public MIL
|
/*class BC_MIL:public MIL
|
||||||
|
135
mainwindow.cpp
135
mainwindow.cpp
@@ -3,19 +3,17 @@
|
|||||||
//#include "WDMTMKv2.cpp"
|
//#include "WDMTMKv2.cpp"
|
||||||
#include "bcmil.cpp"
|
#include "bcmil.cpp"
|
||||||
|
|
||||||
TTmkEventData tmkEvD;
|
extern TTmkEventData tmkEvD;
|
||||||
extern HANDLE hBcEvent;
|
extern HANDLE hEvent;
|
||||||
|
|
||||||
//#define RT_ADDR 10
|
#define RT_ADDR 0x1
|
||||||
|
|
||||||
//const int fInstMode = 1;
|
|
||||||
|
|
||||||
unsigned short awBuf[32];
|
unsigned short awBuf[32];
|
||||||
|
|
||||||
TMK_DATA wBase, wMaxBase, wLen;
|
TMK_DATA wBase, wMaxBase, wLen;
|
||||||
extern TMK_DATA wSubAddr, wState;
|
extern TMK_DATA wSubAddr, wState;
|
||||||
|
|
||||||
unsigned char HexBinFlag = 1; //1 - hex, 0 - bin
|
int HexBinFlag = 1;
|
||||||
|
|
||||||
MainWindow::MainWindow()
|
MainWindow::MainWindow()
|
||||||
{
|
{
|
||||||
@@ -31,20 +29,19 @@ void MainWindow::init_mainwindowobj()
|
|||||||
Window_1 = new QWidget;
|
Window_1 = new QWidget;
|
||||||
Window_2 = new QWidget;
|
Window_2 = new QWidget;
|
||||||
|
|
||||||
HexBinButton = new QPushButton("Hex/Bin");
|
RtModeLabel = new QLabel("RT mode");
|
||||||
HexBinLabel = new QLabel("Hex");
|
StartRtModeButton = new QPushButton("Start RT mode");
|
||||||
|
|
||||||
|
BcModeLabel = new QLabel("BC mode");
|
||||||
|
StartBcModeButton = new QPushButton("Start BC mode");
|
||||||
|
|
||||||
CmdWordLabel = new QLabel("Enter the command word:");
|
|
||||||
CmdWordLineEdit = new QLineEdit;
|
|
||||||
EnterCmdWordButton = new QPushButton("Start");
|
|
||||||
DataTable = new QTableWidget;
|
DataTable = new QTableWidget;
|
||||||
|
|
||||||
QGridLayout *layout_g = new QGridLayout(Window_2);
|
QGridLayout *layout_g = new QGridLayout(Window_2);
|
||||||
layout_g->addWidget(HexBinButton, 0, 1);
|
layout_g->addWidget(RtModeLabel, 0, 0); // Row 0, Column 0
|
||||||
layout_g->addWidget(HexBinLabel, 0, 0);
|
layout_g->addWidget(StartRtModeButton, 1, 0);
|
||||||
layout_g->addWidget(CmdWordLabel, 1, 0); // Row 0, Column 0
|
layout_g->addWidget(BcModeLabel, 0, 1);
|
||||||
layout_g->addWidget(CmdWordLineEdit, 2, 0);
|
layout_g->addWidget(StartBcModeButton, 1, 1);
|
||||||
layout_g->addWidget(EnterCmdWordButton, 3, 0);
|
|
||||||
|
|
||||||
Window_2->setLayout(layout_g);
|
Window_2->setLayout(layout_g);
|
||||||
setCentralWidget(Window_2);
|
setCentralWidget(Window_2);
|
||||||
@@ -63,28 +60,14 @@ void MainWindow::init_connections()
|
|||||||
SIGNAL(clicked()),
|
SIGNAL(clicked()),
|
||||||
this,
|
this,
|
||||||
SLOT(getlineedit()));*/
|
SLOT(getlineedit()));*/
|
||||||
/*connect(EnterCmdWordButton,
|
/*connect(StartBcModeButton,
|
||||||
SIGNAL(clicked()),
|
SIGNAL(clicked()),
|
||||||
this,
|
this,
|
||||||
SLOT(sendcmdwrd()));*/
|
SLOT(bchandler()));*/
|
||||||
connect(EnterCmdWordButton,
|
connect(StartRtModeButton,
|
||||||
SIGNAL(clicked()),
|
SIGNAL(clicked()),
|
||||||
this,
|
this,
|
||||||
SLOT(rthandler()));
|
SLOT(rthandler()));
|
||||||
connect(HexBinButton,
|
|
||||||
SIGNAL(clicked()),
|
|
||||||
this,
|
|
||||||
SLOT(HexBinChange()));
|
|
||||||
}
|
|
||||||
|
|
||||||
QString intToBinaryString(int number)
|
|
||||||
{
|
|
||||||
return QString::number(number,2);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString intToDecString(int number)
|
|
||||||
{
|
|
||||||
return QString::number(number,10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void MainWindow::getlineedit()
|
/*void MainWindow::getlineedit()
|
||||||
@@ -149,22 +132,6 @@ QString intToDecString(int number)
|
|||||||
}
|
}
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
void MainWindow::HexBinChange()
|
|
||||||
{
|
|
||||||
switch(HexBinFlag)
|
|
||||||
{
|
|
||||||
case 0: //было bin
|
|
||||||
HexBinLabel->setText("Hex");
|
|
||||||
HexBinFlag = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 1: //было hex
|
|
||||||
HexBinLabel->setText("Bin");
|
|
||||||
HexBinFlag = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::init_table()
|
void MainWindow::init_table()
|
||||||
{
|
{
|
||||||
int ColCount = 3;
|
int ColCount = 3;
|
||||||
@@ -189,8 +156,6 @@ void MainWindow::init_table()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::set_item(QTableWidget *pTable, int indRow,
|
void MainWindow::set_item(QTableWidget *pTable, int indRow,
|
||||||
int indCol, QString data, bool editFlag)
|
int indCol, QString data, bool editFlag)
|
||||||
{
|
{
|
||||||
@@ -210,7 +175,7 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow,
|
|||||||
pTable->item(indRow, indCol)->setTextColor(color);
|
pTable->item(indRow, indCol)->setTextColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void MainWindow::sendcmdwrd()
|
/*void MainWindow::bchandler()
|
||||||
{
|
{
|
||||||
qDebug() << "send1";
|
qDebug() << "send1";
|
||||||
QScopedPointer<BC_MIL> NewBC(new BC_MIL(0));
|
QScopedPointer<BC_MIL> NewBC(new BC_MIL(0));
|
||||||
@@ -254,66 +219,44 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow,
|
|||||||
|
|
||||||
void MainWindow::rthandler()
|
void MainWindow::rthandler()
|
||||||
{
|
{
|
||||||
qDebug() << "rt1";
|
QScopedPointer<RT_MIL> NewRT(new RT_MIL(0x0, RT_ADDR));
|
||||||
QScopedPointer<RT_MIL> NewRT(new RT_MIL(0, 1));
|
|
||||||
qDebug() << "rt2";
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i != 1000)
|
while (i != 100)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
if (tmkselect(0))
|
|
||||||
|
if(NewRT->GetEvent(1000))
|
||||||
{
|
{
|
||||||
qDebug() << "tmk select error";
|
switch (tmkEvD.nInt)
|
||||||
NewRT->closeAllrt();
|
|
||||||
}
|
|
||||||
//Wait for an interrupt
|
|
||||||
switch (WaitForSingleObject(hBcEvent, 1000))
|
|
||||||
{
|
{
|
||||||
case WAIT_OBJECT_0:
|
case 1:
|
||||||
qDebug() << "Interrupt";
|
qDebug() << "Cmd word arrived " << tmkEvD.rt.wCmd << " " <<tmkEvD.rt.wStatus;
|
||||||
//New message has arrived
|
break;
|
||||||
ResetEvent(hBcEvent);
|
|
||||||
do
|
case 2:
|
||||||
{
|
qDebug() << "Case 2";
|
||||||
//Get interrupt data
|
break;
|
||||||
tmkgetevd(&tmkEvD);
|
|
||||||
//Check interrupt type
|
case 3:
|
||||||
if (tmkEvD.nInt == 3)
|
qDebug() << "Data arrived";
|
||||||
{
|
wSubAddr = (tmkEvD.rt.wStatus >> 5) & 0x1F;
|
||||||
wSubAddr = (tmkEvD.rt.wStatus >> 5) &0x1F;
|
|
||||||
wLen = tmkEvD.rt.wStatus & 0x1F;
|
wLen = tmkEvD.rt.wStatus & 0x1F;
|
||||||
if (wLen == 0)
|
if (wLen == 0)
|
||||||
wLen = 32;
|
wLen = 32;
|
||||||
if ((tmkEvD.rt.wStatus & RT_DIR_MASK) == RT_RECEIVE)
|
|
||||||
|
if (RT_RECEIVE == (tmkEvD.rt.wStatus & RT_DIR_MASK))
|
||||||
{
|
{
|
||||||
//If we received some data then copy the data from Rx subaddres to
|
if (tmkselect(NewRT->m_TmkIndex))
|
||||||
//Tx subaddress and process flags
|
|
||||||
if ((rtgetflag(RT_RECEIVE, wSubAddr) & RT_FLAG_MASK) == 0)
|
|
||||||
{
|
{
|
||||||
//qDebug() << "Flag read error";
|
qDebug() << "tmkselect() error";
|
||||||
NewRT->closeAllrt();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtdefsubaddr(RT_RECEIVE, wSubAddr);
|
rtdefsubaddr(RT_RECEIVE, wSubAddr);
|
||||||
rtgetblk(0, awBuf, wLen);
|
rtgetblk(0, awBuf, wLen);
|
||||||
rtclrflag();
|
|
||||||
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
|
|
||||||
rtputblk(0, awBuf, wLen);
|
|
||||||
rtsetflag();
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} while (tmkEvD.nInt != 0); //Loop while we have not processed all interrupts
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WAIT_TIMEOUT:
|
|
||||||
// No new messages
|
|
||||||
qDebug() << "No new messages";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
qDebug() << "Interrupt wait error";
|
|
||||||
NewRT->closeAllrt();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
mainwindow.h
29
mainwindow.h
@@ -19,37 +19,20 @@ private:
|
|||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
//void getlineedit();
|
//void getlineedit();
|
||||||
//void sendcmdwrd();
|
//void bchandler();
|
||||||
void rthandler();
|
void rthandler();
|
||||||
void HexBinChange();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QWidget *Window_1 = new QWidget;
|
QWidget *Window_1 = new QWidget;
|
||||||
QWidget *Window_2 = new QWidget;
|
QWidget *Window_2 = new QWidget;
|
||||||
|
|
||||||
QLabel *HexBinLabel;
|
QLabel *RtModeLabel;
|
||||||
QPushButton *HexBinButton;
|
QPushButton *StartRtModeButton;
|
||||||
|
|
||||||
|
QLabel *BcModeLabel;
|
||||||
|
QPushButton *StartBcModeButton;
|
||||||
|
|
||||||
QLabel *CmdWordLabel;
|
|
||||||
QLineEdit *CmdWordLineEdit;
|
|
||||||
QPushButton *EnterCmdWordButton;
|
|
||||||
QTableWidget *DataTable;
|
QTableWidget *DataTable;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent *event) override
|
|
||||||
{
|
|
||||||
if (loopActive)
|
|
||||||
{
|
|
||||||
loopActive = false;
|
|
||||||
qDebug() << "Key pressed! Stopping loop.";
|
|
||||||
}
|
|
||||||
QWidget::keyPressEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
bool loopActive = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
Reference in New Issue
Block a user