📄 elevatordlg.cpp
字号:
GetDlgItem(IDC_BTN_PSG_LEAVE)->EnableWindow(TRUE);
enableRelateBtn(m_eCurState,m_iCurFloor);
SetTimer(2,DOOR_OPEN_TIME*1000,NULL);//开启开门超时计时时钟
}
/*####################################################################
// name: closeDoor
// input1:
// ouput: void
// 功能描述: 电梯箱体关门
// 开发作者: 漫步阳光
// 开发时间: @2005.11
// 版本说明: v1.0
####################################################################*/
void CElevatorDlg::closeDoor() {
//KillTimer(2);
//m_eCurState = m_eOldState; //恢复电梯运行方向
//m_conState.SetWindowText("门关");
//到头后自动换向
if(m_eCurState==UP_PAUSE && m_iCurFloor==FLOOR_NUM) m_eCurState =DOWN_PAUSE;
if(m_eCurState==DOWN_PAUSE && m_iCurFloor==1) m_eCurState =UP_PAUSE;
GetDlgItem(IDC_BTN_CLOSE_DOOR)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_PSG_ENTER)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_PSG_LEAVE)->EnableWindow(FALSE);
//前往下一楼层
gotoNextDest();
}
/*####################################################################
// name: gotoNextDest
// input1:
// ouput: void
// 功能描述: 关门后去往下一个楼层
// 开发作者: 漫步阳光
// 开发时间: @2005.11
// 版本说明: v1.0
####################################################################*/
void CElevatorDlg::gotoNextDest() {
if(m_eCurState==UP_PAUSE)
{
if((m_iNextDestFloor = m_cUpWaitQueue->getNextAvail())==-1)//上行队列空,调整方向
{
if(m_iCurPassengerNum>0) //如果无请求但有乘客则进入暂停状态
{
//m_conState.SetWindowText("上行暂停");
}else{
m_eCurState =IDLE;
//m_conState.SetWindowText("空闲");
Write2Log("空闲");//记录日志
}
}else{m_eCurState =UP_RUN;}
}
else if(m_eCurState==DOWN_PAUSE)
{
if((m_iNextDestFloor = m_cDownWaitQueue->getNextAvail())==-1)//下行队列空,调整方向
{
if(m_iCurPassengerNum>0) //如果无请求但有乘客则进入暂停状态
{
//m_conState.SetWindowText("下行暂停");
}else{
m_eCurState =IDLE;
//m_conState.SetWindowText("空闲");
Write2Log("空闲");//记录日志
}
}else{m_eCurState =DOWN_RUN;}
}
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
//如果找到了下一个请求
if(m_iNextDestFloor >0) SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
}
/*####################################################################
// name: OnInnerBtnClk
// input1: UINT curBtn
// ouput: void
// 功能描述: 响应电梯内按钮的动作
// 开发作者: 漫步阳光
// 开发时间: @2005.11
// 版本说明: v1.0
####################################################################*/
void CElevatorDlg::OnInnerBtnClk(UINT curBtn)
{
if(m_iCurPassengerNum==0)
{
AfxMessageBox("请先按右边楼层按钮请求电梯。");
return;
}
if(isMalFunction())
{
AfxMessageBox("本电梯故障。");
return;
}
int iReqFloor = curBtn-900+1;
if((m_eCurState==UP_RUN && iReqFloor<=m_iCurFloor) || \
(m_eCurState==UP_PAUSE && iReqFloor<m_iCurFloor))
{
AfxMessageBox("您的请求跟电梯当前运行方向不一致。");
return;
}else if((m_eCurState==DOWN_RUN && iReqFloor>=m_iCurFloor) || \
(m_eCurState==DOWN_PAUSE && iReqFloor>m_iCurFloor))
{
AfxMessageBox("您的请求跟电梯当前运行方向不一致。");
return;
}
//如果刚好电梯所停楼层有请求,则直接开门
if((m_eCurState==UP_PAUSE || m_eCurState==DOWN_PAUSE) && (iReqFloor==m_iCurFloor))
{
if(m_eCurState==UP_PAUSE) m_eCurState = UP_RUN;
else m_eCurState = DOWN_RUN;
buzz();
openDoor();
return;
}
switch(m_eCurState)
{
case UP_PAUSE:
m_iNextDestFloor = m_cUpWaitQueue->getNextAvail();
if(m_iNextDestFloor==-1 || iReqFloor<m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cUpWaitQueue->addElement(iReqFloor);
m_eCurState =UP_RUN;
//m_conState.SetWindowText("上行");
KillTimer(1);
SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
break;
case DOWN_PAUSE:
m_iNextDestFloor = m_cDownWaitQueue->getNextAvail();
if(m_iNextDestFloor==-1 || iReqFloor>m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cDownWaitQueue->addElement(iReqFloor);
m_eCurState =DOWN_RUN;
//m_conState.SetWindowText("下行");
KillTimer(1);
SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
break;
case UP_RUN:
if(iReqFloor<m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cUpWaitQueue->addElement(iReqFloor);
break;
case DOWN_RUN:
if(iReqFloor>m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cDownWaitQueue->addElement(iReqFloor);
break;
}
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
GetDlgItem(IDC_MYBUTTONS+iReqFloor-1)->EnableWindow(FALSE);
}
void CElevatorDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
for(int i=0;i<FLOOR_NUM;i++)
{
delete m_pButton[i];
delete m_pLabel[i];
}
/*
delete[] m_pButton;
delete[] m_pLabel;
delete[] stateDespArr;
*/
try{
m_cLogFile.Close();
}catch(CException* e){}
KillTimer(1);KillTimer(2);
}
void CElevatorDlg::OnBtnCreateFault()
{
// TODO: Add your control notification handler code here
if(m_eCurState==UP_RUN || m_eCurState==DOWN_RUN)
{
AfxMessageBox("电梯正在运行中,不允许出现故障!");
return;
}
if(m_iCurPassengerNum > 0)
{
AfxMessageBox("电梯当前有乘客,不允许出现故障!");
return;
}
m_eOldState = m_eCurState;
m_eCurState =MAL_FUNCTION;
GetDlgItem(IDC_BTN_CREATE_FAULT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_CORRECT_FAULT)->EnableWindow(TRUE);
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
Write2Log("产生故障!");//记录日志
}
void CElevatorDlg::OnBtnCorrectFault()
{
// TODO: Add your control notification handler code here
m_eCurState =m_eOldState;
GetDlgItem(IDC_BTN_CREATE_FAULT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_CORRECT_FAULT)->EnableWindow(FALSE);
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
Write2Log("故障已修复");//记录日志
}
void CElevatorDlg::OnBtnPsgEnter()
{
// TODO: Add your control notification handler code here
if(isOverWeight())
{
AfxMessageBox("本电梯已达到最大负重,不能再进人。");
return;
}
m_iCurPassengerNum++;
CString TempStr ="";
TempStr.Format("%d",m_iCurPassengerNum);
m_conPsgNum.SetWindowText("内有人数:"+TempStr);
Write2Log("进一人");
}
void CElevatorDlg::OnBtnPsgLeave()
{
// TODO: Add your control notification handler code here
if(m_iCurPassengerNum==0)
{
AfxMessageBox("本电梯内当前无乘客。");
return;
}
m_iCurPassengerNum--;
CString TempStr ="";
TempStr.Format("%d",m_iCurPassengerNum);
m_conPsgNum.SetWindowText("内有人数:"+TempStr);
Write2Log("出一人");
}
/*####################################################################
// name: acceptReq
// input1: sOuterRequest& tmpOuterRequest
请求结构体
// ouput: void
// 功能描述: 接收主控中心发来的楼层请求
// 开发作者: 漫步阳光
// 开发时间: @2005.11
// 版本说明: v1.0
####################################################################*/
void CElevatorDlg::acceptReq(sOuterRequest& tmpOuterRequest)
{
enum direction eReqDirection = tmpOuterRequest.eReqDirection;
int iReqFloor = tmpOuterRequest.iReqFloor;
//如果刚好电梯所停楼层有请求,则直接开门
if((m_eCurState==IDLE || m_eCurState==UP_PAUSE || m_eCurState==DOWN_PAUSE) && iReqFloor == m_iCurFloor)
{
if(eReqDirection==UP) m_eCurState = UP_RUN;
else m_eCurState = DOWN_RUN;
buzz();
openDoor();
return;
}
enum direction realDire = (iReqFloor>m_iCurFloor) ? UP : DOWN;
switch(m_eCurState)
{
case IDLE:
//记录用户请求方向与电梯应该运行方向不一致的情况,以便电梯到达后调整方向
if(eReqDirection==UP && realDire==DOWN){
m_eBackupDirection = UP;
m_bCanSchedule = FALSE;//电梯在到达本请求楼层前不允许再被调度
}else if(eReqDirection==DOWN && realDire==UP){
m_eBackupDirection = DOWN;
m_bCanSchedule = FALSE;//电梯在到达本请求楼层前不允许再被调度
}
if(realDire==UP)
{
m_eCurState =UP_RUN;
m_cUpWaitQueue->addElement(iReqFloor);
}else{
m_eCurState =DOWN_RUN;
m_cDownWaitQueue->addElement(iReqFloor);
}
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
Write2Log(stateDespArr[m_eCurState]);//记录日志
m_iNextDestFloor = iReqFloor;
KillTimer(1);
SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
break;
case UP_PAUSE:
m_iNextDestFloor = m_cUpWaitQueue->getNextAvail();
if(m_iNextDestFloor==-1 || iReqFloor<m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cUpWaitQueue->addElement(iReqFloor);
m_eCurState =UP_RUN;
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
KillTimer(1);
SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
break;
case DOWN_PAUSE:
m_iNextDestFloor = m_cDownWaitQueue->getNextAvail();
if(m_iNextDestFloor==-1 || iReqFloor>m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cDownWaitQueue->addElement(iReqFloor);
m_eCurState =DOWN_RUN;
m_conState.SetWindowText(stateDespArr[m_eCurState]);//改变电梯状态显示
KillTimer(1);
SetTimer(1,ONE_FLOOR_TIME*1000,NULL);//启动电梯
break;
case UP_RUN:
if(iReqFloor<m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cUpWaitQueue->addElement(iReqFloor);
break;
case DOWN_RUN:
if(iReqFloor>m_iNextDestFloor) m_iNextDestFloor = iReqFloor;
m_cDownWaitQueue->addElement(iReqFloor);
break;
}
}
void CElevatorDlg::enableRelateBtn(enum state eCurState, int iFloorNo)
{
//Enable当前楼层按钮
GetDlgItem(IDC_MYBUTTONS+iFloorNo-1)->EnableWindow(TRUE);
//通知父窗体Enable该楼层按钮
int tarFloorBtnID = (eCurState==UP_PAUSE) ? (2*(iFloorNo-1)) : (2*(iFloorNo-1)+1);
m_pParent->SendMessage(WM_ARRIVE_ONEFLOOR,(WPARAM)tarFloorBtnID);
}
void CElevatorDlg::Write2Log(CString content)
{
CString tempStr;
tempStr.Format("%d",m_iElevatorNo);
CTime m_SysTime = CTime::GetCurrentTime();
try{
m_cLogFile.WriteString("电梯"+tempStr+" ["+content+"]\t("+m_SysTime.Format("%Y-%m-%d %H:%M:%S")+")\n");
}catch(CException* e){}
}
void CElevatorDlg::buzz()
{
MessageBeep(MB_ICONASTERISK);
}
HBRUSH CElevatorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
// TODO: Return a different brush if the default is not desired
/*
if(nCtlColor== CTLCOLOR_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
//此处设置字体的颜色
pDC->SetTextColor(RGB(0,0,255));
return m_hbrush;
}
else
*/
return hbr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -