1 /* $Id: receive.c,v 5.35 2007/07/29 18:20:12 lirc Exp $ */
3 /****************************************************************************
4 ** receive.c ***************************************************************
5 ****************************************************************************
7 * functions that decode IR codes
9 * Copyright (C) 1999 Christoph Bartelmus <lirc@bartelmus.de>
23 extern struct hardware hw
;
24 extern struct ir_remote
*last_remote
;
26 struct rbuf rec_buffer
;
28 inline lirc_t
lirc_t_max(lirc_t a
,lirc_t b
)
33 inline void set_pending_pulse(lirc_t deltap
)
35 LOGPRINTF(5, "pending pulse: %lu", deltap
);
36 rec_buffer
.pendingp
=deltap
;
39 inline void set_pending_space(lirc_t deltas
)
41 LOGPRINTF(5, "pending space: %lu", deltas
);
42 rec_buffer
.pendings
=deltas
;
45 lirc_t
get_next_rec_buffer(lirc_t maxusec
)
47 if(rec_buffer
.rptr
<rec_buffer
.wptr
)
50 rec_buffer
.data
[rec_buffer
.rptr
]&PULSE_BIT
?
51 'p':'s', (unsigned long)
52 rec_buffer
.data
[rec_buffer
.rptr
]&(PULSE_MASK
));
53 rec_buffer
.sum
+=rec_buffer
.data
[rec_buffer
.rptr
]&(PULSE_MASK
);
54 return(rec_buffer
.data
[rec_buffer
.rptr
++]);
58 if(rec_buffer
.wptr
<RBUF_SIZE
)
62 data
=hw
.readdata(2*maxusec
<100000 ? 100000:2*maxusec
);
65 LOGPRINTF(3,"timeout: %u", maxusec
);
69 rec_buffer
.data
[rec_buffer
.wptr
]=data
;
70 if(rec_buffer
.data
[rec_buffer
.wptr
]==0) return(0);
71 rec_buffer
.sum
+=rec_buffer
.data
[rec_buffer
.rptr
]
76 rec_buffer
.data
[rec_buffer
.rptr
-1]&
77 PULSE_BIT
? 'p':'s', (unsigned long)
78 rec_buffer
.data
[rec_buffer
.rptr
-1]
80 return(rec_buffer
.data
[rec_buffer
.rptr
-1]);
84 rec_buffer
.too_long
=1;
91 void init_rec_buffer(void)
93 memset(&rec_buffer
,0,sizeof(rec_buffer
));
96 void rewind_rec_buffer(void)
99 rec_buffer
.too_long
=0;
100 set_pending_pulse(0);
101 set_pending_space(0);
105 int clear_rec_buffer(void)
109 if(hw
.rec_mode
==LIRC_MODE_LIRCCODE
)
111 unsigned char buffer
[sizeof(ir_code
)];
114 count
=hw
.code_length
/CHAR_BIT
;
115 if(hw
.code_length
%CHAR_BIT
) count
++;
117 if(read(hw
.fd
,buffer
,count
)!=count
)
119 logprintf(LOG_ERR
,"reading in mode "
120 "LIRC_MODE_LIRCCODE failed");
123 for(i
=0,rec_buffer
.decoded
=0;i
<count
;i
++)
125 rec_buffer
.decoded
=(rec_buffer
.decoded
<<CHAR_BIT
)+
126 ((ir_code
) buffer
[i
]);
129 else if(hw
.rec_mode
==LIRC_MODE_CODE
)
133 if(read(hw
.fd
,&c
,1)!=1)
135 logprintf(LOG_ERR
,"reading in mode LIRC_MODE_CODE "
139 rec_buffer
.decoded
=(ir_code
) c
;
145 move
=rec_buffer
.wptr
-rec_buffer
.rptr
;
146 if(move
>0 && rec_buffer
.rptr
>0)
148 memmove(&rec_buffer
.data
[0],
149 &rec_buffer
.data
[rec_buffer
.rptr
],
150 sizeof(rec_buffer
.data
[0])*move
);
151 rec_buffer
.wptr
-=rec_buffer
.rptr
;
158 LOGPRINTF(3,"c%lu",(unsigned long) data
&(PULSE_MASK
));
160 rec_buffer
.data
[rec_buffer
.wptr
]=data
;
166 rec_buffer
.is_biphase
=0;
171 inline void unget_rec_buffer(int count
)
173 LOGPRINTF(5, "unget: %d", count
);
174 if(count
==1 || count
==2)
176 rec_buffer
.rptr
-=count
;
177 rec_buffer
.sum
-=rec_buffer
.data
[rec_buffer
.rptr
]&(PULSE_MASK
);
180 rec_buffer
.sum
-=rec_buffer
.data
[rec_buffer
.rptr
+1]
186 inline void unget_rec_buffer_delta(lirc_t delta
)
189 rec_buffer
.sum
-=delta
&(PULSE_MASK
);
190 rec_buffer
.data
[rec_buffer
.rptr
]=delta
;
193 inline lirc_t
get_next_pulse(lirc_t maxusec
)
197 data
=get_next_rec_buffer(maxusec
);
198 if(data
==0) return(0);
201 LOGPRINTF(2,"pulse expected");
204 return(data
&(PULSE_MASK
));
207 inline lirc_t
get_next_space(lirc_t maxusec
)
211 data
=get_next_rec_buffer(maxusec
);
212 if(data
==0) return(0);
215 LOGPRINTF(2,"space expected");
221 inline int sync_pending_pulse(struct ir_remote
*remote
)
223 if(rec_buffer
.pendingp
>0)
227 deltap
=get_next_pulse(rec_buffer
.pendingp
);
228 if(deltap
==0) return 0;
229 if(!expect(remote
,deltap
,rec_buffer
.pendingp
)) return 0;
230 set_pending_pulse(0);
235 inline int sync_pending_space(struct ir_remote
*remote
)
237 if(rec_buffer
.pendings
>0)
241 deltas
=get_next_space(rec_buffer
.pendings
);
242 if(deltas
==0) return 0;
243 if(!expect(remote
,deltas
,rec_buffer
.pendings
)) return 0;
244 set_pending_space(0);
249 int expectpulse(struct ir_remote
*remote
,int exdelta
)
254 LOGPRINTF(5, "expecting pulse: %lu", exdelta
);
255 if(!sync_pending_space(remote
)) return 0;
257 deltap
=get_next_pulse(rec_buffer
.pendingp
+exdelta
);
258 if(deltap
==0) return(0);
259 if(rec_buffer
.pendingp
>0)
261 if(rec_buffer
.pendingp
>deltap
) return 0;
262 retval
=expect(remote
,deltap
-rec_buffer
.pendingp
,exdelta
);
263 if(!retval
) return(0);
264 set_pending_pulse(0);
268 retval
=expect(remote
,deltap
,exdelta
);
273 int expectspace(struct ir_remote
*remote
,int exdelta
)
278 LOGPRINTF(5, "expecting space: %lu", exdelta
);
279 if(!sync_pending_pulse(remote
)) return 0;
281 deltas
=get_next_space(rec_buffer
.pendings
+exdelta
);
282 if(deltas
==0) return(0);
283 if(rec_buffer
.pendings
>0)
285 if(rec_buffer
.pendings
>deltas
) return 0;
286 retval
=expect(remote
,deltas
-rec_buffer
.pendings
,exdelta
);
287 if(!retval
) return(0);
288 set_pending_space(0);
292 retval
=expect(remote
,deltas
,exdelta
);
297 inline int expectone(struct ir_remote
*remote
,int bit
)
299 if(is_biphase(remote
))
301 int all_bits
= bit_count(remote
);
304 mask
=((ir_code
) 1)<<(all_bits
-1-bit
);
305 if(mask
&remote
->rc6_mask
)
308 !expectspace(remote
,2*remote
->sone
))
313 set_pending_pulse(2*remote
->pone
);
317 if(remote
->sone
>0 && !expectspace(remote
,remote
->sone
))
322 set_pending_pulse(remote
->pone
);
325 else if(is_space_first(remote
))
327 if(remote
->sone
>0 && !expectspace(remote
,remote
->sone
))
332 if(remote
->pone
>0 && !expectpulse(remote
,remote
->pone
))
340 if(remote
->pone
>0 && !expectpulse(remote
,remote
->pone
))
348 !expectspace(remote
,remote
->sone
))
356 set_pending_space(remote
->sone
);
362 inline int expectzero(struct ir_remote
*remote
,int bit
)
364 if(is_biphase(remote
))
366 int all_bits
= bit_count(remote
);
369 mask
=((ir_code
) 1)<<(all_bits
-1-bit
);
370 if(mask
&remote
->rc6_mask
)
372 if(!expectpulse(remote
,2*remote
->pzero
))
377 set_pending_space(2*remote
->szero
);
381 if(!expectpulse(remote
,remote
->pzero
))
386 set_pending_space(remote
->szero
);
389 else if(is_space_first(remote
))
391 if(remote
->szero
>0 && !expectspace(remote
,remote
->szero
))
396 if(remote
->pzero
>0 && !expectpulse(remote
,remote
->pzero
))
404 if(!expectpulse(remote
,remote
->pzero
))
411 if(!expectspace(remote
,remote
->szero
))
419 set_pending_space(remote
->szero
);
425 inline lirc_t
sync_rec_buffer(struct ir_remote
*remote
)
428 lirc_t deltas
,deltap
;
431 deltas
=get_next_space(1000000);
432 if(deltas
==0) return(0);
434 if(last_remote
!=NULL
&& !is_rcmm(remote
))
436 while(!expect_at_least(last_remote
, deltas
,
437 last_remote
->min_remaining_gap
))
439 deltap
=get_next_pulse(1000000);
440 if(deltap
==0) return(0);
441 deltas
=get_next_space(1000000);
442 if(deltas
==0) return(0);
444 if(count
>REC_SYNC
) /* no sync found,
445 let's try a diffrent remote */
450 if(has_toggle_mask(remote
))
452 if(!expect_at_most(last_remote
, deltas
,
453 last_remote
->max_remaining_gap
))
455 remote
->toggle_mask_state
=0;
456 remote
->toggle_code
=NULL
;
465 inline int get_header(struct ir_remote
*remote
)
469 lirc_t deltap
,deltas
,sum
;
471 deltap
=get_next_pulse(remote
->phead
);
477 deltas
=get_next_space(remote
->shead
);
484 if(expect(remote
,sum
,remote
->phead
+remote
->shead
))
491 else if(is_bo(remote
))
493 if(expectpulse(remote
, remote
->pone
) &&
494 expectspace(remote
, remote
->sone
) &&
495 expectpulse(remote
, remote
->pone
) &&
496 expectspace(remote
, remote
->sone
) &&
497 expectpulse(remote
, remote
->phead
) &&
498 expectspace(remote
, remote
->shead
))
506 if(!sync_pending_space(remote
)) return 0;
507 set_pending_pulse(remote
->phead
);
510 if(!expectpulse(remote
,remote
->phead
))
515 /* if this flag is set I need a decision now if this is really
517 if(remote
->flags
&NO_HEAD_REP
)
521 deltas
=get_next_space(remote
->shead
);
524 if(expect(remote
,remote
->shead
,deltas
))
533 set_pending_space(remote
->shead
);
537 inline int get_foot(struct ir_remote
*remote
)
539 if(!expectspace(remote
,remote
->sfoot
)) return(0);
540 if(!expectpulse(remote
,remote
->pfoot
)) return(0);
544 inline int get_lead(struct ir_remote
*remote
)
546 if(remote
->plead
==0) return 1;
547 if(!sync_pending_space(remote
)) return 0;
548 set_pending_pulse(remote
->plead
);
552 inline int get_trail(struct ir_remote
*remote
)
554 if(remote
->ptrail
!=0)
556 if(!expectpulse(remote
,remote
->ptrail
)) return(0);
558 if(rec_buffer
.pendingp
>0)
560 if(!sync_pending_pulse(remote
)) return(0);
565 inline int get_gap(struct ir_remote
*remote
,lirc_t gap
)
569 LOGPRINTF(2,"sum: %d",rec_buffer
.sum
);
570 data
=get_next_rec_buffer(gap
-gap
*remote
->eps
/100);
571 if(data
==0) return(1);
574 LOGPRINTF(2,"space expected");
578 if(!expect_at_least(remote
, data
, gap
))
580 LOGPRINTF(1,"end of signal not found");
586 inline int get_repeat(struct ir_remote
*remote
)
588 if(!get_lead(remote
)) return(0);
589 if(is_biphase(remote
))
591 if(!expectspace(remote
,remote
->srepeat
)) return(0);
592 if(!expectpulse(remote
,remote
->prepeat
)) return(0);
596 if(!expectpulse(remote
,remote
->prepeat
)) return(0);
597 set_pending_space(remote
->srepeat
);
599 if(!get_trail(remote
)) return(0);
602 (min_gap(remote
)>rec_buffer
.sum
? min_gap(remote
)-rec_buffer
.sum
:0):
603 (has_repeat_gap(remote
) ? remote
->repeat_gap
:min_gap(remote
))
608 ir_code
get_data(struct ir_remote
*remote
,int bits
,int done
)
617 lirc_t deltap
,deltas
,sum
;
621 logprintf(LOG_ERR
,"invalid bit number.");
622 return((ir_code
) -1);
627 deltap
=get_next_pulse(remote
->pzero
+remote
->pone
+
628 remote
->ptwo
+remote
->pthree
);
629 deltas
=get_next_space(remote
->szero
+remote
->sone
+
630 remote
->stwo
+remote
->sthree
);
631 if(deltap
==0 || deltas
==0)
633 logprintf(LOG_ERR
,"failed on bit %d",
635 return((ir_code
) -1);
638 LOGPRINTF(3,"rcmm: sum %ld",(unsigned long) sum
);
639 if(expect(remote
,sum
,remote
->pzero
+remote
->szero
))
644 else if(expect(remote
,sum
,remote
->pone
+remote
->sone
))
649 else if(expect(remote
,sum
,remote
->ptwo
+remote
->stwo
))
654 else if(expect(remote
,sum
,remote
->pthree
+remote
->sthree
))
661 LOGPRINTF(2,"no match for %d+%d=%d",
663 return((ir_code
) -1);
668 else if(is_grundig(remote
))
670 lirc_t deltap
,deltas
,sum
;
675 logprintf(LOG_ERR
,"invalid bit number.");
676 return((ir_code
) -1);
678 if(!sync_pending_pulse(remote
)) return ((ir_code
) -1);
679 for(laststate
=state
=-1,i
=0;i
<bits
;)
681 deltas
=get_next_space(remote
->szero
+remote
->sone
+
682 remote
->stwo
+remote
->sthree
);
683 deltap
=get_next_pulse(remote
->pzero
+remote
->pone
+
684 remote
->ptwo
+remote
->pthree
);
685 if(deltas
==0 || deltap
==0)
687 logprintf(LOG_ERR
,"failed on bit %d",
689 return((ir_code
) -1);
692 LOGPRINTF(3,"grundig: sum %ld",(unsigned long) sum
);
693 if(expect(remote
,sum
,remote
->szero
+remote
->pzero
))
698 else if(expect(remote
,sum
,remote
->sone
+remote
->pone
))
703 else if(expect(remote
,sum
,remote
->stwo
+remote
->ptwo
))
708 else if(expect(remote
,sum
,remote
->sthree
+remote
->pthree
))
715 LOGPRINTF(2,"no match for %d+%d=%d",
717 return((ir_code
) -1);
719 if(state
==3) /* 6T */
721 i
+=2;code
<<=2;state
=-1;
724 else if(laststate
==2 && state
==0) /* 4T2T */
726 i
+=2;code
<<=2;state
=-1;
729 else if(laststate
==1 && state
==1) /* 3T3T */
731 i
+=2;code
<<=2;state
=-1;
734 else if(laststate
==0 && state
==2) /* 2T4T */
736 i
+=2;code
<<=2;state
=-1;
739 else if(laststate
==-1)
745 logprintf(LOG_ERR
,"invalid state %d:%d",
747 return((ir_code
) -1);
753 else if(is_serial(remote
))
756 int space
, start_bit
, stop_bit
, parity_bit
;
758 lirc_t delta
,origdelta
,pending
,expecting
, gap_delta
;
760 lirc_t max_space
, max_pulse
;
762 base
=1000000/remote
->baud
;
765 set_pending_pulse(base
);
768 space
=(rec_buffer
.pendingp
==0); /* expecting space ? */
773 stop
=base
*remote
->stop_bits
/2;
777 max_space
= remote
->sone
*remote
->bits_in_byte
+stop
;
778 max_pulse
= remote
->pzero
*(1+remote
->bits_in_byte
);
779 if(remote
->parity
!= IR_PARITY_NONE
)
782 max_space
+= remote
->sone
;
783 max_pulse
+= remote
->pzero
;
784 bits
+= bits
/remote
->bits_in_byte
;
787 while(received
<bits
|| stop_bit
)
792 get_next_space(max_space
):
793 get_next_pulse(max_pulse
);
794 if(delta
==0 && space
&&
795 received
+remote
->bits_in_byte
+parity_bit
>=bits
)
804 LOGPRINTF(1,"failed before bit %d",
806 return((ir_code
) -1);
809 rec_buffer
.pendings
:rec_buffer
.pendingp
);
810 if(expect(remote
, delta
, pending
))
814 else if(delta
>pending
)
820 LOGPRINTF(1,"failed before bit %d",
822 return((ir_code
) -1);
828 LOGPRINTF(5, "delta: %lu", delta
);
831 set_pending_pulse(base
);
832 set_pending_space(0);
835 LOGPRINTF(3,"stop bit found");
839 LOGPRINTF(3,"pending bit found");
840 set_pending_pulse(0);
841 set_pending_space(0);
849 expecting
=(space
? remote
->sone
:remote
->pzero
);
850 if(delta
>expecting
|| expect(remote
,delta
,expecting
))
852 delta
-=(expecting
>delta
? delta
:expecting
);
857 LOGPRINTF(2,"adding %d",space
);
858 if(received
%(remote
->bits_in_byte
+parity_bit
)==0)
862 if((remote
->parity
== IR_PARITY_EVEN
&& parity
) ||
863 (remote
->parity
== IR_PARITY_ODD
&& !parity
))
865 LOGPRINTF(1, "parity error "
868 return((ir_code
) -1);
872 /* parity bit is filtered out */
873 temp
=code
>>(remote
->bits_in_byte
+parity_bit
);
874 code
=temp
<<remote
->bits_in_byte
|
875 reverse(code
>>parity_bit
,
876 remote
->bits_in_byte
);
878 if(space
&& delta
==0)
880 LOGPRINTF(1,"failed at stop "
883 return((ir_code
) -1);
885 LOGPRINTF(3,"awaiting stop bit");
886 set_pending_space(stop
);
894 LOGPRINTF(1,"framing error after "
895 "%d bits",received
+1);
896 return((ir_code
) -1);
905 if(gap_delta
) unget_rec_buffer_delta(gap_delta
);
906 set_pending_pulse(0);
907 set_pending_space(0);
910 else if(is_bo(remote
))
913 lirc_t deltap
,deltas
;
917 for(i
=0; i
<bits
; i
++)
920 deltap
=get_next_pulse(remote
->pzero
+remote
->pone
+
921 remote
->ptwo
+remote
->pthree
);
922 deltas
=get_next_space(remote
->szero
+remote
->sone
+
923 remote
->stwo
+remote
->sthree
);
924 if(deltap
==0 || deltas
==0)
926 logprintf(LOG_ERR
,"failed on bit %d",
928 return((ir_code
) -1);
932 pzero
= remote
->pone
;
933 szero
= remote
->sone
;
939 pzero
= remote
->ptwo
;
940 szero
= remote
->stwo
;
941 pone
= remote
->pthree
;
942 sone
= remote
->sthree
;
944 LOGPRINTF(5, "%lu %lu %lu %lu", pzero
, szero
, pone
, sone
);
945 if(expect(remote
, deltap
, pzero
))
947 if(expect(remote
, deltas
, szero
))
956 if(expect(remote
, deltap
, pone
))
958 if(expect(remote
, deltas
, sone
))
966 logprintf(LOG_ERR
,"failed on bit %d",
968 return((ir_code
) -1);
976 if(is_goldstar(remote
))
981 remote
->pone
=remote
->ptwo
;
982 remote
->sone
=remote
->stwo
;
987 remote
->pone
=remote
->pthree
;
988 remote
->sone
=remote
->sthree
;
992 if(expectone(remote
,done
+i
))
997 else if(expectzero(remote
,done
+i
))
1004 LOGPRINTF(1,"failed on bit %d",done
+i
+1);
1005 return((ir_code
) -1);
1011 ir_code
get_pre(struct ir_remote
*remote
)
1015 pre
=get_data(remote
,remote
->pre_data_bits
,0);
1017 if(pre
==(ir_code
) -1)
1019 LOGPRINTF(1,"failed on pre_data");
1020 return((ir_code
) -1);
1022 if(remote
->pre_p
>0 && remote
->pre_s
>0)
1024 if(!expectpulse(remote
,remote
->pre_p
))
1025 return((ir_code
) -1);
1026 set_pending_space(remote
->pre_s
);
1031 ir_code
get_post(struct ir_remote
*remote
)
1035 if(remote
->post_p
>0 && remote
->post_s
>0)
1037 if(!expectpulse(remote
,remote
->post_p
))
1038 return((ir_code
) -1);
1039 set_pending_space(remote
->post_s
);
1042 post
=get_data(remote
,remote
->post_data_bits
,remote
->pre_data_bits
+
1045 if(post
==(ir_code
) -1)
1047 LOGPRINTF(1,"failed on post_data");
1048 return((ir_code
) -1);
1053 int receive_decode(struct ir_remote
*remote
,
1054 ir_code
*prep
,ir_code
*codep
,ir_code
*postp
,
1056 lirc_t
*min_remaining_gapp
, lirc_t
*max_remaining_gapp
)
1058 ir_code pre
,code
,post
,code_mask
=0,post_mask
=0;
1061 struct timeval current
;
1063 sync
=0; /* make compiler happy */
1067 if(hw
.rec_mode
==LIRC_MODE_MODE2
||
1068 hw
.rec_mode
==LIRC_MODE_PULSE
||
1069 hw
.rec_mode
==LIRC_MODE_RAW
)
1071 rewind_rec_buffer();
1072 rec_buffer
.is_biphase
=is_biphase(remote
) ? 1:0;
1074 /* we should get a long space first */
1075 if(!(sync
=sync_rec_buffer(remote
)))
1077 LOGPRINTF(1,"failed on sync");
1081 LOGPRINTF(1,"sync");
1083 if(has_repeat(remote
) && last_remote
==remote
)
1085 if(remote
->flags
&REPEAT_HEADER
&& has_header(remote
))
1087 if(!get_header(remote
))
1089 LOGPRINTF(1,"failed on repeat "
1093 LOGPRINTF(1,"repeat header");
1095 if(get_repeat(remote
))
1097 if(remote
->last_code
==NULL
)
1099 logprintf(LOG_NOTICE
,"repeat code "
1100 "without last_code "
1105 *prep
=remote
->pre_data
;
1106 *codep
=remote
->last_code
->code
;
1107 *postp
=remote
->post_data
;
1110 *min_remaining_gapp
=
1112 (min_gap(remote
)>rec_buffer
.sum
?
1113 min_gap(remote
)-rec_buffer
.sum
:0):
1114 (has_repeat_gap(remote
) ?
1115 remote
->repeat_gap
:min_gap(remote
));
1116 *max_remaining_gapp
=
1118 (max_gap(remote
)>rec_buffer
.sum
?
1119 max_gap(remote
)-rec_buffer
.sum
:0):
1120 (has_repeat_gap(remote
) ?
1121 remote
->repeat_gap
:max_gap(remote
));
1126 LOGPRINTF(1,"no repeat");
1127 rewind_rec_buffer();
1128 sync_rec_buffer(remote
);
1133 if(has_header(remote
))
1136 if(!get_header(remote
))
1139 if(!(remote
->flags
&NO_HEAD_REP
&&
1140 expect_at_most(remote
,sync
,max_gap(remote
))))
1142 LOGPRINTF(1,"failed on header");
1146 LOGPRINTF(1,"header");
1152 struct ir_ncode
*codes
,*found
;
1155 if(hw
.rec_mode
==LIRC_MODE_CODE
||
1156 hw
.rec_mode
==LIRC_MODE_LIRCCODE
)
1159 codes
=remote
->codes
;
1161 while(codes
->name
!=NULL
&& found
==NULL
)
1164 for(i
=0;i
<codes
->length
;)
1166 if(!expectpulse(remote
,codes
->signals
[i
++]))
1169 rewind_rec_buffer();
1170 sync_rec_buffer(remote
);
1173 if(i
<codes
->length
&&
1174 !expectspace(remote
,codes
->signals
[i
++]))
1177 rewind_rec_buffer();
1178 sync_rec_buffer(remote
);
1188 min_gap(remote
)-rec_buffer
.sum
:
1192 if(found
==NULL
) return(0);
1197 if(hw
.rec_mode
==LIRC_MODE_CODE
||
1198 hw
.rec_mode
==LIRC_MODE_LIRCCODE
)
1203 # ifdef LONG_IR_CODE
1204 LOGPRINTF(1,"decoded: %llx",rec_buffer
.decoded
);
1206 LOGPRINTF(1,"decoded: %lx",rec_buffer
.decoded
);
1208 if((hw
.rec_mode
==LIRC_MODE_CODE
&&
1209 hw
.code_length
<bit_count(remote
))
1211 (hw
.rec_mode
==LIRC_MODE_LIRCCODE
&&
1212 hw
.code_length
!=bit_count(remote
)))
1217 for(i
=0;i
<remote
->post_data_bits
;i
++)
1219 post_mask
=(post_mask
<<1)+1;
1221 post
=rec_buffer
.decoded
&post_mask
;
1224 rec_buffer
.decoded
>>remote
->post_data_bits
;
1225 for(i
=0;i
<remote
->bits
;i
++)
1227 code_mask
=(code_mask
<<1)+1;
1229 code
=rec_buffer
.decoded
&code_mask
;
1231 pre
=rec_buffer
.decoded
>>remote
->bits
;
1232 gettimeofday(¤t
,NULL
);
1233 sum
=remote
->phead
+remote
->shead
+
1234 lirc_t_max(remote
->pone
+remote
->sone
,
1235 remote
->pzero
+remote
->szero
)*
1239 remote
->pfoot
+remote
->sfoot
+
1240 remote
->pre_p
+remote
->pre_s
+
1241 remote
->post_p
+remote
->post_s
;
1243 rec_buffer
.sum
=sum
>=remote
->gap
? remote
->gap
-1:sum
;
1244 sync
=time_elapsed(&remote
->last_send
,¤t
)-
1249 if(!get_lead(remote
))
1251 LOGPRINTF(1,"failed on leading pulse");
1257 pre
=get_pre(remote
);
1258 if(pre
==(ir_code
) -1)
1260 LOGPRINTF(1,"failed on pre");
1263 # ifdef LONG_IR_CODE
1264 LOGPRINTF(1,"pre: %llx",pre
);
1266 LOGPRINTF(1,"pre: %lx",pre
);
1270 code
=get_data(remote
,remote
->bits
,
1271 remote
->pre_data_bits
);
1272 if(code
==(ir_code
) -1)
1274 LOGPRINTF(1,"failed on code");
1277 # ifdef LONG_IR_CODE
1278 LOGPRINTF(1,"code: %llx",code
);
1280 LOGPRINTF(1,"code: %lx",code
);
1283 if(has_post(remote
))
1285 post
=get_post(remote
);
1286 if(post
==(ir_code
) -1)
1288 LOGPRINTF(1,"failed on post");
1291 # ifdef LONG_IR_CODE
1292 LOGPRINTF(1,"post: %llx",post
);
1294 LOGPRINTF(1,"post: %lx",post
);
1297 if(!get_trail(remote
))
1299 LOGPRINTF(1,"failed on trailing pulse");
1302 if(has_foot(remote
))
1304 if(!get_foot(remote
))
1306 LOGPRINTF(1,"failed on foot");
1310 if(header
==1 && is_const(remote
) &&
1311 (remote
->flags
&NO_HEAD_REP
))
1313 rec_buffer
.sum
-=remote
->phead
+remote
->shead
;
1317 if(!get_gap(remote
,1000))
1320 else if(is_const(remote
))
1323 min_gap(remote
)>rec_buffer
.sum
?
1324 min_gap(remote
)-rec_buffer
.sum
:0))
1329 if(!get_gap(remote
, min_gap(remote
)))
1332 } /* end of mode specific code */
1334 *prep
=pre
;*codep
=code
;*postp
=post
;
1335 if((!has_repeat(remote
) || remote
->reps
<remote
->min_code_repeat
) &&
1336 expect_at_most(remote
, sync
, remote
->max_remaining_gap
))
1340 if(hw
.rec_mode
==LIRC_MODE_CODE
||
1341 hw
.rec_mode
==LIRC_MODE_LIRCCODE
)
1343 /* Most TV cards don't pass each signal to the
1344 driver. This heuristic should fix repeat in such
1346 if(time_elapsed(&remote
->last_send
,¤t
)<325000)
1351 if(is_const(remote
))
1353 *min_remaining_gapp
=min_gap(remote
)>rec_buffer
.sum
?
1354 min_gap(remote
)-rec_buffer
.sum
:0;
1355 *max_remaining_gapp
=max_gap(remote
)>rec_buffer
.sum
?
1356 max_gap(remote
)-rec_buffer
.sum
:0;
1360 *min_remaining_gapp
=min_gap(remote
);
1361 *max_remaining_gapp
=max_gap(remote
);