[{"id":23183,"web_url":"https://patchwork.libcamera.org/comment/23183/","msgid":"<YpCGObHCltvmpyNN@pendragon.ideasonboard.com>","date":"2022-05-27T08:05:13","subject":"Re: [libcamera-devel] [PATCH v2 15/19] py: Re-implement controls\n\tgeneneration","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Tomi,\n\nThank you for the patch.\n\nOn Tue, May 24, 2022 at 02:46:06PM +0300, Tomi Valkeinen wrote:\n> The Python bindings controls generation was not very good. It only\n> covered the enums and they were in the main namespace.\n> \n> This adds the controls somewhat similarly to the C++ side. We will have\n> e.g.:\n> \n> libcamera.controls.Brightness\n> libcamera.controls.AeMeteringModeEnum.CentreWeighted\n> \n> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> ---\n>  ...py-control-enums.py => gen-py-controls.py} | 20 +++++++++++--------\n>  src/py/libcamera/meson.build                  | 16 +++++++++------\n>  ...ed.cpp.in => py_controls_generated.cpp.in} | 17 +++++++++++++---\n>  src/py/libcamera/py_main.cpp                  |  4 ++--\n>  4 files changed, 38 insertions(+), 19 deletions(-)\n>  rename src/py/libcamera/{gen-py-control-enums.py => gen-py-controls.py} (85%)\n>  rename src/py/libcamera/{py_control_enums_generated.cpp.in => py_controls_generated.cpp.in} (50%)\n> \n> diff --git a/src/py/libcamera/gen-py-control-enums.py b/src/py/libcamera/gen-py-controls.py\n> similarity index 85%\n> rename from src/py/libcamera/gen-py-control-enums.py\n> rename to src/py/libcamera/gen-py-controls.py\n> index 6b2b5362..e3e1e178 100755\n> --- a/src/py/libcamera/gen-py-control-enums.py\n> +++ b/src/py/libcamera/gen-py-controls.py\n> @@ -1,7 +1,7 @@\n>  #!/usr/bin/env python3\n>  # SPDX-License-Identifier: GPL-2.0-or-later\n>  #\n> -# Generate Python bindings enums for controls from YAML\n> +# Generate Python bindings controls from YAML\n>  \n>  import argparse\n>  import string\n> @@ -27,18 +27,22 @@ def generate_py(controls):\n>      for ctrl in controls:\n>          name, ctrl = ctrl.popitem()\n>  \n> -        enum = ctrl.get('enum')\n> -        if not enum:\n> -            continue\n> -\n>          if ctrl.get('draft'):\n>              ns = 'libcamera::controls::draft::'\n> +            container = \"draft\"\n>          else:\n>              ns = 'libcamera::controls::'\n> +            container = \"controls\"\n>  \n>          cpp_enum = name + 'Enum'\n\nI'd move this line after the enum check below.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n>  \n> -        out += '\\tpy::enum_<{}{}>(m, \\\"{}\\\")\\n'.format(ns, cpp_enum, name)\n> +        out += f'\\t{container}.def_readonly_static(\"{name}\", static_cast<const libcamera::ControlId *>(&{ns}{name}));\\n\\n'\n> +\n> +        enum = ctrl.get('enum')\n> +        if not enum:\n> +            continue\n> +\n> +        out += '\\tpy::enum_<{}{}>({}, \\\"{}\\\")\\n'.format(ns, cpp_enum, container, cpp_enum)\n>  \n>          if name == 'LensShadingMapMode':\n>              prefix = 'LensShadingMapMode'\n> @@ -54,9 +58,9 @@ def generate_py(controls):\n>  \n>              out += '\\t\\t.value(\\\"{}\\\", {}{})\\n'.format(py_enum, ns, cpp_enum)\n>  \n> -        out += '\\t;\\n'\n> +        out += '\\t;\\n\\n'\n>  \n> -    return {'enums': out}\n> +    return {'controls': out}\n>  \n>  \n>  def fill_template(template, data):\n> diff --git a/src/py/libcamera/meson.build b/src/py/libcamera/meson.build\n> index b705ac1f..e8010846 100644\n> --- a/src/py/libcamera/meson.build\n> +++ b/src/py/libcamera/meson.build\n> @@ -18,17 +18,21 @@ pycamera_sources = files([\n>      'py_main.cpp',\n>  ])\n>  \n> -gen_py_control_enums_input_files = files([\n> +# Generate controls\n> +\n> +gen_py_controls_input_files = files([\n>      '../../libcamera/control_ids.yaml',\n> -    'py_control_enums_generated.cpp.in',\n> +    'py_controls_generated.cpp.in',\n>  ])\n>  \n> -gen_py_control_enums = files('gen-py-control-enums.py')\n> +gen_py_controls = files('gen-py-controls.py')\n>  \n>  pycamera_sources += custom_target('py_gen_controls',\n> -                                  input : gen_py_control_enums_input_files,\n> -                                  output : ['py_control_enums_generated.cpp'],\n> -                                  command : [gen_py_control_enums, '-o', '@OUTPUT@', '@INPUT@'])\n> +                                  input : gen_py_controls_input_files,\n> +                                  output : ['py_controls_generated.cpp'],\n> +                                  command : [gen_py_controls, '-o', '@OUTPUT@', '@INPUT@'])\n> +\n> +# Generate formats\n>  \n>  gen_py_formats_input_files = files([\n>      '../../libcamera/formats.yaml',\n> diff --git a/src/py/libcamera/py_control_enums_generated.cpp.in b/src/py/libcamera/py_controls_generated.cpp.in\n> similarity index 50%\n> rename from src/py/libcamera/py_control_enums_generated.cpp.in\n> rename to src/py/libcamera/py_controls_generated.cpp.in\n> index ed81fbe7..cb8442ba 100644\n> --- a/src/py/libcamera/py_control_enums_generated.cpp.in\n> +++ b/src/py/libcamera/py_controls_generated.cpp.in\n> @@ -2,7 +2,7 @@\n>  /*\n>   * Copyright (C) 2022, Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>   *\n> - * Python bindings - Auto-generated control enums\n> + * Python bindings - Auto-generated controls\n>   *\n>   * This file is auto-generated. Do not edit.\n>   */\n> @@ -13,7 +13,18 @@\n>  \n>  namespace py = pybind11;\n>  \n> -void init_py_control_enums_generated(py::module& m)\n> +class PyControls\n>  {\n> -${enums}\n> +};\n> +\n> +class PyDraftControls\n> +{\n> +};\n> +\n> +void init_py_controls_generated(py::module& m)\n> +{\n> +\tauto controls = py::class_<PyControls>(m, \"controls\");\n> +\tauto draft = py::class_<PyDraftControls>(controls, \"draft\");\n> +\n> +${controls}\n>  }\n> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp\n> index 5d389942..33ecc1cd 100644\n> --- a/src/py/libcamera/py_main.cpp\n> +++ b/src/py/libcamera/py_main.cpp\n> @@ -131,14 +131,14 @@ static void handleRequestCompleted(Request *req)\n>  }\n>  \n>  void init_py_enums(py::module &m);\n> -void init_py_control_enums_generated(py::module &m);\n> +void init_py_controls_generated(py::module &m);\n>  void init_py_formats_generated(py::module &m);\n>  void init_py_geometry(py::module &m);\n>  \n>  PYBIND11_MODULE(_libcamera, m)\n>  {\n>  \tinit_py_enums(m);\n> -\tinit_py_control_enums_generated(m);\n> +\tinit_py_controls_generated(m);\n>  \tinit_py_geometry(m);\n>  \n>  \t/* Forward declarations */","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 98282BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 27 May 2022 08:05:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DB5EB633A1;\n\tFri, 27 May 2022 10:05:20 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 85BF960415\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 May 2022 10:05:19 +0200 (CEST)","from pendragon.ideasonboard.com (ip-109-40-242-63.web.vodafone.de\n\t[109.40.242.63])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id B662C31A;\n\tFri, 27 May 2022 10:05:18 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1653638720;\n\tbh=8NKYeNBYt+N2wWZWmeheG9wufwjm7ZTN6eyXgvNKNxA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=OzpG7mP9kFaS7GlHFdIeh5s/O8A3zIxG1EuH+vzRzZ8qxZ2dFMg1aPfN0Zfgopu4a\n\tQibul5f/sSaG4S6PfCddOA1KPJJpsGxWMcSnCmc9i345cE9Jtme9aTVcuJHCGtNiHN\n\tYuoqqr9fbSGILriOefwkscaQbM/mlbwbPlLXuFD3CHuxKopeo6NTvJm3GWgmkXaqX4\n\twwHTZjSvm8p0a6ioXpX3LaAY4HTT5oGkYmrHbtpyUaTjbH5efSbY1X6XAPhibCgYqQ\n\tnmFxnWbY2zqbAZz4AgsH5xJ+F3DtaC2xFaMojyuT5vK4TJKa3bH1jHk38zQ4zjag7L\n\tjdFhOPQ90fT5A==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1653638719;\n\tbh=8NKYeNBYt+N2wWZWmeheG9wufwjm7ZTN6eyXgvNKNxA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=d4QGk1byMzaMjR5h07VDO5KDYQilNyLQ7jy5Y6gO8LeUT5JssPvkKb4Oggxw8ZN+7\n\tdzB41JI9Cyc2oiKFpuLFkAfcEKccENKcxW76iPR9DI5ZZz/GK5h33tZWZpX6+D3yek\n\tE772ep7q97Ko35tz/x3FTlEoOqirb7I5ZepN/aZM="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"d4QGk1by\"; dkim-atps=neutral","Date":"Fri, 27 May 2022 11:05:13 +0300","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Message-ID":"<YpCGObHCltvmpyNN@pendragon.ideasonboard.com>","References":"<20220524114610.41848-1-tomi.valkeinen@ideasonboard.com>\n\t<20220524114610.41848-16-tomi.valkeinen@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220524114610.41848-16-tomi.valkeinen@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 15/19] py: Re-implement controls\n\tgeneneration","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23189,"web_url":"https://patchwork.libcamera.org/comment/23189/","msgid":"<939e8df1-9531-9c12-c073-811d8a7de3ad@ideasonboard.com>","date":"2022-05-27T10:10:26","subject":"Re: [libcamera-devel] [PATCH v2 15/19] py: Re-implement controls\n\tgeneneration","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"On 27/05/2022 11:05, Laurent Pinchart wrote:\n> Hi Tomi,\n> \n> Thank you for the patch.\n> \n> On Tue, May 24, 2022 at 02:46:06PM +0300, Tomi Valkeinen wrote:\n>> The Python bindings controls generation was not very good. It only\n>> covered the enums and they were in the main namespace.\n>>\n>> This adds the controls somewhat similarly to the C++ side. We will have\n>> e.g.:\n>>\n>> libcamera.controls.Brightness\n>> libcamera.controls.AeMeteringModeEnum.CentreWeighted\n>>\n>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>> ---\n>>   ...py-control-enums.py => gen-py-controls.py} | 20 +++++++++++--------\n>>   src/py/libcamera/meson.build                  | 16 +++++++++------\n>>   ...ed.cpp.in => py_controls_generated.cpp.in} | 17 +++++++++++++---\n>>   src/py/libcamera/py_main.cpp                  |  4 ++--\n>>   4 files changed, 38 insertions(+), 19 deletions(-)\n>>   rename src/py/libcamera/{gen-py-control-enums.py => gen-py-controls.py} (85%)\n>>   rename src/py/libcamera/{py_control_enums_generated.cpp.in => py_controls_generated.cpp.in} (50%)\n>>\n>> diff --git a/src/py/libcamera/gen-py-control-enums.py b/src/py/libcamera/gen-py-controls.py\n>> similarity index 85%\n>> rename from src/py/libcamera/gen-py-control-enums.py\n>> rename to src/py/libcamera/gen-py-controls.py\n>> index 6b2b5362..e3e1e178 100755\n>> --- a/src/py/libcamera/gen-py-control-enums.py\n>> +++ b/src/py/libcamera/gen-py-controls.py\n>> @@ -1,7 +1,7 @@\n>>   #!/usr/bin/env python3\n>>   # SPDX-License-Identifier: GPL-2.0-or-later\n>>   #\n>> -# Generate Python bindings enums for controls from YAML\n>> +# Generate Python bindings controls from YAML\n>>   \n>>   import argparse\n>>   import string\n>> @@ -27,18 +27,22 @@ def generate_py(controls):\n>>       for ctrl in controls:\n>>           name, ctrl = ctrl.popitem()\n>>   \n>> -        enum = ctrl.get('enum')\n>> -        if not enum:\n>> -            continue\n>> -\n>>           if ctrl.get('draft'):\n>>               ns = 'libcamera::controls::draft::'\n>> +            container = \"draft\"\n>>           else:\n>>               ns = 'libcamera::controls::'\n>> +            container = \"controls\"\n>>   \n>>           cpp_enum = name + 'Enum'\n> \n> I'd move this line after the enum check below.\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nThanks, makes sense.\n\n  Tomi","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 269F6BD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 27 May 2022 10:10:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7E622633A5;\n\tFri, 27 May 2022 12:10:32 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 08B35633A2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 May 2022 12:10:30 +0200 (CEST)","from [192.168.1.111] (91-156-85-209.elisa-laajakaista.fi\n\t[91.156.85.209])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C291931A;\n\tFri, 27 May 2022 12:10:29 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1653646232;\n\tbh=dm1ohM9YvE6TQ1Dl6/RLWUQ9OHYstNSCrm8GvF32wUQ=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=QHxjZaYHE76H18yQF+jle5+TDm3xhYVOrm2rxLmRYeHO3grnEXkJlbrDck4CJ7qDZ\n\tNDj2Cgc7et/W1zETtkkyT7Es3FO06b8rG/EGGtJy3Pc7EmRcQHCtehwIXYhFSIgL11\n\t6PVwXLHrS+rwfKUoZs80ML3tsl3vQ2dKrlrRWHk7ubu+1GmTw79TdqFV+c75J2g4BQ\n\tf/A5sFq1rXjxy93qCzbkxbWn88Mye6M+OmM64IY/Z39EaKCjPX7YjVrBEUFu5ts4IV\n\tGjHUvTZFhWjFtrZ4BT9I5DYhfeCFvdTygsuVfTmNIJromnYe2//MP2W2iX3JiihyBk\n\toapkQ8/MOLhIw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1653646230;\n\tbh=dm1ohM9YvE6TQ1Dl6/RLWUQ9OHYstNSCrm8GvF32wUQ=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=aLd46dMbtsSJGCPwHR1q1tW3N6jehjGQGQ087VlFkM6yEDzLy7erPAQZlvztm0ic7\n\t/BCOClnJlhaknXCEVWsPUxfRIVATscaKE3QkxMGIgltpY+I3VQJYVykP2rMAcIuOUZ\n\tTXzftfFQoLvxPYL/17eFd5XUM3uqw9NBxEyw1kks="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"aLd46dMb\"; dkim-atps=neutral","Message-ID":"<939e8df1-9531-9c12-c073-811d8a7de3ad@ideasonboard.com>","Date":"Fri, 27 May 2022 13:10:26 +0300","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101\n\tThunderbird/91.9.1","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20220524114610.41848-1-tomi.valkeinen@ideasonboard.com>\n\t<20220524114610.41848-16-tomi.valkeinen@ideasonboard.com>\n\t<YpCGObHCltvmpyNN@pendragon.ideasonboard.com>","In-Reply-To":"<YpCGObHCltvmpyNN@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v2 15/19] py: Re-implement controls\n\tgeneneration","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","From":"Tomi Valkeinen via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]