blob: c84e955f8cdf1d344202a4ff900410f26631e590 [file] [log] [blame]
# Copyright (c) 2012 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.
"""Move the finger in a straight line between two points at a specified
speed in mm/s. Optionally preform a "swipe" along this line where it lowers
down up gradually instead of tracing the points, or do a "fling" where the
robot begins normally but quickly jerks up at the end to simulate a user
flinging a web page. Finally a "no_pause" line is similar to a swipe but
has a much shorter period of lift-off, essentially creating a basic line
but with less of a pause at the beginning and end.
Usage: ./line DEVICE START_X START_Y END_X END_Y
SPEED_IN_MM_PER_S [basic|no_pause|swipe|fling]
eg: ./line snow 0.1 0.1 0.9 0.9 15.0 basic
eg: ./line snow 0.5 0.0 0.5 0.9 15.0 swipe
"""
import sys
import roibot
import run_program
def program(robot, bounds, *args, **kwargs):
"""Upload a new program to the robot. This program moves the finger
in a given straight line as a specified speed in mm/s.
"""
# Compute the endpoints of the stroke from the robots point of view
start_x, start_y = bounds.convert(float(args[0]), float(args[1]))
end_x, end_y = bounds.convert(float(args[2]), float(args[3]))
line_speed = float(args[4])
line_type = args[5].lower()
# Get into position
SETUP_SPEED = 60
robot.addMoveCommand(start_x, start_y, bounds.upZ(), SETUP_SPEED)
# Preform the stroke
if line_type == "basic":
# Touch down and stay on the touchpad for the duration of the line
robot.addMoveCommand(start_x, start_y, bounds.paperZ(), SETUP_SPEED)
robot.addMoveCommand(end_x, end_y, bounds.paperZ(), line_speed)
# Lift up only once the whole line is done
robot.addMoveCommand(end_x, end_y, bounds.upZ(), SETUP_SPEED)
if line_type == "no_pause":
# Touch down smoothly and start the line
touchdown_x = (5.0 * start_x + end_x) / 6.0
touchdown_y = (5.0 * start_y + end_y) / 6.0
robot.addMoveCommand(touchdown_x, touchdown_y, bounds.paperZ(),
line_speed, accuracy="PASS")
# Go for the majority of the line as usual
liftup_x = (start_x + 5.0 * end_x) / 6.0
liftup_y = (start_y + 5.0 * end_y) / 6.0
robot.addMoveCommand(liftup_x, liftup_y, bounds.paperZ(), line_speed,
accuracy="PASS")
# Then lift up gradually for the remaining 1/6
robot.addMoveCommand(end_x, end_y, bounds.upZ(), line_speed)
elif line_type == "swipe":
# Gradually lower onto the surface over the first 1/4 of the line
touchdown_x = (3.0 * start_x + end_x) / 4.0
touchdown_y = (3.0 * start_y + end_y) / 4.0
robot.addMoveCommand(touchdown_x, touchdown_y, bounds.paperZ(),
line_speed, accuracy="PASS")
# Stay on the touchpad for 3/4 of the distance
liftup_x = (start_x + 3.0 * end_x) / 4.0
liftup_y = (start_y + 3.0 * end_y) / 4.0
robot.addMoveCommand(liftup_x, liftup_y, bounds.paperZ(), line_speed,
accuracy="PASS")
# Then lift up gradually for the remaining 1/4
robot.addMoveCommand(end_x, end_y, bounds.upZ(), line_speed)
elif line_type == "fling":
# Touch down and stay on the touchpad for most of the line
robot.addMoveCommand(start_x, start_y, bounds.paperZ(), SETUP_SPEED)
# Stay on the touchpad for 5/6 of the distance
liftup_x = (start_x + 5.0 * end_x) / 6.0
liftup_y = (start_y + 5.0 * end_y) / 6.0
robot.addMoveCommand(
liftup_x, liftup_y, bounds.paperZ(), line_speed, accuracy="PASS")
# Then lift up gradually for the remaining 1/6
robot.addMoveCommand(end_x, end_y, bounds.upZ(), line_speed)
if __name__=="__main__":
if len(sys.argv) != 8:
print "Usage: ./line device_name " \
"start_x start_y end_x end_y speed_mm/s " \
"[basic|no_pause|swipe|fling]"
else:
device = sys.argv[1]
start_x = float(sys.argv[2])
start_y = float(sys.argv[3])
end_x = float(sys.argv[4])
end_y = float(sys.argv[5])
speed = float(sys.argv[6])
line_type = sys.argv[7].lower()
run_program.run_program(program, device, start_x, start_y, end_x,
end_y, speed, line_type)