blob: 7496bccba4e1b1da4cf7ff7e1c3ebe66f27f6242 [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 Mooney61b4fbb2015-04-22 15:22:02 -070022
Charlie Mooney08661912015-04-16 09:20:34 -070023BUFFER_SIZE = 0.1
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070024OVERSHOOT_DISTANCE = 0.05
Charlie Mooney08661912015-04-16 09:20:34 -070025LEFT = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070026OVER_LEFT = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070027RIGHT = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070028OVER_RIGHT = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070029TOP = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070030OVER_TOP = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070031BOTTOM = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070032OVER_BOTTOM = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070033CENTER = 0.5
34
35LOCATION_COORDINATES = {
36 tests.GV.TL: (LEFT, TOP),
37 tests.GV.TR: (RIGHT, TOP),
38 tests.GV.BL: (LEFT, BOTTOM),
39 tests.GV.BR: (RIGHT, BOTTOM),
40 tests.GV.TS: (CENTER, TOP),
41 tests.GV.BS: (CENTER, BOTTOM),
42 tests.GV.LS: (LEFT, CENTER),
43 tests.GV.RS: (RIGHT, CENTER),
44 tests.GV.CENTER: (CENTER, CENTER),
45}
46
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070047LINE_DIRECTION_COORDINATES = {
48 tests.GV.LR: ((LEFT, CENTER), (RIGHT, CENTER)),
49 tests.GV.RL: ((RIGHT, CENTER), (LEFT, CENTER)),
50 tests.GV.TB: ((CENTER, TOP), (CENTER, BOTTOM)),
51 tests.GV.BT: ((CENTER, BOTTOM), (CENTER, TOP)),
52 tests.GV.BLTR: ((LEFT, BOTTOM), (RIGHT, TOP)),
53 tests.GV.BRTL: ((RIGHT, BOTTOM), (LEFT, TOP)),
54 tests.GV.TRBL: ((RIGHT, TOP), (LEFT, BOTTOM)),
55 tests.GV.TLBR: ((LEFT, TOP), (RIGHT, BOTTOM)),
56 tests.GV.CL: ((CENTER, CENTER), (OVER_LEFT, CENTER)),
57 tests.GV.CR: ((CENTER, CENTER), (OVER_RIGHT, CENTER)),
58 tests.GV.CT: ((CENTER, CENTER), (CENTER, OVER_TOP)),
59 tests.GV.CB: ((CENTER, CENTER), (CENTER, OVER_BOTTOM)),
60 tests.GV.CUL: ((CENTER, CENTER), (OVER_LEFT, OVER_TOP)),
61 tests.GV.CLL: ((CENTER, CENTER), (OVER_LEFT, OVER_BOTTOM)),
62 tests.GV.CLR: ((CENTER, CENTER), (OVER_RIGHT, OVER_BOTTOM)),
63}
64
65SPEEDS = {
66 tests.GV.NORMAL: Touchbot.SPEED_MEDIUM,
67 tests.GV.SLOW: Touchbot.SPEED_SLOW,
68}
69
Charlie Mooney4198adb2015-05-04 13:55:20 -070070ANGLES = {
Charlie Mooney5065bcb2015-05-04 13:18:09 -070071 tests.GV.HORIZONTAL: 0,
72 tests.GV.VERTICAL: 90,
73 tests.GV.DIAGONAL: 45,
74}
75
76
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070077SINGLE_FINGER_LINE_TESTS = [
78 tests.ONE_FINGER_TO_EDGE,
79 tests.ONE_FINGER_TRACKING,
80 tests.ONE_FINGER_TRACKING_FROM_CENTER,
81]
82
Charlie Mooney08661912015-04-16 09:20:34 -070083
84def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
85 variation = test.variations[variation_number]
86 fn = None
87 if test.name == tests.NOISE_STATIONARY:
88 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney1b708112015-04-28 14:46:21 -070089 elif test.name == tests.ONE_FINGER_TAP:
90 fn = lambda: _PerformOneFingerTapTest(variation, robot, device_spec)
Charlie Mooney4198adb2015-05-04 13:55:20 -070091 elif test.name == tests.TWO_FINGER_TAP:
92 fn = lambda: _PerformTwoFingerTapTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070093 elif test.name in SINGLE_FINGER_LINE_TESTS:
94 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
95 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070096 elif test.name == tests.TWO_FINGER_TRACKING:
Charlie Mooneya337d582015-04-29 10:37:45 -070097 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070098 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
99 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700100 elif test.name == tests.PINCH_TO_ZOOM:
101 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700102
103 if fn is None:
104 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
105 return None
106
107 return Thread(target=fn)
108
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700109
Charlie Mooney08661912015-04-16 09:20:34 -0700110def _PerformStationaryNoiseTest(variation, robot, device_spec):
111 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700112 tap_position = LOCATION_COORDINATES[location]
113 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700114 robot.Tap(device_spec, [fingertip], tap_position, touch_time_s=4)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700115
116
Charlie Mooney1b708112015-04-28 14:46:21 -0700117def _PerformOneFingerTapTest(variation, robot, device_spec):
118 location, = variation
119 tap_position = LOCATION_COORDINATES[location]
120 fingertip = robot.fingertips[STANDARD_FINGERTIP]
Charlie Mooney4198adb2015-05-04 13:55:20 -0700121 robot.Tap(device_spec, [fingertip], tap_position)
122
123
124def _PerformTwoFingerTapTest(variation, robot, device_spec):
125 angle, = variation
126
127 fingertip1 = robot.fingertips[STANDARD_FINGERTIP]
128 fingertip2 = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
129 fingertips = [fingertip1, fingertip2]
130
131 robot.Tap(device_spec, fingertips, (CENTER, CENTER), angle=ANGLES[angle])
Charlie Mooney1b708112015-04-28 14:46:21 -0700132
133
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700134def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
135 direction, speed = variation
136 start, end = LINE_DIRECTION_COORDINATES[direction]
137 fingertip = robot.fingertips[STANDARD_FINGERTIP]
138
139 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneya337d582015-04-29 10:37:45 -0700140 robot.Line(device_spec, [fingertip], start, end, pause_time_s)
141 robot.PopSpeed()
142
143
144def _PerformTwoFingerLineTest(variation, robot, device_spec):
145 direction, speed = variation
146 start, end = LINE_DIRECTION_COORDINATES[direction]
147
148 # Compute the fingertip angle to be perpendicular to the
149 # movement direction
150 x1, y1 = start
151 x2, y2 = end
152 dy = y2 - y1
153 dx = x2 - x1
154 angle = -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
155
156 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
157 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
158 robot.PushSpeed(SPEEDS[speed])
159 robot.Line(device_spec, fingertips, start, end,
160 fingertip_spacing=5, fingertip_angle=angle)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700161 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700162
163
164def _PerformRestingFingerTest(variation, robot, device_spec):
165 direction, speed = variation
166 start, end = LINE_DIRECTION_COORDINATES[direction]
167 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
168
169 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
170 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
171
172 robot.PushSpeed(SPEEDS[speed])
173 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
174 moving_fingertip, start, end,
175 stationary_location)
176 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700177
178def _PerformPinchTest(variation, robot, device_spec):
179 direction, angle = variation
180
181 min_spread = 15
182 max_spread = min(device_spec.Height(), device_spec.Width(),
183 robot.MAX_FINGER_DISTANCE)
184 if direction == tests.GV.ZOOM_OUT:
185 start_distance, end_distance = max_spread, min_spread
186 else:
187 start_distance, end_distance = min_spread, max_spread
188
189 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
Charlie Mooney4198adb2015-05-04 13:55:20 -0700190 robot.Pinch(device_spec, (CENTER, CENTER), ANGLES[angle],
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700191 start_distance, end_distance)
192 robot.PopSpeed()