📄 receive.c
字号:
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(¤t,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,¤t)- 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,¤t)<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 + -