fixed bc mode v2

This commit is contained in:
2025-08-29 14:02:18 +03:00
parent 603fec6fc3
commit 7ef4616a00
4 changed files with 103 additions and 212 deletions

View File

@@ -1,18 +1,17 @@
#include <QDebug> #include <QDebug>
#include "bcmil.h" #include "bcmil.h"
#include "WDMTMKv2.cpp" #include "WDMTMKv2.cpp"
//#include <windows.h>
//TTmkEventData tmkEvD; TTmkEventData tmkEvD;
HANDLE hBcEvent; HANDLE hEvent;
//HANDLE hRtEvent;
int nTmk; int nTmk;
unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0; unsigned long dwGoodStarts = 0, dwBusyStarts = 0, dwErrStarts = 0, dwStatStarts = 0;
unsigned long dwStarts = 0L; unsigned long dwStarts = 0L;
TMK_DATA wSubAddr, wState, wStatus; 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"; qDebug() << "MIL constructor";
if (TmkOpen()) 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) /*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); //printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts);
bcreset(); bcreset();
//Close all opened things //Close all opened things
CloseHandle(hBcEvent); CloseHandle(hEvent);
tmkdone(ALL_TMKS); tmkdone(ALL_TMKS);
TmkClose(); TmkClose();
}*/ }*/
@@ -104,14 +112,41 @@ MIL::MIL(int dev_index) //open the driver, configuration, create event
void MIL::closeAllrt() void MIL::closeAllrt()
{ {
qDebug() << "Close All"; qDebug() << "Close All";
//printf("\nGood: %ld, Busy: %ld, Error: %ld, Status: %ld\n", dwGoodStarts, dwBusyStarts, dwErrStarts, dwStatStarts);
rtreset(); rtreset();
//Close all opened things CloseHandle(hEvent);
CloseHandle(hBcEvent);
tmkdone(ALL_TMKS); tmkdone(ALL_TMKS);
TmkClose(); 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() MIL::~MIL()
{ {
qDebug() << "MIL destructor"; qDebug() << "MIL destructor";
@@ -147,44 +182,26 @@ RT_MIL::RT_MIL(int dev_index, unsigned short Addr): MIL(dev_index)
qDebug() << "RT_MIL constructor"; qDebug() << "RT_MIL constructor";
this->m_Addr = Addr; 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 //Try to reset in RT mode
if (rtreset()) if (rtreset())
{ {
qDebug() << "rtreset error"; qDebug() << "rtreset() error";
closeAllrt(); closeAllrt();
} }
//Set RT address, set flag mode, enable data irqs //Set RT address, set flag mode, enable data irqs
rtdefaddress(Addr); rtdefaddress(Addr);
rtdefmode(rtgetmode()|RT_FLAG_MODE); rtdefmode(0);
//rtdefmode(rtgetmode()&~RT_FLAG_MODE);
rtdefirqmode(rtgetirqmode()&~RT_DATA_BL); rtdefirqmode(rtgetirqmode()&~RT_DATA_BL);
//Ready to receive, not ready to transmit
for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr) for (wSubAddr = 1; wSubAddr <= 30; ++wSubAddr)
{ {
//Ready to receive, not ready to transmit
rtdefsubaddr(RT_RECEIVE, wSubAddr); rtdefsubaddr(RT_RECEIVE, wSubAddr);
rtclrflag(); rtclrflag();
rtdefsubaddr(RT_TRANSMIT, wSubAddr); rtdefsubaddr(RT_TRANSMIT, wSubAddr);
rtclrflag(); rtclrflag();
} }
hBcEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if (!hBcEvent)
{
qDebug() << "create event error";
closeAllrt();
}
ResetEvent(hBcEvent);
tmkdefevent(hBcEvent, TRUE);
} }
RT_MIL::~RT_MIL() RT_MIL::~RT_MIL()

54
bcmil.h
View File

@@ -3,54 +3,6 @@
#include <QObject> #include <QObject>
//*******************
//#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 #define TMK_DATA unsigned short
typedef void *HANDLE; typedef void *HANDLE;
@@ -67,12 +19,8 @@ public:
//int WaitInt(TMK_DATA wCtrlCode); //int WaitInt(TMK_DATA wCtrlCode);
//void closeAll(); //void closeAll();
void closeAllrt(); void closeAllrt();
//bool GetEvent(TTmkEventData1 *pEv, unsigned short Timeout); bool GetEvent(unsigned short Timeout);
protected:
int m_TmkIndex; int m_TmkIndex;
//HANDLE m_hEvent;
}; };
/*class BC_MIL:public MIL /*class BC_MIL:public MIL

View File

@@ -3,19 +3,17 @@
//#include "WDMTMKv2.cpp" //#include "WDMTMKv2.cpp"
#include "bcmil.cpp" #include "bcmil.cpp"
TTmkEventData tmkEvD; extern TTmkEventData tmkEvD;
extern HANDLE hBcEvent; extern HANDLE hEvent;
//#define RT_ADDR 10 #define RT_ADDR 0x1
//const int fInstMode = 1;
unsigned short awBuf[32]; unsigned short awBuf[32];
TMK_DATA wBase, wMaxBase, wLen; TMK_DATA wBase, wMaxBase, wLen;
extern TMK_DATA wSubAddr, wState; extern TMK_DATA wSubAddr, wState;
unsigned char HexBinFlag = 1; //1 - hex, 0 - bin int HexBinFlag = 1;
MainWindow::MainWindow() MainWindow::MainWindow()
{ {
@@ -31,20 +29,19 @@ void MainWindow::init_mainwindowobj()
Window_1 = new QWidget; Window_1 = new QWidget;
Window_2 = new QWidget; Window_2 = new QWidget;
HexBinButton = new QPushButton("Hex/Bin"); RtModeLabel = new QLabel("RT mode");
HexBinLabel = new QLabel("Hex"); 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; DataTable = new QTableWidget;
QGridLayout *layout_g = new QGridLayout(Window_2); QGridLayout *layout_g = new QGridLayout(Window_2);
layout_g->addWidget(HexBinButton, 0, 1); layout_g->addWidget(RtModeLabel, 0, 0); // Row 0, Column 0
layout_g->addWidget(HexBinLabel, 0, 0); layout_g->addWidget(StartRtModeButton, 1, 0);
layout_g->addWidget(CmdWordLabel, 1, 0); // Row 0, Column 0 layout_g->addWidget(BcModeLabel, 0, 1);
layout_g->addWidget(CmdWordLineEdit, 2, 0); layout_g->addWidget(StartBcModeButton, 1, 1);
layout_g->addWidget(EnterCmdWordButton, 3, 0);
Window_2->setLayout(layout_g); Window_2->setLayout(layout_g);
setCentralWidget(Window_2); setCentralWidget(Window_2);
@@ -63,28 +60,14 @@ void MainWindow::init_connections()
SIGNAL(clicked()), SIGNAL(clicked()),
this, this,
SLOT(getlineedit()));*/ SLOT(getlineedit()));*/
/*connect(EnterCmdWordButton, /*connect(StartBcModeButton,
SIGNAL(clicked()), SIGNAL(clicked()),
this, this,
SLOT(sendcmdwrd()));*/ SLOT(bchandler()));*/
connect(EnterCmdWordButton, connect(StartRtModeButton,
SIGNAL(clicked()), SIGNAL(clicked()),
this, this,
SLOT(rthandler())); 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() /*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() void MainWindow::init_table()
{ {
int ColCount = 3; int ColCount = 3;
@@ -189,8 +156,6 @@ void MainWindow::init_table()
} }
} }
void MainWindow::set_item(QTableWidget *pTable, int indRow, void MainWindow::set_item(QTableWidget *pTable, int indRow,
int indCol, QString data, bool editFlag) int indCol, QString data, bool editFlag)
{ {
@@ -210,7 +175,7 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow,
pTable->item(indRow, indCol)->setTextColor(color); pTable->item(indRow, indCol)->setTextColor(color);
} }
/*void MainWindow::sendcmdwrd() /*void MainWindow::bchandler()
{ {
qDebug() << "send1"; qDebug() << "send1";
QScopedPointer<BC_MIL> NewBC(new BC_MIL(0)); QScopedPointer<BC_MIL> NewBC(new BC_MIL(0));
@@ -254,66 +219,44 @@ void MainWindow::set_item(QTableWidget *pTable, int indRow,
void MainWindow::rthandler() void MainWindow::rthandler()
{ {
qDebug() << "rt1"; QScopedPointer<RT_MIL> NewRT(new RT_MIL(0x0, RT_ADDR));
QScopedPointer<RT_MIL> NewRT(new RT_MIL(0, 1));
qDebug() << "rt2";
int i = 0; int i = 0;
while (i != 1000) while (i != 100)
{ {
i++; i++;
if (tmkselect(0))
if(NewRT->GetEvent(1000))
{ {
qDebug() << "tmk select error"; switch (tmkEvD.nInt)
NewRT->closeAllrt();
}
//Wait for an interrupt
switch (WaitForSingleObject(hBcEvent, 1000))
{ {
case WAIT_OBJECT_0: case 1:
qDebug() << "Interrupt"; qDebug() << "Cmd word arrived " << tmkEvD.rt.wCmd << " " <<tmkEvD.rt.wStatus;
//New message has arrived break;
ResetEvent(hBcEvent);
do case 2:
{ qDebug() << "Case 2";
//Get interrupt data break;
tmkgetevd(&tmkEvD);
//Check interrupt type case 3:
if (tmkEvD.nInt == 3) qDebug() << "Data arrived";
{ wSubAddr = (tmkEvD.rt.wStatus >> 5) & 0x1F;
wSubAddr = (tmkEvD.rt.wStatus >> 5) &0x1F;
wLen = tmkEvD.rt.wStatus & 0x1F; wLen = tmkEvD.rt.wStatus & 0x1F;
if (wLen == 0) if (wLen == 0)
wLen = 32; wLen = 32;
if ((tmkEvD.rt.wStatus & RT_DIR_MASK) == RT_RECEIVE)
if (RT_RECEIVE == (tmkEvD.rt.wStatus & RT_DIR_MASK))
{ {
//If we received some data then copy the data from Rx subaddres to if (tmkselect(NewRT->m_TmkIndex))
//Tx subaddress and process flags
if ((rtgetflag(RT_RECEIVE, wSubAddr) & RT_FLAG_MASK) == 0)
{ {
//qDebug() << "Flag read error"; qDebug() << "tmkselect() error";
NewRT->closeAllrt();
} }
rtdefsubaddr(RT_RECEIVE, wSubAddr); rtdefsubaddr(RT_RECEIVE, wSubAddr);
rtgetblk(0, awBuf, wLen); rtgetblk(0, awBuf, wLen);
rtclrflag();
rtdefsubaddr(RT_TRANSMIT, wSubAddr);
rtputblk(0, awBuf, wLen);
rtsetflag();
} }
break;
} }
} 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();
break; break;
} }
} }

View File

@@ -19,37 +19,20 @@ private:
public slots: public slots:
//void getlineedit(); //void getlineedit();
//void sendcmdwrd(); //void bchandler();
void rthandler(); void rthandler();
void HexBinChange();
private: private:
QWidget *Window_1 = new QWidget; QWidget *Window_1 = new QWidget;
QWidget *Window_2 = new QWidget; QWidget *Window_2 = new QWidget;
QLabel *HexBinLabel; QLabel *RtModeLabel;
QPushButton *HexBinButton; QPushButton *StartRtModeButton;
QLabel *BcModeLabel;
QPushButton *StartBcModeButton;
QLabel *CmdWordLabel;
QLineEdit *CmdWordLineEdit;
QPushButton *EnterCmdWordButton;
QTableWidget *DataTable; 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 #endif // MAINWINDOW_H