📄 yuntaidlg.cpp
字号:
// YunTaiDlg.cpp : implementation file
//
#include "stdafx.h"
#include "YunTai.h"
#include "YunTaiDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CYunTaiDlg dialog
CYunTaiDlg::CYunTaiDlg(CWnd* pParent /*=NULL*/)
: CDialog(CYunTaiDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CYunTaiDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bAuto = FALSE;
}
void CYunTaiDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CYunTaiDlg)
DDX_Control(pDX, IDC_COM, m_ctlCom);
//}}AFX_DATA_MAP
int ctrl_id[CONTROLLER_COUNT] = {
IDC_APERTURE_ZOOM_IN, IDC_APERTURE_ZOOM_OUT,
IDC_FOCUS_ZOOM_IN, IDC_FOCUS_ZOOM_OUT,
IDC_MULTIPLE_ZOOM_IN, IDC_MULTIPLE_ZOOM_OUT,
IDC_LEFT_UP, IDC_UP, IDC_RIGHT_UP,
IDC_LEFT, IDC_AUTO, IDC_RIGHT,
IDC_LEFT_DOWN, IDC_DOWN, IDC_RIGHT_DOWN,
};
for( int i = 0; i < CONTROLLER_COUNT; i++ )
DDX_Control(pDX, ctrl_id[i], m_btnControl[i]);
}
BEGIN_MESSAGE_MAP(CYunTaiDlg, CDialog)
//{{AFX_MSG_MAP(CYunTaiDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_CBN_SELCHANGE(IDC_COM, OnSelChangeCom)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ACTION_START, OnActionStart)
ON_MESSAGE(WM_ACTION_END, OnActionEnd)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CYunTaiDlg message handlers
static BOOL GetYTDevice(DWORD iDevice, LPYTDEVINFO lpYtDevInfo)
{
// 型号为active
ASSERT( iDevice == 0 || iDevice == 1 );
_tcscpy( lpYtDevInfo->szDeviceName, _T("yuntai-active") );
lpYtDevInfo->bDefaultReceiver = TRUE; // 默认的接收机
lpYtDevInfo->wCommPort = (int)iDevice+1; // 串口1/2
lpYtDevInfo->dwCommBaudRate = 2400; // 波特率2400
lpYtDevInfo->wCommDataBits = 8; // 数据位8位
lpYtDevInfo->wCommParity = NoParity; // 无奇偶校验
lpYtDevInfo->wCommStopBits = OneStopBit; // 停止位1位
return TRUE;
}
BOOL CYunTaiDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_ctlCom.SetCurSel(0);
OnSelChangeCom();
return TRUE; // return TRUE unless you set the focus to a control
}
void CYunTaiDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CYunTaiDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CYunTaiDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//*****************************************************************************
//
//*****************************************************************************
void CYunTaiDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO:
}
#pragma warning( disable : 4305 4309 )
const char cmd_buf[][7] =
{
//FF 01 00 08 00 31 3A,上
{0xFF, 0x01, 0x00, 0x08, 0x00, 0x31, 0x3A},
//FF 01 00 10 00 31 42,下
{0xFF, 0x01, 0x00, 0x10, 0x00, 0x31, 0x42},
//FF 01 00 04 31 00 36,左
{0xFF, 0x01, 0x00, 0x04, 0x31, 0x00, 0x36},
//FF 01 00 02 31 00 34,右
{0xFF, 0x01, 0x00, 0x02, 0x31, 0x00, 0x34},
//FF 01 00 0C 31 31 6F,左上
{0xFF, 0x01, 0x00, 0x0C, 0x31, 0x31, 0x6F},
//FF 01 00 0A 31 31 6D,右上
{0xFF, 0x01, 0x00, 0x0A, 0x31, 0x31, 0x6D},
//FF 01 00 14 31 31 77,左下
{0xFF, 0x01, 0x00, 0x14, 0x31, 0x31, 0x77},
//FF 01 00 12 31 31 75,右下
{0xFF, 0x01, 0x00, 0x12, 0x31, 0x31, 0x75},
//FF 01 90 00 31 31 F3,自动
{0xFF, 0x01, 0x90, 0x00, 0x31, 0x31, 0xF3},
//FF 01 00 40 00 00 41,变倍+
{0xFF, 0x01, 0x00, 0x40, 0x00, 0x00, 0x41},
//FF 01 00 20 00 00 21,变倍-
{0xFF, 0x01, 0x00, 0x20, 0x00, 0x00, 0x21},
//FF 01 01 00 00 00 02,焦距+
{0xFF, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02},
//FF 01 00 80 00 00 81,焦距-
{0xFF, 0x01, 0x00, 0x80, 0x00, 0x00, 0x81},
//FF 01 02 00 00 00 03,光圈+
{0xFF, 0x01, 0x02, 0x00, 0x00, 0x00, 0x03},
//FF 01 04 00 00 00 05,光圈-
{0xFF, 0x01, 0x04, 0x00, 0x00, 0x00, 0x05},
//FF 01 00 00 00 00 01,结束
{0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01},
};
// 开始动作
void CYunTaiDlg::OnActionStart(WPARAM id, LPARAM)
{
// TRACE( _T("start, id = %d\n"), id );
switch( id )
{
case IDC_APERTURE_ZOOM_IN:
m_oYtPort.Write( cmd_buf[CMD_APERTURE_ZOOM_IN], 7 );
break;
case IDC_APERTURE_ZOOM_OUT:
m_oYtPort.Write( cmd_buf[CMD_APERTURE_ZOOM_OUT], 7 );
break;
case IDC_FOCUS_ZOOM_IN:
m_oYtPort.Write( cmd_buf[CMD_FOCUS_ZOOM_IN], 7 );
break;
case IDC_FOCUS_ZOOM_OUT:
m_oYtPort.Write( cmd_buf[CMD_FOCUS_ZOOM_OUT], 7 );
break;
case IDC_MULTIPLE_ZOOM_IN:
m_oYtPort.Write( cmd_buf[CMD_MULTIPLE_ZOOM_IN], 7 );
break;
case IDC_MULTIPLE_ZOOM_OUT:
m_oYtPort.Write( cmd_buf[CMD_MULTIPLE_ZOOM_OUT], 7 );
break;
case IDC_LEFT_UP:
m_oYtPort.Write( cmd_buf[CMD_LEFT_UP], 7 );
break;
case IDC_UP:
m_oYtPort.Write( cmd_buf[CMD_UP], 7 );
break;
case IDC_RIGHT_UP:
m_oYtPort.Write( cmd_buf[CMD_RIGHT_UP], 7 );
break;
case IDC_LEFT:
m_oYtPort.Write( cmd_buf[CMD_LEFT], 7 );
break;
case IDC_AUTO:
// 手动->自动(扫描)
if( !m_bAuto )
{
m_oYtPort.Write( cmd_buf[CMD_AUTO], 7 );
m_bAuto = TRUE;
}
// 自动->手动
else
{
m_oYtPort.Write( cmd_buf[CMD_STOP], 7 );
m_bAuto = FALSE;
}
break;
case IDC_RIGHT:
m_oYtPort.Write( cmd_buf[CMD_RIGHT], 7 );
break;
case IDC_LEFT_DOWN:
m_oYtPort.Write( cmd_buf[CMD_LEFT_DOWN], 7 );
break;
case IDC_DOWN:
m_oYtPort.Write( cmd_buf[CMD_DOWN], 7 );
break;
case IDC_RIGHT_DOWN:
m_oYtPort.Write( cmd_buf[CMD_RIGHT_DOWN], 7 );
break;
default:
break;
}
}
// 结束动作
void CYunTaiDlg::OnActionEnd(WPARAM id, LPARAM)
{
// TRACE( _T("end\n") );
if( id != IDC_AUTO )
m_oYtPort.Write( cmd_buf[CMD_STOP], 7 );
}
void CYunTaiDlg::OnSelChangeCom()
{
// TODO:
int sel = m_ctlCom.GetCurSel();
YTDEVINFO devInfo;
GetYTDevice( sel, &devInfo );
// 打开串口1
try
{
// 先关闭再打开
m_oYtPort.Close();
m_oYtPort.Open( devInfo.wCommPort, // 端口号
devInfo.dwCommBaudRate, // 波特率
(Parity) devInfo.wCommParity, // 奇偶校验位
(BYTE) devInfo.wCommDataBits, // 数据位
(StopBits) devInfo.wCommStopBits // 停止位
); // 不支持重叠操作
// 设置超时
COMMTIMEOUTS cts;
ZeroMemory( &cts, sizeof(COMMTIMEOUTS) );
// 立即返回
cts.ReadIntervalTimeout = 0;
m_oYtPort.SetTimeouts( cts );
}
catch(CSerialException* pEx)
{
TRACE(pEx->GetErrorMessage());
// 必须使用 pEx->Delete(); 而不是 delete pEx;
pEx->Delete();
AfxMessageBox( _T("端口被占用或不存在!") );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -