blob: 60eecff20da2408e6ed20aa5a1b05d1c2c5d16ec [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.
"""Common code for multiservo operation support"""
import os
if os.getuid():
DEFAULT_RC_FILE = '/home/%s/.servodrc' % os.getenv('USER', '')
else:
DEFAULT_RC_FILE = '/home/%s/.servodrc' % os.getenv('SUDO_USER', '')
def add_multiservo_parser_options(parser):
"""Add common options descriptors to the parser object
Both servod and dut-control accept command line options for configuring
multiservo operation. This function configures the command line parser
object to accept those options.
"""
parser.add_option("--rcfile", type=str,
default=DEFAULT_RC_FILE,
help="servo description file for multi-servo operation,"
" %s is used by default." % DEFAULT_RC_FILE)
parser.add_option("-n", "--name", type=str,
help="symbolic name of the servo board, "
"used as a config shortcut, could also be supplied "
"through environment variable SERVOD_NAME")
def parse_rc(logger, rc_file):
"""Parse servodrc configuration file
The format of the configuration file is described above in comments to
DEFAULT_RC_FILE. I the file is not found or is mis-formatted, a warning is
printed but the program tries to continue.
Args:
logger: a logging instance used by this servod driver
rc_file: a string, name of the file storing the configuration
Returns:
a dictionary, where keys are symbolic servo names, and values are
dictionaries representing servo parameters read from the config file,
keyed by strings 'sn' (for serial number), 'port', and 'board'.
"""
rcd = {} # Dictionary representing the rc file contents.
if os.path.isfile(rc_file):
for rc_line in open(rc_file, 'r').readlines():
line = rc_line.split('#')[0].strip()
if not line:
continue
elts = [x.strip() for x in line.split(',')]
name = elts[0]
if not name or len(elts) < 2 or [x for x in elts if ' ' in x]:
logger.info('ignoring rc line "%s"', rc_line.rstrip())
continue
rcd[name] = {
'sn': elts[1],
'port': None,
'board': None
}
if (len(elts) > 2):
rcd[name]['port'] = int(elts[2])
if len(elts) > 3:
rcd[name]['board'] = elts[3]
if len(elts) > 4:
logger.info("discarding %s for for %s", ' '.join(elts[4:]), name)
return rcd
def get_env_options(logger, options):
"""Look for non-defined options in the environment
SERVOD_PORT and SERVOD_NAME environment variables can be used if --port
and --name command line switches are not set. Set the options values as
necessary.
Args:
logger: a logging instance used by this servod driver
options: the options object returned by opt_parse
"""
if not options.port:
env_port = os.getenv('SERVOD_PORT')
if env_port:
try:
options.port = int(env_port)
except ValueError:
logger.warning('Ignoring environment port definition "%s"', env_port)
if not options.name:
options.name = os.getenv('SERVOD_NAME')