Message ID | 20201023171116.24899-6-jacopo@jmondi.org |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
Hi Jacopo, Thank you for the patch. On Fri, Oct 23, 2020 at 07:11:09PM +0200, Jacopo Mondi wrote: > For each Control that support enumerated values generate a vector s/support/supports/ s/a vector/an array/ > of ControlValues which contains the full list of values. > > At the expense of a slight increase in memory occupation this change > allows the construction of the ControlInfo associated with a Control > from the values list, defaulting the minimum and maximum values > reported by the ControlInfo. > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> If anyone is looking for a newbies task, converting the controls and properties templates to jinja is a good candidate, I think it will simplify the scripts and make them easier to maintain. > --- > include/libcamera/control_ids.h.in | 1 + > src/libcamera/control_ids.cpp.in | 1 + > utils/gen-controls.py | 30 ++++++++++++++++++++++++++++++ > 3 files changed, 32 insertions(+) > > diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in > index baadca83b103..7edeb6b65e32 100644 > --- a/include/libcamera/control_ids.h.in > +++ b/include/libcamera/control_ids.h.in > @@ -10,6 +10,7 @@ > #ifndef __LIBCAMERA_CONTROL_IDS_H__ > #define __LIBCAMERA_CONTROL_IDS_H__ > > +#include <array> > #include <stdint.h> > > #include <libcamera/controls.h> > diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in > index 056645cfbdfb..5fb1c2c30558 100644 > --- a/src/libcamera/control_ids.cpp.in > +++ b/src/libcamera/control_ids.cpp.in > @@ -8,6 +8,7 @@ > */ > > #include <libcamera/control_ids.h> > +#include <libcamera/controls.h> > > /** > * \file control_ids.h > diff --git a/utils/gen-controls.py b/utils/gen-controls.py > index bf681503f86a..a0bd43fabc31 100755 > --- a/utils/gen-controls.py > +++ b/utils/gen-controls.py > @@ -33,6 +33,12 @@ ${description}''') > ${description} > */''') > def_template = string.Template('extern const Control<${type}> ${name}(${id_name}, "${name}");') > + enum_values_doc = string.Template('''/** > + * \\var ${name}Values > + * \\brief List of all $name supported values > + */''') > + enum_values_start = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values = {''') > + enum_values_values = string.Template('''\tstatic_cast<int32_t>(${name}),''') > > ctrls_doc = [] > ctrls_def = [] > @@ -68,6 +74,7 @@ ${description} > enum_doc = [] > enum_doc.append(enum_doc_start_template.substitute(info)) > > + num_entries = 0; > for entry in enum: > value_info = { > 'name' : name, > @@ -75,11 +82,25 @@ ${description} > 'description': format_description(entry['description']), > } > enum_doc.append(enum_doc_value_template.substitute(value_info)) > + num_entries += 1 > > enum_doc = '\n *\n'.join(enum_doc) > enum_doc += '\n */' > target_doc.append(enum_doc) > > + values_info = { > + 'name' : info['name'], > + 'size' : num_entries, > + } > + target_doc.append(enum_values_doc.substitute(values_info)) > + target_def.append(enum_values_start.substitute(values_info)) > + for entry in enum: > + value_info = { > + 'name' : entry['name'] > + } > + target_def.append(enum_values_values.substitute(value_info)) > + target_def.append("};") > + > target_doc.append(doc_template.substitute(info)) > target_def.append(def_template.substitute(info)) > > @@ -100,6 +121,7 @@ ${description} > def generate_h(controls): > enum_template_start = string.Template('''enum ${name}Enum {''') > enum_value_template = string.Template('''\t${name} = ${value},''') > + enum_values_template = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values;''') > template = string.Template('''extern const Control<${type}> ${name};''') > > ctrls = [] > @@ -132,14 +154,22 @@ def generate_h(controls): > if enum: > target_ctrls.append(enum_template_start.substitute(info)) > > + num_entries = 0 > for entry in enum: > value_info = { > 'name': entry['name'], > 'value': entry['value'], > } > target_ctrls.append(enum_value_template.substitute(value_info)) > + num_entries += 1 > target_ctrls.append("};") > > + values_info = { > + 'name' : info['name'], > + 'size' : num_entries, > + } > + target_ctrls.append(enum_values_template.substitute(values_info)) > + > target_ctrls.append(template.substitute(info)) > id_value += 1 >
Hi Jacopo, On Sat, Oct 24, 2020 at 01:05:49AM +0300, Laurent Pinchart wrote: > On Fri, Oct 23, 2020 at 07:11:09PM +0200, Jacopo Mondi wrote: > > For each Control that support enumerated values generate a vector > > s/support/supports/ > s/a vector/an array/ > > > of ControlValues which contains the full list of values. > > > > At the expense of a slight increase in memory occupation this change > > allows the construction of the ControlInfo associated with a Control > > from the values list, defaulting the minimum and maximum values > > reported by the ControlInfo. > > > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> I've just noticed that checkstyle.py reports a few warnings. Could you address them ? > If anyone is looking for a newbies task, converting the controls and > properties templates to jinja is a good candidate, I think it will > simplify the scripts and make them easier to maintain. > > > --- > > include/libcamera/control_ids.h.in | 1 + > > src/libcamera/control_ids.cpp.in | 1 + > > utils/gen-controls.py | 30 ++++++++++++++++++++++++++++++ > > 3 files changed, 32 insertions(+) > > > > diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in > > index baadca83b103..7edeb6b65e32 100644 > > --- a/include/libcamera/control_ids.h.in > > +++ b/include/libcamera/control_ids.h.in > > @@ -10,6 +10,7 @@ > > #ifndef __LIBCAMERA_CONTROL_IDS_H__ > > #define __LIBCAMERA_CONTROL_IDS_H__ > > > > +#include <array> > > #include <stdint.h> > > > > #include <libcamera/controls.h> > > diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in > > index 056645cfbdfb..5fb1c2c30558 100644 > > --- a/src/libcamera/control_ids.cpp.in > > +++ b/src/libcamera/control_ids.cpp.in > > @@ -8,6 +8,7 @@ > > */ > > > > #include <libcamera/control_ids.h> > > +#include <libcamera/controls.h> > > > > /** > > * \file control_ids.h > > diff --git a/utils/gen-controls.py b/utils/gen-controls.py > > index bf681503f86a..a0bd43fabc31 100755 > > --- a/utils/gen-controls.py > > +++ b/utils/gen-controls.py > > @@ -33,6 +33,12 @@ ${description}''') > > ${description} > > */''') > > def_template = string.Template('extern const Control<${type}> ${name}(${id_name}, "${name}");') > > + enum_values_doc = string.Template('''/** > > + * \\var ${name}Values > > + * \\brief List of all $name supported values > > + */''') > > + enum_values_start = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values = {''') > > + enum_values_values = string.Template('''\tstatic_cast<int32_t>(${name}),''') > > > > ctrls_doc = [] > > ctrls_def = [] > > @@ -68,6 +74,7 @@ ${description} > > enum_doc = [] > > enum_doc.append(enum_doc_start_template.substitute(info)) > > > > + num_entries = 0; > > for entry in enum: > > value_info = { > > 'name' : name, > > @@ -75,11 +82,25 @@ ${description} > > 'description': format_description(entry['description']), > > } > > enum_doc.append(enum_doc_value_template.substitute(value_info)) > > + num_entries += 1 > > > > enum_doc = '\n *\n'.join(enum_doc) > > enum_doc += '\n */' > > target_doc.append(enum_doc) > > > > + values_info = { > > + 'name' : info['name'], > > + 'size' : num_entries, > > + } > > + target_doc.append(enum_values_doc.substitute(values_info)) > > + target_def.append(enum_values_start.substitute(values_info)) > > + for entry in enum: > > + value_info = { > > + 'name' : entry['name'] > > + } > > + target_def.append(enum_values_values.substitute(value_info)) > > + target_def.append("};") > > + > > target_doc.append(doc_template.substitute(info)) > > target_def.append(def_template.substitute(info)) > > > > @@ -100,6 +121,7 @@ ${description} > > def generate_h(controls): > > enum_template_start = string.Template('''enum ${name}Enum {''') > > enum_value_template = string.Template('''\t${name} = ${value},''') > > + enum_values_template = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values;''') > > template = string.Template('''extern const Control<${type}> ${name};''') > > > > ctrls = [] > > @@ -132,14 +154,22 @@ def generate_h(controls): > > if enum: > > target_ctrls.append(enum_template_start.substitute(info)) > > > > + num_entries = 0 > > for entry in enum: > > value_info = { > > 'name': entry['name'], > > 'value': entry['value'], > > } > > target_ctrls.append(enum_value_template.substitute(value_info)) > > + num_entries += 1 > > target_ctrls.append("};") > > > > + values_info = { > > + 'name' : info['name'], > > + 'size' : num_entries, > > + } > > + target_ctrls.append(enum_values_template.substitute(values_info)) > > + > > target_ctrls.append(template.substitute(info)) > > id_value += 1 > >
Hi Laurent, On Sun, Oct 25, 2020 at 01:39:14AM +0300, Laurent Pinchart wrote: > Hi Jacopo, > > On Sat, Oct 24, 2020 at 01:05:49AM +0300, Laurent Pinchart wrote: > > On Fri, Oct 23, 2020 at 07:11:09PM +0200, Jacopo Mondi wrote: > > > For each Control that support enumerated values generate a vector > > > > s/support/supports/ > > s/a vector/an array/ > > > > > of ControlValues which contains the full list of values. > > > > > > At the expense of a slight increase in memory occupation this change > > > allows the construction of the ControlInfo associated with a Control > > > from the values list, defaulting the minimum and maximum values > > > reported by the ControlInfo. > > > > > > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > > > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org> > > > > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > I've just noticed that checkstyle.py reports a few warnings. Could you > address them ? > Oh, I thought they all were false positives, but the style used to define dictionaries in the rest of the codebase actually has not ' ' before ':'. I'll fix, thanks for reporting it > > If anyone is looking for a newbies task, converting the controls and > > properties templates to jinja is a good candidate, I think it will > > simplify the scripts and make them easier to maintain. > > > > > --- > > > include/libcamera/control_ids.h.in | 1 + > > > src/libcamera/control_ids.cpp.in | 1 + > > > utils/gen-controls.py | 30 ++++++++++++++++++++++++++++++ > > > 3 files changed, 32 insertions(+) > > > > > > diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in > > > index baadca83b103..7edeb6b65e32 100644 > > > --- a/include/libcamera/control_ids.h.in > > > +++ b/include/libcamera/control_ids.h.in > > > @@ -10,6 +10,7 @@ > > > #ifndef __LIBCAMERA_CONTROL_IDS_H__ > > > #define __LIBCAMERA_CONTROL_IDS_H__ > > > > > > +#include <array> > > > #include <stdint.h> > > > > > > #include <libcamera/controls.h> > > > diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in > > > index 056645cfbdfb..5fb1c2c30558 100644 > > > --- a/src/libcamera/control_ids.cpp.in > > > +++ b/src/libcamera/control_ids.cpp.in > > > @@ -8,6 +8,7 @@ > > > */ > > > > > > #include <libcamera/control_ids.h> > > > +#include <libcamera/controls.h> > > > > > > /** > > > * \file control_ids.h > > > diff --git a/utils/gen-controls.py b/utils/gen-controls.py > > > index bf681503f86a..a0bd43fabc31 100755 > > > --- a/utils/gen-controls.py > > > +++ b/utils/gen-controls.py > > > @@ -33,6 +33,12 @@ ${description}''') > > > ${description} > > > */''') > > > def_template = string.Template('extern const Control<${type}> ${name}(${id_name}, "${name}");') > > > + enum_values_doc = string.Template('''/** > > > + * \\var ${name}Values > > > + * \\brief List of all $name supported values > > > + */''') > > > + enum_values_start = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values = {''') > > > + enum_values_values = string.Template('''\tstatic_cast<int32_t>(${name}),''') > > > > > > ctrls_doc = [] > > > ctrls_def = [] > > > @@ -68,6 +74,7 @@ ${description} > > > enum_doc = [] > > > enum_doc.append(enum_doc_start_template.substitute(info)) > > > > > > + num_entries = 0; > > > for entry in enum: > > > value_info = { > > > 'name' : name, > > > @@ -75,11 +82,25 @@ ${description} > > > 'description': format_description(entry['description']), > > > } > > > enum_doc.append(enum_doc_value_template.substitute(value_info)) > > > + num_entries += 1 > > > > > > enum_doc = '\n *\n'.join(enum_doc) > > > enum_doc += '\n */' > > > target_doc.append(enum_doc) > > > > > > + values_info = { > > > + 'name' : info['name'], > > > + 'size' : num_entries, > > > + } > > > + target_doc.append(enum_values_doc.substitute(values_info)) > > > + target_def.append(enum_values_start.substitute(values_info)) > > > + for entry in enum: > > > + value_info = { > > > + 'name' : entry['name'] > > > + } > > > + target_def.append(enum_values_values.substitute(value_info)) > > > + target_def.append("};") > > > + > > > target_doc.append(doc_template.substitute(info)) > > > target_def.append(def_template.substitute(info)) > > > > > > @@ -100,6 +121,7 @@ ${description} > > > def generate_h(controls): > > > enum_template_start = string.Template('''enum ${name}Enum {''') > > > enum_value_template = string.Template('''\t${name} = ${value},''') > > > + enum_values_template = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values;''') > > > template = string.Template('''extern const Control<${type}> ${name};''') > > > > > > ctrls = [] > > > @@ -132,14 +154,22 @@ def generate_h(controls): > > > if enum: > > > target_ctrls.append(enum_template_start.substitute(info)) > > > > > > + num_entries = 0 > > > for entry in enum: > > > value_info = { > > > 'name': entry['name'], > > > 'value': entry['value'], > > > } > > > target_ctrls.append(enum_value_template.substitute(value_info)) > > > + num_entries += 1 > > > target_ctrls.append("};") > > > > > > + values_info = { > > > + 'name' : info['name'], > > > + 'size' : num_entries, > > > + } > > > + target_ctrls.append(enum_values_template.substitute(values_info)) > > > + > > > target_ctrls.append(template.substitute(info)) > > > id_value += 1 > > > > > -- > Regards, > > Laurent Pinchart
diff --git a/include/libcamera/control_ids.h.in b/include/libcamera/control_ids.h.in index baadca83b103..7edeb6b65e32 100644 --- a/include/libcamera/control_ids.h.in +++ b/include/libcamera/control_ids.h.in @@ -10,6 +10,7 @@ #ifndef __LIBCAMERA_CONTROL_IDS_H__ #define __LIBCAMERA_CONTROL_IDS_H__ +#include <array> #include <stdint.h> #include <libcamera/controls.h> diff --git a/src/libcamera/control_ids.cpp.in b/src/libcamera/control_ids.cpp.in index 056645cfbdfb..5fb1c2c30558 100644 --- a/src/libcamera/control_ids.cpp.in +++ b/src/libcamera/control_ids.cpp.in @@ -8,6 +8,7 @@ */ #include <libcamera/control_ids.h> +#include <libcamera/controls.h> /** * \file control_ids.h diff --git a/utils/gen-controls.py b/utils/gen-controls.py index bf681503f86a..a0bd43fabc31 100755 --- a/utils/gen-controls.py +++ b/utils/gen-controls.py @@ -33,6 +33,12 @@ ${description}''') ${description} */''') def_template = string.Template('extern const Control<${type}> ${name}(${id_name}, "${name}");') + enum_values_doc = string.Template('''/** + * \\var ${name}Values + * \\brief List of all $name supported values + */''') + enum_values_start = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values = {''') + enum_values_values = string.Template('''\tstatic_cast<int32_t>(${name}),''') ctrls_doc = [] ctrls_def = [] @@ -68,6 +74,7 @@ ${description} enum_doc = [] enum_doc.append(enum_doc_start_template.substitute(info)) + num_entries = 0; for entry in enum: value_info = { 'name' : name, @@ -75,11 +82,25 @@ ${description} 'description': format_description(entry['description']), } enum_doc.append(enum_doc_value_template.substitute(value_info)) + num_entries += 1 enum_doc = '\n *\n'.join(enum_doc) enum_doc += '\n */' target_doc.append(enum_doc) + values_info = { + 'name' : info['name'], + 'size' : num_entries, + } + target_doc.append(enum_values_doc.substitute(values_info)) + target_def.append(enum_values_start.substitute(values_info)) + for entry in enum: + value_info = { + 'name' : entry['name'] + } + target_def.append(enum_values_values.substitute(value_info)) + target_def.append("};") + target_doc.append(doc_template.substitute(info)) target_def.append(def_template.substitute(info)) @@ -100,6 +121,7 @@ ${description} def generate_h(controls): enum_template_start = string.Template('''enum ${name}Enum {''') enum_value_template = string.Template('''\t${name} = ${value},''') + enum_values_template = string.Template('''extern const std::array<const ControlValue, ${size}> ${name}Values;''') template = string.Template('''extern const Control<${type}> ${name};''') ctrls = [] @@ -132,14 +154,22 @@ def generate_h(controls): if enum: target_ctrls.append(enum_template_start.substitute(info)) + num_entries = 0 for entry in enum: value_info = { 'name': entry['name'], 'value': entry['value'], } target_ctrls.append(enum_value_template.substitute(value_info)) + num_entries += 1 target_ctrls.append("};") + values_info = { + 'name' : info['name'], + 'size' : num_entries, + } + target_ctrls.append(enum_values_template.substitute(values_info)) + target_ctrls.append(template.substitute(info)) id_value += 1