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

📄 statuscontrol.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	return pScreen;
}


//////////////////////////////////////////////////////////////////
//	处理来自输入外设的消息:假如正在测试输入外设,更新屏幕
//	显示;否则只处理抓拍线圈和检测线圈状态变化消息:将线圈
//	的新状态传给对应的线圈处理函数
void CStatusControl::ProcessCxpStatus(UINT nIndex, char status)
{
	if((nMainStatus==WAIT_TEST_CXP)&&(nSlaveStatus==SHOW_INPUT_DEVICE)){
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
	} else {
		switch(nIndex){
		case LEAVE_LOOP_CHANGE_STATUS:			//检测线圈状态发生变化
			if(nMainStatus==WAIT_GROUP){
				ProcessGroupLoop((char)status);
			} else {
				ProcessLeaveLoop((char)status);
			}
			break;
		case PICTURE_LOOP_CHANGE_STATUS:		//抓拍线圈状态发生变化
			ProcessPictureLoop((char)status);
			break;
		}
	}
}

//	处理检测线圈状态变化
void CStatusControl::ProcessLeaveLoop(char status)
{
	if(status=='1') //	有车压上线圈,执行以下操作:
	{
//	假如有车压上线圈,执行以下操作:
		m_clsDevice.ClearTfi();			//清除TFI显示
//	生成交易消息、统计车流量的时机为:1、操作员按“下一车”键准
//	备对下辆车收费,或:2、车辆压上检测线圈。
//	因此:
//	1、假如车道不允许车辆离开,按违章处理
//	2、假如车道允许离开的车辆数目大于1,允许离开的车数目--
//	3、假如允许离开的车辆数目等于1,允许离开的车数目为0,完成一
//	   次交易,通行指示灯变为红色
//	4、如果允许离开的车辆数目为1且位于等待车辆离去窗口,返回输入
//	   车型窗口
        m_clsStat.IncLoopBusCount();
//	假如尚未记录交易,记录交易
		if(m_clsTrans.TollStatusFlag()){
	  		FinishTrade();
		}
		if(m_clsTrans.AllowBusNumber()>0){
    		m_clsTrans.DecAllowBusNumber();
    		if(m_clsTrans.AllowBusNumber()==0)
			{
    			m_clsDevice.DefineIndicationStatus('R');
			}
		} else {
    		ProcessViolateEvent();//值班状态但该车没处理
		}
	} else {
//	假如车辆离开检测线圈,若不再有允许离开的车辆,
//	关闭自动栏杆
		if(m_clsTrans.AllowBusNumber()==0)
		{
			m_clsDevice.DefineAutoRailStatus('F');
		}
	}
}

//	处理车队车辆压上线圈:车流量++、产生交易信息
void CStatusControl::ProcessGroupLoop(char status)
{
	if(status=='1'){
		CTransInfo m_clsTrans;
        m_clsStat.IncLoopBusCount();
		m_clsTrans.BusClass(m_clsTrans.GroupBusClass());
		m_clsTrans.BusType(TYPE_ARMY_POLICE);
		FinishTrade();			//完成一次交易
		m_clsTrans.IncGroupNumber();
		nMainStatus=WAIT_GROUP;
		nSlaveStatus=SHOW_GROUP;
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
	}
}

//	处理抓拍线圈状态变化:假如新状态为1,抓拍图像
void CStatusControl::ProcessPictureLoop(char status)
{
	if(status=='1'){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CAPTURE,0,0);
	}
}

//	车辆触发违章:若车道工作于正常模式,提示操作员确认违章;若
//	车道工作于非正常模式,系统自行确认违章
void CStatusControl::ProcessViolateEvent()
{
//	生成报警信息、报警灯点亮
	m_clsTrans.WarningReason(WARNING_VIOLATE);	//报警原因为
	m_clsRecord.RecordEW();
	m_clsDevice.DefineAmberStatus('1');	//报警灯报警
	if(m_clsStat.WorkMode()==WORK_MODE_NORMAL)
	{
		if (m_clsLane.GetViolateModeFlag())
		{
//	若车道工作于正常模式,违章模式标志被置位,提示操作员确认违章
	    	nMainStatus=WAIT_VIOLATE;
		    nSlaveStatus=SHOW_VIOLATE;
    		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
			return;
		}
	} 
//	若工作于非正常模式,或若车道工作于正常模式,违章模式标志没被置位,
//  累计车流量并生成交易信息
	m_clsTrans.TollStatusFlag(TRUE);
    ProcessViolateOK();
	if(m_clsStat.WorkMode()==WORK_MODE_NORMAL)
	{
//	若车道工作于正常模式,违章模式标志没被置位,返回输入车型窗口
        nMainStatus=WAIT_BUS_NORMAL_INFO;
        nSlaveStatus=SHOW_BUS_CLASS	;
   		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
		return;
	} 
}

////////////////////////////////////////////////////////////////////
//	事件:程序必须退出
//	行为:显示必须退出的原因并启动5秒定时器,定时器超时后程序退出
void CStatusControl::ProcessMustExitEvent()
{
	nMainStatus=WAIT_QUIT_FOR_ERROR;
	nSlaveStatus=SHOW_ERROR_INFO;		//主状态转换后复位从状态
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,WORK_WINDOW_TIMER,5000);
}

//	事件:按上班键
void CStatusControl::ProcessBeginKey()
{
	nMainStatus=WAIT_LOGIN;
	nSlaveStatus=SHOW_INPUT_ID;		//主状态转换后复位从状态
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:操作员按交班键
//	任务:根据车道状态及车道类型决定下一个状态
void CStatusControl::ProcessEndKey()
{
//	收费模式下显示剩余发票起、止号,否则提示“按有效”
	nMainStatus=WAIT_END_SHIFT;
	if(m_clsStat.WorkMode()==WORK_MODE_NORMAL){
		nSlaveStatus=SHOW_END_INVOICE;
	} else {
		nSlaveStatus=SHOW_PRESS_VALID;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);	
}

//上下班事件/////////////////////////////////////////////////////////
//	输入操作员工号窗口下处理按键:只允许按“确认”键及“取消”键
void CStatusControl::ProcessKeyOfInputID(UINT KeyValue)//输入工号窗口状态的事件	
{
	switch(KeyValue){
	case LOGIN_INPUT_ID_CANCEL:		//输入工号前按取消键,取消上班
		nMainStatus=WAIT_BEGIN_SHIFT;
		nSlaveStatus=SHOW_PRESS_BEGIN;
		break;
	case LOGIN_INPUT_ID_OK:			//确认工号,等待输入密码
		nMainStatus=WAIT_LOGIN;
		nSlaveStatus=SHOW_INPUT_PASSWORD;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	输入操作员密码窗口下处理按键:只允许按“取消”键或“确认”键
void CStatusControl::ProcessKeyOfInputPassword(UINT KeyValue)
{
	switch(KeyValue){
    case LOGIN_INPUT_PASSWORD_CANCEL:	//输入密码前按取消键,取消上班
	    nMainStatus=WAIT_BEGIN_SHIFT;
	    nSlaveStatus=SHOW_PRESS_BEGIN;
		break;
	case LOGIN_INPUT_PASSWORD_OK:		//用户已经输入密码完成
		CLogin m_clsLogin;
//进行验证密码和工号正确性,如果是收费员,显示选择班次或修改密码
//是维修员,显示模式选择菜单
		int checkID_Result=m_clsLane.CheckID(m_clsLogin.LoginNO(),m_clsLogin.Password());
		switch(checkID_Result){
		case 0:							//操作员身份为收费员
//	核对身份卡成功,存储操作员信息到永久性文件中,等待输入班次
			m_clsStat.CollectNO(m_clsLogin.LoginNO());
			m_clsStat.CollectType(TRUE);
			nMainStatus=WAIT_SHIFT_INITIAL;
	        nSlaveStatus=SHOW_SHIFT_NO;
			break;
		case 1:							//操作员身份为维修员
//	核对身份卡成功,存储操作员信息到永久性文件中,等待选择工作模式
			m_clsStat.CollectNO(m_clsLogin.LoginNO());
			m_clsStat.CollectType(FALSE);
//	维修员上班时,显示模式选择菜单
			nMainStatus=WAIT_MODE_MENU;
			nSlaveStatus=SHOW_MODE_MENU;
			break;
		case -1:						//操作员身份非法
//	若核对身份失败,提示失败,等待操作员重新输入工号

//	特别地:由于生成报警消息需要操作员工号,而只有车道位于开启
//			状态时才能返回正确的工号,因此先将车道设置为开启状态,
//			报警消息生成后再重新关闭车道
			m_clsStat.CollectNO(m_clsLogin.LoginNO());
			m_clsStat.CollectType(TRUE);
	        m_clsTrans.WarningReason(WARNING_INVOLID_ID);	//报警原因为
		    m_clsStat.LaneStatus(LANE_STATUS_OPEN);
            m_clsRecord.RecordEW();		//生成报警消息
            m_clsStat.LaneStatus(LANE_STATUS_CLOSE);
			m_clsStat.CollectNO(0);
			m_clsStat.CollectType(FALSE);
			CScreen m_clsScreen;
			m_clsScreen.DrawAlarmInfo("工号或密码错误");		  
			nMainStatus=WAIT_LOGIN;
        	nSlaveStatus=SHOW_INPUT_ID;
			break;
		}
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	输入班次窗口下处理按键:只允许选择班次、按“取消”键或更改密码
void CStatusControl::ProcessKeyOfInputShiftNO(UINT KeyValue)  //选择班次或修改密码窗口状态的事件
{
	CInformationBS m_clsInformationBS;
	switch(KeyValue)
	{
	case SHIFT_INPUT_SHIFT_CANCEL:	//输入班次前按取消键,取消上班
		nMainStatus=WAIT_LOGIN;
       	nSlaveStatus=SHOW_INPUT_ID;	
		break;
    case SHIFT_INPUT_SHIFT_OK:			//用户已经输入班次
		m_clsStat.ShiftNO(m_clsInformationBS.ShiftNO());
        nMainStatus=WAIT_SHIFT_INITIAL;
	    nSlaveStatus=SHOW_START_INVOICE;
		break;
    case SHIFT_INPUT_CHANGE_PASSWORD:   //用户已经输入选择修改密码
        nMainStatus=WAIT_MODIFY_PASSWORD;
	    nSlaveStatus=SHOW_CHANGE_PASSWORD;
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	显示发票起、止号窗口下处理按键:只允许按“取消”键、确认发票号
//	正确或确认发票号不正确
void CStatusControl::ProcessKeyOfStartInvoice(UINT KeyValue)	//发票起号被确认窗口状态的事件
{
	switch(KeyValue)
	{
    case SHIFT_DISPLAY_INVOICE_START_CANCEL://发票号按取消键,取消上班
		nMainStatus=WAIT_LOGIN;
       	nSlaveStatus=SHOW_INPUT_ID;	
		break;
    case SHIFT_DISPLAY_INVOICE_START_OK:	//用户已经确认发票起号相同
		m_clsStat.SetShiftTime();			//设置上班时间
		if(m_clsStat.CollectType()){		//设置工作模式及车道状态
            m_clsStat.LaneStatus(LANE_STATUS_OPEN);
		} else {
			m_clsStat.LaneStatus(LANE_STATUS_MAINTAIN);
		}
	    m_clsStat.WorkMode(WORK_MODE_NORMAL);
	    UpdateLaneStatus();					//更新屏幕上的车道状态
	    m_clsRecord.RecordBS();				//生成上班消息	
		m_clsStat.ClearEs();                //清除冲卡车流统计
        nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS;
		break;
	case SHIFT_DISPLAY_INVOICE_START_NO_OK:	//用户已经确认发票起号不同
//	若操作员确认发票号不同,生成报警消息并等待上位机更新发票号
	    m_clsTrans.WarningReason(WARNING_INVOICE_ERROR);//报警原因
	    m_clsRecord.RecordEW();			//生成报警消息
		break;
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	更改操作员密码时处理按键:只允许按“取消”键、新密码合法、新密码
//	非法。若新密码合法,要再核对旧密码是否正确	      
void CStatusControl::ProcessKeyOfChangePassword(UINT KeyValue)	//输入修改密码窗口状态的事件
{			
	CPassword m_clsPassword;
	CLogin m_clsLogin;
	switch(KeyValue)
	{
    case PASSWORD_INPUT_2PASSWORD_OK:  //两次输入的新密码相同
        if(m_clsPassword.OldPassword()==m_clsLogin.Password())
		{					//操作员输入的旧密码正确
            m_clsTrans.NewPassword(m_clsPassword.NewPassword1());
//	特别地:由于生成修改密码消息需要操作员工号,而只有车道位于开启
//			状态时才能返回正确的工号,因此先将车道设置为开启状态,
//			更改密码消息生成后再重新关闭车道
		    m_clsStat.LaneStatus(LANE_STATUS_OPEN);
            m_clsRecord.RecordPW();			//生成修改密码消息
            m_clsStat.LaneStatus(LANE_STATUS_CLOSE);
            nMainStatus=WAIT_SHIFT_INITIAL;
	        nSlaveStatus=SHOW_SHIFT_NO;
		} else {			//操作员输入的旧密码不正确
//	提示修改密码失败
			nMainStatus=WAIT_MODIFY_PASSWORD;
	        nSlaveStatus=SHOW_PASSWORD_RESULT;
		}
		break;
	case PASSWORD_INPUT_2PASSWORD_ERROR: //修改密码输入错
        nMainStatus=WAIT_MODIFY_PASSWORD;
	    nSlaveStatus=SHOW_PASSWORD_RESULT;
//	两次输入的新密码不正确,提示修改密码失败
		break;
	case PASSWORD_CANCEL_OF_INPUT_PASSWORD:	//按取消键
		nMainStatus=WAIT_SHIFT_INITIAL;
	    nSlaveStatus=SHOW_SHIFT_NO;
		break;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	提示更改密码失败窗口下处理按键:只允许选择重试或放弃
void CStatusControl::ProcessKeyOfPasswordResult(UINT KeyValue)
{
	switch(KeyValue)
	{
	case PASSWORD_CHANGE_PASSWORD_FAILURE:   //输入修改密码错不再输入		
        nMainStatus=WAIT_SHIFT_INITIAL;
	    nSlaveStatus=SHOW_SHIFT_NO;		
		break;
	case PASSWORD_CHANGE_PASSWORD_RETRY:   //输入修改密码错请求重输
        nMainStatus=WAIT_MODIFY_PASSWORD;
	    nSlaveStatus=SHOW_CHANGE_PASSWORD;
		break;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	交班时显示发票号码窗口下处理按键:只允许取消下班或确认下班
void CStatusControl::ProcessKeyOfEndInvoice(UINT KeyValue)				//交班显示发票窗口状态的事件
{
	switch(KeyValue)
	{
	case END_INVOICE_CANCEL:	//发票止号前按取消,取消下班 
        switch(m_clsStat.WorkMode()){
    	case WORK_MODE_NORMAL:	//正常工作模式下出口车道返回输入车型窗口
            nMainStatus=WAIT_BUS_NORMAL_INFO;
            nSlaveStatus=SHOW_BUS_CLASS;    
        	break;
        case WORK_MODE_TEST:	//测试模式下返回测试菜单(不可能事件)
	        nMainStatus=WAIT_TEST_MENU;
			nSlaveStatus=SHOW_TEST_MENU;        
        	break;					
        case WORK_MODE_SETUP:	//设置模式下返回设置菜单(不可能事件)
	        nMainStatus=WAIT_SET_MODE;
            nSlaveStatus=SHOW_SET_MENU;        
        	break;					
        case WORK_MODE_EDIT:	//编辑模式下返回编辑菜单(不可能事件)
	        nMainStatus=WAIT_EDIT_MODE;
			nSlaveStatus=SHOW_EDIT_MENU;        
        	break;    
		}
		break;
	case END_INVOICE_NO_OK:		//确认发票止号不同完成
//	操作员交班时发现发票起、止号不同时产生报警消息,其他操作同发票
//	起、止号一致时操作一样
		m_clsTrans.WarningReason(WARNING_INVOICE_ERROR);//报警原因
	    m_clsRecord.RecordEW();	//生成报警消息
	case END_INVOICE_OK:		//确认发票止号相同完成  
		m_clsRecord.RecordES();	//生成交班信息
		m_clsStat.ClearEs();	
	//先生成交班消息,后改发票起号
		for(int i='0'; i<='6'; i++){
//	剩余发票起号就是当前发票号码
			m_clsStat.SetInvoiceStart(i,m_clsStat.GetInvoiceNow(i));
		}
	    m_clsStat.LaneStatus(LANE_STATUS_CLOSE);
	    m_clsStat.WorkMode(WORK_MODE_NULL);
        m_clsStat.ShiftNO(0);
	    UpdateLaneStatus();
//	交班时重新初始化捕获设备
//	    SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CAPTURE_WINDOW,RESET_CAPTURE,0);
		nMainStatus=WAIT_BEGIN_SHIFT;
	    nSlaveStatus=SHOW_PRESS_BEGIN;
		break;
	}	    
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	等待确认交班窗口下处理按键:只允许取消交班或确认交班
void CStatusControl::ProcessKeyOfEndShift(UINT KeyValue)	//确认交班窗口状态的事件
{
	switch(KeyValue)
	{
	case END_VALID_CANCEL:		//确认交班前按取消,取消下班
        switch(m_clsStat.WorkMode())
		{
    	case WORK_MODE_NORMAL://正常工作模式下出口车道返回输入车型窗口

⌨️ 快捷键说明

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