Wrapping Custom Module With PyRogue Device
The example below wraps the classes from Custom Module Source in PyRogue
Device objects. That wrapper is what exposes Variables, Commands, and
stream connection hooks to the rest of the PyRogue management layer.
In practice, this file can be created as MyWrapper.py in the same Python
directory as the shared library produced by Building The Custom Module.
# Source Code For MyWrapper.py
import rogue
import pyrogue
import MyModule
class MyCustomSlave(pyrogue.Device):
def __init__(self, *, name, **kwargs ):
pyrogue.Device.__init__(self, name=name, description='My Custom Stream Slave', **kwargs)
# Create the underlying C++ slave object from MyModule
self._mySlave = MyModule.MyCustomSlave()
# Add read only frame count variable
self.add(pyrogue.LocalVariable(name='FrameCount', description='Total Frames Received',
mode='RO', pollInterval=1, value=0,
localGet=self._mySlave.getFrameCount))
# Add read only byte count variable
self.add(pyrogue.LocalVariable(name='ByteCount', description='Total Bytes Received',
mode='RO', pollInterval=1, value=0,
localGet=self._mySlave.getTotalBytes))
# Method called by streamConnect and streamConnectBiDir to access slave
def _getStreamSlave(self):
return self._mySlave
# Support << operator
def __lshift__(self, other):
pyrogue.streamConnect(other,self)
return other
class MyCustomMaster(pyrogue.Device):
def __init__(self, *, name, **kwargs ):
pyrogue.Device.__init__(self, name=name, description='My Custom Stream Master', **kwargs)
# Create the underlying C++ master object from MyModule
self._myMast = MyModule.MyCustomMaster()
# Add read only frame count variable
self.add(pyrogue.LocalVariable(name='FrameCount', description='Total Frames Received',
mode='RO', pollInterval=1, value=0,
localGet=self._myMast.getFrameCount))
# Add read only byte count variable
self.add(pyrogue.LocalVariable(name='ByteCount', description='Total Bytes Received',
mode='RO', pollInterval=1, value=0,
localGet=self._myMast.getTotalBytes))
# Add read write frame size variable
self.add(pyrogue.LocalVariable(name='FrameSize', description='Transmit Frame Size',
mode='RW', pollInterval=1, value=0,
localGet=self._myMast.getFrameSize,
localSet=lambda value: self._myMast.setFrameSize(value)))
# Frame generation command
self.add(pyrogue.LocalCommand(name='MyFrameGen',description='Generate a single frame',
function=self._myMast.myFrameGen))
# Method called by streamConnect and streamConnectBiDir to access master
def _getStreamMaster(self):
return self._myMast
# Support >> operator
def __rshift__(self, other):
pyrogue.streamConnect(self,other)
return other