📄 statuscontrol.cpp
字号:
// 显示黑名单查询结果窗口下处理按键:只允许确认黑名单或否认黑名单
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 + -