326 lines
9.3 KiB
C++
326 lines
9.3 KiB
C++
#include "mainwindow.h"
|
||
//#include "windows.h"
|
||
//#include "WDMTMKv2.cpp"
|
||
#include "bcmil.cpp"
|
||
|
||
TTmkEventData tmkEvD;
|
||
extern HANDLE hBcEvent;
|
||
|
||
//#define RT_ADDR 10
|
||
|
||
//const int fInstMode = 1;
|
||
|
||
unsigned short awBuf[32];
|
||
|
||
TMK_DATA wBase, wMaxBase, wLen;
|
||
extern TMK_DATA wSubAddr, wState;
|
||
|
||
unsigned char HexBinFlag = 1; //1 - hex, 0 - bin
|
||
|
||
MainWindow::MainWindow()
|
||
{
|
||
init_mainwindowobj();
|
||
init_table();
|
||
init_connections();
|
||
}
|
||
|
||
void MainWindow::init_mainwindowobj()
|
||
{
|
||
qDebug() << "Startyem";
|
||
|
||
Window_1 = new QWidget;
|
||
Window_2 = new QWidget;
|
||
|
||
HexBinButton = new QPushButton("Hex/Bin");
|
||
HexBinLabel = new QLabel("Hex");
|
||
|
||
CmdWordLabel = new QLabel("Enter the command word:");
|
||
CmdWordLineEdit = new QLineEdit;
|
||
EnterCmdWordButton = new QPushButton("Start");
|
||
DataTable = new QTableWidget;
|
||
|
||
QGridLayout *layout_g = new QGridLayout(Window_2);
|
||
layout_g->addWidget(HexBinButton, 0, 1);
|
||
layout_g->addWidget(HexBinLabel, 0, 0);
|
||
layout_g->addWidget(CmdWordLabel, 1, 0); // Row 0, Column 0
|
||
layout_g->addWidget(CmdWordLineEdit, 2, 0);
|
||
layout_g->addWidget(EnterCmdWordButton, 3, 0);
|
||
|
||
Window_2->setLayout(layout_g);
|
||
setCentralWidget(Window_2);
|
||
|
||
QVBoxLayout *layout = new QVBoxLayout(Window_1);
|
||
layout->addWidget(Window_2);
|
||
layout->addWidget(DataTable);
|
||
|
||
Window_1->setLayout(layout);
|
||
setCentralWidget(Window_1);
|
||
}
|
||
|
||
void MainWindow::init_connections()
|
||
{
|
||
/*connect(EnterCmdWordButton,
|
||
SIGNAL(clicked()),
|
||
this,
|
||
SLOT(getlineedit()));*/
|
||
/*connect(EnterCmdWordButton,
|
||
SIGNAL(clicked()),
|
||
this,
|
||
SLOT(sendcmdwrd()));*/
|
||
connect(EnterCmdWordButton,
|
||
SIGNAL(clicked()),
|
||
this,
|
||
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()
|
||
{
|
||
qDebug() << "Entered the button command word";
|
||
QString CmdW = CmdWordLineEdit->text();
|
||
qDebug() << CmdW;
|
||
|
||
QScopedPointer<CommandWord> NewCmdWord(new CommandWord());
|
||
NewCmdWord->description(CmdW);
|
||
|
||
set_item(DataTable, 0, 0, "Адрес устройства", false);
|
||
set_item(DataTable, 0, 1, intToBinaryString(NewCmdWord->addrRTf), false);
|
||
set_item(DataTable, 0, 2, intToDecString(NewCmdWord->addrRTf), false);
|
||
|
||
if(NewCmdWord->Kf)
|
||
{
|
||
set_item(DataTable, 1, 0, "Передача", false);
|
||
set_item(DataTable, 1, 1, intToBinaryString(NewCmdWord->Kf), false);
|
||
set_item(DataTable, 1, 2, intToDecString(NewCmdWord->Kf), false);
|
||
}
|
||
else
|
||
{
|
||
set_item(DataTable, 1, 0, "Прием", false);
|
||
set_item(DataTable, 1, 1, intToBinaryString(NewCmdWord->Kf), false);
|
||
set_item(DataTable, 1, 2, intToDecString(NewCmdWord->Kf), false);
|
||
}
|
||
|
||
if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31))
|
||
{
|
||
set_item(DataTable, 2, 0, "Режим управления", false);
|
||
set_item(DataTable, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false);
|
||
set_item(DataTable, 2, 2, intToDecString(NewCmdWord->subAddrf), false);
|
||
}
|
||
else
|
||
{
|
||
set_item(DataTable, 2, 0, "Подадрес", false);
|
||
set_item(DataTable, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false);
|
||
set_item(DataTable, 2, 2, intToDecString(NewCmdWord->subAddrf), false);
|
||
}
|
||
|
||
if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31))
|
||
{
|
||
set_item(DataTable, 3, 0, NewCmdWord->cmdCode.value(NewCmdWord->numDWf), false);
|
||
set_item(DataTable, 3, 1, intToBinaryString(NewCmdWord->numDWf), false);
|
||
set_item(DataTable, 3, 2, intToDecString(NewCmdWord->numDWf), false);
|
||
}
|
||
else
|
||
{
|
||
if(NewCmdWord->numDWf == 0)
|
||
{
|
||
set_item(DataTable, 3, 0, "Число СД", false);
|
||
set_item(DataTable, 3, 1, intToBinaryString(32), false);
|
||
set_item(DataTable, 3, 2, intToDecString(32), false);
|
||
}
|
||
else
|
||
{
|
||
set_item(DataTable, 3, 0, "Число СД", false);
|
||
set_item(DataTable, 3, 1, intToBinaryString(NewCmdWord->numDWf), false);
|
||
set_item(DataTable, 3, 2, intToDecString(NewCmdWord->numDWf), false);
|
||
}
|
||
}
|
||
}*/
|
||
|
||
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()
|
||
{
|
||
int ColCount = 3;
|
||
int RowCount = 4;
|
||
QStringList header;
|
||
header << "Биты КС" << "Бинарное представление" << "Десятичное представление";
|
||
|
||
DataTable->setColumnCount(ColCount);
|
||
DataTable->setRowCount(RowCount);
|
||
DataTable->setHorizontalHeaderLabels(header);
|
||
DataTable->verticalHeader()->setVisible(true);
|
||
|
||
DataTable->setColumnWidth(0,200);
|
||
DataTable->setColumnWidth(1,160);
|
||
DataTable->setColumnWidth(2,160);
|
||
|
||
for(int i = 0; i < RowCount; i++)
|
||
{
|
||
DataTable->setRowHeight(i,20);
|
||
for(int j = 0; j < ColCount; j++)
|
||
set_item(DataTable, i, j, "%", false);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void MainWindow::set_item(QTableWidget *pTable, int indRow,
|
||
int indCol, QString data, bool editFlag)
|
||
{
|
||
QColor color;
|
||
color.black();
|
||
QTableWidgetItem *itm =
|
||
new QTableWidgetItem(data);
|
||
pTable->setItem(indRow,indCol,itm);
|
||
|
||
if (editFlag) {}
|
||
else
|
||
{
|
||
pTable->item(indRow, indCol)->setFlags(Qt::ItemIsSelectable|
|
||
Qt::ItemIsDragEnabled|
|
||
Qt::ItemIsUserCheckable);
|
||
}
|
||
pTable->item(indRow, indCol)->setTextColor(color);
|
||
}
|
||
|
||
/*void MainWindow::sendcmdwrd()
|
||
{
|
||
qDebug() << "send1";
|
||
QScopedPointer<BC_MIL> NewBC(new BC_MIL(0));
|
||
qDebug() << "send2";
|
||
wBase = 0;
|
||
wMaxBase = bcgetmaxbase();
|
||
srand(1);
|
||
|
||
//Select base
|
||
if (wBase > wMaxBase)
|
||
wBase = 0;
|
||
bcdefbase(wBase);
|
||
qDebug() << "send3";
|
||
|
||
//Prepare data to RT
|
||
//wSubAddr = rand() & 0x1F;
|
||
wSubAddr = 0x1F;;
|
||
//if (fInstMode)
|
||
// wSubAddr |= 0x10;
|
||
//wLen = rand() & 0x1F;
|
||
wLen = 0x1;
|
||
if (wLen == 0)
|
||
wLen = 32;
|
||
for (int i = 0; i < wLen; ++i)
|
||
awBuf[i] = (wSubAddr<<8) | i;
|
||
qDebug() << "send4";
|
||
|
||
//Try to send data to RT until it answers with Clear Status
|
||
bcputw(0, CW(RT_ADDR, RT_RECEIVE, wSubAddr, wLen));
|
||
bcputblk(1, awBuf, wLen);
|
||
do
|
||
{
|
||
//bcstartx(wBase, DATA_BC_RT | CX_STOP | CX_BUS_A | CX_NOSIG);
|
||
bcstartx(wBase, DATA_BC_RT | CX_STOP | CX_BUS_B | CX_NOSIG);
|
||
if (NewBC->WaitInt(DATA_BC_RT))
|
||
NewBC->closeAll();
|
||
} while ((tmkEvD.bcx.wResultX & (SX_ERR_MASK | SX_IB_MASK)) != 0);
|
||
qDebug() << "send5";
|
||
NewBC->closeAll();
|
||
}*/
|
||
|
||
void MainWindow::rthandler()
|
||
{
|
||
qDebug() << "rt1";
|
||
QScopedPointer<RT_MIL> NewRT(new RT_MIL(0, 1));
|
||
qDebug() << "rt2";
|
||
|
||
int i = 0;
|
||
while (i != 1000)
|
||
{
|
||
i++;
|
||
if (tmkselect(0))
|
||
{
|
||
qDebug() << "tmk select error";
|
||
NewRT->closeAllrt();
|
||
}
|
||
//Wait for an interrupt
|
||
switch (WaitForSingleObject(hBcEvent, 1000))
|
||
{
|
||
case WAIT_OBJECT_0:
|
||
qDebug() << "Interrupt";
|
||
//New message has arrived
|
||
ResetEvent(hBcEvent);
|
||
do
|
||
{
|
||
//Get interrupt data
|
||
tmkgetevd(&tmkEvD);
|
||
//Check interrupt type
|
||
if (tmkEvD.nInt == 3)
|
||
{
|
||
wSubAddr = (tmkEvD.rt.wStatus >> 5) &0x1F;
|
||
wLen = tmkEvD.rt.wStatus & 0x1F;
|
||
if (wLen == 0)
|
||
wLen = 32;
|
||
if ((tmkEvD.rt.wStatus & RT_DIR_MASK) == RT_RECEIVE)
|
||
{
|
||
//If we received some data then copy the data from Rx subaddres to
|
||
//Tx subaddress and process flags
|
||
if ((rtgetflag(RT_RECEIVE, wSubAddr) & RT_FLAG_MASK) == 0)
|
||
{
|
||
//qDebug() << "Flag read error";
|
||
NewRT->closeAllrt();
|
||
}
|
||
rtdefsubaddr(RT_RECEIVE, wSubAddr);
|
||
rtgetblk(0, awBuf, wLen);
|
||
rtclrflag();
|
||
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
|
||
rtputblk(0, awBuf, wLen);
|
||
rtsetflag();
|
||
}
|
||
}
|
||
} 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;
|
||
}
|
||
}
|
||
NewRT->closeAllrt();
|
||
}
|
||
|
||
MainWindow::~MainWindow()
|
||
{
|
||
}
|