diff --git a/bcmil.cpp b/bcmil.cpp index 9c16c4b..8e9d53b 100644 --- a/bcmil.cpp +++ b/bcmil.cpp @@ -1,18 +1,17 @@ #include #include "bcmil.h" #include "WDMTMKv2.cpp" -//#include -//TTmkEventData tmkEvD; -HANDLE hBcEvent; -//HANDLE hRtEvent; +TTmkEventData tmkEvD; +HANDLE hEvent; int nTmk; unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0; unsigned long dwStarts = 0L; TMK_DATA wSubAddr, wState, wStatus; -MIL::MIL(int dev_index) //open the driver, configuration, create event +//Open the driver, configuration, create event +MIL::MIL(int dev_index) { qDebug() << "MIL constructor"; if (TmkOpen()) @@ -39,6 +38,15 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event } } } + + hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!hEvent) + { + qDebug() << "CreateEvent() error"; + closeAllrt(); + } + ResetEvent(hEvent); + tmkdefevent(hEvent, TRUE); } /*int MIL::WaitInt(TMK_DATA wCtrlCode) @@ -96,7 +104,7 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts); bcreset(); //Close all opened things - CloseHandle(hBcEvent); + CloseHandle(hEvent); tmkdone(ALL_TMKS); TmkClose(); }*/ @@ -104,14 +112,41 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event void MIL::closeAllrt() { qDebug() << "Close All"; - //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts); rtreset(); - //Close all opened things - CloseHandle(hBcEvent); + CloseHandle(hEvent); tmkdone(ALL_TMKS); TmkClose(); } +bool MIL::GetEvent(unsigned short Timeout) +{ + if (tmkselect(this->m_TmkIndex)) + { + qDebug() << "tmkselect() error"; + return false; + } + + switch (WaitForSingleObject(hEvent, Timeout)) + { + case WAIT_OBJECT_0: + qDebug() << "Interrupt"; + ResetEvent(hEvent); + tmkgetevd(&tmkEvD); + return true; + break; + + case WAIT_TIMEOUT: + //qDebug() << "No new messages"; + return false; + break; + + default: + qDebug() << "Interrupt wait error"; + return false; + break; + } +} + MIL::~MIL() { qDebug() << "MIL destructor"; @@ -147,44 +182,26 @@ RT_MIL::RT_MIL(int dev_index, unsigned short Addr): MIL(dev_index) qDebug() << "RT_MIL constructor"; this->m_Addr = Addr; - //Find first configured device - for (nTmk = 0; nTmk <= MAX_TMK_NUMBER; ++nTmk) - if (!tmkselect(nTmk)) - break; - if (nTmk > MAX_TMK_NUMBER) - { - qDebug() << "tmkselect error"; - closeAllrt(); - } //Try to reset in RT mode if (rtreset()) { - qDebug() << "rtreset error"; + qDebug() << "rtreset() error"; closeAllrt(); } + //Set RT address, set flag mode, enable data irqs rtdefaddress(Addr); - rtdefmode(rtgetmode()|RT_FLAG_MODE); - //rtdefmode(rtgetmode()&~RT_FLAG_MODE); + rtdefmode(0); rtdefirqmode(rtgetirqmode()&~RT_DATA_BL); + //Ready to receive, not ready to transmit for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr) { - //Ready to receive, not ready to transmit rtdefsubaddr(RT_RECEIVE, wSubAddr); rtclrflag(); rtdefsubaddr(RT_TRANSMIT, wSubAddr); rtclrflag(); } - - hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (!hBcEvent) - { - qDebug() << "create event error"; - closeAllrt(); - } - ResetEvent(hBcEvent); - tmkdefevent(hBcEvent, TRUE); } RT_MIL::~RT_MIL() diff --git a/bcmil.h b/bcmil.h index 3820239..0eebae1 100644 --- a/bcmil.h +++ b/bcmil.h @@ -3,54 +3,6 @@ #include -//******************* -//#include "WDMTMKv2.h" -//#include "windows.h" -//******************* -/*typedef struct -{ - int nInt; - unsigned short wMode; - union - { - struct - { - unsigned short wResult; - unsigned short wAW1; - unsigned short wAW2; - } bc; - struct - { - unsigned short wBase; - unsigned short wResultX; - } bcx; - struct - { - unsigned short wStatus; - unsigned short wCmd; - } rt; - struct - { - unsigned short wBase; - unsigned short wResultX; - } mt; - struct - { - unsigned short wStatus; - } mrt; - struct - { - unsigned short wRequest; -// DWORD dwTimer; - } tmk; - struct - { - unsigned short wData1; - unsigned short wData2; - } raw; - }; -} TTmkEventData1;*/ - #define TMK_DATA unsigned short typedef void *HANDLE; @@ -67,12 +19,8 @@ public: //int WaitInt(TMK_DATA wCtrlCode); //void closeAll(); void closeAllrt(); - //bool GetEvent(TTmkEventData1 *pEv, unsigned short Timeout); - -protected: - + bool GetEvent(unsigned short Timeout); int m_TmkIndex; - //HANDLE m_hEvent; }; /*class BC_MIL:public MIL diff --git a/mainwindow.cpp b/mainwindow.cpp index 40c9ddc..1f2f1f7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,19 +3,17 @@ //#include "WDMTMKv2.cpp" #include "bcmil.cpp" -TTmkEventData tmkEvD; -extern HANDLE hBcEvent; +extern TTmkEventData tmkEvD; +extern HANDLE hEvent; -//#define RT_ADDR 10 - -//const int fInstMode = 1; +#define RT_ADDR 0x1 unsigned short awBuf[32]; TMK_DATA wBase, wMaxBase, wLen; extern TMK_DATA wSubAddr, wState; -unsigned char HexBinFlag = 1; //1 - hex, 0 - bin +int HexBinFlag = 1; MainWindow::MainWindow() { @@ -31,20 +29,19 @@ void MainWindow::init_mainwindowobj() Window_1 = new QWidget; Window_2 = new QWidget; - HexBinButton = new QPushButton("Hex/Bin"); - HexBinLabel = new QLabel("Hex"); + RtModeLabel = new QLabel("RT mode"); + StartRtModeButton = new QPushButton("Start RT mode"); + + BcModeLabel = new QLabel("BC mode"); + StartBcModeButton = new QPushButton("Start BC mode"); - 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); + layout_g->addWidget(RtModeLabel, 0, 0); // Row 0, Column 0 + layout_g->addWidget(StartRtModeButton, 1, 0); + layout_g->addWidget(BcModeLabel, 0, 1); + layout_g->addWidget(StartBcModeButton, 1, 1); Window_2->setLayout(layout_g); setCentralWidget(Window_2); @@ -63,28 +60,14 @@ void MainWindow::init_connections() SIGNAL(clicked()), this, SLOT(getlineedit()));*/ - /*connect(EnterCmdWordButton, + /*connect(StartBcModeButton, SIGNAL(clicked()), this, - SLOT(sendcmdwrd()));*/ - connect(EnterCmdWordButton, + SLOT(bchandler()));*/ + 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); } /*void MainWindow::getlineedit() @@ -149,22 +132,6 @@ QString intToDecString(int number) } }*/ -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; @@ -189,8 +156,6 @@ void MainWindow::init_table() } } - - void MainWindow::set_item(QTableWidget *pTable, int indRow, int indCol, QString data, bool editFlag) { @@ -210,7 +175,7 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow, pTable->item(indRow, indCol)->setTextColor(color); } -/*void MainWindow::sendcmdwrd() +/*void MainWindow::bchandler() { qDebug() << "send1"; QScopedPointer NewBC(new BC_MIL(0)); @@ -254,66 +219,44 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow, void MainWindow::rthandler() { - qDebug() << "rt1"; - QScopedPointer NewRT(new RT_MIL(0, 1)); - qDebug() << "rt2"; + QScopedPointer NewRT(new RT_MIL(0x0, RT_ADDR)); int i = 0; - while (i != 1000) + while (i != 100) { 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"; + if(NewRT->GetEvent(1000)) + { + switch (tmkEvD.nInt) + { + case 1: + qDebug() << "Cmd word arrived " << tmkEvD.rt.wCmd << " " <closeAllrt(); + case 2: + qDebug() << "Case 2"; + break; + + case 3: + qDebug() << "Data arrived"; + 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); + } + break; + } break; } } diff --git a/mainwindow.h b/mainwindow.h index 54c3a65..f185f48 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -19,37 +19,20 @@ private: public slots: //void getlineedit(); - //void sendcmdwrd(); + //void bchandler(); void rthandler(); - void HexBinChange(); private: QWidget *Window_1 = new QWidget; QWidget *Window_2 = new QWidget; - QLabel *HexBinLabel; - QPushButton *HexBinButton; + QLabel *RtModeLabel; + QPushButton *StartRtModeButton; + + QLabel *BcModeLabel; + QPushButton *StartBcModeButton; - QLabel *CmdWordLabel; - QLineEdit *CmdWordLineEdit; - QPushButton *EnterCmdWordButton; QTableWidget *DataTable; - -protected: - - void keyPressEvent(QKeyEvent *event) override - { - if (loopActive) - { - loopActive = false; - qDebug() << "Key pressed! Stopping loop."; - } - QWidget::keyPressEvent(event); - } - -public: - - bool loopActive = true; }; #endif // MAINWINDOW_H