www.pudn.com > MyElevator.rar > MyElevatorDlg.cpp


// MyElevatorDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "afxwin.h" 
#include "MyElevator.h" 
#include "MyElevatorDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyElevatorDlg dialog 
 
CMyElevatorDlg::CMyElevatorDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CMyElevatorDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CMyElevatorDlg) 
	m_strAPassengers = _T("0"); 
	m_strBPassengers = _T("0"); 
	m_strAStatus = _T("WAIT"); 
	m_strBStatus = _T("WAIT"); 
	m_nDESTFloor = -1; 
	m_nSRCFloor = -1; 
	m_ElevatorATimer = 0; 
	m_ElevatorBTimer = 0; 
	m_AStopTimer = 0; 
	m_BStopTimer = 0; 
	m_bARun = false; 
	m_bBRun = false; 
	 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CMyElevatorDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CMyElevatorDlg) 
	DDX_Control(pDX, IDC_SLIDERB, m_BSlider); 
	DDX_Control(pDX, IDC_SLIDERA, m_ASlider); 
	DDX_Control(pDX, IDC_LIST, m_TaskList); 
	DDX_Text(pDX, IDC_APASSENGERNUMBER, m_strAPassengers); 
	DDX_Text(pDX, IDC_BPASSENGERNUMBER, m_strBPassengers); 
	DDX_Text(pDX, IDC_ASTATUS, m_strAStatus); 
	DDX_Text(pDX, IDC_BSTATUS, m_strBStatus); 
	DDX_Radio(pDX, IDC_DESTRADIO1, m_nDESTFloor); 
	DDX_Radio(pDX, IDC_SRCRADIO1, m_nSRCFloor); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CMyElevatorDlg, CDialog) 
	//{{AFX_MSG_MAP(CMyElevatorDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_MESSAGE(WM_ASTEP_MESSAGE , OnAStepIn) 
	ON_MESSAGE(WM_BSTEP_MESSAGE , OnBStepIn) 
	ON_MESSAGE(WM_ASTOP_MESSAGE , OnAStopIn) 
	ON_MESSAGE(WM_BSTOP_MESSAGE , OnBStopIn) 
	ON_MESSAGE(WM_ASTART_MESSAGE , OnAStart) 
	ON_MESSAGE(WM_BSTART_MESSAGE , OnBStart) 
	ON_BN_CLICKED(IDC_ADD, OnAddTask) 
	ON_BN_CLICKED(IDC_DESTRADIO1, OnDestradio1) 
	ON_BN_CLICKED(IDC_DESTRADIO2, OnDestradio2) 
	ON_BN_CLICKED(IDC_DESTRADIO3, OnDestradio3) 
	ON_BN_CLICKED(IDC_DESTRADIO4, OnDestradio4) 
	ON_BN_CLICKED(IDC_DESTRADIO5, OnDestradio5) 
	ON_BN_CLICKED(IDC_SRCRADIO1, OnSrcradio1) 
	ON_BN_CLICKED(IDC_SRCRADIO2, OnSrcradio2) 
	ON_BN_CLICKED(IDC_SRCRADIO3, OnSrcradio3) 
	ON_BN_CLICKED(IDC_SRCRADIO4, OnSrcradio4) 
	ON_BN_CLICKED(IDC_SRCRADIO5, OnSrcradio5) 
	ON_BN_CLICKED(IDRUN, OnRun) 
	ON_WM_TIMER() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyElevatorDlg message handlers 
 
BOOL CMyElevatorDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	m_uPassengerID = 1; 
 
	m_TaskList.SetExtendedStyle(m_TaskList.GetExtendedStyle()| 
		                         LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP); 
	m_TaskList.InsertColumn(0 , "UserID" , LVCFMT_CENTER , 50,-1); 
	m_TaskList.InsertColumn(1 , "Start" , LVCFMT_CENTER , 50,-1); 
	m_TaskList.InsertColumn(2 , "End" , LVCFMT_CENTER, 50,-1); 
	m_TaskList.InsertColumn(3 , "Elevator" , LVCFMT_CENTER, 60,-1); 
 
 
	m_ASlider.SetRange(0,40); 
	m_ASlider.SetPos(40); 
	m_BSlider.SetRange(0,40); 
	m_BSlider.SetPos(40); 
 
/* 
	for(int i = 0 ; i <= 40 ; i +=10) 
	{ 
		m_ASlider.SetTic(i); 
		m_BSlider.SetTic(i); 
	} 
*/ 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CMyElevatorDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CMyElevatorDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CMyElevatorDlg::OnAddTask()  
{ 
	// TODO: Add your control notification handler code here 
	if((-1==m_nSRCFloor) || (-1==m_nDESTFloor) || (m_nSRCFloor==m_nDESTFloor)) 
	{ 
		MessageBox("Invalid task,can't add it!"); 
		m_nSRCFloor = -1; 
		m_nDESTFloor = -1; 
		UpdateData(false); 
		return; 
	} 
		 
	 
	m_TaskList.InsertItem(LVIF_TEXT|LVIF_STATE, m_uPassengerID - 1, _T(""),  
                                0, LVIS_SELECTED, 0, 0); 
	CString s; 
	s.Format("%d" , m_uPassengerID); 
	m_TaskList.SetItemText(m_uPassengerID - 1 , 0 , s); 
	s.Format("%d" , m_nSRCFloor + 1); 
	m_TaskList.SetItemText(m_uPassengerID - 1 , 1 , s); 
	s.Format("%d" , m_nDESTFloor + 1); 
	m_TaskList.SetItemText(m_uPassengerID - 1 , 2 , s); 
 
	 
	CStop stop1(m_nSRCFloor + 1, 1 , 0); 
	CStop stop2(m_nDESTFloor + 1 , 0 , 1); 
 
	bool bAStart = false; 
	bool bBStart = false; 
 
	_STATUS statusA = WAIT , statusB = WAIT; 
	if (m_bARun)  
	{ 
		statusA = m_ElevatorA.GetStatus(); 
		KillTimer(m_ElevatorATimer); 
		m_bARun = false; 
		bAStart = true; 
				 
	} 
	if (m_bBRun)  
	{ 
		statusB = m_ElevatorB.GetStatus(); 
		KillTimer(m_ElevatorBTimer); 
		m_bBRun = false; 
		bBStart = true; 
	} 
 
/* 
	if ((WAIT == m_ElevatorA.GetStatus()) && (WAIT != m_ElevatorB.GetStatus()))  
	{ 
		m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("A")); 
		m_ElevatorA.InsertStop(statusA, stop1 , stop2); 
		SendMessage(WM_ASTART_MESSAGE , 0 , 0); 
		if (bBStart) 
		{ 
			m_ElevatorBTimer = SetTimer(2, 200, 0);// 
			m_bBRun = true; 
		} 
		m_ElevatorATimer = SetTimer(1 , 200 , 0);// 
		m_bARun = true; 
		m_uPassengerID++; 
		return; 
	} 
 
	if ((WAIT == m_ElevatorB.GetStatus()) && (WAIT != m_ElevatorA.GetStatus())) 
	{ 
		m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B")); 
		m_ElevatorB.InsertStop(statusB, stop1 , stop2); 
		SendMessage(WM_BSTART_MESSAGE , 0 , 0); 
		if (bAStart) 
		{ 
			m_ElevatorATimer = SetTimer(1 , 200 , 0);// 
			m_bARun = true; 
		} 
		m_ElevatorBTimer = SetTimer(2, 200, 0);// 
		m_bBRun = true; 
		m_uPassengerID++; 
		return; 
	} 
	 
*/ 
	 
	if (m_ElevatorA.GetWaitTime(stop1 , stop2) > m_ElevatorB.GetWaitTime(stop1 , stop2)) 
	{ 
		 
		m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B")); 
		m_ElevatorB.InsertStop(statusB, stop1 , stop2); 
		SendMessage(WM_BSTART_MESSAGE , 0 , 0); 
		if (bAStart) 
		{ 
			m_ElevatorATimer = SetTimer(1 , 200 , 0);// 
			m_bARun = true; 
		} 
		m_ElevatorBTimer = SetTimer(2, 200, 0);// 
		m_bBRun = true; 
	} 
	else 
	{ 
/* 
		if ((WAIT == m_ElevatorB.GetStatus()) && (WAIT != m_ElevatorA.GetStatus())) 
		{ 
		m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B")); 
		m_ElevatorB.InsertStop(statusB, stop1 , stop2); 
		SendMessage(WM_BSTART_MESSAGE , 0 , 0); 
		if (bAStart) 
		{ 
			m_ElevatorATimer = SetTimer(1 , 200 , 0);// 
			m_bARun = true; 
		} 
		m_ElevatorBTimer = SetTimer(2, 200, 0);// 
		m_bBRun = true; 
		m_uPassengerID++; 
		return; 
		} 
*/ 
 
		m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("A")); 
		m_ElevatorA.InsertStop(statusA, stop1 , stop2); 
		SendMessage(WM_ASTART_MESSAGE , 0 , 0); 
		if (bBStart) 
		{ 
			m_ElevatorBTimer = SetTimer(2, 200, 0);// 
			m_bBRun = true; 
		} 
		m_ElevatorATimer = SetTimer(1 , 200 , 0);// 
		m_bARun = true; 
	} 
	m_uPassengerID++; 
	 
} 
 
void CMyElevatorDlg::OnDestradio1()  
{ 
	// TODO: Add your control notification handler code here 
	m_nDESTFloor = 0; 
} 
 
void CMyElevatorDlg::OnDestradio2()  
{ 
	// TODO: Add your control notification handler code here 
	m_nDESTFloor = 1; 
} 
 
void CMyElevatorDlg::OnDestradio3()  
{ 
	// TODO: Add your control notification handler code here 
	m_nDESTFloor = 2; 
} 
 
void CMyElevatorDlg::OnDestradio4()  
{ 
	// TODO: Add your control notification handler code here 
	m_nDESTFloor = 3; 
} 
 
void CMyElevatorDlg::OnDestradio5()  
{ 
	// TODO: Add your control notification handler code here 
	m_nDESTFloor = 4; 
} 
 
void CMyElevatorDlg::OnSrcradio1()  
{ 
	// TODO: Add your control notification handler code here 
	m_nSRCFloor = 0; 
} 
 
void CMyElevatorDlg::OnSrcradio2()  
{ 
	// TODO: Add your control notification handler code here 
	m_nSRCFloor = 1; 
} 
 
void CMyElevatorDlg::OnSrcradio3()  
{ 
	// TODO: Add your control notification handler code here 
	m_nSRCFloor = 2; 
} 
 
void CMyElevatorDlg::OnSrcradio4()  
{ 
	// TODO: Add your control notification handler code here 
	m_nSRCFloor = 3; 
} 
 
void CMyElevatorDlg::OnSrcradio5()  
{ 
	// TODO: Add your control notification handler code here 
	m_nSRCFloor = 4; 
	 
} 
 
void CMyElevatorDlg::OnRun()  
{ 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CMyElevatorDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	switch(nIDEvent)  
	{ 
	case 1: 
		{ 
			bool IsAttainFloor = false; 
			if (m_ElevatorA.StepIn(IsAttainFloor)) 
			{ 
				KillTimer(m_ElevatorATimer); 
				if (m_ElevatorA.HaveTask()) 
				{ 
					m_AStopTimer = SetTimer(3 , 2000 , 0); 
				} 
				SendMessage(WM_ASTOP_MESSAGE , 0 , 0); 
			} 
			else 
			{ 
				SendMessage(WM_ASTEP_MESSAGE , 0 , 0); 
			} 
		} 
		break; 
	case 2: 
		{ 
			bool IsAttainFloor = false; 
			if (m_ElevatorB.StepIn(IsAttainFloor)) 
			{ 
				KillTimer(m_ElevatorBTimer); 
				if (m_ElevatorB.HaveTask()) 
				{ 
					m_BStopTimer = SetTimer(4 , 2000 , 0); 
				} 
				SendMessage(WM_BSTOP_MESSAGE , 0 , 0); 
			} 
			else  
			{ 
				SendMessage(WM_BSTEP_MESSAGE , 0 , 0); 
			} 
		} 
		break; 
	case 3: 
		{ 
			KillTimer(m_AStopTimer); 
			if (m_ElevatorA.HaveTask()) 
			{ 
				m_bARun = true; 
				m_ElevatorATimer = SetTimer(1 , 200, 0);// 
				SendMessage(WM_ASTART_MESSAGE , 0 , 0); 
			} 
			 
			 
			 
		} 
		break; 
	case 4: 
		{ 
			KillTimer(m_BStopTimer); 
			if (m_ElevatorB.HaveTask()) 
			{ 
				m_bBRun = true; 
				m_ElevatorBTimer = SetTimer(2 , 200 , 0);// 
				SendMessage(WM_BSTART_MESSAGE , 0 , 0); 
				 
			} 
		} 
		break; 
	default: 
		break; 
	} 
	CDialog::OnTimer(nIDEvent); 
} 
 
 
LRESULT CMyElevatorDlg::OnAStepIn(WPARAM wParam , LPARAM lParam) 
{ 
	m_ASlider.SetPos(40 - m_ElevatorA.GetHeight()); 
	m_strAPassengers.Format("%d",m_ElevatorA.GetPerson()); 
 
	UpdateData(FALSE); 
	return 0; 
} 
LRESULT CMyElevatorDlg::OnBStepIn(WPARAM wParam , LPARAM lParam) 
{ 
	m_BSlider.SetPos(40 - m_ElevatorB.GetHeight()); 
	m_strBPassengers.Format("%d",m_ElevatorB.GetPerson()) ; 
 
	UpdateData(FALSE); 
	return 0; 
} 
LRESULT CMyElevatorDlg::OnAStopIn(WPARAM wParam , LPARAM lParam) 
{ 
	m_ASlider.SetPos(40 - m_ElevatorA.GetHeight()); 
	m_strAPassengers.Format("%d",m_ElevatorA.GetPerson()); 
	m_strAStatus.Format("WAIT"); 
 
	UpdateData(FALSE); 
	return 0; 
} 
LRESULT CMyElevatorDlg::OnBStopIn(WPARAM wParam , LPARAM lParam) 
{ 
	m_BSlider.SetPos(40 - m_ElevatorB.GetHeight()); 
	m_strBPassengers.Format("%d",m_ElevatorB.GetPerson()); 
	m_strBStatus.Format("WAIT"); 
 
	UpdateData(FALSE); 
	return 0; 
} 
LRESULT CMyElevatorDlg::OnAStart(WPARAM wParam , LPARAM lParam) 
{ 
	m_strAStatus.Format(m_ElevatorA.GetStatus() == UP ? _T("UP") : _T("DOWN")); 
	m_strAPassengers.Format("%d",m_ElevatorA.GetPerson()); 
 
	UpdateData(FALSE); 
	return 0; 
} 
LRESULT CMyElevatorDlg::OnBStart(WPARAM wParam , LPARAM lParam) 
{ 
	m_strBStatus.Format(m_ElevatorB.GetStatus() == UP ? _T("UP") : _T("DOWN")); 
	m_strBPassengers.Format("%d",m_ElevatorB.GetPerson()); 
 
	UpdateData(FALSE); 
	return 0; 
}