blob: e18039b826b8dbab1ba76c580749c951618133ae [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
85def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
86 variation = test.variations[variation_number]
87 fn = None
88 if test.name == tests.NOISE_STATIONARY:
89 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney1b708112015-04-28 14:46:21 -070090 elif test.name == tests.ONE_FINGER_TAP:
91 fn = lambda: _PerformOneFingerTapTest(variation, robot, device_spec)
Charlie Mooney4198adb2015-05-04 13:55:20 -070092 elif test.name == tests.TWO_FINGER_TAP:
93 fn = lambda: _PerformTwoFingerTapTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070094 elif test.name in SINGLE_FINGER_LINE_TESTS:
95 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
96 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070097 elif test.name == tests.TWO_FINGER_TRACKING:
Charlie Mooneya337d582015-04-29 10:37:45 -070098 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070099 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
100 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700101 elif test.name == tests.PINCH_TO_ZOOM:
102 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700103
104 if fn is None:
105 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
106 return None
107
108 return Thread(target=fn)
109
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700110
Charlie Mooney08661912015-04-16 09:20:34 -0700111def _PerformStationaryNoiseTest(variation, robot, device_spec):
112 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700113 tap_position = LOCATION_COORDINATES[location]
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700114 fingertip = robot.fingertips[NOISE_TESTING_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700115 robot.Tap(device_spec, [fingertip], tap_position, touch_time_s=4)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700116
117
Charlie Mooney1b708112015-04-28 14:46:21 -0700118def _PerformOneFingerTapTest(variation, robot, device_spec):
119 location, = variation
120 tap_position = LOCATION_COORDINATES[location]
121 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700122 robot.Tap(device_spec, [fingertip], tap_position)
123
124
125def _PerformTwoFingerTapTest(variation, robot, device_spec):
126 angle, = variation
127
128 fingertip1 = robot.fingertips[STANDARD_FINGERTIP]
129 fingertip2 = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
130 fingertips = [fingertip1, fingertip2]
131
132 robot.Tap(device_spec, fingertips, (CENTER, CENTER), angle=ANGLES[angle])
Charlie Mooney1b708112015-04-28 14:46:21 -0700133
134
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700135def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
136 direction, speed = variation
137 start, end = LINE_DIRECTION_COORDINATES[direction]
138 fingertip = robot.fingertips[STANDARD_FINGERTIP]
139
140 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneya337d582015-04-29 10:37:45 -0700141 robot.Line(device_spec, [fingertip], start, end, pause_time_s)
142 robot.PopSpeed()
143
144
145def _PerformTwoFingerLineTest(variation, robot, device_spec):
146 direction, speed = variation
147 start, end = LINE_DIRECTION_COORDINATES[direction]
148
149 # Compute the fingertip angle to be perpendicular to the
150 # movement direction
151 x1, y1 = start
152 x2, y2 = end
153 dy = y2 - y1
154 dx = x2 - x1
155 angle = -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
156
157 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
158 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
159 robot.PushSpeed(SPEEDS[speed])
160 robot.Line(device_spec, fingertips, start, end,
161 fingertip_spacing=5, fingertip_angle=angle)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700162 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700163
164
165def _PerformRestingFingerTest(variation, robot, device_spec):
166 direction, speed = variation
167 start, end = LINE_DIRECTION_COORDINATES[direction]
168 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
169
170 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
171 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
172
173 robot.PushSpeed(SPEEDS[speed])
174 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
175 moving_fingertip, start, end,
176 stationary_location)
177 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700178
179def _PerformPinchTest(variation, robot, device_spec):
180 direction, angle = variation
181
182 min_spread = 15
183 max_spread = min(device_spec.Height(), device_spec.Width(),
184 robot.MAX_FINGER_DISTANCE)
185 if direction == tests.GV.ZOOM_OUT:
186 start_distance, end_distance = max_spread, min_spread
187 else:
188 start_distance, end_distance = min_spread, max_spread
189
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700190 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
191 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
192
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700193 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
Charlie Mooney058aa5f2015-05-06 12:55:48 -0700194 robot.Pinch(device_spec, fingertips, (CENTER, CENTER), ANGLES[angle],
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700195 start_distance, end_distance)
196 robot.PopSpeed()