From 105b4e79da17e239666a62a3f443d76d87834a8f Mon Sep 17 00:00:00 2001 From: anovikova Date: Tue, 16 Sep 2025 12:08:45 +0300 Subject: [PATCH] v2 --- TestTa1.pro | 10 +- USB_TA_DRV.dll | Bin 77824 -> 0 bytes USB_TA_VC2.dll | Bin 86016 -> 0 bytes WDMTMKv2.cpp | 17 ++ WDMTMKv2.h | 13 +- bcmil.cpp | 151 +++++++++----- bcmil.h | 23 +-- cmdwrd.cpp | 10 + cmdwrd.h | 1 + declarations.h | 5 +- main.cpp | 4 + mainwindow.cpp | 540 ++++++++++++++++++++++++++++++++++--------------- mainwindow.h | 47 ++--- statwrd.cpp | 83 ++++++++ statwrd.h | 70 +++++++ testcmd.cpp | 59 ++++++ testcmd.h | 33 +++ testinfo.cpp | 39 ++-- testinfo.h | 1 + teststat.cpp | 122 +++++++++++ teststat.h | 45 +++++ 21 files changed, 984 insertions(+), 289 deletions(-) delete mode 100644 USB_TA_DRV.dll delete mode 100644 USB_TA_VC2.dll create mode 100644 statwrd.cpp create mode 100644 statwrd.h create mode 100644 testcmd.cpp create mode 100644 testcmd.h create mode 100644 teststat.cpp create mode 100644 teststat.h diff --git a/TestTa1.pro b/TestTa1.pro index f7462d4..78a8785 100644 --- a/TestTa1.pro +++ b/TestTa1.pro @@ -9,7 +9,10 @@ SOURCES += \ cmdwrd.cpp \ main.cpp \ mainwindow.cpp \ - testinfo.cpp + statwrd.cpp \ + testcmd.cpp \ + testinfo.cpp \ + teststat.cpp HEADERS += \ WDMTMKv2.h \ @@ -17,4 +20,7 @@ HEADERS += \ cmdwrd.h \ declarations.h \ mainwindow.h \ - testinfo.h + statwrd.h \ + testcmd.h \ + testinfo.h \ + teststat.h diff --git a/USB_TA_DRV.dll b/USB_TA_DRV.dll deleted file mode 100644 index 238123fcccb6d4873cc2a48ec06c2bf3562e1966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77824 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 diff --git a/USB_TA_VC2.dll b/USB_TA_VC2.dll deleted file mode 100644 index ea729722a65585564c1bd146393432a0cd90e30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86016 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

;b3yJ^k!Lh9|L< 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 L+A#2c2m}8Q9Dx + +#ifndef WINDOWSINC +#define WINDOWSINC + +#include + +#endif + +#ifndef WDMTMKINC +#define WDMTMKINC + #include "WDMTMKv2.h" +#endif + HANDLE _ahVTMK4Event[MAX_TMK_NUMBER+1]; HANDLE _hVTMK4VxD[MAX_TMK_NUMBER+1]; int _VTMK4tmkMaxNum = -1; @@ -2102,3 +2118,4 @@ int tmkreadsn() return TMK_BAD_NUMBER; } //#endif +//#endif diff --git a/WDMTMKv2.h b/WDMTMKv2.h index afc36bc..5a8f0cb 100644 --- a/WDMTMKv2.h +++ b/WDMTMKv2.h @@ -5,14 +5,16 @@ /* for Windows 98/ME/2000/XP/Vista/7 */ /*****************************************************************************/ -//#ifndef WDMTMKV2_H -//#define WDMTMKV2_H + +#ifndef _TMK1553B_ +#define _TMK1553B_ + +#ifndef WDMTMKV2_H +#define WDMTMKV2_H //************************************************************************** #include #include -#include - typedef uint16_t WORD; typedef unsigned __LONG32 DWORD; typedef void *HANDLE; @@ -1021,4 +1023,5 @@ htmkrawio_usb tmkrawio_usb = ftmkrawio_usb; hrtgap_usb rtgap_usb = frtgap_usb; htmkreadsn_usb tmkreadsn_usb = ftmkreadsn_usb; -//#endif // WDMTMKV2_H +#endif +#endif diff --git a/bcmil.cpp b/bcmil.cpp index 5ea9382..8451b37 100644 --- a/bcmil.cpp +++ b/bcmil.cpp @@ -1,16 +1,22 @@ -#include "declarations.h" +#include +#include "bcmil.h" #include "WDMTMKv2.cpp" TTmkEventData tmkEvD; -HANDLE hBcEvent; -HANDLE hRtEvent; +HANDLE hEvent; + + int nTmk; +uint8_t wAddr_RT, wRecTrans; 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 +int bcrtFlag; //RT = 0, BC = 1 + +//Open the driver, configuration, create event +MIL::MIL(int dev_index) { qDebug() << "MIL constructor"; if (TmkOpen()) @@ -21,30 +27,39 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event else { if ((dev_index > tmkgetmaxn()) || (dev_index < 0)) + { closeAll(); + } else { this->m_TmkIndex = dev_index; if (tmkconfig(this->m_TmkIndex)) + { closeAll(); - - this->m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - ResetEvent(this->m_hEvent); - tmkdefevent(this->m_hEvent, TRUE); + } } } + + hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!hEvent) + { + qDebug() << "CreateEvent() error"; + closeAll(); + } + ResetEvent(hEvent); + tmkdefevent(hEvent, TRUE); } int MIL::WaitInt(TMK_DATA wCtrlCode) { - //Wait for an interrupt */ + //Wait for an interrupt DWORD k; - k = WaitForSingleObject(hBcEvent, 1000); + k = WaitForSingleObject(hEvent, 1000); switch (k) { case WAIT_OBJECT_0: - ResetEvent(hBcEvent); + ResetEvent(hEvent); break; case WAIT_TIMEOUT: @@ -57,34 +72,89 @@ int MIL::WaitInt(TMK_DATA wCtrlCode) return 1; } - /* Get interrupt data */ - /* We do not need to check tmkEvD.nInt because bcstartx with CX_NOSIG */ - /* guarantees us only single interrupt of single type nInt == 3 */ + // Get interrupt data + // We do not need to check tmkEvD.nInt because bcstartx with CX_NOSIG + // guarantees us only single interrupt of single type nInt == 3 tmkgetevd(&tmkEvD); if (tmkEvD.bcx.wResultX & SX_IB_MASK) { - /* We have set bit(s) in Status Word */ + // We have set bit(s) in Status Word if (((tmkEvD.bcx.wResultX & SX_ERR_MASK) == SX_NOERR) || ((tmkEvD.bcx.wResultX & SX_ERR_MASK) == SX_TOD)) { - wStatus = bcgetansw(wCtrlCode); /* We have either no errors or Data Time Out (No Data) error */ - if (wStatus & BUSY_MASK) /* We have BUSY bit set */ + wStatus = bcgetansw(wCtrlCode); // We have either no errors or Data Time Out (No Data) error + if (wStatus & BUSY_MASK) // We have BUSY bit set ++dwBusyStarts; - else /* We have unknown bit(s) set */ + else // We have unknown bit(s) set ++dwStatStarts; } - else /* We have an error */ + else // We have an error ++dwErrStarts; } - else if (tmkEvD.bcx.wResultX & SX_ERR_MASK) /* We have an error */ + else if (tmkEvD.bcx.wResultX & SX_ERR_MASK) // We have an error ++dwErrStarts; - else /* We have a completed message */ + else // We have a completed message ++dwGoodStarts; ++dwStarts; return 0; } +void MIL::closeAll() +{ + qDebug() << "Close All"; + if(!bcrtFlag) + rtreset(); + else + bcreset(); + CloseHandle(hEvent); + tmkdone(ALL_TMKS); + TmkClose(); +} + +bool MIL::GetEvent(unsigned short Timeout) +{ + //int MASK = 0; + if (tmkselect(this->m_TmkIndex)) + { + qDebug() << "tmkselect() error"; + return false; + } + + //MASK = MASK | BUSY; + //rtsetanswbits(BUSY); + switch (WaitForSingleObject(hEvent, Timeout)) + { + case WAIT_OBJECT_0: + qDebug() << "Interrupt"; + ResetEvent(hEvent); + tmkgetevd(&tmkEvD); + qDebug() << "1 bc wResult " << tmkEvD.bc.wResult; + qDebug() << "1 bc wAW1 " << tmkEvD.bc.wAW1; + qDebug() << "1 bc wAW2 " << tmkEvD.bc.wAW2; + qDebug() << "1 bcx wBase " << tmkEvD.bcx.wBase; + qDebug() << "1 bcx wResultX " << tmkEvD.bcx.wResultX; + qDebug() << "1 rt wStatus" << tmkEvD.rt.wStatus; + qDebug() << "1 rt wCmd" << tmkEvD.rt.wCmd; + qDebug() << "1 mt wBase " << tmkEvD.mt.wBase; + qDebug() << "1 mt wResultX " << tmkEvD.mt.wResultX; + qDebug() << "1 mrt wStatus" << tmkEvD.mrt.wStatus; + qDebug() << "1 tmk wRequest" << tmkEvD.tmk.wRequest; + 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"; @@ -120,30 +190,21 @@ 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"; - closeAllrt(); + qDebug() << "rtreset() error"; + closeAll(); } + //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); @@ -156,24 +217,4 @@ RT_MIL::~RT_MIL() qDebug() << "RT_MIL destructor"; } -void MIL::closeAll() -{ - qDebug() << "Close All"; - //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts); - bcreset(); - /* Close all opened things */ - CloseHandle(hBcEvent); - tmkdone(ALL_TMKS); - TmkClose(); -} -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(hRtEvent); - tmkdone(ALL_TMKS); - TmkClose(); -} diff --git a/bcmil.h b/bcmil.h index 0042579..f232440 100644 --- a/bcmil.h +++ b/bcmil.h @@ -1,29 +1,26 @@ #ifndef BCMIL_H #define BCMIL_H -#include "declarations.h" -#include "WDMTMKv2.h" +#include -class MIL: public QObject +#define TMK_DATA unsigned short +typedef void *HANDLE; + +class MIL:public QObject { Q_OBJECT public: MIL(int dev_index); - ~MIL(void); + ~MIL(); int WaitInt(TMK_DATA wCtrlCode); void closeAll(); - void closeAllrt(); - bool GetEvent(TTmkEventData *pEv, unsigned short Timeout); - -protected: - + bool GetEvent(unsigned short Timeout); int m_TmkIndex; - HANDLE m_hEvent; }; -class BC_MIL: public MIL +class BC_MIL:public MIL { public: @@ -31,12 +28,12 @@ public: ~BC_MIL(void); }; -class RT_MIL: public MIL +class RT_MIL:public MIL { public: RT_MIL(int dev_indexi, unsigned short Addr); - ~RT_MIL(void); + ~RT_MIL(); protected: diff --git a/cmdwrd.cpp b/cmdwrd.cpp index 07094c2..cfcfa68 100644 --- a/cmdwrd.cpp +++ b/cmdwrd.cpp @@ -5,6 +5,7 @@ extern unsigned char HexBinFlag; CommandWord::CommandWord() { + qDebug() << "CommandWord constructor"; addrRTf = 0; Kf = 0; subAddrf = 0; @@ -82,6 +83,15 @@ void CommandWord::description(QString CmdW) } } +void CommandWord::description(uint16_t cmdw) +{ + addrRTf = addrRTFind(cmdw); + Kf = KFind(cmdw); + subAddrf = subAddrFind(cmdw); + numDWf = numDWFind(cmdw); +} + CommandWord::~CommandWord() { + qDebug() << "CommandWord destructor"; } diff --git a/cmdwrd.h b/cmdwrd.h index 05c0df0..2c489e4 100644 --- a/cmdwrd.h +++ b/cmdwrd.h @@ -33,6 +33,7 @@ public: sync2, transLC, transBW, selectedSW, overrSTS}; void description(QString CmdW); + void description(uint16_t cmdw); uint8_t addrRTFind(uint16_t cmdw); uint8_t KFind(uint16_t cmdw); uint8_t subAddrFind(uint16_t cmdw); diff --git a/declarations.h b/declarations.h index 5df975e..e77fb3e 100644 --- a/declarations.h +++ b/declarations.h @@ -17,10 +17,7 @@ #include #include #include -#include -#include #include "cmdwrd.h" -#include "bcmil.h" -#include "windows.h" +#include "statwrd.h" #endif // DECLARATIONS_H diff --git a/main.cpp b/main.cpp index 5030ce3..71412b5 100644 --- a/main.cpp +++ b/main.cpp @@ -1,5 +1,7 @@ #include "mainwindow.h" //#include "testinfo.h" +//#include "testcmd.h" +//#include "teststat.h" #include @@ -10,5 +12,7 @@ int main(int argc, char *argv[]) w.show(); //QTest::qExec(new testInfo, argc, argv); + //QTest::qExec(new testcmdwrd, argc, argv); + //QTest::qExec(new teststatwrd, argc, argv); return a.exec(); } diff --git a/mainwindow.cpp b/mainwindow.cpp index a68bd81..aef5ca4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,24 +1,26 @@ #include "mainwindow.h" -//#include +#include "bcmil.cpp" extern TTmkEventData tmkEvD; -extern HANDLE hRtEvent; +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; +extern uint8_t wAddr_RT, wRecTrans; -unsigned char HexBinFlag = 1; //1 - hex, 0 - bin +int HexBinFlag = 1; //Hex - 1, Bin - 0 +extern int bcrtFlag; //RT = 0, BC = 1 MainWindow::MainWindow() { init_mainwindowobj(); - init_table(); + init_table_cmd(); + init_table_stat(); + init_table_dword(); init_connections(); } @@ -28,44 +30,64 @@ void MainWindow::init_mainwindowobj() Window_1 = new QWidget; Window_2 = new QWidget; + Window_3 = new QWidget; + Window_4 = new QWidget; - HexBinButton = new QPushButton("Hex/Bin"); - HexBinLabel = new QLabel("Hex"); + RtModeLabel = new QLabel("RT mode"); + StartRtModeButton = new QPushButton("Start RT mode"); - CmdWordLabel = new QLabel("Enter the command word:"); + BcModeLabel = new QLabel("BC mode"); + StartBcModeButton = new QPushButton("Start BC mode"); 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); + HexBinLabel = new QLabel("Hex"); + HexBinButton = new QPushButton("Hex/Bin"); - Window_2->setLayout(layout_g); + 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); - QVBoxLayout *layout = new QVBoxLayout(Window_1); - layout->addWidget(Window_2); - layout->addWidget(DataTable); + 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_1->setLayout(layout); - setCentralWidget(Window_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(EnterCmdWordButton, + connect(StartBcModeButton, SIGNAL(clicked()), this, - SLOT(getlineedit()));*/ - /*connect(EnterCmdWordButton, - SIGNAL(clicked()), - this, - SLOT(sendcmdwrd()));*/ - connect(EnterCmdWordButton, + SLOT(getlineedit())); + connect(StartRtModeButton, SIGNAL(clicked()), this, SLOT(rthandler())); @@ -85,67 +107,10 @@ QString intToDecString(int number) return QString::number(number,10); } -/*void MainWindow::getlineedit() +QString intToHexString(int number) { - 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); - } - } -}*/ + return QString::number(number,16); +} void MainWindow::HexBinChange() { @@ -163,31 +128,92 @@ void MainWindow::HexBinChange() } } -void MainWindow::init_table() +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 << "Биты КС" << "Бинарное представление" << "Десятичное представление"; - DataTable->setColumnCount(ColCount); - DataTable->setRowCount(RowCount); - DataTable->setHorizontalHeaderLabels(header); - DataTable->verticalHeader()->setVisible(true); + DataTableCmd->setColumnCount(ColCount); + DataTableCmd->setRowCount(RowCount); + DataTableCmd->setHorizontalHeaderLabels(header); + DataTableCmd->verticalHeader()->setVisible(true); - DataTable->setColumnWidth(0,200); - DataTable->setColumnWidth(1,160); - DataTable->setColumnWidth(2,160); + DataTableCmd->setColumnWidth(0,200); + DataTableCmd->setColumnWidth(1,160); + DataTableCmd->setColumnWidth(2,160); for(int i = 0; i < RowCount; i++) { - DataTable->setRowHeight(i,20); + DataTableCmd->setRowHeight(i,20); for(int j = 0; j < ColCount; j++) - set_item(DataTable, i, j, "%", false); + 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) @@ -208,107 +234,285 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow, pTable->item(indRow, indCol)->setTextColor(color); } -/*void MainWindow::sendcmdwrd() +void MainWindow::bchandler(QString CmdW) { - qDebug() << "send1"; + bcrtFlag = 1; QScopedPointer NewBC(new BC_MIL(0)); - qDebug() << "send2"; + wBase = 0; wMaxBase = bcgetmaxbase(); - srand(1); + qDebug() << "bcgetmaxbase" << wMaxBase; //Select base if (wBase > wMaxBase) wBase = 0; bcdefbase(wBase); - qDebug() << "send3"; + + filltablecmd(CmdW); //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)); + //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(); + 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"; + + for (int i = 0; i < wLen; ++i) + set_item(DataTableDWord, 0, i, intToHexString(awBuf[i]), false); + NewBC->closeAll(); -}*/ +} void MainWindow::rthandler() { - qDebug() << "rt1"; - QScopedPointer NewRT(new RT_MIL(0, 10)); - qDebug() << "rt2"; + qDebug() << "Entered the button start status mode"; + bcrtFlag = 0; + for (int i = 0; i < wLen; i++) + set_item(DataTableDWord, 0, i, "%", false); - while (loopActive) + QScopedPointer NewRT(new RT_MIL(0x0, RT_ADDR)); + + int i = 0; + while (i != 100) { - //Wait for an interrupt - switch (WaitForSingleObject(hRtEvent, 1000)) + i++; + + if(NewRT->GetEvent(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"; + switch (tmkEvD.nInt) + { + case 1: + qDebug() << "Cmd word arrived"; + filltablecmd("0", ( (RT_ADDR << 0xB) | tmkEvD.rt.wCmd ), false); + filltablestat(rtgetanswbits() | (RT_ADDR << 0xB) ); break; - default: - qDebug() << "Interrupt wait error"; - NewRT->closeAllrt(); + 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 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 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); } } - NewRT->closeAllrt(); } MainWindow::~MainWindow() { + qDebug() << "MainWindow destructor"; } diff --git a/mainwindow.h b/mainwindow.h index 54c3a65..2fb2193 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -6,50 +6,51 @@ class MainWindow:public QMainWindow { Q_OBJECT + public: + void init_mainwindowobj(); //the function of this class void init_connections(); + void bchandler(QString CmdW); + void filltablestat(uint16_t statw); + void filltablecmd(QString CmdW = "0", uint16_t statw = 0, bool mode = true); explicit MainWindow(); //constructor ~MainWindow(); //destructor private: - void init_table(); + + void init_table_cmd(); + void init_table_stat(); + void init_table_dword(); void set_item(QTableWidget *pTable, int indRow, int indCol, QString data, bool editFlag); public slots: - //void getlineedit(); - //void sendcmdwrd(); + + void getlineedit(); void rthandler(); void HexBinChange(); private: + QWidget *Window_1 = new QWidget; QWidget *Window_2 = new QWidget; + QWidget *Window_3 = new QWidget; + QWidget *Window_4 = new QWidget; + + QLabel *RtModeLabel; + QPushButton *StartRtModeButton; + + QLabel *BcModeLabel; + QPushButton *StartBcModeButton; + QLineEdit *CmdWordLineEdit; QLabel *HexBinLabel; QPushButton *HexBinButton; - 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; + QTableWidget *DataTableCmd; + QTableWidget *DataTableStat; + QTableWidget *DataTableDWord; }; #endif // MAINWINDOW_H diff --git a/statwrd.cpp b/statwrd.cpp new file mode 100644 index 0000000..b79f8b7 --- /dev/null +++ b/statwrd.cpp @@ -0,0 +1,83 @@ +#include "mainwindow.h" +#include "statwrd.h" + +extern unsigned char HexBinFlag; + +uint8_t StatusWord::addrRTFind(uint16_t statw) +{ + SW.all = statw; + return SW.addrRT; +} + +uint8_t StatusWord::messErrFind(uint16_t statw) +{ + SW.all = statw; + return SW.messErr; +} + +uint8_t StatusWord::instrFind(uint16_t statw) +{ + SW.all = statw; + return SW.instr; +} + +uint8_t StatusWord::serReqFind(uint16_t statw) +{ + SW.all = statw; + return SW.serReq; +} + +uint8_t StatusWord::reservFind(uint16_t statw) +{ + SW.all = statw; + return SW.reserved; +} + +uint8_t StatusWord::broadCRFind(uint16_t statw) +{ + SW.all = statw; + return SW.broadCR; +} + +uint8_t StatusWord::busyFind(uint16_t statw) +{ + SW.all = statw; + return SW.busy; +} + +uint8_t StatusWord::subSysFFind(uint16_t statw) +{ + SW.all = statw; + return SW.subSysF; +} + +uint8_t StatusWord::dynBCAFind(uint16_t statw) +{ + SW.all = statw; + return SW.dynBCA; +} + +uint8_t StatusWord::termFlgFind(uint16_t statw) +{ + SW.all = statw; + return SW.termFlg; +} + +void StatusWord::description(uint16_t statw) +{ + addrRTf = addrRTFind(statw); + messErrf = messErrFind(statw); + instrf = instrFind(statw); + serReqf = serReqFind(statw); + reservf = reservFind(statw); + broadCRf = broadCRFind(statw); + busyf = busyFind(statw); + subSysFf = subSysFFind(statw); + dynBCAf = dynBCAFind(statw); + termFlgf = termFlgFind(statw); +} + +StatusWord::~StatusWord() +{ + qDebug() << "StatusWord destructor"; +} diff --git a/statwrd.h b/statwrd.h new file mode 100644 index 0000000..c411bae --- /dev/null +++ b/statwrd.h @@ -0,0 +1,70 @@ +#ifndef STATWRD_H +#define STATWRD_H + +#include +#include + +class StatusWord:public QObject +{ + Q_OBJECT +public: + + typedef union { + uint16_t all; + struct { + unsigned termFlg: 1; // terminal flag + unsigned dynBCA: 1; // dynamic bus control acceptance + unsigned subSysF: 1; // subsystem flag + unsigned busy: 1; + unsigned broadCR: 1; // broadcast command recieved + unsigned reserved: 3; + unsigned serReq: 1; // service request + unsigned instr: 1; // instrumentation + unsigned messErr: 1; // message error + unsigned addrRT:5; + }; + } SW_t; + + SW_t SW; + + uint8_t addrRTf; + uint8_t messErrf; + uint8_t instrf; + uint8_t serReqf; + uint8_t reservf; + uint8_t broadCRf; + uint8_t busyf; + uint8_t subSysFf; + uint8_t dynBCAf; + uint8_t termFlgf; + + void description(uint16_t statw); + uint8_t addrRTFind(uint16_t statw); + uint8_t messErrFind(uint16_t statw); + uint8_t instrFind(uint16_t statw); + uint8_t serReqFind(uint16_t statw); + uint8_t reservFind(uint16_t statw); + uint8_t broadCRFind(uint16_t statw); + uint8_t busyFind(uint16_t statw); + uint8_t subSysFFind(uint16_t statw); + uint8_t dynBCAFind(uint16_t statw); + uint8_t termFlgFind(uint16_t statw); + + StatusWord() + { + qDebug() << "StatusWord constructor"; + addrRTf = 0; + messErrf = 0; + instrf = 0; + serReqf = 0; + reservf = 0; + broadCRf = 0; + busyf = 0; + subSysFf = 0; + dynBCAf = 0; + termFlgf = 0; + } + ~StatusWord(); +}; + +#endif // STATWRD_H diff --git a/testcmd.cpp b/testcmd.cpp new file mode 100644 index 0000000..e6356c2 --- /dev/null +++ b/testcmd.cpp @@ -0,0 +1,59 @@ +/*#include +#include "testcmd.h" + +void testcmdwrd::testConstructor() +{ + // default values 0 + CommandWord c1; + + QVERIFY(c1.addrRTf == 0); + QVERIFY(c1.Kf == 0); + QVERIFY(c1.subAddrf == 0); + QVERIFY(c1.numDWf == 0); +} + +void testcmdwrd::testaddrRTFind() +{ + // address default + QCOMPARE(mCmdWrd.addrRTf, addrRT0); + + // address after setting + QCOMPARE(mCmdWrd.addrRTFind(0x043D), (uint8_t)(0b00000)); + QCOMPARE(mCmdWrd.addrRTFind(0x2C3D), (uint8_t)(0b00101)); //main + QCOMPARE(mCmdWrd.addrRTFind(0x343D), (uint8_t)(0b00110)); //reserve + QCOMPARE(mCmdWrd.addrRTFind(0xFC3D), (uint8_t)(0b11111)); +} + +void testcmdwrd::testKFind() +{ + // K default + QCOMPARE(mCmdWrd.Kf, K0); + + // K after setting + QCOMPARE(mCmdWrd.KFind(0x2C5D), (uint8_t)(1)); //transmission + QCOMPARE(mCmdWrd.KFind(0x2915), (uint8_t)(0)); //res +} + +void testcmdwrd::testsubAddrFind() +{ + // SubAdd_CtrlMode default + QCOMPARE(mCmdWrd.subAddrf, subAddr0); + + // SubAdd_CtrlMode after setting + QCOMPARE(mCmdWrd.subAddrFind(0x2C3D), (uint8_t)(1)); //subadd 01 + QCOMPARE(mCmdWrd.subAddrFind(0x2E14), (uint8_t)(16)); //subadd 16 + QCOMPARE(mCmdWrd.subAddrFind(0x2FC0), (uint8_t)(30)); //subadd 30 +} + +void testcmdwrd::testnumDWFind() +{ + // NumData_CmdCode default + QCOMPARE(mCmdWrd.numDWf, numDW0); + + // NumData_CmdCode after setting + QCOMPARE(mCmdWrd.numDWFind(0x2C9D), (uint8_t)(29)); + QCOMPARE(mCmdWrd.numDWFind(0x2C90), (uint8_t)(16)); + QCOMPARE(mCmdWrd.numDWFind(0x2A41), (uint8_t)(1)); + QCOMPARE(mCmdWrd.numDWFind(0x2BC0), (uint8_t)(0)); //32 words +} +*/ diff --git a/testcmd.h b/testcmd.h new file mode 100644 index 0000000..d5308d4 --- /dev/null +++ b/testcmd.h @@ -0,0 +1,33 @@ +/*#ifndef TESTCMD_H +#define TESTCMD_H + +#include +#include "cmdwrd.h" + +class testcmdwrd:public QObject +{ + Q_OBJECT + +private slots: + + void testConstructor(); + void testaddrRTFind(); + void testKFind(); + void testsubAddrFind(); + void testnumDWFind(); + + +private: + + const uint8_t addrRT0 = 0; + const uint8_t K0 = 0; + const uint8_t subAddr0 = 0; + const uint8_t numDW0 = 0; + +private: + + CommandWord mCmdWrd; +}; + +#endif // TESTCMD_H +*/ diff --git a/testinfo.cpp b/testinfo.cpp index 339e08f..d02b64f 100644 --- a/testinfo.cpp +++ b/testinfo.cpp @@ -1,11 +1,13 @@ -/*#include -#include "testinfo.h" -#include -#include "declarations.h" -#include +/*#include "testinfo.h" -HANDLE hEvent; -TTmkEventData tmkEvD; +#ifndef MAINWININC +#define MAINWININC +#include "mainwindow.cpp" +#endif + + +HANDLE hEvent_t; +TTmkEventData tmkEvD_t; void testInfo::init() { @@ -27,14 +29,14 @@ void testInfo::cleanupTestCase() { qDebug() << "TmkClose()"; TmkClose(); - if (hEvent) - CloseHandle(hEvent); + if (hEvent_t) + CloseHandle(hEvent_t); } void testInfo::testcreateevent() { - hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - QVERIFY(hEvent); + hEvent_t = CreateEvent(NULL, TRUE, FALSE, NULL); + QVERIFY(hEvent_t); } void testInfo::testTmkOpen() @@ -278,17 +280,17 @@ void testInfo::testrtputgetblk() void testInfo::testgetInt() { bcreset(); - tmkdefevent(hEvent, TRUE); - tmkgetevd(&tmkEvD); - QCOMPARE(tmkEvD.nInt, (int)(0)); + tmkdefevent(hEvent_t, TRUE); + tmkgetevd(&tmkEvD_t); + QCOMPARE(tmkEvD_t.nInt, (int)(0)); bcdefbase(0); bcputw(0, 0xFFE1); bcstart(0, CTRL_C_BRCST); - switch (WaitForSingleObject(hEvent, 1000)) + switch (WaitForSingleObject(hEvent_t, 1000)) { case WAIT_OBJECT_0: - ResetEvent(hEvent); + ResetEvent(hEvent_t); qDebug() << "We got interrupt!"; break; @@ -301,10 +303,9 @@ void testInfo::testgetInt() break; } - tmkgetevd(&tmkEvD); - QCOMPARE(tmkEvD.nInt, (int)(1)); + tmkgetevd(&tmkEvD_t); + QCOMPARE(tmkEvD_t.nInt, (int)(1)); tmkdefevent(0,TRUE); } */ - diff --git a/testinfo.h b/testinfo.h index 93a9fb7..ad4c0a4 100644 --- a/testinfo.h +++ b/testinfo.h @@ -4,6 +4,7 @@ #include #include + class testInfo:public QObject { Q_OBJECT diff --git a/teststat.cpp b/teststat.cpp new file mode 100644 index 0000000..c1b2dc8 --- /dev/null +++ b/teststat.cpp @@ -0,0 +1,122 @@ +/*#include +#include "teststat.h" + +void teststatwrd::testConstructor() +{ + // default values 0 + StatusWord c1; + + QVERIFY(c1.addrRTf == 0); + QVERIFY(c1.messErrf == 0); + QVERIFY(c1.instrf == 0); + QVERIFY(c1.serReqf == 0); + QVERIFY(c1.reservf == 0); + QVERIFY(c1.broadCRf == 0); + QVERIFY(c1.busyf == 0); + QVERIFY(c1.subSysFf == 0); + QVERIFY(c1.dynBCAf == 0); + QVERIFY(c1.termFlgf == 0); +} + +void teststatwrd::testaddrRTFind() +{ + // default + QCOMPARE(mStatWrd.addrRTf, addrRT0); + + // after setting + QCOMPARE(mStatWrd.addrRTFind(0x0D45), (uint8_t)(1)); //00001 + QCOMPARE(mStatWrd.addrRTFind(0x8545), (uint8_t)(0b10000)); //10000 + QCOMPARE(mStatWrd.addrRTFind(0xFD45), (uint8_t)(0b11111)); //11111 +} + +void teststatwrd::testmessErrFind() +{ + // default + QCOMPARE(mStatWrd.messErrf, messErr0); + + // after setting + QCOMPARE(mStatWrd.messErrFind(0xF8A5), (uint8_t)(0)); + QCOMPARE(mStatWrd.messErrFind(0xFCA5), (uint8_t)(1)); +} + +void teststatwrd::testinstrFind() +{ + // default + QCOMPARE(mStatWrd.instrf, instr0); + + // after setting + QCOMPARE(mStatWrd.instrFind(0xFCA5), (uint8_t)(0)); + QCOMPARE(mStatWrd.instrFind(0xFEA5), (uint8_t)(1)); +} + +void teststatwrd::testserReqFind() +{ + // default + QCOMPARE(mStatWrd.serReqf, serReq0); + + // after setting + QCOMPARE(mStatWrd.serReqFind(0xFEA5), (uint8_t)(0)); + QCOMPARE(mStatWrd.serReqFind(0xFFA5), (uint8_t)(1)); +} + +void teststatwrd::testreservFind() +{ + // default + QCOMPARE(mStatWrd.reservf, reserv0); + + // after setting + QCOMPARE(mStatWrd.reservFind(0xFF05), (uint8_t)(0b000)); + QCOMPARE(mStatWrd.reservFind(0xFF85), (uint8_t)(0b100)); + QCOMPARE(mStatWrd.reservFind(0xFFE5), (uint8_t)(0b111)); +} + +void teststatwrd::testbroadCRFind() +{ + // default + QCOMPARE(mStatWrd.broadCRf, broadCR0); + + // after setting + QCOMPARE(mStatWrd.broadCRFind(0x95A5), (uint8_t)(0)); + QCOMPARE(mStatWrd.broadCRFind(0x95B5), (uint8_t)(1)); +} + +void teststatwrd::testbusyFind() +{ + // default + QCOMPARE(mStatWrd.busyf, busy0); + + // after setting + QCOMPARE(mStatWrd.busyFind(0x95B5), (uint8_t)(0)); + QCOMPARE(mStatWrd.busyFind(0x95BD), (uint8_t)(1)); +} + +void teststatwrd::testsubSysFFind() +{ + // default + QCOMPARE(mStatWrd.subSysFf, subSysF0); + + // after setting + QCOMPARE(mStatWrd.subSysFFind(0x95A9), (uint8_t)(0)); + QCOMPARE(mStatWrd.subSysFFind(0x95AD), (uint8_t)(1)); +} + +void teststatwrd::testdynBCAFind() +{ + // default + QCOMPARE(mStatWrd.dynBCAf, dynBCA0); + + // after setting + QCOMPARE(mStatWrd.dynBCAFind(0x95AC), (uint8_t)(0)); + QCOMPARE(mStatWrd.dynBCAFind(0x95AE), (uint8_t)(1)); +} + +void teststatwrd::testtermFlgFind() +{ + // default + QCOMPARE(mStatWrd.termFlgf, termFlg0); + + // after setting + QCOMPARE(mStatWrd.termFlgFind(0x95AE), (uint8_t)(0)); + QCOMPARE(mStatWrd.termFlgFind(0x95AF), (uint8_t)(1)); +} +*/ diff --git a/teststat.h b/teststat.h new file mode 100644 index 0000000..a5fb404 --- /dev/null +++ b/teststat.h @@ -0,0 +1,45 @@ +/*#ifndef TESTSTAT_H +#define TESTSTAT_H + +#include +#include "statwrd.h" + +class teststatwrd:public QObject +{ + Q_OBJECT + +private slots: + + void testConstructor(); + void testaddrRTFind(); + void testmessErrFind(); + void testinstrFind(); + void testserReqFind(); + void testreservFind(); + void testbroadCRFind(); + void testbusyFind(); + void testsubSysFFind(); + void testdynBCAFind(); + void testtermFlgFind(); + + +private: + + const uint8_t addrRT0 = 0; + const uint8_t messErr0 = 0; + const uint8_t instr0 = 0; + const uint8_t serReq0 = 0; + const uint8_t reserv0 = 0; + const uint8_t broadCR0 = 0; + const uint8_t busy0 = 0; + const uint8_t subSysF0 = 0; + const uint8_t dynBCA0 = 0; + const uint8_t termFlg0 = 0; + +private: + + StatusWord mStatWrd; +}; + +#endif // TESTSTAT_H +*/