utils: gen-controls: Improve YAML notation for variable-size array controls

Array controls specify the array size through the YAML 'size' element,
which stores a list of values, one per dimension. Variable-size arrays
currently use an empty 'size' list, which prevents describing the number
of dimensions of the array.

Improve this by using the same notation for fixed-size and variable-size
array controls. Dimensions that are not fixed are described as a string
instead of an integer, such as [n], [n,3] or [w,h]. The strings have
currently no special meaning, this may change in the future.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2022-08-10 01:01:22 +03:00
parent 24f866f6a3
commit 22ab0b4193
3 changed files with 28 additions and 9 deletions

View file

@ -525,7 +525,7 @@ controls:
the window where the focal distance for the objects shown in that part the window where the focal distance for the objects shown in that part
of the image are closest to the camera. of the image are closest to the camera.
size: [] size: [n]
- AfTrigger: - AfTrigger:
type: int32_t type: int32_t

View file

@ -497,7 +497,7 @@ controls:
- PixelArrayOpticalBlackRectangles: - PixelArrayOpticalBlackRectangles:
type: Rectangle type: Rectangle
size: [] size: [n]
description: | description: |
The pixel array region(s) which contain optical black pixels The pixel array region(s) which contain optical black pixels
considered valid for calibration purposes. considered valid for calibration purposes.
@ -592,7 +592,7 @@ controls:
- PixelArrayActiveAreas: - PixelArrayActiveAreas:
type: Rectangle type: Rectangle
size: [] size: [n]
description: | description: |
The PixelArrayActiveAreas property defines the (possibly multiple and The PixelArrayActiveAreas property defines the (possibly multiple and
overlapping) portions of the camera sensor readable pixel matrix overlapping) portions of the camera sensor readable pixel matrix

View file

@ -39,11 +39,33 @@ class Control(object):
self.__name = name self.__name = name
self.__data = data self.__data = data
self.__enum_values = None self.__enum_values = None
self.__size = None
enum_values = data.get('enum') enum_values = data.get('enum')
if enum_values is not None: if enum_values is not None:
self.__enum_values = [ControlEnum(enum) for enum in enum_values] self.__enum_values = [ControlEnum(enum) for enum in enum_values]
size = self.__data.get('size')
if size is not None:
if len(size) == 0:
raise RuntimeError(f'Control `{self.__name}` size must have at least one dimension')
# Compute the total number of elements in the array. If any of the
# array dimension is a string, the array is variable-sized.
num_elems = 1
for dim in size:
if type(dim) is str:
num_elems = 0
break
dim = int(dim)
if dim <= 0:
raise RuntimeError(f'Control `{self.__name}` size must have positive values only')
num_elems *= dim
self.__size = num_elems
@property @property
def description(self): def description(self):
"""The control description""" """The control description"""
@ -86,15 +108,12 @@ class Control(object):
if typ == 'string': if typ == 'string':
return 'std::string' return 'std::string'
if size is None: if self.__size is None:
return typ return typ
if len(size) > 0: if self.__size:
# fixed-sized Span return f"Span<const {typ}, {self.__size}>"
span_size = reduce(operator.mul, size)
return f"Span<const {typ}, {span_size}>"
else: else:
# variable-sized Span
return f"Span<const {typ}>" return f"Span<const {typ}>"