[pytango] 389/483: Update documentation
Sandor Bodo-Merle
sbodomerle-guest at moszumanska.debian.org
Thu Sep 28 19:15:03 UTC 2017
This is an automated email from the git hooks/post-receive script.
sbodomerle-guest pushed a commit to annotated tag bliss_8.10
in repository pytango.
commit 2abf1d1f2fdef11d1ef293256667c95ff419d1f6
Author: tiagocoutinho <tiagocoutinho at 4e9c00fd-8f2e-0410-aa12-93ce3db5e235>
Date: Thu May 15 18:37:36 2014 +0000
Update documentation
git-svn-id: http://svn.code.sf.net/p/tango-cs/code/bindings/PyTango/trunk@25637 4e9c00fd-8f2e-0410-aa12-93ce3db5e235
---
doc/itango.rst | 714 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 714 insertions(+)
diff --git a/doc/itango.rst b/doc/itango.rst
new file mode 100644
index 0000000..97931c1
--- /dev/null
+++ b/doc/itango.rst
@@ -0,0 +1,714 @@
+.. highlight:: python
+ :linenothreshold: 4
+
+.. _itango:
+
+======
+ITango
+======
+
+ITango is a PyTango CLI based on IPython_. It is designed to be used as an
+IPython profile.
+
+ITango is available since PyTango 7.1.2
+
+You can start ITango by typing on the command line::
+
+ $ itango
+
+or the equivalent::
+
+ $ ipython --profile=tango
+
+and you should get something like this:
+
+.. image:: _static/itango00.png
+ :align: center
+ :width: 75%
+
+
+.. _itango-features:
+
+Features
+--------
+
+ITango works like a normal python console, but it gives you in addition a nice
+set of features from IPython_ like:
+
+ - proper (bash-like) command completion
+ - automatic expansion of python variables, functions, types
+ - command history (with up/down arrow keys, %hist command)
+ - help system ( object? syntax, help(object))
+ - persistently store your favorite variables
+ - color modes
+
+(for a complete list checkout the `IPython web page <http://ipython.org/>`_)
+
+Plus an additional set o Tango_ specific features:
+
+ - automatic import of Tango objects to the console namespace (:mod:`PyTango`
+ module, :class:`~PyTango.DeviceProxy` (=Device),
+ :class:`~PyTango.Database`, :class:`~PyTango.Group`
+ and :class:`~PyTango.AttributeProxy` (=Attribute))
+ - device name completion
+ - attribute name completion
+ - automatic tango object member completion
+ - list tango devices, classes, servers
+ - customized tango error message
+ - tango error introspection
+ - switch database
+ - refresh database
+ - list tango devices, classes
+ - store favorite tango objects
+ - store favorite tango devices
+ - tango color modes
+
+Check the :ref:`itango-highlights` to see how to put these feature to good use
+:-)
+
+
+.. currentmodule:: PyTango
+
+.. _itango-highlights:
+
+Highlights
+----------
+
+Tab completion
+~~~~~~~~~~~~~~
+
+ITango exports many tango specific objects to the console namespace.
+These include:
+
+ - the PyTango module itself
+
+ .. sourcecode:: itango
+
+ ITango [1]: PyTango
+ Result [1]: <module 'PyTango' from ...>
+
+ - The :class:`DeviceProxy` (=Device), :class:`AttributeProxy` (=Attribute),
+ :class:`Database` and :class:`Group` classes
+
+ .. sourcecode:: itango
+
+ ITango [1]: De<tab>
+ DeprecationWarning Device DeviceProxy
+
+ ITango [2]: Device
+ Result [2]: <class 'PyTango._PyTango.DeviceProxy'>
+
+ ITango [3]: Device("sys/tg_test/1")
+ Result [3]: DeviceProxy(sys/tg_test/1)
+
+ ITango [4]: Datab<tab>
+
+ ITango [4]: Database
+
+ ITango [4]: Att<tab>
+ Attribute AttributeError AttributeProxy
+
+ - The Tango :class:`Database` object to which the itango session is
+ currently connected
+
+ .. sourcecode:: itango
+
+ ITango [1]: db
+ Result [1]: Database(homer, 10000)
+
+Device name completion
+~~~~~~~~~~~~~~~~~~~~~~
+
+ITango knows the complete list of device names (including alias) for the current
+tango database. This means that when you try to create a new Device, by pressing
+<tab> you can see a context sensitive list of devices.
+
+.. sourcecode:: itango
+
+ ITango [1]: test = Device("<tab>
+ Display all 3654 possibilities? (y or n) n
+
+ ITango [1]: test = Device("sys<tab>
+ sys/access_control/1 sys/database/2 sys/tautest/1 sys/tg_test/1
+
+ ITango [2]: test = Device("sys/tg_test/1")
+
+Attribute name completion
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ITango can inspect the list of attributes in case the device server for the device
+where the attribute resides is running.
+
+.. sourcecode:: itango
+
+ ITango [1]: short_scalar = Attribute("sys<tab>
+ sys/access_control/1/ sys/database/2/ sys/tautest/1/ sys/tg_test/1/
+
+ ITango [1]: short_scalar = Attribute("sys/tg_test/1/<tab>
+ sys/tg_test/1/State sys/tg_test/1/no_value
+ sys/tg_test/1/Status sys/tg_test/1/short_image
+ sys/tg_test/1/ampli sys/tg_test/1/short_image_ro
+ sys/tg_test/1/boolean_image sys/tg_test/1/short_scalar
+ sys/tg_test/1/boolean_image_ro sys/tg_test/1/short_scalar_ro
+ sys/tg_test/1/boolean_scalar sys/tg_test/1/short_scalar_rww
+ sys/tg_test/1/boolean_spectrum sys/tg_test/1/short_scalar_w
+ sys/tg_test/1/boolean_spectrum_ro sys/tg_test/1/short_spectrum
+ sys/tg_test/1/double_image sys/tg_test/1/short_spectrum_ro
+ sys/tg_test/1/double_image_ro sys/tg_test/1/string_image
+ sys/tg_test/1/double_scalar sys/tg_test/1/string_image_ro
+ ...
+
+ ITango [1]: short_scalar = Attribute("sys/tg_test/1/short_scalar")
+
+ ITango [29]: print test.read()
+ DeviceAttribute[
+ data_format = PyTango._PyTango.AttrDataFormat.SCALAR
+ dim_x = 1
+ dim_y = 0
+ has_failed = False
+ is_empty = False
+ name = 'short_scalar'
+ nb_read = 1
+ nb_written = 1
+ quality = PyTango._PyTango.AttrQuality.ATTR_VALID
+ r_dimension = AttributeDimension(dim_x = 1, dim_y = 0)
+ time = TimeVal(tv_nsec = 0, tv_sec = 1279723723, tv_usec = 905598)
+ type = PyTango._PyTango.CmdArgType.DevShort
+ value = 47
+ w_dim_x = 1
+ w_dim_y = 0
+ w_dimension = AttributeDimension(dim_x = 1, dim_y = 0)
+ w_value = 0]
+
+Automatic tango object member completion
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you create a new tango object, (ex.: a device), itango is able to find out
+dynamically which are the members of this device (including tango commands
+and attributes if the device is currently running)
+
+.. sourcecode:: itango
+
+ ITango [1]: test = Device("sys/tg_test/1")
+
+ ITango [2]: test.<tab>
+ Display all 240 possibilities? (y or n)
+ ...
+ test.DevVoid test.get_access_control
+ test.Init test.get_asynch_replies
+ test.State test.get_attribute_config
+ test.Status test.get_attribute_config_ex
+ test.SwitchStates test.get_attribute_list
+ ...
+
+ ITango [2]: test.short_<tab>
+ test.short_image test.short_scalar test.short_scalar_rww test.short_spectrum
+ test.short_image_ro test.short_scalar_ro test.short_scalar_w test.short_spectrum_ro
+
+ ITango [2]: test.short_scalar # old style: test.read_attribute("short_scalar").value
+ Result [2]: 252
+
+ ITango [3]: test.Dev<tab>
+ test.DevBoolean test.DevUShort test.DevVarShortArray
+ test.DevDouble test.DevVarCharArray test.DevVarStringArray
+ test.DevFloat test.DevVarDoubleArray test.DevVarULongArray
+ test.DevLong test.DevVarDoubleStringArray test.DevVarUShortArray
+ test.DevShort test.DevVarFloatArray test.DevVoid
+ test.DevString test.DevVarLongArray
+ test.DevULong test.DevVarLongStringArray
+
+ ITango [3]: test.DevDouble(56.433) # old style: test.command_inout("DevDouble").
+ Result [3]: 56.433
+
+Tango classes as :class:`DeviceProxy`
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ITango exports all known tango classes as python alias to :class:`DeviceProxy`.
+This way, if you want to create a device of class which you already know
+(say, Libera, for example) you can do:
+
+.. sourcecode:: itango
+
+ ITango [1]: lib01 = Libera("BO01/DI/BPM-01")
+
+One great advantage is that the tango device name completion is sensitive to the
+type of device you want to create. This means that if you are in the middle of
+writting a device name and you press the <tab> key, only devices of the tango
+class 'Libera' will show up as possible completions.
+
+.. sourcecode:: itango
+
+ ITango [1]: bpm1 = Libera("<tab>
+ BO01/DI/BPM-01 BO01/DI/BPM-09 BO02/DI/BPM-06 BO03/DI/BPM-03 BO03/DI/BPM-11 BO04/DI/BPM-08
+ BO01/DI/BPM-02 BO01/DI/BPM-10 BO02/DI/BPM-07 BO03/DI/BPM-04 BO04/DI/BPM-01 BO04/DI/BPM-09
+ BO01/DI/BPM-03 BO01/DI/BPM-11 BO02/DI/BPM-08 BO03/DI/BPM-05 BO04/DI/BPM-02 BO04/DI/BPM-10
+ BO01/DI/BPM-04 BO02/DI/BPM-01 BO02/DI/BPM-09 BO03/DI/BPM-06 BO04/DI/BPM-03 BO04/DI/BPM-11
+ BO01/DI/BPM-05 BO02/DI/BPM-02 BO02/DI/BPM-10 BO03/DI/BPM-07 BO04/DI/BPM-04
+ BO01/DI/BPM-06 BO02/DI/BPM-03 BO02/DI/BPM-11 BO03/DI/BPM-08 BO04/DI/BPM-05
+ BO01/DI/BPM-07 BO02/DI/BPM-04 BO03/DI/BPM-01 BO03/DI/BPM-09 BO04/DI/BPM-06
+ BO01/DI/BPM-08 BO02/DI/BPM-05 BO03/DI/BPM-02 BO03/DI/BPM-10 BO04/DI/BPM-07
+
+ ITango [1]: bpm1 = Libera("BO01<tab>
+ BO01/DI/BPM-01 BO01/DI/BPM-03 BO01/DI/BPM-05 BO01/DI/BPM-07 BO01/DI/BPM-09 BO01/DI/BPM-11
+ BO01/DI/BPM-02 BO01/DI/BPM-04 BO01/DI/BPM-06 BO01/DI/BPM-08 BO01/DI/BPM-10
+
+ ITango [1]: bpm1 = Libera("BO01/DI/BPM-01")
+
+Customized device representation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When you use ipython >= 0.11 with a Qt console frontend::
+
+ $ itango qtconsole
+
+typing a variable containing a tango device object followend by :kbd:`Enter`
+will present you with a customized representation of the object instead of the
+usual :func:`repr` :
+
+ .. image:: _static/itango06.png
+
+You can customize the icon that itango displays for a specific device.
+The first thing to do is to copy the image file into
+:mod:`PyTango.ipython.resource` installation directory (if you don't have
+permissions to do so, copy the image into a directory of your choosing
+and make sure it is accessible from itango).
+
+If you want to use the image for all devices of a certain tango class, just
+add a new tango class property called *__icon*. You can do it with jive or, of
+course, with itango itself::
+
+ db.put_class_property("Libera", dict(__icon="libera.png"))
+
+ # if you placed your image in a directory different than PyTango.ipython.resource
+ # then, instead you have to specify the absolute directory
+
+ db.put_class_property("Libera", dict(__icon="/home/homer/.config/itango/libera.png"))
+
+If you need different images for different devices of the same class, you can
+specify an *__icon* property at the device level (which takes precedence over
+the class property value, if defined)::
+
+ db.put_device_property("BO01/DI/BPM-01", dict(__icon="libera2.png"))
+
+
+
+List tango devices, classes, servers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ITango provides a set of magic functions (ipython lingo) that allow you to check
+for the list tango devices, classes and servers which are registered in the
+current database.
+
+.. sourcecode:: itango
+
+ ITango [1]: lsdev
+ Device Alias Server Class
+ ---------------------------------------- ------------------------- ------------------------- --------------------
+ expchan/BL99_Dummy0DCtrl/1 BL99_0D1 Pool/BL99 ZeroDExpChannel
+ simulator/bl98/motor08 Simulator/BL98 SimuMotor
+ expchan/BL99_Dummy0DCtrl/3 BL99_0D3 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_Dummy0DCtrl/2 BL99_0D2 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_Dummy0DCtrl/5 BL99_0D5 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_Dummy0DCtrl/4 BL99_0D4 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_Dummy0DCtrl/7 BL99_0D7 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_Dummy0DCtrl/6 BL99_0D6 Pool/BL99 ZeroDExpChannel
+ simulator/bl98/motor01 Simulator/BL98 SimuMotor
+ simulator/bl98/motor02 Simulator/BL98 SimuMotor
+ simulator/bl98/motor03 Simulator/BL98 SimuMotor
+ mg/BL99/_mg_macserv_26065_-1320158352 Pool/BL99 MotorGroup
+ simulator/bl98/motor05 Simulator/BL98 SimuMotor
+ simulator/bl98/motor06 Simulator/BL98 SimuMotor
+ simulator/bl98/motor07 Simulator/BL98 SimuMotor
+ simulator/BL98/motctrl01 Simulator/BL98 SimuMotorCtrl
+ expchan/BL99_Simu0DCtrl1/1 BL99_0D8 Pool/BL99 ZeroDExpChannel
+ expchan/BL99_UxTimerCtrl1/1 BL99_Timer Pool/BL99 CTExpChannel
+ ...
+
+ ITango [1]: lsdevclass
+ SimuCoTiCtrl TangoAccessControl ZeroDExpChannel
+ Door Motor DataBase
+ MotorGroup IORegister SimuMotorCtrl
+ TangoTest MacroServer TauTest
+ SimuMotor SimuCounterEx MeasurementGroup
+ Pool CTExpChannel
+
+ ITango [1]: lsserv
+ MacroServer/BL99 MacroServer/BL98 Pool/V2
+ Pool/BL99 Pool/BL98 TangoTest/test
+ Pool/tcoutinho Simulator/BL98
+ TangoAccessControl/1 TauTest/tautest DataBaseds/2
+ MacroServer/tcoutinho Simulator/BL99
+
+Customized tango error message and introspection
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ITango intercepts tango exceptions that occur when you do tango operations
+(ex.: write an attribute with a value outside the allowed limits) and tries to
+display it in a summarized, user friendly way.
+If you need more detailed information about the last tango error, you can use
+the magic command 'tango_error'.
+
+.. sourcecode:: itango
+
+ ITango [1]: test = Device("sys/tg_test/1")
+
+ ITango [2]: test.no_value
+ API_AttrValueNotSet : Read value for attribute no_value has not been updated
+ For more detailed information type: tango_error
+
+ ITango [3]: tango_error
+ Last tango error:
+ DevFailed[
+ DevError[
+ desc = 'Read value for attribute no_value has not been updated'
+ origin = 'Device_3Impl::read_attributes_no_except'
+ reason = 'API_AttrValueNotSet'
+ severity = PyTango._PyTango.ErrSeverity.ERR]
+ DevError[
+ desc = 'Failed to read_attribute on device sys/tg_test/1, attribute no_value'
+ origin = 'DeviceProxy::read_attribute()'
+ reason = 'API_AttributeFailed'
+ severity = PyTango._PyTango.ErrSeverity.ERR]]
+
+Switching database
+~~~~~~~~~~~~~~~~~~
+
+You can switch database simply by executing the 'switchdb <host> [<port>]' magic
+command.
+
+.. sourcecode:: itango
+
+ ITango [1]: switchdb
+
+ Must give new database name in format <host>[:<port>].
+ <port> is optional. If not given it defaults to 10000.
+
+ Examples:
+ switchdb homer:10005
+ switchdb homer 10005
+ switchdb homer
+
+ ITango [2]: db
+ Database(homer, 10000)
+
+ ITango [3]: switchdb bart # by default port is 10000
+
+ ITango [4]: db
+ Database(bart, 10000)
+
+ ITango [5]: switchdb lisa 10005 # you can use spaces between host and port
+
+ ITango [6]: db
+ Database(lisa, 10005)
+
+ ITango [7]: switchdb marge:10005 # or the traditional ':'
+
+ ITango [8]: db
+ Database(marge, 10005)
+
+Refreshing the database
+~~~~~~~~~~~~~~~~~~~~~~~
+
+When itango starts up or when the database is switched, a query is made to the
+tango Database device server which provides all necessary data. This
+data is stored locally in a itango cache which is used to provide all the nice
+features.
+If the Database server is changed in some way (ex: a new device server is registered),
+the local database cache is not consistent anymore with the tango database.
+Therefore, itango provides a magic command 'refreshdb' that allows you to reread
+all tango information from the database.
+
+.. sourcecode:: itango
+
+ ITango [1]: refreshdb
+
+Storing your favorite tango objects for later usage
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+ This feature is not available if you have installed IPython 0.11!
+
+Since version 7.1.2, :class:`DeviceProxy`, :class:`AttributeProxy` and
+:class:`Database` became pickable.
+This means that they can be used by the IPython_ 'store' magic command (type
+'store?' on the itango console to get information on how to use this command).
+You can, for example, assign your favorite devices in local python variables and
+then store these for the next time you startup IPython_ with itango profile.
+
+.. sourcecode:: itango
+
+ ITango [1]: theta = Motor("BL99_M1") # notice how we used tango alias
+
+ ITango [2]: store theta
+ Stored 'theta' (DeviceProxy)
+
+ ITango [3]: Ctrl+D
+
+ (IPython session is closed and started again...)
+
+ ITango [1]: store -r # in some versions of IPython you may need to do this ...
+
+ ITango [1]: print theta
+ DeviceProxy(motor/bl99/1)
+
+Adding itango to your own ipython profile
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Adding itango to the ipython default profile
+##################################################
+
+Let's assume that you find itango so useful that each time you start ipython, you want
+itango features to be loaded by default.
+The way to do this is by editing your default ipython configuration file:
+
+1. On IPython <= 0.10
+
+ $HOME/.ipython/ipy_user_conf.py and add the lines 1 and 7.
+
+ .. note::
+ The code shown below is a small part of your $HOME/.ipython/ipy_user_conf.py.
+ It is shown here only the relevant part for this example.
+
+ .. sourcecode:: python
+
+ import PyTango.ipython
+
+ def main():
+
+ # uncomment if you want to get ipython -p sh behaviour
+ # without having to use command line switches
+ # import ipy_profile_sh
+ PyTango.ipython.init_ipython(ip, console=False)
+
+2. On IPython > 0.10
+
+ First you have to check which is the configuration directory being used by
+ IPython. For this, in an IPython console type:
+
+ .. sourcecode:: itango
+
+ ITango [1]: import IPython.utils.path
+
+ ITango [2]: IPython.utils.path.get_ipython_dir()
+ <IPYTHON_DIR>
+
+ now edit <IPYTHON_DIR>/profile_default/ipython_config.py and add the
+ following line at the end to add itango configuration::
+
+ load_subconfig('ipython_config.py', profile='tango')
+
+ Alternatively, you could also load itango as an IPython extension::
+
+ config = get_config()
+ i_shell_app = config.InteractiveShellApp
+ extensions = getattr(i_shell_app, 'extensions', [])
+ extensions.append('PyTango.ipython')
+ i_shell_app.extensions = extensions
+
+ for more information on how to configure IPython >= 0.11 please check the
+ `IPython configuration <http://ipython.org/ipython-doc/dev/config/ipython.html#configuring-the-ipython-command-line-application>`_
+
+And now, every time you start ipython::
+
+ ipython
+
+itango features will also be loaded.
+
+.. sourcecode:: ipython
+
+ In [1]: db
+ Out[1]: Database(homer, 10000)
+
+
+Adding itango to an existing customized profile
+####################################################
+
+.. note::
+ This chapter has a pending update. The contents only apply to
+ IPython <= 0.10.
+
+If you have been working with IPython_ before and have already defined a
+customized personal profile, you can extend your profile with itango features
+without breaking your existing options. The trick is to initialize itango extension
+with a parameter that tells itango to maintain the existing options (like colors,
+command line and initial banner).
+
+So, for example, let's say you have created a profile called nuclear, and therefore
+you have a file called $HOME/.ipython/ipy_profile_nuclear.py with the following
+contents:
+
+.. sourcecode:: python
+
+ import os
+ import IPython.ipapi
+
+ def main():
+ ip = IPython.ipapi.get()
+
+ o = ip.options
+ o.banner = "Springfield nuclear powerplant CLI\n\nWelcome Homer Simpson"
+ o.colors = "Linux"
+ o.prompt_in1 = "Mr. Burns owns you [\\#]: "
+
+ main()
+
+In order to have itango features available to this profile you simply need to
+add two lines of code (lines 3 and 7):
+
+.. sourcecode:: python
+
+ import os
+ import IPython.ipapi
+ import PyTango.ipython
+
+ def main():
+ ip = IPython.ipapi.get()
+ PyTango.ipython.init_ipython(ip, console=False)
+
+ o = ip.options
+ o.banner = "Springfield nuclear powerplant CLI\n\nMr. Burns owns you!"
+ o.colors = "Linux"
+ o.prompt_in1 = "The Simpsons [\\#]: "
+
+ main()
+
+This will load the itango features into your profile while preserving your
+profile's console options (like colors, command line and initial banner).
+
+Creating a profile that extends itango profile
+####################################################
+
+.. note::
+ This chapter has a pending update. The contents only apply to
+ IPython <= 0.10.
+
+It is also possible to create a profile that includes all itango features and at
+the same time adds new ones. Let's suppose that you want to create a customized
+profile called 'orbit' that automaticaly exports devices of class
+'Libera' for the booster accelerator (assuming you are working on a synchrotron
+like institute ;-).
+Here is the code for the $HOME/.ipython/ipy_profile_orbit.py:
+
+.. sourcecode:: python
+
+ import os
+ import IPython.ipapi
+ import IPython.genutils
+ import IPython.ColorANSI
+ import PyTango.ipython
+ import StringIO
+
+ def magic_liberas(ip, p=''):
+ """Lists all known Libera devices."""
+ data = PyTango.ipython.get_device_map()
+ s = StringIO.StringIO()
+ cols = 30, 15, 20
+ l = "%{0}s %{1}s %{2}s".format(*cols)
+ print >>s, l % ("Device", "Alias", "Server")
+ print >>s, l % (cols[0]*"-", cols[1]*"-", cols[2]*"-")
+ for d, v in data.items():
+ if v[2] != 'Libera': continue
+ print >>s, l % (d, v[0], v[1])
+ s.seek(0)
+ IPython.genutils.page(s.read())
+
+ def main():
+ ip = IPython.ipapi.get()
+
+ PyTango.ipython.init_ipython(ip)
+
+ o = ip.options
+
+ Colors = IPython.ColorANSI.TermColors
+ c = dict(Colors.__dict__)
+
+ o.banner += "\n{Brown}Welcome to Orbit analysis{Normal}\n".format(**c)
+
+ o.prompt_in1 = "Orbit [\\#]: "
+ o.colors = "BlueTango"
+
+ ip.expose_magic("liberas", magic_liberas)
+
+ db = ip.user_ns.get('db')
+ dev_class_dict = PyTango.ipython.get_class_map()
+
+ if not dev_class_dict.has_key("Libera"):
+ return
+
+ for libera in dev_class_dict['Libera']:
+ domain, family, member = libera.split("/")
+ var_name = domain + "_" + member
+ var_name = var_name.replace("-","_")
+ ip.to_user_ns( { var_name : PyTango.DeviceProxy(libera) } )
+
+ main()
+
+Then start your CLI with::
+
+ $ ipython --profile=orbit
+
+and you will have something like this
+
+.. image:: _static/itango02.png
+
+Advanced event monitoring
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. note::
+ This chapter has a pending update. The contents only apply to
+ IPython <= 0.10.
+
+With itango it is possible to monitor change events triggered by any tango
+attribute which has events enabled.
+
+To start monitoring the change events of an attribute:
+
+.. sourcecode:: itango
+
+ ITango [1]: mon -a BL99_M1/Position
+ 'BL99_M1/Position' is now being monitored. Type 'mon' to see all events
+
+To list all events that have been intercepted:
+
+.. sourcecode:: itango
+
+ ITango [2]: mon
+ ID Device Attribute Value Quality Time
+ ---- ---------------- ------------ ---------------- ------------- ----------------
+ 0 motor/bl99/1 state ON ATTR_VALID 17:11:08.026472
+ 1 motor/bl99/1 position 190.0 ATTR_VALID 17:11:20.691112
+ 2 motor/bl99/1 state MOVING ATTR_VALID 17:12:11.858985
+ 3 motor/bl99/1 position 188.954072857 ATTR_CHANGING 17:12:11.987817
+ 4 motor/bl99/1 position 186.045533882 ATTR_CHANGING 17:12:12.124448
+ 5 motor/bl99/1 position 181.295838155 ATTR_CHANGING 17:12:12.260884
+ 6 motor/bl99/1 position 174.55354729 ATTR_CHANGING 17:12:12.400036
+ 7 motor/bl99/1 position 166.08870515 ATTR_CHANGING 17:12:12.536387
+ 8 motor/bl99/1 position 155.77528943 ATTR_CHANGING 17:12:12.672846
+ 9 motor/bl99/1 position 143.358230136 ATTR_CHANGING 17:12:12.811878
+ 10 motor/bl99/1 position 131.476140017 ATTR_CHANGING 17:12:12.950391
+ 11 motor/bl99/1 position 121.555421781 ATTR_CHANGING 17:12:13.087970
+ 12 motor/bl99/1 position 113.457930987 ATTR_CHANGING 17:12:13.226531
+ 13 motor/bl99/1 position 107.319423091 ATTR_CHANGING 17:12:13.363559
+ 14 motor/bl99/1 position 102.928229946 ATTR_CHANGING 17:12:13.505102
+ 15 motor/bl99/1 position 100.584726495 ATTR_CHANGING 17:12:13.640794
+ 16 motor/bl99/1 position 100.0 ATTR_ALARM 17:12:13.738136
+ 17 motor/bl99/1 state ALARM ATTR_VALID 17:12:13.743481
+
+ ITango [3]: mon -l mot.* state
+ ID Device Attribute Value Quality Time
+ ---- ---------------- ------------ ---------------- ------------- ----------------
+ 0 motor/bl99/1 state ON ATTR_VALID 17:11:08.026472
+ 2 motor/bl99/1 state MOVING ATTR_VALID 17:12:11.858985
+ 17 motor/bl99/1 state ALARM ATTR_VALID 17:12:13.743481
+
+To stop monitoring the attribute:
+
+.. sourcecode:: itango
+
+ ITango [1]: mon -d BL99_M1/Position
+ Stopped monitoring 'BL99_M1/Position'
+
+.. note::
+ Type 'mon?' to see detailed information about this magic command
+
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/pytango.git
More information about the debian-science-commits
mailing list