blob: 28a3867ed8b682e7647d0f7634adc999deed9c8c [file] [log] [blame]
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
""" This is a gesture for running the Quickstep latency tests
This gesture has the robot run a single finger in a zig-zag over the pad at a
fixed speed. It is intended to be used with a Quickstep latency measurement
device. The robot will move its finger back and forth over the laser beam and
then you can collect the Quickstep and touch logs to generate a latency
estimation.
This gesture only takes two arguments: the device spec and the speed
Example:
python quickstep.py link.p 100
"""
import numpy
import sys
from touchbotII import Touchbot,Device
from collections import namedtuple
NUM_CROSSINGS = 40
EDGE_BUFFER = 0.1
FINGER_SPREAD = 20
FINGERS = [0, 0, 1, 0]
TOP_EDGE = EDGE_BUFFER
BOTTOM_EDGE = 1.0 - EDGE_BUFFER
try:
# Load the device spec
device = Device(sys.argv[1])
speed = float(sys.argv[2])
except:
print 'Usage: python %s device.p speed' % __file__
print 'Example: python %s link.p 100' % __file__
sys.exit(-1)
# Connect to the robot and configure the profile to
bot = Touchbot()
prof = bot.GetCurrentProfile()
prof.speed = Touchbot.SPEED_MEDIUM
prof.inRange = Touchbot.BLEND_MOVEMENTS
prof.straight = Touchbot.STRAIGHT_INTERPOLATION
bot.SetProfileData(prof)
# Get the robot in position and ready to run the test
bot.SetFingerStates([0, 0, 0, 0])
start = device.RelativePosToAbsolutePos((EDGE_BUFFER, EDGE_BUFFER))
bot.SetCartesian(start, finger_distance=FINGER_SPREAD, blocking=True)
bot.SetFingerStates(FINGERS)
# Adjust the speed to the selected value before starting the actual test
bot.SetSpeed(speed)
# Compute a number of lines to draw across the pad and move in a zig-zag
step = (1.0 - 2 * EDGE_BUFFER) / (NUM_CROSSINGS / 4.0)
xs = [EDGE_BUFFER + i * step for i in range(int(NUM_CROSSINGS / 4.0))]
xs += [(1.0 - EDGE_BUFFER - i * step) for i in range(int(NUM_CROSSINGS / 4.0))]
for x in xs:
abs_start = device.RelativePosToAbsolutePos((x, TOP_EDGE))
abs_start = bot.CenterIfSingleFinger(FINGERS, abs_start, 20)
bot.SetCartesian(abs_start, finger_distance=FINGER_SPREAD, blocking=True)
abs_end = device.RelativePosToAbsolutePos((x, BOTTOM_EDGE))
abs_end = bot.CenterIfSingleFinger(FINGERS, abs_end, 20)
bot.SetCartesian(abs_end, finger_distance=FINGER_SPREAD, blocking=True)
bot.SetFingerStates([0, 0, 0, 0])