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