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

📄 deviceclass.old

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

#include "stdafx.h"
#include "lane_new.h"
#include "DeviceClass.h"
#include "mmsystem.h"
#include "mmreg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CLane_newApp theApp;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCxp::CCxp()
{
}

//	初始化外设状态,设置输入外设状态并请求输入外设输入当前的状态
void CCxp::Initial()
{
	m_clsCxp.AmberStatus('0');
	m_clsCxp.AutoRailStatus('F');
	m_clsCxp.RainStatus('R');
	m_clsCxp.IndicationStatus('R');
	m_clsCxp.LeaveStatus('0');
	m_clsCxp.PictureStatus('0');
	SendCxpData();
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,ASK_IO_STATUS_TIMER,0);
}

//	处理雨棚信号灯状态
void CCxp::DefineRainStatus(char status)
{
	m_clsCxp.RainStatus(status);
	SendCxpData();
}

//	处理交通指示灯状态
void CCxp::DefineIndicationStatus(char status)
{
	m_clsCxp.IndicationStatus(status);
	SendCxpData();
}

//	处理报警灯状态
void CCxp::DefineAmberStatus(char status)
{
	m_clsCxp.AmberStatus(status);
	SendCxpData();
}

//	处理自动栏杆状态
void CCxp::DefineAutoRailStatus(char status)
{
	m_clsCxp.AutoRailStatus(status);
	SendCxpData();
}

//	检测线圈占用超时,认为检测线圈故障
void CCxp::LeaveLoopTimerOut()
{
	m_clsCxp.LeaveNormalFlag(FALSE);
}

//	抓拍线圈超时,认为抓拍线圈故障
void CCxp::PictureLoopTimerOut()
{
	m_clsCxp.PictureNormalFlag(FALSE);
}

//	报警灯定时器超时,关闭报警灯
void CCxp::AmberTimerOut()
{
	m_clsCxp.AmberStatus('0');
	SendCxpData();
}

//	查询外设状态定时器超时,继续发送查询命令
void CCxp::AskIoStatusTimerOut()
{
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,ASK_IO_STATUS_TIMER,0);
	SendCxpData("\nE\r",3);
}

//	处理来自外设的命令,若以字符'E'开始,则该命令解释为输入外设的状
//	态;若以字符'S'开始,则解释为请求输出外设的状态
void CCxp::ProcessInputData(char *InputData)
{
	switch(InputData[0]){
	case 'E':			//收到CXP的输入设备状态
//	首先判断所收到字节长度是否合法,若不准确,请求CXP重传
		if(strlen(InputData)!=7){
			AskIoStatusTimerOut();
			return;
		}
//	收到输入/输出设备答复后关闭请求状态定时器
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,ASK_IO_STATUS_TIMER,0);
//	判断输入外设状态是否发生变化,若#1 线圈或#2 线圈状态发生变化,
//	还需要改变线圈图标的状态
		if(InputData[LEAVE_LOOP_DEVICE+1]!=m_clsCxp.LeaveStatus()){
//	以下两句顺序不可颠倒,否则处理控制类访问检测线圈状态时会得到
//	错误的结果
			m_clsCxp.LeaveStatus(InputData[LEAVE_LOOP_DEVICE+1]);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,LEAVE_LOOP_CHANGE,(LPARAM)InputData[LEAVE_LOOP_DEVICE+1]);
//	检测线圈状态变化,说明检测线圈恢复正常工作
			m_clsCxp.LeaveNormalFlag(TRUE);
			if(InputData[LEAVE_LOOP_DEVICE+1]=='1'){
//	假如检测线圈状态为1,启动定时器,定时器超时前状态不复位则认为
//	线圈故障
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,LEAVE_LOOP_TIMER,0);
			} else {
//	假如检测线圈状态为0,关闭定时器
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,LEAVE_LOOP_TIMER,0);
			}
		}
		if(InputData[PICTURE_LOOP_DEVICE+1]!=m_clsCxp.PictureStatus()){
//	以下两句顺序不可颠倒,否则处理控制类访问抓拍线圈状态时会得到
//	错误的结果
			m_clsCxp.PictureStatus(InputData[PICTURE_LOOP_DEVICE+1]);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,PICTURE_LOOP_CHANGE,(LPARAM)InputData[PICTURE_LOOP_DEVICE+1]);
//	抓拍线圈状态变化,说明检测线圈恢复正常工作
			m_clsCxp.PictureNormalFlag(TRUE);
			if(InputData[PICTURE_LOOP_DEVICE+1]=='1'){
//	假如抓拍线圈状态为1,启动定时器,定时器超时前状态不复位则认为
//	线圈故障
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,PICTURE_LOOP_TIMER,0);
			} else {
//	假如抓拍线圈状态为0,关闭定时器
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,PICTURE_LOOP_TIMER,0);
			}
		}
		if(InputData[SPARE1_INPUT_DEVICE+1]!=m_clsCxp.SpareInput1()){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,SPARE1_INPUT_DEVICE,(LPARAM)InputData[SPARE1_INPUT_DEVICE+1]);
		}
		if(InputData[SPARE2_INPUT_DEVICE+1]!=m_clsCxp.SpareInput2()){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,SPARE1_INPUT_DEVICE,(LPARAM)InputData[SPARE1_INPUT_DEVICE+2]);
		}
		if(InputData[SPARE3_INPUT_DEVICE+1]!=m_clsCxp.SpareInput3()){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,SPARE1_INPUT_DEVICE,(LPARAM)InputData[SPARE1_INPUT_DEVICE+3]);
		}
		if(InputData[SPARE4_INPUT_DEVICE+1]!=m_clsCxp.SpareInput4()){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CXP_STATUS,SPARE1_INPUT_DEVICE,(LPARAM)InputData[SPARE1_INPUT_DEVICE+4]);
		}
		break;
	case 'S':					//CXP请求下发输出设备状态
		SendCxpData();
		break;
	default:					//CXP上传的命令不认识
		AskIoStatusTimerOut();	//重新读取CXP状态
		break;
	}
}

//	测试输出设备:将指定的输出设备状态发送到外设
void CCxp::TestOutputDevice(char *pStr)
{
	char tmpStr[20];
	memset(tmpStr,0,20);
	tmpStr[0]=0xa;
	tmpStr[1]='S';
	memmove(tmpStr+2,pStr,12);
	tmpStr[14]=0xd;
	SendCxpData(tmpStr,15);
}

//	通过多串口卡发送外设状态
void CCxp::SendCxpData(char *str1, int Len)
{
	try{
	sio_write(CXP_PORT,str1,Len);
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CCxp::SendCxpData()出现异常\n");
	}
}

//	封装输出外设状态数据并发送
void CCxp::SendCxpData()
{
	char tmpStr[20];
	memset(tmpStr,0,20);
	tmpStr[0]=0xa;
	tmpStr[1]='S';
	memset(tmpStr+2,'0',12);
	if(m_clsCxp.RainStatus()=='R'){
		tmpStr[2+RAIN_GREEN]='0';
		tmpStr[2+RAIN_RED]='1';
	} else {
		tmpStr[2+RAIN_GREEN]='1';
		tmpStr[2+RAIN_RED]='0';
	}
	if(m_clsCxp.IndicationStatus()=='R'){
		tmpStr[2+INDICATION_GREEN]='0';
		tmpStr[2+INDICATION_RED]='1';
	} else {
		tmpStr[2+INDICATION_GREEN]='1';
		tmpStr[2+INDICATION_RED]='0';
	}
	if(m_clsCxp.AutoRailStatus()=='F'){
		tmpStr[2+AUTO_RAIL_OPEN]='0';
		tmpStr[2+AUTO_RAIL_CLOSE]='1';
	} else {
		tmpStr[2+AUTO_RAIL_OPEN]='1';
		tmpStr[2+AUTO_RAIL_CLOSE]='0';
	}
	tmpStr[2+AMBER_DEVICE]=m_clsCxp.AmberStatus();
	tmpStr[14]=0xd;
	SendCxpData(tmpStr,15);
}

BOOL CTfi::bAutoTestFlag=FALSE;
CTfi::CTfi()
{
}

//	初始化操作:关闭TFI显示
void CTfi::Initial()
{
	ClearTFI();
}

//	清除TFI的显示
void CTfi::ClearTFI()
{
	char tmpStr[4];
	memset(tmpStr,0,4);
	tmpStr[0]=0xa;
	tmpStr[1]=0x42;
	tmpStr[2]=0xd;
	SendTFIData(tmpStr,3);
	bAutoTestFlag=FALSE;
}

//	驱动TFI显示车型及金额
void CTfi::DisplayTFI()
{
	char tmpStr[14];
	memset(tmpStr,0,14);
	tmpStr[0]=0xa;
	tmpStr[1]=0x46;
	CTransInfo m_clsTrans;
	tmpStr[2]=m_clsTrans.BusClass();
	sprintf(tmpStr+3,"%.4d%.4d",m_clsTrans.Fare(),m_clsTrans.RemainMoney());
	tmpStr[11]=0xd;
	SendTFIData(tmpStr,12);
	bAutoTestFlag=FALSE;
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,TFI_TIMER,10000);
}

//	音量调节:假设缺省音量为8,每调用本函数一次,音量++或--
void CTfi::AdjustVolume(UCHAR nDirect)
{
	char tmpStr[6];
	memset(tmpStr,0,6);
	tmpStr[0]=0xa;
	tmpStr[1]=0x43;
	if(nDirect==VOLUME_INC){
		tmpStr[2]=0x31;
	} else {
		tmpStr[2]=0x30;
	}
	tmpStr[4]=0xd;
	SendTFIData(tmpStr,4);
	bAutoTestFlag=FALSE;
}

//	通知TFI当前为白天
void CTfi::ShowDay()
{
	char tmpStr[4];
	memset(tmpStr,0,4);
	tmpStr[0]=0xa;
	tmpStr[1]=0x4a;
	tmpStr[2]=0xd;
	SendTFIData(tmpStr,3);
}

//	通知TFI当前为晚上
void CTfi::ShowNight()
{
	char tmpStr[4];
	memset(tmpStr,0,4);
	tmpStr[0]=0xa;
	tmpStr[1]=0x4b;
	tmpStr[2]=0xd;
	SendTFIData(tmpStr,3);
}

//	自动测试TFI:开始自动测试时调用本函数
void CTfi::AutoTestTfi()
{
	bAutoTestFlag=TRUE;
	ProcessTimerOut();
}

//	TFI定时器超时程序:用于自动测试TFI时
void CTfi::ProcessTimerOut()
{
	if(bAutoTestFlag){
//	自动测试时循环显示数字0 - 9,定时器每超时一次,显示数字加1
		static char nValue=0;
		char tmpStr[14];
		memset(tmpStr,0,14);
		tmpStr[0]=0xa;
		tmpStr[1]=0x46;
		for(int i=2;i<11;i++){
			tmpStr[i]=nValue;
		}
		tmpStr[11]=0xd;
		SendTFIData(tmpStr,12);
		if(nValue>=10){
			nValue=0;
		} else {
			nValue++;
		}
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,TFI_TIMER,0);
	} else {
//	非自动测试时定时器超时,关闭TFI显示
		ClearTFI();
	}
}

//	通过多串口卡发送TFI数据
void CTfi::SendTFIData(char *param1,int length)
{
	try{
	sio_write(TFI_PORT,param1,length);
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CTfi::SendTFIData()出现异常\n");
	}
}

char * CSound::pSoundImage;		//存储合成后的声音文件
char * CSound::pClass;			//车型
UINT CSound::nClass;
char * CSound::pRMB;			//圆
UINT CSound::nRMB;
char * CSound::pNumber[14];		//数字
UINT CSound::nNumber[14];
char * CSound::pThankYou;		//祝您一路顺风
char * CSound::pFree;			//免费
UINT CSound::nFree;
char * CSound::pSpace;
UINT CSound::nSpace;
CSound::CSound()
{
}

//	声音初始化:将所有声音文件都由磁盘读入内存
//	声音文件存在于车道软件的安装路径下,本函数首先获取车道软件
//	的安装路径,然后合成声音文件的绝对路径
void CSound::Initial()
{
	char pFullPath[130],pDir[130];
	memset(pFullPath,0,130);
	theApp.GetFullPath(pFullPath);
	int nDirLen=strlen(pFullPath);
	memset(pDir,0,130);
	memmove(pDir,pFullPath,nDirLen);
//	车型声音文件名称为CLASS.WAV
	strcat(pFullPath,"CLASS.WAV");
	nClass=GetSoundLen(pFullPath);
	if(nClass!=0){
		if((pClass=new char[nClass])!=NULL){
			if(!LoadSound(pFullPath,pClass,nClass)){
				delete [] pClass;
				pClass=NULL;
				nClass=0;
			}
		}
	}
//	“圆”声音文件名称为RMB.WAV
	memset(pFullPath,0,130);
	sprintf(pFullPath,"%sRMB.WAV",pDir);
	nRMB=GetSoundLen(pFullPath);
	if(nRMB!=0){
		if((pRMB=new char[nRMB])!=NULL){
			if(!LoadSound(pFullPath,pRMB,nRMB)){
				delete [] pRMB;
				pRMB=NULL;
				nRMB=0;
			}
		}
	}
//	数字声音文件名称必须为x.WAV,其中“百”、“千”、“两”的声音文
//	件名称分别为11.WAV、12.WAV、13.WAV
	for(int i=0;i<14;i++){
		memset(pFullPath,0,130);
		sprintf(pFullPath,"%s%d.WAV",pDir,i);
		nNumber[i]=GetSoundLen(pFullPath);
		if(nNumber[i]!=0){
			if((pNumber[i]=new char[nNumber[i]])!=NULL){
				if(!LoadSound(pFullPath,pNumber[i],nNumber[i])){

⌨️ 快捷键说明

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