📄 bcwnd.cpp
字号:
// 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 + -