#include "mainwindow.h" //#include "windows.h" //#include "WDMTMKv2.cpp" #include "bcmil.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 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 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 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() { }