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

📄 statuscontrol.cpp

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

//	显示黑名单查询结果窗口下处理按键:只允许确认黑名单或否认黑名单
void CStatusControl::ProcessKeyOfIsBlackCar(UINT KeyValue)		//显示黑名单车认证窗口状态的事件
{
	switch(KeyValue)
	{
	case BLACK_CAR_PASS:		//收费员确认非黑名单
		nMainStatus=WAIT_BUS_NORMAL_INFO;
		nSlaveStatus=SHOW_BUS_CLASS	;
		break;
	case BLACK_CAR_NOPASS:		//收费员确认非黑名单
		m_clsDevice.DefineAmberStatus('1');	//报警灯报警
        nMainStatus=WAIT_BUS_NORMAL_INFO;
	    nSlaveStatus=SHOW_BUS_CLASS	;
		break;	  
	}
    GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}		

/// 以下是维修员边界类的处理事件
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////

//	事件:选择工作模式前按取消键
//	任务:返回插入身份卡窗口且不发读ID卡命令
void CStatusControl::ProcessCancelOfMode()
{
    nMainStatus=WAIT_BEGIN_SHIFT;
    nSlaveStatus=SHOW_PRESS_BEGIN;
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:已经选择工作模式
//	任务:根据选择项目改变车道状态。若所选不是正常工作模式,
//		  还需生成上班消息
void CStatusControl::ProcessModeOK()
{
	CModeMenu m_clsMode;
	switch(m_clsMode.WorkMode()){
	case WORK_MODE_NORMAL:
//	工作于正常收费模式,等待输入班次号
		nMainStatus=WAIT_SHIFT_INITIAL;	
        nSlaveStatus=SHOW_SHIFT_NO;
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
		break;
	case WORK_MODE_TEST:
//	工作于测试模式,生成上班信息
		m_clsStat.SetShiftTime();
		m_clsStat.LaneStatus(LANE_STATUS_MAINTAIN);
		m_clsStat.WorkMode(WORK_MODE_TEST);
		m_clsRecord.RecordBS();
		m_clsStat.ClearEs();
		UpdateLaneStatus();
		nMainStatus=WAIT_TEST_MENU;
		nSlaveStatus=SHOW_TEST_MENU;
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
		break;
	case WORK_MODE_SETUP:
//	工作于设置模式,生成上班信息
		m_clsStat.SetShiftTime();
		m_clsStat.LaneStatus(LANE_STATUS_MAINTAIN);
		m_clsStat.WorkMode(WORK_MODE_SETUP);
		m_clsRecord.RecordBS();
		m_clsStat.ClearEs();
		UpdateLaneStatus();
		nMainStatus=WAIT_SET_MODE;
		nSlaveStatus=SHOW_SET_MENU;
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
		break;
	case WORK_MODE_EDIT:
//	工作于编辑模式,生成上班信息
		m_clsStat.SetShiftTime();
		m_clsStat.LaneStatus(LANE_STATUS_MAINTAIN);
		m_clsStat.WorkMode(WORK_MODE_EDIT);
		m_clsRecord.RecordBS();
		m_clsStat.ClearEs();
		UpdateLaneStatus();
		nMainStatus=WAIT_EDIT_MODE;
		nSlaveStatus=SHOW_EDIT_MENU;
		GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
		break;
	}		
}

//	事件:选择测试项目
//	任务:根据选择内容进入不同的测试状态
void CStatusControl::ProcessTestMenuOK()
{
	CTestMenu m_clsTest;
	switch(m_clsTest.TestItem()){
	case TEST_CXP:
		nMainStatus=WAIT_TEST_CXP;
		nSlaveStatus=SHOW_CXP_MENU;
		break;
	case TEST_KEY:
		nMainStatus=WAIT_TEST_KEY;
		nSlaveStatus=SHOW_KEY_MENU;
		break;
	case TEST_TFI:
		nMainStatus=WAIT_TEST_TFI;
		nSlaveStatus=SHOW_TFI_MENU;
		break;
	case TEST_PRINTER:
		nMainStatus=WAIT_TEST_PRINTER;
		nSlaveStatus=SHOW_PRINTER_MENU;
		break;
	case TEST_OVERLAY:
		nMainStatus=WAIT_TEST_OVERLAY;
		nSlaveStatus=SHOW_OVERLAY_MENU;
		break;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:测试项目完成
//	任务:返回测试菜单,所有设备恢复初始状态
void CStatusControl::ProcessTestItemFinish()
{
	nMainStatus=WAIT_TEST_MENU;
	nSlaveStatus=SHOW_TEST_MENU;
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
	m_clsDevice.ResetDevice();
}

//	事件:选择CXP菜单
//	任务:根据选择转换从状态
void CStatusControl::ProcessCxpMenuOK()
{
	CTestCxp m_clsCxp;
	if(m_clsCxp.TestItem()==TEST_CXP_INPUT){
		nSlaveStatus=SHOW_INPUT_DEVICE;
	} else {
		nSlaveStatus=SHOW_OUTPUT_DEVICE;
//	为了保证输出设备显示状态信息的正确性,显示设备状态前先将
//	其状态定义为缺省状态
		m_clsDevice.DefineAmberStatus('0');
		m_clsDevice.DefineAutoRailStatus('F');
		m_clsDevice.DefineIndicationStatus('R');
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:退出输入设备测试状态
//	任务:返回CXP菜单
void CStatusControl::ProcessCancelOfInputDevice()
{
	nSlaveStatus=SHOW_CXP_MENU;
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:退出输出设备测试状态
//	任务:输出外设恢复缺省状态、返回CXP菜单
void CStatusControl::ProcessCancelOfOutputDevice()
{
	nSlaveStatus=SHOW_CXP_MENU;
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
	m_clsDevice.DefineAmberStatus('0');
	m_clsDevice.DefineAutoRailStatus('F');
	m_clsDevice.DefineIndicationStatus('R');
}

//	事件:改变输出设备状态
//	任务:获取当前输出设备状态并将其传递给设备控制类CDeviceControl
void CStatusControl::ProcessTestOutputDevice()
{
	CTestCxp m_clsCxp;
	char tmpStr[16];
	memset(tmpStr,0,16);
	m_clsCxp.GetOutputStatus(tmpStr);
	m_clsDevice.TestCxpDevice(tmpStr);
}


//	事件:测试TFI
//	任务:获取测试内容并传递给设备控制类CDeviceControl
void CStatusControl::ProcessTestTFI()
{
	CTestTfi m_clsTFI;
	m_clsDevice.TestTfi(m_clsTFI.TestItem());
}

//	事件:测试票据打印机
//	任务:获取测试内容并传递给设备控制类CDeviceControl
void CStatusControl::ProcessTestPrinter()
{
	CTestPrinter m_clsPrinter;
	m_clsDevice.TestPrinter(m_clsPrinter.TestItem());
}

//	事件:测试字符叠加器
//	任务:获取测试内容并传递给设备控制类CDeviceControl
void CStatusControl::ProcessTestOverlay()
{
	CTestOverlay m_clsOverlay;
	m_clsDevice.TestOverlay(m_clsOverlay.TestItem());
}

//	事件:选择设置菜单项目
//	任务:获取选择内容并显示相应的参数窗口
void CStatusControl::ProcessSetMenuOK()
{
	CSetParam m_clsSet;
	if(m_clsSet.SelectItem()==1){
		nSlaveStatus=SHOW_SET_PARAM1;
	} else {
		nSlaveStatus=SHOW_SET_PARAM2;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:完成参数修改并保存
//	任务:获取修改后的内容并保存到文件中、返回参数设置菜单
void CStatusControl::ProcessSetParamOK()
{
	char tmpStr[PARAM_LENGTH+1];
	memset(tmpStr,0,PARAM_LENGTH+1);
	m_clsLane.GetLaneParam(tmpStr);
//	两个状态下都可以修改参数,因此应先判断当前状态
	if(nMainStatus==WAIT_SET_PARAM){
		CSetIP m_clsSetIP;
		m_clsSetIP.UpdateParam(tmpStr);
	} else {
		CSetParam m_clsSetParam;
		m_clsSetParam.UpdateParam(tmpStr);
	}
	m_clsLane.SetLaneParam(tmpStr);
	UpdateLaneStatus();
	if(nMainStatus==WAIT_SET_PARAM){
//	若收费员参数文件不存在时设置参数,设置完成后进入等待下传参数状态
		nMainStatus=WAIT_RECEIVE_FILE;
		nSlaveStatus=SHOW_FILE_STATUS;
	} else {
//	若位于设置模式下,返回设置菜单
		nMainStatus=WAIT_SET_MODE;
		nSlaveStatus=SHOW_SET_MENU;
	}
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	事件:废弃已经进行的修改
//	任务:返回参数设置菜单
void CStatusControl::ProcessCancelOfSetParam()
{
	nSlaveStatus=SHOW_SET_MENU;
	GetCurrentStatus()->DrawWorkInfo(nSlaveStatus);
}

//	编辑发票起、止号完成
void CStatusControl::ProcessEditNumberOK()
{
	CEditMode m_clsEdit;
	int nInvoiceType=m_clsEdit.GetEditInvoiceType();
	int nIndex=0;
	switch(nInvoiceType){
	case EDIT_COMPUTER_INVOICE_START:	//编辑电脑票起号
	case EDIT_RATION_INVOICE_START_1:	//编辑1型定额票起号
	case EDIT_RATION_INVOICE_START_2:	//编辑2型定额票起号
	case EDIT_RATION_INVOICE_START_3:	//编辑3型定额票起号
	case EDIT_RATION_INVOICE_START_4:	//编辑4型定额票起号
	case EDIT_RATION_INVOICE_START_5:	//编辑5型定额票起号
	case EDIT_RATION_INVOICE_START_6:	//编辑6型定额票起号
		nIndex=nInvoiceType-EDIT_COMPUTER_INVOICE_START;
		m_clsStat.SetInvoiceStart(nIndex,m_clsEdit.GetInvoiceStart(nIndex));
		break;
	case EDIT_COMPUTER_INVOICE_END:		//编辑电脑票止号
	case EDIT_RATION_INVOICE_END_1:		//编辑1型定额票止号
	case EDIT_RATION_INVOICE_END_2:		//编辑2型定额票止号
	case EDIT_RATION_INVOICE_END_3:		//编辑3型定额票止号
	case EDIT_RATION_INVOICE_END_4:		//编辑4型定额票止号
	case EDIT_RATION_INVOICE_END_5:		//编辑5型定额票止号
	case EDIT_RATION_INVOICE_END_6:		//编辑6型定额票止号
		nIndex=nInvoiceType-EDIT_COMPUTER_INVOICE_END;
		m_clsStat.SetInvoiceEnd(nIndex,m_clsEdit.GetInvoiceEnd(nIndex));
		break;
	}
}

//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
///

//	处理上箭头键:不同状态车道软件对箭头键的处理不同
void CStatusControl::ProcessUpKey()
{
	switch(nMainStatus){
	case WAIT_TEST_TFI:
//	测试TFI时按上箭头键表示报价器音量++
		m_clsDevice.AdjustVolume(VOLUME_INC);
		break;
	default:
//		m_clsDevice.Buzzer();
		break;
	}
}

//	处理下箭头键:不同状态车道软件对箭头键的处理不同
void CStatusControl::ProcessDownKey()
{
	switch(nMainStatus){
	case WAIT_TEST_TFI:
//	测试TFI时按下箭头键表示报价器音量--
		m_clsDevice.AdjustVolume(VOLUME_DEC);
		break;
	default:
//		m_clsDevice.Buzzer();
		break;
	}
}

//	更新车道状态:更新收费员屏幕上的车道状态、更新视频图象上的
//	车道信息
void CStatusControl::UpdateLaneStatus()
{
	CScreen m_clsScreen;
	m_clsScreen.DrawFrameWindow();
	m_clsDevice.UpdateLaneInfo();
}

//	一次交易完成:生成交易消息、车流量++、清空本辆车的交易信息
//  交易完成时机:当记数线圈被触发且车辆交易信息没被清空、显示输入
//	车型窗口时有合法键(车队键,查询键,车型1-6)按下且车辆交易信息
//	没被清空。对第二种情况考虑车没走或线圈坏;
void CStatusControl::FinishTrade()
{
//	入口车道每辆车都存储图片,出口车道只存储异常车辆的图片

//	捕获图片信息必须在交易信息之后进行,否则图片信息中需要的交
//	易流水号可能会错误

//	理论上,内存中的图像应该被丢弃,但当抓拍线圈正常时无须该步操作,因为
//	新图像会覆盖旧图像。由于视频压缩线程中访问了剪贴板,为了避免冲突,车
//	道软件暂时不清空内存中的图片
//	存储图像时需要用到车辆信息,因此存储图像后才能清空交易数据
	m_clsRecord.RecordTR();
    m_clsStat.IncBusCount();
	if(m_clsTrans.BusType()==TYPE_NORMAL){
		m_clsStat.IncMoney();
	}
//	捕获图片信息必须在交易信息之后进行,否则图片信息中需要的交
//	易流水号可能会错误 
//	理论上,内存中的图像应该被丢弃,但当抓拍线圈正常时无须该步操作,因为
//	新图像会覆盖旧图像。由于视频压缩线程中访问了剪贴板,为了避免冲突,车
//	道软件暂时不清空内存中的图片
    SendMessage(theApp.m_pMainWnd->m_hWnd,WM_SAVE_PICTURE,0,0);          
//	存储图像时需要用到车辆信息,因此存储图像后才能清空交易数据
	m_clsTrans.ClearTransData();
	m_clsDevice.ClearTfi();
}

//	月票车或免征车合法
void CStatusControl::MonthOrFreeOK()
{
	char pBusNO[10];
	memset(pBusNO,0,10);
	CAuthentication m_clsAuthentication;
	m_clsDevice.PlayThankYou();
    m_clsAuthentication.GetBusNO(pBusNO);
	m_clsTrans.SetBusNO(pBusNO);
    m_clsTrans.Fare(0);				//费设置为0
	m_clsTrans.IncAllowBusNumber();	//允许过车数加一
	m_clsDevice.OverlayTransInfo();
	m_clsDevice.DefineAutoRailStatus('O');//自动栏杆开
    m_clsDevice.DefineIndicationStatus('V');//通行指示灯绿
	m_clsTrans.TollStatusFlag(TRUE);	//有交易数据
}

//	事件:确认违章事件
//	任务:累计车流量并生成交易信息
void CStatusControl::ProcessViolateOK()
{
	m_clsTrans.ViolateType(TRUE);
	m_clsRecord.RecordTR();
    m_clsStat.IncBusCount();
    SendMessage(theApp.m_pMainWnd->m_hWnd,WM_SAVE_PICTURE,0,0);              
	m_clsTrans.ClearTransData();
	m_clsDevice.ClearTfi();
}

//	处理“车已走”键:
void CStatusControl::ProcessHasGoKey()
{
//	若有尚未记录的交易,生成该交易信息
	if(m_clsTrans.TollStatusFlag()){
		FinishTrade();				//生成当前车辆的交易信息
	}
//	所有车辆离开车道后允许离开的车辆数目清零,关闭自动栏杆及通行灯
 	m_clsTrans.AllowBusNumber(0);
    m_clsDevice.DefineIndicationStatus('R');
    m_clsDevice.DefineAutoRailStatus('F');
}

//	释放边界类指针
void CStatusControl::ReleaseMemory()
{
	if(pScreen!=NULL){
		delete pScreen;
		pScreen=NULL;
	}
}

⌨️ 快捷键说明

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