Files
bcrt/mainwindow.cpp
2025-09-16 12:08:45 +03:00

519 lines
17 KiB
C++
Raw 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 "bcmil.cpp"
extern TTmkEventData tmkEvD;
extern HANDLE hEvent;
#define RT_ADDR 0x1
unsigned short awBuf[32];
TMK_DATA wBase, wMaxBase, wLen;
extern TMK_DATA wSubAddr, wState;
extern uint8_t wAddr_RT, wRecTrans;
int HexBinFlag = 1; //Hex - 1, Bin - 0
extern int bcrtFlag; //RT = 0, BC = 1
MainWindow::MainWindow()
{
init_mainwindowobj();
init_table_cmd();
init_table_stat();
init_table_dword();
init_connections();
}
void MainWindow::init_mainwindowobj()
{
qDebug() << "Startyem";
Window_1 = new QWidget;
Window_2 = new QWidget;
Window_3 = new QWidget;
Window_4 = new QWidget;
RtModeLabel = new QLabel("RT mode");
StartRtModeButton = new QPushButton("Start RT mode");
BcModeLabel = new QLabel("BC mode");
StartBcModeButton = new QPushButton("Start BC mode");
CmdWordLineEdit = new QLineEdit;
HexBinLabel = new QLabel("Hex");
HexBinButton = new QPushButton("Hex/Bin");
DataTableCmd = new QTableWidget;
DataTableStat = new QTableWidget;
DataTableDWord = new QTableWidget;
QHBoxLayout *layout_h1 = new QHBoxLayout(Window_1);
layout_h1->addWidget(HexBinLabel);
layout_h1->addWidget(HexBinButton);
Window_1->setLayout(layout_h1);
//setCentralWidget(Window_1);
QHBoxLayout *layout_h2 = new QHBoxLayout(Window_2);
layout_h2->addWidget(BcModeLabel);
layout_h2->addWidget(CmdWordLineEdit);
Window_2->setLayout(layout_h2);
setCentralWidget(Window_2);
QGridLayout *layout_g = new QGridLayout(Window_3);
layout_g->addWidget(RtModeLabel, 1, 0);
layout_g->addWidget(Window_2, 1, 1);
layout_g->addWidget(StartRtModeButton, 2, 0);
layout_g->addWidget(StartBcModeButton, 2, 1);
Window_3->setLayout(layout_g);
setCentralWidget(Window_3);
QVBoxLayout *layout_v = new QVBoxLayout(Window_4);
layout_v->addWidget(Window_1);
layout_v->addWidget(Window_3);
layout_v->addWidget(DataTableCmd);
layout_v->addWidget(DataTableStat);
layout_v->addWidget(DataTableDWord);
Window_4->setLayout(layout_v);
setCentralWidget(Window_4);
}
void MainWindow::init_connections()
{
connect(StartBcModeButton,
SIGNAL(clicked()),
this,
SLOT(getlineedit()));
connect(StartRtModeButton,
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);
}
QString intToHexString(int number)
{
return QString::number(number,16);
}
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::getlineedit()
{
for (int i = 0; i < wLen; i++)
set_item(DataTableDWord, 0, i, "%", false);
qDebug() << "Entered the button start bc mode";
QString CmdW = CmdWordLineEdit->text();
qDebug() << CmdW;
bchandler(CmdW);
}
void MainWindow::init_table_cmd()
{
int ColCount = 3;
int RowCount = 4;
QStringList header;
header << "Биты КС" << "Бинарное представление" << "Десятичное представление";
DataTableCmd->setColumnCount(ColCount);
DataTableCmd->setRowCount(RowCount);
DataTableCmd->setHorizontalHeaderLabels(header);
DataTableCmd->verticalHeader()->setVisible(true);
DataTableCmd->setColumnWidth(0,200);
DataTableCmd->setColumnWidth(1,160);
DataTableCmd->setColumnWidth(2,160);
for(int i = 0; i < RowCount; i++)
{
DataTableCmd->setRowHeight(i,20);
for(int j = 0; j < ColCount; j++)
set_item(DataTableCmd, i, j, "%", false);
}
}
void MainWindow::init_table_stat()
{
int ColCount = 3;
int RowCount = 10;
QStringList header;
header << "Биты ОС" << "Бинарное представление" << "Десятичное представление";
DataTableStat->setColumnCount(ColCount);
DataTableStat->setRowCount(RowCount);
DataTableStat->setHorizontalHeaderLabels(header);
DataTableStat->verticalHeader()->setVisible(true);
DataTableStat->setColumnWidth(0,180);
DataTableStat->setColumnWidth(1,160);
DataTableStat->setColumnWidth(2,160);
for(int i = 0; i < RowCount; i++)
{
DataTableStat->setRowHeight(i,20);
for(int j = 0; j < ColCount; j++)
set_item(DataTableStat, i, j, "%", false);
}
}
void MainWindow::init_table_dword()
{
int ColCount = 32;
int RowCount = 1;
QStringList header;
header << "СД1" << "СД2" << "СД3" << "СД4" << "СД5" << "СД6"
<< "СД7" << "СД8" << "СД9" << "СД10" << "СД11" << "СД12"
<< "СД13" << "СД14" << "СД15" << "СД16" << "СД17" << "СД18"
<< "СД19" << "СД20" << "СД21" << "СД22" << "СД23" << "СД24"
<< "СД25" << "СД26" << "СД27" << "СД28" << "СД29" << "СД30"
<< "СД31" << "СД32";
DataTableDWord->setColumnCount(ColCount);
DataTableDWord->setRowCount(RowCount);
DataTableDWord->setHorizontalHeaderLabels(header);
DataTableDWord->verticalHeader()->setVisible(true);
for(int i = 0; i < ColCount; i++)
DataTableDWord->setColumnWidth(i, 35);
for(int i = 0; i < RowCount; i++)
{
DataTableDWord->setRowHeight(i, 20);
for(int j = 0; j < ColCount; j++)
set_item(DataTableDWord, 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::bchandler(QString CmdW)
{
bcrtFlag = 1;
QScopedPointer<BC_MIL> NewBC(new BC_MIL(0));
wBase = 0;
wMaxBase = bcgetmaxbase();
qDebug() << "bcgetmaxbase" << wMaxBase;
//Select base
if (wBase > wMaxBase)
wBase = 0;
bcdefbase(wBase);
filltablecmd(CmdW);
//Prepare data to RT
if (wLen == 0)
wLen = 32;
for (int i = 0; i < wLen; ++i)
awBuf[i] = (wSubAddr<<8) | i;
//Try to send data to RT until it answers with Clear Status
//bcputw(0, CW(RT_ADDR, RT_RECEIVE, wSubAddr, wLen));
bcputw(0, CW(wAddr_RT, wRecTrans, 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);
for (int i = 0; i < wLen; ++i)
set_item(DataTableDWord, 0, i, intToHexString(awBuf[i]), false);
NewBC->closeAll();
}
void MainWindow::rthandler()
{
qDebug() << "Entered the button start status mode";
bcrtFlag = 0;
for (int i = 0; i < wLen; i++)
set_item(DataTableDWord, 0, i, "%", false);
QScopedPointer<RT_MIL> NewRT(new RT_MIL(0x0, RT_ADDR));
int i = 0;
while (i != 100)
{
i++;
if(NewRT->GetEvent(1000))
{
switch (tmkEvD.nInt)
{
case 1:
qDebug() << "Cmd word arrived";
filltablecmd("0", ( (RT_ADDR << 0xB) | tmkEvD.rt.wCmd ), false);
filltablestat(rtgetanswbits() | (RT_ADDR << 0xB) );
break;
case 2:
qDebug() << "Case 2";
break;
case 3:
//wStatus = little 11 bits Command Word
filltablecmd("0", ( (RT_ADDR << 0xB) | tmkEvD.rt.wStatus ), false);
qDebug() << "Status word 2" << rtgetanswbits(); //SREQ, BUSY,SSFL, RTFL, DNBA
filltablestat(rtgetanswbits() | (RT_ADDR << 0xB) );
wSubAddr = (tmkEvD.rt.wStatus >> 5) & 0x1F;
wLen = tmkEvD.rt.wStatus & 0x1F;
if (wLen == 0)
wLen = 32;
if (RT_RECEIVE == (tmkEvD.rt.wStatus & RT_DIR_MASK))
{
if (tmkselect(NewRT->m_TmkIndex))
{
qDebug() << "tmkselect() error";
}
rtdefsubaddr(RT_RECEIVE, wSubAddr);
rtgetblk(0, awBuf, wLen);
rtclrflag();
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
rtputblk(0, awBuf, wLen);
rtsetflag();
for (int i = 0; i < wLen; i++)
set_item(DataTableDWord, 0, i, intToHexString(awBuf[i]), false);
}
break;
}
break;
}
}
NewRT->closeAll();
}
void MainWindow::filltablestat(uint16_t statw)
{
QScopedPointer<StatusWord> NewStatWord(new StatusWord());
NewStatWord->description(statw);
set_item(DataTableStat, 0, 0, "Адрес устройства", false);
set_item(DataTableStat, 0, 1, intToBinaryString(NewStatWord->addrRTf), false);
set_item(DataTableStat, 0, 2, intToDecString(NewStatWord->addrRTf), false);
if(NewStatWord->messErrf)
{
set_item(DataTableStat, 1, 0, "Достоверная инф-я", false);
set_item(DataTableStat, 1, 1, intToBinaryString(NewStatWord->messErrf), false);
set_item(DataTableStat, 1, 2, intToDecString(NewStatWord->messErrf), false);
}
else
{
set_item(DataTableStat, 1, 0, "Недостоверная инф-я", false);
set_item(DataTableStat, 1, 1, intToBinaryString(NewStatWord->messErrf), false);
set_item(DataTableStat, 1, 2, intToDecString(NewStatWord->messErrf), false);
}
set_item(DataTableStat, 2, 0, "Передача ОС (всегда 0)", false);
set_item(DataTableStat, 2, 1, intToBinaryString(NewStatWord->instrf), false);
set_item(DataTableStat, 2, 2, intToDecString(NewStatWord->instrf), false);
if(NewStatWord->serReqf)
{
set_item(DataTableStat, 3, 0, "Запрос на обслуживание", false);
set_item(DataTableStat, 3, 1, intToBinaryString(NewStatWord->serReqf), false);
set_item(DataTableStat, 3, 2, intToDecString(NewStatWord->serReqf), false);
}
else
{
set_item(DataTableStat, 3, 0, "Нет запроса на обсл-е", false);
set_item(DataTableStat, 3, 1, intToBinaryString(NewStatWord->serReqf), false);
set_item(DataTableStat, 3, 2, intToDecString(NewStatWord->serReqf), false);
}
set_item(DataTableStat, 4, 0, "Резерв", false);
set_item(DataTableStat, 4, 1, intToBinaryString(NewStatWord->reservf), false);
set_item(DataTableStat, 4, 2, intToDecString(NewStatWord->reservf), false);
if(NewStatWord->broadCRf)
{
set_item(DataTableStat, 5, 0, "Достоверная гр. команда", false);
set_item(DataTableStat, 5, 1, intToBinaryString(NewStatWord->broadCRf), false);
set_item(DataTableStat, 5, 2, intToDecString(NewStatWord->broadCRf), false);
}
else
{
set_item(DataTableStat, 5, 0, "Недостоверная гр. команда", false);
set_item(DataTableStat, 5, 1, intToBinaryString(NewStatWord->broadCRf), false);
set_item(DataTableStat, 5, 2, intToDecString(NewStatWord->broadCRf), false);
}
if(NewStatWord->busyf)
{
set_item(DataTableStat, 6, 0, "Абонент занят", false);
set_item(DataTableStat, 6, 1, intToBinaryString(NewStatWord->busyf), false);
set_item(DataTableStat, 6, 2, intToDecString(NewStatWord->busyf), false);
}
else
{
set_item(DataTableStat, 6, 0, "Абонент не занят", false);
set_item(DataTableStat, 6, 1, intToBinaryString(NewStatWord->busyf), false);
set_item(DataTableStat, 6, 2, intToDecString(NewStatWord->busyf), false);
}
if(NewStatWord->subSysFf)
{
set_item(DataTableStat, 7, 0, "Неисправность абонента", false);
set_item(DataTableStat, 7, 1, intToBinaryString(NewStatWord->subSysFf), false);
set_item(DataTableStat, 7, 2, intToDecString(NewStatWord->subSysFf), false);
}
else
{
set_item(DataTableStat, 7, 0, "Абонент функционирует", false);
set_item(DataTableStat, 7, 1, intToBinaryString(NewStatWord->subSysFf), false);
set_item(DataTableStat, 7, 2, intToDecString(NewStatWord->subSysFf), false);
}
if(NewStatWord->dynBCAf)
{
set_item(DataTableStat, 8, 0, "Принято упр-е интерфейсом", false);
set_item(DataTableStat, 8, 1, intToBinaryString(NewStatWord->dynBCAf), false);
set_item(DataTableStat, 8, 2, intToDecString(NewStatWord->dynBCAf), false);
}
else
{
set_item(DataTableStat, 8, 0, "Не принято упр-е интерфейсом", false);
set_item(DataTableStat, 8, 1, intToBinaryString(NewStatWord->dynBCAf), false);
set_item(DataTableStat, 8, 2, intToDecString(NewStatWord->dynBCAf), false);
}
if(NewStatWord->termFlgf)
{
set_item(DataTableStat, 9, 0, "Неправильное функ-е ОУ", false);
set_item(DataTableStat, 9, 1, intToBinaryString(NewStatWord->termFlgf), false);
set_item(DataTableStat, 9, 2, intToDecString(NewStatWord->termFlgf), false);
}
else
{
set_item(DataTableStat, 9, 0, "Правильное функ-е ОУ", false);
set_item(DataTableStat, 9, 1, intToBinaryString(NewStatWord->termFlgf), false);
set_item(DataTableStat, 9, 2, intToDecString(NewStatWord->termFlgf), false);
}
}
void MainWindow::filltablecmd(QString CmdW, uint16_t cmdw, bool mode)
{
QScopedPointer<CommandWord> NewCmdWord(new CommandWord());
if(mode)
NewCmdWord->description(CmdW);
else
NewCmdWord->description(cmdw);
wSubAddr = NewCmdWord->subAddrf;
wLen = NewCmdWord->numDWf;
wAddr_RT = NewCmdWord->addrRTf;
wRecTrans = NewCmdWord->Kf;
set_item(DataTableCmd, 0, 0, "Адрес устройства", false);
set_item(DataTableCmd, 0, 1, intToBinaryString(NewCmdWord->addrRTf), false);
set_item(DataTableCmd, 0, 2, intToDecString(NewCmdWord->addrRTf), false);
if(NewCmdWord->Kf)
{
set_item(DataTableCmd, 1, 0, "Передача", false);
set_item(DataTableCmd, 1, 1, intToBinaryString(NewCmdWord->Kf), false);
set_item(DataTableCmd, 1, 2, intToDecString(NewCmdWord->Kf), false);
}
else
{
set_item(DataTableCmd, 1, 0, "Прием", false);
set_item(DataTableCmd, 1, 1, intToBinaryString(NewCmdWord->Kf), false);
set_item(DataTableCmd, 1, 2, intToDecString(NewCmdWord->Kf), false);
}
if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31))
{
set_item(DataTableCmd, 2, 0, "Режим управления", false);
set_item(DataTableCmd, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false);
set_item(DataTableCmd, 2, 2, intToDecString(NewCmdWord->subAddrf), false);
}
else
{
set_item(DataTableCmd, 2, 0, "Подадрес", false);
set_item(DataTableCmd, 2, 1, intToBinaryString(NewCmdWord->subAddrf), false);
set_item(DataTableCmd, 2, 2, intToDecString(NewCmdWord->subAddrf), false);
}
if((NewCmdWord->subAddrf == 0) || (NewCmdWord->subAddrf == 31))
{
set_item(DataTableCmd, 3, 0, NewCmdWord->cmdCode.value(NewCmdWord->numDWf), false);
set_item(DataTableCmd, 3, 1, intToBinaryString(NewCmdWord->numDWf), false);
set_item(DataTableCmd, 3, 2, intToDecString(NewCmdWord->numDWf), false);
}
else
{
if(NewCmdWord->numDWf == 0)
{
set_item(DataTableCmd, 3, 0, "Число СД", false);
set_item(DataTableCmd, 3, 1, intToBinaryString(32), false);
set_item(DataTableCmd, 3, 2, intToDecString(32), false);
}
else
{
set_item(DataTableCmd, 3, 0, "Число СД", false);
set_item(DataTableCmd, 3, 1, intToBinaryString(NewCmdWord->numDWf), false);
set_item(DataTableCmd, 3, 2, intToDecString(NewCmdWord->numDWf), false);
}
}
}
MainWindow::~MainWindow()
{
qDebug() << "MainWindow destructor";
}