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

📄 picturenet.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		if((done1!=-1L)&&(done2!=-1L)){	//若有图片需要发送
			_findclose(done1);
			_findclose(done2);
			if(RAM_Flag()){
				strcpy(IndexFile,IMG_INDEX);
				strcpy(DataFile,IMG_TRANS);
			} else {
				strcpy(IndexFile,IMG_INDEX_1);
				strcpy(DataFile,IMG_TRANS_1);
			}
		} else {
			if(done1!=-1L)
				_findclose(done1);
			if(done2!=-1L)
				_findclose(done2);
			if(RAM_Flag()){
				remove(IMG_INDEX);
				remove(IMG_TRANS);		//无图片上传,30秒后发查询命令
			} else {
				remove(IMG_INDEX_1);
				remove(IMG_TRANS_1);
			}
			SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,PICTURE_QUERY_TIMER,0);
			return;
		}
	}
	FILE *fp1,*fp2;
	fp1=fopen(DataFile,"r");
	fp2=fopen(IndexFile,"r");
	char tmpStr[PICTURE_NAME_LEN];
	memset(tmpStr,0,PICTURE_NAME_LEN);
	fgets(tmpStr,10,fp2);
	unsigned long TotalPointer=atol(tmpStr);
	fgets(tmpStr,10,fp2);
	memset(tmpStr,0,PICTURE_NAME_LEN);
	fgets(tmpStr,10,fp2);
	unsigned long CurrentPointer=atol(tmpStr);
	fclose(fp2);
	int Len=0;
	while(1){
		fseek(fp1,CurrentPointer,0);//找到当前要发送文件名的位置
		memset(tmpStr,0,PICTURE_NAME_LEN);
		if(fgets(tmpStr,PICTURE_NAME_LEN,fp1)==0) break;
									//读取一行数据
		Len=strlen(tmpStr)-1;
		if(Len>0) break;			//读到合法字符,跳出循环
		CurrentPointer=ftell(fp1);	//否则,重新读取
	}
	memset(PictureFileName,0,PICTURE_NAME_LEN);
									//准备存储要发送的文件名
	memmove(PictureFileName,tmpStr,Len);
	unsigned long NextPointer=ftell(fp1);
	fclose(fp1);
	if((fp2=fopen(IndexFile,"w"))!=NULL){
		fprintf(fp2,"%ld\n",TotalPointer);
		fprintf(fp2,"%ld\n",NextPointer);
		fprintf(fp2,"%ld\n",CurrentPointer);
		fclose(fp2);
	} else {
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新IndexFile文件失败(CheckPictureFile)\n");
	}
	bPointEquFlag=FALSE;
	Packet_S();
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CPictureNet::CheckPictureFile()出现异常\n");
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_STARTUP_TIMER,PICTURE_QUERY_TIMER,0);
	}
}

/* 发送图片的S帧 */
void CPictureNet::Packet_S()
{
//	首先判断要发送的图片文件是否存在,若不存在,跳过该图片
	struct _finddata_t FileInfo;
	long hFile;
	if((hFile=_findfirst(PictureFileName,&FileInfo))==-1L){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"要发送的图片文件不存在\n");
		ProcessFileError();
		return;
	}
	long nFileLen=FileInfo.size;
	_findclose(hFile);
//	S帧数据格式:命令字(1)、'S'、信息(41)、文件长度(4),其中41位信息即为P消息
	unsigned long FileLen=FileInfo.size;
	unsigned char uChMessageType;		//生成命令字
	uChMessageType=(uChLocalReceiveIndex<<5)+(uChLocalSendIndex<<1);
	char tmpStr[PICTURE_NAME_LEN];
	memset(tmpStr,0,PICTURE_NAME_LEN);
	tmpStr[0]='S';
	int nLen=strlen(PictureFileName)-strlen(PICTURE_PATH)-1;
	if(nLen<0){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"发送指针文件中记录的图像文件名称错误\n");
		ProcessFileError();
		return;
	}
	memmove(tmpStr+1,PictureFileName+strlen(PICTURE_PATH)+1,nLen);
	tmpStr[nLen+1]=nFileLen/0x1000000;
	nFileLen=nFileLen%0x1000000;
	tmpStr[nLen+2]=nFileLen/0x10000;
	nFileLen=nFileLen%0x10000;
	tmpStr[nLen+3]=nFileLen/0x100;
	tmpStr[nLen+4]=nFileLen%0x100;
	SendPackage(uChMessageType,tmpStr,nLen+5);
	uChLocalSendIndex=(uChLocalSendIndex+1)%8;	//本地发送序号++
	NoAckCount=0;
	FileCheckSum=0;					//图片文件校验和为0
	FrameIndex=-1;					//帧序号不包括S帧
	if((FileLen%PICTURE_DATA_LEN)==0)
		TotalFrame=FileLen/PICTURE_DATA_LEN;
	else
		TotalFrame=FileLen/PICTURE_DATA_LEN+1;
}

//	发送图片的F帧
void CPictureNet::Packet_F()
{
	try{
//	首先判断要发送的图片文件是否存在,若不存在,跳过该图片
	struct _finddata_t FileInfo;
	long hFile;
	if((hFile=_findfirst(PictureFileName,&FileInfo))==-1L){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"要发送的图片文件不存在\n");
		ProcessFileError();
		return;
	}
	_findclose(hFile);
//	F帧数据格式:命令字(1)、'F'、文件名(31)、当前帧序号(1)、图像
//	文件数据,其中文件名31字节为P消息扣除车牌号后的字节
	unsigned long FileLen=FileInfo.size;
	unsigned char uChMessageType;
	uChMessageType=(uChLocalReceiveIndex<<5)+(uChLocalSendIndex<<1);
	char tmpStr[FRAME_LEN];
	memset(tmpStr,0,FRAME_LEN);
	tmpStr[0]='F';
//	扣除10字节车牌
	int nLen=strlen(PictureFileName)-strlen(PICTURE_PATH)-11;
	if(nLen<0){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"发送指针文件中记录的图像文件名称错误\n");
		ProcessFileError();
		return;
	}
	memmove(tmpStr+1,PictureFileName+strlen(PICTURE_PATH)+1,nLen);
	if(FrameIndex<0) FrameIndex=0;
	tmpStr[P_BUS_NO+1]=FrameIndex+1;	//帧序号
	FILE *fp1;
	int DataLen=P_BUS_NO+2;
	fp1=fopen(PictureFileName,"rb");
	unsigned long Position=FrameIndex*PICTURE_DATA_LEN;
	fseek(fp1,Position,0);		//移到要发送的位置
	if(FrameIndex+1<TotalFrame){			//非最后一帧图片
		fread(tmpStr+DataLen,PICTURE_DATA_LEN,1,fp1);//读取一帧数据
		DataLen=DataLen+PICTURE_DATA_LEN;
	} else {
		fread(tmpStr+DataLen,FileLen-Position,1,fp1);
		DataLen=DataLen+FileLen-Position;
	}
	fclose(fp1);
	for(int i=P_BUS_NO+2;i<DataLen;i++){
		FileCheckSum=UpDateCRC(FileCheckSum,tmpStr[i]);
	}
	SendPackage(uChMessageType,tmpStr,DataLen);
	uChLocalSendIndex=(uChLocalSendIndex+1)%8;	//本地发送序号++
	NoAckCount=0;
	}
	catch(...){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CPictureNet::Packet_F()出现异常\n");
		ProcessFileError();
	}
}

//	发送图片的F帧
void CPictureNet::Packet_E()
{
	unsigned char uChMessageType;
	uChMessageType=(uChLocalReceiveIndex<<5)+(uChLocalSendIndex<<1);
	char tmpStr[PICTURE_NAME_LEN];
	memset(tmpStr,0,PICTURE_NAME_LEN);
	tmpStr[0]='E';
//	扣除10字节车牌
	int nLen=strlen(PictureFileName)-strlen(PICTURE_PATH)-1;
	if(nLen<0){
		SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"发送指针文件中记录的图像文件名称错误\n");
		ProcessFileError();
		return;
	}
	memmove(tmpStr+1,PictureFileName+strlen(PICTURE_PATH)+1,nLen);
	tmpStr[P_BUS_NO+1]=TotalFrame;
	tmpStr[P_BUS_NO+2]=(FileCheckSum>>8)&0xff;
	tmpStr[P_BUS_NO+3]=FileCheckSum&0xff;
	SendPackage(uChMessageType,tmpStr,P_BUS_NO+4);
	uChLocalSendIndex=(uChLocalSendIndex+1)%8;	//本地发送序号++
	NoAckCount=0;
}

//	图片文件错误:跳过当前文件
void CPictureNet::ProcessFileError()
{
	if(RAM_Flag()){
		if(PriorityFlag){
			AdjustSendPointer(PRIORITY_INDEX,PRIORITY_TRANS);
		} else {
			AdjustSendPointer(IMG_INDEX,IMG_TRANS);
		}
	} else {
		if(PriorityFlag){
			AdjustSendPointer(PRI_INDEX_1,PRI_TRANS_1);
		} else {
			AdjustSendPointer(IMG_INDEX_1,IMG_TRANS_1);
		}
	}
	Transmit_Query();
}

//	图像服务器对查询命令的响应
void CPictureNet::ResponseQuery(unsigned char *pChData, int nDataLen)
{
//	帧格式:I Q 查询状态(S) 起始时间(YYDDDHHMMSS) 终止时间(YYDDDHHMMSS) 
//	收费员号(XXXX) 事件类型(S) 其中若XXXX为"0000"表示所有收费员,S为'0'表示所有类型
	SendMessage(theApp.m_pMainWnd->m_hWnd,WM_CLOSE_TIMER,PICTURE_QUERY_TIMER,0);
	if(pChData[5]=='1'){			//要求上传图片?
//		CRecord m_clsRecord;
//		m_clsRecord.SearchPictureFile((char *)pChData+6);
	}
	CheckPictureFile();				//判断是否有图片文件需要上传
}

/* 若接收的所有帧正确,调整发送文件指针(下一个发送指针即为当前指针),
   否则不调整发送指针以便在下次发送时重发该图片 */
void CPictureNet::ResponseFrame_E(unsigned char *pChData, int nDataLen)
{
static int nCount=0;
char tmpStr[5];
memset(tmpStr,0,5);
sprintf(tmpStr,"%d\n",nCount);
TRACE(tmpStr);
nCount++;
//	帧格式:I 'E' 文件名 状态('1' 正确 '0' 错误)
//	其中文件名和F帧中的文件名相同,共31个字节
	if(pChData[P_BUS_NO+5]=='1'){		//若图片文件校验和正确
		if(RAM_Flag()){
			if(PriorityFlag){
				AdjustSendPointer(PRIORITY_INDEX,PRIORITY_TRANS);
			} else {
				AdjustSendPointer(IMG_INDEX,IMG_TRANS);
			}
		} else {
			if(PriorityFlag){
				AdjustSendPointer(PRI_INDEX_1,PRI_TRANS_1);
			} else {
				AdjustSendPointer(IMG_INDEX_1,IMG_TRANS_1);
			}
		}
	}
	Transmit_Query();
}

//	处理定时器超时消息。本函数只处理和本类有关的定时器消息,
//	和本类无关的消息不做处理
void CPictureNet::ProcessTimerOut(UINT nIndex)
{
	switch(nIndex){
	case LEAVE_LOOP_TIMER:
		break;
	case PICTURE_LOOP_TIMER:
		break;
	case AMBER_LIGHT_TIMER:
		break;
	case ASK_IO_STATUS_TIMER:
		break;
	case SECOND_TIMER:
		break;
	case WORK_WINDOW_TIMER:
		break;
	case PICTURE_QUERY_TIMER:
		PictureQueryTimerOut();
		break;
	case PICTURE_SEND_TIMER:
		PictureSendTimerOut();
		break;
	case PICTURE_RESET_TIMER:
		PictureResetTimerOut();
		break;
	case TFI_TIMER:
		break;
	case SOUND_TIMER:
		break;
	case OVERLAY_TIMER:
		break;
	case INITIAL_TIMER:
		break;
	}
}

⌨️ 快捷键说明

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