📄 statuscontrol.cpp
字号:
}
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 + -