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

📄 bcwnd.cpp

📁 1553B板卡的源代码,只有购买板卡才能得到的好资料
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BCWnd.cpp : implementation file
//

#include "stdafx.h"
#include "SF1553.h"
#include "BCWnd.h"
#include "ModeSelDlg.h"
#include "BCSetupDlg.h"
#include "BCMsgDlg.h"
#include "BCFrameDlg.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

/////////////////////////////////////////////////////////////////////////////
// CBCWnd

extern CSF1553App theApp;

static BOOL isFrameRptNow=FALSE;

extern BOOL fileOptNow;
extern BYTE pgbarOpt;
extern DWORD dwbarmax;
extern DWORD dwbarmin;
extern DWORD dwbarpos;



CMenu NEAR CBCWnd::menu;

IMPLEMENT_DYNCREATE(CBCWnd, CMDIChildWnd)

CBCWnd::CBCWnd()
{
}

CBCWnd::~CBCWnd()
{
}


BOOL CBCWnd::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_SF1553TYPEBC);
	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 lpszBCClass =
		AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
			NULL,
			(HBRUSH)(COLOR_APPWORKSPACE),
			LoadIcon(theApp.m_hInstance, MAKEINTRESOURCE(IDR_SF1553TYPEBC)));

	return CMDIChildWnd::Create(lpszBCClass, szTitle, style, rect, parent);
}




BEGIN_MESSAGE_MAP(CBCWnd, CMDIChildWnd)
	//{{AFX_MSG_MAP(CBCWnd)
	ON_COMMAND(ID_FILE_NEW, OnMenuFileNew)
	ON_WM_CREATE()
	ON_COMMAND(IDM_BC_SETUP, OnBcSetup)
	ON_COMMAND(IDM_BC_MESSAGE, OnBcMessage)
	ON_COMMAND(IDM_BC_RUN, OnBcRun)
	ON_COMMAND(IDM_BC_STOP, OnBcStop)
	ON_COMMAND(IDM_BC_SEND_FRAME, OnBcSendFrame)
	ON_COMMAND(IDM_BC_CLEARVIEW, OnBcClearview)
	ON_COMMAND(IDM_BC_AUTOREP, OnBcAutorep)
	ON_COMMAND(IDM_BC_FRAME, OnBcFrame)
	ON_MESSAGE(CWM_BC_UPDATE, OnCMsgBcUpdate)
	ON_WM_SIZE()
	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()

/////////////////////////////////////////////////////////////////////////////
// CBCWnd message handlers

void CBCWnd::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);
	}

	
}

int CBCWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	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_TYPEBC))
	{
		TRACE0("Failed to create BC toolbar\n");
		return -1;      // fail to create
	}

	this->m_bAutoMenuEnable = FALSE;

	this->menu.EnableMenuItem(IDM_BC_STOP, MF_DISABLED | MF_GRAYED);
	this->m_wndToolBar.SetButtonStyle(4, TBBS_CHECKED | TBBS_DISABLED);

	RECT rc;

	this->GetClientRect(&rc);
	rc.top = 25;
	rc.bottom -= 25;
	if (!(this->m_Grid.Create("", WS_CHILD | WS_VISIBLE, rc, this, IDC_BCWND_MSFLEXGRID, NULL, FALSE)))
	{
		return -1;
	}

	// ID+BLOCK_STATUS_WORD+TIMETAG+DATA+From+To+CMD1+CMD2+CNT/MC+CH-A/B+DATA+Comment
	this->m_Grid.SetCols(11);
	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, 7*180);

	this->m_Grid.SetCol(4); // To
	this->m_Grid.SetText(TEXT("接收方"));
	this->m_Grid.SetColWidth(4, 7*180);

	this->m_Grid.SetCol(5); // CMD1
	this->m_Grid.SetText(TEXT("指令字"));
	this->m_Grid.SetColWidth(5, 5*180);

	this->m_Grid.SetCol(6); // CMD2
	this->m_Grid.SetText(TEXT("指令字[2]"));
	this->m_Grid.SetColWidth(6, 5*180);

	this->m_Grid.SetCol(7); // CNT/MC
	this->m_Grid.SetText(TEXT("CNT/MC"));
	this->m_Grid.SetColWidth(7, 5*180);

	this->m_Grid.SetCol(8); // CH-A/B
	this->m_Grid.SetText(TEXT("通道A/B"));
	this->m_Grid.SetColWidth(8, 4*180);

	this->m_Grid.SetCol(9); // DATA
	this->m_Grid.SetText(TEXT("命令/数据字"));
	this->m_Grid.SetColWidth(9, 35*180);

	this->m_Grid.SetCol(10); // Comment
	this->m_Grid.SetText(TEXT("备注"));
	this->m_Grid.SetColWidth(10, 8*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.SetColAlignment(10, 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);


	this->MsgRecvCnt = 0;

	isFrameRptNow = FALSE;
	this->isFileOptNow = FALSE;
	//this->isSearchNow = FALSE;

	this->isNeedRTDraw = TRUE;
	//this->menu.CheckMenuItem(IDM_BC_ALLOWRTDRAW, MF_CHECKED);


	//	Setup Card
	// Init BC Mode

	if (g_CardHandle != NULL)
	{
		// Init Bus Controller
		BC_Init(g_CardHandle);

		//BC出错停止消息处理
		
		if(!BC_StopOnError(g_CardHandle, &g_BCConf.stoponerrconf))
		{
			MessageBox(TEXT("BC停止消息处理失败!"), TEXT("BC 错误"), MB_OK | MB_ICONERROR);
			return -1;
		}
		
		//BC状态字置位停止消息处理
		if (!BC_OnStatusSet(g_CardHandle, &g_BCConf.statussetconf))
		{
			MessageBox(TEXT("设置状态处理失败!"), TEXT("BC 错误"), MB_OK | MB_ICONERROR);
			return -1;
		}
	}
	else
	{
		// demo mode
	}

	
	// TODO: Add your specialized creation code here
	return 0;
}

void CBCWnd::OnBcSetup() 
{
	// TODO: Add your command handler code here
	CBCSetupDlg dlgBCSetup;
	dlgBCSetup.DoModal();
}

void CBCWnd::OnBcMessage() 
{
	if (g_RunStat.blBCRunning)
	{
		MessageBox(TEXT("请先停止总线控制器!"), TEXT("警告"), MB_OK | MB_ICONWARNING);
		return;
	}

	CBCMsgDlg dlgBCMsg;
	dlgBCMsg.DoModal();


	// TODO: Add your command handler code here
	
}

void CBCWnd::OnBcRun() 
{
	// TODO: Add your command handler code here
	int i=0;
	WORD fid=0;

	if (g_RunStat.blBCRunning)
		return;

	if (this->isFileOptNow)
	{
		MessageBox(TEXT("请先等待数据文件打开/保存操作完成!"), TEXT("BC 警告"), MB_OK | MB_ICONWARNING);
		return;
	}

	//	update viewr
	//
	this->menu.EnableMenuItem(IDM_BC_RUN, MF_DISABLED | MF_GRAYED);
	this->m_wndToolBar.SetButtonStyle(3, TBBS_CHECKED | TBBS_DISABLED);

	this->menu.EnableMenuItem(IDM_BC_STOP, MF_ENABLED);
	this->m_wndToolBar.SetButtonStyle(4, 0);

	if (!(this->isNeedRTDraw))
		this->m_Grid.SetRedraw(FALSE);

	g_RunStat.blBCRunning = TRUE;

}

void CBCWnd::OnBcStop() 
{
	// TODO: Add your command handler code here
	if (!g_RunStat.blBCRunning)
		return;


	g_RunStat.blBCRunning = FALSE;

	this->menu.EnableMenuItem(IDM_BC_STOP, MF_DISABLED | MF_GRAYED);
	this->m_wndToolBar.SetButtonStyle(4, TBBS_CHECKED | TBBS_DISABLED);

	this->menu.EnableMenuItem(IDM_BC_RUN, MF_ENABLED);
	this->m_wndToolBar.SetButtonStyle(3, 0);

	if (!(this->isNeedRTDraw))
		this->m_Grid.SetRedraw(TRUE);
}

void CBCWnd::OnBcSendFrame() 
{
	// TODO: Add your command handler code here
	WORD len=0;
	len = (WORD)g_FrameConf.num;
	if (len == 0)
	{
		MessageBox(TEXT("请先配置消息群!"), TEXT("BC 警告"), MB_OK | MB_ICONWARNING);
		return;
	}

	//	Write Periods Message & Start BC
	//
	if (g_CardHandle!=NULL)
	{
		BC_SendDataFrame (g_CardHandle, &g_Frame);
		BC_Start(g_CardHandle);
		

		if (g_RunStat.blBCRunning)
		{
			if(g_BCConf.Auto_rep)
			{
				unsigned long rep = g_BCConf.Frm_repeat_times;
				while( rep-- > 0)
				{
					unsigned long nums = g_Frame.MSGNum;
					g_RMsg.MsgId = 0;
					while(nums-- > 0)
					{
						unsigned long r = 0x400;
						while(r-- > 0)
						{
							if (BC_IsMSGOver(g_CardHandle))
							{
								memset(&g_RMsg.Msg, 0, sizeof(g_RMsg.Msg));
								if(BC_ReadMsg(g_CardHandle, &g_RMsg.MsgId, &g_RMsg.Msg))
								{
									::SendMessage(g_RunStat.hWndBC, CWM_BC_UPDATE, 0, 0);
									g_RMsg.MsgId += 1;
									break;
								}
								
							}
						}
					}
				}
			}
			else
			{
				unsigned long nums = g_Frame.MSGNum;
				g_RMsg.MsgId = 0;
				while(nums-- > 0)
				{
					unsigned long r = 0x400;
					while(r-- > 0)
					{
						if (BC_IsMSGOver(g_CardHandle))
						{
							memset(&g_RMsg.Msg, 0, sizeof(g_RMsg.Msg));
							if(BC_ReadMsg(g_CardHandle, &g_RMsg.MsgId, &g_RMsg.Msg))
							{
								::SendMessage(g_RunStat.hWndBC, CWM_BC_UPDATE, 0, 0);
								g_RMsg.MsgId += 1;
								break;
							}
							
						}
					}
				}
			}
		}

	}	
}

void CBCWnd::OnBcClearview() 
{
	// TODO: Add your command handler code here
	if (g_RunStat.blBCRunning)
	{
		MessageBox(TEXT("请先停止对本通道BC的接收操作!"), TEXT("警告"), MB_OK | MB_ICONWARNING);
		return;
	}

	if (this->isFileOptNow)
	{
		MessageBox(TEXT("请先等待数据文件打开/保存操作完成!"), TEXT("BC 警告"), MB_OK | MB_ICONWARNING);
		return;
	}

	this->MsgRecvCnt = 0;

	// ID+BLOCK_STATUS_WORD+TIMETAG+DATA+From+To+CMD1+CMD2+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); // CMD1
	this->m_Grid.SetText(TEXT("指令字"));

	this->m_Grid.SetCol(6); // CMD2
	this->m_Grid.SetText(TEXT("指令字[2]"));

	this->m_Grid.SetCol(7); // CNT/MC
	this->m_Grid.SetText(TEXT("CNT/MC"));

	this->m_Grid.SetCol(8); // CH-A/B
	this->m_Grid.SetText(TEXT("通道A/B"));

	this->m_Grid.SetCol(9); // DATA
	this->m_Grid.SetText(TEXT("命令字/数据"));

	this->m_Grid.SetCol(10); // Comment
	this->m_Grid.SetText(TEXT("备注"));	
}

void CBCWnd::OnBcAutorep() 
{
	// TODO: Add your command handler code here
	if(g_BCConf.Auto_rep)
	{
		menu.CheckMenuItem(IDM_BC_AUTOREP, MF_UNCHECKED);
		this->m_wndToolBar.SetButtonStyle(7, 0);
		g_BCConf.Auto_rep =  FALSE;
	}
	else
	{
		menu.CheckMenuItem(IDM_BC_AUTOREP, MF_CHECKED);
		this->m_wndToolBar.SetButtonStyle(7, TBBS_CHECKED | TBBS_DISABLED);
		g_BCConf.Auto_rep =  TRUE;
	}
	if(g_CardHandle)
	{
		BC_FrameAutoRepeat(g_CardHandle, g_BCConf.Auto_rep);
	}	
}

void CBCWnd::OnBcFrame() 
{
	// TODO: Add your command handler code here
	CBCFrameDlg dlgBCFrame;
	dlgBCFrame.DoModal();
}

void CBCWnd::OnCMsgBcUpdate()
{
	// custom message for BC Update
	//
	char c[1024];
	char s[80];
	double a=1.0;
	int i=0, j=0, len=0;
	WORD bsw=0;
	WORD cmd1=0, cmd2=0;
	WORD rt1=0, sa1=0, mc1=0, wc1=0, tr1=0;
	WORD rt2=0, sa2=0, mc2=0, wc2=0, tr2=0;
	BOOL isRTtoRT=FALSE;
	BOOL isBroadCast=FALSE;


	if ((this->MsgRecvCnt)==0)
	{
		ultoa((this->MsgRecvCnt)+1, c, 10);
		this->m_Grid.SetRow(1);

		this->m_Grid.SetCol(0); // ID
		this->m_Grid.SetText(TEXT(c));
	}
	else
	{
		ultoa((this->MsgRecvCnt)+1, c, 10);
		this->m_Grid.AddItem(c, (COleVariant)a); // ID
		this->m_Grid.SetRow(1);
	}

	this->m_Grid.SetCol(1); // BLOCK_STATUS_WORD
	sprintf(c, "%04x", g_RMsg.Msg.BSW);
	this->m_Grid.SetText(TEXT(c));

	this->m_Grid.SetCol(2); // TIMETAG
	ultoa(g_RMsg.Msg.TimeTag, c, 10);
	this->m_Grid.SetText(TEXT(c));

	bsw = g_RMsg.Msg.BSW; // Block Status Word
	//isRTtoRT = 
	if((g_Frame.SelfMSG[g_RMsg.MsgId].MSGFormat &  MSGTYPE_RT_RT)==MSGTYPE_RT_RT)
		isRTtoRT = TRUE;
	if ((g_Frame.SelfMSG[g_RMsg.MsgId].MSGFormat & MSGTYPE_BRDCST)==MSGTYPE_BRDCST)
		isBroadCast = TRUE;

	cmd1 = g_RMsg.Msg.MSGBlock[0]; // Command Word 1
	rt1 = ::OwnRTAddr(cmd1);
	tr1 = ::OwnTR(cmd1);
	sa1 = ::OwnSubAddr(cmd1);
	wc1 = ::OwnWordCount(cmd1);
	mc1 = ::OwnModeCode(cmd1);

	if (isRTtoRT)
	{
		// RT-RT
		cmd2 = g_RMsg.Msg.MSGBlock[1];
		rt2 = ::OwnRTAddr(cmd2);
		tr2 = ::OwnTR(cmd2);
		sa2 = ::OwnSubAddr(cmd2);
		wc2 = ::OwnWordCount(cmd2);
		mc2 = ::OwnModeCode(cmd2);

		if (tr1==0) // RT1 is Rx or Tx ?
		{
			// RT1 is Rx // dest | To
			this->m_Grid.SetCol(3); // From
			if (rt2==31) // Broadcast
			{
				// data or mode code
				if ((sa2==0)||(sa2==31))
					sprintf(c, "RT(s),Mod(%d)", sa2); // mode code
				else
					sprintf(c, "RT(s),Sa%d", sa2); // data
			}
			else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -