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

📄 setcoordinatedlg.cpp

📁 在windows下对Flock of Bird 跟踪器编程的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_com.SetOutput(COleVariant("@"));

	
}

void CSetCoordinateDlg::OnCmdStopReceive() 
{
	// TODO: Add your control notification handler code here
	unsigned char outputmode = m_ctrlOptputMode.GetCurSel();

	if( outputmode == 2 )
		m_com.SetOutput(COleVariant("B"));
	if(bReceive)
		GetDlgItem(IDC_CMDSTOPRECEIVE)->SetWindowText("开始接收");
	else
		GetDlgItem(IDC_CMDSTOPRECEIVE)->SetWindowText("停止接收");

	bReceive = !bReceive;

	int a = (clock()-start)/CLOCKS_PER_SEC;

	int b=times/a;
}

BEGIN_EVENTSINK_MAP(CSetCoordinateDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CSetCoordinateDlg)
	ON_EVENT(CSetCoordinateDlg, IDC_MSCOMM, 1 /* OnComm */, OnCommMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CSetCoordinateDlg::OnCommMscomm() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	CString strtemp;
	short * pShort = rxdata;
	unsigned char * puc = (unsigned char * )pShort;
	
	if(bReceive)
	{
		if(m_com.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符
		{
			//读缓冲区
			variant_inp = m_com.GetInput();   
			
			//VARIANT型变量转换为ColeSafeArray型变量
			safearray_inp = variant_inp;       
			
			//得到有效数据长度
			len=safearray_inp.GetOneDimSize(); 
			
			for(k=0;k<len;k++)
				safearray_inp.GetElement(&k,(unsigned char * )pShort+k+count);
			
			count += len;
			
			if ( count < 2*fob_datasize ) return;
			
			for(k=0;k<count/2;k++)
			{
				*pShort++ = (short)((((short)(*(unsigned char *) pShort) & 0x7F) |
							(short)(*((unsigned char *) pShort+1)) << 7)) << 2;
			}
			
			/////////////////////////////////////////////////

			ConvertData();
			
			for(k=0;k<count/2;k++)             //将数组转换为Cstring型变量
			{
				strtemp.Format("%10.2f",floatdata[k]); //将字符送入临时变量strtemp存放
				
				m_strReceive = m_strReceive + strtemp;    //加入接收编辑框对应字符串
				
				if( k>6 && k%6 ==5 ) m_strReceive += "\r\n";
			}
			m_strReceive += "\r\n";
			times++;
		}
	}

	count = 0;

	UpdateData(FALSE);           //更新编辑框内容

}

void CSetCoordinateDlg::SetDataMode()
{

}

void CSetCoordinateDlg::SetOutputMode()
{

}

void CSetCoordinateDlg::SetCmdSize()
{
	unsigned char datamode;

	datamode = m_ctrlDataMode.GetCurSel();
	
	switch(datamode)
    {
	case 0:	//POS:
		fob_datasize = 3;
		fob_posorientcmd = 'V';
		break;
		
	case 1:	//ANGLE:
		fob_datasize = 3;
		fob_posorientcmd = 'W';
		break;
		
	case 2:	//MATRIX:
		fob_datasize = 9;
		fob_posorientcmd = 'X';
		break;
		
	case 3:	//QUATER:
		fob_datasize = 4;
		fob_posorientcmd = 92;
		break;
		
	case 4:	//POSANGLE:
		fob_datasize = 6;
		fob_posorientcmd = 'Y';
		break;
		
	case 5:	//POSMATRIX:
		fob_datasize = 12;
		fob_posorientcmd = 'Z';
		break;
		
	case 6:	//POSQUATER:
		fob_datasize = 7;
		fob_posorientcmd = ']';
		break;
		
    }
	
}

void CSetCoordinateDlg::ConvertData()
{
	unsigned char datamode;
	int k;
	float scale = 1;

	if( m_ctrlUint.GetCurSel() == 1 )
		scale = I_TO_MM;
	else if( m_ctrlUint.GetCurSel() == 2 )
		scale = I_TO_CM;
	else if( m_ctrlUint.GetCurSel() == 3 )
		scale = I_TO_CM * 0.01;

	datamode = m_ctrlDataMode.GetCurSel();
	
	switch(datamode)
    {
	case 0:	//POS:
		for (k=0;k<3;k++)
			floatdata[k] = (float) ( rxdata[k] * POSK36 * scale );
		break;
		
	case 1:	//ANGLE:
		for (k=0;k<3;k++)
			floatdata[k] = (float) ( rxdata[k] * ANGK );
		
		break;
		
	case 2:	//MATRIX:
		for (k=0;k<9;k++)
			floatdata[k] = (float) ( rxdata[k] * WTF);
		break;
		
	case 3:	//QUATER:
		for (k=0;k<4;k++)
			floatdata[k] = (float) ( rxdata[k] * WTF);
		break;
		
	case 4:	//POSANGLE:
		for (k=0;k<3;k++)
			floatdata[k] = (float) ( rxdata[k] * POSK36 * scale );
		
		for (k=3;k<6;k++)
			floatdata[k] = (float) ( rxdata[k] * ANGK );
		break;
		
	case 5:	//POSMATRIX:
		for (k=0;k<3;k++)
			floatdata[k] = (float) ( rxdata[k] * POSK36 * scale );
		
		for (k=3;k<12;k++)
			floatdata[k] = (float) ( rxdata[k] * WTF);
		break;
		
	case 6:	//POSQUATER:
		for (k=0;k<3;k++)
			floatdata[k] = (float) ( rxdata[k] * POSK36 * scale );
		
		for (k=3;k<7;k++)
			floatdata[k] = (float) ( rxdata[k] * WTF);
		break;
		
    }
}

void CSetCoordinateDlg::OnCmdClearReceive() 
{
	// TODO: Add your control notification handler code here
	m_strReceive.Empty();

	UpdateData(FALSE);
}

void CSetCoordinateDlg::OnCmdSetHemisphere() 
{
	// TODO: Add your control notification handler code here
	unsigned char	fc,		/* set XYZ character */
					sc;		/* set Sine character */
	CString			str;

	short index = m_ctrlHemisphere.GetCurSel();

	switch( index ) {
	
	case 0: /* Forward */
		fc = 0;		 sc = 0;       
			break;
			
	case 1: /* Aft */
		fc = 0;       sc = 1;
		break;
		
	case 2: /* Upper */
		fc = 0xc;     sc = 1;
		break;
		
	case 3: /* Lower */
		fc = 0xc;     sc = 0;  
		break;
		
	case 4: /* Left */
		fc = 6;       sc = 1;
		break;
		
	case 5: /* Right */
		fc = 6;       sc = 0;
		break;
	}

	str.Format( "L%c%c", fc, sc );

	m_com.SetOutput( COleVariant( str ) );

	
}



void CSetCoordinateDlg::OnCmdAngleAlign() 
{
	// TODO: Add your control notification handler code here
	short			i;                /* matrix pointer */
    unsigned char * cdataptr;        /* pointer to cdata */
    float			tempfloat;        /* temporary float value */
    float			angle[3];         /* angles input byte the user */
    static unsigned char cdata[] =   {'J',0,0,0,0,0,0,0,0,0,0,0,0,0}; /* cmd + 12 bytes */
	CString			str;
	
    UpdateData( TRUE );
		
	angle[0] = m_fAzimuth;	
	angle[1] = m_fElevation;
	angle[2] = m_fRoll;
    
	cdataptr = &cdata[1];

    for (i = 0; i < 3; i++)
    {
		/*	计算角sin	*/
		tempfloat = sin((double)(angle[i] * DTR));
		
		/*
		convert to a word and store in cdata
		NOTE: trap for sin(90)...since the bird
		can only accept data from -1.000 to 0.99996 (0x8000 to 0x7fff)
		*/
		if (tempfloat < 0.99998)
		{
			*cdataptr++ = (unsigned char) ((short) (tempfloat * FTW) & 0x0ff);
			*cdataptr++ = (unsigned char) (((short) (tempfloat * FTW) & 0x0ff00) >> 8);
		}
		else
		{
			*cdataptr++ = 0x0ff;
			*cdataptr++ = 0x07f;
		}
		
		/*	计算角cos	*/
		tempfloat = cos((double)(angle[i] * DTR));
		
		if (tempfloat < 0.99998)
		{
			*cdataptr++ = (unsigned char) ((short) (tempfloat * FTW) & 0x0ff);
			*cdataptr++ = (unsigned char) (((short) (tempfloat * FTW) & 0x0ff00) >> 8);
		}
		else
		{
			*cdataptr++ = 0x0ff;
			*cdataptr++ = 0x07f;
		}
    }
	
	m_com.SetOutput( COleVariant((LPCTSTR)cdata) );

    return;
}

void CSetCoordinateDlg::OnBtnInsertReferPoint() 
{
	// TODO: Add your control notification handler code here

	CString str;

//	if( fob_datamode==POS )
	int index = m_ctrlReferPoint.GetItemCount();

	m_ctrlReferPoint.InsertItem ( index, LPCTSTR ("1"), 0 );	//1为平面参考点
		
	for(int i=1; i<=6; i++)
	{
		str.Format("%.2f", floatdata[i-1]);
		m_ctrlReferPoint.SetItemText ( index, i, str );//第一列
	}
}

void CSetCoordinateDlg::OnBtnClearReferPoint() 
{
	// TODO: Add your control notification handler code here
	m_ctrlReferPoint.DeleteAllItems();
}

void CSetCoordinateDlg::OnBtnDeleteReferPoint() 
{
	// TODO: Add your control notification handler code here
	//m_ctrlReferPoint.
}

void CSetCoordinateDlg::OnBtnGetPlanePara() 
{
	// TODO: Add your control notification handler code here
	float	data[3][3];
	float	fpa, fpb, fpc, fpd;
	CString	str;

	for(int i=0; i<3; i++)
		for(int j=0; j<3; j++)
		{
			data[i][j] = atof( m_ctrlReferPoint.GetItemText( i, j+1 ) );
		}

	fpa = data[0][1]*(data[1][2]-data[2][2]) + data[1][1]*(data[2][2]-data[0][2]) + data[2][1]*(data[0][2]-data[1][2]);

	fpb = data[0][2]*(data[1][0]-data[2][0]) + data[1][2]*(data[2][0]-data[0][0]) + data[2][2]*(data[0][0]-data[1][0]);

	fpc = data[0][0]*(data[1][1]-data[2][1]) + data[1][0]*(data[2][1]-data[0][1]) + data[2][0]*(data[0][1]-data[1][1]);

	fpd = -1*data[0][0]*(data[1][1]*data[2][2]-data[2][1]*data[1][2]) - 
			 data[1][0]*(data[2][1]*data[0][2]-data[0][1]*data[2][2]) - 
			 data[2][0]*(data[0][1]*data[1][2]-data[1][1]*data[0][2]);

	str.Format("%.2f",fpa);
	SetDlgItemText( IDC_PLANARPARA_A, str );
	str.Format("%.2f",fpb);
	SetDlgItemText( IDC_PLANARPARA_B, str );
	str.Format("%.2f",fpc);
	SetDlgItemText( IDC_PLANARPARA_C, str );
	str.Format("%.2f",fpd);
	SetDlgItemText( IDC_PLANARPARA_D, str );

}

void CSetCoordinateDlg::OnBtnMetal() 
{
	// TODO: Add your control notification handler code here
		
	CString			str;
	
	short index = m_ctrlHemisphere.GetCurSel();
	
	
	
	str.Format( "s%c%c", fc, sc );
	
	m_com.SetOutput( COleVariant( str ) );
	
}

⌨️ 快捷键说明

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