Consolidate demo argument parsing in pycomedi_demo_args.py to reduce duplication.
[pycomedi.git] / doc / demo / pycomedi_demo_args.py
1 # Copyright
2
3 import argparse as _argparse
4 import logging as _logging
5
6 from pycomedi import LOG as _LOG
7 import pycomedi.constant as _constant
8
9
10 class _SetFrequencyAction (_argparse.Action):
11     def __call__(self, parser, namespace, values, option_string=None):
12         setattr(namespace, self.dest, values)
13         setattr(namespace, 'period', 1.0/values)
14
15
16 class _IncrementVerbosityAction (_argparse.Action):
17     def __call__(self, parser, namespace, values, option_string=None):
18         level = _LOG.level
19         level -= 10  # e.g. logging.INFO -> logging.DEBUG
20         if level >= _logging.DEBUG:
21             _LOG.setLevel(level)
22
23
24 # name -> (args, kwargs)
25 ARGUMENTS = {
26     'filename':(
27         ['-f', '--filename'],
28         {'default':'/dev/comedi0',
29          'help':'path to comedi device file'}),
30     'subdevice':(
31         ['-s', '--subdevice'],
32         {'type':int,
33          'help':'subdevice for analog input/output'}),
34     'channel':(
35         ['-c', '--channel'],
36         {'type':int,
37          'default':0,
38          'help':'channel for analog input/output'}),
39     'channels':(
40         ['-c', '--channels'],
41         {'type':lambda x: [int(i) for i in x.split(',')],
42          'default':0,
43          'help':'comma-separated channels for analog input/output'}),
44     'aref':(
45         ['-a', '--analog-reference'],
46         {'dest':'aref',
47          'default':_constant.AREF.ground,
48          'type':lambda x: _constant.AREF.index_by_name(x),
49          'choices':_constant.AREF,
50          'help':'reference for analog input/output'}),
51     'range':(
52         ['-r', '--range'],
53         {'type':int,
54          'default':0,
55          'help':'range for analog input/output'}),
56     'num-scans':(
57         ['-N', '--num-scans'],
58         {'type':int,
59          'default':10,
60          'help':'number of input/output scans'}),
61     'frequency':(
62         ['-F', '--frequency'],
63         {'type':float,
64          'action':_SetFrequencyAction,
65          'help':'scan frequency in hertz'}),
66     'physical':(
67         ['-p', '--physical'],
68         {'default':False,
69          'action':'store_const',
70          'const':True,
71          'help':'convert input to physical values before printing'}),
72     'verbose':(
73         ['-v', '--verbose'],
74         {'action':_IncrementVerbosityAction}),
75     }
76
77 def parse_args(description, argnames):
78     parser = _argparse.ArgumentParser(description=description)
79     for argument in ['filename', 'subdevice', 'channels', 'aref', 'range',
80                      'num-scans', 'frequency', 'physical', 'verbose']:
81         args,kwargs = ARGUMENTS[argument]
82         parser.add_argument(*args, **kwargs)
83     return parser.parse_args()