[{"id":26635,"web_url":"https://patchwork.libcamera.org/comment/26635/","msgid":"<20230312151704.GU2545@pendragon.ideasonboard.com>","date":"2023-03-12T15:17:04","subject":"Re: [libcamera-devel] [PATCH v4 03/15] py: cam.py: Use new events\n\tsupport","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 Thu, Mar 09, 2023 at 04:25:49PM +0200, Tomi Valkeinen via libcamera-devel wrote:\n> Convert cam.py to use the new event dispatching. In addition to handling\n> the request-completed event, handle also disconnect, camera-added and\n> camera-removed events (which only do a simple print).\n> \n> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/py/cam/cam.py | 28 ++++++++++++++++++++++------\n>  1 file changed, 22 insertions(+), 6 deletions(-)\n> \n> diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py\n> index a2a115c1..0b464256 100755\n> --- a/src/py/cam/cam.py\n> +++ b/src/py/cam/cam.py\n> @@ -230,11 +230,20 @@ class CaptureState:\n>      # Called from renderer when there is a libcamera event\n>      def event_handler(self):\n>          try:\n> -            reqs = self.cm.get_ready_requests()\n> -\n> -            for req in reqs:\n> -                ctx = next(ctx for ctx in self.contexts if ctx.idx == req.cookie)\n> -                self.__request_handler(ctx, req)\n> +            evs = self.cm.get_events()\n> +            for ev in evs:\n\nYou could write\n\n            for ev in self.cm.get_events()\n\nup to you.\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +                type = ev.type\n> +\n> +                if type == libcam.Event.Type.CameraAdded:\n> +                    print('Camera added:', ev.camera)\n> +                elif type == libcam.Event.Type.CameraRemoved:\n> +                    print('Camera removed:', ev.camera)\n> +                elif type == libcam.Event.Type.Disconnect:\n> +                    print(f'Camera {ev.camera} disconnected')\n> +                elif type == libcam.Event.Type.RequestCompleted:\n> +                    self.__request_handler(ev.camera, ev.request)\n> +                else:\n> +                    raise RuntimeError(\"Bad event type\")\n>  \n>              running = any(ctx.reqs_completed < ctx.opt_capture for ctx in self.contexts)\n>              return running\n> @@ -242,7 +251,9 @@ class CaptureState:\n>              traceback.print_exc()\n>              return False\n>  \n> -    def __request_handler(self, ctx, req):\n> +    def __request_handler(self, cam, req):\n> +        ctx = next(ctx for ctx in self.contexts if ctx.camera == cam)\n> +\n>          if req.status != libcam.Request.Status.Complete:\n>              raise Exception('{}: Request failed: {}'.format(ctx.id, req.status))\n>  \n> @@ -447,6 +458,11 @@ def main():\n>  \n>          state.do_cmd_capture()\n>  \n> +        # This is not strictly needed, but it helps to do a proper cleanup as we\n> +        # drop any unhandled events, and so makes it easier to use memory leak\n> +        # detectors.\n> +        cm.get_events()\n> +\n>      return 0\n>  \n>","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 F3F5BBD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 12 Mar 2023 15:17:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 583E462707;\n\tSun, 12 Mar 2023 16:17:05 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E135A62705\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 12 Mar 2023 16:17:03 +0100 (CET)","from pendragon.ideasonboard.com (85-76-21-162-nat.elisa-mobile.fi\n\t[85.76.21.162])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id E9959814;\n\tSun, 12 Mar 2023 16:17:02 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1678634225;\n\tbh=sFec4w0gzAFhx88Mmv74AX/ZpidJEqto1Xdb5c19kZQ=;\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=mgvOn4yLJMgBFd3n8JrmTykfgXwA1Ob/IgQY13MivZMTwYc5x7lXQAO+7e3xMJJ8u\n\tY3sjhEc57qxaqu9vW9Bc1aakg+EBcpMB7BmFC3/SzZgZDhKsjmDejm86E9iRTurh4P\n\tAscOnFilnm+vmykkH+zhkJG6DUdXBKxJFEVmDqo4gi+OjogCKuJi4WyX+35r67YGln\n\tWGEzW35hXmXuGt9wwHPyrn9upP2ye81QG4aEkKDGOKs0un3g3sRaYJ3HLvhKK0KP9j\n\tEUNuaQdKbPJC9cwQCXRZXWWYBRbQFjeu7ShOfSy6TdRTtgg6phxQhFISHKUMN1BDRL\n\tyCTqZTdp85nLw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1678634223;\n\tbh=sFec4w0gzAFhx88Mmv74AX/ZpidJEqto1Xdb5c19kZQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GwN3fGeTLnk++MvoWMhYyktGfx0kohvvftH0VLS3SUr6i70p1EwMorImGFNhDs+o/\n\tSoO2rqu25MIY6LGpUSXOHR9cTDBLJGxxd74mh0qR7hg5iBHhKzX49vrUKOZEM8a/bM\n\tNxkWpIO4e40Hy/TYSQzHYVnAaBqvgM5oaCmSOb7Y="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"GwN3fGeT\"; dkim-atps=neutral","Date":"Sun, 12 Mar 2023 17:17:04 +0200","To":"Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>","Message-ID":"<20230312151704.GU2545@pendragon.ideasonboard.com>","References":"<20230309142601.70556-1-tomi.valkeinen@ideasonboard.com>\n\t<20230309142601.70556-4-tomi.valkeinen@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20230309142601.70556-4-tomi.valkeinen@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 03/15] py: cam.py: Use new events\n\tsupport","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":26645,"web_url":"https://patchwork.libcamera.org/comment/26645/","msgid":"<15ba398c-1b84-e435-17f3-63cbf24d2dad@ideasonboard.com>","date":"2023-03-13T06:56:00","subject":"Re: [libcamera-devel] [PATCH v4 03/15] py: cam.py: Use new events\n\tsupport","submitter":{"id":109,"url":"https://patchwork.libcamera.org/api/people/109/","name":"Tomi Valkeinen","email":"tomi.valkeinen@ideasonboard.com"},"content":"On 12/03/2023 17:17, Laurent Pinchart wrote:\n> Hi Tomi,\n> \n> Thank you for the patch.\n> \n> On Thu, Mar 09, 2023 at 04:25:49PM +0200, Tomi Valkeinen via libcamera-devel wrote:\n>> Convert cam.py to use the new event dispatching. In addition to handling\n>> the request-completed event, handle also disconnect, camera-added and\n>> camera-removed events (which only do a simple print).\n>>\n>> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>\n>> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n>> ---\n>>   src/py/cam/cam.py | 28 ++++++++++++++++++++++------\n>>   1 file changed, 22 insertions(+), 6 deletions(-)\n>>\n>> diff --git a/src/py/cam/cam.py b/src/py/cam/cam.py\n>> index a2a115c1..0b464256 100755\n>> --- a/src/py/cam/cam.py\n>> +++ b/src/py/cam/cam.py\n>> @@ -230,11 +230,20 @@ class CaptureState:\n>>       # Called from renderer when there is a libcamera event\n>>       def event_handler(self):\n>>           try:\n>> -            reqs = self.cm.get_ready_requests()\n>> -\n>> -            for req in reqs:\n>> -                ctx = next(ctx for ctx in self.contexts if ctx.idx == req.cookie)\n>> -                self.__request_handler(ctx, req)\n>> +            evs = self.cm.get_events()\n>> +            for ev in evs:\n> \n> You could write\n> \n>              for ev in self.cm.get_events()\n> \n> up to you.\n\nYes, that's a bit neater.\n\nAlso, I noticed the prints below are annoyingly using different \nstyles... I'll use the inline style for all of them.\n\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n>> +                type = ev.type\n>> +\n>> +                if type == libcam.Event.Type.CameraAdded:\n>> +                    print('Camera added:', ev.camera)\n>> +                elif type == libcam.Event.Type.CameraRemoved:\n>> +                    print('Camera removed:', ev.camera)\n>> +                elif type == libcam.Event.Type.Disconnect:\n>> +                    print(f'Camera {ev.camera} disconnected')\n>> +                elif type == libcam.Event.Type.RequestCompleted:\n>> +                    self.__request_handler(ev.camera, ev.request)\n>> +                else:\n>> +                    raise RuntimeError(\"Bad event type\")\n>>   \n>>               running = any(ctx.reqs_completed < ctx.opt_capture for ctx in self.contexts)\n>>               return running\n>> @@ -242,7 +251,9 @@ class CaptureState:\n>>               traceback.print_exc()\n>>               return False\n>>   \n>> -    def __request_handler(self, ctx, req):\n>> +    def __request_handler(self, cam, req):\n>> +        ctx = next(ctx for ctx in self.contexts if ctx.camera == cam)\n>> +\n>>           if req.status != libcam.Request.Status.Complete:\n>>               raise Exception('{}: Request failed: {}'.format(ctx.id, req.status))\n>>   \n>> @@ -447,6 +458,11 @@ def main():\n>>   \n>>           state.do_cmd_capture()\n>>   \n>> +        # This is not strictly needed, but it helps to do a proper cleanup as we\n>> +        # drop any unhandled events, and so makes it easier to use memory leak\n>> +        # detectors.\n>> +        cm.get_events()\n>> +\n>>       return 0\n>>   \n>>   \n>","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 97A5CBD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 13 Mar 2023 06:56:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2A8462707;\n\tMon, 13 Mar 2023 07:56:04 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5DF0B62706\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 13 Mar 2023 07:56:03 +0100 (CET)","from [192.168.1.15] (91-154-32-225.elisa-laajakaista.fi\n\t[91.154.32.225])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DC131563;\n\tMon, 13 Mar 2023 07:56:02 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1678690564;\n\tbh=o9KE1aGXQ3sxHuVy7McCP+YwwNHvVVKqO7oOcWYqN+U=;\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=KRrkWUmrSde5vH2ozktqSm6Na+3WwALxlanNPdPpFvHRwwyhTBlzHal7GQffdwR5Q\n\tBjuXUvp55e9Hrg/E1Lj21NqLKOsVZZXx4J6savn55elOnClKgnSAnCoAYlxbzQmoDg\n\tFgqaeoD4uf545VcAIO77eQdgzHSh5NAJEKf20QwB7EyPUMB80kNR0ZpGA1FYe5xUEd\n\t5A09kj57/UssBTk/aCc0iEbKONJcfTUDY4avo7CQhjyOBxWb3NEFZTyEzHP4uL+9ON\n\tP0+XFWv0x2JQ1Wv+EKS4tbSvMX5SrsRhz8R8J2XTBxBTi4w2A4MAwlvRYDauMKtw4Y\n\tef/tK6Wl6SxKA==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1678690563;\n\tbh=o9KE1aGXQ3sxHuVy7McCP+YwwNHvVVKqO7oOcWYqN+U=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=t67du6/ERtQHhQ7NeUIJfk7RKhuWDuz21D0XlkYnSZqein4qCYndWO+q6NPGoKDkF\n\t2w3I/WodUoGX5VR8I+1XQLehrDgZJM+Z+krR6oR+CJhIc3EguCr/+2tooq21OKTgW1\n\ty0Vjcl3Tlk0yukPK9a4A+SjUQggD5OVMslQZemvg="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"t67du6/E\"; dkim-atps=neutral","Message-ID":"<15ba398c-1b84-e435-17f3-63cbf24d2dad@ideasonboard.com>","Date":"Mon, 13 Mar 2023 08:56:00 +0200","MIME-Version":"1.0","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101\n\tThunderbird/102.7.1","Content-Language":"en-US","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","References":"<20230309142601.70556-1-tomi.valkeinen@ideasonboard.com>\n\t<20230309142601.70556-4-tomi.valkeinen@ideasonboard.com>\n\t<20230312151704.GU2545@pendragon.ideasonboard.com>","In-Reply-To":"<20230312151704.GU2545@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"7bit","Subject":"Re: [libcamera-devel] [PATCH v4 03/15] py: cam.py: Use new events\n\tsupport","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>"}}]