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

📄 record.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					nLastYear=m_clsTime.GetDayCount()+365-m_clsLane.BackupTime();
				}
			} else {
				nLastYear=m_clsTime.GetYear();
				nLastDayCount=m_clsTime.GetDayCount()-m_clsLane.BackupTime();
			}
			nLastYear=nLastYear%100;
			char strFileName[PICTURE_NAME_LEN];
			memset(strFileName,0,PICTURE_NAME_LEN);
			if(m_clsLane.RAM_Disk()){
				sprintf(strFileName,"%s\\%.2d%.3d",TEMP_PATH,nLastYear,nLastDayCount);
			} else {
				sprintf(strFileName,"%s\\%.2d%.3d",INFO_PATH,nLastYear,nLastDayCount);
			}
			remove(strFileName);	//删除规定日期前的索引文件
			memset(strFileName,0,PICTURE_NAME_LEN);
			sprintf(strFileName,"%s\\%.2d%.2d%.3d.?",INFO_PATH,
				m_clsLane.LaneNO(),nLastYear,nLastDayCount);
			DeleteOldFile(INFO_PATH,strFileName);//删除规定日期前的信息文件
			memset(strFileName,0,PICTURE_NAME_LEN);
			sprintf(strFileName,"%s\\Log%.2d%.3d.txt",LOG_PATH,nLastYear,nLastDayCount);
			remove(strFileName);	//删除规定日期前的运行日志文件
			memset(strFileName,0,PICTURE_NAME_LEN);
			sprintf(strFileName,"%s\\%.2d%.2d%.3d????????????",PICTURE_PATH,
				m_clsLane.LaneNO(),nLastYear,nLastDayCount);
			DeleteOldFile(PICTURE_PATH,strFileName);//删除规定日期前的图片文件
//	每天零点重新初始化视频捕获卡。特别地:实际上该功能不应放到本类中
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CAPTURE_WINDOW,RESET_CAPTURE,0);
		} else {
			nRecordYear=m_clsTime.GetYear();
			nRecordMonth=m_clsTime.GetMonth();
			nRecordDay=m_clsTime.GetDay();
			nRecordDayCount=m_clsTime.GetDayCount();
			nRecordHour=m_clsTime.GetHour()-1;
//	特别地:小时消息的生成时间总为整点		
			nRecordSecond=0;
			nRecordMinute=0;
			RecordMH();
			CStatInfo m_clsStat;
			m_clsStat.ClearMh();

		}
		nHasRecordHour=m_clsTime.GetHour();
		nHasRecordDate=nNowDate;
	}
}

//	返回消息当前的流水号:首先从文件中读取当前序号,所读取序号++后
//	再写回文件中。
//	特别地:获取索引文件时不能使用当前时间,否则再跨天生成MH消息时
//			消息序号会出错
UINT CRecord::MesgHeadIndex(UINT nType,int nYear,int nDayCount)
{
	char strFileName[35];
	memset(strFileName,0,35);
	CLaneInfo m_clsLane;
	if(m_clsLane.RAM_Disk()){
		sprintf(strFileName,"%s\\%.2d%.3d",TEMP_PATH,nYear,nDayCount);
	} else {
		sprintf(strFileName,"%s\\%.2d%.3d",INFO_PATH,nYear,nDayCount);
	}
//	首先从索引文件中读取当前索引号,将该号码加1后重新写回到文件中并
//	返回加1后的序号。若索引文件不存在,则认为当前序号为1
	FILE *fp1;
	UINT nMesgHeadIndex[MESSAGE_COUNT];
	if((fp1=fopen(strFileName,"rb"))!=NULL){
		if(fread(&nMesgHeadIndex,sizeof(UINT),MESSAGE_COUNT,fp1)!=MESSAGE_COUNT){
			memset(&nMesgHeadIndex,0,sizeof(UINT)*MESSAGE_COUNT);
		}
		fclose(fp1);
	} else {
		memset(&nMesgHeadIndex,0,sizeof(UINT)*MESSAGE_COUNT);
	}
	nMesgHeadIndex[nType]++;
//	将新序号改写回序号文件
	if((fp1=fopen(strFileName,"wb"))!=NULL){
		fwrite(&nMesgHeadIndex,sizeof(UINT),MESSAGE_COUNT,fp1);
		fclose(fp1);
	}
	return nMesgHeadIndex[nType];
}

//	删除40天前的旧文件
void CRecord::DeleteOldFile(char *pPath, char *pFileName)
{
	struct _finddata_t FileInfo;
	long hFile;
	if((hFile=_findfirst(pFileName,&FileInfo))!=-1L){
		char tmpStr[PICTURE_NAME_LEN];
		memset(tmpStr,0,PICTURE_NAME_LEN);
		sprintf(tmpStr,"%s\\%s",pPath,FileInfo.name);
		remove(tmpStr);
		while(_findnext(hFile,&FileInfo)==0){
			memset(tmpStr,0,PICTURE_NAME_LEN);
			sprintf(tmpStr,"%s\\%s",pPath,FileInfo.name);
			remove(tmpStr);
		}
		_findclose(hFile);
	}
}

//返回将要存储的JPEG文件的名称
void CRecord::GetPictureName(char *pRetStr)
{
//	设置抓拍消息内容
//	特别地:图像抓拍消息中无消息头
	CLaneInfo m_clsLane;
	CTimeInfo m_clsTime;
	CStatInfo m_clsStat;
	CTransInfo m_clsTrans;
	
	sprintf(pRetStr+P_TRANS_INDEX,"%.5u%",		//图像消息流水号
		MesgHeadIndex(MESSAGE_PICTURE,m_clsTime.GetYear()%100,m_clsTime.GetDayCount()));
	sprintf(pRetStr+P_PLAZA_NO,"%.2d",m_clsLane.PlazaNO());
	sprintf(pRetStr+P_DATE,"%.2d%.2d%.2d%",m_clsTime.GetYear()%100,
		m_clsTime.GetMonth(),m_clsTime.GetDay());
	sprintf(pRetStr+P_TIME,"%.2d%.2d%.2d",m_clsTime.GetHour(),
		m_clsTime.GetMinute(),m_clsTime.GetSecond());
	sprintf(pRetStr+P_SHIFT_NO,"%c",m_clsStat.ShiftNO());
	sprintf(pRetStr+P_LANE_NO,"%.2d",m_clsLane.LaneNO());
	sprintf(pRetStr+P_COLLECT_NO,"%.5u",m_clsStat.CollectNO());
	sprintf(pRetStr+P_BUS_TYPE,"%c",m_clsTrans.BusType());
	sprintf(pRetStr+P_BUS_CLASS,"%c",m_clsTrans.BusClass());
	pRetStr[P_VIOLATE]=m_clsTrans.ViolateType();
	pRetStr[P_MODIFY]=m_clsTrans.ModifyType();
//	设置车牌:不足十位则在前面加空格;
	char tmpStr[12];
	memset(tmpStr,0,12);
	m_clsTrans.GetBusNO(tmpStr);
	memset(pRetStr+P_BUS_NO,' ',10);
	memmove(pRetStr+P_BUS_NO+10-strlen(tmpStr),tmpStr,strlen(tmpStr));
//	设置价格:价格在叠加字符时需要,但上传文件时并不需要
	sprintf(pRetStr+P_FARE,"%.4d",m_clsTrans.Fare());
}

//	记录图象抓拍消息
//	特别地:生成图像文件时的所需的信息内容多于实际需要消息,因此
//			此处应将多于的信息(比如:价格)删除
void CRecord::RecordP(char *pIndexFile,char *pDataFile,char *pStr)
{
	try{
//	实际上:图像压缩时已经扣除了多余的信息,因此不处无须再修改文件名
//	用新的文件名代替旧的文件名
//		char tmpFileName[PICTURE_NAME_LEN];
//		memset(tmpFileName,0,PICTURE_NAME_LEN);
//		memmove(tmpFileName,pStr,strlen(pStr));
//	扣除价格等不再需要的信息
//		int nLen=strlen(PICTURE_PATH)-4;	//价格信息占用4个字节
//		rename(pStr,tmpFileName);
		FILE *fp1;
		if((fp1=fopen(pDataFile,"a"))==NULL){
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"追加IMG_TRANS文件失败\n");
			return;
		}
		fputs(pStr,fp1);
		fputc('\n',fp1);
		unsigned long nLength=ftell(fp1);
		fclose(fp1);
		AdjustFilePointer(pIndexFile,nLength);
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CRecord::RecordP()出现异常\n");
	}
}

//	寻找符合重传条件的文件名
void CRecord::CheckFileRange(unsigned long StartTime,unsigned long EndTime, char *FileName)
{
	char tmpStr[PICTURE_NAME_LEN];
	memset(tmpStr,0,PICTURE_NAME_LEN);
	memmove(tmpStr,FileName+5,3);
	int FileDayCount=atoi(tmpStr);			//文件名的天数
	memset(tmpStr,0,PICTURE_NAME_LEN);
	memmove(tmpStr,FileName+8,2);
	int FileHour=atoi(tmpStr);				//文件名的小时数
	memset(tmpStr,0,PICTURE_NAME_LEN);
	memmove(tmpStr,FileName+10,2);
	int FileMinute=atoi(tmpStr);			//文件名的分钟数
	memset(tmpStr,0,PICTURE_NAME_LEN);
	memmove(tmpStr,FileName+12,2);
	int FileSecond=atoi(tmpStr);			//文件名的秒数
	unsigned long FileTime=FileDayCount*24*60*60L
		+FileHour*60*60L+FileMinute*60L+FileSecond;
	if((FileTime>=StartTime)&&(FileTime<=EndTime)){
		memset(tmpStr,0,PICTURE_NAME_LEN);
		sprintf(tmpStr,"%s\\%s",PICTURE_PATH,FileName);
		CLaneInfo m_clsLane;
		if(m_clsLane.RAM_Disk()){
			RecordP(PRIORITY_INDEX,PRIORITY_TRANS,tmpStr);
		} else {
			RecordP(PRI_INDEX_1,PRI_TRANS_1,tmpStr);
		}
	}
}

//	在规定时间前1个小时内出现大班变化或在规定时间到达时统计日期
//	改变。比如:规定时间为每天8:30,若7:30 ~ 8:30之间有大班变化,
//	则以变化时刻为限,该时间之前的统计日期为上一天,该时间之后的
//	统计日期为当天;若7:30 ~ 8:30之间无大班变化,在8:30时自动交
//	班信息、MH消息及MJ消息,同时将消息索引及交易流水号清零
//	若切换时间非整点,该小时会产生2条MH消息,收费站软件负责合并
//	这两条MH消息
//	所谓的大班变化是指当前收费员输入的班次和上一班的班次不同,若
//	连续两班班次相同,则认为是同一个大班内的小班,收费站软件负责
//	将多个小班合并为一个大班
void CRecord::CheckStatTime()
{
//	首先获取当前时间,若当前时间大于规定的交班时间,统计日期为当
//	前日期,当前日期标志bNowDayFlag置位,切换标志bChangeFlag复位
	CLaneInfo m_clsLane;
	//UINT nChangeStatTime=m_clsLane.ChangeStatTime();
	CTimeInfo m_clsTime;
	UINT nNowTime=m_clsTime.GetHour()*100+m_clsTime.GetMinute();
/*
	if(nChangeStatTime<nNowTime){
		bNowDayFlag=TRUE;
		bChangeFlag=FALSE;
		return;
	}
	*/

//	若位于切换时间且已经切换统计日期,直接返回,此语句的作用是防
//	止车道软件在切换时刻每秒生成一条MH信息
//	if((nChangeStatTime==nNowTime)&&(bNowDayFlag)) return;
//	若当前时间小于规定时间前一小时,统计日期为上一天的日期
//	特别地:如果规定时间在零点,其前一小时应为23点
	UINT nLastTime=0;
	//if(nChangeStatTime<=100){		//规定时间在1点以前
	//	nLastTime=2300+nChangeStatTime%100;	//上一小时为23点
//	} else {
	//	nLastTime=nChangeStatTime-100;		//扣除一小时
	//}
	bNowDayFlag=FALSE;
	if(nNowTime<nLastTime){
		bChangeFlag=FALSE;
		return;
	}
	bChangeFlag=TRUE;
}

//	返回统计日期所对应的天数:车道软件存储备份消息和获取消息索引
//	时使用每年的天数,而统计日期使用每月的天数,本函数负责将统计
//	日期转换为对应的天数
UINT CRecord::StatDayCount()
{
//	若统计日期等于当前日期,返回当前的天数;否则,返回昨天的天数
	CTimeInfo m_clsTime;
//	if(m_clsTime.GetDay()==StatDate()) return m_clsTime.GetDayCount();
//	否则,返回昨天的天数
//	否则,返回前一天的时间:首先获取UNIX时间,该时间减去一天的
//	总秒数即为昨天此刻的UNIX时间,再将该时间转换为年、月、日格
//	式后返回对应的天数
	long nLastDay=(long)m_clsTime.GetUnixTime()-24*60*60L;
	struct tm *tmpTm;					//入口时间
	tmpTm=localtime(&nLastDay);
	return tmpTm->tm_yday+1;	
}

//	设置下传文件索引
void CRecord::AkIndex(UCHAR nIndex)
{
	chAkIndex=nIndex;	
}

//	返回下传文件索引
UCHAR CRecord::AkIndex()
{
	return chAkIndex;
}

//	设置下传文件状态
void CRecord::AkStatus(UCHAR status)
{
	chAkStatus=status;
}

//	返回下传文件状态(0:失败;1:成功)
UCHAR CRecord::AkStatus()
{
	return chAkStatus;
}


//	设置设备索引 01:抓拍线圈 02:检测线圈 03:打印机
void CRecord::DeviceIndex(UCHAR index)
{
	iDeviceIndex=index;	
}

//	返回设备索引
UCHAR CRecord::DeviceIndex()
{
	return iDeviceIndex;
}

//	设置设备状态 0: 正常  1:出错
void CRecord::DeviceStatus(UCHAR status)
{
	iDeviceStatus=status;
}

//	返回设备状态
UCHAR CRecord::DeviceStatus()
{
	return iDeviceStatus;
}

//	设置记录时间
void CRecord::SetRecordDate(UINT Year,UINT DayCount,UINT Minutes,UINT Seconds)
{
	nRecordYear=Year;
	nRecordDayCount=DayCount;
	nRecordMinute=Minutes;
	nRecordSecond=Seconds;
}

⌨️ 快捷键说明

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