diff --git a/conda.yml b/conda.yml index 9c1831db5..f7ea8c9f8 100644 --- a/conda.yml +++ b/conda.yml @@ -27,3 +27,4 @@ dependencies: - matplotlib - pytest - pytest-cov + - pyqt=5.12 diff --git a/docs/src/installing/petalinux.rst b/docs/src/installing/petalinux.rst index c32f68df3..0a406ac7e 100644 --- a/docs/src/installing/petalinux.rst +++ b/docs/src/installing/petalinux.rst @@ -18,8 +18,8 @@ You will want to replace the file project-spec/meta-user/recipes-apps/rogue/rogu .. code:: - ROGUE_VERSION = "6.1.4" - ROGUE_MD5SUM = "659c7f5c894f6915e2bd15f922cdab3b" + ROGUE_VERSION = "6.4.0" + ROGUE_MD5SUM = "acbd2b178af84776efbd78cdf3f5db7d" SUMMARY = "Recipe to build Rogue" HOMEPAGE ="https://github.com/slaclab/rogue" @@ -84,14 +84,14 @@ You will want to replace the file project-spec/meta-user/recipes-apps/rogue/rogu install -m 0755 ${S}/python/rogue.so ${D}${PYTHON_SITEPACKAGES_DIR} } -Update the ROGUE_VERSION line for an updated version when appropriate (min version is 6.1.3). You will need to first download the tar.gz file and compute the MD5SUM using the following commands if you update the ROGUE_VERSION line: +Update the ROGUE_VERSION line for an updated version when appropriate. You will need to first download the tar.gz file and compute the MD5SUM using the following commands if you update the ROGUE_VERSION line: .. code:: > wget https://github.com/slaclab/rogue/archive/vx.x.x.tar.gz > md5sum vx.x.x.tar.gz -If your rogue application requires additional python libraries you can add them to the DEPENDS += line in the above text. +RDEPENDS is the Runtime Dependencies. If your rogue application requires additional python libraries you can add them to the RDEPENDS += line in the above text. To enable compilation and installation of the rogue package in your petalinux project execute the following command: diff --git a/python/pyrogue/_Variable.py b/python/pyrogue/_Variable.py index da677000b..28c4b3f11 100644 --- a/python/pyrogue/_Variable.py +++ b/python/pyrogue/_Variable.py @@ -127,8 +127,8 @@ def varUpdate(self,path,varValue): class VariableValue(object): """ """ - def __init__(self, var, read=False): - self.value = var.get(read=read) + def __init__(self, var, read=False, index=-1): + self.value = var.get(read=read,index=index) self.valueDisp = var.genDisp(self.value) self.disp = var.disp self.enum = var.enum @@ -572,7 +572,7 @@ def write(self, *, verify=True, check=True): pass @pr.expose - def getVariableValue(self,read=True): + def getVariableValue(self,read=True,index=-1): """ Return the value after performing a read from hardware if applicable. Hardware read is blocking. An error will result in a logged exception. @@ -582,6 +582,8 @@ def getVariableValue(self,read=True): ---------- read : bool (Default value = True) + index : int + (Default value = -1) Returns ------- @@ -590,7 +592,7 @@ def getVariableValue(self,read=True): Listeners will be informed of the update. """ - return VariableValue(self,read=read) + return VariableValue(self,read=read,index=index) @pr.expose def value(self, index=-1): diff --git a/python/pyrogue/pydm/data_plugins/rogue_plugin.py b/python/pyrogue/pydm/data_plugins/rogue_plugin.py index 14ef8a0da..a48156caf 100644 --- a/python/pyrogue/pydm/data_plugins/rogue_plugin.py +++ b/python/pyrogue/pydm/data_plugins/rogue_plugin.py @@ -33,10 +33,10 @@ def parseAddress(address): - # "rogue://index//" + # "rogue://index///" # or - # "rogue://host:port//" - # Mode: 'Value', 'Disp', 'Name' or 'Path' + # "rogue://host:port///" + # Mode: 'value', 'disp', 'name' or 'path' envList = os.getenv('ROGUE_SERVERS') if envList is None: @@ -58,12 +58,13 @@ def parseAddress(address): port = int(data_server[1]) path = data[1] mode = 'value' if (len(data) < 3) else data[2] + index = -1 if (len(data) < 4) else int(data[3]) - return (host,port,path,mode) + return (host,port,path,mode,index) def nodeFromAddress(address): - host, port, path, mode = parseAddress(address) + host, port, path, mode, index = parseAddress(address) client = VirtualClient(host, port) return client.root.getNode(path) @@ -75,7 +76,7 @@ def __init__(self, channel, address, protocol=None, parent=None): self.app = QApplication.instance() - self._host, self._port, self._path, self._mode = parseAddress(channel.address) + self._host, self._port, self._path, self._mode, self._index = parseAddress(channel.address) self._cmd = False self._int = False @@ -114,6 +115,10 @@ def linkState(self, state): def _updateVariable(self,path,varValue): + + if self._index != -1: + varValue = self._node.getVariableValue(read=False, index=self._index) + if self._mode == 'name': self.new_value_signal[str].emit(self._node.name) elif self._mode == 'path': @@ -153,7 +158,7 @@ def put_value(self, new_value): if self._cmd: self._node.__call__(val) else: - self._node.setDisp(val) + self._node.setDisp(val,index=self._index) def add_listener(self, channel): @@ -204,7 +209,7 @@ def add_listener(self, channel): self.new_value_signal[str].emit(self._node.path) else: self.write_access_signal.emit(self._cmd or self._node.mode!='RO') - self._updateVariable(self._node.path,self._node.getVariableValue(read=False)) + self._updateVariable(self._node.path,self._node.getVariableValue(read=False, index=self._index)) else: self.new_value_signal[str].emit(self._node.name) diff --git a/python/pyrogue/pydm/examples/rogue_plugin_test.ui b/python/pyrogue/pydm/examples/rogue_plugin_test.ui index 2d572a956..2ddcfc6e5 100644 --- a/python/pyrogue/pydm/examples/rogue_plugin_test.ui +++ b/python/pyrogue/pydm/examples/rogue_plugin_test.ui @@ -19,7 +19,7 @@ - 4 + 0 @@ -105,7 +105,7 @@ - {"name": "Axis 1", "orientation": "left", "label": "Test Plot Scatter", "minRange": -1.0, "maxRange": 1.0, "autoRange": true, "logMode": false} + {"name": "Axis 1", "orientation": "left", "label": "Test Plot Scatter", "minRange": -1.04, "maxRange": 1.04, "autoRange": true, "logMode": false} @@ -125,7 +125,7 @@ - {"name": "Axis 1", "orientation": "left", "label": "Test Plot Time", "minRange": -1.0, "maxRange": 1.0, "autoRange": true, "logMode": null} + {"name": "Axis 1", "orientation": "left", "label": "Test Plot Time", "minRange": -1.04, "maxRange": 1.04, "autoRange": true, "logMode": null} @@ -151,7 +151,7 @@ - {"name": "Axis 1", "orientation": "left", "label": "Test Array Waveform", "minRange": -1.0, "maxRange": 1.0, "autoRange": true, "logMode": false} + {"name": "Axis 1", "orientation": "left", "label": "Test Array Waveform", "minRange": -1.04, "maxRange": 1.04, "autoRange": true, "logMode": false} diff --git a/python/pyrogue/pydm/tools/generic_file_tool.py b/python/pyrogue/pydm/tools/generic_file_tool.py index 42df13c1d..259eaf19b 100644 --- a/python/pyrogue/pydm/tools/generic_file_tool.py +++ b/python/pyrogue/pydm/tools/generic_file_tool.py @@ -41,7 +41,7 @@ def __init__(self,save=False): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path) diff --git a/python/pyrogue/pydm/tools/node_info_tool.py b/python/pyrogue/pydm/tools/node_info_tool.py index 02ecf5e36..5b83534ea 100644 --- a/python/pyrogue/pydm/tools/node_info_tool.py +++ b/python/pyrogue/pydm/tools/node_info_tool.py @@ -36,7 +36,7 @@ def __init__(self): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path) diff --git a/python/pyrogue/pydm/tools/read_node_tool.py b/python/pyrogue/pydm/tools/read_node_tool.py index 15a384794..349145969 100644 --- a/python/pyrogue/pydm/tools/read_node_tool.py +++ b/python/pyrogue/pydm/tools/read_node_tool.py @@ -34,7 +34,7 @@ def __init__(self): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path) diff --git a/python/pyrogue/pydm/tools/read_recursive_tool.py b/python/pyrogue/pydm/tools/read_recursive_tool.py index 6f429d3d9..feb6fd76f 100644 --- a/python/pyrogue/pydm/tools/read_recursive_tool.py +++ b/python/pyrogue/pydm/tools/read_recursive_tool.py @@ -34,7 +34,7 @@ def __init__(self): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path) diff --git a/python/pyrogue/pydm/tools/write_node_tool.py b/python/pyrogue/pydm/tools/write_node_tool.py index 1c828bd26..25fda74bd 100644 --- a/python/pyrogue/pydm/tools/write_node_tool.py +++ b/python/pyrogue/pydm/tools/write_node_tool.py @@ -34,7 +34,7 @@ def __init__(self): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path) diff --git a/python/pyrogue/pydm/tools/write_recursive_tool.py b/python/pyrogue/pydm/tools/write_recursive_tool.py index 382a07896..06f460d59 100644 --- a/python/pyrogue/pydm/tools/write_recursive_tool.py +++ b/python/pyrogue/pydm/tools/write_recursive_tool.py @@ -33,7 +33,7 @@ def __init__(self): ExternalTool.__init__(self, icon=icon, name=name, group=group, use_with_widgets=use_with_widgets) def call(self, channels, sender): - addr, port, path, mode = parseAddress(channels[0].address) + addr, port, path, mode, index = parseAddress(channels[0].address) self._client = VirtualClient(addr, port) node = self._client.root.getNode(path)