📄 picturenet.cpp
字号:
}
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 + -