# 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()