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

📄 deviceclass.old

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 OLD
📖 第 1 页 / 共 5 页
字号:
//	切换通道
		SendMachineData(CHANGE_CHANNEL);
		chReadyData=NONE_COMMAND;		//不再有尚未执行的命令
	}
}

//	当卡机和车道软件状态失配时车道软件下发的一些命令可能不会导致
//	卡机状态改变,为了防止车道软件和卡机相互等待,当卡机收到这种
//	类型的命令后发F0通知车道软件状态已经切换到指定的状态。
//	车道软件收到F0后应用本函数通知卡机无须再发F0
void CMachine::CancelSendF0()
{
	SendMachineData(CANCEL_SEND_F0);
}

//	当卡机和车道软件状态失配时车道软件下发的一些命令可能不会导致
//	卡机状态改变,为了防止车道软件和卡机相互等待,当卡机收到这种
//	类型的命令后发F0通知车道软件状态已经切换到指定的状态。
//	可能出现相互等待状态的命令包括:
void CMachine::RSW_NoChange()
{
	switch(chBackupData){
	case CONNECT_ANTENNA1:
		m_clsMachine.AntennaNO(1);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线1");
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		break;
	case CONNECT_ANTENNA2:
		m_clsMachine.AntennaNO(2);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线2");
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		break;
	case CONNECT_ANTENNA3:
		m_clsMachine.AntennaNO(3);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线3");
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		break;
	case CONNECT_ANTENNA4:
		m_clsMachine.AntennaNO(4);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线4");
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		break;
	case SET_CHANNEL1:
		m_clsMachine.ChannelNO(1);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到通道1");
//	切换通道时应通知卡机清除所有故障标志
		m_clsMachine.NormalFlag(M_MACHINE_DEVICE,TRUE);
		break;
	case SET_CHANNEL2:
		m_clsMachine.ChannelNO(2);
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到通道2");
//	切换通道时应通知卡机清除所有故障标志
		m_clsMachine.NormalFlag(M_MACHINE_DEVICE,TRUE);
		break;
	case CHANGE_CHANNEL:
		if(m_clsMachine.ChannelNO()==1){
			m_clsMachine.ChannelNO(2);
		} else {
			m_clsMachine.ChannelNO(1);
		}
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到通道2");
//	切换通道时应通知卡机清除所有故障标志
		m_clsMachine.NormalFlag(M_MACHINE_DEVICE,TRUE);
		break;
	}
//	通知卡机无须再送F0
	CancelSendF0();
}

//	本程序处理状态字1
void CMachine::ProcessRSW1(UCHAR value)
{
	CScreen m_clsScreen;
	CLaneInfo m_clsLane;
	static UCHAR chChannel1_Type=0xff;
//	判断通道1卡机类型
	if(chChannel1_Type!=(value&MACHINE_CHANNEL1_TYPE)){
		chChannel1_Type=value&MACHINE_CHANNEL1_TYPE;
		if(chChannel1_Type==0){
			if(m_clsLane.LaneType()=='E'){
				m_clsScreen.DrawAlarmInfo("入口不能使用收卡机");
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"入口不能使用收卡机\n");
			}
		} else {
			if(m_clsLane.LaneType()=='X'){
				m_clsScreen.DrawAlarmInfo("出口不能使用发卡机");
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"出口不能使用收卡机\n");
			}
		}
	}
	static UCHAR chChannel2_Type=0xff;
//	判断通道2卡机类型
	if(chChannel2_Type!=(value&MACHINE_CHANNEL2_TYPE)){
		chChannel2_Type=value&MACHINE_CHANNEL2_TYPE;
		if(chChannel2_Type==0){
			if(m_clsLane.LaneType()=='E'){
				m_clsScreen.DrawAlarmInfo("入口不能使用收卡机");
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"入口不能使用收卡机\n");
			}
		} else {
			if(m_clsLane.LaneType()=='X'){
				m_clsScreen.DrawAlarmInfo("出口不能使用发卡机");
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"出口不能使用收卡机\n");
			}
		}
	}
	static UCHAR chBank1_Full=0xff;
//	处理卡筒满标志
	if(chBank1_Full!=(value&MACHINE_BANK1_FULL)){
		chBank1_Full=value&MACHINE_BANK1_FULL;
//	假如当前通道卡筒满,置卡筒满标志
		if(m_clsMachine.ChannelNO()==1){
			if(chBank1_Full==0){
				m_clsMachine.FullFlag(FALSE);
			} else {
				m_clsMachine.FullFlag(TRUE);
			}
		}
	}
	static UCHAR chBank2_Full=0xff;
//	处理卡筒满标志
	if(chBank2_Full!=(value&MACHINE_BANK2_FULL)){
		chBank2_Full=value&MACHINE_BANK2_FULL;
//	假如当前通道卡筒满,置卡筒满标志
		if(m_clsMachine.ChannelNO()==2){
			if(chBank2_Full==0){
				m_clsMachine.FullFlag(FALSE);
			} else {
				m_clsMachine.FullFlag(TRUE);
			}
		}
	}
	static UCHAR chChannel1_Status=0xff;
//	处理卡机上盖开启标志
	if(chChannel1_Status!=(value&MACHINE_CHANNEL1_STATUS)){
		chChannel1_Status=value&MACHINE_CHANNEL1_STATUS;
		if(chChannel1_Status==0){
//	卡机通道上盖关闭时发通道关闭消息,控制类收到该消息后应改写卡筒识别卡
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANNEL1_CLOSE,0);
		}
	}
	static UCHAR chChannel2_Status=0xff;
//	处理卡机上盖开启标志
	if(chChannel2_Status!=(value&MACHINE_CHANNEL2_STATUS)){
		chChannel2_Status=value&MACHINE_CHANNEL2_STATUS;
		if(chChannel2_Status==0){
//	卡机通道上盖关闭时发通道关闭消息,控制类收到该消息后应改写卡筒识别卡
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANNEL2_CLOSE,0);
		}
	}
	static UCHAR chBank1_Status=0xff;
//	处理卡筒卡片锁开启标志
	if(chBank1_Status!=(value&MACHINE_BANK1_STATUS)){
		chBank1_Status=value&MACHINE_BANK1_STATUS;
//	当前卡机无该功能,因此暂时不理睬
	}
	static UCHAR chBank2_Status=0xff;
//	处理卡筒卡片锁开启标志
	if(chBank2_Status!=(value&MACHINE_BANK2_STATUS)){
		chBank2_Status=value&MACHINE_BANK2_STATUS;
//	当前卡机无该功能,因此暂时不理睬
	}
}

//	本程序处理状态字2
void CMachine::ProcessRSW2(UCHAR value)
{
//	处理卡机上电标志
	static UCHAR chResetFlag=0xff;
	if(chResetFlag!=(value&MACHINE_RESET_FLAG)){
		chResetFlag=value&MACHINE_RESET_FLAG;
		if(chResetFlag!=0){
//	卡机中途断电后车道软件记录的卡的状态可能和卡机的实际状态并不
//	符合,因此卡机上电后应当重新读取除RSW2外的所有状态字。
			m_clsMachine.AntennaNO(1);	//当前天线恢复为1
			m_clsMachine.ChannelNO(1);	//当前通道恢复为1
			ProcessMachine(0xfd);	//通知车道软件重读RSW1 ~ RSW3
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,POWER_ON,0);
		}
	}
	static UCHAR chChannelStatus=0xff;
//	处理通道状态标志
	if(chChannelStatus!=(value&MACHINE_CHANNEL_FLAG)){
		chChannelStatus=value&MACHINE_CHANNEL_FLAG;
		if(chChannelStatus==0){
			m_clsMachine.ChannelNO(1);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到通道1");
		} else {
			m_clsMachine.ChannelNO(2);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到通道2");
		}
//	切换通道时应清除卡机故障标志
		m_clsMachine.NormalFlag(M_MACHINE_DEVICE,TRUE);
	}
	static UCHAR chBank1_Ready=0xff;
//	处理卡机通道1卡筒就绪标志。通道1的卡筒的就位时卡机就绪。
	if(chBank1_Ready!=(value&MACHINE_BANK1_READY)){
		chBank1_Ready=value&MACHINE_BANK1_READY;
	}
	static UCHAR chBank2_Ready=0xff;
//	处理卡机通道2卡筒就绪标志。通道2的卡筒的就位时卡机就绪。
	if(chBank2_Ready!=(value&MACHINE_BANK2_READY)){
		chBank2_Ready=value&MACHINE_BANK2_READY;
	}
	CScreen m_clsScreen;
	static UCHAR chChannel1_Lock=0xff;
//	处理卡机通道上盖锁开启状态
	if(chChannel1_Lock!=(value&MACHINE_CHANNEL1_LOCK)){
		chChannel1_Lock=value&MACHINE_CHANNEL1_LOCK;
//	若卡机上盖锁开启,提示操作员上盖锁已经开启
		if(chChannel1_Lock!=0){
			m_clsScreen.DrawAlarmInfo("通道1上盖锁开启");
		}
	}
	static UCHAR chChannel2_Lock=0xff;
//	处理卡机通道上盖锁开启状态
	if(chChannel2_Lock!=(value&MACHINE_CHANNEL2_LOCK)){
		chChannel2_Lock=value&MACHINE_CHANNEL2_LOCK;
//	若卡机上盖锁开启,提示操作员上盖锁已经开启
		if(chChannel2_Lock!=0){
			m_clsScreen.DrawAlarmInfo("通道2上盖锁开启");
		}
	}
	static UCHAR chBank1_Lock=0xff;
//	处理通道1卡筒卡片锁开启状态
	if(chBank1_Lock!=(value&MACHINE_BANK1_LOCK)){
		chBank1_Lock=value&MACHINE_BANK1_LOCK;
//	当前卡机无此功能,暂时不理睬
	}
	static UCHAR chBank2_Lock=0xff;
//	处理通道2卡筒卡片锁开启状态
	if(chBank2_Lock!=(value&MACHINE_BANK2_LOCK)){
		chBank2_Lock=value&MACHINE_BANK2_LOCK;
//	当前卡机无此功能,暂时不理睬
	}
}

//	本程序处理状态字3
void CMachine::ProcessRSW3(UCHAR value)
{
	static UCHAR chAllowCount=0xff;
//	处理允许计数标志。对发卡计数,卡数目减1;对收卡计数,卡数目加1
	if(chAllowCount!=(value&MACHINE_COUNT_FLAG)){
		chAllowCount=value&MACHINE_COUNT_FLAG;
//	在确认卡机的计数完全正确前,卡的计数暂时由车道软件完成
//		if(chAllowCount!=0){
//			switch(chCountType){		//判断计数类型
//			case ISSUE_COUNT:
//				m_clsMachine.DecCardNumber();	//发卡计数,卡数目--
//				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"发卡成功");
//				break;
//			case ACCEPT_COUNT:
//				m_clsMachine.IncCardNumber();	//收卡计数,卡数目++
//				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"收卡成功");
//				break;
//			}
//			chCountType=NONE_COUNT;		//完成计数,计数类型清空
//		}
	}
	static UCHAR chAtAntennaFlag=0xff;
//	处理卡到达天线区标志
	if(chAtAntennaFlag!=(value&MACHINE_AT_ANTENNA_FLAG)){
		chAtAntennaFlag=value&MACHINE_AT_ANTENNA_FLAG;
		if(chAtAntennaFlag!=0){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CARD_AT_ANTENNA,0);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"卡到达天线区");
//	发卡时卡到达天线区,卡数目--
			if(chCountType==ISSUE_COUNT){
				m_clsMachine.DecCardNumber();	//发卡计数,卡数目--
				chCountType=NONE_COUNT;		//完成计数,计数类型清空
			}
		}
	}
	static UCHAR chHasCard=0xff;
//	处理入口处有卡标志,通知设备控制类当前有卡在通道口,若此时正在等
//	待插卡,可以发吸卡命令
	if(chHasCard!=(value&MACHINE_HAS_CARD)){
		chHasCard=value&MACHINE_HAS_CARD;
		if(chHasCard!=0){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CARD_AT_ENTRY,0);
		}
	}
	static UCHAR chBusyFlag=0xff;
//	处理卡机忙标志。卡机收到发卡或吸卡命令后建立忙标志,在弹出卡或
//	卡进入卡筒后该标志被清零
char tmpStr[40];
memset(tmpStr,0,40);
sprintf(tmpStr,"Status is %d",(value&MACHINE_BUSY_FLAG));
TRACE(tmpStr);
	if(chBusyFlag!=(value&MACHINE_BUSY_FLAG)){
		chBusyFlag=value&MACHINE_BUSY_FLAG;
		if(chBusyFlag!=0){
			bBusyFlag=TRUE;
		} else {
//	收卡时卡机空闲,卡数目++
			if(chCountType==ACCEPT_COUNT){
				m_clsMachine.IncCardNumber();	//收卡计数,卡数目++
				chCountType=NONE_COUNT;			//完成计数,计数类型清空
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"收卡成功");
			} else {
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"卡机空闲");
			}
			bBusyFlag=FALSE;
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CARD_REMOVE,0);
		}
	}
	CScreen m_clsScreen;
	static UCHAR chFaultFlag=0xff;
//	处理IC卡由内向外推卡时出现故障标志
	if(chFaultFlag!=(value&MACHINE_FAULT_FLAG)){
		chFaultFlag=value&MACHINE_FAULT_FLAG;
		static UINT nErrorCount=0;
		if(chFaultFlag!=0){
//	假如卡机故障且连续故障次数小于3次,发排除故障命令;否则认为卡机故障
			if(nErrorCount>=3){
				bFaultFlag=TRUE;
				m_clsMachine.NormalFlag(M_MACHINE_DEVICE,FALSE);
				m_clsScreen.DrawAlarmInfo("卡票");
			} else {
				RemoveFault();
				nErrorCount++;
			}
		} else {
			nErrorCount++;
			bFaultFlag=FALSE;
			m_clsMachine.NormalFlag(M_MACHINE_DEVICE,TRUE);
		}
	}
	static UCHAR chBankNull=0xff;
//	处理当前卡筒空标志。目前卡机的卡筒空标志未必准确,因此暂时不使用
	if(chBankNull!=(value&MACHINE_BANK_NULL)){
		chBankNull=value&MACHINE_BANK_NULL;
	}
}

//	本程序处理状态字4
void CMachine::ProcessRSW4(UCHAR value)
{
	static UCHAR chMachineStatus=0xff;
	if(chMachineStatus!=(value&MACHINE_ANTENNA_FLAG)){
		chMachineStatus=value&MACHINE_ANTENNA_FLAG;
		if((chMachineStatus==0x0)&&(m_clsMachine.AntennaNO()!=1)){
			m_clsMachine.AntennaNO(1);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线1");
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		}
		if((chMachineStatus==0x2)&&(m_clsMachine.AntennaNO()!=2)){
			m_clsMachine.AntennaNO(2);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线2");
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		}
		if((chMachineStatus==0x1)&&(m_clsMachine.AntennaNO()!=3)){
			m_clsMachine.AntennaNO(3);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线3");
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		}
		if((chMachineStatus==0x3)&&(m_clsMachine.AntennaNO()!=4)){
			m_clsMachine.AntennaNO(4);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STATUS_INFO,0,(LPARAM)"切换到天线4");
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_MACHINE_STATUS,CHANGE_ANTENNA,0);
		}
	}
	static UCHAR chReadyFlag=0xff;
//	处理卡机就绪标志。卡机在当前通道的卡筒到位 AND 卡筒卡片锁开启 
//	AND 卡机通道上盖关闭 AND 卡机无故障
	if(chReadyFlag!=(value&MACHINE_READY)){
		chReadyFlag=value&MACHINE_READY;
//	从2002/6/5起取消了对就绪标志的判断,原因如下:
//	1、	卡筒就绪检测开关未必稳定,可能会检测不到卡筒已装入
//	2、	如果操作员人为地在卡机未就绪时收、发卡,操作失败的责任在操
//		作员而不在车道软件
	}
}

//	通过串口发送命令到卡机
void CMachine::SendMachineData(UCHAR status)
{
	try{
		sio_putch(MACHINE_PORT,status);
		chBackupData=status;
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CIcMachine::SendMachineData()出现异常\n");
	}
}

//	处理卡机定时期超时,超时后重新发尚未执行成功的命令
void CMachine::ProcessTimerOut()
{
	switch(chReadyData){
	case ISSUE_CARD:
		IssueCard();
		break;
	case SUCK_CARD:
		SuckCard();
		break;
	case ACCEPT_CARD:
		AcceptCard();
		break;
	case OPEN_CHANNEL_LOCK1:
		OpenChannelLock1();

⌨️ 快捷键说明

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