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

📄 posview.cpp

📁 可以根据停车场的具体情况定义停车点的位置
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}


void CPosView::OnFixParam() 
{
	if(!m_bParamFixed)
	{
		m_bParamFixed=true;
		GetDlgItem(IDC_BUTTON2)->SetWindowText("拖拽模式");
	}
	else 
	{
		m_bParamFixed=false;
		GetDlgItem(IDC_BUTTON2)->SetWindowText("固定长宽");
	}
}

void CPosView::OnFinish() 
{
	m_bSetOver=true;

	CString strAppName; // section name
	CString strKeyName;  // key name
	CString strParam;   // string to add
	CString strFileName;  // initialization filename
	strFileName.Format("\\Position.ini");
	strParam.Format("%d",m_nPosTotal);
	WritePrivateProfileString("Pos Total Count","Count",strParam,strFileName);//将文件总数写入,以便读出. 
	for(int nI=0;nI<m_nPosTotal;nI++)
	{	
		strAppName.Format("position %d",nI);
		strKeyName.Format("m_nTopX");
		strParam.Format("%d",pos[nI]->GetTopX());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nTopY");
		strParam.Format("%d",pos[nI]->GetTopY());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nWidth");
		strParam.Format("%d",pos[nI]->GetWidth());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nLength");
		strParam.Format("%d",pos[nI]->GetLength());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nProbeNum");
		strParam.Format("%d",pos[nI]->GetProbeNum());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nScmNum");
		strParam.Format("%d",pos[nI]->GetScmNum());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nRegion");
		strParam.Format("%d",pos[nI]->GetRegion());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nFloor");
		strParam.Format("%d",pos[nI]->GetFloor());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nStatus");
		strParam.Format("%d",pos[nI]->GetStatus());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
		strKeyName.Format("m_nOrgStatus");
		strParam.Format("%d",pos[nI]->GetOrgStatus());
		WritePrivateProfileString(strAppName,strKeyName,strParam,strFileName);
	}
	AttachProb();
}

void CPosView::OnResetAll() 
{
	m_bSetOver=false;
	do
	{
		pos[(m_nPosTotal--)]=NULL;
	}while(m_nPosTotal>0);
	PostMessage(WM_PAINT,0,0);
}

bool CPosView::LoadPosition()
{	
	CString strAppName; // section name
	CString strKeyName;  // key name
	CString strParam;   // string to add
	CString strFileName;  // initialization filename
	strFileName.Format("\\Position.ini");
	int temp,nX,nY,nWidth,nLength;
	int nCount=::GetPrivateProfileInt("Pos Total Count","Count",0,strFileName);
	if(nCount==0)return false;
	m_nPosTotal=0;
	for(int nI=0;nI<nCount;nI++) 
	{	
		strAppName.Format("position %d",nI);
		strKeyName.Format("m_nTopX");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		nX=temp;
		strKeyName.Format("m_nTopY");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		nY=temp;
		strKeyName.Format("m_nWidth");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		nWidth=temp;
		strKeyName.Format("m_nLength");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		nLength=temp;
		CreatePos(nX,nY,nWidth,nLength);//获取位置参数,创建之
		strKeyName.Format("m_nProbeNum");//获取配置参数,配置之
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetProbeNum(temp);
		strKeyName.Format("m_nScmNum");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetScmNum(temp);
		strKeyName.Format("m_nRegion");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetRegion(temp);
		strKeyName.Format("m_nFloor");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetFloor(temp);
		strKeyName.Format("m_nStatus");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetStatus((POS_STATUS)temp);
		strKeyName.Format("m_nOrgStatus");
		temp=GetPrivateProfileInt(strAppName,strKeyName,10,strFileName);
		pos[nI]->SetOrgStatus((POS_STATUS)temp);
	}
	if(m_nPosTotal!=nCount)
	{
		MessageBox("Data Load error!");
		return false;
	}
	AttachProb();//MessageBox("ATTACHED");
	return true;
}

void CPosView::OnAddPos() 
{
	m_bSetOver=false;
}

bool CPosView::InitSerial()
{
	CString strAppName; // section name
	CString strKeyName;  // key name
	CString strParam;   // string to add
	CString strFileName;  // initialization filename
	strFileName.Format("SerialPort.ini");
	int nCount=::GetPrivateProfileInt("Param Item","Count",0,strFileName);
	if(nCount==0)return false;
	int flag=0;//串口使用标志
	for(int nI=1;nI<5;nI++)//搜索车库管理使用的串口号(1~4)
	{
		strAppName.Format("Com%d",nI);
		strKeyName.Format("Used Flag");
		flag=GetPrivateProfileInt(strAppName,strKeyName,200,strFileName);
		if(flag==100)break;
	}
	if(flag==100)
	{
		m_nCom=nI;
		strKeyName.Format("BaudRate");
		dcbConfig.BaudRate=GetPrivateProfileInt(strAppName,strKeyName,19200,strFileName);
		strKeyName.Format("fParity");
		dcbConfig.fParity=GetPrivateProfileInt(strAppName,strKeyName,0,strFileName);
		strKeyName.Format("StopBits");
		dcbConfig.StopBits=GetPrivateProfileInt(strAppName,strKeyName,1,strFileName);
		return true;	//找到串口配置
	}

	return false;//找不到合适的串口配置
}

/////////////////////////////////////////////////////////////////////////////////
//函数名DetectDataEnd()
//功能:检验串口数据的合法性
//参数:szData--串口数据,len--数据长度
BOOL CPosView::DetectDataEnd(BYTE szData[],DWORD len)
{
	//TRACE
	DWORD Length,Total,Parity;
	Parity=Length=Total=0;
	if(szData[0]>MAXSCM){MessageBox("错误的下位机号!");return false;}
	Length=szData[1]*256+szData[2];
	if(Length!=len||len>520){MessageBox("错误的数据长度!");return false;}
	for(DWORD nI=0;nI<len-4;nI++)Total+=szData[nI];
	Parity=szData[len-4]*256+szData[len-3];
	if(Total!=Parity){MessageBox("错误的校验和!");return false;}
	for(;len>0;len--)
	{
		if((szData[len-1]==(szData[len-1]&0xff))&&(szData[len]==(szData[len]&0x55)))
		{
			break;
		}
		if(len==1)
		{	
			MessageBox("未找到结束标志,数据查找错误!");
			return false;
		}
	}
	return true;
}

/////////////////////////////////////////////////////////////////////////////////
//函数名OnComMsg()
//功能:通过串口接受和发送数据并加以处理
//参数:wParam--消息类型,lParam--要发送的数据
void CPosView::OnComMsg(WPARAM wParam,LPARAM lParam)
{
	int len=1024;
	static BYTE szData[550];
	switch(wParam)
	{
	case MSG_READ:
		{
			if(serial.ReadData(szData,len))
			{
				len--;//去除接收结束标志“0”
				if(!DetectDataEnd(szData,len)) return;
				if(m_bComBlocked)MessageBox("数据报丢失,重新发送");
				BYTE scm=szData[0];
				m_bComBlocked=true;
				if(szData[3]==0xff)
				{
					InitProb(szData,len);
				}
				else
				{
					if(!m_ComMsg[scm].bInited)
					{
						MessageBox("缺少下位机初始化信息,请先对其初始化!");
						return;
					}
					for(WORD nY=0;nY<m_ComMsg[scm].probe_num;nY++)
						m_ComMsg[scm].probe_msg[nY]=szData[4+nY];
					MsgAnalysis(scm);
				}


				char temp[10];
				CString str;
				for(int nI=0;nI<len;nI++)
				{
					itoa((BYTE)(szData[nI]),temp,16);
					str=str+CString(temp)+" ";
				}
				m_bComBlocked=false;
				m_ComLog.WriteLog(str);
				m_msg="串口正常工作中........";
				UpdateData(false);
			}
		}
		break;
	case MSG_WRITE:
		{
			char *p=(char*)lParam;
			AfxMessageBox(CString(p));
		}
		break;
	default:
		{
		}
		break;
	}
}

void CPosView::OnScm() 
{
	CMsgDealDlg* pDlg=new CMsgDealDlg();
	pDlg->Create(IDD_MSGDEAL,this);
	pDlg->ShowWindow(SW_SHOW);
}


void CPosView::GrideOn(int Scale)
{
    CRect rect;
    GetDlgItem(IDC_MAP)->GetWindowRect(&rect);
	CClientDC MapDC(GetDlgItem(IDC_MAP));
	CPen Pen1,Pen2;
	Pen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
	Pen2.CreatePen(PS_SOLID,3,RGB(0,0,0));
//drwaing Gride
	MapDC.SelectObject(Pen1);
	for(int nI=0;nI<rect.right/Scale;nI++)
	{
		MapDC.MoveTo(nI*Scale,0);
		MapDC.LineTo(nI*Scale,rect.bottom);
	}
	for(nI=0;nI<rect.bottom/Scale;nI++)
	{
		MapDC.MoveTo(0,nI*Scale);
		MapDC.LineTo(rect.right,nI*Scale);
	}
}

void CPosView::OnGride() 
{
	// TODO: Add your control notification handler code here
	if(isGrideOn)isGrideOn=false;
	else isGrideOn=true;
	PostMessage(WM_PAINT);
}

void CPosView::MsgAnalysis(int scm)
{
	WORD ProbeIndex,PosIndex;
	for(WORD nI=0;nI<m_ComMsg[scm].probe_num;nI++)
	{
		ProbeIndex=m_ComMsg[scm].probe[nI];//探头号=探头索引号
		PosIndex=m_ComMsg[scm].posindex[ProbeIndex];		   //找到车位索引值
		if(PosIndex==0x0ffff)continue;
		switch(m_ComMsg[scm].probe_msg[nI])
		{
		case 0:
			break;
		case 1:		//0,1 在初始化中处理,此处不予理会
			break;
		case 2:
			pos[PosIndex]->SetStatus(pos[PosIndex]->GetOrgStatus());
			break;
		case 3:
			pos[PosIndex]->SetStatus(PS_OCCUPIED);
			break;
		case 6:
			pos[PosIndex]->SetStatus(PS_NORMAL);
			break;
		case 7:
			pos[PosIndex]->SetStatus(PS_FAILTOINIT);
			break;
		default:
			MessageBox("error!");
			pos[PosIndex]->SetStatus(PS_UNKNOWN);			
		}
		pos[PosIndex]->Display();
	}

}

////////////////////////////////////////////////////////////
//函数名:AttachProb()
//功能:建立车位与探头的关联
//注意:必须在InitProb()之前使用
//参数:scm--下位机号
void CPosView::AttachProb()
{
	//if(scm>MAXSCM)return;				//最多50个下位机
	for(WORD nI=0;nI<m_nPosTotal;nI++)//在所有车位中搜索对应的探头关联		
	{
		WORD posScm=pos[nI]->GetScmNum();
		WORD posProb=pos[nI]->GetProbeNum();
		m_ComMsg[posScm].posindex[posProb]=nI;
		//给每个下位机都留256个探头位置,有就以车位索引填充,没有就填充0xFFFF	
	}
}

void CPosView::InitProb(BYTE szData[],DWORD len)
{
	CString str;
	WORD nScm=szData[0];
	WORD nPbnum=(len-8)/2;
	m_ComMsg[nScm].scm=nScm;
	m_ComMsg[nScm].probe_num=nPbnum;
	for(WORD nI=0;nI<m_ComMsg[nScm].probe_num;nI++)
	{
		m_ComMsg[nScm].probe[nI]=szData[4+nI];// nI是索引,不是探头号,总是从第0位编起
		m_ComMsg[nScm].probe_msg[nI]=szData[4+m_ComMsg[nScm].probe_num+nI];

		WORD Index=m_ComMsg[nScm].posindex[nI];
		if(Index==0xffff)
		{
			str.Format("%d-%d 号探头没有设定相关车位,请核实!",nScm,m_ComMsg[nScm].probe[nI]);
			m_PosLog.WriteLog(str);
			continue;
		}
		//初始化探头对应的车位状态
		switch(m_ComMsg[nScm].probe_msg[nI])
		{
		case 0:
			str.Format("%d 号探头--对应%d号车位未能正常初始化,请核实!",m_ComMsg[nScm].probe[nI],Index);	
			break;
		case 1:
			str.Format("%d-%d 号探头--对应%d号车位正常初始化!",nScm,m_ComMsg[nScm].probe[nI],Index);		
			break;
		default:
			MessageBox("未知命令");
		}
		m_PosLog.WriteLog(str);
	}
	m_ComMsg[nScm].bInited=true;
}

⌨️ 快捷键说明

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