📄 rtwnd.cpp
字号:
// RTWnd.cpp : implementation file
//
#include "stdafx.h"
#include "SF1553.h"
#include "RTWnd.h"
#include "ModeSelDlg.h"
#include "RTSetupdlg.h"
#include "RTDataDlg.h"
#include "ProgressDlg.h"
#include "TimeSetDlg.h"
#include "DIODlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRTWnd
extern CSF1553App theApp;
extern BOOL fileOptNow;
CMenu NEAR CRTWnd::menu;
extern BYTE pgbarOpt;
extern DWORD dwbarmax;
extern DWORD dwbarmin;
extern DWORD dwbarpos;
IMPLEMENT_DYNCREATE(CRTWnd, CMDIChildWnd)
CRTWnd::CRTWnd()
{
}
CRTWnd::~CRTWnd()
{
}
BOOL CRTWnd::Create(LPCTSTR szTitle, LONG style /* = 0 */,
const RECT& rect /* = rectDefault */,
CMDIFrameWnd* parent /* = NULL */)
{
// Setup the shared menu
if (menu.m_hMenu == NULL)
menu.LoadMenu(IDR_SF1553TYPERT);
m_hMenuShared = menu.m_hMenu;
// Register a custom WndClass and create a window.
// This must be done because CBounceWnd has a custom cursor, and
// no icon.
LPCTSTR lpszRTClass =
AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
NULL,
(HBRUSH)(COLOR_APPWORKSPACE),
LoadIcon(theApp.m_hInstance, MAKEINTRESOURCE(IDR_SF1553TYPERT)));
return CMDIChildWnd::Create(lpszRTClass, szTitle, style, rect, parent);
}
BEGIN_MESSAGE_MAP(CRTWnd, CMDIChildWnd)
//{{AFX_MSG_MAP(CRTWnd)
ON_COMMAND(ID_FILE_NEW, OnMenuFileNew)
ON_COMMAND(IDM_RT_SETUP, OnRtSetup)
ON_COMMAND(IDM_RT_CONFDATA, OnRtConfdata)
ON_COMMAND(IDM_RT_RUN, OnRtRun)
ON_COMMAND(IDM_RT_STOP, OnRtStop)
ON_COMMAND(IDM_RT_CLEARVIEW, OnRtClearview)
ON_WM_CREATE()
ON_WM_SIZE()
ON_MESSAGE(CWM_RT_UPDATE, OnCMsgRtUpdate)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_MENU_TIME, OnMenuTime)
ON_COMMAND(ID_MENU_DIO, OnMenuDio)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRTWnd message handlers
void CRTWnd::OnMenuFileNew()
{
// TODO: Add your command handler code here
BOOL blNeedRun=FALSE;
if (!((::IsWindow(g_RunStat.hWndBC)) ||
(::IsWindow(g_RunStat.hWndRT)) ||
(::IsWindow(g_RunStat.hWndMT))))
{
blNeedRun = TRUE;
}
if (blNeedRun)
{
CModeSelDlg dlgModeSel;
dlgModeSel.DoModal();
}
else
{
// message information
MessageBox(TEXT("已经新建了功能项!"), TEXT("警告"), MB_OK | MB_ICONWARNING);
}
}
void CRTWnd::OnRtSetup()
{
// TODO: Add your command handler code here
CRTSetupDlg dlgRTSetup;
dlgRTSetup.DoModal();
}
void CRTWnd::OnRtConfdata()
{
// TODO: Add your command handler code here
CRTDataDlg dlgRTData;
dlgRTData.DoModal();
}
void CRTWnd::OnRtRun()
{
// TODO: Add your command handler code here
if (g_RunStat.blRTRunning)
return;
if (this->isFileOptNow)
{
MessageBox(TEXT("请先等待数据文件打开/保存操作完成!"), TEXT("RT 警告"), MB_OK | MB_ICONWARNING);
return;
}
this->menu.EnableMenuItem(IDM_RT_RUN, MF_DISABLED | MF_GRAYED);
this->m_wndToolBar.SetButtonStyle(2, TBBS_CHECKED | TBBS_DISABLED);
this->menu.EnableMenuItem(IDM_RT_STOP, MF_ENABLED);
this->m_wndToolBar.SetButtonStyle(3, 0);
if (!(this->isNeedRTDraw))
this->m_Grid.SetRedraw(FALSE);
g_RunStat.blRTRunning = TRUE;
}
void CRTWnd::OnRtStop()
{
// TODO: Add your command handler code here
if (!g_RunStat.blRTRunning)
return;
g_RunStat.blRTRunning = FALSE;
this->menu.EnableMenuItem(IDM_RT_STOP, MF_DISABLED | MF_GRAYED);
this->m_wndToolBar.SetButtonStyle(3, TBBS_CHECKED | TBBS_DISABLED);
this->menu.EnableMenuItem(IDM_RT_RUN, MF_ENABLED);
this->m_wndToolBar.SetButtonStyle(2, 0);
if (!(this->isNeedRTDraw))
this->m_Grid.SetRedraw(TRUE);
}
void CRTWnd::OnRtClearview()
{
// TODO: Add your command handler code here
if (g_RunStat.blRTRunning)
{
MessageBox(TEXT("请先停止对本通道RT的接收操作!"), TEXT("警告"), MB_OK | MB_ICONWARNING);
return;
}
if (this->isFileOptNow)
{
MessageBox(TEXT("请先等待数据文件打开/保存操作完成!"), TEXT("RT 警告"), MB_OK | MB_ICONWARNING);
return;
}
this->MsgRecvCnt = 0;
// ID+BLOCK_STATUS_WORD+TIMETAG+DATA+From+To+CMD+CNT/MC+CH-A/B+DATA
this->m_Grid.SetRows(2);
this->m_Grid.Clear();
this->m_Grid.SetRow(0);
this->m_Grid.SetCol(0); // ID
this->m_Grid.SetText(TEXT("序号"));
this->m_Grid.SetCol(1); // BLOCK_STATUS_WORD
this->m_Grid.SetText(TEXT("消息描述字"));
this->m_Grid.SetCol(2); // TIMETAG
this->m_Grid.SetText(TEXT("时间标签(us)"));
this->m_Grid.SetCol(3); // From
this->m_Grid.SetText(TEXT("发送方"));
this->m_Grid.SetCol(4); // To
this->m_Grid.SetText(TEXT("接收方"));
this->m_Grid.SetCol(5); // CMD
this->m_Grid.SetText(TEXT("指令字"));
this->m_Grid.SetCol(6); // CNT/MC
this->m_Grid.SetText(TEXT("CNT/MC"));
this->m_Grid.SetCol(7); // CH-A/B
this->m_Grid.SetText(TEXT("通道A/B"));
this->m_Grid.SetCol(8); // DATA
this->m_Grid.SetText(TEXT("数据"));
this->m_Grid.SetCol(9); // Comment
this->m_Grid.SetText(TEXT("备注"));
}
int CRTWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TYPERT))
{
TRACE0("Failed to create RT toolbar\n");
return -1; // fail to create
}
this->m_bAutoMenuEnable = FALSE;
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//EnableDocking(CBRS_ALIGN_ANY);
//DockControlBar(&m_wndToolBar);
// Init Menu and Toolbar status
//
this->menu.EnableMenuItem(IDM_RT_STOP, MF_DISABLED | MF_GRAYED);
this->m_wndToolBar.SetButtonStyle(3, TBBS_CHECKED | TBBS_DISABLED);
// create grid window
//
RECT rc;
this->GetClientRect(&rc);
rc.top = 25;
rc.bottom -= 25;
if (!(this->m_Grid.Create("", WS_CHILD | WS_VISIBLE, rc, this, IDC_RTWND_MSFLEXGRID, NULL, FALSE)))
{
return -1;
}
// ID+BLOCK_STATUS_WORD+TIMETAG+DATA+From+To+CMD+CNT/MC+CH-A/B+DATA+Comment
this->m_Grid.SetCols(10);
this->m_Grid.SetRows(2);
this->m_Grid.SetRow(0);
this->m_Grid.SetCol(0); // ID
this->m_Grid.SetText(TEXT("序号"));
this->m_Grid.SetColWidth(0, 8*180);
this->m_Grid.SetCol(1); // BLOCK_STATUS_WORD
this->m_Grid.SetText(TEXT("消息描述字"));
this->m_Grid.SetColWidth(1, 6*180);
this->m_Grid.SetCol(2); // TIMETAG
this->m_Grid.SetText(TEXT("时间标签(us)"));
this->m_Grid.SetColWidth(2, 8*180);
this->m_Grid.SetCol(3); // From
this->m_Grid.SetText(TEXT("发送方"));
this->m_Grid.SetColWidth(3, 8*180);
this->m_Grid.SetCol(4); // To
this->m_Grid.SetText(TEXT("接收方"));
this->m_Grid.SetColWidth(4, 8*180);
this->m_Grid.SetCol(5); // CMD
this->m_Grid.SetText(TEXT("指令字"));
this->m_Grid.SetColWidth(5, 5*180);
this->m_Grid.SetCol(6); // CNT/MC
this->m_Grid.SetText(TEXT("CNT/MC"));
this->m_Grid.SetColWidth(6, 5*180);
this->m_Grid.SetCol(7); // CH-A/B
this->m_Grid.SetText(TEXT("通道A/B"));
this->m_Grid.SetColWidth(7, 4*180);
this->m_Grid.SetCol(8); // DATA
this->m_Grid.SetText(TEXT("数据"));
this->m_Grid.SetColWidth(8, 35*180);
this->m_Grid.SetCol(9); // Comment
this->m_Grid.SetText(TEXT("备注"));
this->m_Grid.SetColWidth(9, 12*180);
this->m_Grid.SetColAlignment(0, 0); // col alignment
this->m_Grid.SetColAlignment(1, 0); // col alignment
this->m_Grid.SetColAlignment(2, 0); // col alignment
this->m_Grid.SetColAlignment(3, 0); // col alignment
this->m_Grid.SetColAlignment(4, 0); // col alignment
this->m_Grid.SetColAlignment(5, 0); // col alignment
this->m_Grid.SetColAlignment(6, 0); // col alignment
this->m_Grid.SetColAlignment(7, 0); // col alignment
this->m_Grid.SetColAlignment(8, 0); // col alignment
this->m_Grid.SetColAlignment(9, 0); // col alignment
this->m_Grid.SetFixedCols(0); // fixed coloum
this->m_Grid.SetFixedRows(1);
this->m_Grid.SetSelectionMode(0); // free
this->m_Grid.SetScrollTrack(FALSE); // no scroll track
this->m_Grid.SetAllowBigSelection(FALSE);
this->m_Grid.SetAllowUserResizing(1); // enable cols resize
this->m_Grid.EnableWindow(TRUE);
int i=0;
this->MsgRecvCnt = 0;
this->isFileOptNow = FALSE;
this->isNeedRTDraw = TRUE;
// Setup Card
// Init RT Mode
if (g_CardHandle != NULL)
{
// Init Remote Terminal
RT_Init(g_CardHandle);
//RT数据发送模式:单缓冲或循环缓冲
RT_TxMode(g_CardHandle, &g_RTTxMode);
//RT使能
if (!RT_Select(g_CardHandle, g_RTConf.dwRTSel))
{
MessageBox(TEXT("RT 地址选择失败!"), TEXT("RT 错误"), MB_OK | MB_ICONERROR);
return -1;
}
//清置时标
RT_ClearTTagOnSync(g_CardHandle, g_RTConf.blRT_ClearTTagOnSync);
RT_LoadTTagOnSync(g_CardHandle, g_RTConf.blRT_LoadTTagOnSync);
//设置RT的状态字
for (i=0; i<RT_ADDR_MAX; i++)
{
if (!RT_Status_Set(g_CardHandle, i, &g_RTStatusWord[i]))
{
MessageBox(TEXT("RT 状态字设置失败!"), TEXT("RT 错误"), MB_OK | MB_ICONERROR);
return -1;
}
}
//RT非法指令表使能
if (!RT_IllegalCmd(g_CardHandle, g_RTConf.blEnIllCmdTable))
{
MessageBox(TEXT("RT 非法指令表使能失败!"), TEXT("RT 错误"), MB_OK | MB_ICONERROR);
return -1;
}
//RT非法指令接收数据使能
if (!RT_RevIllegalData(g_CardHandle, g_RTConf.blEnIllRxData))
{
MessageBox(TEXT("RT 非法指令接收数据使能失败!"), TEXT("RT 错误"), MB_OK | MB_ICONERROR);
return -1;
}
//RT非法指令表设置
RT_SetIllegalCmdTable(g_CardHandle, &g_RTConf.stIllCmdTable);
//RT设置矢量字
for (i=0; i<RT_ADDR_MAX; i++)
{
RT_SetVectorWord(g_CardHandle, i, g_RTConf.wdVctWord[i]);
}
//RT设置自检字(Build In Test)
for (i=0; i<RT_ADDR_MAX; i++)
{
RT_SetBITWord(g_CardHandle, i, g_RTConf.wdBitWord[i]);
}
}
else
{
// demo mode
}
return 0;
}
void CRTWnd::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
RECT rc;
this->GetClientRect(&rc);
rc.top = 25;
rc.bottom -= 25;
this->m_Grid.MoveWindow(rc.left, rc.top, rc.right, rc.bottom, TRUE);
}
void CRTWnd::OnCMsgRtUpdate()
{
// custom message for RT Update
//
char c[1024];
char s[80];
double a=1.0;
int i=0, j=0, len=0;
WORD bsw=0;
WORD cmd=0;
WORD rt=0, sa=0, mc=0, wc=0, tr=0;
if ((this->MsgRecvCnt)==0)
{
if (g_RunStat.blRTRxOrTx) // Tx
{
bsw = g_RTTxMsg.BSW; // Block Status Word
cmd = g_RTTxMsg.MSGBlock[0]; // Command Word
rt = ::OwnRTAddr(cmd);
tr = ::OwnTR(cmd);
sa = ::OwnSubAddr(cmd);
wc = ::OwnWordCount(cmd);
mc = ::OwnModeCode(cmd);
ultoa((this->MsgRecvCnt)+1, c, 10);
this->m_Grid.SetRow(1);
this->m_Grid.SetCol(0); // ID
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(1); // BLOCK_STATUS_WORD
sprintf(c, "%04x", bsw);
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(2); // TIMETAG
ultoa(g_RTTxMsg.TimeTag, c, 10);
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(3); // From
if (rt==31) // Broadcast
{
// data or mode code
if ((sa==0)||(sa==31))
sprintf(c, "RT(s),Mod(%d)", sa); // mode code
else
sprintf(c, "RT(s),Sa%d", sa); // data
}
else
{
// data or mode code
if ((sa==0)||(sa==31))
sprintf(c, "RT%d,Mod(%d)", rt, sa); // mode code
else
sprintf(c, "RT%d,Sa%d", rt, sa); // data
}
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(4); // To
if ((bsw&RTMS_RT_RT_FMT)==RTMS_RT_RT_FMT)
this->m_Grid.SetText(TEXT(""));
else
this->m_Grid.SetText(TEXT("BC"));
this->m_Grid.SetCol(5); // CMD
sprintf(c, "%04x", cmd);
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(6); // CNT/MC
if ((sa==0)||(sa==31))
sprintf(c, "MC%d", mc);
else
{
if (wc==0)
sprintf(c, "32");
else
sprintf(c, "%d", wc);
}
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(7); // CH-A/B
if ((bsw&RTMS_CH_BORA)==RTMS_CH_BORA)
this->m_Grid.SetText(TEXT("B"));
else
this->m_Grid.SetText(TEXT("A"));
this->m_Grid.SetCol(8); // DATA
memset(c, 0, sizeof(c));
strcpy(c, " ");
i = 0;
while ((i < 37) && (g_RunStat.blRTRunning))
{
sprintf(s, " %04x", g_RTTxMsg.MSGBlock[i]);
strcat(c, s);
i++;
}
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(9); // Comment
if ((bsw&RTMS_ERR_FLAG)==RTMS_ERR_FLAG)
{
this->m_Grid.SetText(TEXT("消息出错"));
}
else
{
if ((bsw&RTMS_RT_RT_FMT)==RTMS_RT_RT_FMT)
{
this->m_Grid.SetText(TEXT("RT-RT"));
}
else
{
if (((bsw&RTMS_ERR_FLAG)==RTMS_ERR_FLAG) && ((bsw&RTMS_RT_RT_FMT)==RTMS_RT_RT_FMT))
{
this->m_Grid.SetText(TEXT("RT-RT (消息出错)"));
}
else
{
this->m_Grid.SetText(TEXT(""));
}
}
}
}
else // Rx
{
bsw = g_RTRxMsg.BSW; // Block Status Word
cmd = g_RTRxMsg.MSGBlock[0]; // Command Word
rt = ::OwnRTAddr(cmd);
tr = ::OwnTR(cmd);
sa = ::OwnSubAddr(cmd);
wc = ::OwnWordCount(cmd);
mc = ::OwnModeCode(cmd);
ultoa((this->MsgRecvCnt)+1, c, 10);
this->m_Grid.SetRow(1);
this->m_Grid.SetCol(0); // ID
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(1); // BLOCK_STATUS_WORD
sprintf(c, "%04x", bsw);
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(2); // TIMETAG
ultoa(g_RTRxMsg.TimeTag, c, 10);
this->m_Grid.SetText(TEXT(c));
this->m_Grid.SetCol(3); // From
if ((bsw&RTMS_RT_RT_FMT)==RTMS_RT_RT_FMT)
this->m_Grid.SetText(TEXT(""));
else
this->m_Grid.SetText(TEXT("BC"));
this->m_Grid.SetCol(4); // To
if (rt==31) // Broadcast
{
// data or mode code
if ((sa==0)||(sa==31))
sprintf(c, "RT(s),Mod(%d)", sa); // mode code
else
sprintf(c, "RT(s),Sa%d", sa); // data
}
else
{
// data or mode code
if ((sa==0)||(sa==31))
sprintf(c, "RT%d,Mod(%d)", rt, sa); // mode code
else
sprintf(c, "RT%d,Sa%d", rt, sa); // data
}
this->m_Grid.SetText(TEXT(c));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -