blob: d585469a7078a48654b98b64c6e6f0f78f780349 [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 Mooney5065bcb2015-05-04 13:18:09 -070070PINCH_ANGLES = {
71 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 Mooney61b4fbb2015-04-22 15:22:02 -070091 elif test.name in SINGLE_FINGER_LINE_TESTS:
92 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
93 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070094 elif test.name == tests.TWO_FINGER_TRACKING:
Charlie Mooneya337d582015-04-29 10:37:45 -070095 fn = lambda: _PerformTwoFingerLineTest(variation, robot, device_spec)
Charlie Mooneye9fd6562015-04-30 13:45:19 -070096 elif test.name == tests.RESTING_FINGER_PLUS_2ND_FINGER_MOVE:
97 fn = lambda: _PerformRestingFingerTest(variation, robot, device_spec)
Charlie Mooney5065bcb2015-05-04 13:18:09 -070098 elif test.name == tests.PINCH_TO_ZOOM:
99 fn = lambda: _PerformPinchTest(variation, robot, device_spec)
Charlie Mooney08661912015-04-16 09:20:34 -0700100
101 if fn is None:
102 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
103 return None
104
105 return Thread(target=fn)
106
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700107
Charlie Mooney08661912015-04-16 09:20:34 -0700108def _PerformStationaryNoiseTest(variation, robot, device_spec):
109 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700110 tap_position = LOCATION_COORDINATES[location]
111 fingertip = robot.fingertips[STANDARD_FINGERTIP]
112 robot.SingleTipTap(device_spec, fingertip, tap_position, touch_time_s=4)
113
114
Charlie Mooney1b708112015-04-28 14:46:21 -0700115def _PerformOneFingerTapTest(variation, robot, device_spec):
116 location, = variation
117 tap_position = LOCATION_COORDINATES[location]
118 fingertip = robot.fingertips[STANDARD_FINGERTIP]
119 robot.SingleTipTap(device_spec, fingertip, tap_position)
120
121
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700122def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
123 direction, speed = variation
124 start, end = LINE_DIRECTION_COORDINATES[direction]
125 fingertip = robot.fingertips[STANDARD_FINGERTIP]
126
127 robot.PushSpeed(SPEEDS[speed])
Charlie Mooneya337d582015-04-29 10:37:45 -0700128 robot.Line(device_spec, [fingertip], start, end, pause_time_s)
129 robot.PopSpeed()
130
131
132def _PerformTwoFingerLineTest(variation, robot, device_spec):
133 direction, speed = variation
134 start, end = LINE_DIRECTION_COORDINATES[direction]
135
136 # Compute the fingertip angle to be perpendicular to the
137 # movement direction
138 x1, y1 = start
139 x2, y2 = end
140 dy = y2 - y1
141 dx = x2 - x1
142 angle = -1 * (math.degrees(math.atan2(y2 - y1, x2 - x1)) + 90)
143
144 fingertips = [robot.fingertips[STANDARD_FINGERTIP],
145 robot.fingertips[STANDARD_SECONDARY_FINGERTIP]]
146 robot.PushSpeed(SPEEDS[speed])
147 robot.Line(device_spec, fingertips, start, end,
148 fingertip_spacing=5, fingertip_angle=angle)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -0700149 robot.PopSpeed()
Charlie Mooneye9fd6562015-04-30 13:45:19 -0700150
151
152def _PerformRestingFingerTest(variation, robot, device_spec):
153 direction, speed = variation
154 start, end = LINE_DIRECTION_COORDINATES[direction]
155 stationary_location = LOCATION_COORDINATES[tests.GV.BL]
156
157 stationary_fingertip = robot.fingertips[STANDARD_FINGERTIP]
158 moving_fingertip = robot.fingertips[STANDARD_SECONDARY_FINGERTIP]
159
160 robot.PushSpeed(SPEEDS[speed])
161 robot.LineWithStationaryFinger(device_spec, stationary_fingertip,
162 moving_fingertip, start, end,
163 stationary_location)
164 robot.PopSpeed()
Charlie Mooney5065bcb2015-05-04 13:18:09 -0700165
166def _PerformPinchTest(variation, robot, device_spec):
167 direction, angle = variation
168
169 min_spread = 15
170 max_spread = min(device_spec.Height(), device_spec.Width(),
171 robot.MAX_FINGER_DISTANCE)
172 if direction == tests.GV.ZOOM_OUT:
173 start_distance, end_distance = max_spread, min_spread
174 else:
175 start_distance, end_distance = min_spread, max_spread
176
177 robot.PushSpeed(SPEEDS[tests.GV.NORMAL])
178 robot.Pinch(device_spec, (CENTER, CENTER), PINCH_ANGLES[angle],
179 start_distance, end_distance)
180 robot.PopSpeed()