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

📄 receive.c

📁 很少见的linux下的红外口的工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(data<gap*(100-remote->eps)/100 &&	   data<gap-remote->aeps)	{		LOGPRINTF(1,"end of signal not found");		return(0);	}	return(1);	}inline int get_repeat(struct ir_remote *remote){	if(!get_lead(remote)) return(0);	if(is_biphase(remote))	{		if(!expectspace(remote,remote->srepeat)) return(0);		if(!expectpulse(remote,remote->prepeat)) return(0);	}	else	{		if(!expectpulse(remote,remote->prepeat)) return(0);		rec_buffer.pendings=remote->srepeat;	}	if(!get_trail(remote)) return(0);	if(!get_gap(remote,		    is_const(remote) ? 		    (remote->gap>rec_buffer.sum ? remote->gap-rec_buffer.sum:0):		    (has_repeat_gap(remote) ? remote->repeat_gap:remote->gap)		    )) return(0);	return(1);}ir_code get_data(struct ir_remote *remote,int bits,int done){	ir_code code;	int i;		code=0;		if(is_rcmm(remote))	{		lirc_t deltap,deltas,sum;				if(bits%2 || done%2)		{			logprintf(LOG_ERR,"invalid bit number.");			return((ir_code) -1);		}		for(i=0;i<bits;i+=2)		{			code<<=2;			deltap=get_next_pulse(remote->pzero+remote->pone+					      remote->ptwo+remote->pthree);			deltas=get_next_space(remote->szero+remote->sone+					      remote->stwo+remote->sthree);			if(deltap==0 || deltas==0) 			{				logprintf(LOG_ERR,"failed on bit %d",					  done+i+1);			}			sum=deltap+deltas;			LOGPRINTF(3,"rcmm: sum %ld",(unsigned long) sum);			if(expect(remote,sum,remote->pzero+remote->szero))			{				code|=0;				LOGPRINTF(2,"00");			}			else if(expect(remote,sum,remote->pone+remote->sone))			{				code|=1;				LOGPRINTF(2,"01");			}			else if(expect(remote,sum,remote->ptwo+remote->stwo))			{				code|=2;				LOGPRINTF(2,"10");			}			else if(expect(remote,sum,remote->pthree+remote->sthree))			{				code|=3;				LOGPRINTF(2,"11");			}			else			{				LOGPRINTF(2,"no match for %ld+%ld=%ld",					 deltap,deltas,sum);				return((ir_code) -1);			}		}		return(code);	}		for(i=0;i<bits;i++)	{		code=code<<1;		if(is_goldstar(remote))		{			if((done+i)%2)			{				LOGPRINTF(2,"$1");				remote->pone=remote->ptwo;				remote->sone=remote->stwo;			}			else			{				LOGPRINTF(2,"$2");				remote->pone=remote->pthree;				remote->sone=remote->sthree;			}		}				if(expectone(remote,done+i))		{			LOGPRINTF(2,"1");			code|=1;		}		else if(expectzero(remote,done+i))		{			LOGPRINTF(2,"0");			code|=0;		}		else		{			LOGPRINTF(1,"failed on bit %d",done+i+1);			return((ir_code) -1);		}	}	return(code);}ir_code get_pre(struct ir_remote *remote){	ir_code pre;	pre=get_data(remote,remote->pre_data_bits,0);	if(pre==(ir_code) -1)	{		LOGPRINTF(1,"failed on pre_data");		return((ir_code) -1);	}	if(remote->pre_p>0 && remote->pre_s>0)	{		if(!expectpulse(remote,remote->pre_p))			return((ir_code) -1);		rec_buffer.pendings=remote->pre_s;	}	return(pre);}ir_code get_post(struct ir_remote *remote){	ir_code post;	if(remote->post_p>0 && remote->post_s>0)	{		if(!expectpulse(remote,remote->post_p))			return((ir_code) -1);		rec_buffer.pendings=remote->post_s;	}	post=get_data(remote,remote->post_data_bits,remote->pre_data_bits+		      remote->bits);	if(post==(ir_code) -1)	{		LOGPRINTF(1,"failed on post_data");		return((ir_code) -1);	}	return(post);}int receive_decode(struct ir_remote *remote,		   ir_code *prep,ir_code *codep,ir_code *postp,		   int *repeat_flagp,lirc_t *remaining_gapp){	ir_code pre,code,post,code_mask=0,post_mask=0;	lirc_t sync;	int header;	struct timeval current;	sync=0; /* make compiler happy */	code=pre=post=0;	header=0;	if(hw.rec_mode==LIRC_MODE_MODE2 ||	   hw.rec_mode==LIRC_MODE_PULSE ||	   hw.rec_mode==LIRC_MODE_RAW)	{		rewind_rec_buffer();		rec_buffer.is_biphase=is_biphase(remote) ? 1:0;				/* we should get a long space first */		if(!(sync=sync_rec_buffer(remote)))		{			LOGPRINTF(1,"failed on sync");			return(0);		}		LOGPRINTF(1,"sync");		if(has_repeat(remote) && last_remote==remote)		{			if(remote->flags&REPEAT_HEADER && has_header(remote))			{				if(!get_header(remote))				{					LOGPRINTF(1,"failed on repeat "						  "header");					return(0);				}				LOGPRINTF(1,"repeat header");			}			if(get_repeat(remote))			{				if(remote->last_code==NULL)				{					logprintf(LOG_NOTICE,"repeat code "						  "without last_code "						  "received");					return(0);				}				*prep=remote->pre_data;				*codep=remote->last_code->code;				*postp=remote->post_data;				*repeat_flagp=1;				*remaining_gapp=				is_const(remote) ? 				(remote->gap>rec_buffer.sum ?				 remote->gap-rec_buffer.sum:0):				(has_repeat_gap(remote) ?				 remote->repeat_gap:remote->gap);				return(1);			}			else			{				LOGPRINTF(1,"no repeat");				rewind_rec_buffer();				sync_rec_buffer(remote);			}		}		if(has_header(remote))		{			header=1;			if(!get_header(remote))			{				header=0;				if(!(remote->flags&NO_HEAD_REP && 				     (sync<=remote->gap+remote->gap*remote->eps/100				      || sync<=remote->gap+remote->aeps)))				{					LOGPRINTF(1,"failed on header");					return(0);				}			}			LOGPRINTF(1,"header");		}	}	if(is_raw(remote))	{		struct ir_ncode *codes,*found;		int i;		if(hw.rec_mode==LIRC_MODE_CODE ||		   hw.rec_mode==LIRC_MODE_LIRCCODE)			return(0);		codes=remote->codes;		found=NULL;		while(codes->name!=NULL && found==NULL)		{			found=codes;			for(i=0;i<codes->length;)			{				if(!expectpulse(remote,codes->signals[i++]))				{					found=NULL;					rewind_rec_buffer();					sync_rec_buffer(remote);					break;				}				if(i<codes->length &&				   !expectspace(remote,codes->signals[i++]))				{					found=NULL;					rewind_rec_buffer();					sync_rec_buffer(remote);					break;				}			}			codes++;		}		if(found!=NULL)		{			if(!get_gap(remote,				    is_const(remote) ? 				    remote->gap-rec_buffer.sum:				    remote->gap)) 				found=NULL;		}		if(found==NULL) return(0);		code=found->code;	}	else	{		if(hw.rec_mode==LIRC_MODE_CODE ||		   hw.rec_mode==LIRC_MODE_LIRCCODE)		{			int i; 			lirc_t sum;#                       ifdef LONG_IR_CODE			LOGPRINTF(1,"decoded: %llx",rec_buffer.decoded);#                       else			LOGPRINTF(1,"decoded: %lx",rec_buffer.decoded);#                       endif			if((hw.rec_mode==LIRC_MODE_CODE &&			    hw.code_length<remote->pre_data_bits			    +remote->bits+remote->post_data_bits)			   ||			   (hw.rec_mode==LIRC_MODE_LIRCCODE && 			    hw.code_length!=remote->pre_data_bits			    +remote->bits+remote->post_data_bits))			{				return(0);			}						for(i=0;i<remote->post_data_bits;i++)			{				post_mask=(post_mask<<1)+1;			}			post=rec_buffer.decoded&post_mask;			post_mask=0;			rec_buffer.decoded=			rec_buffer.decoded>>remote->post_data_bits;			for(i=0;i<remote->bits;i++)			{				code_mask=(code_mask<<1)+1;			}			code=rec_buffer.decoded&code_mask;			code_mask=0;			pre=rec_buffer.decoded>>remote->bits;			gettimeofday(&current,NULL);			sum=remote->phead+remote->shead+				lirc_t_max(remote->pone+remote->sone,					   remote->pzero+remote->szero)*				(remote->bits+				 remote->pre_data_bits+				 remote->post_data_bits)+				remote->plead+				remote->ptrail+				remote->pfoot+remote->sfoot+				remote->pre_p+remote->pre_s+				remote->post_p+remote->post_s;						rec_buffer.sum=sum>=remote->gap ? remote->gap-1:sum;			sync=time_elapsed(&remote->last_send,&current)- 				rec_buffer.sum;		}		else		{			if(!get_lead(remote))			{				LOGPRINTF(1,"failed on leading pulse");				return(0);			}						if(has_pre(remote))			{				pre=get_pre(remote);				if(pre==(ir_code) -1)				{					LOGPRINTF(1,"failed on pre");					return(0);				}#                               ifdef LONG_IR_CODE				LOGPRINTF(1,"pre: %llx",pre);#                               else				LOGPRINTF(1,"pre: %lx",pre);#                               endif			}						code=get_data(remote,remote->bits,				      remote->pre_data_bits);			if(code==(ir_code) -1)			{				LOGPRINTF(1,"failed on code");				return(0);			}#                       ifdef LONG_IR_CODE			LOGPRINTF(1,"code: %llx",code);#                       else			LOGPRINTF(1,"code: %lx",code);#                       endif						if(has_post(remote))			{				post=get_post(remote);				if(post==(ir_code) -1)				{					LOGPRINTF(1,"failed on post");					return(0);				}#                               ifdef LONG_IR_CODE				LOGPRINTF(1,"post: %llx",post);#                               else				LOGPRINTF(1,"post: %lx",post);#                               endif			}			if(!get_trail(remote))			{				LOGPRINTF(1,"failed on trailing pulse");				return(0);			}			if(has_foot(remote))			{				if(!get_foot(remote))				{					LOGPRINTF(1,"failed on foot");					return(0);				}			}			if(header==1 && is_const(remote) &&			   (remote->flags&NO_HEAD_REP))			{				rec_buffer.sum-=remote->phead+remote->shead;			}			if(is_rcmm(remote))			{				if(!get_gap(remote,1000))					return(0);			}			else if(is_const(remote))			{				if(!get_gap(remote,					    remote->gap>rec_buffer.sum ?					    remote->gap-rec_buffer.sum:0))					return(0);			}			else			{				if(!get_gap(remote,remote->gap))					return(0);			}		} /* end of mode specific code */	}	*prep=pre;*codep=code;*postp=post;	if(sync<=remote->remaining_gap*(100+remote->eps)/100	   || sync<=remote->remaining_gap+remote->aeps)		*repeat_flagp=1;	else		*repeat_flagp=0;	if(hw.rec_mode==LIRC_MODE_CODE ||	   hw.rec_mode==LIRC_MODE_LIRCCODE)	{		/* Most TV cards don't pass each signal to the                   driver. This heuristic should fix repeat in such                   cases. */		if(time_elapsed(&remote->last_send,&current)<300000)		{			*repeat_flagp=1;		}	}	if(is_const(remote))	{		*remaining_gapp=remote->gap>rec_buffer.sum ?			remote->gap-rec_buffer.sum:0;	}	else	{		*remaining_gapp=remote->gap;	}	return(1);}

⌨️ 快捷键说明

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