visionview.cpp

来自「FIRA 3对3 机器人足球PC端控制程序。」· C++ 代码 · 共 2,092 行 · 第 1/5 页

CPP
2,092
字号
				// Resize frame to the dimensions of the multimedia window
   				GetParent()->CalcWindowRect(&MMRect);
   				MMRect.OffsetRect(-MMRect.left,-MMRect.top);
				
 				GetParent()->SetWindowPos(&wndTopMost, 0, 0, 
   	                             	  MMRect.right+PosOffset,
   	                             	  MMRect.bottom+PosOffset, 
   	                             	  SWP_NOACTIVATE|SWP_NOMOVE);
				
   				GetParent()->InvalidateRect(NULL,FALSE);

				MgraFont(M_DEFAULT, M_FONT_DEFAULT_LARGE);
				MgraColor(M_DEFAULT, M_RGB888(255, 255, 0));
				MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-250, DispSizeY/2-75, "Welcome to YUJIN Robot Soccer!");
				MgraFont(M_DEFAULT, M_FONT_DEFAULT_MEDIUM);
				MgraColor(M_DEFAULT, M_RGB888(0, 0, 255));
			    MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-150, DispSizeY/2+15, "Load VXD.");
		
   			}
			
		}
	}
	///////////////////////////////////////////////////////////////////////////////////
	// MIL: Code that will be executed when a view is first attached to the document //
	///////////////////////////////////////////////////////////////////////////////////


	////////////////////////////////
	// initialization by defaults //
	////////////////////////////////
	rectBoundary = CRect(0, 0, DispSizeX-1, DispSizeY-1);
	bFlagIsOurHomeLeft = TRUE;
	m_bFlagFindBall = TRUE;
	m_bFlagFindHgoalie = TRUE;
	m_bFlagFindHome1 = TRUE;
	m_bFlagFindHome2 = TRUE;
	m_bFlagFindHome3 = TRUE;
	m_bFlagFindHome4 = TRUE;
	m_bFlagFindOpponent1 = TRUE;
	m_bFlagFindOpponent2 = TRUE;
	m_bFlagFindOpponent3 = TRUE;
	m_bFlagFindOpponent4 = TRUE;
	m_bFlagFindOpponent5 = TRUE;
	bFlagFindBall = TRUE;
	bFlagFindHomeRobot[HOME1] = TRUE;
	bFlagFindHomeRobot[HOME2] = TRUE;
//	bFlagFindHomeRobot[HOME3] = TRUE;
//	bFlagFindHomeRobot[HOME4] = TRUE;
	bFlagFindHomeRobot[HGOALIE] = TRUE;
	bFlagFindOpponent[OPP1] = TRUE;
	bFlagFindOpponent[OPP2] = TRUE;
	bFlagFindOpponent[OPP3] = TRUE;
//	bFlagFindOpponent[OPP4] = TRUE;
//	bFlagFindOpponent[OPP5] = TRUE;
	bFlagBallFound = FALSE;
	bFlagHomeRobotFound[HOME1] = FALSE;
	bFlagHomeRobotFound[HOME2] = FALSE;
//	bFlagHomeRobotFound[HOME3] = FALSE;
//	bFlagHomeRobotFound[HOME4] = FALSE;
	bFlagHomeRobotFound[HGOALIE] = FALSE;
	bFlagOpponentFound[OPP1] = FALSE;
	bFlagOpponentFound[OPP2] = FALSE;
	bFlagOpponentFound[OPP3] = FALSE;
//	bFlagOpponentFound[OPP4] = FALSE;
//	bFlagOpponentFound[OPP5] = FALSE;

/////////////////////////////////////////////////
// Choi.W.H  2000.02.22
	lNFindMiss[BALL] = 0;
	lNFindMiss[HOME1] = 0;
	lNFindMiss[HOME2] = 0;
	lNFindMiss[HGOALIE] = 0;
// Choi.W.H  2000.02.22
//////////////////////////////////////////////////////

	LowerBoundOfBigTeamSize = DEF_LBOUND_BIG_TEAM_SIZE;
	UpperBoundOfBigTeamSize = DEF_UBOUND_BIG_TEAM_SIZE;
	LowerBoundOfSmallIDSize = DEF_LBOUND_SMALL_ID_SIZE;
	UpperBoundOfSmallIDSize = DEF_UBOUND_SMALL_ID_SIZE;
	LowerBoundOfBallSize = DEF_LBOUND_BALL_SIZE;
	UpperBoundOfBallSize = DEF_UBOUND_BALL_SIZE;
	LowerBoundOfOpponentSize = DEF_LBOUND_OPPONENT_SIZE;
	UpperBoundOfOpponentSize = DEF_UBOUND_OPPONENT_SIZE;

/////////////////////////////////////////////////
// Choi.W.H  2000.02.24
	DistanceBetweenBigTeamAndSmallID = (short)(sqrt(2.) * DEF_SIZE_X_ROBOT);
	//DistanceBetweenBigTeamAndSmallID = (short)(sqrt(2)/2. * DEF_SIZE_X_ROBOT);	
// Choi.W.H  2000.02.24
//////////////////////////////////////////////////////	
	for(i=0;i<6;i++){
		BallColor[i] = 0;
		TeamColor[i] = 0;
		IdColor[0][i] = 0;
		IdColor[1][i] = 0;
		IdColor[2][i] = 0;
		OpponentColor[i] = 0;
	}
	////////////////////////////////
	// initialization by defaults //
	////////////////////////////////
		
	// Serial port initialization
	m_bPort1=TRUE;
	m_pComm.SetComPort(1,19200,8,0,0);
	m_pComm.CreateCommInfo();
	m_pComm.OpenComPort();
	m_nGame = 0;
	m_nSetting = 5;
//	m_nTest = FALSE;
//	Parade_Start = false;   // 欺饭捞靛 檬扁 厚劝己拳  daewone
	
	//by kui hong
	
	
	// Determine initial title of mainframe window
	GetParentFrame()->SetWindowText("Supervisor Program of YUJIN Robot Soccer System");

	// Disable all command button except "Load VXD" button
	GetDlgItem(IDC_READY_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_START_GAME_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP_GAME_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_BOUNDARY)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_COLOR)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_PIXEL_SIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_ROBOT_SIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_CHANGE_COLOR)->EnableWindow(FALSE);
	GetDlgItem(IDC_LOAD_CONFIGURATION)->EnableWindow(FALSE);
	GetDlgItem(IDC_SAVE_CONFIGURATION)->EnableWindow(FALSE);
	GetDlgItem(IDC_CONTINUOUS_GRAB_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_BALL_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME1_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME2_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME3_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME4_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HGOALIE_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO1_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO2_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO3_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO4_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO5_RADIO)->EnableWindow(FALSE);
	
//	GetDlgItem(IDC_PARADE_INIT)->EnableWindow(FALSE);
//	GetDlgItem(IDC_PARADE_START)->EnableWindow(FALSE);
//	GetDlgItem(IDC_PARADE_STOP)->EnableWindow(FALSE);

	// Get the position of client window on screen		
	GetWndPos();
	
	UpdateData(FALSE);
		
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 弊贰滚狼 叼胶敲饭捞 汲沥 力芭, 皋葛府 立辟 靛扼捞滚 摧扁
// --------------------------------------------------------
BOOL CVisionView::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class

	// Halt continuous grab and remove MilDisplay
	RemoveFromDisplay();

	// Close TViCH32
	//HW32 = CloseTVicHW32(HW32);
	if (m_primary_surface) m_primary_surface->Release();
	if (m_dd_obj) m_dd_obj->Release();


	return CFormView::DestroyWindow();
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 
// --------------------------------------------------------
void CVisionView::RemoveFromDisplay()
{
   	// Halt grab if in process in THIS view
	MdigHalt(MilDigitizerId);
	// Deselect the buffer from it's display object and given window 
  	if (MilImageBufferId && MilDisplayId)
		MdispDeselect(MilDisplayId, MilImageBufferId);
	// Free the display
	if (MilDisplayId) 
		MdispFree(MilDisplayId);
	MilDisplayId = M_NULL;
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 漠扼 汲沥 劝己
// --------------------------------------------------------
void CVisionView::OnSetColor() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	bSetColor = TRUE;
	bSetRobotSize = FALSE;
	

}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 版扁厘 版拌 汲沥窍扁; SetBoundary 措拳芒 剁快扁
// --------------------------------------------------------
void CVisionView::OnSetBoundary() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	ptrSetBoundary->rect.top = rectBoundary.top;
	ptrSetBoundary->rect.left = rectBoundary.left;
	ptrSetBoundary->rect.bottom = rectBoundary.bottom;
	ptrSetBoundary->rect.right = rectBoundary.right;
	ptrSetBoundary->DispSizeX = DispSizeX;
	ptrSetBoundary->DispSizeY = DispSizeY;
	ptrSetBoundary->MilDisplayId = MilDisplayId;
					
	if(ptrSetBoundary->DoModal() == IDOK){
		rectBoundary.top = ptrSetBoundary->rect.top;
		rectBoundary.left = ptrSetBoundary->rect.left;
		rectBoundary.bottom = ptrSetBoundary->rect.bottom;
		rectBoundary.right = ptrSetBoundary->rect.right;
	}
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : cfg 颇老肺 何磐 祸裹困, 拱眉 茫扁 咯何, 版扁厘 康开 蔼 佬扁 
// --------------------------------------------------------
void CVisionView::OnLoadConfiguration() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	MdigHalt(MilDigitizerId);
	

	FILE *fp; 
	long	i;
	
	CFileDialog FileDlg(TRUE, "cfg", "default", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"CFG files(*.cfg)|*.cfg|All files(*.*)|*.*||", this);
	
	if(FileDlg.DoModal() == IDOK)
	{                                 
		if((fp = fopen((const char *)FileDlg.GetPathName(), "r")) == NULL)
			MessageBox("File Open Error");
		else {

			MgraColor(M_DEFAULT, M_RGB888(0, 0, 0));
			MgraClear(M_DEFAULT, MilImageBufferId);
			MgraFont(M_DEFAULT, M_FONT_DEFAULT_LARGE);
			MgraColor(M_DEFAULT, M_RGB888(255, 0, 255));
			MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-200, DispSizeY/2-45, "Loading New Configuration ...");
			MgraFont(M_DEFAULT, M_FONT_DEFAULT);
			MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-200, DispSizeY/2+10, "Wait a moment.");
	
        	fscanf(fp, "%d", &rectBoundary.top);
			fscanf(fp, "%d", &rectBoundary.left);
			fscanf(fp, "%d", &rectBoundary.bottom);
			fscanf(fp, "%d", &rectBoundary.right);   

			fscanf(fp, "%d",&LowerBoundOfBallSize);
			fscanf(fp, "%d",&UpperBoundOfBallSize);
			fscanf(fp, "%d",&LowerBoundOfBigTeamSize);
			fscanf(fp, "%d",&UpperBoundOfBigTeamSize);
			fscanf(fp, "%d",&LowerBoundOfSmallIDSize);
			fscanf(fp, "%d",&UpperBoundOfSmallIDSize);
			fscanf(fp, "%d",&LowerBoundOfOpponentSize);
			fscanf(fp, "%d",&UpperBoundOfOpponentSize);
			fscanf(fp, "%d",&DistanceBetweenBigTeamAndSmallID);
		        
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &BallColor[i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &TeamColor[i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &IdColor[0][i]);			
/////////////////////////////////////////////////
// Choi.W.H  2000.02.18 
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &IdColor[1][i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &IdColor[2][i]);			
// Choi.W.H  2000.02.18
////////////////////////////////////////////////
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &OpponentColor[i]);			
		
			fscanf(fp, "%d", &m_bFlagFindBall);     
			fscanf(fp, "%d", &m_bFlagFindHome1);     
			fscanf(fp, "%d", &m_bFlagFindHome2);     
//			fscanf(fp, "%d", &m_bFlagFindHome3);     
//			fscanf(fp, "%d", &m_bFlagFindHome4);     
			fscanf(fp, "%d", &m_bFlagFindHgoalie);     
			fscanf(fp, "%d", &m_bFlagFindOpponent1);     
			fscanf(fp, "%d", &m_bFlagFindOpponent2);     
			fscanf(fp, "%d", &m_bFlagFindOpponent3);     
//			fscanf(fp, "%d", &m_bFlagFindOpponent4);     
//			fscanf(fp, "%d", &m_bFlagFindOpponent5);     
		 
			bFlagFindBall = m_bFlagFindBall;
			bFlagFindHomeRobot[HOME1] = m_bFlagFindHome1;
			bFlagFindHomeRobot[HOME2] = m_bFlagFindHome2;
//			bFlagFindHomeRobot[HOME3] = m_bFlagFindHome3;
//			bFlagFindHomeRobot[HOME4] = m_bFlagFindHome4;
			bFlagFindHomeRobot[HGOALIE] = m_bFlagFindHgoalie;
			bFlagFindOpponent[OPP1] = m_bFlagFindOpponent1;
			bFlagFindOpponent[OPP2] = m_bFlagFindOpponent2;
			bFlagFindOpponent[OPP3] = m_bFlagFindOpponent3;
//			bFlagFindOpponent[OPP4] = m_bFlagFindOpponent4;
//			bFlagFindOpponent[OPP5] = m_bFlagFindOpponent5;

//  DW BAEK Neo Robot 
		fscanf(fp, "%d", &Ref_Hue);
		fscanf(fp, "%d", &Ref_Saturation);
		fscanf(fp, "%d", &Ref_Contrast);
		fscanf(fp, "%d", &Ref_Brightness);
        ColorParameter[0] = Ref_Hue;
		ColorParameter[1] = Ref_Saturation;
		ColorParameter[2] = Ref_Contrast;
		ColorParameter[3] = Ref_Brightness;
// neorobot 

			UpdateLUTAllColor();

			fscanf(fp, "%d", &bFlagIsOurHomeLeft);
			
		}
		fclose(fp);	
	}
	
    MdigReference(MilDigitizerId, M_HUE_REF, ColorParameter[0]);
    MdigReference(MilDigitizerId, M_SATURATION_REF, ColorParameter[1]);
	MdigReference(MilDigitizerId, M_CONTRAST_REF, ColorParameter[2]);
	MdigReference(MilDigitizerId, M_BRIGHTNESS_REF, ColorParameter[3]);

	UpdateData(FALSE);     

	MdigGrabContinuous(MilDigitizerId, MilImageBufferId);

	Invalidate();
		
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 漂沥 祸狼 RGB甫 YUV肺 函券窍咯 lookup table 盎脚窍扁
// --------------------------------------------------------
void CVisionView::UpdateLUTcolor(short *ptrNewColor, const int Color) 
{
	int r, g, b, y, u, v, Ly, Uy, Lu, Uu, Lv, Uv;
			
	Ly = *ptrNewColor;
	Uy = *(ptrNewColor+1);
	Lu = *(ptrNewColor+2);
	Uu = *(ptrNewColor+3);
	Lv = *(ptrNewColor+4);
	Uv = *(ptrNewColor+5);

	for(r=0;r<256;r++)
		for(g=0;g<256;g++)
			for(b=0;b<256;b++) {
				index_lut = ((r<<16) + (g<<8) + b);
				if(LUTcolor[index_lut] == Color)
					LUTcolor[index_lut] = NONE_COLOR;

				y = (int)(299*r + 587*g + 114*b);
				y = min(255000,max(y,0));
				u = (int)(565*(1000*b-y) + 128000000)/1000000;
				u = min(255,max(u,0));
				v = (int)(713*(1000*r-y) + 128000000)/1000000;
				v = min(255,max(v,0));
				y /= 1000;
				
				if(y >= Ly && y <= Uy && u >= Lu && u <= Uu && v >= Lv && v <= Uv) 
					LUTcolor[index_lut] = Color;
			}
}


// --------------------------------------------------------
// Param  : none
// Return : none
// Remark : 葛电 祸狼 RGB甫 YUV肺 函券窍咯 lookup table 盎脚窍扁
// --------------------------------------------------------
void CVisionView::UpdateLUTAllColor() 
{
	int r, g, b, y, u, v;
		
	for(r=0;r<256;r++)
		for(g=0;g<256;g++)
			for(b=0;b<256;b++) {

⌨️ 快捷键说明

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