blob: 8e3a1926c18ce9c148894b9a5ff1465016a751db [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 Mooneycfb4a642015-05-07 15:33:37 -070084TWO_FINGER_LINE_TESTS = [
85 tests.TWO_FINGER_TRACKING,
86 tests.TWO_CLOSE_FINGERS_TRACKING,
87]
88
Charlie Mooney08661912015-04-16 09:20:34 -070089
Charlie Mooneyc56c8602015-05-07 15:15:40 -070090def _ComputePerpendicularAngle(start, end):
91 """ Compute the fingertip angle to be perpendicular to the
92 movement direction.
93
94 The robot's X/Y axes are not in the same direction as the touch device's,
95 they are flipped.
96
97 DUT x ----> Robot y ---->
98 y x
99 | |
100 | |
101 \/ \/
102
103 As a result the angle is computed in the DUT space, but then must have
104 its sign flipped before being used in any commands to the robot or
105 everything will be wrong since it's a clockwise angle instead of counter-
106 clockwise.
107 """
108 x1, y1 = start
109 x2, y2 = end
110 dy = y2 - y1
111 dx = x2 - x1
112 return -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
113
114
Charlie Mooney08661912015-04-16 09:20:34 -0700115def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
116 variation = test.variations[variation_number]
117 fn = None
118 if test.name == tests.NOISE_STATIONARY:
119 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney1b708112015-04-28 14:46:21 -0700120 elif test.name == tests.ONE_FINGER_TAP:
121 fn = lambda: _PerformOneFingerTapTest(variation, robot, device_spec)
Charlie Mooney4198adb2015-05-04 13:55:20 -0700122 elif test.name == tests.TWO_FINGER_TAP:
123 fn = lambda: _PerformTwoFingerTapTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700124 elif test.name in SINGLE_FINGER_LINE_TESTS:
125 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
126 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700127 elif test.name in TWO_FINGER_LINE_TESTS:
128 spacing = 0 if test.name == tests.TWO_CLOSE_FINGERS_TRACKING else 5
129 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec,
130 spacing_mm=spacing)
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700131 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
132 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700133 elif test.name == tests.PINCH_TO_ZOOM:
134 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700135 elif test.name == tests.DRAG_THUMB_EDGE:
136 fn = lambda: _PerformThumbEdgeTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700137
138 if fn is None:
139 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
140 return None
141
142 return Thread(target=fn)
143
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700144
Charlie Mooney08661912015-04-16 09:20:34 -0700145def _PerformStationaryNoiseTest(variation, robot, device_spec):
146 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700147 tap_position = LOCATION_COORDINATES[location]
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700148 fingertip = robot.fingertips[NOISE_TESTING_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700149 robot.Tap(device_spec, [fingertip], tap_position, touch_time_s=4)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700150
151
Charlie Mooney1b708112015-04-28 14:46:21 -0700152def _PerformOneFingerTapTest(variation, robot, device_spec):
153 location, = variation
154 tap_position = LOCATION_COORDINATES[location]
155 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700156 robot.Tap(device_spec, [fingertip], tap_position)
157
158
159def _PerformTwoFingerTapTest(variation, robot, device_spec):
160 angle, = variation
161
162 fingertip1 = robot.fingertips[STANDARD_FINGERTIP]
163 fingertip2 = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
164 fingertips = [fingertip1, fingertip2]
165
166 robot.Tap(device_spec, fingertips, (CENTER, CENTER), angle=ANGLES[angle])
Charlie Mooney1b708112015-04-28 14:46:21 -0700167
168
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700169def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
170 direction, speed = variation
171 start, end = LINE_DIRECTION_COORDINATES[direction]
172 fingertip = robot.fingertips[STANDARD_FINGERTIP]
173
174 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneya337d582015-04-29 10:37:45 -0700175 robot.Line(device_spec, [fingertip], start, end, pause_time_s)
176 robot.PopSpeed()
177
178
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700179def _PerformTwoFingerLineTest(variation, robot, device_spec, spacing_mm):
Charlie Mooneya337d582015-04-29 10:37:45 -0700180 direction, speed = variation
181 start, end = LINE_DIRECTION_COORDINATES[direction]
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700182 angle = _ComputePerpendicularAngle(start, end)
Charlie Mooneya337d582015-04-29 10:37:45 -0700183
184 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
185 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700186
Charlie Mooneya337d582015-04-29 10:37:45 -0700187 robot.PushSpeed(SPEEDS[speed])
188 robot.Line(device_spec, fingertips, start, end,
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700189 fingertip_spacing=spacing_mm, fingertip_angle=angle)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700190 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700191
192
193def _PerformRestingFingerTest(variation, robot, device_spec):
194 direction, speed = variation
195 start, end = LINE_DIRECTION_COORDINATES[direction]
196 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
197
198 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
199 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
200
201 robot.PushSpeed(SPEEDS[speed])
202 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
203 moving_fingertip, start, end,
204 stationary_location)
205 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700206
207def _PerformPinchTest(variation, robot, device_spec):
208 direction, angle = variation
209
210 min_spread = 15
211 max_spread = min(device_spec.Height(), device_spec.Width(),
212 robot.MAX_FINGER_DISTANCE)
213 if direction == tests.GV.ZOOM_OUT:
214 start_distance, end_distance = max_spread, min_spread
215 else:
216 start_distance, end_distance = min_spread, max_spread
217
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700218 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
219 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
220
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700221 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700222 robot.Pinch(device_spec, fingertips, (CENTER, CENTER), ANGLES[angle],
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700223 start_distance, end_distance)
224 robot.PopSpeed()
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700225
226def _PerformThumbEdgeTest(variation, robot, device_spec):
227 fingertip_type, direction = variation
228 start, end = LINE_DIRECTION_COORDINATES[direction]
229 angle = _ComputePerpendicularAngle(start, end)
230
231 fingertip = robot.fingertips[fingertip_type]
232
233 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
234 robot.Line(device_spec, [fingertip], start, end, fingertip_angle=angle)
235 robot.PopSpeed()