[PATCH v3 2/4] utils: codegen: controls.py: Parse direction information
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Dec 6 14:16:11 CET 2024
On Fri, Dec 06, 2024 at 12:47:30PM +0000, Kieran Bingham wrote:
> Quoting Paul Elder (2024-11-29 09:19:14)
> > In preparation for adding support for querying direction information
> > from controls, parse the direction information from control ID
> > definitions. This can later be plugged in directly to the IPA code
> > generators simply by using ctrl.direction.
> >
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >
> > ---
> > Changes in v3:
> > - minor reordering
> >
> > Changes in v2:
> > - prevent errors in parsing properties, since the direction field is now
> > required yet properties can only be out
> > - do this by expanding the Control constructor to take the mode
> > argument, so that needs to be passed in by the users of Control
> > ---
> > src/py/libcamera/gen-py-controls.py | 2 +-
> > utils/codegen/controls.py | 24 +++++++++++++++++++++++-
> > utils/codegen/gen-controls.py | 2 +-
> > utils/codegen/gen-gst-controls.py | 2 +-
> > 4 files changed, 26 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/py/libcamera/gen-py-controls.py b/src/py/libcamera/gen-py-controls.py
> > index cf09c146084d..d43a7c1c7eab 100755
> > --- a/src/py/libcamera/gen-py-controls.py
> > +++ b/src/py/libcamera/gen-py-controls.py
> > @@ -83,7 +83,7 @@ def main(argv):
> > vendors.append(vendor)
> >
> > for ctrl in data['controls']:
> > - ctrl = Control(*ctrl.popitem(), vendor)
> > + ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> > controls.append(extend_control(ctrl, args.mode))
> >
> > data = {
> > diff --git a/utils/codegen/controls.py b/utils/codegen/controls.py
> > index 03c77cc64abe..602f15b25fb6 100644
> > --- a/utils/codegen/controls.py
> > +++ b/utils/codegen/controls.py
> > @@ -28,7 +28,7 @@ class ControlEnum(object):
> >
> >
> > class Control(object):
> > - def __init__(self, name, data, vendor):
> > + def __init__(self, name, data, vendor, mode):
> > self.__name = name
> > self.__data = data
> > self.__enum_values = None
> > @@ -60,6 +60,16 @@ class Control(object):
> >
> > self.__size = num_elems
> >
> > + if mode == 'properties':
> > + self.__direction = 'out'
> > + else:
> > + direction = self.__data.get('direction')
> > + if direction is None:
> > + raise RuntimeError(f'Control `{self.__name}` missing required field `{direction}`')
> > + if direction not in ['in', 'out', 'inout']:
> > + raise RuntimeError(f'Control `{self.__name}` direction `{direction}` is invalid; must be one of `in`, `out`, or `inout`')
> > + self.__direction = direction
> > +
> > @property
> > def description(self):
> > """The control description"""
> > @@ -111,6 +121,18 @@ class Control(object):
> > else:
> > return f"Span<const {typ}>"
> >
> > + @property
> > + def direction(self):
> > + in_flag = 'ControlId::Direction::In'
> > + out_flag = 'ControlId::Direction::Out'
>
> Does this work ? Are these the flags that are only introduced in the
> next patch ?
As the template is only modified in the next patch, this patch alone
shouldn't cause any difference in the generated code.
> > +
> > + if self.__direction == 'inout':
> > + return f'{in_flag} | {out_flag}'
> > + if self.__direction == 'in':
> > + return in_flag
> > + if self.__direction == 'out':
> > + return out_flag
> > +
> > @property
> > def element_type(self):
> > return self.__data.get('type')
> > diff --git a/utils/codegen/gen-controls.py b/utils/codegen/gen-controls.py
> > index 3034e9a54760..59b716c1c48c 100755
> > --- a/utils/codegen/gen-controls.py
> > +++ b/utils/codegen/gen-controls.py
> > @@ -71,7 +71,7 @@ def main(argv):
> > ctrls = controls.setdefault(vendor, [])
> >
> > for i, ctrl in enumerate(data['controls']):
> > - ctrl = Control(*ctrl.popitem(), vendor)
> > + ctrl = Control(*ctrl.popitem(), vendor, args.mode)
> > ctrls.append(extend_control(ctrl, i, ranges))
> >
> > # Sort the vendors by range numerical value
> > diff --git a/utils/codegen/gen-gst-controls.py b/utils/codegen/gen-gst-controls.py
> > index 2601a67588a3..df0988266294 100755
> > --- a/utils/codegen/gen-gst-controls.py
> > +++ b/utils/codegen/gen-gst-controls.py
> > @@ -154,7 +154,7 @@ def main(argv):
> > ctrls = controls.setdefault(vendor, [])
> >
> > for ctrl in data['controls']:
> > - ctrl = Control(*ctrl.popitem(), vendor)
> > + ctrl = Control(*ctrl.popitem(), vendor, mode='controls')
> >
> > if ctrl.name in exposed_controls:
> > ctrls.append(extend_control(ctrl))
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list