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

Proposed by Stephen M. Webb
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) Approve
Jussi Pakkanen (community) Approve
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.
Revision history for this message
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
Revision history for this message
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).

Revision history for this message
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
Revision history for this message
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
Revision history for this message
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
=== modified file 'libutouch-geis/backend/xcb/geis_xcb_backend_token.c'
--- libutouch-geis/backend/xcb/geis_xcb_backend_token.c 2011-10-17 16:52:22 +0000
+++ libutouch-geis/backend/xcb/geis_xcb_backend_token.c 2011-12-06 01:12:23 +0000
@@ -38,6 +38,9 @@
38/* The maximum nuimber of regions supported. */38/* The maximum nuimber of regions supported. */
39#define MAX_NUM_WINDOWS 1039#define MAX_NUM_WINDOWS 10
4040
41/* A special device_id to indicate "no devices" */
42#define GEIS_XCB_NO_DEVICES ((uint16_t)(-1))
43
4144
42struct XcbBackendToken45struct XcbBackendToken
43{46{
@@ -291,19 +294,19 @@
291_token_select_xcb_events(XcbBackendToken token)294_token_select_xcb_events(XcbBackendToken token)
292{295{
293 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;296 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
294 int dev;297 for (int dev = 0; dev < token->device_count; ++dev)
295 int win;
296
297 for (dev = 0; dev < token->device_count; ++dev)
298 {298 {
299 for (win = 0; win < token->window_count; ++win)299 if (token->devices[dev] != GEIS_XCB_NO_DEVICES)
300 {300 {
301 geis_debug("window_id=0x%08x device_id=%d",301 for (int win = 0; win < token->window_count; ++win)
302 token->windows[win], token->devices[dev]);302 {
303 geis_xcb_backend_select_events(token->be,303 geis_debug("window_id=0x%08x device_id=%d",
304 token->devices[dev],304 token->windows[win], token->devices[dev]);
305 token->windows[win]);305 geis_xcb_backend_select_events(token->be,
306 status = GEIS_STATUS_SUCCESS;306 token->devices[dev],
307 token->windows[win]);
308 status = GEIS_STATUS_SUCCESS;
309 }
307 }310 }
308 }311 }
309 return status;312 return status;
@@ -410,6 +413,7 @@
410 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;413 GeisStatus status = GEIS_STATUS_UNKNOWN_ERROR;
411 XcbBackendToken t = _xcb_token_from_geis_token(token);414 XcbBackendToken t = _xcb_token_from_geis_token(token);
412 Geis geis = geis_xcb_backend_geis(t->be);415 Geis geis = geis_xcb_backend_geis(t->be);
416 GeisSize match_count = 0;
413417
414 if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_NAME)418 if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_NAME)
415 && op == GEIS_FILTER_OP_EQ)419 && op == GEIS_FILTER_OP_EQ)
@@ -425,6 +429,7 @@
425 if (0 == strcmp(geis_device_name(device), device_name))429 if (0 == strcmp(geis_device_name(device), device_name))
426 {430 {
427 status = _token_add_device_id(t, geis_device_id(device));431 status = _token_add_device_id(t, geis_device_id(device));
432 ++match_count;
428 }433 }
429 }434 }
430 }435 }
@@ -434,6 +439,7 @@
434 GeisInteger device_id = *(GeisInteger*)value;439 GeisInteger device_id = *(GeisInteger*)value;
435 geis_debug("attr name=\"%s\" value=%d", name, device_id);440 geis_debug("attr name=\"%s\" value=%d", name, device_id);
436 status = _token_add_device_id(t, device_id);441 status = _token_add_device_id(t, device_id);
442 ++match_count;
437 }443 }
438 else if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_DIRECT_TOUCH)444 else if (0 == strcmp(name, GEIS_DEVICE_ATTRIBUTE_DIRECT_TOUCH)
439 && op == GEIS_FILTER_OP_EQ)445 && op == GEIS_FILTER_OP_EQ)
@@ -456,6 +462,7 @@
456 if (geis_attr_value_to_boolean(attr) == is_direct)462 if (geis_attr_value_to_boolean(attr) == is_direct)
457 {463 {
458 status = _token_add_device_id(t, geis_device_id(device));464 status = _token_add_device_id(t, geis_device_id(device));
465 ++match_count;
459 }466 }
460 break;467 break;
461 }468 }
@@ -483,12 +490,21 @@
483 if (geis_attr_value_to_boolean(attr) == is_independent)490 if (geis_attr_value_to_boolean(attr) == is_independent)
484 {491 {
485 status = _token_add_device_id(t, geis_device_id(device));492 status = _token_add_device_id(t, geis_device_id(device));
493 ++match_count;
486 }494 }
487 break;495 break;
488 }496 }
489 }497 }
490 }498 }
491 }499
500 }
501
502 /* special case of no matching devices */
503 if (match_count == 0)
504 {
505 status = _token_add_device_id(t, GEIS_XCB_NO_DEVICES);
506 }
507
492 return status;508 return status;
493}509}
494510
495511
=== added file 'testsuite/geis2/lp891731.py'
--- testsuite/geis2/lp891731.py 1970-01-01 00:00:00 +0000
+++ testsuite/geis2/lp891731.py 2011-12-06 01:12:23 +0000
@@ -0,0 +1,209 @@
1#!/usr/bin/python
2#
3# When a device filter term is added to a subscription and there is no device
4# present to match the filter, the term causes ALL devices to be selected
5# instead of NONE. This is the reverse to how filters should work.
6#
7# The error occurred when filtering on any of GEIS_DEVICE_ATTRIBUTE_NAME,
8# GEIS_DEVICE_ATTRIBUTE_DIRECT_TOUCH, or GEIS_DEVICE_ATTRIBUTE_INDEPENDENT_TOUCH
9# attributes.
10#
11# Here's how the test works. There are two devices: device1 is the device on
12# which all input is actaully occurring. We have subscribed to device2 by name
13# but not device1, so we shouldn;t be seeing any gesture events coming in. If
14# we do, the bug has obtained and we fail. If we don't and the timer goes off,
15# assume success.
16#
17# Just to assure everything is working, there's an option to subscribe to
18# device1 as well, in which case we should see events only on device1.
19#
20# Because this test tool talks to kernel input devices (through evdev), it must
21# be run as root.
22#
23
24#
25# Copyright 2011 Canonical Ltd.
26#
27# This program is free software: you can redistribute it and/or modify it
28# under the terms of the GNU General Public License version 3, as published
29# by the Free Software Foundation.
30#
31# This program is distributed in the hope that it will be useful, but
32# WITHOUT ANY WARRANTY; without even the implied warranties of
33# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
34# PURPOSE. See the GNU General Public License for more details.
35#
36# You should have received a copy of the GNU General Public License along
37# with this program. If not, see <http://www.gnu.org/licenses/>.
38#
39
40import argparse
41import evemu
42import geis
43import glib
44import os
45import sys
46
47
48class Tester(object):
49
50 def __init__(self, args):
51 super(Tester, self).__init__()
52 self._args = args
53 self._has_filter = False
54 self._device_1_id = 0
55
56 # need to guarabtee there is a device we can feed events to
57 self._device1 = evemu.Device(self._find_data_file("test_device1.prop"))
58 device2 = evemu.Device(self._find_data_file("test_device2.prop"))
59 self._device_2_name = device2.name
60
61 # need a geis instance
62 self._geis = geis.Geis(geis.GEIS_INIT_TRACK_DEVICES)
63 self._sub = geis.Subscription(self._geis)
64
65
66 def _find_data_file(self, filename):
67 f = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), filename)
68 return open(f)
69
70 def get_fd(self):
71 return self._geis.get_configuration(geis.GEIS_CONFIGURATION_FD)
72
73
74 def create_subscriptions(self):
75 """
76 Creates a filter to allow only gesture events from device2.
77 """
78 print "create_subscriptions"
79 filt = geis.Filter(self._geis, "lp-891731")
80 filt.add_term(geis.GEIS_FILTER_DEVICE,
81 (geis.GEIS_DEVICE_ATTRIBUTE_NAME,
82 geis.GEIS_FILTER_OP_EQ,
83 self._device_2_name))
84 self._sub.add_filter(filt)
85 self._has_filter = True
86 print ".. self._args.force=%s" % self._args.force
87 if self._args.force:
88 filt = geis.Filter(self._geis, "force")
89 filt.add_term(geis.GEIS_FILTER_DEVICE,
90 (geis.GEIS_DEVICE_ATTRIBUTE_NAME,
91 geis.GEIS_FILTER_OP_EQ,
92 self._device1.name))
93 self._sub.add_filter(filt)
94
95
96 def do_init_complete(self, event):
97 """
98 Creates a subscription ONLY on the second device and generates input
99 ONLY from the first device.
100 """
101 print "do_init_complete"
102 self.create_subscriptions()
103 self._sub.activate()
104 self._device1.play(self._find_data_file("test_device1.events"))
105
106
107 def do_device_available(self, event):
108 """
109 Verifies and remembers the two devices as their reported.
110 """
111 device = event.attrs()[geis.GEIS_EVENT_ATTRIBUTE_DEVICE]
112 print "do_device_available: %s" % device.name()
113 if device.name() == self._device1.name:
114 self._device_1_id = device.id()
115 print ".. device id = %s" % self._device_1_id
116
117 def do_gesture_event(self, event):
118 print "do_gesture_event"
119 if not (self._device_1_id > 0 and self._has_filter):
120 print "devices and filter not set up before other events received."
121 sys.exit(1)
122 if self._args.dry_run:
123 return
124 groupset = event.attrs()[geis.GEIS_EVENT_ATTRIBUTE_GROUPSET]
125 if self._args.force:
126 for group in groupset:
127 for frame in group:
128 for (k, v) in frame.attrs().iteritems():
129 if (k == geis.GEIS_GESTURE_ATTRIBUTE_DEVICE_ID
130 and v != self._device_1_id):
131 print "test fail: incorrect device ID, expected %d got %d" % (self._device_1_id, v)
132 sys.exit(1)
133 print "test successful (forced)"
134 sys.exit(0)
135 print "test failed: unsubscribed events received"
136 sys.exit(1)
137
138
139 def do_other_event(self, event):
140 print "do_other_event"
141
142
143 def dispatch_events(self):
144 """ Performs GEIS event loop processing. """
145 print "Tester.dispatch_events"
146 geis_event_action = {
147 geis.GEIS_EVENT_INIT_COMPLETE: self.do_init_complete.im_func,
148 geis.GEIS_EVENT_GESTURE_BEGIN: self.do_gesture_event.im_func,
149 geis.GEIS_EVENT_GESTURE_UPDATE: self.do_gesture_event.im_func,
150 geis.GEIS_EVENT_GESTURE_END: self.do_gesture_event.im_func,
151 geis.GEIS_EVENT_DEVICE_AVAILABLE: self.do_device_available.im_func,
152 }
153
154 status = self._geis.dispatch_events()
155 while status == geis.GEIS_STATUS_CONTINUE:
156 status = self._geis.dispatch_events()
157
158 try:
159 while True:
160 event = self._geis.next_event()
161 geis_event_action.get(event.type(),
162 self.do_other_event.im_func)(self, event)
163 except geis.NoMoreEvents:
164 pass
165 return True
166
167
168def dispatch_test_events(fd, condition, g):
169 print "dispatch_test_events"
170 return g.dispatch_events()
171
172
173def test_timeout():
174 print "timed out, assuming success"
175 exit(0)
176
177
178class Options(argparse.ArgumentParser):
179
180 def __init__(self):
181 super(Options, self).__init__(description='test case for LP:891731')
182 self.add_argument('-d', '--dry-run', action='store_true', dest='dry_run',
183 help='force the test to bypass by subscribing to no input source')
184 self.add_argument('-f', '--force', action='store_true', dest='force',
185 help='force the test to pass by subscribing to the input source')
186 self.add_argument('-t', '--timeout', action='store', default='5000',
187 dest='timeout', type=int,
188 help='milliseconds to wait before ending test')
189
190if __name__ == '__main__':
191 try:
192 options = Options()
193 args = options.parse_args()
194
195 tester = Tester(args)
196 ml = glib.MainLoop()
197 glib.timeout_add(args.timeout, test_timeout)
198 glib.io_add_watch(tester.get_fd(),
199 glib.IO_IN,
200 dispatch_test_events,
201 tester)
202 ml.run()
203
204 except KeyboardInterrupt:
205 pass
206
207 except argparse.ArgumentError as ex:
208 print ex
209 sys,exit(1)
0210
=== added file 'testsuite/geis2/test_device1.events'
--- testsuite/geis2/test_device1.events 1970-01-01 00:00:00 +0000
+++ testsuite/geis2/test_device1.events 2011-12-06 01:12:23 +0000
@@ -0,0 +1,210 @@
1E: 1323109478.604936 0003 0039 52
2E: 1323109478.604938 0003 0035 3367
3E: 1323109478.604939 0003 0036 2268
4E: 1323109478.604942 0003 0000 3367
5E: 1323109478.604943 0003 0001 2268
6E: 1323109478.604944 0003 0018 9
7E: 1323109478.604944 0003 001c 13
8E: 1323109478.604945 0001 0145 1
9E: 1323109478.604947 0000 0000 0
10E: 1323109478.629818 0003 0035 3363
11E: 1323109478.629822 0003 0000 3363
12E: 1323109478.629825 0003 001c 12
13E: 1323109478.629827 0000 0000 0
14E: 1323109478.641338 0003 0035 3373
15E: 1323109478.641340 0003 0036 2187
16E: 1323109478.641343 0003 0000 3373
17E: 1323109478.641343 0003 0001 2187
18E: 1323109478.641344 0003 0018 10
19E: 1323109478.641345 0003 001c 14
20E: 1323109478.641347 0000 0000 0
21E: 1323109478.653409 0003 0018 11
22E: 1323109478.653411 0003 001c 12
23E: 1323109478.653413 0000 0000 0
24E: 1323109478.665509 0003 0035 3389
25E: 1323109478.665510 0003 0036 2151
26E: 1323109478.665513 0003 0000 3389
27E: 1323109478.665514 0003 0001 2151
28E: 1323109478.665514 0003 0018 12
29E: 1323109478.665517 0000 0000 0
30E: 1323109478.676566 0003 0035 3406
31E: 1323109478.676568 0003 0036 2106
32E: 1323109478.676571 0003 0000 3406
33E: 1323109478.676572 0003 0001 2106
34E: 1323109478.676573 0003 0018 15
35E: 1323109478.676573 0003 001c 11
36E: 1323109478.676575 0000 0000 0
37E: 1323109478.688397 0003 0035 3413
38E: 1323109478.688398 0003 0036 2055
39E: 1323109478.688399 0003 0000 3413
40E: 1323109478.688400 0003 0001 2055
41E: 1323109478.688400 0003 0018 19
42E: 1323109478.688401 0003 001c 10
43E: 1323109478.688402 0000 0000 0
44E: 1323109478.701637 0003 0035 3432
45E: 1323109478.701639 0003 0036 2013
46E: 1323109478.701641 0003 0000 3432
47E: 1323109478.701642 0003 0001 2013
48E: 1323109478.701643 0003 0018 27
49E: 1323109478.701644 0003 001c 8
50E: 1323109478.701646 0000 0000 0
51E: 1323109478.724960 0003 0035 2458
52E: 1323109478.724961 0003 0036 3190
53E: 1323109478.724962 0003 002f 1
54E: 1323109478.724962 0003 0039 53
55E: 1323109478.724962 0003 0035 3424
56E: 1323109478.724962 0003 0036 1977
57E: 1323109478.724963 0001 014a 1
58E: 1323109478.724963 0003 0000 3424
59E: 1323109478.724964 0003 0001 1977
60E: 1323109478.724964 0003 0018 42
61E: 1323109478.724965 0003 001c 5
62E: 1323109478.724965 0001 0145 0
63E: 1323109478.724966 0001 014d 1
64E: 1323109478.724966 0000 0000 0
65E: 1323109478.748390 0003 002f 0
66E: 1323109478.748391 0003 0035 2380
67E: 1323109478.748391 0003 0036 3220
68E: 1323109478.748394 0003 002f 1
69E: 1323109478.748394 0003 0035 3416
70E: 1323109478.748394 0003 0036 1961
71E: 1323109478.748396 0003 0000 3416
72E: 1323109478.748396 0003 0001 1961
73E: 1323109478.748397 0003 0018 49
74E: 1323109478.748400 0000 0000 0
75E: 1323109478.772694 0003 002f 0
76E: 1323109478.772695 0003 0035 2372
77E: 1323109478.772695 0003 0036 3212
78E: 1323109478.772696 0003 002f 1
79E: 1323109478.772696 0003 0035 3412
80E: 1323109478.772697 0003 0036 1953
81E: 1323109478.772698 0003 0000 3412
82E: 1323109478.772699 0003 0001 1953
83E: 1323109478.772699 0003 0018 51
84E: 1323109478.772701 0000 0000 0
85E: 1323109478.797052 0003 002f 0
86E: 1323109478.797053 0003 0035 2402
87E: 1323109478.797054 0003 0036 3216
88E: 1323109478.797058 0003 002f 1
89E: 1323109478.797059 0003 0035 3415
90E: 1323109478.797060 0003 0036 1956
91E: 1323109478.797066 0003 0000 3415
92E: 1323109478.797066 0003 0001 1956
93E: 1323109478.797067 0003 0018 53
94E: 1323109478.797069 0000 0000 0
95E: 1323109478.821436 0003 002f 0
96E: 1323109478.821437 0003 0035 2472
97E: 1323109478.821438 0003 0036 3192
98E: 1323109478.821443 0003 002f 1
99E: 1323109478.821443 0003 0035 3506
100E: 1323109478.821444 0003 0036 1986
101E: 1323109478.821450 0003 0000 3506
102E: 1323109478.821451 0003 0001 1986
103E: 1323109478.821451 0003 0018 54
104E: 1323109478.821454 0000 0000 0
105E: 1323109478.845271 0003 002f 0
106E: 1323109478.845272 0003 0035 2592
107E: 1323109478.845272 0003 0036 3196
108E: 1323109478.845273 0003 002f 1
109E: 1323109478.845273 0003 0035 3675
110E: 1323109478.845274 0003 0036 2012
111E: 1323109478.845275 0003 0000 3675
112E: 1323109478.845275 0003 0001 2012
113E: 1323109478.845275 0003 0018 55
114E: 1323109478.845277 0000 0000 0
115E: 1323109478.870003 0003 002f 0
116E: 1323109478.870004 0003 0035 2816
117E: 1323109478.870005 0003 0036 3178
118E: 1323109478.870008 0003 002f 1
119E: 1323109478.870008 0003 0035 3866
120E: 1323109478.870009 0003 0036 2030
121E: 1323109478.870010 0003 0000 3866
122E: 1323109478.870011 0003 0001 2030
123E: 1323109478.870012 0003 0018 56
124E: 1323109478.870015 0000 0000 0
125E: 1323109478.893759 0003 002f 0
126E: 1323109478.893760 0003 0035 2994
127E: 1323109478.893760 0003 0036 3166
128E: 1323109478.893763 0003 002f 1
129E: 1323109478.893763 0003 0035 4069
130E: 1323109478.893764 0003 0036 2019
131E: 1323109478.893766 0003 0000 4069
132E: 1323109478.893767 0003 0001 2019
133E: 1323109478.893771 0000 0000 0
134E: 1323109478.918183 0003 002f 0
135E: 1323109478.918183 0003 0035 3162
136E: 1323109478.918184 0003 0036 3132
137E: 1323109478.918187 0003 002f 1
138E: 1323109478.918187 0003 0035 4214
139E: 1323109478.918188 0003 0036 2006
140E: 1323109478.918190 0003 0000 4214
141E: 1323109478.918190 0003 0001 2006
142E: 1323109478.918194 0000 0000 0
143E: 1323109478.941450 0003 002f 0
144E: 1323109478.941451 0003 0035 3250
145E: 1323109478.941452 0003 0036 3124
146E: 1323109478.941456 0003 002f 1
147E: 1323109478.941456 0003 0035 4282
148E: 1323109478.941457 0003 0036 1974
149E: 1323109478.941460 0003 0000 4282
150E: 1323109478.941461 0003 0001 1974
151E: 1323109478.941467 0000 0000 0
152E: 1323109478.966043 0003 002f 0
153E: 1323109478.966044 0003 0035 3274
154E: 1323109478.966045 0003 0036 3132
155E: 1323109478.966048 0003 002f 1
156E: 1323109478.966048 0003 0035 4296
157E: 1323109478.966049 0003 0036 1973
158E: 1323109478.966050 0003 0000 4296
159E: 1323109478.966051 0003 0001 1973
160E: 1323109478.966055 0000 0000 0
161E: 1323109478.990133 0003 002f 0
162E: 1323109478.990134 0003 0035 3282
163E: 1323109478.990135 0003 0036 3180
164E: 1323109478.990138 0003 002f 1
165E: 1323109478.990138 0003 0035 4299
166E: 1323109478.990138 0003 0036 1992
167E: 1323109478.990140 0003 0000 4299
168E: 1323109478.990141 0003 0001 1992
169E: 1323109478.990145 0000 0000 0
170E: 1323109479.014380 0003 002f 0
171E: 1323109479.014381 0003 0035 3270
172E: 1323109479.014382 0003 0036 3264
173E: 1323109479.014385 0003 002f 1
174E: 1323109479.014385 0003 0035 4142
175E: 1323109479.014386 0003 0036 3230
176E: 1323109479.014388 0001 014a 0
177E: 1323109479.014389 0003 0000 4142
178E: 1323109479.014390 0003 0001 3230
179E: 1323109479.014391 0003 0018 17
180E: 1323109479.014395 0000 0000 0
181E: 1323109479.026385 0003 002f 0
182E: 1323109479.026386 0003 0035 3326
183E: 1323109479.026387 0003 0036 3086
184E: 1323109479.026388 0003 002f 1
185E: 1323109479.026388 0003 0039 -1
186E: 1323109479.026390 0003 0000 3326
187E: 1323109479.026391 0003 0001 3086
188E: 1323109479.026392 0003 0018 7
189E: 1323109479.026393 0003 001c 15
190E: 1323109479.026394 0001 0145 1
191E: 1323109479.026395 0001 014d 0
192E: 1323109479.026396 0000 0000 0
193E: 1323109479.038191 0003 002f 0
194E: 1323109479.038192 0003 0035 3446
195E: 1323109479.038197 0003 0000 3446
196E: 1323109479.038199 0003 0018 4
197E: 1323109479.038206 0000 0000 0
198E: 1323109479.050230 0003 0039 -1
199E: 1323109479.050234 0003 0018 2
200E: 1323109479.050235 0003 001c 0
201E: 1323109479.050236 0001 0145 0
202E: 1323109479.050237 0000 0000 0
203E: 1323109479.075276 0003 0018 1
204E: 1323109479.075278 0000 0000 0
205E: 1323109479.099762 0003 0018 0
206E: 1323109479.099764 0000 0000 0
207E: 1323109479.654050 0003 0018 1
208E: 1323109479.654052 0000 0000 0
209E: 1323109479.689390 0003 0018 0
210E: 1323109479.689391 0000 0000 0
0211
=== added file 'testsuite/geis2/test_device1.prop'
--- testsuite/geis2/test_device1.prop 1970-01-01 00:00:00 +0000
+++ testsuite/geis2/test_device1.prop 2011-12-06 01:12:23 +0000
@@ -0,0 +1,32 @@
1N: Test Device1
2I: 0011 0002 0007 01b1
3P: 09 00 00 00 00 00 00 00
4B: 00 0b 00 00 00 00 00 00 00
5B: 01 00 00 00 00 00 00 00 00
6B: 01 00 00 00 00 00 00 00 00
7B: 01 00 00 00 00 00 00 00 00
8B: 01 00 00 00 00 00 00 00 00
9B: 01 00 00 03 00 00 00 00 00
10B: 01 20 64 00 00 00 00 00 00
11B: 01 00 00 00 00 00 00 00 00
12B: 01 00 00 00 00 00 00 00 00
13B: 01 00 00 00 00 00 00 00 00
14B: 01 00 00 00 00 00 00 00 00
15B: 01 00 00 00 00 00 00 00 00
16B: 01 00 00 00 00 00 00 00 00
17B: 02 00 00 00 00 00 00 00 00
18B: 03 03 00 00 11 00 80 60 02
19B: 04 00 00 00 00 00 00 00 00
20B: 05 00 00 00 00 00 00 00 00
21B: 11 00 00 00 00 00 00 00 00
22B: 12 00 00 00 00 00 00 00 00
23B: 15 00 00 00 00 00 00 00 00
24B: 15 00 00 00 00 00 00 00 00
25A: 00 1472 5888 0 0
26A: 01 1408 4820 0 0
27A: 18 0 255 0 0
28A: 1c 0 15 0 0
29A: 2f 0 1 0 0
30A: 35 1472 5888 0 0
31A: 36 1408 4820 0 0
32A: 39 0 65535 0 0
033
=== added file 'testsuite/geis2/test_device2.prop'
--- testsuite/geis2/test_device2.prop 1970-01-01 00:00:00 +0000
+++ testsuite/geis2/test_device2.prop 2011-12-06 01:12:23 +0000
@@ -0,0 +1,32 @@
1N: Test Device2
2I: 0011 0002 0007 01b1
3P: 09 00 00 00 00 00 00 00
4B: 00 0b 00 00 00 00 00 00 00
5B: 01 00 00 00 00 00 00 00 00
6B: 01 00 00 00 00 00 00 00 00
7B: 01 00 00 00 00 00 00 00 00
8B: 01 00 00 00 00 00 00 00 00
9B: 01 00 00 03 00 00 00 00 00
10B: 01 20 64 00 00 00 00 00 00
11B: 01 00 00 00 00 00 00 00 00
12B: 01 00 00 00 00 00 00 00 00
13B: 01 00 00 00 00 00 00 00 00
14B: 01 00 00 00 00 00 00 00 00
15B: 01 00 00 00 00 00 00 00 00
16B: 01 00 00 00 00 00 00 00 00
17B: 02 00 00 00 00 00 00 00 00
18B: 03 03 00 00 11 00 80 60 02
19B: 04 00 00 00 00 00 00 00 00
20B: 05 00 00 00 00 00 00 00 00
21B: 11 00 00 00 00 00 00 00 00
22B: 12 00 00 00 00 00 00 00 00
23B: 15 00 00 00 00 00 00 00 00
24B: 15 00 00 00 00 00 00 00 00
25A: 00 1472 5888 0 0
26A: 01 1408 4820 0 0
27A: 18 0 255 0 0
28A: 1c 0 15 0 0
29A: 2f 0 1 0 0
30A: 35 1472 5888 0 0
31A: 36 1408 4820 0 0
32A: 39 0 65535 0 0

Subscribers

People subscribed via source and target branches