summaryrefslogtreecommitdiffhomepage
path: root/host/utils/init_proto.py
blob: 8125543c6db2ecaaa25caf88e82025d82039beed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""Helper to create a Proto instance."""
import proto.popen_io
import serial
import optparse

class InitProto:
    """Helper to create a Proto instance from command line arguments."""

    def __init__ (self, default_robot, proto_class, init_module = None,
            init = None):
        """Initialise helper."""
        if init_module is None and init is None:
            init = { }
        self.proto_class = proto_class
        self.init_module = init_module
        self.init = init
        # Prepare parser.
        self.parser = optparse.OptionParser (
                usage = "usage: %prog [options] TTY|! PROGRAM...",
                description = "TTY is a device name (example: %prog "
                "/dev/ttyUSB0), PROGRAM is a host program with its arguments "
                "(example: %prog -- ! ../src/board.host board_arg).")
        if init_module:
            self.parser.add_option ('-r', '--robot',
                    help = "use specified robot",
                    metavar = 'NAME', default = default_robot)

    def parse_args (self):
        """Parse command line."""
        (self.options, self.args) = self.parser.parse_args ()
        if self.init_module and self.options.robot is None:
            self.parser.error ("no robot specified")

    def get_proto (self):
        """Return the Proto instance."""
        if not self.args:
            self.parser.error ("not enough arguments")
        # Create parameters.
        if self.args[0] == '!':
            io = proto.popen_io.PopenIO (self.args[1:])
            if self.init_module:
                self.init = self.init_module.host[self.options.robot]
        else:
            if len (self.args) != 1:
                self.parser.error ("too many arguments after device")
            io = serial.Serial (self.args[0])
            if self.init_module:
                self.init = self.init_module.target[self.options.robot]
        return self.proto_class (io, **self.init)

def init_proto (default_robot, proto_class, init_module = None, init = None):
    """Helper to create a Proto instance from command line arguments."""
    ip = InitProto (default_robot, proto_class, init_module, init)
    ip.parse_args ()
    return ip.get_proto ()