| #!/usr/bin/env python3 |
| # SPDX-License-Identifier: GPL-2.0-or-later |
| # Copyright (C) 2019, Google Inc. |
| # |
| # Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| # |
| # Helper classes to handle source code generation for libcamera controls |
| |
| |
| class ControlEnum(object): |
| def __init__(self, data): |
| self.__data = data |
| |
| @property |
| def description(self): |
| """The enum description""" |
| return self.__data.get('description') |
| |
| @property |
| def name(self): |
| """The enum name""" |
| return self.__data.get('name') |
| |
| @property |
| def value(self): |
| """The enum value""" |
| return self.__data.get('value') |
| |
| |
| class Control(object): |
| def __init__(self, name, data, vendor): |
| self.__name = name |
| self.__data = data |
| self.__enum_values = None |
| self.__size = None |
| self.__vendor = vendor |
| |
| 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""" |
| return self.__data.get('description') |
| |
| @property |
| def enum_values(self): |
| """The enum values, if the control is an enumeration""" |
| if self.__enum_values is None: |
| return |
| for enum in self.__enum_values: |
| yield enum |
| |
| @property |
| def enum_values_count(self): |
| """The number of enum values, if the control is an enumeration""" |
| if self.__enum_values is None: |
| return 0 |
| return len(self.__enum_values) |
| |
| @property |
| def is_enum(self): |
| """Is the control an enumeration""" |
| return self.__enum_values is not None |
| |
| @property |
| def vendor(self): |
| """The vendor string, or None""" |
| return self.__vendor |
| |
| @property |
| def name(self): |
| """The control name (CamelCase)""" |
| return self.__name |
| |
| @property |
| def type(self): |
| typ = self.__data.get('type') |
| size = self.__data.get('size') |
| |
| if typ == 'string': |
| return 'std::string' |
| |
| if self.__size is None: |
| return typ |
| |
| if self.__size: |
| return f"Span<const {typ}, {self.__size}>" |
| else: |
| return f"Span<const {typ}>" |