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

📄 yuntaidlg.cpp

📁 云台控制的工具
💻 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 + -