Files
bcrt/mainwindow.cpp
2025-08-11 19:25:43 +03:00

315 lines
9.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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()
{
}