This commit is contained in:
2025-08-11 19:25:43 +03:00
commit 648e754d32
16 changed files with 4307 additions and 0 deletions

314
mainwindow.cpp Normal file
View File

@@ -0,0 +1,314 @@
#include "mainwindow.h"
//#include <WDMTMKv2.cpp>
extern TTmkEventData tmkEvD;
extern HANDLE hRtEvent;
//#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, 10));
qDebug() << "rt2";
while (loopActive)
{
//Wait for an interrupt
switch (WaitForSingleObject(hRtEvent, 1000))
{
case WAIT_OBJECT_0:
/* New message has arrived */
ResetEvent(hRtEvent);
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();
}
}
NewRT->closeAllrt();
}
MainWindow::~MainWindow()
{
}