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