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
of the image are closest to the camera.
size: []
size: [n]
- AfTrigger:
type: int32_t

View file

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

View file

@ -39,11 +39,33 @@ class Control(object):
self.__name = name
self.__data = data
self.__enum_values = None
self.__size = None
enum_values = data.get('enum')
if enum_values is not None:
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
def description(self):
"""The control description"""
@ -86,15 +108,12 @@ class Control(object):
if typ == 'string':
return 'std::string'
if size is None:
if self.__size is None:
return typ
if len(size) > 0:
# fixed-sized Span
span_size = reduce(operator.mul, size)
return f"Span<const {typ}, {span_size}>"
if self.__size:
return f"Span<const {typ}, {self.__size}>"
else:
# variable-sized Span
return f"Span<const {typ}>"