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