~jon-raiford/mythbuntu/lirc

« back to all changes in this revision

Viewing changes to debian/patches/appleir_repeat_issue.patch

  • Committer: Jon Raiford
  • Date: 2010-04-10 22:44:59 UTC
  • mfrom: (129.1.8 lirc)
  • Revision ID: jon@raiford.org-20100410224459-pf4qy9gtxlft2upn
updated to latest sources

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
## Description: add some description
 
2
## Origin/Author: add some origin or author
 
3
## Bug: bug URL
 
4
Index: lirc/daemons/hw_hiddev.c
 
5
===================================================================
 
6
--- lirc.orig/daemons/hw_hiddev.c       2010-03-27 23:49:25.207227120 -0500
 
7
+++ lirc/daemons/hw_hiddev.c    2010-03-27 23:49:21.755255839 -0500
 
8
@@ -74,7 +74,16 @@
 
9
 static unsigned int pre_code;
 
10
 static signed int main_code = 0;
 
11
 
 
12
-static int repeat_flag = 0;
 
13
+static struct timeval start,end,last;
 
14
+
 
15
+enum
 
16
+{
 
17
+       RPT_UNKNOWN = -1,
 
18
+       RPT_NO = 0,
 
19
+       RPT_YES = 1,
 
20
+};
 
21
+
 
22
+static int repeat_state = RPT_UNKNOWN;
 
23
 
 
24
 /* Remotec Mediamaster specific */
 
25
 struct hardware hw_bw6130=
 
26
@@ -236,9 +245,20 @@
 
27
        
 
28
        LOGPRINTF(1, "lirc code: 0x%X", *codep);
 
29
 
 
30
-       *repeat_flagp = repeat_flag;
 
31
-       *min_remaining_gapp = 0;
 
32
-       *max_remaining_gapp = 0;
 
33
+       map_gap(remote, &start, &last, 0, repeat_flagp,
 
34
+               min_remaining_gapp, max_remaining_gapp);
 
35
+       /* override repeat */
 
36
+       switch( repeat_state )
 
37
+       {
 
38
+       case RPT_NO:
 
39
+               *repeat_flagp = 0;
 
40
+               break;
 
41
+       case RPT_YES:
 
42
+               *repeat_flagp = 1;
 
43
+               break;
 
44
+       default:
 
45
+               break;
 
46
+       }
 
47
        
 
48
        return 1;
 
49
 }
 
50
@@ -259,7 +279,9 @@
 
51
        int i;
 
52
        
 
53
        LOGPRINTF(1, "hiddev_rec");
 
54
-       
 
55
+
 
56
+       last=end;
 
57
+       gettimeofday(&start,NULL);      
 
58
        rd = read(hw.fd, &event, sizeof event);
 
59
        if (rd != sizeof event) {
 
60
                logprintf(LOG_ERR, "error reading '%s'", hw.device);
 
61
@@ -306,10 +328,11 @@
 
62
                pre_code = event.hid;
 
63
                main_code = event.value;
 
64
        }
 
65
+       gettimeofday(&end,NULL);
 
66
 
 
67
        if (event.hid == 0x10046) {
 
68
                struct timeval now;
 
69
-               repeat_flag = (main_code & dvico_repeat_mask);
 
70
+               repeat_state = (main_code & dvico_repeat_mask) ? RPT_YES : RPT_NO;
 
71
                main_code = (main_code & ~dvico_repeat_mask);
 
72
                
 
73
                gettimeofday (&now, NULL);
 
74
@@ -323,7 +346,7 @@
 
75
                /* previous valid code because it is likely that they are  */
 
76
                /* spurious.                                               */
 
77
 
 
78
-               if(repeat_flag)
 
79
+               if(repeat_state == RPT_YES)
 
80
                {
 
81
                        if(time_elapsed(&time_of_last_code, &now) > 500000)
 
82
                        {
 
83
@@ -332,7 +355,7 @@
 
84
                }
 
85
                time_of_last_code = now;
 
86
                
 
87
-               LOGPRINTF(1, "main 0x%X  repeat flag 0x%X", main_code, repeat_flag);
 
88
+               LOGPRINTF(1, "main 0x%X  repeat state 0x%X", main_code, repeat_state);
 
89
                return decode_all(remotes);
 
90
 #if 0
 
91
                /* the following code could be used to recreate the
 
92
@@ -346,7 +369,7 @@
 
93
                pre = event.value&0xff;
 
94
                pre_code = reverse(~pre, 8)<<8 | reverse(pre, 8);
 
95
                
 
96
-               repeat_flag = (event.value & dvico_repeat_mask);
 
97
+               repeat_state = (event.value & dvico_repeat_mask) ? RPT_YES : RPT_NO;
 
98
                
 
99
                main = (event.value&0x7f00) >> 8;
 
100
                main_code = reverse(main, 8)<<8 | reverse(~main, 8);
 
101
@@ -426,7 +449,7 @@
 
102
            (event.value != 0xFFFFFFFF) &&
 
103
            (event.value != 0xFFFFFFAA))
 
104
        {
 
105
-               if (old_main_code == main_code) repeat_flag = 1;
 
106
+               if (old_main_code == main_code) repeat_state = RPT_YES;
 
107
                old_main_code = main_code;
 
108
                if (main_code==0x40) {  /* the mousedial has been touched */
 
109
                        wheel_count=1;
 
110
@@ -435,7 +458,7 @@
 
111
                return decode_all(remotes);
 
112
        }
 
113
        else if ((event.hid == 0xFFA10003) && (event.value == 0xFFFFFFAA)) {
 
114
-               repeat_flag = 0;
 
115
+               repeat_state = RPT_NO;
 
116
                old_main_code = 0;
 
117
        }
 
118
 
 
119
@@ -485,7 +508,10 @@
 
120
        pre_code_length = 16;
 
121
        main_code_length = 16;
 
122
        pre_code = 0x8322;
 
123
-       repeat_flag = 0;
 
124
+       repeat_state = RPT_NO;
 
125
+
 
126
+       last=end;
 
127
+       gettimeofday(&start,NULL);
 
128
 
 
129
        rd = read(hw.fd, &uref, sizeof(uref));
 
130
        if (rd < 0) {
 
131
@@ -495,6 +521,8 @@
 
132
                return 0;
 
133
        }
 
134
 
 
135
+       gettimeofday(&end,NULL);
 
136
+
 
137
        if (uref.field_index == HID_FIELD_INDEX_NONE) {
 
138
                /*
 
139
                 * we get this when the new report has been send from
 
140
@@ -549,6 +577,8 @@
 
141
 
 
142
        LOGPRINTF(1, "macmini_rec");
 
143
 
 
144
+       last=end;
 
145
+       gettimeofday(&start,NULL);
 
146
        for (i=0;i<4;i++)
 
147
        {
 
148
                if(i>0 && !waitfordata(TIMEOUT))
 
149
@@ -563,18 +593,18 @@
 
150
                        return 0;
 
151
                }
 
152
        }
 
153
+       gettimeofday(&end,NULL);
 
154
 
 
155
-       gettimeofday (&now, NULL);
 
156
        /* Record the code */
 
157
        pre_code_length = 0;
 
158
        pre_code = 0;
 
159
        main_code = (ev[0].value << 24) + (ev[1].value << 16) +
 
160
                    (ev[2].value <<  8) + (ev[3].value <<  0);
 
161
-       repeat_flag = 0;
 
162
+       repeat_state = RPT_UNKNOWN;
 
163
        if (main_code == 0)
 
164
        {
 
165
                /* some variants seem to send 0 to indicate repeats */
 
166
-               if(time_elapsed(&time_of_last_code, &now) > 500000)
 
167
+               if(time_elapsed(&time_of_last_code, &end) > 500000)
 
168
                {
 
169
                        /* but some send 0 if they receive codes from
 
170
                           a different remote, so only send repeats if
 
171
@@ -582,13 +612,10 @@
 
172
                        return NULL;
 
173
                }
 
174
                main_code = old_main_code;
 
175
-       }
 
176
-       if (old_main_code == main_code)
 
177
-       {
 
178
-               repeat_flag = 1;
 
179
+               repeat_state = RPT_YES;
 
180
        }
 
181
        old_main_code = main_code;
 
182
-       time_of_last_code = now;
 
183
+       time_of_last_code = end;
 
184
 
 
185
        return decode_all(remotes);
 
186
 }
 
187
@@ -634,8 +661,10 @@
 
188
        pre_code_length = 0;
 
189
        main_code_length = 32;
 
190
        pre_code = 0;
 
191
-       repeat_flag = 0;
 
192
+       repeat_state = RPT_NO;
 
193
 
 
194
+       last=end;
 
195
+       gettimeofday(&start,NULL);
 
196
        rd = read(hw.fd, &uref, sizeof(uref));
 
197
        if (rd < 0) {
 
198
                logprintf(LOG_ERR, "error reading '%s'", hw.device);
 
199
@@ -643,6 +672,7 @@
 
200
                hiddev_deinit();
 
201
                return 0;
 
202
        }
 
203
+       gettimeofday(&end,NULL);
 
204
 
 
205
        if (uref.field_index == HID_FIELD_INDEX_NONE) {
 
206
                /*