[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