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/_DataReceiver.py b/python/pyrogue/_DataReceiver.py index 07a3ea733..9bb431c62 100644 --- a/python/pyrogue/_DataReceiver.py +++ b/python/pyrogue/_DataReceiver.py @@ -38,27 +38,31 @@ def __init__(self, self.add(pr.LocalVariable(name='FrameCount', value=0, + mode = 'RO', pollInterval=1, description='Frame Rx Counter')) self.add(pr.LocalVariable(name='ErrorCount', value=0, + mode = 'RO', pollInterval=1, description='Frame Error Counter')) self.add(pr.LocalVariable(name='ByteCount', value=0, + mode = 'RO', pollInterval=1, description='Byte Rx Counter')) self.add(pr.LocalVariable(name='Updated', value=False, + mode = 'RO', description='Data has been updated flag')) self.add(pr.LocalVariable(name='Data', typeStr=typeStr, disp='', - groups=['NoState','NoStream'], + groups=['NoState','NoStream', 'NoConfig'], value=value, hidden=hideData, description='Data Frame Container')) 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/protocols/_Network.py b/python/pyrogue/protocols/_Network.py index 977b40f5b..83d475c81 100644 --- a/python/pyrogue/protocols/_Network.py +++ b/python/pyrogue/protocols/_Network.py @@ -28,10 +28,10 @@ def __init__(self,*, port, host='127.0.0.1', jumbo=False, wait=True, packVer=1, if server: self._udp = rogue.protocols.udp.Server(port,jumbo) - self._rssi = rogue.protocols.rssi.Server(self._udp.maxPayload()) + self._rssi = rogue.protocols.rssi.Server(self._udp.maxPayload()-8) else: self._udp = rogue.protocols.udp.Client(host,port,jumbo) - self._rssi = rogue.protocols.rssi.Client(self._udp.maxPayload()) + self._rssi = rogue.protocols.rssi.Client(self._udp.maxPayload()-8) if packVer == 2: self._pack = rogue.protocols.packetizer.CoreV2(False,True,enSsi) # ibCRC = False, obCRC = True 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) diff --git a/src/rogue/interfaces/memory/Block.cpp b/src/rogue/interfaces/memory/Block.cpp index f7f517f44..2c81292ea 100644 --- a/src/rogue/interfaces/memory/Block.cpp +++ b/src/rogue/interfaces/memory/Block.cpp @@ -511,14 +511,14 @@ void rim::Block::addVariables(std::vector variables) { (*vit)->verifyEn_); } - // List variables + // List variables } else { for (x = 0; x < (*vit)->numValues_; x++) { // Variable allows overlaps, add to overlap enable mask if ((*vit)->overlapEn_) { setBits(oleMask, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_); - // Otherwise add to exclusive mask and check for existing mapping + // Otherwise add to exclusive mask and check for existing mapping } else { if (anyBits(excMask, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_)) throw(rogue::GeneralError::create( diff --git a/src/rogue/interfaces/memory/Variable.cpp b/src/rogue/interfaces/memory/Variable.cpp index 4661dd20b..3bb928625 100644 --- a/src/rogue/interfaces/memory/Variable.cpp +++ b/src/rogue/interfaces/memory/Variable.cpp @@ -470,7 +470,7 @@ void rim::Variable::shiftOffsetDown(uint32_t shift, uint32_t minSize) { highTranByte_[0] = varBytes_ - 1; staleHighByte_ = highTranByte_[0]; - // List variable + // List variable } else { for (x = 0; x < numValues_; x++) { lowTranByte_[x] = @@ -487,7 +487,7 @@ void rim::Variable::shiftOffsetDown(uint32_t shift, uint32_t minSize) { } // Compute total bit range of accessed bytes - varBytes_ = highTranByte_[numValues_ - 1] - lowTranByte_[0] + 1; + varBytes_ = highTranByte_[numValues_ - 1] + 1; staleHighByte_ = highTranByte_[numValues_ - 1]; } diff --git a/src/rogue/protocols/udp/Client.cpp b/src/rogue/protocols/udp/Client.cpp index 0030ac77b..f5a88c2a4 100644 --- a/src/rogue/protocols/udp/Client.cpp +++ b/src/rogue/protocols/udp/Client.cpp @@ -202,7 +202,7 @@ void rpu::Client::runThread(std::weak_ptr lockPtr) { if (res > 0) { // Message was too big if (res > avail) { - udpLog_->warning("Receive data was too large. Dropping."); + udpLog_->warning("Receive data was too large. Rx=%i, avail=%i Dropping.", res, avail); } else { buff->setPayload(res); sendFrame(frame); diff --git a/templates/RogueConfig.cmake.in b/templates/RogueConfig.cmake.in index 70091becf..6d891b227 100644 --- a/templates/RogueConfig.cmake.in +++ b/templates/RogueConfig.cmake.in @@ -26,8 +26,9 @@ set(NO_PYTHON @NO_PYTHON@) # Boost + Python ##################################### if ( NOT NO_PYTHON ) - # Search for newest version of Python3 first - set(Python3_FIND_STRATEGY "VERSION") + + # Find newest python interpreter first + set(Python3_FIND_STRATEGY "LOCATION") find_package(Python3 QUIET REQUIRED COMPONENTS Interpreter Development) # Find Numpy @@ -49,10 +50,6 @@ if ( NOT NO_PYTHON ) # Hint for boost on anaconda if (DEFINED ENV{CONDA_PREFIX}) set(Boost_ROOT $ENV{CONDA_PREFIX}) - - # SLAC AFS custom path - elseif (DEFINED ENV{BOOST_PATH}) - set(Boost_ROOT $ENV{BOOST_PATH}) endif() # libboost_python3.7 style libraries @@ -88,6 +85,7 @@ if ( NOT NO_PYTHON ) message("") message(FATAL_ERROR "Failed to find boost libraries!") endif() + else() add_definitions( -DNO_PYTHON ) endif() diff --git a/tests/test_list_memory.py b/tests/test_list_memory.py index 68baae441..8e4c80e2e 100644 --- a/tests/test_list_memory.py +++ b/tests/test_list_memory.py @@ -16,7 +16,7 @@ import numpy as np import random -#rogue.Logging.setLevel(rogue.Logging.Warning) +#rogue.Logging.setLevel(rogue.Logging.Debug) #import logging #logger = logging.getLogger('pyrogue') #logger.setLevel(logging.DEBUG)