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

📄 comm103.c

📁 串口103规约
💻 C
📖 第 1 页 / 共 3 页
字号:
	if(len>0){
		if(dp->leveloneque.buf[dp->leveloneque.quesave]!=NULL)free(dp->leveloneque.buf[dp->leveloneque.quesave]);
		dp->leveloneque.buf[dp->leveloneque.quesave]=malloc(COMM103_LEVELONE_BUFLEN);
		dp->leveloneque.buflenth[dp->leveloneque.quesave]=len;
		COMM103Memcopy(dp->leveloneque.buf[dp->leveloneque.quesave],buf,len,0);
		dp->leveloneque.quesave=(dp->leveloneque.quesave+1)%COMM103_LEVELONE_NUM;
	}
}
static int COMM103GetmsgFromLeveloneQue(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf){
	int len;
	while(dp->leveloneque.queload!=dp->leveloneque.quesave)
	{
		if(dp->leveloneque.buf[dp->leveloneque.queload]!=NULL)
		{
			len=dp->leveloneque.buflenth[dp->leveloneque.queload];
			COMM103Memcopy(&buf[6],dp->leveloneque.buf[dp->leveloneque.queload],len,0);
			free(dp->leveloneque.buf[dp->leveloneque.quesave]);
			dp->leveloneque.buf[dp->leveloneque.quesave]=NULL;
			dp->leveloneque.queload=(dp->leveloneque.queload+1)%COMM103_LEVELONE_NUM;
			return len;
		}
		dp->leveloneque.queload=(dp->leveloneque.queload+1)%COMM103_LEVELONE_NUM;
	}
	return 0;
}
static void COMM103ClearLevelOneQue(struct COMM103_DEVICE_DATABASE *dp){
	int i;
	for(i=0;i<COMM103_LEVELONE_NUM;i++){
		if(dp->leveloneque.buf[i]!=NULL)free(dp->leveloneque.buf[i]);
		dp->leveloneque.buf[i]=NULL;
		dp->leveloneque.buflenth[i]=0;
	}
	dp->leveloneque.queload=0;
	dp->leveloneque.quesave=0;
}
static u_char COMM103GetLinkControl(struct COMM103_DEVICE_DATABASE *dp,u_char fun){
	if(dp->leveloneque.queload!=dp->leveloneque.quesave)return 0x20+fun;
	else return fun;
}

static struct	 COMM103_DEVICE_DATABASE * COMM103FindDevice(struct  COMM103_DEVICE_MAP * ndp,u_short addr){
	u_short i;
	for(i=0;i<ndp->devicenum;i++){
		if(ndp->commdevice_database[i]==NULL)continue;
		if(ndp->commdevice_database[i]->dev_addr==addr)return ndp->commdevice_database[i];
	}
	return NULL;
}

static struct  DEV_ENTRY_DES_DATA * COMM103FindFUNINF(struct  COMM103_DEVICE_DATABASE * dp,u_char grp,u_char entry){
	u_char i,fun,inf,j;
	for(j=0;j<dp->groupnum;j++){
		if(dp->groupindex[j]==NULL)continue;
		if(dp->groupindex[j]->ginhight!=grp)continue;
		for(i=0;i<dp->groupindex[j]->groupgin->entry_num;i++){
			if(dp->groupindex[j]->groupgin->entry[i].entry==entry){
				return &dp->groupindex[j]->groupgin->entry[i];
			}
		}
	}
	return NULL;
}

static void COMM103DealUpSendMsg(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu *asdup,int len){
	u_char ginptr;
	u_char *upbuf;
	int lenth;
	struct	can_asdu10 *asdu10p;
	asdu10p=(struct	can_asdu10 *)asdup;
	if(dp->qhstate==COMM103_CALLINGQH_COMMAND){
		if((asdup->asdu_type==10)&&(asdu10p->GIN[0]==dp->grpqh)){
			len=COMM103_answer_one_entry_list(dp,asdup,len);
			dp->qhstate=COMM103_NO_CALLQH_COMMAND;
		}
	}
	asdup->address=dp->map_addr;
	if((asdup->asdu_type==11)||((asdup->asdu_type>=23)&&(asdup->asdu_type<=31))){
		upbuf=&asdup->asdu_type;
		COMM103IsertinLeveloneQue(dp,upbuf,len-sizeof(struct can_asdu_head));
		return;
	}
	if(asdup->asdu_type!=10)return;
	switch(asdup->cot){
	case 1:
	case 2:
	case 9:
		COMM103ChangAsduType(dp,asdu10p,len);
		break;
	case 40:
	case 41:
	case 42:
	case 43:
	case 44:
		lenth=COMM103GenReadHeadCheck(dp,asdu10p,len);
		upbuf=&asdup->asdu_type;
		COMM103IsertinLeveloneQue(dp,upbuf,lenth-sizeof(struct can_asdu_head));
		break;
	case 10:
		COMM103FormEndCall(dp,asdu10p->RII);
		break;
	}
}
static void COMM103DealDownSendMsg(struct  COMM103_DEVICE_MAP * ndp,u_char *buf,int len){
	int i;
	u_char *pp;
	struct  COMM103_DEVICE_DATABASE *dp;

	if(len<0)return ;
	COMM103Memcopy(&ndp->recvbuf[ndp->recvlenth],buf,len,0);
	ndp->recvlenth+=len;
#ifdef  _COMM103_SEND_DEBUG_
		printf("\nlen=%d buflen=%d \n",len,ndp->recvlenth);
#endif
	i=COMM103COMMMsgVerfy(ndp);
#ifdef  _COMM103_SEND_DEBUG_
		printf("Verfy=%d ",i);
#endif
	if(i==0)return;
	else if(i<0){ndp->recvlenth=0;return;}
#ifdef  _COMM103_SEND_DEBUG_
		printf("answer \n");
#endif
	dp=COMM103MsgVerfyFcb(ndp,i);
	ndp->recvlenth=0;
}

static void COMM103FormEndCall(struct  COMM103_DEVICE_DATABASE * dp,u_char scn){
	u_char asdu8[10];
	asdu8[0]=8;
	asdu8[1]=0x81;
	asdu8[2]=10;
	asdu8[3]=dp->map_addr;
	asdu8[4]=0xff;
	asdu8[5]=0x00;
	asdu8[6]=scn;
	COMM103IsertinLeveloneQue(dp,asdu8,7);
}

static int COMM103GenReadHeadCheck(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu10 *asdu10p,int len){
	u_short gin;
	int i,ginnum,j,lenth;
	u_char *ptr,*pts;
	u_char wid,num,upginnum;

	if(asdu10p->inf!=240)return len;
	ginnum=dp->groupnum;
	ptr=&asdu10p->GIN[0];
	lenth=8;
	upginnum=0;
	for(i=0;i<ginnum;i++){
		if(dp->groupindex[i]->converttype==COMM103_GROUP_TYPE_GIN){
			*ptr++=dp->groupindex[i]->ginhight;/*gin kod type =4byte*/
			*ptr++=0;/*gin */
			*ptr++=10;/*kod*/
			*ptr++=1;/*type*/
			wid=strlen(dp->groupindex[i]->des);
			*ptr++=wid;/*wid*/
			*ptr++=1;/*num*/
			lenth+=(wid+6);
			for(j=0;j<wid;j++)*ptr++=dp->groupindex[i]->des[j];
			upginnum++;			
		}
	}
	asdu10p->NGD=upginnum;
	if(upginnum==0)return 0;
	else return (lenth+sizeof(struct can_asdu_head));
}

static void COMM103ChangAsduType(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu10 *asdu10p,int len){
	u_char grp,wid,num,ginl;
	int i,ginnum;
	u_char *ptr;
	struct  DEV_ENTRY_DES_DATA *entylp;

	ginnum=asdu10p->NGD&0x3f;
	ptr=&asdu10p->GIN[0];
#ifdef  _COMM103_RECV_DEBUG_
	printf("chang:\n");
	COMM103BufShow((u_char *)asdu10p,len);
#endif
	switch(COMM103FindGintype(dp,*ptr)){
	case COMM103_GROUP_TYPE_GIN:
		COMM103IsertinLeveloneQue(dp,(u_char *)&asdu10p->asdu_type,len-sizeof(struct can_asdu_head));
		break;
	case COMM103_GROUP_TYPE_FUNINF:
		for(i=0;i<ginnum;i++){
			grp=*ptr++;
			ginl=*ptr++;
			entylp=COMM103FindFUNINF(dp,grp,ginl);
			ptr+=2;
			wid=*ptr++;
			num=*ptr++;
#ifdef  _COMM103_RECV_DEBUG_
	printf("gin:%02x%02x wid%d num%d ",grp,ginl,wid,num);
#endif
			if(entylp!=NULL){
				switch(entylp->actual_value.GDD0){
				case 18:
				case 203:
					COMM103FormAsdu1(dp,ptr,entylp->fun,entylp->inf,asdu10p->cot,asdu10p->RII);
					break;
				case 19:
				case 204:
					COMM103FormAsdu2(dp,ptr,entylp->fun,entylp->inf,asdu10p->cot,asdu10p->RII);
					break;
				case 20:
				case 205:
					COMM103FormAsdu4(dp,ptr,entylp->fun,entylp->inf,asdu10p->cot,asdu10p->RII);
					break;
				default:
#ifdef  _COMM103_RECV_DEBUG_
			myprintf("err%d ",entylp->actual_value.GDD0);
#endif					break;
				}
			}
#ifdef  _COMM103_RECV_DEBUG_
			else myprintf("can't find ");
#endif
			ptr+=(wid*num);
		}
		break;
	default:
		break;
	}

}

static u_char COMM103FindGintype(struct  COMM103_DEVICE_DATABASE * dp,u_char gin){
	u_char i;
	for(i=0;i<dp->groupnum;i++){
		if(dp->groupindex[i]->ginhight==gin)return dp->groupindex[i]->converttype;
	}
}

static void COMM103FormAsdu1(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,
					  u_char cot,u_char rii){
	u_char ptr,i,upbuf[20];
	ptr=0;
	if(inf==0)return;
	upbuf[ptr++]=1;
	upbuf[ptr++]=0x81;
	upbuf[ptr++]=cot;
	upbuf[ptr++]=dp->map_addr;
	upbuf[ptr++]=fun;
	upbuf[ptr++]=inf;
	i=buf[0]&0x03;
	if((i==0)||(i==3))return;
	for(i=0;i<5;i++){
		upbuf[ptr++]=buf[i];
	}
	upbuf[ptr++]=rii;
	COMM103IsertinLeveloneQue(dp,upbuf,ptr);
	return;
}
static void COMM103FormAsdu2(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,
					  u_char cot,u_char rii){
	u_char ptr,i,upbuf[20];
	ptr=0;
	if(inf==0)return;
	upbuf[ptr++]=2;
	upbuf[ptr++]=0x81;
	upbuf[ptr++]=cot;
	upbuf[ptr++]=dp->map_addr;
	upbuf[ptr++]=fun;
	upbuf[ptr++]=inf;
	i=buf[0]&0x03;
	if((i==0)||(i==3))return;
	for(i=0;i<9;i++){
		upbuf[ptr++]=buf[i];
	}
	upbuf[ptr++]=rii;
	COMM103IsertinLeveloneQue(dp,upbuf,ptr);
	return;
}

static void COMM103FormAsdu4(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,
					  u_char cot,u_char rii){
	u_char ptr,i,upbuf[40];
	ptr=0;
	if(inf==0)return;
	upbuf[ptr++]=4;
	upbuf[ptr++]=0x81;
	upbuf[ptr++]=cot;
	upbuf[ptr++]=dp->map_addr;
	upbuf[ptr++]=fun;
	upbuf[ptr++]=inf;
	for(i=0;i<12;i++){
		upbuf[ptr++]=buf[i];
	}
	COMM103IsertinLeveloneQue(dp,upbuf,ptr);
	return;
}



static int COMM103COMMMsgVerfy(struct COMM103_DEVICE_MAP *dp){
	u_char k,ch,frame_l,sum=0;
	u_int  len,step,ptr,l;
	
#ifdef  _COMM103_SEND_DEBUG_
		for(len=0;len<dp->recvlenth;len++)printf("%02X ",dp->recvbuf[len]);
#endif
	ptr=0;
	while(dp->recvlenth>ptr){
		if((dp->recvbuf[ptr]==0x10)||(dp->recvbuf[ptr]==0x68))break;
		else ptr++;
	}
	if(dp->recvlenth<=ptr){dp->recvlenth=0;return 0;}
	else if(ptr!=0){
		COMM103Memcopy(dp->recvbuf,&dp->recvbuf[ptr],dp->recvlenth-ptr,0);
		dp->recvlenth-=ptr;
	}

	ptr=0;
    if(dp->recvlenth<5)return 0;	
	len=dp->recvlenth;
	
	ch=dp->recvbuf[ptr++];
	frame_l=1;
     if(ch==0x10)
	{		
		step=1;
		for(k=0;k<4;k++)
		{			
			ch=dp->recvbuf[ptr++];
			frame_l++;
			switch(step)
			{ 
			case 1:	
				step++;
				sum+=ch;
				break;
			case 2:
				step++;
				sum+=ch;
				break;
			case 3:	
				step++;
				if(ch!=sum) return -10;	
				break;
			case 4:
				step++;
				if((ch==0x16)&&(frame_l==len))return 1;
				else return -11;
				break;
		    }
		}
     }
     else if(ch==0x68){		
		step=1;
		frame_l=1;
		while(1)
		{
			ch=dp->recvbuf[ptr++];
			frame_l++;
			switch(step)
			{ 
			case 1:				
				step++;
				break;
			case 2:
				if(ch==dp->recvbuf[1])
				{	
					step++;
					if(dp->recvlenth<(ch+6))return 0;
					else dp->recvlenth=ch+6;
					l=ch-2;
				}
				else return -12;
				break;
			case 3:
				if(ch==0x68)step++;
				else return -13;
				break;
			case 4:
				step++;

⌨️ 快捷键说明

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