blob: 71ac01d3c47d7fd3454f0e5ab864321b7d181fb4 [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
11from threading import Thread
12
13import colorama as color
14
15import tests
16from touchbot import Touchbot
17
18
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070019STANDARD_FINGERTIP = '1round_9mm'
20
Charlie Mooney08661912015-04-16 09:20:34 -070021BUFFER_SIZE = 0.1
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070022OVERSHOOT_DISTANCE = 0.05
Charlie Mooney08661912015-04-16 09:20:34 -070023LEFT = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070024OVER_LEFT = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070025RIGHT = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070026OVER_RIGHT = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070027TOP = BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070028OVER_TOP = -OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070029BOTTOM = 1.0 - BUFFER_SIZE
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070030OVER_BOTTOM = 1.0 + OVERSHOOT_DISTANCE
Charlie Mooney08661912015-04-16 09:20:34 -070031CENTER = 0.5
32
33LOCATION_COORDINATES = {
34 tests.GV.TL: (LEFT, TOP),
35 tests.GV.TR: (RIGHT, TOP),
36 tests.GV.BL: (LEFT, BOTTOM),
37 tests.GV.BR: (RIGHT, BOTTOM),
38 tests.GV.TS: (CENTER, TOP),
39 tests.GV.BS: (CENTER, BOTTOM),
40 tests.GV.LS: (LEFT, CENTER),
41 tests.GV.RS: (RIGHT, CENTER),
42 tests.GV.CENTER: (CENTER, CENTER),
43}
44
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070045LINE_DIRECTION_COORDINATES = {
46 tests.GV.LR: ((LEFT, CENTER), (RIGHT, CENTER)),
47 tests.GV.RL: ((RIGHT, CENTER), (LEFT, CENTER)),
48 tests.GV.TB: ((CENTER, TOP), (CENTER, BOTTOM)),
49 tests.GV.BT: ((CENTER, BOTTOM), (CENTER, TOP)),
50 tests.GV.BLTR: ((LEFT, BOTTOM), (RIGHT, TOP)),
51 tests.GV.BRTL: ((RIGHT, BOTTOM), (LEFT, TOP)),
52 tests.GV.TRBL: ((RIGHT, TOP), (LEFT, BOTTOM)),
53 tests.GV.TLBR: ((LEFT, TOP), (RIGHT, BOTTOM)),
54 tests.GV.CL: ((CENTER, CENTER), (OVER_LEFT, CENTER)),
55 tests.GV.CR: ((CENTER, CENTER), (OVER_RIGHT, CENTER)),
56 tests.GV.CT: ((CENTER, CENTER), (CENTER, OVER_TOP)),
57 tests.GV.CB: ((CENTER, CENTER), (CENTER, OVER_BOTTOM)),
58 tests.GV.CUL: ((CENTER, CENTER), (OVER_LEFT, OVER_TOP)),
59 tests.GV.CLL: ((CENTER, CENTER), (OVER_LEFT, OVER_BOTTOM)),
60 tests.GV.CLR: ((CENTER, CENTER), (OVER_RIGHT, OVER_BOTTOM)),
61}
62
63SPEEDS = {
64 tests.GV.NORMAL: Touchbot.SPEED_MEDIUM,
65 tests.GV.SLOW: Touchbot.SPEED_SLOW,
66}
67
68SINGLE_FINGER_LINE_TESTS = [
69 tests.ONE_FINGER_TO_EDGE,
70 tests.ONE_FINGER_TRACKING,
71 tests.ONE_FINGER_TRACKING_FROM_CENTER,
72]
73
Charlie Mooney08661912015-04-16 09:20:34 -070074
75def PerformCorrespondingGesture(test, variation_number, robot, device_spec):
76 variation = test.variations[variation_number]
77 fn = None
78 if test.name == tests.NOISE_STATIONARY:
79 fn = lambda: _PerformStationaryNoiseTest(variation, robot, device_spec)
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070080 elif test.name in SINGLE_FINGER_LINE_TESTS:
81 pause = 1 if test.name == tests.ONE_FINGER_TRACKING_FROM_CENTER else 0
82 fn = lambda: _PerformOneFingerLineTest(variation, robot, device_spec, pause)
Charlie Mooney08661912015-04-16 09:20:34 -070083
84 if fn is None:
85 print color.Fore.RED + 'Error: Robot unable to perform gesture!'
86 return None
87
88 return Thread(target=fn)
89
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070090
Charlie Mooney08661912015-04-16 09:20:34 -070091def _PerformStationaryNoiseTest(variation, robot, device_spec):
92 frequency, amplitude, waveform, location = variation
Charlie Mooney61b4fbb2015-04-22 15:22:02 -070093 tap_position = LOCATION_COORDINATES[location]
94 fingertip = robot.fingertips[STANDARD_FINGERTIP]
95 robot.SingleTipTap(device_spec, fingertip, tap_position, touch_time_s=4)
96
97
98def _PerformOneFingerLineTest(variation, robot, device_spec, pause_time_s):
99 direction, speed = variation
100 start, end = LINE_DIRECTION_COORDINATES[direction]
101 fingertip = robot.fingertips[STANDARD_FINGERTIP]
102
103 robot.PushSpeed(SPEEDS[speed])
104 robot.SingleTipLine(device_spec, fingertip, start, end, pause_time_s)
105 robot.PopSpeed()