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

📄 laneinfo.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		fputs(tmpStr,fp1);					//收费车图象是否上传
		
		memset(tmpStr,0,40);
		if(strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE])
			tmpStr[0]='Y';
		else
			tmpStr[0]='N';
		strcat(tmpStr,"               ModifyInvoice\n");
		fputs(tmpStr,fp1);					//电脑票收费员是否可修改
	
		memset(tmpStr,0,40);
		if(strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN])
			tmpStr[0]='Y';
		else
			tmpStr[0]='N';
		strcat(tmpStr,"               AutoRail\n");
		fputs(tmpStr,fp1);					//自动栏杆是否自动下落
	
		fclose(fp1);
	} else {
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新车道参数文件失败\n");
	}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneParam::SaveLaneParam()出现异常\n");
	}
}

//	从车道配置文件中读取车道参数
void CLaneInfo::ReadLaneParam()
{
	try{
		FILE *fp1;
		char tmpStr[40];		
		if((fp1=fopen(PARAMVS,"r"))!=NULL){
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//车道号码
			memmove(strLaneParam+PARAM_LANE_NO,tmpStr,2);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//车道地址
			memmove(strLaneParam+PARAM_LANE_ADDR,tmpStr,2);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//收费站代码
			memmove(strLaneParam+PARAM_PLAZA_NO,tmpStr,2);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//本地端口号
			memmove(strLaneParam+PARAM_LOCAL_PORT,tmpStr,4);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//消息服务器IP地址
			memmove(strLaneParam+PARAM_MESSAGE_IP,tmpStr,15);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//消息服务器端口号
			memmove(strLaneParam+PARAM_MESSAGE_PORT,tmpStr,4);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//图像服务器IP地址
			memmove(strLaneParam+PARAM_PICTURE_IP,tmpStr,15);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//图像压缩质量
			memmove(strLaneParam+PARAM_COMPRESS_QUALITY,tmpStr,3);
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//是否输入发票号码
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_INPUT_INVOICE]=tmpStr[0];
			memset(tmpStr,0,40);			
			fgets(tmpStr,40,fp1);			//是否输入班次号码
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_SHIFT_NO]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//是否允许自动关机
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_SHUT_DOWN]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);			//是否使用RAM盘
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_RAM_DISK]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//是否检查发票起、止号
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_CHECK_INVOICE]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//是否预先打印发票
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_PRE_PRINT]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//车道数据备份时间
			memmove(strLaneParam+PARAM_BACKUP_TIME,tmpStr,2);
		
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//是否允许重打发票
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_REPEAT_INVOICE]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//违章模式
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_VIOLATE_MODE]=tmpStr[0];
		
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//四个班次上班交班时间
			memmove(strLaneParam+PARAM_FOUR_SHIFT_TIME,tmpStr,16);	
			
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//月票车是否输入车牌?
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_MONTH_CAR_NO]=tmpStr[0];
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//收费车图象是否上传?
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_NORMAL_CAR_PICTURE]=tmpStr[0];
			
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//电脑票收费员是否可修改?
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE]=tmpStr[0];
			
			memset(tmpStr,0,40);
			fgets(tmpStr,40,fp1);		//自动栏杆是否自动下落?
			if(tmpStr[0]=='Y')
				tmpStr[0]=TRUE;
			else
				tmpStr[0]=FALSE;
			strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN]=tmpStr[0];
			
			memset(tmpStr,0,40);

			fclose(fp1);
		
		} else {
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"车道参数文件不存在,使用缺省参数\n");
			DefaultParam();
		}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneParam::ReadLaneParam()出现异常\n");
		DefaultParam();
	}
}

//	判断操作员身份是否合法:非法操作员返回-1,收费员返回0,维修员
//	返回1
int CLaneInfo::CheckID(ULONG ID,ULONG nPassword)
{
	char tmpStr[20],tmpB[10];
	memset(tmpStr,0,20);
	memset(tmpB,0,10);

	sprintf(tmpStr,"%.5d%.6d",ID,nPassword);
	sprintf(tmpB,"%.5d",ID);	

//	首先判断ID是否位于黑名单中:若黑名单不为空、长度合法且
//	当前ID位于黑名单中,返回-1
	if(strBlackList!=NULL){
		if(strlen(strBlackList)>=5){
			if(SearchString(strBlackList,tmpB,5)){				
				return -1;
			}
		}
	}
//	其次判断操作员工号及密码是否位于操作员表中:若操作员表为空
//	或操作员表长度错误或当前ID及密码不位于该表中,返回-1
	if(strCollectList==NULL) return -1;	
	if(strlen(strCollectList)<12) return -1;
	sprintf(tmpStr+11,"%d",0);	//收费员
	if(SearchString(strCollectList,tmpStr,12)) return 0;
	sprintf(tmpStr+11,"%d",1);	//维修员
	if(SearchString(strCollectList,tmpStr,12)) return 1;
	return -1;
}

//	核对黑名单违章车:车牌位于黑名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckBlackCar(char *pNO)
{
	char tmpStr[20];
    memset(tmpStr,0,20);
    memset(tmpStr,' ',10);
	memmove(tmpStr+10-strlen(pNO),pNO,strlen(pNO));
	if(strBlackCarList==NULL){		
		return FALSE;
	}
	if(strlen(strBlackCarList)<10){		
		return FALSE;
	}
	if(!SearchString(strBlackCarList,tmpStr,10)){	
		return FALSE;
	}
	return TRUE;
}

//	核对月票车:车牌位于月票车名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckMonthCar(char *pNO)
{
	char tmpStr[20];
    memset(tmpStr,0,20);
    memset(tmpStr,' ',10);
	memmove(tmpStr+(10-strlen(pNO)),pNO,strlen(pNO));
	if(strMonthCarList==NULL){		
		return FALSE;
	}
	if(strlen(strMonthCarList)<10){		
		return FALSE;
	}
	if(!SearchString(strMonthCarList,tmpStr,10))
	{	
		return FALSE;
	}
	return TRUE;
}

//	核对免征车:车牌位于免征车名单中返回TRUE;否则返回FALSE
BOOL CLaneInfo::CheckFreeCar(char *pNO)
{
	char tmpStr[20];
    memset(tmpStr,0,20);
    memset(tmpStr,' ',10);
	memmove(tmpStr+(10-strlen(pNO)),pNO,strlen(pNO));
	if(strFreeCarList==NULL){		
		return FALSE;
	}
	if(strlen(strFreeCarList)<10){		
		return FALSE;
	}
	if(!SearchString(strFreeCarList,tmpStr,10)){	
		return FALSE;
	}
	return true;
}

//	根据给定的车型搜索相应的价格
int CLaneInfo::SearchFare(UCHAR nClass,UCHAR nType)
{
	if(nType!='1') return 0; //非收费车返回0
	if(strRMB==NULL){
		SendMessage(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"价格文件错误\n");
		return 999;
	}
	UINT nPosition=(nClass-'1')*4+12;	//扣除生效日期及时间
	if(strlen(strRMB)<nPosition+4){
		SendMessage(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"价格文件或入口站序号错误\n");
		return 999;
	}
	char tmpStr[5];
	memset(tmpStr,0,5);
	memmove(tmpStr,strRMB+nPosition,4);
	return atoi(tmpStr);
}

//	用二分法查找字符串
BOOL CLaneInfo::SearchString(char *SourceStr, char *ObjectStr, int Length)
{
	char tmpStr[50];
	unsigned int LowPosition=0;
	unsigned int HighPosition=strlen(SourceStr);
	int StrCount,CurrentPosition,CompareResult;
	do{
		StrCount=(HighPosition-LowPosition)/Length;	//共有多少组字符串
		CurrentPosition=(StrCount/2)*Length+LowPosition;//定位到源串中间
		memset(tmpStr,0,50);
		memmove(tmpStr,SourceStr+CurrentPosition,Length);
		CompareResult=Compare(ObjectStr,tmpStr,Length);
		if(CompareResult>0){
			LowPosition=CurrentPosition;
		} else {
			HighPosition=CurrentPosition;
		}
	} while((CompareResult!=0)&&(StrCount>1));
	if(CompareResult==0){
		return TRUE;
	} else {
		return FALSE;
	}
}

//	用二分法比较字符串,若源字符串中有匹配的字符串,将匹配的字符
//	串在目标字符串中返回
BOOL CLaneInfo::FindString(char *SourceStr,char *ObjectStr,int nCompareLen,int nRealLen)
{
	char tmpStr[50];
	unsigned int LowPosition=0;
	unsigned int HighPosition=strlen(SourceStr);
	int StrCount,CurrentPosition,CompareResult;
	do{
//	计算有多少组字符串需要比较
		StrCount=(HighPosition-LowPosition)/nRealLen;
//	定位到要比较字符串的中间位置
		CurrentPosition=(StrCount/2)*nRealLen+LowPosition;
		memset(tmpStr,0,50);
//	取出中间位置的字符串
		memmove(tmpStr,SourceStr+CurrentPosition,nRealLen);
//	比较其中部分字符串
		CompareResult=Compare(ObjectStr,tmpStr,nCompareLen);
		if(CompareResult>0){
			LowPosition=CurrentPosition;
		} else {
			HighPosition=CurrentPosition;
		}
	} while((CompareResult!=0)&&(StrCount>1));
	if(CompareResult==0){
//	返回所有匹配的字符串
		memmove(ObjectStr,tmpStr,nRealLen);
		return TRUE;
	} else {
		return FALSE;
	}
}

//	比较两个字符串的大小
int CLaneInfo::Compare(char *ObjectStr, char *SourceStr, int Length)
{
	for(int i=0;i<Length;i++,ObjectStr++,SourceStr++){
		if(*ObjectStr==*SourceStr) continue;
		if(*ObjectStr<*SourceStr) return -1;
		if(*ObjectStr>*SourceStr) return 1;
//		if(*SourceStr==0x20) continue;
	}
	return 0;
}

//	车道参数配置文件不存在时使用缺省配置参数
void CLaneInfo::DefaultParam()
{
	SetLaneNO("01");
	LaneAddr("01");	
	SetPlazaNO("01");		
	OwnNO("01");
	LocalPort("6767");
	SetMessageIP("202.202.202.108");
	MessagePort("6768");
	SetPictureIP("202.202.202.109");
	PictureQuality("085");		
	RepeatInvoice('Y');			//缺省允许按“重打票”键
	InputInvoice('Y');			//缺省必须输入发票号
	InputShiftNO('Y');			//缺省必须输入班次
	ShutDown('N');				//缺省禁止自动关机
	bCheckInvoice('Y');			//缺省检查发票起、止号
	bPrePrint('Y');				//缺省预先打印发票
	SetViolateModeFlag('N');	//缺省违章模式
	BackupTime("30");
	
	memmove(strLaneParam+PARAM_FOUR_SHIFT_TIME,"0200080014002000",16);//缺省四个班次上班交班时间				
	strLaneParam[PARAM_MONTH_CAR_NO]=TRUE;            //缺省月票车是输入车牌
	strLaneParam[PARAM_NORMAL_CAR_PICTURE]=TRUE;      //缺省收费车图象是上传?
	strLaneParam[PARAM_COMPUTER_INVOICE_CHANGE]=TRUE; //缺省电脑票收费员否可修改?
	strLaneParam[PARAM_AUTORAIL_AUTO_SHUTDOWN]=TRUE;  //缺省自动栏杆是自动下落

	SaveLaneParam();
}

//	设置导致程序退出的错误信息
void CLaneInfo::SetErrorInfo(char *pStr)
{
	memset(strErrorInfo,0,80);
	memmove(strErrorInfo,pStr,strlen(pStr));
}

//	获取导致程序退出的错误信息
void CLaneInfo::GetErrorInfo(char *pRetStr)
{
	memmove(pRetStr,strErrorInfo,strlen(strErrorInfo));
}

//	设置运行参数文件齐全标志
void CLaneInfo::FileReadyFlag(UINT nIndex,BOOL value)
{
	bFileReadyFlag[nIndex]=value;
}

//	返回运行参数文件齐全标志
BOOL CLaneInfo::FileReadyFlag(UINT nIndex)
{
	return bFileReadyFlag[nIndex];
}

//	处理时间:每分钟前三秒检查价格文件生效时间,若新价格生效日期已经
//	到达,则用新价格表替换当前价格表
void CLaneInfo::ProcessTime()
{
	CTimeInfo m_clsTime;
	UINT nSecond=m_clsTime.GetSecond();
	if((nSecond>=0)&&(nSecond<=3)){
		char strNowTime[14];
		memset(strNowTime,0,14);
		sprintf(strNowTime,"%.4d%.2d%.2d%.2d%.2d",m_clsTime.GetYear(),
			m_clsTime.GetMonth(),m_clsTime.GetDay(),
			m_clsTime.GetHour(),m_clsTime.GetMinute());
		if((strRMB_New!=NULL)&&(strlen(strRMB_New)>12)){
			if(strncmp(strNowTime,strRMB_New,12)>=0){
//	当前时间大于新价格生效时间,用新价格
				UpdateNewFare();
			}
		}
		
	}
}

//	用新价格表更新当前价格表
void CLaneInfo::UpdateNewFare()
{
	try{
		if(strRMB_New!=NULL){
			if(strRMB!=NULL){
				delete [] strRMB;
				strRMB=NULL;
			}
			UINT nLen=strlen(strRMB_New);
			strRMB=new char[nLen+2];
			if(strRMB==NULL){
				PostMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL_QUIT,ERROR_NO_ENOUGH_MEMORY,0);
				return;
			}
			memset(strRMB,0,nLen+2);
			memmove(strRMB,strRMB_New,nLen);
			if(strRMB_New!=NULL){
				delete [] strRMB_New;
				strRMB_New=NULL;
			}
			FILE *fp1;
			if((fp1=fopen(TFRMB_FILE,"w"))==NULL){
				SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新价格文件失败\n");
				return;
			}
			UINT nPosition=0;
			nLen=strlen(strRMB);
			if(nLen<=12) return;
			fwrite(strRMB,8,1,fp1);				//生效日期
			fputc('\n',fp1);
			nPosition+=8;
			fwrite(strRMB+nPosition,4,1,fp1);	//生效时间
			fputc('\n',fp1);
			nPosition+=4;
			UINT nReadLength=4;
			while(1){
				if(nPosition>=nLen) break;
				fwrite(strRMB+nPosition,nReadLength,1,fp1);
				fputc('\n',fp1);
				nPosition+=nReadLength;
			}
			fclose(fp1);
			remove(TFRMB_NEW);
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,TFRMB_INDEX);
		}
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CLaneInfo::UpdateNewFare()出现异常\n");
	}
}

⌨️ 快捷键说明

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