blob: a1f9680756aa999e17f913d0cd91cb7c0f3c7d6a [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 Mooney61b4fbb2015-04-22 15:22:02 -070020STANDARD_FINGERTIP = '1round_9mm'
Charlie Mooneya337d582015-04-29 10:37:45 -070021STANDARD_SECONDARY_FINGERTIP = '2round_9mm'
Charlie Mooney7b1fdb92015-05-08 09:22:55 -070022FAT_FINGERTIP = '1round_14mm'
23FAT_SECONDARY_FINGERTIP = '2round_14mm'
24NOISE_TESTING_FINGERTIP = '1round_12mm'
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070025
Charlie Mooney08661912015-04-16 09:20:34 -070026BUFFER_SIZE = 0.1
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070027OVERSHOOT_DISTANCE = 0.05
Charlie Mooney08661912015-04-16 09:20:34 -070028LEFT = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070029OVER_LEFT = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070030RIGHT = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070031OVER_RIGHT = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070032TOP = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070033OVER_TOP = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070034BOTTOM = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070035OVER_BOTTOM = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070036CENTER = 0.5
37
38LOCATION_COORDINATES = {
39 tests.GV.TL: (LEFT, TOP),
40 tests.GV.TR: (RIGHT, TOP),
41 tests.GV.BL: (LEFT, BOTTOM),
42 tests.GV.BR: (RIGHT, BOTTOM),
43 tests.GV.TS: (CENTER, TOP),
44 tests.GV.BS: (CENTER, BOTTOM),
45 tests.GV.LS: (LEFT, CENTER),
46 tests.GV.RS: (RIGHT, CENTER),
47 tests.GV.CENTER: (CENTER, CENTER),
48}
49
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070050LINE_DIRECTION_COORDINATES = {
51 tests.GV.LR: ((LEFT, CENTER), (RIGHT, CENTER)),
52 tests.GV.RL: ((RIGHT, CENTER), (LEFT, CENTER)),
53 tests.GV.TB: ((CENTER, TOP), (CENTER, BOTTOM)),
54 tests.GV.BT: ((CENTER, BOTTOM), (CENTER, TOP)),
55 tests.GV.BLTR: ((LEFT, BOTTOM), (RIGHT, TOP)),
56 tests.GV.BRTL: ((RIGHT, BOTTOM), (LEFT, TOP)),
57 tests.GV.TRBL: ((RIGHT, TOP), (LEFT, BOTTOM)),
58 tests.GV.TLBR: ((LEFT, TOP), (RIGHT, BOTTOM)),
59 tests.GV.CL: ((CENTER, CENTER), (OVER_LEFT, CENTER)),
60 tests.GV.CR: ((CENTER, CENTER), (OVER_RIGHT, CENTER)),
61 tests.GV.CT: ((CENTER, CENTER), (CENTER, OVER_TOP)),
62 tests.GV.CB: ((CENTER, CENTER), (CENTER, OVER_BOTTOM)),
63 tests.GV.CUL: ((CENTER, CENTER), (OVER_LEFT, OVER_TOP)),
64 tests.GV.CLL: ((CENTER, CENTER), (OVER_LEFT, OVER_BOTTOM)),
65 tests.GV.CLR: ((CENTER, CENTER), (OVER_RIGHT, OVER_BOTTOM)),
66}
67
68SPEEDS = {
69 tests.GV.NORMAL: Touchbot.SPEED_MEDIUM,
70 tests.GV.SLOW: Touchbot.SPEED_SLOW,
Charlie Mooneybe4661e2015-05-20 11:46:43 -070071 tests.GV.FAST: Touchbot.SPEED_FAST,
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070072}
73
Charlie Mooney4198adb2015-05-04 13:55:20 -070074ANGLES = {
Charlie Mooney5065bcb2015-05-04 13:18:09 -070075 tests.GV.HORIZONTAL: 0,
76 tests.GV.VERTICAL: 90,
77 tests.GV.DIAGONAL: 45,
78}
79
80
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070081SINGLE_FINGER_LINE_TESTS = [
82 tests.ONE_FINGER_TO_EDGE,
83 tests.ONE_FINGER_TRACKING,
84 tests.ONE_FINGER_TRACKING_FROM_CENTER,
Charlie Mooneybe4661e2015-05-20 11:46:43 -070085 tests.ONE_FINGER_SWIPE,
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070086]
87
Charlie Mooneycfb4a642015-05-07 15:33:37 -070088TWO_FINGER_LINE_TESTS = [
89 tests.TWO_FINGER_TRACKING,
90 tests.TWO_CLOSE_FINGERS_TRACKING,
Charlie Mooney7b1fdb92015-05-08 09:22:55 -070091 tests.TWO_FAT_FINGERS_TRACKING,
Charlie Mooneybe4661e2015-05-20 11:46:43 -070092 tests.TWO_FINGER_SWIPE,
Charlie Mooneycfb4a642015-05-07 15:33:37 -070093]
94
Charlie Mooney08661912015-04-16 09:20:34 -070095
Charlie Mooneyc56c8602015-05-07 15:15:40 -070096def _ComputePerpendicularAngle(start, end):
97 """ Compute the fingertip angle to be perpendicular to the
98 movement direction.
99
100 The robot's X/Y axes are not in the same direction as the touch device's,
101 they are flipped.
102
103 DUT x ----> Robot y ---->
104 y x
105 | |
106 | |
107 \/ \/
108
109 As a result the angle is computed in the DUT space, but then must have
110 its sign flipped before being used in any commands to the robot or
111 everything will be wrong since it's a clockwise angle instead of counter-
112 clockwise.
113 """
114 x1, y1 = start
115 x2, y2 = end
116 dy = y2 - y1
117 dx = x2 - x1
118 return -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
119
120
Charlie Mooney08661912015-04-16 09:20:34 -0700121def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
122 variation = test.variations[variation_number]
123 fn = None
124 if test.name == tests.NOISE_STATIONARY:
125 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney1b708112015-04-28 14:46:21 -0700126 elif test.name == tests.ONE_FINGER_TAP:
127 fn = lambda: _PerformOneFingerTapTest(variation, robot, device_spec)
Charlie Mooney4198adb2015-05-04 13:55:20 -0700128 elif test.name == tests.TWO_FINGER_TAP:
129 fn = lambda: _PerformTwoFingerTapTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700130 elif test.name in SINGLE_FINGER_LINE_TESTS:
131 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700132 is_swipe = (test.name == tests.ONE_FINGER_SWIPE)
133 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec,
134 pause, is_swipe)
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700135 elif test.name in TWO_FINGER_LINE_TESTS:
Charlie Mooney7b1fdb92015-05-08 09:22:55 -0700136 spacing = 5
137 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
138 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700139 is_swipe = (test.name == tests.TWO_FINGER_SWIPE)
Charlie Mooney7b1fdb92015-05-08 09:22:55 -0700140
141 if test.name == tests.TWO_CLOSE_FINGERS_TRACKING:
142 spacing = 0
143 elif test.name == tests.TWO_FAT_FINGERS_TRACKING:
144 spacing = 10
145 fingertips = [robot.fingertips[FAT_FINGERTIP],
146 robot.fingertips[FAT_SECONDARY_FINGERTIP]]
147
Charlie Mooneycfb4a642015-05-07 15:33:37 -0700148 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec,
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700149 fingertips, spacing, is_swipe)
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700150 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
151 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700152 elif test.name == tests.PINCH_TO_ZOOM:
153 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700154 elif test.name == tests.DRAG_THUMB_EDGE:
155 fn = lambda: _PerformThumbEdgeTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700156
157 if fn is None:
158 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
159 return None
160
161 return Thread(target=fn)
162
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700163
Charlie Mooney08661912015-04-16 09:20:34 -0700164def _PerformStationaryNoiseTest(variation, robot, device_spec):
165 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700166 tap_position = LOCATION_COORDINATES[location]
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700167 fingertip = robot.fingertips[NOISE_TESTING_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700168 robot.Tap(device_spec, [fingertip], tap_position, touch_time_s=4)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700169
170
Charlie Mooney1b708112015-04-28 14:46:21 -0700171def _PerformOneFingerTapTest(variation, robot, device_spec):
172 location, = variation
173 tap_position = LOCATION_COORDINATES[location]
174 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700175 robot.Tap(device_spec, [fingertip], tap_position)
176
177
178def _PerformTwoFingerTapTest(variation, robot, device_spec):
179 angle, = variation
180
181 fingertip1 = robot.fingertips[STANDARD_FINGERTIP]
182 fingertip2 = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
183 fingertips = [fingertip1, fingertip2]
184
185 robot.Tap(device_spec, fingertips, (CENTER, CENTER), angle=ANGLES[angle])
Charlie Mooney1b708112015-04-28 14:46:21 -0700186
187
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700188def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s,
189 is_swipe):
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700190 direction, speed = variation
191 start, end = LINE_DIRECTION_COORDINATES[direction]
192 fingertip = robot.fingertips[STANDARD_FINGERTIP]
193
194 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700195 robot.Line(device_spec, [fingertip], start, end, pause_s=pause_time_s,
196 swipe=is_swipe)
Charlie Mooneya337d582015-04-29 10:37:45 -0700197 robot.PopSpeed()
198
199
Charlie Mooney7b1fdb92015-05-08 09:22:55 -0700200def _PerformTwoFingerLineTest(variation, robot, device_spec, fingertips,
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700201 spacing_mm, is_swipe):
Charlie Mooneya337d582015-04-29 10:37:45 -0700202 direction, speed = variation
203 start, end = LINE_DIRECTION_COORDINATES[direction]
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700204 angle = _ComputePerpendicularAngle(start, end)
Charlie Mooneya337d582015-04-29 10:37:45 -0700205
Charlie Mooneya337d582015-04-29 10:37:45 -0700206 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneybe4661e2015-05-20 11:46:43 -0700207 robot.Line(device_spec, fingertips, start, end, fingertip_spacing=spacing_mm,
208 fingertip_angle=angle, swipe=is_swipe)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700209 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700210
211
212def _PerformRestingFingerTest(variation, robot, device_spec):
213 direction, speed = variation
214 start, end = LINE_DIRECTION_COORDINATES[direction]
215 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
216
217 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
218 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
219
220 robot.PushSpeed(SPEEDS[speed])
221 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
222 moving_fingertip, start, end,
223 stationary_location)
224 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700225
226def _PerformPinchTest(variation, robot, device_spec):
227 direction, angle = variation
228
229 min_spread = 15
230 max_spread = min(device_spec.Height(), device_spec.Width(),
231 robot.MAX_FINGER_DISTANCE)
232 if direction == tests.GV.ZOOM_OUT:
233 start_distance, end_distance = max_spread, min_spread
234 else:
235 start_distance, end_distance = min_spread, max_spread
236
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700237 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
238 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
239
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700240 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700241 robot.Pinch(device_spec, fingertips, (CENTER, CENTER), ANGLES[angle],
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700242 start_distance, end_distance)
243 robot.PopSpeed()
Charlie Mooneyc56c8602015-05-07 15:15:40 -0700244
245def _PerformThumbEdgeTest(variation, robot, device_spec):
246 fingertip_type, direction = variation
247 start, end = LINE_DIRECTION_COORDINATES[direction]
248 angle = _ComputePerpendicularAngle(start, end)
249
250 fingertip = robot.fingertips[fingertip_type]
251
252 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
253 robot.Line(device_spec, [fingertip], start, end, fingertip_angle=angle)
254 robot.PopSpeed()