⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtwnd.cpp

📁 1553B板卡的源代码,只有购买板卡才能得到的好资料
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -