GObject Tango device¶
UcaDevice is a generic Tango Device that wraps libuca
in order to
make libuca controlled cameras available as Tango devices.
Note
The documentation of UcaDevice can be outdated.
Architecture¶
UcaDevice is derived from GObjectDevice and adds libuca specific features like
start/stop recording etc. The most important feature is acquisition control.
UcaDevice is responsible for controlling acquisition of images from libuca. The
last aquired image can be accessed by reading attribute SingleImage
.
UcaDevice is most useful together with ImageDevice. If used together, UcaDevice
sends each aquired image to ImageDevice, which in turn does configured
post-processing like flipping, rotating or writing the image to disk.
Attributes¶
Besides the dynamic attributes translated from libuca properties UcaDevice has the following attributes:
NumberOfImages (Tango::DevLong)
: how many images should be acquired? A value of -1 means unlimited (read/write)ImageCounter (Tango::DevULong)
: current number of acquired images (read-only)CameraName (Tango::DevString)
: name of libuca object type (read-only)SingleImage (Tango::DevUChar)
: holds the last acquired image
Acquisition Control¶
In UcaDevice acquisition control is mostly implemented by two
yat4tango::DeviceTasks
: AcquisitionTask and GrabTask.
GrabTask’s only responsibility is to call grab
on libuca
synchronously and post the data on to AcquisitionTask.
AcquisitionTask is responsible for starting and stopping GrabTask and
for passing image data on to ImageDevice
(if exisiting) and to
UcaDevice
for storage in attribute SingleImage
. It counts how
many images have been acquired and checks this number against the
configured NumberOfImages
. If the desired number is reached, it
stops GrabTask, calls stop_recording
on libuca
and sets the
Tango state to STANDBY.
Plugins¶
As different cameras have different needs, plugins are used for special implementations. Plugins also makes UcaDevice and Tango Servers based on it more flexible and independent of libuca implementation.
- PCO: The Pco plugin implements additional checks when writing ROI values.
- Pylon: The Pylon plugin sets default values for
roi-width
androi-height
from libuca propertiesroi-width-default
androi-height-default
.
Installation¶
Detailed installation depends on the manifestation of UcaDevice. All manifestations depend on the following libraries:
- YAT
- YAT4Tango
- Tango
- GObjectDevice
- ImageDevice
Build¶
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
export PYLON_ROOT=/usr/pylon
export LD_LIBRARY_PATH=$PYLON_ROOT/lib64:$PYLON_ROOT/genicam/bin/Linux64_x64
git clone git@iss-repo:UcaDevice.git
cd UcaDevice
mkdir build
cd build
cmake ..
make
Setup in Tango Database / Jive¶
Before ds_UcaDevice
can be started, it has to be registered manually
in the Tango database. With Jive
the following steps are necessary:
Register Server Menu Tools → Server Wizard Server name → ds_UcaDevice Instance name → my_server (name can be chosen freely) Next Cancel
Register Classes and Instances In tab Server: context menu on ds_UcaDevice → my_server → Add Class Class: UcaDevice Devices:
iss/name1/name2
Register server same for class ImageDeviceStart server
export TANGO_HOST=anka-tango:100xx export UCA_DEVICE_PLUGINS_DIR=/usr/lib(64) ds_UcaDevice pco my_server
Setup properties for UcaDevice context menu on device → Device wizard Property StorageDevice: address of previously registered ImageDevice instance
Setup properties for ImageDevice context menu on device → Device wizard PixelSize: how many bytes per pixel for the images of this camera? GrabbingDevice: address of previously registered UcaDevice instance
Finish restart ds_UcaDevice
FAQ¶
UcaDevice refuses to start up…? Most likely there is no instance registered for class UcaDevice. Register an instance for this class and it should work.
Why does UcaDevice depend on ImageDevice? UcaDevice pushes each new Frame to ImageDevice. Polling is not only less efficient but also prone to errors, e.g. missed/double frames and so on. Perhaps we could use the Tango-Event-System here!
Open Questions, Missing Features etc.¶
Why do we need to specify
Storage
for UcaDevice andGrabbingDevice
for ImageDevice?ImageDevice needs the Tango-Address of UcaDevice to mirror all Attributes and Commands and to forward them to it. UcaDevice needs the Tango-Address of ImageDevice to push a new frame on reception. A more convenient solution could be using conventions for the device names, e.g. of the form
$prefix/$instance_name/uca
and$prefix/$instance_name/image
. That way we could get rid of the two Device-Properties and an easier installation without the process of registering the classes and instances inJive
.Why does UcaDevice dynamically link to GObjectDevice?
There is no good reason for it. Packaging and installing would be easier if we linked statically to
GObjectDevice
because we would hide this dependency. Having a separateGObjectDevice
is generally a nice feature to makeGObjects
available in Tango. However, there is currently no GObjectDevice in use other than in the context of UcaDevice.Why must the plugin name be given as a command line parameter instead of a Device-Property?
There is no good reason for it. UcaDevice would be easier to use, if the plugin was configured in the Tango database as a Device-Property for the respective server instance.