You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.4 KiB
112 lines
3.4 KiB
# Copyright 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.
|
|
|
|
import os
|
|
import time
|
|
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.cros.chameleon import chameleon_port_finder
|
|
from autotest_lib.client.cros.video import method_logger
|
|
|
|
|
|
class ChameleonScreenshotCapturer(object):
|
|
"""
|
|
Provides an interface to capture a dut screenshot using a Chameleon Board.
|
|
|
|
Example use:
|
|
with ChameleonScreenshotCapturer(board, 'HDMI', dutil, '/tmp', 10) as c:
|
|
c.capture(filename)
|
|
"""
|
|
|
|
|
|
def __init__(self, chameleon_board, interface, display_facade, dest_dir,
|
|
timeout_video_input_s, box=None):
|
|
"""
|
|
@param chameleon_board: object representing the ChameleonBoard.
|
|
@param interface: string, display interface to use. eg.: HDMI
|
|
@param display_facade: display facade object to interact with DUT
|
|
@param dest_dir: path, full path to the dest dir to put the screenshot.
|
|
@param timeout_video_input_s: int, max time to wait for chameleon video
|
|
input to become stable.
|
|
@box: int tuple, left, upper, right, lower pixel coordinates
|
|
defining a desired image region
|
|
|
|
"""
|
|
self.chameleon_board = chameleon_board
|
|
self.display_facade = display_facade
|
|
self.interface = interface.lower()
|
|
self.dest_dir = dest_dir
|
|
self.port = None
|
|
self.box = box
|
|
self.timeout_video_input_s = timeout_video_input_s
|
|
self.was_plugged = False
|
|
self._find_connected_port()
|
|
|
|
|
|
@method_logger.log
|
|
def __enter__(self):
|
|
|
|
if not self.was_plugged:
|
|
self.port.plug()
|
|
|
|
self.port.wait_video_input_stable(self.timeout_video_input_s)
|
|
|
|
self.display_facade.set_mirrored(True)
|
|
time.sleep(self.timeout_video_input_s)
|
|
|
|
return self
|
|
|
|
|
|
@method_logger.log
|
|
def _find_connected_port(self):
|
|
"""
|
|
Gets a connected port of the pre-specified interface.
|
|
|
|
@raises TestError if desired port was not detected.
|
|
|
|
"""
|
|
self.chameleon_board.reset()
|
|
finder = chameleon_port_finder.ChameleonVideoInputFinder(
|
|
self.chameleon_board, self.display_facade)
|
|
|
|
connected_port = finder.find_port(self.interface)
|
|
|
|
if connected_port is None:
|
|
msg = 'No %s port found.\n' % self.interface
|
|
raise error.TestError(msg + str(finder))
|
|
|
|
self.port = connected_port
|
|
self.was_plugged = connected_port.plugged
|
|
|
|
|
|
@method_logger.log
|
|
def capture(self, filename, box=None):
|
|
"""
|
|
Captures a screenshot using provided chameleon board.
|
|
|
|
We save to a file because comparers like bp take files.
|
|
|
|
@param filename: string, filename of the image to save to.
|
|
@param box: int tuple, left, upper, right, lower pixel coordinates
|
|
defining a box region of what the image should be.
|
|
@returns a fullpath to the image just captured.
|
|
|
|
"""
|
|
|
|
fullpath = os.path.join(self.dest_dir, filename)
|
|
|
|
if not box:
|
|
box = self.box
|
|
|
|
img = self.port.capture_screen()
|
|
img.crop(box).save(fullpath)
|
|
|
|
return fullpath
|
|
|
|
|
|
@method_logger.log
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
if not self.was_plugged:
|
|
self.port.unplug()
|