Пример #1
0
def get_argparser():
    parser = argparse.ArgumentParser(description="ARTIQ Browser")
    parser.add_argument("--version",
                        action="version",
                        version="ARTIQ v{}".format(artiq_version),
                        help="print the ARTIQ version number")
    parser.add_argument("--db-file",
                        default=None,
                        help="database file for local browser settings "
                        "(default: %(default)s)")
    parser.add_argument("--browse-root",
                        default="",
                        help="root path for directory tree "
                        "(default %(default)s)")
    parser.add_argument("-s",
                        "--server",
                        default="::1",
                        help="hostname or IP of the master to connect to "
                        "when uploading datasets")
    parser.add_argument("--port",
                        default=3251,
                        type=int,
                        help="TCP port to use to connect to the master")
    parser.add_argument("select",
                        metavar="SELECT",
                        nargs="?",
                        help="directory to browse or file to load")
    common_args.verbosity_args(parser)
    return parser
def get_argparser():
    parser = argparse.ArgumentParser(description="ARTIQ controller manager")

    common_args.verbosity_args(parser)

    parser.add_argument("-s",
                        "--server",
                        default="::1",
                        help="hostname or IP of the master to connect to")
    parser.add_argument("--port-notify",
                        default=3250,
                        type=int,
                        help="TCP port to connect to for notifications")
    parser.add_argument("--port-logging",
                        default=1066,
                        type=int,
                        help="TCP port to connect to for logging")
    parser.add_argument("--retry-master",
                        default=5.0,
                        type=float,
                        help="retry timer for reconnecting to master")
    parser.add_argument("--host-filter",
                        default=None,
                        help="IP address of controllers to launch "
                        "(local address of master connection by default)")
    common_args.simple_network_args(parser, [("control", "control", 3249)])
    return parser
Пример #3
0
def get_argparser():
    parser = ArgumentParser(
        description="PI lock client with a Meilhaus RedLab analog out")
    wavemeter_pi_client_args(parser)
    group = parser.add_argument_group("channel selection")
    group.add_argument("-c",
                       "--channel",
                       default="ch1",
                       help="wavemeter channel to read out (default: \"ch1\")")
    group = parser.add_argument_group("output configuration")
    group.add_argument("-b", "--board", default=0, help="board number")
    group.add_argument("-i", "--id", default=0, help="channel id")
    parser.set_defaults(aux_output=False)
    group.add_argument("--aux-output",
                       dest="aux_output",
                       action="store_true",
                       help="enable additional output "
                       "(independent of lock, but can be "
                       "manually updated, e.g. to tweak "
                       "the current)")
    group.add_argument("-b2",
                       "--board2",
                       default=0,
                       help="board number (aux out)")
    group.add_argument("-i2", "--id2", default=0, help="channel id (aux out)")

    verbosity_args(parser)
    return parser
Пример #4
0
def get_argparser():
    parser = argparse.ArgumentParser(description="WAnD InfluxDB logger")
    verbosity_args(parser)
    parser.add_argument("-s",
                        "--server",
                        action="append",
                        help="Add a WAnD server by IP address")
    parser.add_argument(
        "-poll",
        "--poll-time",
        help="time between log updates (s) (default: '%(default)s')",
        type=int,
        default=300)
    influx = parser.add_argument_group("InfluxDB")
    influx.add_argument(
        "-db",
        "--database",
        help="influxdb database to log to (default: '%(default)s')",
        default="lasers")
    influx.add_argument("--host-db",
                        help="InfluxDB host name (default: '%(default)s')",
                        default="10.255.6.4")
    influx.add_argument("--user-db",
                        help="InfluxDB username (default: '%(default)s')",
                        default="admin")
    influx.add_argument("--password-db",
                        help="InfluxDB password (default: '%(default)s')",
                        default="admin")
    parser.add_argument(
        "--timeout",
        help=("timeout for RPC connection to servers, in seconds " +
              "(default: %(default)s s)"),
        type=float,
        default=5.0)
    return parser
Пример #5
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="ARTIQ schedule InfluxDB logger bridge",
        epilog="Listens to schedule updates on the master experiment schedule "
        "and submits schedule additions and removals to the InfluxDB "
        "database. Other schedule changes, such as transitions between "
        "pipeline states (prepare, prepare_done, running, etc.) are "
        "ignored. Typical high cardinality metadata is logged as "
        "fields while low cardinality data is logged as tags. "
        "The initially obtained complete state is logged as a 'clear' "
        "entry followed by the addition of all entries.")
    group = parser.add_argument_group("master")
    group.add_argument("--server-master",
                       default="::1",
                       help="hostname or IP of the master to connect to")
    group.add_argument("--port-master",
                       default=3250,
                       type=int,
                       help="TCP port to use to connect to the master")
    group.add_argument("--retry-master",
                       default=5.0,
                       type=float,
                       help="retry timer for reconnecting to master")
    group = parser.add_argument_group("database")
    group.add_argument(
        "--baseurl-db",
        default="http://localhost:8086",
        help="base URL to access InfluxDB (default: %(default)s)")
    group.add_argument("--user-db", default="", help="InfluxDB username")
    group.add_argument("--password-db", default="", help="InfluxDB password")
    group.add_argument("--database", default="db", help="database name to use")
    group.add_argument("--table", default="schedule", help="table name to use")
    common_args.simple_network_args(parser, [("control", "control", 3275)])
    common_args.verbosity_args(parser)
    return parser
Пример #6
0
def get_argparser():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description="ARTIQ flashing/deployment tool",
        epilog="""\
Valid actions:

    * gateware: write main gateware bitstream to flash
    * rtm_gateware: write RTM gateware bitstream to flash
    * bootloader: write bootloader to flash
    * storage: write storage image to flash
    * firmware: write firmware to flash
    * load: load main gateware bitstream into device (volatile but fast)
    * rtm_load: load RTM gateware bitstream into device
    * erase: erase flash memory
    * start: trigger the target to (re)load its gateware bitstream from flash

Prerequisites:

    * Connect the board through its/a JTAG adapter.
    * Have OpenOCD installed and in your $PATH.
    * Have access to the JTAG adapter's devices. Udev rules from OpenOCD:
      'sudo cp openocd/contrib/99-openocd.rules /etc/udev/rules.d'
      and replug the device. Ensure you are member of the
      plugdev group: 'sudo adduser $USER plugdev' and re-login.
""")

    parser.add_argument("--version", action="version",
                        version="ARTIQ v{}".format(artiq_version),
                        help="print the ARTIQ version number")

    common_args.verbosity_args(parser)

    parser.add_argument("-n", "--dry-run",
                        default=False, action="store_true",
                        help="only show the openocd script that would be run")
    parser.add_argument("-H", "--host", metavar="HOSTNAME",
                        type=str, default=None,
                        help="SSH host where the board is located")
    parser.add_argument("-J", "--jump",
                        type=str, default=None,
                        help="SSH host to jump through")
    parser.add_argument("-t", "--target", default="kasli",
                        help="target board, default: %(default)s, one of: "
                             "kasli sayma metlino kc705")
    parser.add_argument("-V", "--variant", default=None,
                        help="board variant. Autodetected if only one is installed.")
    parser.add_argument("-I", "--preinit-command", default=[], action="append",
                        help="add a pre-initialization OpenOCD command. "
                             "Useful for selecting a board when several are connected.")
    parser.add_argument("-f", "--storage", help="write file to storage area")
    parser.add_argument("-d", "--dir", help="look for board binaries in this directory")
    parser.add_argument("--srcbuild", help="board binaries directory is laid out as a source build tree",
                        default=False, action="store_true")
    parser.add_argument("--force-rtm", help="force RTM actions on boards/variants that normally do not have a RTM",
                        default=False, action="store_true")
    parser.add_argument("action", metavar="ACTION", nargs="*",
                        default="gateware rtm_gateware bootloader firmware start".split(),
                        help="actions to perform, default: %(default)s")
    return parser
Пример #7
0
def get_argparser():
    parser = argparse.ArgumentParser(description="WAnD server")

    simple_network_args(parser, [
        ("notify", "notifications", 3250),
        ("control", "control", 3251),
    ])
    verbosity_args(parser)
    parser.add_argument("-n",
                        "--name",
                        default="test",
                        help="server name, used to locate configuration file")
    parser.add_argument("--simulation",
                        action='store_true',
                        help="run in simulation mode")
    parser.add_argument("--fast-mode-timeout",
                        default=1800,
                        type=int,
                        help="fast mode timeout (s) (default: '%(default)s')")
    parser.add_argument("-b",
                        "--backup-dir",
                        default="",
                        type=str,
                        help="directory containing backup copies of "
                        "configuration files")
    return parser
Пример #8
0
def get_argparser(with_file=True):
    parser = argparse.ArgumentParser(
        description="Local experiment running tool")
    parser.add_argument("--version",
                        action="version",
                        version="ARTIQ v{}".format(artiq_version),
                        help="print the ARTIQ version number")

    common_args.verbosity_args(parser)
    parser.add_argument("--device-db",
                        default="device_db.py",
                        help="device database file (default: '%(default)s')")
    parser.add_argument("--dataset-db",
                        default="dataset_db.pyon",
                        help="dataset file (default: '%(default)s')")

    parser.add_argument("-c",
                        "--class-name",
                        default=None,
                        help="name of the class to run")
    parser.add_argument("-o",
                        "--hdf5",
                        default=None,
                        help="write results to specified HDF5 file"
                        " (default: print them)")
    if with_file:
        parser.add_argument("file",
                            metavar="FILE",
                            help="file containing the experiment to run")
    parser.add_argument("arguments",
                        metavar="ARGUMENTS",
                        nargs="*",
                        help="run arguments")

    return parser
Пример #9
0
def get_argparser():
    parser = argparse.ArgumentParser(description="ARTIQ static compiler")
    parser.add_argument("--version",
                        action="version",
                        version="ARTIQ v{}".format(artiq_version),
                        help="print the ARTIQ version number")

    common_args.verbosity_args(parser)
    parser.add_argument("--device-db",
                        default="device_db.py",
                        help="device database file (default: '%(default)s')")
    parser.add_argument("--dataset-db",
                        default="dataset_db.pyon",
                        help="dataset file (default: '%(default)s')")

    parser.add_argument("-c",
                        "--class-name",
                        default=None,
                        help="name of the class to compile")

    parser.add_argument("-o", "--output", default=None, help="output file")
    parser.add_argument("file",
                        metavar="FILE",
                        help="file containing the experiment to compile")
    parser.add_argument("arguments",
                        metavar="ARGUMENTS",
                        nargs="*",
                        help="run arguments")

    return parser
Пример #10
0
def get_argparser():
    parser = argparse.ArgumentParser(description="ARTIQ Dashboard")
    parser.add_argument("--version",
                        action="version",
                        version="ARTIQ v{}".format(artiq_version),
                        help="print the ARTIQ version number")
    parser.add_argument("-s",
                        "--server",
                        default="::1",
                        help="hostname or IP of the master to connect to")
    parser.add_argument("--port-notify",
                        default=3250,
                        type=int,
                        help="TCP port to connect to for notifications")
    parser.add_argument("--port-control",
                        default=3251,
                        type=int,
                        help="TCP port to connect to for control")
    parser.add_argument("--port-broadcast",
                        default=1067,
                        type=int,
                        help="TCP port to connect to for broadcasts")
    parser.add_argument("--db-file",
                        default=None,
                        help="database file for local GUI settings")
    parser.add_argument("-p",
                        "--load-plugin",
                        dest="plugin_modules",
                        action="append",
                        help="Python module to load on startup")
    common_args.verbosity_args(parser)
    return parser
Пример #11
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="""PTB temperature sensor controller.""")
    parser.add_argument(
        "-d", "--device", default=None,
        help="Device host name or IP address.")
    simple_network_args(parser, 3266)
    verbosity_args(parser)
    return parser
Пример #12
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="""PTB voltage/current source controller.""")
    parser.add_argument(
        "-d", "--device", default=None,
        help="Device host name or IP address.")
    simple_network_args(parser, 3259)
    verbosity_args(parser)
    return parser
Пример #13
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="ARTIQ controller for core device logs")
    common_args.verbosity_args(parser)
    common_args.simple_network_args(parser, 1068)
    parser.add_argument("--simulation", action="store_true",
                        help="Simulation - does not connect to device")
    parser.add_argument("core_addr", metavar="CORE_ADDR",
                        help="hostname or IP address of the core device")
    return parser
Пример #14
0
def get_argparser():
    parser = argparse.ArgumentParser(description="""HUT2 controller.
        Use this controller for Anel HUT2 power distribution devices.""")
    parser.add_argument("-d",
                        "--device",
                        default=None,
                        help="Device host name or IP address.")
    common_args.simple_network_args(parser, 3271)
    common_args.verbosity_args(parser)
    return parser
Пример #15
0
def get_argparser():
    parser = argparse.ArgumentParser()
    parser.add_argument("--uri", help="target host uri (default: '%(default)s')",
                        default="wss://ms1/core/")
    parser.add_argument("--user", default="guest")
    parser.add_argument("--password", default="")

    simple_network_args(parser, 3276)
    verbosity_args(parser)
    return parser
Пример #16
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="ARTIQ moninj proxy")
    common_args.verbosity_args(parser)
    common_args.simple_network_args(parser, [
        ("proxy", "proxying", 1383),
        ("control", "control", 1384)
    ])
    parser.add_argument("core_addr", metavar="CORE_ADDR",
                        help="hostname or IP address of the core device")
    return parser
Пример #17
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="ARTIQ controller for the Novatech 409B 4-channel DDS box")
    common_args.simple_network_args(parser, 3254)
    parser.add_argument(
        "-d", "--device", default=None,
        help="serial port.")
    parser.add_argument(
        "--simulation", action="store_true",
        help="Put the driver in simulation mode, even if --device is used.")
    common_args.verbosity_args(parser)
    return parser
Пример #18
0
def get_argparser():
    parser = argparse.ArgumentParser(description="""Rigol DP700 controller.

    Use this controller to drive DP700 series power supplies.""")
    common_args.simple_network_args(parser, 3251)
    parser.add_argument(
        "-s",
        "--serialPort",
        default=None,
        help="Serial port. See documentation for how to specify port.")
    common_args.verbosity_args(parser)
    return parser
Пример #19
0
def get_argparser():
    parser = argparse.ArgumentParser()
    parser.add_argument("--tcp",
                        help="use TCP device, else use first "
                        "USB device")
    parser.add_argument("--simulation",
                        action="store_true",
                        help="simulation device")

    common_args.simple_network_args(parser, 3257)
    common_args.verbosity_args(parser)
    return parser
Пример #20
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="ARTIQ data to InfluxDB bridge",
        epilog="Pattern matching works as follows. "
        "The default action on a key (dataset name) is to log it. "
        "Then the patterns are traversed in order and glob-matched "
        "with the key. "
        "Optional + and - pattern prefixes specify to either ignore or "
        "log keys matching the rest of the pattern. "
        "Default (in the absence of prefix) is to ignore. Last matched "
        "pattern takes precedence.")
    master_group = parser.add_argument_group("master")
    master_group.add_argument(
        "--server-master",
        default="::1",
        help="hostname or IP of the master to connect to")
    master_group.add_argument(
        "--port-master",
        default=3250,
        type=int,
        help="TCP port to use to connect to the master (default: %(default)s")
    master_group.add_argument("--retry-master",
                              default=5.0,
                              type=float,
                              help="retry timer for reconnecting to master")
    database_group = parser.add_argument_group("database")
    database_group.add_argument(
        "--baseurl-db",
        default="http://localhost:8086",
        help="base URL to access InfluxDB (default: %(default)s)")
    database_group.add_argument("--user-db",
                                default="",
                                help="InfluxDB username")
    database_group.add_argument("--password-db",
                                default="",
                                help="InfluxDB password")
    database_group.add_argument("--database",
                                default="db",
                                help="database name to use")
    database_group.add_argument("--table",
                                default="lab",
                                help="table name to use")
    filter_group = parser.add_argument_group("filter")
    filter_group.add_argument(
        "--pattern-file",
        default="influxdb_patterns.cfg",
        help="file to load the patterns from (default: %(default)s). "
        "If the file is not found, no patterns are loaded "
        "(everything is logged).")
    common_args.simple_network_args(parser, [("control", "control", 3248)])
    common_args.verbosity_args(parser)
    return parser
Пример #21
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="""HighFinesse Wavemeter controller""")
    parser.add_argument("-d",
                        "--device",
                        default=None,
                        help="Device host name or IP address")
    parser.add_argument("-o",
                        "--device-port",
                        default=1234,
                        help="Device TCP port number")
    common_args.simple_network_args(parser, 3273)
    common_args.verbosity_args(parser)
    return parser
Пример #22
0
def get_argparser():
    parser = argparse.ArgumentParser()
    parser.add_argument("-P", "--product", required=True,
                        help="type of the Thorlabs T-Cube device to control: "
                             "tdc001/tpz001")
    parser.add_argument("-d", "--device", default=None,
                        help="serial device. See documentation for how to "
                             "specify a USB Serial Number.")
    parser.add_argument("--simulation", action="store_true",
                        help="Put the driver in simulation mode, even if "
                             "--device is used.")
    common_args.simple_network_args(parser, 3255)
    common_args.verbosity_args(parser)
    return parser
Пример #23
0
def get_argparser():
    parser = ArgumentParser(
        description=
        "PI lock client using ethernet communication with a Toptica DLC controller"
    )
    wavemeter_pi_client_args(parser)
    group = parser.add_argument_group("channel selection")
    group.add_argument("-c",
                       "--channel",
                       default="ch1",
                       help="wavemeter channel to read out (default: \"ch1\")")
    group = parser.add_argument_group("output configuration")
    group.add_argument("-d",
                       "--dlc_address",
                       default=0,
                       help="Toptica DLC address")
    group.add_argument("-l",
                       "--laser",
                       type=int,
                       default=1,
                       help="Laser ID (1 or 2, default: 1)")
    group = parser.add_argument_group("output configuration")
    group.add_argument("--pzt_center",
                       default=None,
                       help="PZT center voltage in V (default: current value)")
    group.add_argument("--pzt_span",
                       type=float,
                       default=10.,
                       help="PZT voltage span in V (default: 10)")
    group.add_argument(
        "--current_center",
        type=float,
        default=None,
        help="center laser diode current in mA (default: current value)")
    # current_span intentionally defaults to 0 - users should know what they are doing if they adjust it
    group.add_argument("--current_span",
                       type=float,
                       default=0.,
                       help="laser diode current span in mA (default: 0)")
    parser.set_defaults(lock_current=False)
    group.add_argument(
        "--lock_current",
        dest="lock_current",
        action="store_true",
        help=
        "lock using the laser diode current (default: lock via PZT voltage, make LD current "
        "available as auxiliary output")
    verbosity_args(parser)
    return parser
Пример #24
0
def get_argparser():
    parser = argparse.ArgumentParser(
        description="""Laser SDK client controller.
        Use this controller for a TOPTICA DLC Pro.

        This exposes a low-level client (i.e. without knowledge of the
        parameter tree structure and types) as an ARTIQ device controller.
        Note: The param_type arguments to the get() method need to be passed as
        strings, not as types.""")
    parser.add_argument(
        "-d", "--device", default=None,
        help="Device host name or IP address.")
    common_args.simple_network_args(parser, 3272)
    common_args.verbosity_args(parser)
    return parser
Пример #25
0
def get_argparser():
    parser = argparse.ArgumentParser(description="WAnD laser locker")
    verbosity_args(parser)
    parser.add_argument("-s", "--server",
                        action="append",
                        help="Add a WAnD server by IP address")
    parser.add_argument("-poll", "--poll-time",
                        help="time between log updates (s) (default: "
                             "'%(default)s')",
                        type=int,
                        default=300)
    parser.add_argument("-db", "--database",
                        help="influxdb database to log to '%(default)s')",
                        default="lasers")
    return parser
Пример #26
0
def get_argparser():
    parser = argparse.ArgumentParser(description="WAnD GUI")
    parser.add_argument("-n", "--name",
                        default="test",
                        help="server name, used to locate configuration file")
    parser.add_argument("-f", "--log-to-file",
                        action="store_true",
                        help="Save log output to file")
    parser.add_argument("-b", "--backup-dir",
                        default="",
                        type=str,
                        help="directory containing backup copies of "
                             "configuration files")
    verbosity_args(parser)

    return parser
Пример #27
0
def get_argparser():
    parser = ArgumentParser(description="Wavemeter ARTIQ dataset updater")
    group = parser.add_argument_group("network arguments")
    group.add_argument("-w", "--wavemeter_server", default="::1", help="address of the host running the wavemeter"
                                                                       " server (default: ::1 (localhost))")
    group.add_argument("--wavemeter_port", type=int, default=3281, help="wavemeter server publisher port"
                                                                        " (default: 3281)")
    group.add_argument("-a", "--artiq_server", default="::1", help="address of the host running the artiq master"
                                                                   " (default: ::1 (localhost))")
    group.add_argument("--artiq_port", type=int, default=3251, help="artiq master RPC server port (default: 3251)")
    group = parser.add_argument_group("source and target")
    group.add_argument("-c", "--channel", nargs="*", default=[i for i in range(1, 9)],
                       help="list of channels to read out (channel numbers, and/or T, p; default: 1 2 3 4 5 6 7 8)")
    group.add_argument("--dataset", default="wavemeter.", help="target dataset prefix (default: 'wavemeter.')")

    verbosity_args(parser)
    return parser
Пример #28
0
def get_argparser():
    parser = ArgumentParser(description="Wavelength logging client. Specify a filename to start logging (Ch1 to Ch8 "
                                        "wavelengths by default) or leave filename blank to start GUI")
    group = parser.add_argument_group("network arguments")
    group.add_argument("-s", "--server", default="::1", help="address of the wavemeter server (default: ::1)")
    group.add_argument("-p", "--port", default=3280, help="port of the wavemeter server (default: 3280)")
    group = parser.add_argument_group("logging options")
    group.add_argument("-c", "--channel", nargs="*", default=[i for i in range(1, 9)],
                       help="list of channels to log (channel numbers, T, or p; default: 1 2 3 4 5 6 7 8)")
    group.add_argument("-i", "--interval", default=1., help="Logging interval in seconds")
    parser.set_defaults(append=False)
    group.add_argument("-a", "--append", dest="append", action="store_true")
    group.add_argument("-f", "--file", default="", help="output filename")
    parser.set_defaults(T=False, p=False)
    verbosity_args(parser)

    return parser
Пример #29
0
def get_argparser():
    parser = ArgumentParser(description="Wavemeter server")
    group = parser.add_argument_group("data readout")
    group.add_argument(
        "-c",
        "--channel",
        nargs="*",
        default=[i for i in range(1, 9)],
        help="list of channels to read out (default: 1 2 3 4 5 6 7 8)")
    group.add_argument("--nchannels",
                       default=8,
                       help="number of hardware channels (default: 8)")
    parser.set_defaults(T=False, p=False)
    group.add_argument(
        "-T",
        dest="T",
        action="store_true",
        help="enable temperature readout (available as channel \"T\")")
    group.add_argument(
        "-p",
        dest="p",
        action="store_true",
        help="enable pressure readout (available as channel \"p\")")
    group.add_argument(
        "-skip-thr",
        default=10.,
        help="values are ignored if they differ by more than this (in nm) from"
        " the previous reading of the same channel (this discards the"
        " occasional values from a wrong channel) (default: 10.0)")
    group = parser.add_argument_group("startup options")
    group.add_argument(
        "--callback",
        default=True,
        help="install the wavemeter software callback at startup"
        " (default: True)")
    group.add_argument(
        "--start-pub",
        default=True,
        help="start the publisher (for new values and status updates)"
        " at startup (default: True)")
    simple_network_args(
        parser,
        [("rpc", "RPC", 3280),
         ("pub", "publisher (for new values and status updates)", 3281)])
    verbosity_args(parser)
    return parser
Пример #30
0
def get_argparser():
    parser = argparse.ArgumentParser(description="""Thorlabs Camera controller.

    Use this controller to drive Thorlabs Scientific Imaging cameras.""")
    common_args.simple_network_args(parser, 3252)
    parser.add_argument(
        "-d",
        "--device",
        default=None,
        help=
        "Camera serial number. Connects to first available camera if not used."
    )
    parser.add_argument(
        "-e",
        "--exposure",
        default=None,
        help="Exposure time in seconds. Defaults to minimum if not used.")
    common_args.verbosity_args(parser)
    return parser