From 70051fcac29eda403a595c6db1137f23dfcc155f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= <ahcorde@gmail.com>
Date: Tue, 6 Feb 2024 23:46:13 +0100
Subject: [PATCH] Fixed crashes
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Alejandro Hernández Cordero <ahcorde@gmail.com>
---
 src/rqt_gauges/speedometer_gauge.py           | 18 +++++++++++----
 src/rqt_gauges/speedometer_widget.py          | 11 ++++++---
 src/rqt_gauges/steering_wheel_gauge.py        |  4 +++-
 src/rqt_gauges/steering_wheel_widget.py       | 11 ++++++---
 .../throttle_brake_pedals_widget.py           | 23 +++++++++++++++----
 5 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/src/rqt_gauges/speedometer_gauge.py b/src/rqt_gauges/speedometer_gauge.py
index c860587..00914b2 100644
--- a/src/rqt_gauges/speedometer_gauge.py
+++ b/src/rqt_gauges/speedometer_gauge.py
@@ -1,6 +1,6 @@
 import math
 
-from PyQt5.QtCore import QObject, QPoint, QPointF, Qt
+from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QPoint, QPointF, Qt
 from PyQt5.QtGui import (QColor, QConicalGradient, QFont, QFontMetrics, QPainter, QPen,
                          QPolygon, QPolygonF, QRadialGradient)
 from PyQt5.QtWidgets import QWidget
@@ -13,6 +13,8 @@ class SpeedometerGauge(QWidget):
     # gauge and the units the numbers are displaying. The class contains methods used to modify
     # the values explained before, the marked number of the gauge and the whole design as well.
 
+    updateValueSignal = pyqtSignal(float)
+
     def __init__(self, parent=None):
         # Constructor method of the class, initializes all the variables needed to create
         # the gauge.
@@ -80,9 +82,9 @@ def __init__(self, parent=None):
         self.gauge_color_outer_radius_factor = 1
         self.gauge_color_inner_radius_factor = 0.9
 
-        self.update()
+        # self.update()
         self.setGaugeTheme()
-        self.rescale_method()
+        # self.rescale_method()
 
     def setGaugeTheme(self):
         # This method defines the theme of the gauge, it is used to stablish the colors for each
@@ -227,6 +229,7 @@ def draw_filled_polygon(self, outline_pen_with=0):
         painter_filled_polygon.setBrush(grad)
 
         painter_filled_polygon.drawPolygon(colored_scale_polygon)
+        painter_filled_polygon.end()
 
     def draw_big_scaled_marker(self):
         my_painter = QPainter(self)
@@ -245,6 +248,7 @@ def draw_big_scaled_marker(self):
         for i in range(self.scalaCount+1):
             my_painter.drawLine(int(scale_line_lenght), 0, int(scale_line_outer_start), 0)
             my_painter.rotate(steps_size)
+        my_painter.end()
 
     def create_scale_marker_values_text(self):
         painter = QPainter(self)
@@ -275,6 +279,7 @@ def create_scale_marker_values_text(self):
 
             text = [x - int(w/2), y - int(h/2), int(w), int(h), Qt.AlignCenter, text]
             painter.drawText(text[0], text[1], text[2], text[3], text[4], text[5])
+        painter.end()
 
     def create_fine_scaled_marker(self):
         my_painter = QPainter(self)
@@ -290,6 +295,7 @@ def create_fine_scaled_marker(self):
         for i in range((self.scalaCount * self.scala_subdiv_count)+1):
             my_painter.drawLine(int(scale_line_lenght), 0, int(scale_line_outer_start), 0)
             my_painter.rotate(steps_size)
+        my_painter.end()
 
     def create_value_text(self):
         painter = QPainter(self)
@@ -317,6 +323,7 @@ def create_value_text(self):
         y = int(text_radius * math.sin(math.radians(angle)))
         text = [x - int(w/2), y - int(h/2), int(w), int(h), Qt.AlignCenter, text]
         painter.drawText(text[0], text[1], text[2], text[3], text[4], text[5])
+        painter.end()
 
     def create_units_text(self):
         painter = QPainter(self)
@@ -345,6 +352,7 @@ def create_units_text(self):
         y = int(text_radius * math.sin(math.radians(angle)))
         text = [x - int(w/2), y - int(h/2), int(w), int(h), Qt.AlignCenter, text]
         painter.drawText(text[0], text[1], text[2], text[3], text[4], text[5])
+        painter.end()
 
     def draw_big_needle_center_point(self):
         painter = QPainter(self)
@@ -363,6 +371,7 @@ def draw_big_needle_center_point(self):
         painter.setBrush(grad)
 
         painter.drawPolygon(colored_scale_polygon)
+        painter.end()
 
     def draw_outer_circle(self):
         painter = QPainter(self)
@@ -381,6 +390,7 @@ def draw_outer_circle(self):
         painter.setBrush(radialGradient)
 
         painter.drawPolygon(colored_scale_polygon)
+        painter.end()
 
     def draw_needle(self):
         painter = QPainter(self)
@@ -391,10 +401,10 @@ def draw_needle(self):
                         (self.maxValue - self.minValue)) + 90 + self.scale_angle_start_value)
 
         painter.drawConvexPolygon(self.value_needle[0])
+        painter.end()
 
     def resizeEvent(self, event):
         self.rescale_method()
-        pass
 
     def paintEvent(self, event):
 
diff --git a/src/rqt_gauges/speedometer_widget.py b/src/rqt_gauges/speedometer_widget.py
index 8970610..51ca668 100644
--- a/src/rqt_gauges/speedometer_widget.py
+++ b/src/rqt_gauges/speedometer_widget.py
@@ -41,6 +41,7 @@ def __init__(self, node):
         self.max_value.textChanged.connect(self.updateMaxValue)
         self.units.currentTextChanged.connect(self.updateUnits)
         self.subscribe_button.pressed.connect(self.updateSubscription)
+        self.speedometer_gauge.updateValueSignal.connect(self.updateValue)
 
     @pyqtSlot()
     def updateMinValue(self):
@@ -58,6 +59,10 @@ def updateMaxValue(self):
         else:
             self.speedometer_gauge.setMaxValue(180)
 
+    @pyqtSlot(float)
+    def updateValue(self, value):
+        self.speedometer_gauge.updateValue(value)
+
     @pyqtSlot(str)
     def updateUnits(self, new_units):
         self.speedometer_gauge.units = new_units
@@ -87,8 +92,8 @@ def speedometer_callback(self, msg):
             value = f(value)
         if value is not None:
             if type(value) == int or type(value) == float or type(value) == str:
-                self.speedometer_gauge.updateValue(float(value))
+                self.speedometer_gauge.updateValueSignal.emit(float(value))
             else:
-                self.speedometer_gauge.updateValue(self.speedometer_gauge.minValue)
+                self.speedometer_gauge.updateValueSignal.emit(self.speedometer_gauge.minValue)
         else:
-            self.speedometer_gauge.updateValue(self.speedometer_gauge.minValue)
+            self.speedometer_gauge.updateValueSignal.emit(self.speedometer_gauge.minValue)
diff --git a/src/rqt_gauges/steering_wheel_gauge.py b/src/rqt_gauges/steering_wheel_gauge.py
index 70b2746..76fe4d1 100644
--- a/src/rqt_gauges/steering_wheel_gauge.py
+++ b/src/rqt_gauges/steering_wheel_gauge.py
@@ -1,6 +1,6 @@
 import math
 
-from PyQt5.QtCore import QRect, Qt
+from PyQt5.QtCore import pyqtSignal, QRect, Qt
 from PyQt5.QtGui import QBrush, QColor, QFont, QFontMetrics, QPainter, QPen
 from PyQt5.QtWidgets import QWidget
 
@@ -13,6 +13,8 @@ class SteeringWheelGauge(QWidget):
     # methods used to modify the values explained before, the marked number of the gauge
     # and the whole design as well.
 
+    updateValueSignal = pyqtSignal(float)
+
     def __init__(self, parent=None):
         # Constructor method of the class, initializes all the variables needed to create
         # # the gauge.
diff --git a/src/rqt_gauges/steering_wheel_widget.py b/src/rqt_gauges/steering_wheel_widget.py
index c94b72f..567d0e1 100644
--- a/src/rqt_gauges/steering_wheel_widget.py
+++ b/src/rqt_gauges/steering_wheel_widget.py
@@ -37,6 +37,7 @@ def __init__(self, node):
 
         self.max_value.textChanged.connect(self.updateMaxValue)
         self.subscribe_button.pressed.connect(self.updateSubscription)
+        self.steering_wheel_gauge.updateValueSignal.connect(self.updateValue)
 
     @pyqtSlot()
     def updateMaxValue(self):
@@ -64,14 +65,18 @@ def updateSubscription(self):
                 self.steering_wheel_callback,
                 10)
 
+    @pyqtSlot(float)
+    def updateValue(self, value):
+        self.steering_wheel_gauge.updateValue(value)
+
     def steering_wheel_callback(self, msg):
         value = msg
         for f in self.field_evals:
             value = f(value)
         if value is not None:
             if type(value) == int or type(value) == float or type(value) == str:
-                self.steering_wheel_gauge.updateValue(float(value))
+                self.steering_wheel_gauge.updateValueSignal.emit(float(value))
             else:
-                self.steering_wheel_gauge.updateValue(0)
+                self.steering_wheel_gauge.updateValueSignal.emit(0.0)
         else:
-            self.steering_wheel_gauge.updateValue(0)
+            self.steering_wheel_gauge.updateValueSignal.emit(0.0)
diff --git a/src/rqt_gauges/throttle_brake_pedals_widget.py b/src/rqt_gauges/throttle_brake_pedals_widget.py
index 5f90260..ff1517a 100644
--- a/src/rqt_gauges/throttle_brake_pedals_widget.py
+++ b/src/rqt_gauges/throttle_brake_pedals_widget.py
@@ -1,7 +1,7 @@
 import os
 
 from ament_index_python.resources import get_resource
-from PyQt5.QtCore import pyqtSlot
+from PyQt5.QtCore import pyqtSignal, pyqtSlot
 from PyQt5.QtWidgets import QWidget
 from python_qt_binding import loadUi
 from rosidl_runtime_py.utilities import get_message
@@ -12,6 +12,9 @@
 
 class ThrottleBrakePedalsWidget(QWidget):
 
+    updateThrottleValueSignal = pyqtSignal(int)
+    updateBrakeValueSignal = pyqtSignal(int)
+
     def __init__(self, node):
         super().__init__()
         self.setObjectName('ThrottleBrakePedals_widget')
@@ -40,6 +43,8 @@ def __init__(self, node):
         # Signals Connection
         self.throttle_subscribe.pressed.connect(self.throttleUpdateSubscription)
         self.brake_subscribe.pressed.connect(self.brakeUpdateSubscription)
+        self.updateThrottleValueSignal.connect(self.updateThrottle)
+        self.updateBrakeValueSignal.connect(self.updateBrake)
 
     @pyqtSlot()
     def throttleUpdateSubscription(self):
@@ -59,6 +64,16 @@ def throttleUpdateSubscription(self):
                 self.throttle_callback,
                 10)
 
+    @pyqtSlot(int)
+    def updateThrottle(self, value):
+        self.throttle_pedal.setValue(value)
+        self.throttle_label.setText(str(value / 100.0))
+
+    @pyqtSlot(int)
+    def updateBrake(self, value):
+        self.brake_pedal.setValue(value)
+        self.brake_label.setText(str(value / 100.0))
+
     @pyqtSlot()
     def brakeUpdateSubscription(self):
         if self.node.destroy_subscription(self.brake_sub):
@@ -84,8 +99,7 @@ def throttle_callback(self, msg):
         if value is not None and (type(value) == int or type(value) == float
                                   or type(value) == str):
             if value <= 1 and value >= 0:
-                self.throttle_pedal.setValue(int(value*100))
-                self.throttle_label.setText(str(value))
+                self.updateThrottleValueSignal.emit(int(value*100))
             else:
                 print('The throttle pedal value is not between 0 and 1')
         else:
@@ -98,8 +112,7 @@ def brake_callback(self, msg):
         if value is not None and (type(value) == int or type(value) == float
                                   or type(value) == str):
             if value <= 1 and value >= 0:
-                self.brake_pedal.setValue(int(value*100))
-                self.brake_label.setText(str(value))
+                self.updateBrakeValueSignal.emit(int(value*100))
             else:
                 print('The brake pedal value is not between 0 and 1')
         else: