blob: 96e851a8843c509ed5fbd19ade152d800c033939 [file] [log] [blame]
Charlie Mooney08661912015-04-16 09:20:34 -07001# Copyright 2015 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5""" This is a module containing functions that allow the test suite to
6determine the specifics of the gesture and execute them on the touchbot.
7In essence, you use this class to go from a Test object to the robot
8actually performing the correct gesture on the pad.
9"""
10
Charlie Mooneya337d582015-04-29 10:37:45 -070011import math
Charlie Mooney08661912015-04-16 09:20:34 -070012from threading import Thread
13
14import colorama as color
15
16import tests
17from touchbot import Touchbot
18
19
Charlie Mooney058aa5f2015-05-06 12:55:48 -070020NOISE_TESTING_FINGERTIP = '1round_12mm'
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070021STANDARD_FINGERTIP = '1round_9mm'
Charlie Mooneya337d582015-04-29 10:37:45 -070022STANDARD_SECONDARY_FINGERTIP = '2round_9mm'
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070023
Charlie Mooney08661912015-04-16 09:20:34 -070024BUFFER_SIZE = 0.1
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070025OVERSHOOT_DISTANCE = 0.05
Charlie Mooney08661912015-04-16 09:20:34 -070026LEFT = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070027OVER_LEFT = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070028RIGHT = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070029OVER_RIGHT = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070030TOP = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070031OVER_TOP = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070032BOTTOM = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070033OVER_BOTTOM = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070034CENTER = 0.5
35
36LOCATION_COORDINATES = {
37 tests.GV.TL: (LEFT, TOP),
38 tests.GV.TR: (RIGHT, TOP),
39 tests.GV.BL: (LEFT, BOTTOM),
40 tests.GV.BR: (RIGHT, BOTTOM),
41 tests.GV.TS: (CENTER, TOP),
42 tests.GV.BS: (CENTER, BOTTOM),
43 tests.GV.LS: (LEFT, CENTER),
44 tests.GV.RS: (RIGHT, CENTER),
45 tests.GV.CENTER: (CENTER, CENTER),
46}
47
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070048LINE_DIRECTION_COORDINATES = {
49 tests.GV.LR: ((LEFT, CENTER), (RIGHT, CENTER)),
50 tests.GV.RL: ((RIGHT, CENTER), (LEFT, CENTER)),
51 tests.GV.TB: ((CENTER, TOP), (CENTER, BOTTOM)),
52 tests.GV.BT: ((CENTER, BOTTOM), (CENTER, TOP)),
53 tests.GV.BLTR: ((LEFT, BOTTOM), (RIGHT, TOP)),
54 tests.GV.BRTL: ((RIGHT, BOTTOM), (LEFT, TOP)),
55 tests.GV.TRBL: ((RIGHT, TOP), (LEFT, BOTTOM)),
56 tests.GV.TLBR: ((LEFT, TOP), (RIGHT, BOTTOM)),
57 tests.GV.CL: ((CENTER, CENTER), (OVER_LEFT, CENTER)),
58 tests.GV.CR: ((CENTER, CENTER), (OVER_RIGHT, CENTER)),
59 tests.GV.CT: ((CENTER, CENTER), (CENTER, OVER_TOP)),
60 tests.GV.CB: ((CENTER, CENTER), (CENTER, OVER_BOTTOM)),
61 tests.GV.CUL: ((CENTER, CENTER), (OVER_LEFT, OVER_TOP)),
62 tests.GV.CLL: ((CENTER, CENTER), (OVER_LEFT, OVER_BOTTOM)),
63 tests.GV.CLR: ((CENTER, CENTER), (OVER_RIGHT, OVER_BOTTOM)),
64}
65
66SPEEDS = {
67 tests.GV.NORMAL: Touchbot.SPEED_MEDIUM,
68 tests.GV.SLOW: Touchbot.SPEED_SLOW,
69}
70
Charlie Mooney4198adb2015-05-04 13:55:20 -070071ANGLES = {
Charlie Mooney5065bcb2015-05-04 13:18:09 -070072 tests.GV.HORIZONTAL: 0,
73 tests.GV.VERTICAL: 90,
74 tests.GV.DIAGONAL: 45,
75}
76
77
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070078SINGLE_FINGER_LINE_TESTS = [
79 tests.ONE_FINGER_TO_EDGE,
80 tests.ONE_FINGER_TRACKING,
81 tests.ONE_FINGER_TRACKING_FROM_CENTER,
82]
83
Charlie Mooney08661912015-04-16 09:20:34 -070084
Charlie Mooneyc56c8602015-05-07 15:15:40 -070085def _ComputePerpendicularAngle(start, end):
86 """ Compute the fingertip angle to be perpendicular to the
87 movement direction.
88
89 The robot's X/Y axes are not in the same direction as the touch device's,
90 they are flipped.
91
92 DUT x ----> Robot y ---->
93 y x
94 | |
95 | |
96 \/ \/
97
98 As a result the angle is computed in the DUT space, but then must have
99 its sign flipped before being used in any commands to the robot or
100 everything will be wrong since it's a clockwise angle instead of counter-
101 clockwise.
102 """
103 x1, y1 = start
104 x2, y2 = end
105 dy = y2 - y1
106 dx = x2 - x1
107 return -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
108
109
Charlie Mooney08661912015-04-16 09:20:34 -0700110def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
111 variation = test.variations[variation_number]
112 fn = None
113 if test.name == tests.NOISE_STATIONARY:
114 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney1b708112015-04-28 14:46:21 -0700115 elif test.name == tests.ONE_FINGER_TAP:
116 fn = lambda: _PerformOneFingerTapTest(variation, robot, device_spec)
Charlie Mooney4198adb2015-05-04 13:55:20 -0700117 elif test.name == tests.TWO_FINGER_TAP:
118 fn = lambda: _PerformTwoFingerTapTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700119 elif test.name in SINGLE_FINGER_LINE_TESTS:
120 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
121 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700122 elif test.name == tests.TWO_FINGER_TRACKING:
Charlie Mooneya337d582015-04-29 10:37:45 -0700123 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec)
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700124 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
125 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700126 elif test.name == tests.PINCH_TO_ZOOM:
127 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700128 elif test.name == tests.DRAG_THUMB_EDGE:
129 fn = lambda: _PerformThumbEdgeTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700130
131 if fn is None:
132 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
133 return None
134
135 return Thread(target=fn)
136
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700137
Charlie Mooney08661912015-04-16 09:20:34 -0700138def _PerformStationaryNoiseTest(variation, robot, device_spec):
139 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700140 tap_position = LOCATION_COORDINATES[location]
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700141 fingertip = robot.fingertips[NOISE_TESTING_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700142 robot.Tap(device_spec, [fingertip], tap_position, touch_time_s=4)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700143
144
Charlie Mooney1b708112015-04-28 14:46:21 -0700145def _PerformOneFingerTapTest(variation, robot, device_spec):
146 location, = variation
147 tap_position = LOCATION_COORDINATES[location]
148 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700149 robot.Tap(device_spec, [fingertip], tap_position)
150
151
152def _PerformTwoFingerTapTest(variation, robot, device_spec):
153 angle, = variation
154
155 fingertip1 = robot.fingertips[STANDARD_FINGERTIP]
156 fingertip2 = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
157 fingertips = [fingertip1, fingertip2]
158
159 robot.Tap(device_spec, fingertips, (CENTER, CENTER), angle=ANGLES[angle])
Charlie Mooney1b708112015-04-28 14:46:21 -0700160
161
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700162def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
163 direction, speed = variation
164 start, end = LINE_DIRECTION_COORDINATES[direction]
165 fingertip = robot.fingertips[STANDARD_FINGERTIP]
166
167 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneya337d582015-04-29 10:37:45 -0700168 robot.Line(device_spec, [fingertip], start, end, pause_time_s)
169 robot.PopSpeed()
170
171
172def _PerformTwoFingerLineTest(variation, robot, device_spec):
173 direction, speed = variation
174 start, end = LINE_DIRECTION_COORDINATES[direction]
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700175 angle = _ComputePerpendicularAngle(start, end)
Charlie Mooneya337d582015-04-29 10:37:45 -0700176
177 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
178 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
179 robot.PushSpeed(SPEEDS[speed])
180 robot.Line(device_spec, fingertips, start, end,
181 fingertip_spacing=5, fingertip_angle=angle)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700182 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700183
184
185def _PerformRestingFingerTest(variation, robot, device_spec):
186 direction, speed = variation
187 start, end = LINE_DIRECTION_COORDINATES[direction]
188 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
189
190 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
191 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
192
193 robot.PushSpeed(SPEEDS[speed])
194 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
195 moving_fingertip, start, end,
196 stationary_location)
197 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700198
199def _PerformPinchTest(variation, robot, device_spec):
200 direction, angle = variation
201
202 min_spread = 15
203 max_spread = min(device_spec.Height(), device_spec.Width(),
204 robot.MAX_FINGER_DISTANCE)
205 if direction == tests.GV.ZOOM_OUT:
206 start_distance, end_distance = max_spread, min_spread
207 else:
208 start_distance, end_distance = min_spread, max_spread
209
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700210 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
211 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
212
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700213 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700214 robot.Pinch(device_spec, fingertips, (CENTER, CENTER), ANGLES[angle],
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700215 start_distance, end_distance)
216 robot.PopSpeed()
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700217
218def _PerformThumbEdgeTest(variation, robot, device_spec):
219 fingertip_type, direction = variation
220 start, end = LINE_DIRECTION_COORDINATES[direction]
221 angle = _ComputePerpendicularAngle(start, end)
222
223 fingertip = robot.fingertips[fingertip_type]
224
225 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
226 robot.Line(device_spec, [fingertip], start, end, fingertip_angle=angle)
227 robot.PopSpeed()