Merge lp:~bregma/geis/lp-891731 into lp:geis

Proposed by Stephen M. Webb on 2011-12-06
Status: Merged
Merged at revision: 178
Proposed branch: lp:~bregma/geis/lp-891731
Merge into: lp:geis
Diff against target: 602 lines (+511/-12)
5 files modified
libutouch-geis/backend/xcb/geis_xcb_backend_token.c (+28/-12)
testsuite/geis2/lp891731.py (+209/-0)
testsuite/geis2/test_device1.events (+210/-0)
testsuite/geis2/test_device1.prop (+32/-0)
testsuite/geis2/test_device2.prop (+32/-0)
To merge this branch: bzr merge lp:~bregma/geis/lp-891731
Reviewer Review Type Date Requested Status
Chase Douglas (community) 2011-12-06 Approve on 2011-12-07
Jussi Pakkanen (community) Approve on 2011-12-07
Review via email: mp+84542@code.launchpad.net

This proposal supersedes a proposal from 2011-11-25.

Description of the change

Properly handles the case of no matching devices in a filter (LP: #891731).

Includes a semi-automatic test case testsuite/geis2/lp-891731.py. It's semi-automatic in that it reproduces the bug without the fix and passes with the fix as if it were automated, but because it uses utouch-evemu to create pseudodevices, it must be manually run with elevated privileges and so is not suitable for automated testing at this time.

This merge request provides the same fix code but an entirely new test driver program. there is no need for touch hardware on the test system but a working X server is required.

To post a comment you must log in.
Chase Douglas (chasedouglas) wrote : Posted in a previous version of this proposal

It's not the cleanest fix, but it gets the job done. I'm assuming Stephen has tried to think of cleaner fixes, so this is probably the easiest we can do without a big overhaul of some piece.

I think the code and testcase are fine, but the testcase needs documentation. Any manual testcase needs to have a description of the required environment, how to run the test, and expected results.

review: Needs Fixing
Stephen M. Webb (bregma) wrote : Posted in a previous version of this proposal

Added test case documentation (in the source code for the test case).

Chase Douglas (chasedouglas) wrote : Posted in a previous version of this proposal

The comment is good. I didn't really understand what the test was doing until now.

I think the test case would be easier to run if it did the following:

1. If a direct touch device is found, print a message like "SKIP (Reason: Touchscreen device must not be present)", then exit.

2. If an indirect touch device also is not found, print a message like "SKIP (Reason: Indirect touch device must be present)", then exit.

3. Prompt the user with something like: "Place two touches on an attached multitouch device. An error will be printed if the test fails. If no message is printed, the test passed."

For extra kudos, you could detect the devices, and if one class is present and the other is missing you could then do the subscription for the missing class. This would allow testing on a tablet, for example.

review: Needs Fixing
Jussi Pakkanen (jpakkane) wrote :

Looks good. The only change I would consider is naming match_count into something like matched_devices or matched_device_count to make its meaning clearer, though this can certainly be merged as is.

review: Approve
Chase Douglas (chasedouglas) wrote :

This comment gave me a hard time:

# need to guarabtee there is a device we can feed events to

I figured it out after a few seconds :). Otherwise it looks good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libutouch-geis/backend/xcb/geis_xcb_backend_token.c'
2--- libutouch-geis/backend/xcb/geis_xcb_backend_token.c 2011-10-17 16:52:22 +0000
3+++ libutouch-geis/backend/xcb/geis_xcb_backend_token.c 2011-12-06 01:12:23 +0000
4@@ -38,6 +38,9 @@
5 /* The maximum nuimber of regions supported. */
6 #define MAX_NUM_WINDOWS 10
7
8+/* A special device_id to indicate "no devices" */
9+#define GEIS_XCB_NO_DEVICES ((uint16_t)(-1))
10+
11
12 struct XcbBackendToken
13 {
14@@ -291,19 +294,19 @@
15 _token_select_xcb_events(XcbBackendToken token)
16 {
17 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
18- int dev;
19- int win;
20-
21- for (dev = 0; dev < token->device_count; ++dev)
22+ for (int dev = 0; dev < token->device_count; ++dev)
23 {
24- for (win = 0; win < token->window_count; ++win)
25+ if (token->devices[dev] != GEIS_XCB_NO_DEVICES)
26 {
27- geis_debug("window_id=0x%08x device_id=%d",
28- token->windows[win], token->devices[dev]);
29- geis_xcb_backend_select_events(token->be,
30- token->devices[dev],
31- token->windows[win]);
32- status = GEIS_STATUS_SUCCESS;
33+ for (int win = 0; win < token->window_count; ++win)
34+ {
35+ geis_debug("window_id=0x%08x device_id=%d",
36+ token->windows[win], token->devices[dev]);
37+ geis_xcb_backend_select_events(token->be,
38+ token->devices[dev],
39+ token->windows[win]);
40+ status = GEIS_STATUS_SUCCESS;
41+ }
42 }
43 }
44 return status;
45@@ -410,6 +413,7 @@
46 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
47 XcbBackendToken t = _xcb_token_from_geis_token(token);
48 Geis geis = geis_xcb_backend_geis(t->be);
49+ GeisSize match_count = 0;
50
51 if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_NAME)
52 && op == GEIS_FILTER_OP_EQ)
53@@ -425,6 +429,7 @@
54 if (0 == strcmp(geis_device_name(device), device_name))
55 {
56 status = _token_add_device_id(t, geis_device_id(device));
57+ ++match_count;
58 }
59 }
60 }
61@@ -434,6 +439,7 @@
62 GeisInteger device_id = *(GeisInteger*)value;
63 geis_debug("attr name=\"%s\" value=%d", name, device_id);
64 status = _token_add_device_id(t, device_id);
65+ ++match_count;
66 }
67 else if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_DIRECT_TOUCH)
68 && op == GEIS_FILTER_OP_EQ)
69@@ -456,6 +462,7 @@
70 if (geis_attr_value_to_boolean(attr) == is_direct)
71 {
72 status = _token_add_device_id(t, geis_device_id(device));
73+ ++match_count;
74 }
75 break;
76 }
77@@ -483,12 +490,21 @@
78 if (geis_attr_value_to_boolean(attr) == is_independent)
79 {
80 status = _token_add_device_id(t, geis_device_id(device));
81+ ++match_count;
82 }
83 break;
84 }
85 }
86 }
87- }
88+
89+ }
90+
91+ /* special case of no matching devices */
92+ if (match_count == 0)
93+ {
94+ status = _token_add_device_id(t, GEIS_XCB_NO_DEVICES);
95+ }
96+
97 return status;
98 }
99
100
101=== added file 'testsuite/geis2/lp891731.py'
102--- testsuite/geis2/lp891731.py 1970-01-01 00:00:00 +0000
103+++ testsuite/geis2/lp891731.py 2011-12-06 01:12:23 +0000
104@@ -0,0 +1,209 @@
105+#!/usr/bin/python
106+#
107+# When a device filter term is added to a subscription and there is no device
108+# present to match the filter, the term causes ALL devices to be selected
109+# instead of NONE. This is the reverse to how filters should work.
110+#
111+# The error occurred when filtering on any of GEIS_DEVICE_ATTRIBUTE_NAME,
112+# GEIS_DEVICE_ATTRIBUTE_DIRECT_TOUCH, or GEIS_DEVICE_ATTRIBUTE_INDEPENDENT_TOUCH
113+# attributes.
114+#
115+# Here's how the test works. There are two devices: device1 is the device on
116+# which all input is actaully occurring. We have subscribed to device2 by name
117+# but not device1, so we shouldn;t be seeing any gesture events coming in. If
118+# we do, the bug has obtained and we fail. If we don't and the timer goes off,
119+# assume success.
120+#
121+# Just to assure everything is working, there's an option to subscribe to
122+# device1 as well, in which case we should see events only on device1.
123+#
124+# Because this test tool talks to kernel input devices (through evdev), it must
125+# be run as root.
126+#
127+
128+#
129+# Copyright 2011 Canonical Ltd.
130+#
131+# This program is free software: you can redistribute it and/or modify it
132+# under the terms of the GNU General Public License version 3, as published
133+# by the Free Software Foundation.
134+#
135+# This program is distributed in the hope that it will be useful, but
136+# WITHOUT ANY WARRANTY; without even the implied warranties of
137+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
138+# PURPOSE. See the GNU General Public License for more details.
139+#
140+# You should have received a copy of the GNU General Public License along
141+# with this program. If not, see <http://www.gnu.org/licenses/>.
142+#
143+
144+import argparse
145+import evemu
146+import geis
147+import glib
148+import os
149+import sys
150+
151+
152+class Tester(object):
153+
154+ def __init__(self, args):
155+ super(Tester, self).__init__()
156+ self._args = args
157+ self._has_filter = False
158+ self._device_1_id = 0
159+
160+ # need to guarabtee there is a device we can feed events to
161+ self._device1 = evemu.Device(self._find_data_file("test_device1.prop"))
162+ device2 = evemu.Device(self._find_data_file("test_device2.prop"))
163+ self._device_2_name = device2.name
164+
165+ # need a geis instance
166+ self._geis = geis.Geis(geis.GEIS_INIT_TRACK_DEVICES)
167+ self._sub = geis.Subscription(self._geis)
168+
169+
170+ def _find_data_file(self, filename):
171+ f = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), filename)
172+ return open(f)
173+
174+ def get_fd(self):
175+ return self._geis.get_configuration(geis.GEIS_CONFIGURATION_FD)
176+
177+
178+ def create_subscriptions(self):
179+ """
180+ Creates a filter to allow only gesture events from device2.
181+ """
182+ print "create_subscriptions"
183+ filt = geis.Filter(self._geis, "lp-891731")
184+ filt.add_term(geis.GEIS_FILTER_DEVICE,
185+ (geis.GEIS_DEVICE_ATTRIBUTE_NAME,
186+ geis.GEIS_FILTER_OP_EQ,
187+ self._device_2_name))
188+ self._sub.add_filter(filt)
189+ self._has_filter = True
190+ print ".. self._args.force=%s" % self._args.force
191+ if self._args.force:
192+ filt = geis.Filter(self._geis, "force")
193+ filt.add_term(geis.GEIS_FILTER_DEVICE,
194+ (geis.GEIS_DEVICE_ATTRIBUTE_NAME,
195+ geis.GEIS_FILTER_OP_EQ,
196+ self._device1.name))
197+ self._sub.add_filter(filt)
198+
199+
200+ def do_init_complete(self, event):
201+ """
202+ Creates a subscription ONLY on the second device and generates input
203+ ONLY from the first device.
204+ """
205+ print "do_init_complete"
206+ self.create_subscriptions()
207+ self._sub.activate()
208+ self._device1.play(self._find_data_file("test_device1.events"))
209+
210+
211+ def do_device_available(self, event):
212+ """
213+ Verifies and remembers the two devices as their reported.
214+ """
215+ device = event.attrs()[geis.GEIS_EVENT_ATTRIBUTE_DEVICE]
216+ print "do_device_available: %s" % device.name()
217+ if device.name() == self._device1.name:
218+ self._device_1_id = device.id()
219+ print ".. device id = %s" % self._device_1_id
220+
221+ def do_gesture_event(self, event):
222+ print "do_gesture_event"
223+ if not (self._device_1_id > 0 and self._has_filter):
224+ print "devices and filter not set up before other events received."
225+ sys.exit(1)
226+ if self._args.dry_run:
227+ return
228+ groupset = event.attrs()[geis.GEIS_EVENT_ATTRIBUTE_GROUPSET]
229+ if self._args.force:
230+ for group in groupset:
231+ for frame in group:
232+ for (k, v) in frame.attrs().iteritems():
233+ if (k == geis.GEIS_GESTURE_ATTRIBUTE_DEVICE_ID
234+ and v != self._device_1_id):
235+ print "test fail: incorrect device ID, expected %d got %d" % (self._device_1_id, v)
236+ sys.exit(1)
237+ print "test successful (forced)"
238+ sys.exit(0)
239+ print "test failed: unsubscribed events received"
240+ sys.exit(1)
241+
242+
243+ def do_other_event(self, event):
244+ print "do_other_event"
245+
246+
247+ def dispatch_events(self):
248+ """ Performs GEIS event loop processing. """
249+ print "Tester.dispatch_events"
250+ geis_event_action = {
251+ geis.GEIS_EVENT_INIT_COMPLETE: self.do_init_complete.im_func,
252+ geis.GEIS_EVENT_GESTURE_BEGIN: self.do_gesture_event.im_func,
253+ geis.GEIS_EVENT_GESTURE_UPDATE: self.do_gesture_event.im_func,
254+ geis.GEIS_EVENT_GESTURE_END: self.do_gesture_event.im_func,
255+ geis.GEIS_EVENT_DEVICE_AVAILABLE: self.do_device_available.im_func,
256+ }
257+
258+ status = self._geis.dispatch_events()
259+ while status == geis.GEIS_STATUS_CONTINUE:
260+ status = self._geis.dispatch_events()
261+
262+ try:
263+ while True:
264+ event = self._geis.next_event()
265+ geis_event_action.get(event.type(),
266+ self.do_other_event.im_func)(self, event)
267+ except geis.NoMoreEvents:
268+ pass
269+ return True
270+
271+
272+def dispatch_test_events(fd, condition, g):
273+ print "dispatch_test_events"
274+ return g.dispatch_events()
275+
276+
277+def test_timeout():
278+ print "timed out, assuming success"
279+ exit(0)
280+
281+
282+class Options(argparse.ArgumentParser):
283+
284+ def __init__(self):
285+ super(Options, self).__init__(description='test case for LP:891731')
286+ self.add_argument('-d', '--dry-run', action='store_true', dest='dry_run',
287+ help='force the test to bypass by subscribing to no input source')
288+ self.add_argument('-f', '--force', action='store_true', dest='force',
289+ help='force the test to pass by subscribing to the input source')
290+ self.add_argument('-t', '--timeout', action='store', default='5000',
291+ dest='timeout', type=int,
292+ help='milliseconds to wait before ending test')
293+
294+if __name__ == '__main__':
295+ try:
296+ options = Options()
297+ args = options.parse_args()
298+
299+ tester = Tester(args)
300+ ml = glib.MainLoop()
301+ glib.timeout_add(args.timeout, test_timeout)
302+ glib.io_add_watch(tester.get_fd(),
303+ glib.IO_IN,
304+ dispatch_test_events,
305+ tester)
306+ ml.run()
307+
308+ except KeyboardInterrupt:
309+ pass
310+
311+ except argparse.ArgumentError as ex:
312+ print ex
313+ sys,exit(1)
314
315=== added file 'testsuite/geis2/test_device1.events'
316--- testsuite/geis2/test_device1.events 1970-01-01 00:00:00 +0000
317+++ testsuite/geis2/test_device1.events 2011-12-06 01:12:23 +0000
318@@ -0,0 +1,210 @@
319+E: 1323109478.604936 0003 0039 52
320+E: 1323109478.604938 0003 0035 3367
321+E: 1323109478.604939 0003 0036 2268
322+E: 1323109478.604942 0003 0000 3367
323+E: 1323109478.604943 0003 0001 2268
324+E: 1323109478.604944 0003 0018 9
325+E: 1323109478.604944 0003 001c 13
326+E: 1323109478.604945 0001 0145 1
327+E: 1323109478.604947 0000 0000 0
328+E: 1323109478.629818 0003 0035 3363
329+E: 1323109478.629822 0003 0000 3363
330+E: 1323109478.629825 0003 001c 12
331+E: 1323109478.629827 0000 0000 0
332+E: 1323109478.641338 0003 0035 3373
333+E: 1323109478.641340 0003 0036 2187
334+E: 1323109478.641343 0003 0000 3373
335+E: 1323109478.641343 0003 0001 2187
336+E: 1323109478.641344 0003 0018 10
337+E: 1323109478.641345 0003 001c 14
338+E: 1323109478.641347 0000 0000 0
339+E: 1323109478.653409 0003 0018 11
340+E: 1323109478.653411 0003 001c 12
341+E: 1323109478.653413 0000 0000 0
342+E: 1323109478.665509 0003 0035 3389
343+E: 1323109478.665510 0003 0036 2151
344+E: 1323109478.665513 0003 0000 3389
345+E: 1323109478.665514 0003 0001 2151
346+E: 1323109478.665514 0003 0018 12
347+E: 1323109478.665517 0000 0000 0
348+E: 1323109478.676566 0003 0035 3406
349+E: 1323109478.676568 0003 0036 2106
350+E: 1323109478.676571 0003 0000 3406
351+E: 1323109478.676572 0003 0001 2106
352+E: 1323109478.676573 0003 0018 15
353+E: 1323109478.676573 0003 001c 11
354+E: 1323109478.676575 0000 0000 0
355+E: 1323109478.688397 0003 0035 3413
356+E: 1323109478.688398 0003 0036 2055
357+E: 1323109478.688399 0003 0000 3413
358+E: 1323109478.688400 0003 0001 2055
359+E: 1323109478.688400 0003 0018 19
360+E: 1323109478.688401 0003 001c 10
361+E: 1323109478.688402 0000 0000 0
362+E: 1323109478.701637 0003 0035 3432
363+E: 1323109478.701639 0003 0036 2013
364+E: 1323109478.701641 0003 0000 3432
365+E: 1323109478.701642 0003 0001 2013
366+E: 1323109478.701643 0003 0018 27
367+E: 1323109478.701644 0003 001c 8
368+E: 1323109478.701646 0000 0000 0
369+E: 1323109478.724960 0003 0035 2458
370+E: 1323109478.724961 0003 0036 3190
371+E: 1323109478.724962 0003 002f 1
372+E: 1323109478.724962 0003 0039 53
373+E: 1323109478.724962 0003 0035 3424
374+E: 1323109478.724962 0003 0036 1977
375+E: 1323109478.724963 0001 014a 1
376+E: 1323109478.724963 0003 0000 3424
377+E: 1323109478.724964 0003 0001 1977
378+E: 1323109478.724964 0003 0018 42
379+E: 1323109478.724965 0003 001c 5
380+E: 1323109478.724965 0001 0145 0
381+E: 1323109478.724966 0001 014d 1
382+E: 1323109478.724966 0000 0000 0
383+E: 1323109478.748390 0003 002f 0
384+E: 1323109478.748391 0003 0035 2380
385+E: 1323109478.748391 0003 0036 3220
386+E: 1323109478.748394 0003 002f 1
387+E: 1323109478.748394 0003 0035 3416
388+E: 1323109478.748394 0003 0036 1961
389+E: 1323109478.748396 0003 0000 3416
390+E: 1323109478.748396 0003 0001 1961
391+E: 1323109478.748397 0003 0018 49
392+E: 1323109478.748400 0000 0000 0
393+E: 1323109478.772694 0003 002f 0
394+E: 1323109478.772695 0003 0035 2372
395+E: 1323109478.772695 0003 0036 3212
396+E: 1323109478.772696 0003 002f 1
397+E: 1323109478.772696 0003 0035 3412
398+E: 1323109478.772697 0003 0036 1953
399+E: 1323109478.772698 0003 0000 3412
400+E: 1323109478.772699 0003 0001 1953
401+E: 1323109478.772699 0003 0018 51
402+E: 1323109478.772701 0000 0000 0
403+E: 1323109478.797052 0003 002f 0
404+E: 1323109478.797053 0003 0035 2402
405+E: 1323109478.797054 0003 0036 3216
406+E: 1323109478.797058 0003 002f 1
407+E: 1323109478.797059 0003 0035 3415
408+E: 1323109478.797060 0003 0036 1956
409+E: 1323109478.797066 0003 0000 3415
410+E: 1323109478.797066 0003 0001 1956
411+E: 1323109478.797067 0003 0018 53
412+E: 1323109478.797069 0000 0000 0
413+E: 1323109478.821436 0003 002f 0
414+E: 1323109478.821437 0003 0035 2472
415+E: 1323109478.821438 0003 0036 3192
416+E: 1323109478.821443 0003 002f 1
417+E: 1323109478.821443 0003 0035 3506
418+E: 1323109478.821444 0003 0036 1986
419+E: 1323109478.821450 0003 0000 3506
420+E: 1323109478.821451 0003 0001 1986
421+E: 1323109478.821451 0003 0018 54
422+E: 1323109478.821454 0000 0000 0
423+E: 1323109478.845271 0003 002f 0
424+E: 1323109478.845272 0003 0035 2592
425+E: 1323109478.845272 0003 0036 3196
426+E: 1323109478.845273 0003 002f 1
427+E: 1323109478.845273 0003 0035 3675
428+E: 1323109478.845274 0003 0036 2012
429+E: 1323109478.845275 0003 0000 3675
430+E: 1323109478.845275 0003 0001 2012
431+E: 1323109478.845275 0003 0018 55
432+E: 1323109478.845277 0000 0000 0
433+E: 1323109478.870003 0003 002f 0
434+E: 1323109478.870004 0003 0035 2816
435+E: 1323109478.870005 0003 0036 3178
436+E: 1323109478.870008 0003 002f 1
437+E: 1323109478.870008 0003 0035 3866
438+E: 1323109478.870009 0003 0036 2030
439+E: 1323109478.870010 0003 0000 3866
440+E: 1323109478.870011 0003 0001 2030
441+E: 1323109478.870012 0003 0018 56
442+E: 1323109478.870015 0000 0000 0
443+E: 1323109478.893759 0003 002f 0
444+E: 1323109478.893760 0003 0035 2994
445+E: 1323109478.893760 0003 0036 3166
446+E: 1323109478.893763 0003 002f 1
447+E: 1323109478.893763 0003 0035 4069
448+E: 1323109478.893764 0003 0036 2019
449+E: 1323109478.893766 0003 0000 4069
450+E: 1323109478.893767 0003 0001 2019
451+E: 1323109478.893771 0000 0000 0
452+E: 1323109478.918183 0003 002f 0
453+E: 1323109478.918183 0003 0035 3162
454+E: 1323109478.918184 0003 0036 3132
455+E: 1323109478.918187 0003 002f 1
456+E: 1323109478.918187 0003 0035 4214
457+E: 1323109478.918188 0003 0036 2006
458+E: 1323109478.918190 0003 0000 4214
459+E: 1323109478.918190 0003 0001 2006
460+E: 1323109478.918194 0000 0000 0
461+E: 1323109478.941450 0003 002f 0
462+E: 1323109478.941451 0003 0035 3250
463+E: 1323109478.941452 0003 0036 3124
464+E: 1323109478.941456 0003 002f 1
465+E: 1323109478.941456 0003 0035 4282
466+E: 1323109478.941457 0003 0036 1974
467+E: 1323109478.941460 0003 0000 4282
468+E: 1323109478.941461 0003 0001 1974
469+E: 1323109478.941467 0000 0000 0
470+E: 1323109478.966043 0003 002f 0
471+E: 1323109478.966044 0003 0035 3274
472+E: 1323109478.966045 0003 0036 3132
473+E: 1323109478.966048 0003 002f 1
474+E: 1323109478.966048 0003 0035 4296
475+E: 1323109478.966049 0003 0036 1973
476+E: 1323109478.966050 0003 0000 4296
477+E: 1323109478.966051 0003 0001 1973
478+E: 1323109478.966055 0000 0000 0
479+E: 1323109478.990133 0003 002f 0
480+E: 1323109478.990134 0003 0035 3282
481+E: 1323109478.990135 0003 0036 3180
482+E: 1323109478.990138 0003 002f 1
483+E: 1323109478.990138 0003 0035 4299
484+E: 1323109478.990138 0003 0036 1992
485+E: 1323109478.990140 0003 0000 4299
486+E: 1323109478.990141 0003 0001 1992
487+E: 1323109478.990145 0000 0000 0
488+E: 1323109479.014380 0003 002f 0
489+E: 1323109479.014381 0003 0035 3270
490+E: 1323109479.014382 0003 0036 3264
491+E: 1323109479.014385 0003 002f 1
492+E: 1323109479.014385 0003 0035 4142
493+E: 1323109479.014386 0003 0036 3230
494+E: 1323109479.014388 0001 014a 0
495+E: 1323109479.014389 0003 0000 4142
496+E: 1323109479.014390 0003 0001 3230
497+E: 1323109479.014391 0003 0018 17
498+E: 1323109479.014395 0000 0000 0
499+E: 1323109479.026385 0003 002f 0
500+E: 1323109479.026386 0003 0035 3326
501+E: 1323109479.026387 0003 0036 3086
502+E: 1323109479.026388 0003 002f 1
503+E: 1323109479.026388 0003 0039 -1
504+E: 1323109479.026390 0003 0000 3326
505+E: 1323109479.026391 0003 0001 3086
506+E: 1323109479.026392 0003 0018 7
507+E: 1323109479.026393 0003 001c 15
508+E: 1323109479.026394 0001 0145 1
509+E: 1323109479.026395 0001 014d 0
510+E: 1323109479.026396 0000 0000 0
511+E: 1323109479.038191 0003 002f 0
512+E: 1323109479.038192 0003 0035 3446
513+E: 1323109479.038197 0003 0000 3446
514+E: 1323109479.038199 0003 0018 4
515+E: 1323109479.038206 0000 0000 0
516+E: 1323109479.050230 0003 0039 -1
517+E: 1323109479.050234 0003 0018 2
518+E: 1323109479.050235 0003 001c 0
519+E: 1323109479.050236 0001 0145 0
520+E: 1323109479.050237 0000 0000 0
521+E: 1323109479.075276 0003 0018 1
522+E: 1323109479.075278 0000 0000 0
523+E: 1323109479.099762 0003 0018 0
524+E: 1323109479.099764 0000 0000 0
525+E: 1323109479.654050 0003 0018 1
526+E: 1323109479.654052 0000 0000 0
527+E: 1323109479.689390 0003 0018 0
528+E: 1323109479.689391 0000 0000 0
529
530=== added file 'testsuite/geis2/test_device1.prop'
531--- testsuite/geis2/test_device1.prop 1970-01-01 00:00:00 +0000
532+++ testsuite/geis2/test_device1.prop 2011-12-06 01:12:23 +0000
533@@ -0,0 +1,32 @@
534+N: Test Device1
535+I: 0011 0002 0007 01b1
536+P: 09 00 00 00 00 00 00 00
537+B: 00 0b 00 00 00 00 00 00 00
538+B: 01 00 00 00 00 00 00 00 00
539+B: 01 00 00 00 00 00 00 00 00
540+B: 01 00 00 00 00 00 00 00 00
541+B: 01 00 00 00 00 00 00 00 00
542+B: 01 00 00 03 00 00 00 00 00
543+B: 01 20 64 00 00 00 00 00 00
544+B: 01 00 00 00 00 00 00 00 00
545+B: 01 00 00 00 00 00 00 00 00
546+B: 01 00 00 00 00 00 00 00 00
547+B: 01 00 00 00 00 00 00 00 00
548+B: 01 00 00 00 00 00 00 00 00
549+B: 01 00 00 00 00 00 00 00 00
550+B: 02 00 00 00 00 00 00 00 00
551+B: 03 03 00 00 11 00 80 60 02
552+B: 04 00 00 00 00 00 00 00 00
553+B: 05 00 00 00 00 00 00 00 00
554+B: 11 00 00 00 00 00 00 00 00
555+B: 12 00 00 00 00 00 00 00 00
556+B: 15 00 00 00 00 00 00 00 00
557+B: 15 00 00 00 00 00 00 00 00
558+A: 00 1472 5888 0 0
559+A: 01 1408 4820 0 0
560+A: 18 0 255 0 0
561+A: 1c 0 15 0 0
562+A: 2f 0 1 0 0
563+A: 35 1472 5888 0 0
564+A: 36 1408 4820 0 0
565+A: 39 0 65535 0 0
566
567=== added file 'testsuite/geis2/test_device2.prop'
568--- testsuite/geis2/test_device2.prop 1970-01-01 00:00:00 +0000
569+++ testsuite/geis2/test_device2.prop 2011-12-06 01:12:23 +0000
570@@ -0,0 +1,32 @@
571+N: Test Device2
572+I: 0011 0002 0007 01b1
573+P: 09 00 00 00 00 00 00 00
574+B: 00 0b 00 00 00 00 00 00 00
575+B: 01 00 00 00 00 00 00 00 00
576+B: 01 00 00 00 00 00 00 00 00
577+B: 01 00 00 00 00 00 00 00 00
578+B: 01 00 00 00 00 00 00 00 00
579+B: 01 00 00 03 00 00 00 00 00
580+B: 01 20 64 00 00 00 00 00 00
581+B: 01 00 00 00 00 00 00 00 00
582+B: 01 00 00 00 00 00 00 00 00
583+B: 01 00 00 00 00 00 00 00 00
584+B: 01 00 00 00 00 00 00 00 00
585+B: 01 00 00 00 00 00 00 00 00
586+B: 01 00 00 00 00 00 00 00 00
587+B: 02 00 00 00 00 00 00 00 00
588+B: 03 03 00 00 11 00 80 60 02
589+B: 04 00 00 00 00 00 00 00 00
590+B: 05 00 00 00 00 00 00 00 00
591+B: 11 00 00 00 00 00 00 00 00
592+B: 12 00 00 00 00 00 00 00 00
593+B: 15 00 00 00 00 00 00 00 00
594+B: 15 00 00 00 00 00 00 00 00
595+A: 00 1472 5888 0 0
596+A: 01 1408 4820 0 0
597+A: 18 0 255 0 0
598+A: 1c 0 15 0 0
599+A: 2f 0 1 0 0
600+A: 35 1472 5888 0 0
601+A: 36 1408 4820 0 0
602+A: 39 0 65535 0 0

Subscribers

People subscribed via source and target branches