gui: Configure graph's range width and bound

- Upgrade to pglive v0.8
- Add a new patch for new options for specifying display range width
    and bound
This commit is contained in:
linuswck 2025-01-24 16:59:13 +08:00
parent 5909ead681
commit 09827b4d44
4 changed files with 73 additions and 65 deletions

View File

@ -57,13 +57,13 @@
pglive = pkgs.python3Packages.buildPythonPackage rec {
pname = "pglive";
version = "0.7.2";
version = "0.8.0";
format = "pyproject";
src = pkgs.fetchPypi {
inherit pname version;
hash = "sha256-jqj8X6H1N5mJQ4OrY5ANqRB0YJByqg/bNneEALWmH1A=";
hash = "sha256-2aECN/3zlsYRv7Ja8OlrnqlqqSCvJ08S2TaMYoMPst8=";
};
patches = ./patches/0001-Add-option-for-setting-min-range-span-for-y-axis.patch;
patches = ./patches/pg_live_range_width.patch;
buildInputs = [ pkgs.python3Packages.poetry-core ];
propagatedBuildInputs = with pkgs.python3Packages; [ pyqtgraph numpy ];
};

View File

@ -1,61 +0,0 @@
From 59a14e06320fd42d56cd7d953da337c0fe4357fa Mon Sep 17 00:00:00 2001
From: linuswck <linuswck@m-labs.hk>
Date: Tue, 22 Oct 2024 17:30:36 +0800
Subject: [PATCH] Add option for setting min range span for y-axis
---
pglive/sources/live_axis_range.py | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/pglive/sources/live_axis_range.py b/pglive/sources/live_axis_range.py
index afbd806..9b62ba5 100644
--- a/pglive/sources/live_axis_range.py
+++ b/pglive/sources/live_axis_range.py
@@ -5,7 +5,7 @@ from typing import Optional, List, Tuple, Dict
class LiveAxisRange:
def __init__(self, roll_on_tick: int = 1, offset_left: float = 0., offset_right: float = 0., offset_top: float = 0.,
- offset_bottom: float = 0., fixed_range: Optional[List[float]] = None) -> None:
+ offset_bottom: float = 0., fixed_range: Optional[List[float]] = None, min_y_range_span: Optional[List[float]] = [None, None]) -> None:
self.roll_on_tick = roll_on_tick
self.offset_left = offset_left
self.offset_right = offset_right
@@ -21,6 +21,7 @@ class LiveAxisRange:
self.final_x_range = [0., 0.]
self.final_y_range = [0., 0.]
self.ignored_data_connectors: List[str] = []
+ self.min_y_range_span = min_y_range_span
def get_x_range(self, data_connector, tick: int) -> List[float]:
x, _ = data_connector.plot.getData()
@@ -116,6 +117,13 @@ class LiveAxisRange:
# therefore in that case we must set some range
final_range[0] -= 0.4
final_range[1] += 0.4
+
+ if self.min_y_range_span[0] is not None:
+ final_range[0] = min(self.min_y_range_span[0], final_range[0])
+
+ if self.min_y_range_span[1] is not None:
+ final_range[1] = max(self.min_y_range_span[1], final_range[1])
+
if self.final_y_range != final_range:
self.final_y_range = final_range
return self.final_y_range
@@ -139,6 +147,13 @@ class LiveAxisRange:
# therefore in that case we must set some range
final_range[0] -= 0.4
final_range[1] += 0.4
+
+ if self.min_y_range_span[0] is not None:
+ final_range[0] = min(self.min_y_range_span[0], final_range[0])
+
+ if self.min_y_range_span[1] is not None:
+ final_range[1] = max(self.min_y_range_span[1], final_range[1])
+
if self.final_y_range != final_range:
self.final_y_range = final_range
return self.final_y_range
--
2.44.1

View File

@ -0,0 +1,67 @@
diff --git a/pglive/sources/live_axis_range.py b/pglive/sources/live_axis_range.py
index cd3a7fc..102a48f 100755
--- a/pglive/sources/live_axis_range.py
+++ b/pglive/sources/live_axis_range.py
@@ -13,6 +13,10 @@ class LiveAxisRange:
offset_top: float = 0.0,
offset_bottom: float = 0.0,
fixed_range: Optional[List[float]] = None,
+ x_range_width: Optional[float] = None,
+ x_bound: Optional[List[float]] = None,
+ y_range_width: Optional[float] = None,
+ y_bound: Optional[List[float]] = None,
) -> None:
self.roll_on_tick = roll_on_tick
self.offset_left = offset_left
@@ -24,6 +28,10 @@ class LiveAxisRange:
self.crop_top_offset_to_data = False
self.crop_bottom_offset_to_data = False
self.fixed_range = fixed_range
+ self.x_range_width = x_range_width
+ self.x_bound = x_bound
+ self.y_range_width = y_range_width
+ self.y_bound = y_bound
self.x_range: Dict[str, List[float]] = {}
self.y_range: Dict[str, List[float]] = {}
self.final_x_range = [0.0, 0.0]
@@ -70,6 +78,7 @@ class LiveAxisRange:
# therefore in that case we must set some range
final_range[0] -= 0.4
final_range[1] += 0.4
+ final_range = self._update_range_width(self.x_bound, self.x_range_width, final_range)
if self.final_x_range != final_range:
self.final_x_range = final_range
return self.final_x_range
@@ -137,6 +146,7 @@ class LiveAxisRange:
# therefore in that case we must set some range
final_range[0] -= 0.4
final_range[1] += 0.4
+ final_range = self._update_range_width(self.y_bound, self.y_range_width, final_range)
if self.final_y_range != final_range:
self.final_y_range = final_range
return self.final_y_range
@@ -199,6 +209,24 @@ class LiveAxisRange:
else:
return None
+ def _update_range_width(self, bound, range_width, final_range):
+ if range_width is not None:
+ if abs(final_range[0] - final_range[1]) < range_width:
+ center_pt = (final_range[0] + final_range[1]) / 2
+ final_range[0] = center_pt - range_width / 2
+ final_range[1] = center_pt + range_width / 2
+
+ if bound is not None:
+ final_range_width = abs(final_range[0] - final_range[1])
+ bound_width = abs(bound[0] - bound[1])
+ if bound_width < final_range_width:
+ final_range = bound
+ if final_range[0] < bound[0]:
+ final_range = [bound[0], bound[0] + final_range_width]
+ elif final_range[1] > bound[1]:
+ final_range = [bound[0] - final_range_width, bound[1]]
+ return final_range
+
def ignore_connector(self, data_connector, flag: bool) -> None:
if not flag:
self.ignored_data_connectors.append(data_connector.__hash__())

View File

@ -203,7 +203,7 @@ class Graphs:
pd_mon_pwr_axis = LiveAxis('left', text="Power", units="W")
pd_mon_pwr_axis.showLabel()
pd_mon_pwr_graph.y_range_controller = LiveAxisRange(min_y_range_span=[0.0, 100 / 1000 / 1000])
pd_mon_pwr_graph.y_range_controller = LiveAxisRange(y_range_width=0.0005, y_bound=[0.0, float("inf")])
pd_mon_pwr_graph.setAxisItems({'left': pd_mon_pwr_axis})
pd_mon_pwr_graph.addItem(self._pd_mon_pwr_plot)
self.pd_mon_pwr_connector = DataConnector(self._pd_mon_pwr_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
@ -211,6 +211,7 @@ class Graphs:
tec_temp_axis = LiveAxis('left', text="Temperature", units="")
tec_temp_axis.showLabel()
tec_temp_graph.y_range_controller = LiveAxisRange(y_range_width=0.002)
tec_temp_graph.setAxisItems({'left': tec_temp_axis})
tec_temp_graph.addItem(self._tec_setpoint_plot)
tec_temp_graph.addItem(self._tec_temp_plot)
@ -224,6 +225,7 @@ class Graphs:
tec_i_graph.addLegend(brush=(50, 50, 200, 150))
tec_i_graph.addItem(self._tec_i_target_plot)
tec_i_graph.addItem(self._tec_i_measure_plot)
tec_i_graph.y_range_controller = LiveAxisRange(y_range_width=0.05)
self.tec_i_target_connector = DataConnector(self._tec_i_target_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
self.tec_i_measure_connector = DataConnector(self._tec_i_measure_plot, plot_rate=10.0, update_rate=10.0, max_points=self.max_samples)
self.connectors += [self.tec_i_target_connector, self.tec_i_measure_connector]