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

📄 remote.cpp

📁 WinLIRC软件:WinLIRC是一个以 LIRC为基础而在Windows环境发展出来的模块, 而什么是LIRC呢...它其实是 Linux InfraredRemote Control的缩写, 本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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))
	{
		int deltap,deltas,sum;
		
		if(bits%2 || done%2)
		{
#               ifdef __DEBUG
			logprintf(LOG_ERR,"invalid bit number.");
#				endif
			return((ir_code) -1);
		}
		for(i=0;i<bits;i+=2)
		{
			code<<=2;
			deltap=get_next_pulse();
			deltas=get_next_space();
			if(deltap==0 || deltas==0) 
			{
#               ifdef __DEBUG
				logprintf(LOG_ERR,"failed on bit %d",
					  done+i+1);
#				endif
			}
			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(expectone(remote,done+i))
		{
#                       ifdef __DEBUG2
			logprintf("1\n");
#                       endif
			code|=1;
		}
		else if(expectzero(remote,done+i))
		{
#                       ifdef __DEBUG2
			logprintf("0\n");
#                       endif
			code|=0;
		}
		else
		{
#                       ifdef __DEBUG
			logprintf("failed on bit %d\n",done+i+1);
#                       endif
			return((ir_code) -1);
		}
	}
	if(remote->flags&REVERSE) return(reverse(code,bits));  //different than LIRC 0.6.5
	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)
	{
#               ifdef __DEBUG
		logprintf("failed on pre_data\n");
#               endif
		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)
	{
#               ifdef __DEBUG
		logprintf("failed on post_data\n");
#               endif
		return((ir_code) -1);
	}
	return(post);
}

int decode(struct ir_remote *remote) //this is a lot different than LIRC 0.6.5
{
	ir_code pre,code,post,pre_mask=0,code_mask=0,post_mask=0;
	struct ir_ncode *codes,*found;
	int repeat_state;
	int sync;
	int header;

	repeat_state=0; /* make compiler happy */
	code=pre=post=0;

	rec_buffer.is_biphase=is_biphase(remote) ? 1:0;

	/* we should get a long space first */
	if(!(sync=sync_rec_buffer(remote)))
	{
#               ifdef __DEBUG
		logprintf("failed on sync\n");
#               endif		
		return(0);
	}

#       ifdef __DEBUG
	logprintf("sync\n");
#       endif

	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("repeat code without last_code received\n");
				return(0);
			}

			remote->remaining_gap=
			is_const(remote) ? 
			(remote->gap>rec_buffer.sum ?
			 remote->gap-rec_buffer.sum:0):
			(has_repeat_gap(remote) ?
			 remote->repeat_gap:remote->gap);
			remote->reps++;
			return(1);
		}
		else
		{
#                       ifdef __DEBUG
			logprintf("no repeat\n");
#                       endif
			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<=(int)(remote->gap+remote->gap*remote->eps/100)
				|| sync<=(int)(remote->gap+remote->aeps))))
			{
#                       ifdef __DEBUG
	 			logprintf("failed on header\n");
#                       endif
				return(0);
			}
#               ifdef __DEBUG
			logprintf("header\n");
#               endif
		}
	}

	if(is_raw(remote))
	{
		struct ir_ncode *codes;
		int i;

		codes=remote->codes;
		found=NULL;
		while(codes->name!=NULL && found==NULL)
		{
			found=codes;
			for(i=0;i<codes->length;)
			{
				if(!expectpulse(remote,(int)codes->signals[i++]))
				{
					found=NULL;
					rewind_rec_buffer();
					sync_rec_buffer(remote);
					break;
				}
				if(i<codes->length &&
				   !expectspace(remote,(int)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)) 
				return(0);
		}
		if(found==NULL) return(0);  //in LIRC 0.6.5
		code=found->code;			//in LIRC 0.6.5
	}
	else
	{
		if(!get_lead(remote))
		{
#                       ifdef __DEBUG
			logprintf("failed on leading pulse\n");
#                       endif
			return(0);
		}
		
		if(has_pre(remote))
		{
			pre=get_pre(remote);
			if(pre==(ir_code) -1)
			{
#                               ifdef __DEBUG
				logprintf("failed on pre\n");
#                               endif
				return(0);
			}
#                       ifdef __DEBUG
#                       ifdef LONG_IR_CODE
			logprintf("pre: %llx\n",pre);
#                       else
			logprintf("pre: %lx\n",pre);
#                       endif
#                       endif
		}

		code=get_data(remote,remote->bits,remote->pre_data_bits);
		if(code==(ir_code) -1)
		{
#                       ifdef __DEBUG
			logprintf("failed on code\n");
#                       endif
			return(0);
		}
#               ifdef __DEBUG
#               ifdef LONG_IR_CODE
		logprintf("code: %llx\n",code);
#               else
		logprintf("code: %lx\n",code);
#               endif		
#               endif

		if(has_post(remote))
		{
			post=get_post(remote);
			if(post==(ir_code) -1)
			{
#                               ifdef __DEBUG
				logprintf("failed on post\n");
#                               endif
				return(0);
			}
#                       ifdef __DEBUG
#                       ifdef LONG_IR_CODE
			logprintf("post: %llx\n",post);
#                       else
			logprintf("post: %lx\n",post);
#                       endif
#                       endif
		}
		if(!get_trail(remote))
		{
#                       ifdef __DEBUG
			logprintf("failed on trailing pulse\n");
#                       endif
			return(0);
		}
		if(has_foot(remote))
		{
			if(!get_foot(remote))
			{
#                               ifdef __DEBUG
				logprintf("failed on foot\n");
#                               endif		
				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)) //the 1000 worries me
				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,(has_repeat_gap(remote) ?
								remote->repeat_gap:remote->gap)))
				return(0);
		}
		if(remote->toggle_bit>0)
		{
			if(remote->toggle_bit<=remote->pre_data_bits)
			{
				repeat_state=
				pre&(1<<(remote->pre_data_bits
					 -remote->toggle_bit)) ? 1:0;
				pre_mask=1<<(remote->pre_data_bits
					     -remote->toggle_bit);
			}
			else if(remote->toggle_bit<=remote->pre_data_bits
				+remote->bits)
			{
				repeat_state=
				code&(1<<(remote->pre_data_bits
					  +remote->bits
					  -remote->toggle_bit)) ? 1:0;
				code_mask=1<<(remote->pre_data_bits
					      +remote->bits
					      -remote->toggle_bit);
			}
			else if(remote->toggle_bit<=remote->pre_data_bits
				+remote->bits
				+remote->post_data_bits)
			{
				repeat_state=
				post&(1<<(remote->pre_data_bits
					  +remote->bits
					  +remote->post_data_bits
					  -remote->toggle_bit)) ? 1:0;
				post_mask=1<<(remote->pre_data_bits
					      +remote->bits
					      +remote->post_data_bits
					      -remote->toggle_bit);
			}
			else
			{
				;//logprintf("bad toggle_bit\n");
			}
		}

		if(has_pre(remote))
		{
			if((pre|pre_mask)!=(remote->pre_data|pre_mask))
			{
#                               ifdef __DEBUG
				logprintf("bad pre data\n");
#                               endif
#                               ifdef __DEBUG2
#                               ifdef LONG_IR_CODE
				logprintf("%llx %llx\n",pre,remote->pre_data);
#                               else
				logprintf("%lx %lx\n",pre,remote->pre_data);
#                               endif
#                               endif
				return(0);
			}
#                       ifdef __DEBUG
			logprintf("pre\n");
#                       endif
		}
	
		if(has_post(remote))
		{
			if((post|post_mask)!=(remote->post_data|post_mask))
			{
#                               ifdef __DEBUG
				logprintf("bad post data\n");
#                               endif
				return(0);
			}
#                       ifdef __DEBUG
			logprintf("post\n");
#                       endif
		}
		found=NULL;
		codes=remote->codes;
		if(codes!=NULL)
		{
			while(codes->name!=NULL)
			{
				if((codes->code|code_mask)==(code|code_mask))
				{
					found=codes;
					break;
				}
				codes++;
			}
		}
	}

	if(use_ir_hardware==false)
	{
		/* "nasty hack" for irrecord that I missed the first time around. :)  */
		remote->post_data=code;
		return 1;
	}
	else
	{
		if(found==NULL)	return(0);
		else
		{
			last_remote=remote;
			if(found==remote->last_code && !has_repeat(remote) && 
			   (!(remote->toggle_bit>0) || 
				repeat_state==remote->repeat_state))
			{
				if(sync<=(int)(remote->remaining_gap*(100+remote->eps)/100)
				   || sync<=(int)(remote->remaining_gap+remote->aeps))
					remote->reps++;
				else
					remote->reps=0;
			}
			else
			{
				remote->reps=0;
				remote->last_code=found;
				if(remote->toggle_bit>0)
				{
					remote->repeat_state=repeat_state;
				}
			}
			gettimeofday(&remote->last_send,NULL);
			if(is_const(remote))
			{
				remote->remaining_gap=remote->gap>rec_buffer.sum ?
					remote->gap-rec_buffer.sum:0;
			}
			else
			{
					remote->remaining_gap=remote->gap;
			}
			return(1);
		}
	}
}

char *decode_command(unsigned long data)
{
	CSingleLock lock(&CS_global_remotes,TRUE);
	
	struct ir_remote *all;
	static char message[PACKET_SIZE+1];

	clear_rec_buffer(data);

	/* use remotes carefully, it may be changed on SIGHUP */
	decoding=all=global_remotes;
	while(all)
	{
#               ifdef __DEBUG
		logprintf("trying \"%s\" remote\n",all->name);
#               endif
		
		if(decode(all))
		{
			int len;
			unsigned __int64 code;
			struct ir_remote *remote;

			remote=all;
			code=0;
			if(!(remote->flags&REVERSE))
			{
				if(has_pre(remote))
				{
					code|=remote->pre_data;
					code=code<<remote->bits;
				}
				code|=remote->last_code->code;
				if(has_post(remote))
				{
					code=code<<remote->post_data_bits;
					code|=remote->post_data;
				}
			}
			else
			{
				if(has_post(remote))
				{
					code|=remote->post_data;
					code=code<<remote->bits;
				}
				code|=remote->last_code->code;
				if(has_pre(remote))
				{
					code=code<<remote->pre_data_bits;
					code|=remote->pre_data;
				}
			}

#ifdef __GLIBC__
			/* It seems you can't print 64-bit longs on glibc */

			len=_snprintf(message,PACKET_SIZE,"%08lx%08lx %02x %s %s\n",
				     (unsigned long)
				     (code>>32),
				     (unsigned long)
				     (code&0xFFFFFFFF),
				     remote->reps,
				     remote->last_code->name,
				     remote->name);
#else
			len=_snprintf(message,PACKET_SIZE,"%016I64x %02x %s %s\n",
				     code,
				     remote->reps,
				     remote->last_code->name,
				     remote->name);
#endif
			decoding=NULL;
			if(len==-1)
			{
				DEBUG("Message buffer overflow\n");				
				return(NULL);
			}
			else
			{
				return(message);
			}
		}
		else
		{
#                       ifdef __DEBUG
			logprintf("failed \"%s\" remote\n",all->name);
#                       endif
			if(all->next!=NULL) rewind_rec_buffer();
		}
		all=all->next;
	}
	decoding=NULL;
	last_remote=NULL;
#       ifdef __DEBUG
	logprintf("decoding failed for all remotes\n");
#       endif __DEBUG
	return(NULL);
}

⌨️ 快捷键说明

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